Linux 커널에 어떤 파일 시스템 드라이버가 컴파일되어 있는지 확인하는 방법은 무엇입니까?

Linux 커널에 어떤 파일 시스템 드라이버가 컴파일되어 있는지 확인하는 방법은 무엇입니까?

실행 중인 Linux 시스템에서 현재 커널이 어떤 파일 시스템을 지원하도록 컴파일되었는지(모듈을 통하지 않고) 알아낼 수 있는 이식 가능한(Linux 배포판 내에서) 방법이 있습니까?

현재 Ubuntu x86_64 커널을 3.11.0-24-generic #41-Ubuntu예로 들어 보겠습니다. 예를 들어 no 가 /proc/config.gz없으면 그게 내 첫 번째 생각이 될 것입니다.

내가 관심을 갖는 이유는 현재 커널과 커널이 로드/설치할 수 있는 초기 램디스크를 사용하여 (프로그래밍 방식으로) 복구 환경을 구축하고 싶기 때문입니다.

비교하는 것만큼 간단해요 /proc/filesystems 그리고 lsmod?

lsmod그렇다면 모듈은 항상 파일 시스템 이름(마지막 열)과 정확히 동일한 이름(출력의 첫 번째 열)을 갖습니까 /proc/filesystems?

정보를 찾는 /sys대신 더 현대적인 방법이 있나요 ?/proc

나의 현재 접근 방식은 다음과 같습니다. 누구든지 그것이 올바른지 확인하거나 수행 방법을 제안할 수 있습니까? :

for fscand in $(awk '{print $NF}' /proc/filesystems)
do
  if test $(lsmod | grep -c -e '^'${fscand}'[^a-z0-9_-]') -eq 0
  then
    candlist="${fscand} ${candlist}"
  fi
done

for fscand in $candlist
do
  echo $fscand is compiled-in
done

답변1

/proc/filesystems비교하는 것만큼 간단합니까 lsmod?

아니요:

$ comm -31 <(lsmod | awk 'NR!=1 {print $1}' |sort) \
           <(</proc/filesystems awk '{print $NF}' |sort) | fmt
anon_inodefs autofs bdev cgroup cpuset debugfs devpts devtmpfs ext2 ext3
fuseblk fusectl hugetlbfs mqueue nfs4 pipefs proc pstore ramfs rootfs
rpc_pipefs securityfs sockfs sysfs tmpfs

이들 중 다수는 시스템 커널에 내장되어 있지 않습니다. autofs이라는 모듈에서 제공 autofs4하는 이라는 nfs4모듈에서 제공합니다 nfs. 이 ext4모듈은 ext2다음을 제공합니다. (혼동하지 마세요) 의해 제공됩니다.ext3ext4fusefuseblkfusectlrpc_pipefspipefssunrpc

그러나 시스템은 필요에 따라 파일 시스템에 대한 모듈을 로드할 수 있습니다. 를 실행할 때 지원되는 파일 시스템 유형이 아닌 mount -t foo …경우 fooLinux는 파일 시스템을 제공하는 모듈을 로드하려고 시도합니다. 작동 방식은 커널이 이것이 foo지원되는 파일 시스템이 아니라는 것을 감지하고 modprobe이름이 지정된 모듈을 로드 하는 것입니다 fs-foo. 이 메커니즘은 pci:…PCI ID별로 PCI 하드웨어 주변 장치용 드라이버를 로드하는 앨리어싱 과 유사합니다 . usb:…이는 USB와 유사합니다.장치에 USB 드라이버를 할당하는 방법그리고데비안 재부팅 후 직렬 PCI 카드가 감지되지 않습니다더 많은 설명을 원하시면. 모듈 fs-…별칭은 에 기록됩니다 /lib/$(uname -r)/modules.alias. 이 파일은 커널을 빌드할 때 생성됩니다.

일반적인 상황에서는 이를 사용하여 모듈에서 제공하는 파일 시스템을 확인할 수 있습니다. 제거를 통해 모듈에서 제공하지 않는 파일 시스템이 커널에 구축됩니다. 파일을 수정하거나 삭제한 경우 modules.alias또는 파일 시스템이 모듈과 컴파일된 형식 모두에서 제공되는 경우 와 같이 이 접근 방식이 작동하지 않는 드문 경우가 있습니다. 커널 코드를 작성하고 이를 모듈로 로드하는 것 외에는 이러한 상황을 처리할 수 있는 방법이 없습니다.

for fs in $(</proc/filesystems awk '{print "fs-" $NF}' |sort); do
  /sbin/modprobe -n $fs 2>/dev/null || echo "$fs is built in"
done

관련 정보