ホットスワップドライブベイを備えたサーバー(Ubuntu 14.04を実行)があります。私は通常、ホットスワップベイを使用して、大規模な科学データセットをシャトルする多数の緩いハードディスクの1つをマウントします。これらのディスクの中には、異なるマウントオプション(異なるファイルシステム、SSD v HDDなど)を必要とするものがあり、通常は/etc/fstab
内のUUIDごとに個別に指定します。
バッチ処理とこのデータのバックアップのためのスクリプトの一部を簡素化するために、これらのホットスワップされたディスクのいずれかが現在接続されている場合は常に同じマウントポイントを使用するようにサーバーを構成したいと思います。
fstab
に次のようなものを入れてみました。
UUID=<disk A> /common_mount_point ext4 defaults,discard,noatime 0 0
UUID=<disk B> /common_mount_point btrfs defaults,compress=lzo 0 0
これは、ディスクAをマウントする場合は正常に機能しますが、ディスクBをマウントしようとするとエラーが発生します。
mount: special device UUID=<disk B> does not exist
これらの2行の順序を入れ替えると逆のことが起こるため、mount
はその特定のマウントポイントを参照するfstab
の最初の行を探し、関連付けられている場合はエラーをスローするようです。ファイルシステム記述子が見つかりません。
マウント操作の1つが成功するまで、同じマウントポイントに複数の異なるUUIDを順番にマウントしようとするbashスクリプトを作成できると思いますが、もっと洗練されたソリューションがあることを望んでいました。
興味深いことに、Sudo mount -a
の代わりにmount /common_mount_point
を呼び出すと、ディスクAのUUIDが見つからないというエラーメッセージが表示されますが、ディスクBのマウントに成功します。したがって、mount -a
は同じマウントポイントで複数のfstab
エントリを試行しますが、これを機能させるためにSudo
を実行する必要はありません。
この動作は、mountall
の- この報告されたバグ に関連しているようです。これは v2.50で修正されたようです です。 Trustyリポジトリの最新のバージョンはまだ2.49なので、更新されたバージョンのPPAを見つけることができるかどうかを確認します。
mountall
は、mount -a
ではなくmount /common_mount_point
を呼び出したときにのみ呼び出されるため、mountall
のバグは無関係であることがわかりました。実際、dpkg -s mountall
の出力によると、私はすでにmountall
v2.53を実行していました(mountall --version
はv2.49だと言っていましたが)。これはおそらく、Sudo mount -a
が実際に同じマウントポイントを参照する複数のfstab
行を試行するという事実を説明しています。
/etc/fstab
にUUIDをリストする代わりに、デバイス名をリストし、これらすべてのデバイスに同じデバイス名を使用するようにudevを設定できます。このような行を/etc/udev/rules.d
のファイルに入れます。
KERNEL=="sd*", ATTRS{serial}=="123456798", NAME="one_of_my_disks%n"
または
KERNEL=="sd*", ATTRS{serial}=="123456798", SYMLINK+="one_of_my_disks%n"
udevadm info -a -n sdb
を実行して、一致できるディスクの属性(上記の例のATTRS{serial}=="123456798"
など)を確認します。複数の属性のみを使用できますが、それらはすべて同じセクションからのものである必要があることに注意してください。
次に、/etc/fstab
で、/dev/one_of_my_disks
をブロックデバイスとして使用します。
ディスクのレイアウトが異なる場合、これはより複雑になります。ファイルシステムタイプにはauto
を使用できます。これはほとんどのタイプで機能するはずです。ただし、異なるパーティション番号またはマウントオプションが必要な場合は、異なるfstabエントリが必要になります。これを回避するには、udevエントリによって呼び出されるスクリプトを使用してその場でfstab
を編集します。このスクリプトは、システムによってディスクが検出されたときに実行されます。たとえば、次のudevルールを使用します。
KERNEL=="sd*", ATTRS{serial}=="123456798", ENV{FSTAB4}="compress=lzo", NAME="one_of_my_disks%n", RUN+="/usr/local/sbin/fstab_update_my_disk"
および次のfstab_update_my_disk
スクリプト(未テスト):
#!/bin/sh
/usr/bin/sed -i -e '/^\/dev\/one_of_my_disks1/ s/\([^ \t][^ \t]*[ \t][ \t]*[^ \t][^ \t]*[ \t][ \t]*[^ \t][^ \t]*[ \t][ \t]*\)[^ \t][^ \t]*/\1'"$FSTAB4"'/'
別のアプローチは、個別のデバイス名と個別のマウントポイントを使用して、個別のfstabエントリを保持することです。ただし、udev RUN
フックを使用して、マウントポイントを指すシンボリックリンクを更新します。
KERNEL=="sd*", ATTRS{serial}=="123456798", RUN+="/bin/ln -snf /media/disk1 /media/one_of_my_disks"