Por que existem sobras de kernel e posso me livrar delas automaticamente?
Existem tantos diretórios de kernel depois de alguns meses que fico irritado com isso.
Eu apenas inspecionei cuidadosamente o /usr/lib/modules
diretório e removi todos os diretórios antigos do kernel, exceto um, e inspecionei seu conteúdo real:
# \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
A inspeção dos arquivos restantes revela que eles estão vazios ou inúteis:
# 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
Agora, minha pergunta é: por que esses arquivos não estão sendo excluídos apt-get --purge autoremove
?
O
misc/
diretório provavelmente é para alguns módulos de terceiros (por exemplo, VirtualBox) cujo sistema de gerenciamento aparentemente não se integra totalmente à instalação e remoção de versões do kernel.Para identificar o(s) módulo(s) em questão, procure no
/lib/modules/$(uname -r)/misc
diretório do seu kernel atualmente em execução.Os
modules.*
arquivos são vários arquivos de alias de módulo, dependências e mapas de símbolos gerados pelodepmod
comando.Quando um pacote do kernel é removido, o gerenciador de pacotes removerá automaticamente os módulos empacotados junto com o pacote do kernel (localizado em
/lib/modules/<kernel version>/kernel/
), mas não tocará em nenhum módulo e diretório de módulo criado por instaladores de módulos de terceiros (como o seumisc/
). Se você usar módulos de terceiros gerenciados pelo DKMS, ele normalmente colocará esses módulos em/lib/modules/<kernel version>/updates/dkms/
e os removerá automaticamente à medida que o pacote do kernel correspondente for removido.Parece que o gerenciamento de módulos de terceiros é um pouco simplista: provavelmente é executado no momento da inicialização, verifica se todos os
/lib/modules/<kernel version>/
diretórios existentes contêm omisc/
subdiretório e o(s) módulo(s) de terceiros e, se algum estiver faltando, ele irá automaticamente construa uma versão do(s) módulo(s) de terceiros para eles e executedepmod <kernel version>
para garantir que as dependências de quaisquer módulos de terceiros sejam processadas corretamente. Mas a parte que removeria os módulos e omisc/
subdiretório dos pacotes do kernel removidos parece não estar implementada ou ausente.Como os arquivos criados por
depmod
parecem ser atualizados mesmo em diretórios de onde o conteúdo real do pacote do kernel é realmente removido, parece que o script de gerenciamento de módulo de terceiros simplesmente percorreu todos os/lib/modules/<kernel version>
diretórios existentes e ainda foi executadodepmod
em cada um deles - resultando em vazio ou arquivos de saída quase vaziosdepmod
.Você pode adicionar um script como este para
/etc/kernel/postrm.d/
se livrar desse problema automaticamente (chame-o,zz-remove-miscmod
por exemplo):O script será executado automaticamente logo após a remoção de um pacote do kernel e verificará a presença do
misc
subdiretório da versão do kernel removida e o removerá. Presumo que osdepmod
arquivos criados serão (re) produzidos na próxima inicialização; se eu estiver errado, você também pode descomentar arm -f ...
linha.Esses arquivos não são removidos
apt-get autoremove --purge
porque os kernels são protegidos contra remoção automática (consulte Recursos/etc/apt/apt.conf.d/01autoremove
). Você precisa eliminá-los periodicamente:Adicione isso a um arquivo
/etc/cron.d/weekly
e você não deverá se preocupar com diretórios restantes/lib/modules
novamente.