我的启动分区位于 SSD 上,因此它没有足够的空间容纳超过 8 个已安装的内核版本,最终某些内核更新将无法安装,因为我的启动分区充满了旧版本。关于如何删除旧版本(甚至如何自动执行该过程)有很多问题,但我的问题很简单:为什么不apt-get autoremove
自动检测并删除它们,有什么办法可以让它这样做吗?我的意思apt-get
是,无论如何,它们都是安装的,所以它知道它们,那么为什么它选择保留所有旧版本呢?
答案1
至于回答原因,请参阅文件/etc/apt/apt.conf.d/01autoremove-kernels
如您所见,另一个(脚本)文件告诉 apt 永远不要自动删除内核。/etc/kernel/postinst.d/apt-auto-removal
如下所示:
如果您手动安装 2 个选定的内核,即第一个和当前内核,那么 apt-autoremove 将只会删除您未手动安装的旧版本,因此您将始终拥有这 2 个选项以及最新的选项。
更新:
其中/etc/kernel/postinst.d/apt-auto-removal
有这样一部分:
if [ "$latest_version" != "$installed_version" ] \
|| [ "$latest_version" != "$running_version" ] \
|| [ "$installed_version" != "$running_version" ]
then
# We have at least two kernels that we have reason to think the
# user wants, so don't save the second-newest version.
previous_version=
fi
01autoremove-kernels
因此,如果您比较文件的输出,uname -r
您会发现当前正在运行的内核和它之前的最新内核被保留,永远不会被该脚本删除。结果是另一个文件/etc/apt/apt.conf.d/01autoremove
,其中有几行:
APT
{
NeverAutoRemove
{
"^firmware-linux.*";
"^linux-firmware$";
};
VersionedKernelPackages
{
# linux kernels
"linux-image";
"linux-headers";
"linux-image-extra";
"linux-signed-image";
# kfreebsd kernels
"kfreebsd-image";
"kfreebsd-headers";
# hurd kernels
"gnumach-image";
# (out-of-tree) modules
".*-modules";
".*-kernel";
"linux-backports-modules-.*";
# tools
"linux-tools";
};
因此,你可以注释掉这些,这样你就可以自动删除内核apt-autoremove
,但请记住 - 这样做需要你自担风险
答案2
对我来说,它有助于安装最新的 (X)ubuntu (15.10)。在早期版本中,内核包可能被标记为手动安装,至少如果使用软件更新程序安装的话,这样就sudo apt-get autoremove --purge
无法删除它们。有关于此问题的错误报告:错误 #1175637,错误 #1439769
在早期版本中,您可以尝试标记内核包自动安装,然后sudo apt-mark auto $(apt-mark showmanual | grep -E "^linux-([[:alpha:]]+-)+[[:digit:].]+-[^-]+(|-.+)$")
运行sudo apt-get autoremove --purge
以查看是否有区别。该命令仍然不会删除 /etc/apt/apt.conf.d/01autoremove-kernels 中显示的内核包,但最安全的做法是先apt-get autoremove
使用--dry-run
选项运行。
或者,你可以使用linux 清除更有选择性地清除旧内核,即使它们是手动安装的。
答案3
首先尝试删除旧的内核包,但如果 /boot/initrd.img 文件仍然存在,那么这对我有用:
删除 /boot/initrd.img-4.8.0-39-generic
sudo update-initramfs -d -k 4.10.0-37-generic
一次删除一个 initrd.img 文件。