「永続的なブロックデバイスの命名」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎Udev によるデバイス名の固定: セクション名を変更)
(→‎by-uuid: 同期)
100行目: 100行目:
 
}}
 
}}
   
===by-uuid===
+
=== by-uuid ===
   
[[wikipedia:ja:UUID|UUID]] を使うことで一意に特定可能な識別子をファイルシステムに与えることがきます。UUID 識別子は、パーティションをフォーマットするときにファイルシステムユーティリティ (例: {{ic|mkfs.*}}) によって生成されます。UUID は名前の衝突が起こらないように作られています。(スワップや暗号化デバイスの LUKS ヘッダなども含む) 全ての GNU/Linux ファイルシステムが UUID をサポートします。FATNTFS ファイルシステム (上記の ''fat'' と ''windows'' ラベル) は UUID をサポートしていませんが、短い UID (unique identifier) で {{ic|/dev/disk/by-uuid}} には掲載されます:
+
[[wikipedia:ja:UUID|UUID]] は、各[[ファイルシステム]]ユニークな識別子を与えるための仕組みです。UUID 識別子は、パーティションをフォーマットするときにファイルシステムユーティリティ (例: {{ic|mkfs.*}}) によって生成されます。UUID 識別子は衝突が起こりにくいように作られています。(スワップや生の暗号化デバイスの LUKS ヘッダ含む) 全ての GNU/Linux ファイルシステムが UUID をサポートします。FAT、exFAT、NTFS ファイルシステムは UUID をサポートしていませんが、それでも、より短い UID (unique identifier) で {{ic|/dev/disk/by-uuid/}} れます:
   
 
{{hc|$ ls -l /dev/disk/by-uuid/|
 
{{hc|$ ls -l /dev/disk/by-uuid/|
110行目: 110行目:
 
lrwxrwxrwx 1 root root 10 May 27 23:31 CBB6-24F2 -> ../../sda1
 
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
 
lrwxrwxrwx 1 root root 10 May 27 23:31 f9fe0b69-a280-415d-a03a-a32752370dee -> ../../sda4
  +
lrwxrwxrwx 1 root root 10 May 27 23:31 F4CA-5D75 -> ../../mmcblk0p1
 
}}
 
}}
  +
  +
デバイスの UUID は ''lsblk'' を使って得ることができます:
  +
  +
{{hc|$ lsblk -dno UUID /dev/sda1|
  +
CBB6-24F2
  +
}}
  +
  +
あるいは ''blkid'' を使って:
  +
  +
{{hc|# blkid -s UUID -o value /dev/sda1|
  +
CBB6-24F2
  +
}}
   
 
UUID を使用する利点として、名前の衝突が発生する可能性がラベルよりもずっと少ないことが挙げられます。さらに、UUID はファイルシステムの作成時に自動的に生成されます。他のシステムにデバイスを接続したときでも、一意性を保つことができます。ラベルの場合、他のシステムに接続したとき名前がカブってしまう可能性が否定できません。
 
UUID を使用する利点として、名前の衝突が発生する可能性がラベルよりもずっと少ないことが挙げられます。さらに、UUID はファイルシステムの作成時に自動的に生成されます。他のシステムにデバイスを接続したときでも、一意性を保つことができます。ラベルの場合、他のシステムに接続したとき名前がカブってしまう可能性が否定できません。
   
逆に UUID の欠点としては、生成されるコードが長いために、設定ファイル (例: fstab や crypttab) が読みづらくなったり整形が崩れてしまうことがあります。また、パーティションのサイズを変更したり、再フォーマットをするたびに新しい UUID が生成されるので、設定を手動で変更する必要が生じます。
+
逆に UUID の欠点としては、生成されるコードが長いために、設定ファイル (例: [[fstab]][[crypttab]]) が読みづらくなったり整形が崩れてしまうことがあります。また、パーティションのサイズを変更したり、再フォーマットをするたびに新しい UUID が生成されるので、設定を手動で変更する必要が生じます。
   
 
{{Tip|スワップパーティションに UUID が割り当てられていない場合、[[スワップ#スワップパーティション|mkswap]] ユーティリティを使ってスワップパーティションをリセットする必要があります。}}
 
{{Tip|スワップパーティションに UUID が割り当てられていない場合、[[スワップ#スワップパーティション|mkswap]] ユーティリティを使ってスワップパーティションをリセットする必要があります。}}

2023年4月7日 (金) 16:41時点における版

関連記事

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

ノート:
  • 永続的な命名には制約が存在しますが、それはこの記事では扱っていません。例えば、mkinitcpio が命名方法をサポートしていても、systemd が起動時に処理できる命名法には制約が存在することがあります (例: FS#42884)。
  • この記事では LVM の論理ボリュームに言及しません。/dev/VolumeGroupName/LogicalVolumeName デバイスパスは永続的であるためです。

永続的な命名の方法

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

/dev/disk/ 内のディレクトリは、デバイスがあるかどうかに応じて動的に作成・破棄されます。

ノート: ディスクのクローンは同じ名前の異なるディスクを作成することに注意してください。

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

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

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

GPT を使っている場合、代わりに blkid コマンドを使います。blkid コマンドはスクリプトでは使いやすいですが、人間にとっては読みづらいです。

# blkid
/dev/sda1: UUID="CBB6-24F2" TYPE="vfat" PARTLABEL="EFI system partition" PARTUUID="d0d0d110-0a71-4ed6-936a-304969ea36af" 
/dev/sda2: LABEL="Arch Linux" 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"
/dev/mmcblk0: PTUUID="0003e1e5" PTTYPE="dos"
/dev/mmcblk0p1: UUID="F4CA-5D75" TYPE="vfat" PARTUUID="0003e1e5-01"

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 Arch\x20Linux -> ../../sda2

ほとんどのファイルシステムは、ファイルシステム作成時におけるラベルの設定をサポートしています (関連する mkfs.* ユーティリティの man ページを参照してください)。一部のファイルシステムにおいてはラベルを変更することもできます。以下は、一般的なファイルシステムにおけるラベルの変更方法です:

swap 
swaplabel -L "new label" /dev/XXX (util-linux を使用)
ext2/3/4 
e2label /dev/XXX "new label" (e2fsprogs を使用)
btrfs 
btrfs filesystem label /dev/XXX "new label" (btrfs-progs を使用)
reiserfs 
reiserfstune -l "new label" /dev/XXX (reiserfsprogs を使用)
jfs 
jfs_tune -L "new label" /dev/XXX (jfsutils を使用)
xfs 
xfs_admin -L "new label" /dev/XXX (xfsprogs を使用)
fat/vfat 
fatlabel /dev/XXX "new label" (dosfstools を使用)
mlabel -i /dev/XXX ::"new label" (mtools を使用)
exfat 
tune.exfat -L "new label" /dev/XXX (exfatprogs を使用)
exfatlabel /dev/XXX "new label" (exfatprogs または exfat-utils を使用)
ntfs 
ntfslabel /dev/XXX "new label" (ntfs-3g を使用)
udf 
udflabel /dev/XXX "new label" (udftools を使用)
crypto_LUKS (LUKS2 のみ) 
cryptsetup config --label="new label" /dev/XXX (cryptsetup を使用)

デバイスのラベルは lsblk を使って得ることができます:

$ lsblk -dno LABEL /dev/sda2
Arch Linux

あるいは blkid を使って:

# blkid -s LABEL -o value /dev/sda2
Arch Linux
ノート:
  • ラベルを変更する際は、対象のファイルシステムがマウントされていてはいけません。ルートファイルシステムを変更する場合は、他のボリュームから起動することで変更することができます。
  • 衝突を避けるために、ラベルは曖昧であってはいけません。
  • ラベルに設定できるのは16文字までです。
  • ラベルはファイルシステムのプロパティであるため、単一の RAID デバイスをアドレス指定するのには適していません。
  • dm-crypt で暗号化済みコンテナを使用する場合、コンテナがロック/暗号化されている間はコンテナ内のファイルシステムのラベルは利用できなくなります。

by-uuid

UUID は、各ファイルシステムにユニークな識別子を与えるための仕組みです。UUID 識別子は、パーティションをフォーマットするときにファイルシステムユーティリティ (例: mkfs.*) によって生成されます。UUID 識別子は衝突が起こりにくいように作られています。(スワップや生の暗号化デバイスの LUKS ヘッダを含む) 全ての GNU/Linux ファイルシステムが UUID をサポートします。FAT、exFAT、NTFS ファイルシステムは 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
lrwxrwxrwx 1 root root 10 May 27 23:31 F4CA-5D75 -> ../../mmcblk0p1

デバイスの UUID は lsblk を使って得ることができます:

$ lsblk -dno UUID /dev/sda1
CBB6-24F2

あるいは blkid を使って:

# blkid -s UUID -o value /dev/sda1
CBB6-24F2

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

逆に UUID の欠点としては、生成されるコードが長いために、設定ファイル (例: fstabcrypttab) が読みづらくなったり整形が崩れてしまうことがあります。また、パーティションのサイズを変更したり、再フォーマットをするたびに新しい 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]

NVMe

永続的な NVMe デバイスの ID には、wwn- ではなく nvme- [4] プレフィックスが付きます。ここで使用される World Wide Name は、ほとんどの ATA または SCSI デバイスと比較して、Extended Unique Identifier (EUI) のより新しい形式です。

$ ls -l /dev/disk/by-id/
total 0
lrwxrwxrwx 1 root root 13 Feb 12 16:28 nvme-eui.002538570142d716 -> ../../nvme1n1
lrwxrwxrwx 1 root root 15 Feb 12 16:28 nvme-eui.002538570142d716-part1 -> ../../nvme1n1p1
lrwxrwxrwx 1 root root 15 Feb 12 16:28 nvme-eui.002538570142d716-part2 -> ../../nvme1n1p2
lrwxrwxrwx 1 root root 13 Feb 12 16:28 nvme-eui.e8238fa6bf530001001b448b4566aa1a -> ../../nvme0n1
lrwxrwxrwx 1 root root 15 Feb 12 16:28 nvme-eui.e8238fa6bf530001001b448b4566aa1a-part1 -> ../../nvme0n1p1
lrwxrwxrwx 1 root root 15 Feb 12 16:28 nvme-eui.e8238fa6bf530001001b448b4566aa1a-part2 -> ../../nvme0n1p2
lrwxrwxrwx 1 root root 13 Feb 12 16:28 nvme-Samsung_SSD_970_EVO_Plus_2TB_S4J4NJ0N704064T -> ../../nvme1n1
lrwxrwxrwx 1 root root 15 Feb 12 16:28 nvme-Samsung_SSD_970_EVO_Plus_2TB_S4J4NJ0N704064T-part1 -> ../../nvme1n1p1
lrwxrwxrwx 1 root root 15 Feb 12 16:28 nvme-Samsung_SSD_970_EVO_Plus_2TB_S4J4NJ0N704064T-part2 -> ../../nvme1n1p2
lrwxrwxrwx 1 root root 13 Feb 12 16:28 nvme-WDS100T1X0E-00AFY0_21455A801268 -> ../../nvme0n1
lrwxrwxrwx 1 root root 15 Feb 12 16:28 nvme-WDS100T1X0E-00AFY0_21455A801268-part1 -> ../../nvme0n1p1
lrwxrwxrwx 1 root root 15 Feb 12 16:28 nvme-WDS100T1X0E-00AFY0_21455A801268-part2 -> ../../nvme0n1p2
$ ls -l /dev/disk/by-path/
total 0
lrwxrwxrwx 1 root root 13 Feb 12 16:28 pci-0000:01:00.0-nvme-1 -> ../../nvme0n1
lrwxrwxrwx 1 root root 15 Feb 12 16:28 pci-0000:01:00.0-nvme-1-part1 -> ../../nvme0n1p1
lrwxrwxrwx 1 root root 15 Feb 12 16:28 pci-0000:01:00.0-nvme-1-part2 -> ../../nvme0n1p2
lrwxrwxrwx 1 root root 13 Feb 12 16:28 pci-0000:04:00.0-nvme-1 -> ../../nvme1n1
lrwxrwxrwx 1 root root 15 Feb 12 16:28 pci-0000:04:00.0-nvme-1-part1 -> ../../nvme1n1p1
lrwxrwxrwx 1 root root 15 Feb 12 16:28 pci-0000:04:00.0-nvme-1-part2 -> ../../nvme1n1p2

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

カーネルパラメータ

永続的な命名をカーネルパラメータに使用するには、以下の前提条件を満たさなければなりません。インストールガイドに従った標準的なインストールでは、以下の両方の前提条件を満たしています:

  • udev が含まれている initramfs イメージを使用していること
  • mkinitcpio では、udevsystemd フックのどちらか一方を /etc/mkinitcpio.conf で有効化していること

root ファイルシステムの場所はカーネルコマンドラインの root パラメータを使って渡します。カーネルコマンドラインはブートローダーから設定します。カーネルパラメータ#設定 を参照してください。永続的な命名に変更するには、ブロックデバイスを指定するパラメータ(例: rootresume)のみを変更して、他のパラメータはそのままにしてください。様々な命名規則がサポートされています:

ラベルLABEL= 形式を用いたデバイスの永続的な命名。以下の例では、Arch Linux が root ファイルシステムの LABEL になっています:

root="LABEL=Arch Linux"

UUIDUUID= 形式を用いたデバイスの永続的な命名。以下の例では、0a3407de-014b-458b-b5c1-848e92a327a3 が root ファイルシステムの UUID になっています:

root=UUID=0a3407de-014b-458b-b5c1-848e92a327a3

ディスクの id/dev パス形式を用いたデバイスの永続的な命名。以下の例では、wwn-0x60015ee0000b237f-part2 が root パーティションの id になっています。

root=/dev/disk/by-id/wwn-0x60015ee0000b237f-part2

GPT パーティション UUIDPARTUUID= 形式を用いたデバイスの永続的な命名。以下の例では、98a81274-10f7-40db-872a-03df048df366 が root パーティションの PARTUUID になっています。

root=PARTUUID=98a81274-10f7-40db-872a-03df048df366

GPT パーティションラベルPARTLABEL= 形式を用いたデバイスの永続的な命名。以下の例では、GNU/Linux が root パーティションの PARTLABEL になっています。

root="PARTLABEL=GNU/Linux"