tabimoba.net

とあるエンジニアの雑記帳

USBハードディスクをLinuxで使うときの注意点

自宅サーバや仕事でサーバの運用を行う際に、バックアップや容量拡張用のストレージとしてUSBハードディスクを使用する場合があります。また、USBハードディスクはパーソナル用途のみに留まらず、最近では、RDXのようにサーバ用のバックアップストレージとしても使用されています。例えば、HPのStorageWorks RDXシリーズ製品は外付・内蔵製品いずれもUSBで接続されます。

USBハードディスクをLinuxで使用すること自体はそれほど難しくありません。ただUSBポートに差し込んでマウントするだけでもとりあえず使えます。しかし、バックアップや容量拡張用ストレージ用途で運用する場合、マウント時の設定によっては大きな問題が生じる可能性があります。最悪の場合、サーバ全体のパフォーマンス低下を引き起こす要因にもなります。このため、運用に際してはちょっとした注意が必要です。

そこで、自分のメモも兼ねてUSBハードディスクをLinuxで使うときの注意点をまとめてみました。

defaultsオプションやasyncオプションを指定してUSBハードディスクをマウントしない

USBハードディスクは、mount時のマウントオプションでdefaultsやasyncを指定すると、ハードディスク上への書き込み時の負荷が高まった際に、PC全体のパフォーマンス低下の問題が発生する場合があります。

このため、USBハードディスクをマウントする際は、defaultsオプションやasyncオプションはなるべく使用しない方が良いでしょう。なお、defaultsと同じ条件とするが、そこからasyncオプションを除きたい場合は、

rw,suid,dev,exec,auto,nouser,sync

をマウントオプションとして指定します。

/etc/fstabでは、

UUID=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee /mnt/usbdisk ext4 rw,suid,dev,exec,auto,nouser,sync 1 0

のように指定します。

defaultsオプションには、rw,suid,dev,exec,auto,nouser,asyncオプションが含まれています。このうち、asyncが大きく影響します。asyncの場合、非同期でハードディスクにデータが転送されますが、ハードディスクへの転送が完了していないデータは一時的にメモリ上に蓄積(キャッシュ)されます。

キャッシュされる大きなメリットとしては、見かけの転送速度が高速となり処理の待ち時間の短縮につながるという点が挙げられます。SATAやSAS接続のハードディスクなど高速なハードディスクの場合は、その恩恵を特に享受することができます。キャッシュの使用時間も短時間で済むため、キャッシュのディスクへの書き出しが間に合わないといった問題の発生頻度も低いです。

しかしUSBハードディスクは、SATAやSAS接続のハードディスクよりも転送速度が非常に遅い(USB2.0の場合は最大480Mbps)という問題があります。USBハードディスクにおいてもasyncによって見かけ上の転送速度は高速化されますが、その反面USBハードディスクに対して大量のファイルや大容量のファイルをコピーすると、転送速度が遅いゆえにキャッシュのディスクへの書き出しが間に合わず、キャッシュがなかなかメモリ上から開放されないという問題が高頻度で発生しやすくなります。

特に、大量のファイルや大容量のファイルコピー等高負荷となる処理を行った場合はキャッシュが解放されず、この問題が続いた場合、物理メモリ不足の状態となりスワップが発生し、その結果PC全体のパフォーマンス低下を引き起こす原因となります。

また、asyncオプションは非同期でデータが転送されるため、転送時の障害に弱いというデメリットもあります。例えば、停電による電源障害のようなものや、USBケーブルや電源ケーブルが抜けてしまったなどの問題が発生した場合に、転送中のデータが破損してしまう、最悪の場合ファイルシステムが破損してしまうといった問題が発生する恐れがあります。

内蔵ハードディスクと異なり、USBハードディスクの場合はケーブルが触れられる位置にあり、それゆえにケーブルトラブルのリスクが非常に高いため、そのような問題を想定してasyncではなくsyncを指定すべきであると考えます。特に、バックアップディスクや常時運用のディスクなどクリティカルな用途で使用している場合は、そうすべきです。

USBハードディスクのマウントをfstabで設定する場合はデバイス名ではなくボリュームラベルやUUIDで指定する

USBハードディスクは、デバイスの接続順やUSBの接続ポート等により、割り当てられるデバイス名(/dev/sdaなど)が変わる場合があります。例えば、PCの再起動前は/dev/sdaだったデバイスが再起動後に/dev/sdbになる等異なるデバイス名が割り当てられたり、当初のデバイス名に対して異なるデバイスが割り当てられるような問題は良くある問題です。

これにより、例えば/etc/fstabでマウントするデバイスを定義している場合、起動時にマウントするように指定していたデバイスのマウントに失敗する、予期しないディスクがマウントされる等の問題が発生する場合があり、特にバックアップディスクのように常時USBハードディスクを接続して利用する用途では非常に不便です。

このような問題の解決方法としては、マウント時においてボリュームラベルを指定する、UUIDを指定する、いずれかの方法が挙げられます。手順は以下の通りとなります。

1.ボリュームラベルを設定する
# /sbin/e2label /dev/sda1 usbdisk

のように、

/sbin/e2label [デバイス名] [ボリュームラベル]

というコマンドを実行することで、ハードディスクのボリュームラベルを設定することができます。
※参考:ボリュームラベルでUSBハードディスクの管理を効率化するには(@IT)

設定したボリュームラベルは、/etc/fstabでは以下のように指定します。

LABEL=/usbdisk /mnt/usbdisk ext4 defaults 1 0
2.UUIDを取得して設定する

UUIDとは、Linuxにおけるデバイス固有の識別子です。

# /sbin/blkid /dev/sda1

のように、

/sbin/blkid [デバイス名]

というコマンドを実行することで、ハードディスクのUUIDを確認することができます。
※参考:UUIDを調べる方法(ubulog)

取得したUUIDは、/etc/fstabでは以下のように指定します。

UUID=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee /mnt/usbdisk ext4 defaults 1 0