为什么会有内核残留物?我可以自动清除它们吗?
几个月后,内核目录太多了,我对此感到恼火。
我只是仔细检查了该/usr/lib/modules
目录并删除了所有旧的内核目录,但其中之一是检查了其实际内容:
# \ls -lhkF 5.15.0-76-generic
total 28K
drwxr-xr-x 2 root root 4.0K Aug 24 06:36 misc/
-rw-r--r-- 1 root root 45 Aug 24 06:36 modules.alias
-rw-r--r-- 1 root root 12 Aug 24 06:36 modules.alias.bin
-rw-r--r-- 1 root root 0 Aug 24 06:36 modules.builtin.alias.bin
-rw-r--r-- 1 root root 0 Aug 24 06:36 modules.builtin.bin
-rw-r--r-- 1 root root 0 Aug 24 06:36 modules.dep
-rw-r--r-- 1 root root 12 Aug 24 06:36 modules.dep.bin
-rw-r--r-- 1 root root 0 Aug 24 06:36 modules.devname
-rw-r--r-- 1 root root 55 Aug 24 06:36 modules.softdep
-rw-r--r-- 1 root root 49 Aug 24 06:36 modules.symbols
-rw-r--r-- 1 root root 12 Aug 24 06:36 modules.symbols.bin
检查剩余文件发现它们是空的或无用的:
# for file in *; do [ -f $file ] && echo "$file": && cat --show-nonprinting $file && echo && echo; done
modules.alias:
# Aliases extracted from modules themselves.
modules.alias.bin:
M-0^GM-tW^@^B^@^A^@^@^@^L
modules.builtin.alias.bin:
modules.builtin.bin:
modules.dep:
modules.dep.bin:
M-0^GM-tW^@^B^@^A^@^@^@^L
modules.devname:
modules.softdep:
# Soft dependencies extracted from modules themselves.
modules.symbols:
# Aliases for symbols, used by symbol_request().
modules.symbols.bin:
M-0^GM-tW^@^B^@^A^@^@^@^L
现在,我的问题是,为什么这些文件没有被删除apt-get --purge autoremove
?
答案1
该misc/
目录可能用于某些第三方模块(例如 VirtualBox),其管理系统显然未完全集成内核版本的安装和删除。
要识别有问题的模块,请查看/lib/modules/$(uname -r)/misc
当前运行的内核的目录。
这些modules.*
文件都是命令生成的各种模块别名、依赖项和符号映射文件depmod
。
当删除内核包时,包管理器将自动删除与内核包一起打包的模块(位于/lib/modules/<kernel version>/kernel/
),但不会触及第三方模块安装程序(例如您的misc/
)创建的任何模块和模块目录。如果您使用 DKMS 管理的第三方模块,它通常会将这些模块放入/lib/modules/<kernel version>/updates/dkms/
,当相应的内核包被删除时,它会自动删除它们。
看起来你的第三方模块管理有点简单:它可能在启动时运行,检查任何现有/lib/modules/<kernel version>/
目录misc/
中是否有子目录和第三方模块,如果缺少任何一个,它会自动为它们构建第三方模块的版本,并运行depmod <kernel version>
以确保正确处理任何第三方模块的依赖项。但是,将删除模块的部分以及misc/
已删除内核软件包的子目录似乎未实现或丢失。
由于即使在实际删除了实际内核包内容的目录中创建的文件depmod
似乎也会更新,因此第三方模块管理脚本似乎只是循环遍历任何现有/lib/modules/<kernel version>
目录并仍然depmod
在每个目录上运行 - 导致空或几乎为空的depmod
输出文件。
您可以添加这样的脚本来/etc/kernel/postrm.d/
希望自动摆脱这个问题(zz-remove-miscmod
例如调用它):
#!/bin/sh -e
version="$1"
# passing the kernel version is required
if [ -z "${version}" ]; then
echo >&2 "W: zz-remove-miscmod: ${DPKG_MAINTSCRIPT_PACKAGE:-kernel package} did not pass a version number"
exit 0
fi
if [ -d "/lib/modules/$version/misc" ]; then
rm -rf "/lib/modules/$version/misc"
# uncomment to remove the modules.* files too, if necessary
#rm -f "/lib/modules/$version/modules.*" 2>/dev/null || /bin/true
# attempt to remove the kernel version module directory too,
# in case it just became empty; if not, ignore the error
rmdir "/lib/modules/$version" 2>/dev/null || /bin/true
fi
该脚本将在内核包被删除后自动执行,并检查是否存在misc
已删除内核版本的子目录,并将其删除。我假设depmod
创建的文件在下次启动时(重新)生成;如果我错了,你rm -f ...
也可以取消注释该行。
答案2
这些文件不会被删除,apt-get autoremove --purge
因为内核受到保护,不会被自动删除(请参阅 参考资料/etc/apt/apt.conf.d/01autoremove
)。您需要定期清除它们:
#!/bin/sh
for mods in /lib/modules/*/; do
if ! [ -d "$mods"/kernel ]; then
apt-get purge -y "linux-image-${mods##*/}"
fi
done
将其添加到文件中/etc/cron.d/weekly
,您就不会再受到剩余目录的困扰/lib/modules
。