실행 중인 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
다음을 제공합니다. (혼동하지 마세요) 의해 제공됩니다.ext3
ext4
fuse
fuseblk
fusectl
rpc_pipefs
pipefs
sunrpc
그러나 시스템은 필요에 따라 파일 시스템에 대한 모듈을 로드할 수 있습니다. 를 실행할 때 지원되는 파일 시스템 유형이 아닌 mount -t foo …
경우 foo
Linux는 파일 시스템을 제공하는 모듈을 로드하려고 시도합니다. 작동 방식은 커널이 이것이 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