実行中のLinuxシステムで、現在のカーネルがどのファイルシステムをサポートするようにコンパイルされているか(モジュールを介さずに)理解できる移植可能な(Linuxディストリビューション内)方法はありますか?
現在、Ubuntu x86_64カーネルを3.11.0-24-generic #41-Ubuntu
例にしてみましょう。たとえば、noが/proc/config.gz
なければ、それは私の最初の考えになります。
私が興味を持っているのは、現在のカーネルとカーネルがロード/インストールできる初期のRAMディスクを使用して(プログラミング方法で)リカバリ環境を構築したいからです。
比較するのと同じくらい簡単です。 /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ドライバを割り当てる方法そして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