Linuxカーネルにどのファイルシステムドライバがコンパイルされているかを確認する方法は?

Linuxカーネルにどのファイルシステムドライバがコンパイルされているかを確認する方法は?

実行中の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以下を提供します。 (混同しないでください)によって提供されます。ext3ext4fusefuseblkfusectlrpc_pipefspipefssunrpc

ただし、システムは必要に応じてファイルシステム用のモジュールをロードできます。実行時にサポートされているファイルシステムタイプではないmount -t foo …場合、fooLinuxはファイルシステムを提供するモジュールをロードしようとします。仕組みは、カーネルがこれが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

関連情報