web-dev-qa-db-ja.com

同じマウントポイントに(異なるマウントオプションを使用して)代替デバイスをマウントする

ホットスワップドライブベイを備えたサーバー(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スクリプトを作成できると思いますが、もっと洗練されたソリューションがあることを望んでいました。

アップデート1

興味深いことに、Sudo mount -aの代わりにmount /common_mount_pointを呼び出すと、ディスクAのUUIDが見つからないというエラーメッセージが表示されますが、ディスクBのマウントに成功します。したがって、mount -aは同じマウントポイントで複数のfstabエントリを試行しますが、これを機能させるためにSudoを実行する必要はありません。

この動作は、mountallの-​​ この報告されたバグ に関連しているようです。これは v2.50で修正されたようです です。 Trustyリポジトリの最新のバージョンはまだ2.49なので、更新されたバージョンのPPAを見つけることができるかどうかを確認します。

アップデート2

mountallは、mount -aではなくmount /common_mount_pointを呼び出したときにのみ呼び出されるため、mountallのバグは無関係であることがわかりました。実際、dpkg -s mountallの出力によると、私はすでにmountall v2.53を実行していました(mountall --versionはv2.49だと言っていましたが)。これはおそらく、Sudo mount -aが実際に同じマウントポイントを参照する複数のfstab行を試行するという事実を説明しています。

5
ali_m

Udevを利用して同じデバイス名を使用する

/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"'/'

マウントポイントを気にしないようにudevを活用する

別のアプローチは、個別のデバイス名と個別のマウントポイントを使用して、個別のfstabエントリを保持することです。ただし、udev RUNフックを使用して、マウントポイントを指すシンボリックリンクを更新します。

KERNEL=="sd*", ATTRS{serial}=="123456798", RUN+="/bin/ln -snf /media/disk1 /media/one_of_my_disks"