ホットスワップ可能なドライブベイを搭載したサーバー(Ubuntu 14.04を実行)があります。私は通常、大規模な科学データセットを転送する複数のハードドライブの1つを取り付けるためにホットスワップ可能なベイを使用しています。これらのディスクの中には、他のマウントオプション(他のファイルシステム、SSD対HDDなど)が必要です/etc/fstab
。
このデータバッチ処理とバックアップのためのスクリプトの一部を簡素化するために、現在接続されているホットスワップ可能ディスクの1つに対して常に同じマウントポイントを使用するようにサーバーを構成したいと思います。
私は次のようなものを私の中に入れてみました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
ディスクBは正常にマウントされますが、ディスクAのUUIDが見つからないというエラーメッセージが表示され続けます。したがって、mount -a
同じマウントポイントを使用する複数のエントリが試みられますが、これを行うためにfstab
必ずしもそうではありません。sudo
この行動は以下に関連しているようです。この報告されたエラーここでmountall
は、これv2.50で修正されたようです。。 Trustyリポジトリの最新バージョンはまだ2.49なので、最新バージョンのPPAを見つけることができるかどうかを見てみましょう。
アップデート2
inの代わりに呼び出されたときにのみ呼び出されmountall
たため、inのエラーは関連性がないことがわかりました。mountall
実際、出力によると、私はすでにv2.53を実行しています(v2.49と言っていますが)。これはおそらく、複数の行が同じマウントポイントを参照しようとするという事実を説明します。mount -a
mount /common_mount_point
mountall
dpkg -s mountall
mountall --version
sudo mount -a
fstab
答え1
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エントリが必要です。fstab
システムがディスクを検出したら、実行中のudevエントリによって呼び出されるスクリプトを動的に編集することでこの問題を解決できます。たとえば、次の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エントリを維持することです。ただし、udevRUN
フックを使用してマウントポイントを指すシンボリックリンクを更新します。
KERNEL=="sd*", ATTRS{serial}=="123456798", RUN+="/bin/ln -snf /media/disk1 /media/one_of_my_disks"