UUIDを使ったディスクドライブ指定

 「/etc/fstab」ファイルの中身を調べると、「/dev/hda1」といった見慣れたハードディスク表記ではなく「UUID=62fa5eac-3df4-448d-a576-916dd5b432f2」のようなエントリを見かけることがある。こうしたエントリは汎用一意識別子(UUID:Universally Unique IDentifier)と呼ばれており、この128ビットの数値を使うことでハードディスクドライブの管理が容易になる。

 「/dev/hda」と「/dev/hdb」という2台のハードディスクドライブを搭載したシステムがあるとする。「/dev/hda」にはrootパーティションとスワップパーティションが含まれ、「/dev/hdb1」にはホームディレクトリと2台目のハードディスク領域全体が含まれている。ここで、別のハードディスクドライブをシステムに追加したいが、何らかの制約があって「/dev/hda」と「/dev/hdb」の間にしか追加できず、「/dev/hdb」を「/dev/hdc」としなければならないとする。すると、似たようなことを試した人なら知っているだろうが、次のような問題が起こる。mountコマンドは、「/etc/fstab」ファイルをチェックして新しいドライブを「/home」としてマウントしようとするのだ。この問題を解決するには、シングルユーザモードでrootとしてログインし、「/etc/fstab」を編集したうえで、ドライブの起動順序を変更する必要がある。そうしないと、ログイン時にシステムからエラーが返ってくるか、最悪の場合はルートドライブでカーネルパニックが発生する。これだけでも十分に厄介な状況だが、「/var」、「/opt」、「/home」、「/boot」、「/usr」、「/usr/local」といったディレクトリが複数のハードディスクドライブに分かれているマシンだと、問題はさらに複雑になる。

 しかし、システム管理者がUUIDを使用することにすれば、こうした問題は実質的に解消される。「/dev/sd*」とか「/dev/hd*」という表記がほとんど消えてしまうからだ。その代わり、それぞれのハードディスクドライブにはUUIDが与えられる。UUIDはファイルシステム内で保持され、「/etc/fstab」が参照先となる。そのため、システム管理者は、UNIXのファイルシステムツリー内のマウント位置に影響を与えることなく、各デバイスをBIOSチェーン内のどこにでも自由に配置できる。

 旧来のシステムでは通常「/etc/fstab」のエントリが次のようになっている(以下はファイルシステムにJFSを使っている場合)。

/dev/sda1   /   jfs   relatime,errors=remount-ro   0   1

 新しいシステムでは、同じエントリが次のようになる。

UUID=1c0653cd-e897-41af-bd30-55f3a195ff33  /  jfs     relatime,errors=remount-ro  0  1

 違うのは、エントリの最初の部分だけである。ドライブを指定する「/dev/sda1」の部分が、「UUID= 1c0653cd-e897-41af-bd30-55f3a195ff33」に変わっている。そのため、このドライブが仮に「/dev/sdi1」だったとしても問題は起こらない。ブートローダの設定ファイルさえ適切に変更されていれば、このドライブはrootとしてマウントされ、期待どおりに動作してくれる。

 UUIDを利用するには、まず「/etc/fstab」ファイルをチェックする。上記のUUIDの例と同じような行があれば、おそらくすでにUUIDを使ってドライブのマウントが行われているはずだ。それを確認するには、「cat /proc/cmdline」というコマンドを実行すればよい。UUIDを含む結果が返ってくれば、システムのブートローダがUUIDによるrootファイルシステムのマウントを行ったということであり、実際にUUIDが使われていることになる。残念ながら、mountコマンド自体ではまだそうした情報を扱えるようにはなっていない。少なくとも私のシステムではそうであり、mountコマンドも「/etc/mtab」ファイルも、「/dev/[hs]d*」という表記でハードディスクドライブを参照している。この制限により、自分で使うドライブとパーティションのそれぞれのマウント先には注意する必要がある。ただし、あとで説明するように、こうした情報を表示してくれるコマンドは存在する。

 まだUUIDを使っていないがこれから使いたいという場合は、テスト用のハードディスクドライブを別に用意することをお勧めする。実際に使っているファイルシステムをいじって、不用意に破壊してしまうのを避けるためだ。また、BIOSのドライブ位置をデバイスノードに関連付ける方法や、パーティション設定とファイルシステム作成の方法も知っておく必要がある。これらの意味がわからなければ、詳しい人に訊くか、チュートリアルを読んで学んでおくこと。

 準備が整ったら、既存のハードディスクドライブのパーティションノードと干渉しないように、テスト用のハードディスクドライブをコンピュータに取り付け、コンピュータのブート後に、そのドライブのパーティション分割スキームとファイルシステムの作成を行う。LinuxネイティブのファイルシステムはいずれもUUIDをサポートしているので、どれを使用してもよい。個人的にReiserFS、ext2/3、JFS、XFSを試してみたが、どれでもUUIDが使えた。一方、FATやNTFSではUUIDが十分にサポートされていない可能性がある。blkidではこれらのドライブのUUIDも表示されるが、NTFSおよびFATに関するMicrosoftの技術文書にはUUIDの記述すらない。ここでは、新たに取り付けたドライブのファイルシステムだけでなく、マウントポイントも作成しておく。これらの作業が済んだら、「sudo vol_id /dev/your_hard_drive」という形のコマンドを実行する。すると、次のような出力が表示されるはずだ。

ID_FS_USAGE=filesystem
ID_FS_TYPE=jfs
ID_FS_VERSION=
ID_FS_UUID=1c0653cd-e897-41af-bd30-55f3a195ff33
ID_FS_UUID_ENC=1c0653cd-e897-41af-bd30-55f3a195ff33
ID_FS_LABEL=
ID_FS_LABEL_ENC=
ID_FS_LABEL_SAFE=

 ここでは「ID_FS_UUID」という情報にだけ注目すればよい。上記の「vol_id」コマンドでUUIDが表示されなかった場合は、UUIDを生成してドライブに割り当てる必要がある。DCE 1.1のバージョン1、3、4、5に従ってUUIDを生成するのがuuidコマンドである。デフォルトのバージョン1では、システムクロックの時間とシステムのイーサネットカードのMACアドレスの組み合わせを使用してUUIDを生成する。MACアドレスは一意に割り当てられているが、UUIDを生成したマシンの構成要素が特定されるのではないかというプライバシやセキュリティ上の問題を挙げる人もいる。バージョン3では名前に基づくMD5ハッシュを利用し、バージョン4は乱数ベースのものであり、バージョン5は名前に基づくSHA-1ハッシュを利用する。なお、バージョン3および5を利用するには、URLのような名前空間が必要になる。ほとんどの人はバージョン1または4で事足りるだろう。

 乱数ベースのバージョンがどれかを覚えておかなくても、「uuidgen」を使えばランダムなUUIDを生成できる。デフォルトは乱数ベースの生成だが、システム時間とMACアドレスに基づいてUUIDを生成するオプションもある。

 UUIDを取得したら、「/etc/fstab」ファイルを開き、そのUUIDを新しい行に追記する。続いて、その行の後ろに、「/etc/fstab」ファイルにある既存の行にあるファイルシステムのオプションをコピーして、次のような形にする。

UUID=1c0653cd-e897-41af-bd30-55f3a195ff33  /your/mount/point file_system_type file_system_options

 行頭の「UUID=」を忘れずに追記すること。この作業が済んだら「/etc/fstab」ファイルを保存してテキストエディタを終了し、「sudo mount -U /your/mount/point」のようなコマンドを実行する。すべてがうまくいけば、このコマンドはエラーが出ることなく完了する。今度はパラメータなしでmountコマンドを実行して、マウント済みデバイスの表示を確認する。先ほど追加したドライブが一覧にあれば、UUIDによるマウントに成功したことになる。

 UUIDのすばらしさを実感したければ、コンピュータをシャットダウンし、デバイスノード名が変わるようにハードディスクドライブの接続を変えて、リブートしてみるとよい。何のエラーもなく、先ほどと同じ場所にドライブがマウントされているはずだ。

その他のユーティリティ

 「reiserfstune -u UUID /dev/node」、「tune2fs -U UUID /dev/node」、「jfs_tune -U UUID /dev/node」、「xfs_admin -U UUID /dev/node」といった形のコマンドはいずれも、それぞれのファイルシステム上でUUIDの変更を行う。これらのコマンドを使う場合は、「/etc/fstab」の該当するUUIDと場合によってはブートローダの設定ファイルの記述も新しいUUIDに一致させる必要がある。でないと、新しいファイルシステムが利用できなくなったり、それがルートパーティションだった場合はシステム全体がブートできなくなったりする。

 また、UUIDと「/dev/[hs]d*」表記を一緒に確認するには「sudo blkid」を実行する。このコマンドにより、システムに接続されているデバイスがそれぞれのUUIDと共に表示される。ただし、正しく動作させるにはroot権限が必要になる。root権限がなくてもエラーが出ることはないが、まったく情報が表示されない。注意しておくが、これはmountコマンドの代わりにはならない。このコマンドでは、マウントの有無に関係なく、システムに接続されているデバイスが表示されるからだ。

 さらに「sudo findfs UUID=1c0653cd-e897-41af-bd30-55f3a195ff33」と実行すると、そのUUIDに一致するデバイスのデバイスノードが返ってくる。このコマンドは、デバイスノードとUUIDの情報を「/etc/fstab」ファイルにしか書き留めていない場合に役立つ。

 ここで紹介したUUIDを使ってディスクドライブの指定を行えば、きっとディスクの管理が楽になるはずだ。ただし、頭を抱えるような事態にならないよう、作業は慎重に行ってほしい。

David Pendellは趣味でコンピュータによる映像音響処理を手がけており、その経歴は20年を超える。ここ10年はLinuxを利用していて、扱うプラットフォームは組み込みから中規模サーバまで多岐にわたる。

Linux.com 原文(2008年9月11日)