커널 잔류물이 있는 이유는 무엇입니까? 자동으로 지울 수 있나요?
몇 달이 지나자 커널 디렉터리가 너무 많아서 짜증이 났습니다.
방금 디렉토리를 다시 확인 /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
.