Filesystems

如何找出哪些文件系統驅動程序已編譯到 linux 核心中?

  • July 24, 2014

在正在執行的 linux 系統上,找出目前核心已編譯(而不是通過模組)支持哪些文件系統的可移植(在 linux 發行版中)方法是什麼?

例如,考慮我目前的 Ubuntu x86_64 核心:3.11.0-24-generic #41-Ubuntu. 它有例如 no /proc/config.gz,否則這是我的第一個想法。

我感興趣的原因是我想(以程式方式)使用目前核心和核心能夠載入/掛載的初始 ramdisk 建構一個救援環境。

和比較一樣簡單 /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

和比較一樣簡單/proc/filesystemslsmod

不:

$ 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由名為的模組提供,autofs4nfs4由名為 的模組提供nfs。該ext4模組提供ext2ext3以及ext4; fuse提供fuseblkfusectlrpc_pipefs(不要與 混淆pipefs)由 提供sunrpc

然而,您的系統能夠按需載入文件系統的模組:當您執行 時mount -t foo …,如果foo不是受支持的文件系統類型,Linux 會嘗試載入提供此文件系統的模組。其工作方式是核心檢測到它foo不是受支持的文件系統,並呼叫modprobe以載入名為fs-foo. 該機制類似於pci:…通過 PCI ID 為 PCI 硬體外圍設備載入驅動程序的別名,usb:…這與 USB 類似 - 請參閱如何將 USB 驅動程序分配給設備Debian 在重新啟動後不檢測串列 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

引用自:https://unix.stackexchange.com/questions/146080