The upstream kernels (referred, when we provide them, as mainline kernels) are simply the upstream kernel for the specified version, with a very few minor configuration changes added so that there is minimal issue using them on an Ubuntu Install.
The difference between these kernels and the one released for an Ubuntu version are numerous other configuration changes, source patches* and, in some cases, compiled in modules and hardware support.
Very little of the underlying code is different from upstream other than that noted above.
*: source patches are, in most cases, changes to the default behavior of the kernel. These are not limited to: blacklists, video quirks tables, built in modules, source changes that are not yet in Linus' tree or the stable queue quite yet etc.
Source patches are what the team uses to introduce configuration options that are required to support the vast array of released software for a specific version of Ubuntu. In many cases they are necessary for those applications to work properly. The fundamental difference between this and the upstream kernel is that the pure upstream kernel is not distribution specific.
Therefore, the configurations are not geared toward ensuring that certain applications work as expected. These configs exist to provide that level of changeability to the kernel for specific things. Additionally, the use of quirks allows us to identify hardware that requires specific things from the kernel that we can set once we detect them.
This is one of the major features of Linux and it is one of the reasons we have been able to run on so many diverse platforms over the years. There are times when the quirks and source patches cause issues between each other. During these times, we work to mitigate the problems with changes to underlying kernel behavior. In many cases these changes don't make it upstream until after the release due in very large part to the need to properly code the fix, document what was done, test the changes and conduct various other tests and stress testing.
In these cases, patches that are headed for upstream are carried as source patches in much the same way pre-stable and patches that are not yet in Linus' tree do. The link to the delta review spec should serve as a reference for what was reviewed for the current Natty release of the Ubuntu kernel.
lower code maintenance requirements. the generic kernel now has the bits and bobs from the virtual kernel, and is bright enough to know when it should or should not use them.
This Is A Feature, Not A Bug :)
Best Answer
Since 12.04, there is no difference between the Desktop
linux-generic
and Serverlinux-server
kernels; they have been merged. (Source; see here for why this was done.)The virtual kernel differs only in the number of included drivers. It only includes "the necessary drivers to run inside popular virtualization technologies such as KVM, Xen, and VMWare. ... Other than that, all other options are identical between the generic and the virtual kernels."
In practice, this means the
-virtual
kernel image is smaller, and may also take up somewhat less room in memory (fewer built-in modules/drivers). The savings are probably in the single-digit megabyte range, so it won't make a difference for most VMs.Server and Desktop kernel differences before 12.04:
Before 12.04, the differences were:
The Server Edition uses the Deadline I/O scheduler instead of the CFQ scheduler used by the Desktop Edition.
Preemption is turned off in the Server Edition.
The timer interrupt is 100 Hz in the Server Edition and 250 Hz in the Desktop Edition.