特定のHDDを特定のマウントポイントにマウントする

ちょっと填ったのでメモ。

一般的な環境ではあまりないかもしれないけど、Linuxマシンに複数台のHDDを接続している場合*1、システム起動時に必ずしも前回起動時と同じ順序でHDDが認識されるとは限らないため、単純にfstabにデバイスのマウントリストを記述しただけでは、各マウントポイントに対して前回起動時とは異なるデバイスパーティション領域がマウントされてしまうことがあります。

これを防ぐには、各パーティションに対してボリュームラベルを設定する、あるいはパーティション作成時に各領域に対して設定される一意の識別子(UUID*2)を指定してマウントする、という二つの手法がありますが*3、これらの手法を各ディストリビューション共通でまとめたページが見あたらなかったので纏めておきます。

注意

  1. バイスの操作になるので、root権限のあるユーザーでの操作になります。
  2. HDDの操作は何があるかわかりませんので自己責任で。データ飛んでも泣かないように。
  3. 一応RHEL4/Ubuntuでコマンドの存在を確認できたので、redhat系なRHEL, Fedora, CentOS, Vineのほか、Debian系を含めだいたいのディストリビューションで動作するものと思われます。
  4. ファイルシステムext2/ext3のみ確認済みです。他のファイルシステムでも同じようにできるかどうかは各自で類似コマンドがあるかどうか確認ください。

ボリュームラベルを指定する場合

これはWindowsにおけるボリュームラベルと同じような概念で、各領域に対して一意の名前を付けてやることで、領域を特定するというものです。台数が少ないうちは覚えやすい名前を指定してやればよいのですが、台数が増えてくると名前と物理デバイスの対応管理が難しくなるのが難点で、万一名前の重複が起こるとデバイスの競合が起こってしまいます。

まずは領域に対してディスクラベルを設定。e2labelコマンドは

# e2label
Usage: e2label device [newlabel]

ですので、

# e2label /dev/sdb1 test

とかてきとーに設定してやります。

で、/etc/fstabを編集。

# vi /etc/fstab

[/etc/fstab]
------------------------------------------
/dev/sda1	/	ext3	defaults	0	0
LABEL=test  /testvolume	ext3	defaults	0	0

...
------------------------------------------

で再起動すればちゃんと動作するはず。

UUIDで指定する

各領域のUUIDを確認するには、tune2fsコマンドを使います。こちらは各デバイスの名前を覚えにくいのが難点ですが、名前の衝突が起こらないことはシステムが保証してくれるため、一度設定してしまえば増設時にも特に気にする必要がないのが利点。

# tune2fs
tune2fs 1.38 (30-Jun-2005)
Usage: tune2fs [-c max_mounts_count] [-e errors_behavior] [-g group]
        [-i interval[d|m|w]] [-j] [-J journal_options]
        [-l] [-s sparse_flag] [-m reserved_blocks_percent]
        [-o [^]mount_options[,...]] [-r reserved_blocks_count]
        [-u user] [-C mount_count] [-L volume_label] [-M last_mounted_dir]
        [-O [^]feature[,...]] [-T last_check_time] [-U UUID] device

詳しくはmanpageを。単に情報を表示するだけなら、 -l オプションを付ければよいので

# tune2fs -l /dev/sdb1
tune2fs 1.38 (30-Jun-2005)
Filesystem volume name:   test
Last mounted on:          <not available>
Filesystem UUID:          ac518bcf-****-d72c-bbe5-************
Filesystem magic number:  0x****
Filesystem revision #:    1 (dynamic)
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux

....

というように表示されます。ここで表示された情報の、 Filesystem UUID が目的のUUIDなので、これを控えます。

で、/etc/fstabを編集。

# vi /etc/fstab

[/etc/fstab]
---------------------------------------------------------------------------------
/dev/sda1	/	ext3	defaults	0	0
UUID=ac518bcf-****-d72c-bbe5-************	/testvolume	ext3	defaults	0	0

...
---------------------------------------------------------------------------------

で再起動すればちゃんと動作するはず。

余談

  1. Ubuntu限定*4で、/lib/udev/vol_id というコマンドがあり、これにデバイス名(/dev/sd*n)を与えてやれば自動的にUUID/Label等に限定された情報を返してくれます。
  2. 一般ユーザーで一時的にマウントする場合では上記の手法が使えないので、
$ ls -l /dev/disk/by-uuid

をしてやると、各領域に対するUUID情報を返してくれます。というかこっちの方が簡単かもしれない。

  1. blkid というコマンドでも各デバイスに対するUUIDを取得可能。これも一般ユーザー権限で動作可。詳細は次章参照。

blkid

$ blkid -h
blkid 1.0.0 (12-Feb-2003)
usage:  blkid [-c <file>] [-hl] [-o format] [-s <tag>] [-t <token>]
    [-v] [-w <file>] [dev ...]
        -c      cache file (default: /etc/blkid.tab, /dev/null = none)
        -h      print this usage message and exit
        -s      show specified tag(s) (default show all tags)
        -t      find device with a specific token (NAME=value pair)
        -l      lookup the the first device with arguments specified by -t
        -v      print version and exit
        -w      write cache to different file (/dev/null = no write)
        dev     specify device(s) to probe (default: all devices)

脚注

*1:特にUSBやe-SATA等での接続時

*2:いわゆるguid

*3:もちろん両方の手法には長所と短所があります。IPアドレス割り当て時の自動割当 or 手動割当の長所/短所が一番近いかもしれない。

*4:Debianもいけるかも?