带有文件的剩余内核目录

带有文件的剩余内核目录

为什么会有内核残留物?我可以自动清除它们吗?


几个月后,内核目录太多了,我对此感到恼火。

我只是仔细检查了该/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

相关内容