我的启动分区位于SSD上,因此无法容纳大约8个以上已安装内核版本,最终由于我的启动分区中充满了旧版本,因此某些内核更新将无法安装。关于如何删除旧版本(甚至如何使过程自动化),还有很多问题,但我的问题很简单:为什么不apt-get autoremove
自动检测并删除它们,有没有办法做到这一点?我的意思是,apt-get
无论如何都安装了它们,因此它了解它们,那么为什么选择保留所有旧版本呢?
我的启动分区位于SSD上,因此无法容纳大约8个以上已安装内核版本,最终由于我的启动分区中充满了旧版本,因此某些内核更新将无法安装。关于如何删除旧版本(甚至如何使过程自动化),还有很多问题,但我的问题很简单:为什么不apt-get autoremove
自动检测并删除它们,有没有办法做到这一点?我的意思是,apt-get
无论如何都安装了它们,因此它了解它们,那么为什么选择保留所有旧版本呢?
Answers:
至于回答为什么,请参考文件 /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
,但请记住,这样做需要您自担风险
/etc/apt/apt.conf.d/01autoremove-kernels
行很多,但其中只有两个版本:3.13.0。{39,43}。但是dpkg -l linux-*
列出了四个版本,即3.13.0。{39,40,41,43},所以除了/etc/apt/apt.conf.d/01autoremove-kernels
保留那些中间版本以外,还有其他什么吧?
01autoremove
是您想要的文件,01autoremove-kernels
可能只是一种保护,因此apt不会删除当前安装的内核和最新内核(以防万一最新螺丝钉
01autoremove
读错了,否则它只是防止自动删除依赖包,例如linux-image-extra
。更改它不会影响是否linux-image-3.16.0-31-generic
自动删除。其中的所有模式均与我们要自动删除的软件包名称不匹配。
/etc/apt/apt.conf.d/01autoremove
。这不会帮助您自动删除旧版本的内核软件包,但可能会产生不良影响。该文件不能自动删除,linux-image-extra
但可以匹配该NeverAutoRemove
部分中的正则表达式的程序包。
apt-get autoremove
不删除未列出的内核的原因/etc/apt/apt.conf.d/01autoremove-kernels
是,这些内核被标记为手动安装;看我的答案。
对我来说,它有助于安装最新的(X)ubuntu(15.10)。在较早的发行版中,内核软件包至少可以标记为手动安装,如果使用软件更新程序进行了安装,sudo apt-get autoremove --purge
则无法删除它们。有关于该问题的错误报告:Bug#1175637,Bug#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
选项运行是最安全的。
apt-mark
做的伎俩我,希望我能给予好评的10倍:P