흥미로운 커널 모듈이 많이 있습니다. Linux 커널 덕분에 이제 "레고 적외선 타워"와 같은 것이 있다는 것을 알게 되었습니다.
나는 분명히 필요한 것 이상으로 Linux 커널을 줄이려고 노력하고 있습니다.
이를 위해서는 현재 시스템에서 사용되지 않는 커널 모듈을 찾는 프로그래밍 방식이 필요합니다.
알아요 lsmod
. 하지만 제가 찾고 있는 것과는 아직 거리가 멀어요.
*** 반대 방법 - 제거 방법 ***
이 결과를 얻으려면 현재 정적으로 컴파일되고 로드된 모듈이 무엇인지 확인하는 방법이 필요할 것입니다.예사용하고 있습니다. 이는 "M"뿐만 아니라 메뉴 구성의 "*"를 통해 선택됩니다.
다음과 같이 grep 명령을 사용하여 모듈 이름을 구성 이름에 매핑할 수 있기 때문에 현재 커널의 .config 파일에 있는 모든 모듈을 "삭제"할 수 있는 방법이 있을 수 있다고 생각합니다.
...이게 얼마나 오래 지속될지는 모르겠지만요.
따라서 위 링크에는 이미 .config 파일과 커널 소스 코드, grep 명령이 있습니다. 병목 현상은 정적으로 사용되고 동적으로 로드되는 커널 모듈의 첫 번째 목록입니다.
"최선을 다하는 것"의 문제일 수도 있습니다. 코어를 철저히 청소하는 것은 침실을 철저히 청소하는 것만큼 어려울 수 있습니다. 침실을 청소했는데도 곳곳에 먼지가 남아 있었습니다. 이는 이 질문에 대한 답변에 대한 나의 기대와 동일합니다.
모든 결과 목록과 마찬가지로 DNS 이름 확인과 같은 기능을 자주 사용하지는 않지만 간헐적으로 필요하기 때문에 더 많은 수동 필터링이 필요할 것입니다(구체적으로 커널 DNS 확인은 실제로 네트워크 부팅에만 사용될 수 있습니다. 모르겠습니다)
매번 점점 더 적은 수의 모듈을 사용하여 몇 시간마다 다시 컴파일하는 것보다 커널을 정리하는 더 빠른 방법이 있어야 합니다. 좀 더 일반적인 전략이 있나요?
답변1
나는 믿는다 -로드 가능한 모든 커널 모듈을 나열하는 방법은 무엇입니까?귀하의 질문에 대한 답변의 일부입니다.
나는 모든 모듈을 가져오고 모듈이 로드되었는지 확인하기 위해 연관 배열(빠르기 때문에)을 사용하는 간단한 bash 스크립트를 작성했습니다. 코드는"작은" 쓰레기.
declare -A all_modules # 0 module is used 1 module is not used
#
# Note when ls shows module some modules have names separated by `_`
# In the very same time files that contains this modules might have `-`
# Example:
# /usr/lib/modules/5.11.9-200.fc33.x86_64/kernel/arch/x86/crypto/ghash-clmulni-intel.ko.xz - file
# [Alex@NormandySR2 i686]$ lsmod | grep 'ghash'
# ghash_clmulni_intel 16384 0
# At the very same time, I didn't find any module that has `-` reported by lsmod
# [Alex@NormandySR2 i686]$ lsmod |grep '-'
# I know that for and find is fragile, but it's the simplest way
for i in $(find /lib/modules/$(uname -r) -type f -name '*.ko*'); do
module_name=$(basename $i);
# used {module_name%.*}, but cut with is simpler, and works with multiple extensions like .ko.xz
module_without_extension=$(echo $module_name | cut -f 1 -d '.')
# replace - with _
module_name_normalized=$(echo $module_without_extension | sed 's/-/_/g')
all_modules[$module_name_normalized]=1
done
# Note that `lsmod` output starts with "Module Size Used By " that's why sed is used
IFS=$'\n'
for i in $(lsmod | sed '1d;$d'); do
module_name=$(echo $i | awk '{print $1}')
echo "$module_name"
# check module from lsmod is in all modules
if [[ -v all_modules[$module_name] ]]; then
all_modules[$module_name]=0
else
echo "Warning! There is no $module_name module in all_modules array - adding it to all modules but you should check"
all_modules[$module_name]=0
fi
done
# print output
for i in "${!all_modules[@]}"
do
if [ ${all_modules[$i]} -eq 0 ]; then
echo "$i is loaded"
else
echo "$i is not used"
fi
done
로드된 모든 모듈을 얻으려면 다음을 사용할 수 있습니다.
bash x.sh | grep loaded
사용 가능하지만 로드되지 않은 모듈을 가져옵니다. 즉,아마도귀하의 질문에 대답하십시오 :
bash x.sh | grep 'not used'
(...)
** 참고: 이 스크립트는 모듈 별칭을 지원하지 않으므로 파일에서 모듈을 찾을 수 없을 때마다 "경고!..." 메시지가 나타납니다. **
편집하다
정적으로 컴파일된 모듈을 얻으려면 다음을 사용하십시오.
cat /lib/modules/$(uname -r)/modules.builtin
답변2
모듈만 요청했다면 대답은 더 간단할 것입니다. 그러나 정적으로 컴파일된 기능도 요청하기 때문에 답변을 제공하기가 훨씬 더 어렵습니다.
동적으로 로드된 모듈의 경우 언로드를 시도한 다음 출력을 확인하는 것이 도움이 될 수 있지만 현재 사용하지 않는 플러그 앤 플레이 장치(예: USB 장치)에는 일부 모듈이 필요하다는 점을 기억해야 합니다. 모듈을 컴파일하지 않으면 장기적으로 문제가 발생할 수 있습니다. 또한 이러한 종류의 테스트(모듈 제거)는 시스템에 충돌을 일으킬 수 있으므로 설치를 테스트할 권한이 있는 경우에만 이 작업을 수행하십시오.
정적으로 로드된 모듈/기능을 사용하면 무언가가 필요한지, 프로세스가 하드웨어에 매우 특정한지, 아니면 특정 기능을 지원하는 커널이 필요한지 말하기가 어렵습니다. 이 질문에 대한 선택 사항은 스크립트에서 처리할 수 없습니다.
하지만 좋은 출발점은 부팅 프로세스 로그(일부 배포판에서는 /var/log/boot.log)의 출력을 얻고 커널 메시지를 확인하는 것입니다. 필요한 대부분의 모듈은 로그에 내용을 출력합니다. 추가 실험을 하기 전에 목록을 "연락처 없음" 목록으로 사용할 수 있습니다.