如何找出哪些文件系統驅動程序已編譯到 linux 核心中?
在正在執行的 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/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 驅動程序分配給設備和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