我一直在研究各种关于如何清理旧 Linux 内核的问题。它们似乎都有不同的答案,而且答案都很老了,所以肯定会有人说这个问题太老了,然后开始写一篇新帖子,所以这里是:
我想要做以下所有的事情:
- 在终端中手动删除旧的 Linux 内核。
- 删除所有配置文件
- 删除所有头文件
- 删除不需要的 inode 吗?
- 解释为什么 dpkg -l | grep linux-image 返回的结果与我在启动期间在 grub2 列表中看到的结果不同
- 解释 dpkg -l | grep linux-image 列表中的 rc vs ii
- 解释 /usr/src 目录(或在其他 Ubuntu 版本中找到这些文件的地方)中的条目与上述两种确定多余内核版本的方法之间的差异。
- 彻底清除旧内核会产生什么后果?我需要担心依赖关系吗?如何知道我的计算机上是否有任何应用程序依赖于旧内核的配置文件。
我不想要的是:
- 链接到您尚未亲自测试过或未解决完整清理所涉及的所有问题的其他答案。
- 任何答案您都还未亲自测试过。
- 尝试一次性自动清理所有内容的脚本。我只想手动执行此操作,直到我完全了解正在发生的一切。
让我们全面解决内核累积问题。在升级之前,我目前正在使用旧版本的 Ubuntu(10.04),但我在 Ubuntu 12.04 上遇到了同样的问题。如果不同版本的解决方案不同,请说明您用于测试解决方案的版本。
有效的方法:
uname -r
这正确返回了我当前正在使用的内核版本。
不起作用的事情:
sudo apt-get autoremove
sudo apt-get clean
sudo apt-get autoremove linux-image-x.x.xx-xx-generic
我认为应该有效,但事实并非如此:
sudo apt-get purge linux-image-x.x.xx-xx-generic
这有助于减少由以下人员生成的列表dpkg -l | grep linux-image
:
sudo dpkg --purge linux-image-x.x.xx-xx-generic
以下是关于此rc/ii
问题的一些开端:
ii
表示“它应该被安装并且它已经安装”而
rc
表示“它已被删除/卸载但它的配置文件仍然存在”。
我认为这解决了启动时终端列表和 grub2 菜单不一致的问题。我记得,列表与ii
grub2 列表相匹配。这里的问题是这些ii
条目最初是如何到达那里的?
答案1
旧内核不断积累直到 /boot 满了,从而破坏了 apt,这是一个错误:LP #1357093,并在 Ubuntu 16.04 及更新版本的所有版本中实施了修复。
大多数注意到此问题的用户安装了“全盘加密”,这会创建一个很小的未加密 /boot 分区。由于分区很小,所以很快就会填满,这些用户比其他用户更早地注意到了这个问题。
安装新内核时,/etc/kernel/postinst.d/apt-auto-removal 脚本会将旧内核标记为有资格的用于自动移除...但不运行自动移除。没有自动移除最初是为了允许人类查看已移除软件包的列表。
错误修复LP #1357093对大多数用户来说,这种方法有效 - 如果对您不起作用,则还有另一个根本原因导致旧内核包无法被 apt 标记为符合自动删除条件。请在 Ubuntu 支持渠道中寻求一对一帮助。
在旧版本的 Ubuntu 中,您必须手动修复旧内核以保留空间。如何手动修复取决于您的 /boot 是否已满。大多数用户直到 /boot 已满时才注意到这个问题,并且他们收到 apt 和 dpkg no-space-left-on-device 错误。
如果 /boot 没有满,并且 apt 正常工作,一个简单的
sudo apt-get autoremove ## Ubuntu 14.04 and older
sudo apt autoremove ## Ubuntu 16.04 and newer
应该删除所有符合自动删除条件的内核包。
如果 /boot 已满,并且 apt 操作因 dpkg 错误“设备上没有剩余空间”而失败,那么使用自动删除就太晚了。
为时已晚,因为 Aptdaemon 会将软件包操作排队。Autoremove 位于队列的后面,当任何操作失败时(包括空间不足),apt 会中止整个剩余队列。(这可以说是 apt/aptdaemon 中的一个错误)
最佳做法是使用“uname”和“dpkg”删除一个或两个旧内核,释放空间以便 apt 完成其排队操作。然后 autoremove 就可以正常工作了。
例子:
$ uname -r
3.16.0-36-generic ## This is kernel you MUST NOT remove.
$ dpkg -l | grep linux-image
rc linux-image-3.16.0-23-generic ## 'rc' means already removed
rc linux-image-3.16.0-28-generic ## 'rc' can be safely ignored
rc linux-image-3.16.0-29-generic
ii linux-image-3.16.0-30-generic ## 'ii' means installed. Removable
ii linux-image-3.16.0-31-generic ## Removable
ii linux-image-3.16.0-33-generic ## Removable
ii linux-image-3.16.0-34-generic ## Backup working kernel. Don't remove
ii linux-image-3.16.0-36-generic ## Current kernel. DO NOT REMOVE
## Use dpkg to remove one older kernel, freeing enough space for apt to work
$ sudo dpkg --remove linux-image-3.16.0-30-generic
$ sudo apt-get autoremove ## Ubuntu 14.04 and older
$ sudo apt autoremove ## Ubuntu 16.04 and newer
如果你长期忽视这个问题,然后是二阶效应,例如 linux-image-generic 指向错误的内核版本,以及 apt 依赖性错误。没有一种方法可以一次性修复所有这些问题。
通常,解决大多数这些问题的简单方法是从本地软件包缓存中清除旧软件包,更新软件包数据库,然后从 Ubuntu 存储库(而不是本地缓存)重新安装有问题的软件包。
$ sudo apt-get update ## Refresh the package database (14.04 and older)
$ sudo apt update ## (16.04 and newer)
$ sudo apt-get autoclean ## Delete the obsolete packages from your local cache (14.04 and older)
$ sudo apt autoclean ## (16.04 and newer)
$ sudo apt-get install --reinstall <packagename> ## Reinstall the offending package with the latest version in the Ubuntu repositories (14.04 and older)
$ sudo apt install --reinstall <packagename> ## (16.04 and newer)
如果您仍然遇到 apt 和/或 dpkg 错误,请在 Ubuntu 支持渠道寻求一对一的帮助。
答案2
您可以尝试这些命令来删除旧的配置文件和旧的内核:
exec sudo -i
CONFOLD=$(dpkg -l | grep '^rc' | awk '{print $2}')
KERNELCUR=$(uname -r | sed 's/-*[a-z]//g' | sed 's/-386//g')
PKGLINUX="linux-(image|headers|ubuntu-modules|restricted-modules)"
METAPKGLINUX="linux-(image|headers|restricted-modules)-(generic|i386|server|common|rt|xen)"
KERNELSOLD=$(dpkg -l | awk '{print $2}' | grep -E "$PKGLINUX" | grep -vE "$METAPKGLINUX" | grep -v "$KERNELCUR")
apt-get purge "$CONFOLD"
apt-get purge "$KERNELSOLD"
update-grub
答案3
您可以执行以下命令来查找已安装的内核列表。
rpm -q 内核
找到内核列表后,执行以下命令删除内核。
sudo apt-get 删除 linux-image-xxxx-generic