永続的なブロックデバイスの命名

提供: ArchWiki
2016年3月4日 (金) 02:38時点におけるKusakata (トーク | 投稿記録)による版 (typo)
ナビゲーションに移動 検索に移動

関連記事

この記事ではブロックデバイスに永続的な名前を使う方法を説明します。永続的な命名は udev によって可能になったものであり、バスによる命名と比べて複数の利点があります。使用しているマシンに複数の SATA, SCSI, IDE ディスクコントローラが存在する場合、それぞれのデバイスノードが追加される順番は一定しません。そのため、起動するたびに /dev/sda/dev/sdb といったデバイス名は入れ替わる可能性があり、下手をすると、システムが起動できなくなったり、カーネルパニックが発生したり、ブロックデバイスが表示されなくなってしまいます。永続的な命名によってこれらの問題は解決します。

ノート:
  • 永続的な命名には制約が存在しますが、それはこの記事では扱っていません。例えば、mkinitcpio が命名方法をサポートしていても、systemd が起動時に処理できる命名法には制約が存在することがあります (例: FS#42884)。
  • LVM2 を使用している場合、LVM は自動的にデバイス名を管理するのでこの記事を読む必要はありません。

永続的な命名の方法

永続的な命名には4つの異なる形式があります: by-label, by-uuid, by-id と by-pathGUID Partition Table (GPT) のディスクを使用する場合、さらに by-partlabelby-partuuid の形式も利用可能です。また、Udev による固定デバイス名を使うこともできます。

以下のセクションでは4つの異なる命名規則がどのようなものであるか、またどうやって使うのかを説明しています。

lsblk -f コマンドを使うことで永続的な名前をグラフィカルに表示することができます:

$ lsblk -f
NAME   FSTYPE LABEL  UUID                                 MOUNTPOINT
sda                                                       
├─sda1 vfat          CBB6-24F2                            /boot
├─sda2 ext4   SYSTEM 0a3407de-014b-458b-b5c1-848e92a327a3 /
├─sda3 ext4   DATA   b411dc99-f0a0-4c87-9e05-184977be8539 /home
└─sda4 swap          f9fe0b69-a280-415d-a03a-a32752370dee [SWAP]

GPT を使っている場合、代わりに blkid コマンドを使います。blkid コマンドはスクリプトで処理しやすいように出力しますが、人間が読むときは読みづらいかもしれません。

$ blkid
/dev/sda1: UUID="CBB6-24F2" TYPE="vfat" PARTLABEL="EFI SYSTEM PARTITION" PARTUUID="d0d0d110-0a71-4ed6-936a-304969ea36af" 
/dev/sda2: LABEL="SYSTEM" UUID="0a3407de-014b-458b-b5c1-848e92a327a3" TYPE="ext4" PARTLABEL="GNU/LINUX" PARTUUID="98a81274-10f7-40db-872a-03df048df366" 
/dev/sda3: LABEL="DATA" UUID="b411dc99-f0a0-4c87-9e05-184977be8539" TYPE="ext4" PARTLABEL="HOME" PARTUUID="7280201c-fc5d-40f2-a9b2-466611d3d49e" 
/dev/sda4: UUID="f9fe0b69-a280-415d-a03a-a32752370dee" TYPE="swap" PARTLABEL="SWAP" PARTUUID="039b6c1c-7553-4455-9537-1befbc9fbc5b

by-label

大抵のファイルシステムはラベルを設定することができます。ラベルが存在するパーティションは /dev/disk/by-label ディレクトリに掲載されます。あなたがパーティションにラベルを付加したり取り除いたりすると、このディレクトリが動的に作成・破壊されます。

$ ls -l /dev/disk/by-label
total 0
lrwxrwxrwx 1 root root 10 May 27 23:31 DATA -> ../../sda3
lrwxrwxrwx 1 root root 10 May 27 23:31 SYSTEM -> ../../sda2

ファイルシステムのラベルは変更することが可能です。一般的に使われているファイルシステムのラベルを変更する方法は以下の通りになります:

swap 
swaplabel -L <label> /dev/XXX (util-linux を使用)
ext2/3/4 
e2label /dev/XXX <label> (e2fsprogs を使用)
btrfs 
btrfs filesystem label /dev/XXX <label> (btrfs-progs を使用)
reiserfs 
reiserfstune -l <label> /dev/XXX (reiserfsprogs を使用)
jfs 
jfs_tune -L <label> /dev/XXX (jfsutils を使用)
xfs 
xfs_admin -L <label> /dev/XXX (xfsprogs を使用)
fat/vfat 
dosfslabel /dev/XXX <label> (dosfstools を使用)
fat/vfat 
mlabel -i /dev/XXX ::<label> (mtools を使用)
ntfs 
ntfslabel /dev/XXX <label> (ntfs-3g を使用)
zfs 
このファイルシステムは /dev/disk/by-label をサポートしていません。ただし #by-partlabel を使うことはできます。
ノート:
  • root パーティションのファイルシステムラベルを変更する場合、先にパーティションをアンマウントしなければならないので、"ライブ" GNU/Linux ディストリビューションから行う必要があります。
  • ラベルを付けるときは衝突しないような一義的な名前を付ける必要があります。
  • ラベルに設定できるのは16文字までです。
  • ラベルはファイルシステムのプロパティなので、RAID デバイスを永続的に参照したいようなときには向いていません。

by-uuid

UUID を使うことで一意に特定可能な識別子をファイルシステムに与えることができます。UUID の識別子は、パーティションをフォーマットするときにファイルシステムユーティリティ (例: mkfs.*) によって生成されます。UUID は名前の衝突が起こらないように作られています。(スワップや暗号化デバイスの LUKS ヘッダなども含む) 全ての GNU/Linux ファイルシステムが UUID をサポートします。FAT や NTFS ファイルシステム (上記の fatwindows ラベル) は UUID をサポートしていませんが、短い UID (unique identifier) で /dev/disk/by-uuid には掲載されます:

$ ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 May 27 23:31 0a3407de-014b-458b-b5c1-848e92a327a3 -> ../../sda2
lrwxrwxrwx 1 root root 10 May 27 23:31 b411dc99-f0a0-4c87-9e05-184977be8539 -> ../../sda3
lrwxrwxrwx 1 root root 10 May 27 23:31 CBB6-24F2 -> ../../sda1
lrwxrwxrwx 1 root root 10 May 27 23:31 f9fe0b69-a280-415d-a03a-a32752370dee -> ../../sda4

UUID を使用する利点として、名前の衝突が発生する可能性がラベルよりもずっと少ないことが挙げられます。さらに、UUID はファイルシステムの作成時に自動的に生成されます。他のシステムにデバイスを接続したときでも、一意性を保つことができます。ラベルの場合、他のシステムに接続したとき名前がカブってしまう可能性が否定できません。

逆に UUID の欠点としては、生成されるコードが長いために、設定ファイル (例: fstab や crypttab) が読みづらくなったり整形が崩れてしまうことがあります。また、パーティションのサイズを変更したり、再フォーマットをするたびに新しい UUID が生成されるので、設定を手動で変更する必要が生じます。

ヒント: スワップパーティションに UUID が割り当てられていない場合、mkswap ユーティリティを使ってスワップパーティションをリセットする必要があります。

by-id と by-path

by-id はハードウェアのシリアル番号に基づいて一意な名前を作成します。by-path は (sysfs による) 一番短い物理パスを使います。どちらも属するサブシステムを示す文字列を含んでいるため (by-path の場合 -ide-by-id の場合 -ata-)、デバイスを制御するハードウェアと繋がりがあります。このため永続性のレベルが異なってきます: by-path はデバイスをコントローラの他のポートに接続したときに値が変わり、by-id はデバイスを他のサブシステムが使っているハードウェアコントローラのポートに接続したときに値が変わります [1]。従って、ハードウェアが変わっても値が変わらないような永続的な命名としてはどちらも使えません。

ただし、巨大なハードウェアインフラストラクチャで特定のデバイスを見つけたいときは有益な情報となります。例えば、永続的なラベル (by-labelby-partlabel) を手動で割り当てておらず、使用するハードウェアポートとディレクトリを変えていない場合、by-idby-path を使うことで特定のデバイスを探すことが可能です [2][3]

by-partlabel

ノート: この方法は GUID Partition Table (GPT) のディスクでだけ使えます。

GPT ディスクのパーティションエントリのヘッダにパーティションラベルを定義することができます。

Wikipedia:ja:GUIDパーティションテーブル#パーティションエントリ (LBA 2〜33) も見て下さい。

この方法はファイルシステムラベルとよく似ていますが、動的ディレクトリは /dev/disk/by-partlabel になります。

ls -l /dev/disk/by-partlabel/
total 0
lrwxrwxrwx 1 root root 10 May 27 23:31 EFI\x20SYSTEM\x20PARTITION -> ../../sda1
lrwxrwxrwx 1 root root 10 May 27 23:31 GNU\x2fLINUX -> ../../sda2
lrwxrwxrwx 1 root root 10 May 27 23:31 HOME -> ../../sda3
lrwxrwxrwx 1 root root 10 May 27 23:31 SWAP -> ../../sda4
ノート:
  • GPT パーティションラベルも名前が衝突しないように付ける必要があります。パーティションラベルを変更したいときは、gdisk か ncurse ベースの cgdisk を使います。どちらのプログラムも gptfdisk パッケージに入っています。パーティショニング#パーティショニングツールを見て下さい。
  • GPT パーティションラベルは72文字まで設定できると仕様で決まっています。

by-partuuid

ノート: この方法は GUID Partition Table (GPT) のディスクでだけ使えます。

GPT パーティションラベルと同じように、GPT パーティション UUID は GPT ディスクのパーティションエントリに定義されます。

Wikipedia:ja:GUIDパーティションテーブル#パーティションエントリ (LBA 2〜33) も見て下さい。

動的ディレクトリは UUID ファイルシステムなど他の方法と同じようになっており、ラベルよりも UUID の使用が推奨されます。

ls -l /dev/disk/by-partuuid/
total 0
lrwxrwxrwx 1 root root 10 May 27 23:31 039b6c1c-7553-4455-9537-1befbc9fbc5b -> ../../sda4
lrwxrwxrwx 1 root root 10 May 27 23:31 7280201c-fc5d-40f2-a9b2-466611d3d49e -> ../../sda3
lrwxrwxrwx 1 root root 10 May 27 23:31 98a81274-10f7-40db-872a-03df048df366 -> ../../sda2
lrwxrwxrwx 1 root root 10 May 27 23:31 d0d0d110-0a71-4ed6-936a-304969ea36af -> ../../sda1

Udev によるデバイス名の固定

Udev#固定デバイス名の設定 を見て下さい。

永続的な命名の使用

様々なアプリケーションで、永続的な命名を使うように設定を行うことができます。以下はアプリケーションの設定例です。

fstab

次の記事を参照してください: fstab#UUID

ブートマネージャ

ブートマネージャで永続的な名前を使う場合、以下の条件を満たす必要があります:

  • mkinitcpio の初期 RAM ディスクイメージの使用
  • /etc/mkinitcpio.conf で udev が有効になっていること

上の例では、/dev/sda1 がルートパーティションです。GRUBgrub.cfg ファイルでは、linux 行は以下のようになります:

linux /boot/vmlinuz-linux root=/dev/sda1 rw quiet

別の命名方法を使用することで、以下のように変更することができます:

linux /boot/vmlinuz-linux root=/dev/disk/by-label/root_myhost rw quiet

または:

linux /boot/vmlinuz-linux root=UUID=2d781b26-0285-421a-b9d0-d4a0d3b55680 rw quiet

LILO を使用する場合、root=... で上記のように設定してはいけません。機能しなくなります。代わりに append="root=..."addappend="root=..." を使ってください。詳しくは LILO の man ページに書かれている appendaddappend の情報を読んでください。

ファイルシステムに埋め込まれているラベルを使うという方法もあります。例えば (上記のように) /dev/sda1 のファイルシステムのラベルが root_myhost なら、GRUB に以下のように指定できます:

linux /boot/vmlinuz-linux root=LABEL=root_myhost rw quiet