web-dev-qa-db-ja.com

bashスクリプトからファイルシステムの可用性をどのように判断しますか?

次のいずれかが存在することに依存するスクリプトがある場合:overlayfs、aufs、unionfs-bashスクリプトから利用できるものを判別するための最良の方法は何ですか? overlayfsを使用したいのですが、使用できない場合はaufsまたはunionfsにフォールバックします。カーネルのバージョンを推測として見ることができますが、3.18以上のカーネルであるからといって、overlayfsが組み込まれているわけではありません。合理的に確実にチェックする方法はありますか?

2
Ryan

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/filesystemsFuseを探すことはできますが、それはプログラムがそれを使用するのに十分な特権を持っているかどうかではなく、それが利用可能かどうかだけを示します。実際のより信頼性の高いテストは、/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