One very common misconception about unikernels is that they don't have kernels which every single implementation out there has one - it just might be smaller or less-featured than others.
So, at least in our view, it's not about having a 'small' kernel it is more about the architecture.
> The scope of "everything that is needed to run" is a lot higher than might appear
Having written one algotrading framework with full kernel bypass which required me to account for every single piece of kernel functionality in use by the application (mostly to eliminate its use) I actually think it is the opposite. Most applications do not need a lot from the kernel to function and what they are using could be supplied as library.
Main reasons to have kernel -- protect shared resources and impose security constraints -- are not present when you intend to only have one application in the system.
However, there is a lot more than just networking/storage drivers and some of it is very common code. Page table management for instance. Do you have 2,3,4 page table levels? How do you allocate memory to the app? IOAPIC vs PIC? Do you support calls the way GLIBC wants? RTC vs TSC vs PIT? I'm not saying any of these can't be librarized but they are most definitely not choices I would expose to the vast majority of end-users to choose at build-time for.
There are advantages to an approach like Nanos or OSv in that development is easier and you have better compatibility.
And have it 'operate' it directly on hardware with only a minimal 'system' layer for common operations.
I feel old.