현재 실행 중인 시스템에서 사용되지 않는 커널 모듈 목록을 얻는 방법은 무엇입니까? (정적 및 로드됨)

현재 실행 중인 시스템에서 사용되지 않는 커널 모듈 목록을 얻는 방법은 무엇입니까? (정적 및 로드됨)

흥미로운 커널 모듈이 많이 있습니다. Linux 커널 덕분에 이제 "레고 적외선 타워"와 같은 것이 있다는 것을 알게 되었습니다.

나는 분명히 필요한 것 이상으로 Linux 커널을 줄이려고 노력하고 있습니다.

이를 위해서는 현재 시스템에서 사용되지 않는 커널 모듈을 찾는 프로그래밍 방식이 필요합니다.

알아요 lsmod. 하지만 제가 찾고 있는 것과는 아직 거리가 멀어요.

*** 반대 방법 - 제거 방법 ***

이 결과를 얻으려면 현재 정적으로 컴파일되고 로드된 모듈이 무엇인지 확인하는 방법이 필요할 것입니다.사용하고 있습니다. 이는 "M"뿐만 아니라 메뉴 구성의 "*"를 통해 선택됩니다.

다음과 같이 grep 명령을 사용하여 모듈 이름을 구성 이름에 매핑할 수 있기 때문에 현재 커널의 .config 파일에 있는 모든 모듈을 "삭제"할 수 있는 방법이 있을 수 있다고 생각합니다.

lsmod 모듈 이름을 커널 구성 메뉴 항목에 바인딩

...이게 얼마나 오래 지속될지는 모르겠지만요.

따라서 위 링크에는 이미 .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)의 출력을 얻고 커널 메시지를 확인하는 것입니다. 필요한 대부분의 모듈은 로그에 내용을 출력합니다. 추가 실험을 하기 전에 목록을 "연락처 없음" 목록으로 사용할 수 있습니다.

관련 정보