次のいずれかが存在することに依存するスクリプトがある場合:overlayfs、aufs、unionfs-bashスクリプトから利用できるものを判別するための最良の方法は何ですか? overlayfsを使用したいのですが、使用できない場合はaufsまたはunionfsにフォールバックします。カーネルのバージョンを推測として見ることができますが、3.18以上のカーネルであるからといって、overlayfsが組み込まれているわけではありません。合理的に確実にチェックする方法はありますか?
Linuxでは、ファイル/proc/filesystems
で実行中のカーネルで使用可能なファイルシステムタイプを確認できます。このファイルの内容は、読み取られたときにカーネルによってリアルタイムで作成されるため、現在のステータスが反映されます。このファイルの形式は少し面倒です。各行には、8つのスペースとそれに続くファイルシステムタイプ、またはnodev
とそれに続く3つのスペースとそれに続くファイルシステムタイプのいずれかが含まれます。各行の最初の8文字を削除して、使用可能なファイルシステムタイプのみを取得するか、grep -w
を使用します(nodev
というファイルシステムタイプを探していない場合)。
if grep -qw aufs /proc/filesystems; then
echo aufs is available
fi
ファイルシステムドライバは、現在ロードされていないモジュールの形で利用できる可能性があるため、これは完全な話ではありません。モジュールをロードできると仮定して、ファイルシステムが利用できない場合は、ロードしてみてください。ファイルシステムモジュールには、fs-FSTYPE
の形式のエイリアスがあります(実際のモジュール名は、多くの場合、ファイルシステムタイプの名前ですが、常にではありません)。
if grep -qw aufs /proc/filesystems; then
echo aufs is available
Elif modprobe fs-aufs; then
echo now aufs is available
fi
これはカーネルファイルシステム用です。 Fuseファイルシステムの場合は、Fuse
ファイルシステムが使用可能かどうかを確認し、ファイルシステムを実装する実行可能ファイルを探します。 /proc/filesystems
でFuse
を探すことはできますが、それはプログラムがそれを使用するのに十分な特権を持っているかどうかではなく、それが利用可能かどうかだけを示します。実際のより信頼性の高いテストは、/dev/Fuse
に書き込むことができるかどうかを確認することです。
if [ -w /dev/Fuse ]; then
echo Fuse is available
if type unionfs-Fuse >/dev/null 2>/dev/null; then
echo unionfs-Fuse is available
fi
fi