Linux内核头文件与当前内核匹配

我看到一些关于linux-headers软件包的问题,但找不到解决我的特定问题的任何内容。

我使用的是Kubuntu 16.04,在VirtualBox中收到以下错误:

请安装与当前内核匹配的Linux内核“头”文件,以便向系统添加新的硬件支持。可能包含头文件的发行版软件包有:

linux-headers-generic linux-headers-4.13.0-43-generic

看到linux-headers-generic未安装,我感到惊讶,尽管我不确定它是否应该默认安装。

无论如何,虽然内核版本是4.13.0-43-generic,但相应的头文件确实没有被安装:

$ uname -r
4.13.0-43-generic

$ aptitude search  linux-headers | grep  ^i
id  linux-headers-4.13.0-32         - Header files related to Linux kernel versi
id  linux-headers-4.13.0-32-generic - Linux kernel headers for version 4.13.0 on
i A linux-headers-4.13.0-37         - Header files related to Linux kernel versi
i A linux-headers-4.13.0-37-generic - Linux kernel headers for version 4.13.0 on
i A linux-headers-4.13.0-38         - Header files related to Linux kernel versi
i A linux-headers-4.13.0-38-generic - Linux kernel headers for version 4.13.0 on
i A linux-headers-4.13.0-39         - Header files related to Linux kernel versi
i A linux-headers-4.13.0-39-generic - Linux kernel headers for version 4.13.0 on

“linux-headers-generic”将始终依赖于可用的最新通用内核头文件,因此我认为安装它将安装最新的软件包(在这种情况下,VirtualBox所需的“linux-headers-4.13.0-43-generic”),并使它们保持最新状态。
然而,如果我尝试这样做,我会被要求安装似乎非常旧的软件包:
$ sudo aptitude install linux-headers-generic
The following NEW packages will be installed:
linux-headers-4.4.0-127{a} linux-headers-4.4.0-127-generic{a} linux-headers-generic 
0 packages upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 10.8 MB of archives. After unpacking 78.4 MB will be used.

还有一个叫做linux-headers-generic-lts-xenial的软件包,但它基本上和前面的那个一样。
所以,我的问题是:
  • 默认情况下应该安装哪个linux-headers-generic软件包?
  • 在我的情况下,我需要安装其中任何一个吗?
  • 如果我直接安装所需的linux-headers-4.13.0-43-generic软件包,当内核升级时会发生什么?
3个回答

不需要。都不需要。
从内核版本来看,看起来您正在使用(HWE)内核。因此,您应该安装这些内核的头文件:linux-headers-generic-hwe-16.04,它是一个元包,应该依赖于适用于您的HWE内核(4.13)的正确头文件包。
如果直接安装所需的linux-headers-4.13.0-43-generic软件包,当内核升级时会发生什么呢?您将需要再次手动安装相关的头文件。最好使用linux-headers-generic-hwe-16.04

1根据我之前遇到的情况,我确信你是对的,但我很好奇:你是怎么知道我在使用HWE内核的?是因为4.13中的“13”吗?我原以为4.13只是在几个4.4版本之后发布的。 - Ratler
顺便说一句,这个方法有效!通过重新安装linux-headers-generic-hwe-16.04,最新版本被安装并且VirtualBox现在可以正常工作了。事情的经过是,在尝试修复一个损坏的更新过程中,我删除了元包但从未重新安装(幸运的是,我有良好的日志记录我所做的事情)。 - Ratler
1@Ratler 是的,这是13号。16.04有两个选项:保持使用16.04发布时的4.4内核(将得到全面支持),或者使用HWE内核,在新的Ubuntu版本发布时进行升级(目前为4.8、4.10、4.13)。linux-{header,image}-generic软件包适用于4.4内核,而-hwe-16.04则适用于HWE内核。请参考https://wiki.ubuntu.com/Kernel/RollingLTSEnablementStack和https://wiki.ubuntu.com/Kernel/LTSEnablementStack。 - muru

最简单的解决方案是安装缺少的软件包:
$ sudo apt install linux-headers-generic linux-headers-4.13.0-43-generic
Reading package lists... Done
Building dependency tree       
Reading state information... Done
linux-headers-4.13.0-43-generic is already the newest version (4.13.0-43.48~16.04.1).
linux-headers-generic is already the newest version (4.4.0.127.133).
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

我的系统已经安装了你缺少的东西。为什么它们会丢失,我说不清楚。
对于“linux-headers-generic”,最新版本确实是“4.4.0.127.133”。虽然Linux Kernel 4.4在2015年发布,但它是一个LTS(长期支持)内核,支持5到6年(具体记不清了),目前已经更新到第127个版本。所以更新版本号最终会增长到大约300左右。
无论如何,你需要硬着头皮安装缺失的头文件。
sudo apt install linux-headers-generic linux-headers-4.13.0-43-generic

2018年6月11日更新。

4.4.0.127.133不再是最新的头文件版本。我运行了sudo apt upgrade,然后稍后运行了sudo apt autoremove。我收到了一些错误消息,因为混乱的软件删除了127并告诉我添加127头文件来解决问题:

Removing linux-image-extra-4.4.0-127-generic (4.4.0-127.153) ...
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.4.0-127-generic /boot/vmlinuz-4.4.0-127-generic
run-parts: executing /etc/kernel/postinst.d/dkms 4.4.0-127-generic /boot/vmlinuz-4.4.0-127-generic
dkms: WARNING: Linux headers are missing, which may explain the above failures.
      please install the linux-headers-4.4.0-127-generic package to fix this.
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.4.0-127-generic /boot/vmlinuz-4.4.0-127-generic
update-initramfs: Generating /boot/initrd.img-4.4.0-127-generic
Adding /lib/firmware/i915/skl_guc_ver9_33.bin
run-parts: executing /etc/kernel/postinst.d/pm-utils 4.4.0-127-generic /boot/vmlinuz-4.4.0-127-generic
run-parts: executing /etc/kernel/postinst.d/unattended-upgrades 4.4.0-127-generic /boot/vmlinuz-4.4.0-127-generic
run-parts: executing /etc/kernel/postinst.d/update-notifier 4.4.0-127-generic /boot/vmlinuz-4.4.0-127-generic
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 4.4.0-127-generic /boot/vmlinuz-4.4.0-127-generic

没有真正的问题,截至2018年6月11日,最新的linux-headers-generic版本是:4.4.0.128.134

事实证明(请参见muru的回答),在我的情况下,正确的元包是linux-headers-generic-hwe-16.04(因为我不小心删除了它)。我认为你提出的命令只能暂时解决问题:如果将来更新了内核(例如4.13.0-44等),我很可能会遇到同样的问题。 - Ratler
除了37、38和39之外,这件事并没有发生。无论如何,我今晚上电脑时会删除我的回答。 - WinEunuuchs2Unix
我在版本4.13.0-39时删除了元包,这就是为什么头文件被困在那个版本上。你的答案不正确,但在接受的答案和评论的背景下,它可能仍有助于更好地理解问题(对我来说确实如此),所以我会考虑保留它。既然已经被投票降低了,如果你担心声誉问题,我会给你点赞。当然,是否完全删除由你决定。 - Ratler
这是你的问题,而且你很有知识。我会不干涉。 - WinEunuuchs2Unix

我的同事使用的是18.10和4.18.0.17内核。从官方源中安装相应的linux-headers时,出现了“包未找到”的错误。
最终我在packages.ubuntu.com上找到并下载了特定的文件。

http://mirrors.kernel.org/ubuntu/pool/main/l/linux-hwe/linux-headers-4.18.0-17_4.18.0-17.18~18.04.1_all.deb
http://mirrors.kernel.org/ubuntu/pool/main/l/linux-hwe/linux-headers-4.18.0-17-generic_4.18.0-17.18~18.04.1_amd64.deb

一旦您安装了头文件,执行apt-get purge然后apt-get install应该就可以正常使用virtualbox软件包。