udevを使用したディスクの固定化

VMware におけるSCSIコントローラの認識順序」において、SCSI接続のディスクについてはudevを使用してもsdaやsdbに特定のディスクを強制的に結びつけることができない、としていたが実はできてしまった。ただし、運用上混乱を招く可能性があるためお勧めできるものではない。やはり、sdaやsdbは変化しうるものとして開き直り、別名をシンボリックリンクで定義するのがベストな運用であるように思う。それか前記事の通り、認識順をがっちり固めるか。

試行錯誤の過程でudevへの理解が深まったと思うので記録しておく。特に、udevへの理解が「デバイス名を変更できる機構」というかなり適当(というかそう説明したら間違いだ)なものであったが、以下のイメージが得られたことが収穫だと思う。

  • /dev はOS(カーネル)の認識しているものを元に udev によって作られた「窓口」である。そのため名前はどうにでもできる部分である。
  • udev が /dev をどう形作ろうとカーネル上の認識は変わらない。
  • udev を最も身近に感じさせるネットワークアダプタのリネーム機能は実は udev の機能のなかでは異質である。

検証に使用する仮想マシンの構成

udev の効果を検証するため、ディスクについては udev 設定後にディスク2を(0:3)に接続することで認識順を変更する想定である。ネットワークアダプタについては、vmxファイルのpciSlotNumberを入れ替えてネットワークアダプタの認識順を変更する。


構成確認用のコマンドの実行結果を抜粋する。

# ls -l /dev/sd*
brw-rw----. 1 root disk 8,  0 Jan 19 10:42 /dev/sda
brw-rw----. 1 root disk 8,  1 Jan 19 10:42 /dev/sda1
brw-rw----. 1 root disk 8,  2 Jan 19 10:42 /dev/sda2
brw-rw----. 1 root disk 8, 16 Jan 19 10:42 /dev/sdb
brw-rw----. 1 root disk 8, 17 Jan 19 10:42 /dev/sdb1
brw-rw----. 1 root disk 8, 18 Jan 19 10:42 /dev/sdb2
brw-rw----. 1 root disk 8, 32 Jan 19 10:42 /dev/sdc
brw-rw----. 1 root disk 8, 33 Jan 19 10:42 /dev/sdc1
brw-rw----. 1 root disk 8, 34 Jan 19 10:42 /dev/sdc2
brw-rw----. 1 root disk 8, 35 Jan 19 10:42 /dev/sdc3

# fdisk -l
Disk /dev/sda: 42.9 GB, 42949672960 bytes
64 heads, 32 sectors/track, 40960 cylinders
Disk identifier: 0x00034b9d

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           2         501      512000   83  Linux
/dev/sda2             502       40960    41430016   8e  Linux LVM

Disk /dev/sdb: 1073 MB, 1073741824 bytes
34 heads, 61 sectors/track, 1011 cylinders
Disk identifier: 0xe64d8f76

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         100      103669+  83  Linux
/dev/sdb2             101         200      103700   83  Linux

Disk /dev/sdc: 2147 MB, 2147483648 bytes
67 heads, 62 sectors/track, 1009 cylinders
Disk identifier: 0xe607e738

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1          50      103819   83  Linux
/dev/sdc2              51         100      103850   83  Linux
/dev/sdc3             101         150      103850   83  Linux

# ifconfig -a | grep HW
eth0      Link encap:Ethernet  HWaddr 00:0C:29:D2:B6:83
eth1      Link encap:Ethernet  HWaddr 00:0C:29:D2:B6:8D

# ls -l /sys/class/block | grep sd
lrwxrwxrwx. 1 root root 0 Jan 19 10:41 sda -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/block/sda
lrwxrwxrwx. 1 root root 0 Jan 19 10:41 sda1 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/block/sda/sda1
lrwxrwxrwx. 1 root root 0 Jan 19 10:41 sda2 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/block/sda/sda2
lrwxrwxrwx. 1 root root 0 Jan 19 10:41 sdb -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:1/2:0:1:0/block/sdb
lrwxrwxrwx. 1 root root 0 Jan 19 10:41 sdb1 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:1/2:0:1:0/block/sdb/sdb1
lrwxrwxrwx. 1 root root 0 Jan 19 10:41 sdb2 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:1/2:0:1:0/block/sdb/sdb2
lrwxrwxrwx. 1 root root 0 Jan 19 10:41 sdc -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdc
lrwxrwxrwx. 1 root root 0 Jan 19 10:41 sdc1 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdc/sdc1
lrwxrwxrwx. 1 root root 0 Jan 19 10:41 sdc2 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdc/sdc2
lrwxrwxrwx. 1 root root 0 Jan 19 10:41 sdc3 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdc/sdc3

# ls -l /sys/class/net
lrwxrwxrwx. 1 root root 0 Jan 19 10:42 eth0 -> ../../devices/pci0000:00/0000:00:16.0/0000:0b:00.0/net/eth0
lrwxrwxrwx. 1 root root 0 Jan 19 10:42 eth1 -> ../../devices/pci0000:00/0000:00:17.0/0000:13:00.0/net/eth1
lrwxrwxrwx. 1 root root 0 Jan 19 10:41 lo -> ../../devices/virtual/net/lo

# cat /proc/partitions 
major minor  #blocks  name
   8        0   41943040 sda
   8        1     512000 sda1
   8        2   41430016 sda2
   8       16    1048576 sdb
   8       17     103669 sdb1
   8       18     103700 sdb2
   8       32    2097152 sdc
   8       33     103819 sdc1
   8       34     103850 sdc2
   8       35     103850 sdc3

/dev 下のデバイスファイル、カーネル内の認識、対応するハードウェアのそれぞれの状態を示す。

  • カーネルは認識した順番にsda,sdb,sdcおよびeth0,eth1を認識しており、ハードウェアの認識順とストレートに対応する。
  • /dev 下のデバイスファイルである sda,sdb,sdc (およびパーティション用のsda1など) も udev のルールが特別に定義されていないため、カーネルの認識名でストレートに作成されている。
  • eth0とeth1は /dev 下にはデバイスファイルは作成されない。


ディスクを特定するための WWID

WWIDとは

特定のNICポートを特定するためにはMACアドレスを利用すればよい。ではディスクは?ディスクの場合は標準的な取得方法は決まっているが、何が取得できるかはそのディスクの実装に依存する、という理解に落ち着いた。

標準的な取得方法とは「scsi_id」コマンドによる取得であり、実装レベルでは SCSI INQUIRY 命令によるページ「0x83」または「0x80」の読み取りである。そこで各ディスクの実装者が返したいものを返す。ただしその目的からすればそれはユニークなものになっているべきである。それを「WWID(World Wide Identifier)」と総称している。つまり、ディスクを扱ううえではWWID=「scsi_id」の結果と考えればよい。

このWWIDであるが、ディスクの実装により以下のようにバラバラなものを返している。iSCSIの場合はターゲットを定義する側で自由に決められるため、最も安心で明確である。VMwareのVMDKの場合も設定ファイルに明示されるため安心である。ストレージ装置の場合や物理ディスクの場合にはベンダーごとにルールが違う可能性がある。そのため、scsi_idコマンドで何が得られているのか、それはユニークと言えるものなのか、構成変更があっても永続性があるのか、といったことは都度確認するべきだ。

  • 物理ディスク(HDD): ディスク装置のシリアル番号
  • FC接続のストレージ装置のLUN: 128ビットのWWN (LUごとに払い出されている)
  • iSCSIのLUN: targets.conf の backing-store の scsi_id 属性で定義した値
  • VMwareの仮想ディスク(VMDK): 仮想ディスクのvmdkファイルの「ddb.uuid」として定義された値(128ビットのWWNになっている)

VMwareの仮想ディスク(VMDK)のWWIDをOSに認識させる

vmdkファイル内の値を確認

VMDKを作成すると、vmdkファイル(.vmdk)が作成される。

このファイルの中身を表示すると以下のとおりである。

# Disk DescriptorFile
version=1
encoding="UTF-8"
CID=ab5eddd3
parentCID=ffffffff
isNativeSnapshot="no"
createType="vmfs"

# Extent description
RW 83886080 VMFS "vm04.garnet-flat.vmdk"

# The Disk Data Base 
#DDB

ddb.virtualHWVersion = "8"
ddb.longContentID = "fd833e0a6a481e2ece459f15ab5eddd3"
ddb.uuid = "60 00 C2 9d 74 9c ce f7-47 f3 31 72 3f b8 9e a5"
ddb.geometry.cylinders = "5221"
ddb.geometry.heads = "255"
ddb.geometry.sectors = "63"
ddb.adapterType = "lsilogic"

ddb.uuid = "60 00 C2 9d 74 9c ce f7-47 f3 31 72 3f b8 9e a5"」部分がWWIDとして使用できる属性である。これは「Fibre Channel World Wide Names」にて示されている先頭4ビットが0110(6)の128ビット長のWWNである。これによれば、先頭4ビットは常に6であり、次の24ビットがベンダーを表すOUIである。上記のddb.uuidではOUIは000C29であり、これはまさに「VMwareのOUI」である。

先頭4ビットが0110の128ビット長のWWNでは残りの100ビットはベンダー次第で決めるものになっているため、(ここは単に想像だが)VMwareがVMDKを作成する時にこの100ビットをランダムに生成してユニーク性を確保していると考える。

NAAField2Field3Field4
4 bits24 bits36 bits64 bits
0110固定OUIvendor sequence or serial numbervendor specific extension
vmxファイルの disk.EnableUUID パラメータの有効化

vmdkファイル内のddb.uuidでWWIDとして使用できる値は生成されているが、そのままでは仮想マシンにそれを見せることができない。つまり、scsi_id が参照するページ「0x83」や「0x80」に何も定義されない状態になっている。

これを見せるか見せないかを制御するパラメータがvmxファイルの「disk.EnableUUID」であり、デフォルトでは false になっている。

デフォルトの false の状態で、OSのscsi_idコマンドの結果、および、scsi_idの結果得られるIDに基づきudevがデフォルトで生成する by-id のデバイスファイルの状態を確認する。scsi_id コマンドでは何も表示されないし、by-id では sda や sdb に対するものは作成されていない。

# scsi_id --whitelisted --replace-whitespace /dev/sda

# scsi_id --whitelisted --replace-whitespace --page=0x83 /dev/sda

# scsi_id --whitelisted --replace-whitespace --page=0x80 /dev/sda

# ls -l /dev/disk/by-id
total 0
lrwxrwxrwx 1 root root 10 Jan 26 07:10 dm-name-vg_hostname-lv_root -> ../../dm-0
lrwxrwxrwx 1 root root 10 Jan 26 07:10 dm-name-vg_hostname-lv_swap -> ../../dm-1
lrwxrwxrwx 1 root root 10 Jan 26 07:10 dm-uuid-LVM-a9TffNHp9lmmy0FDm7S0lb9T5e4poZruhYGCJ4EF3QBqWgv3AItSn0TqDHYOxGwU -> ../../dm-3
lrwxrwxrwx 1 root root 10 Jan 26 07:10 dm-uuid-LVM-jc3er1PPOn0cgOkZOsqlZ3vyAt1imqWB7g6eDXG2KMDw2l6TUlJTxCHjLBh7zT8m -> ../../dm-0
lrwxrwxrwx 1 root root 10 Jan 26 07:10 dm-uuid-LVM-jc3er1PPOn0cgOkZOsqlZ3vyAt1imqWBWZymGcujhaeM9W4LD4Z16F1nHk1xe5aQ -> ../../dm-1
lrwxrwxrwx 1 root root 10 Jan 26 07:10 dm-uuid-LVM-qpuhuOcPMaicwoqvcFpecHfJIDF8vSSbYae3yya5Kxx5SLlr4gkD8VlQcjaSByR9 -> ../../dm-2

disk.EnableUUID を true に変更する。

true の状態で、再度同じ確認を行う。scsi_id の結果として「36000c29d749ccef747f331723fb89ea5」が表示された。先頭の 3 を無視するとddb.uuidの値そのものである。また、scsi_id により値が得られるようになったため、by-id で sda, sdb, sdc およびそれぞれのパーティションに対するデバイス名が作成されている(いずれも scsi_id を経由して得られる ddb.uuid の値に基づく名前である)。

# scsi_id --whitelisted --replace-whitespace /dev/sda
36000c29d749ccef747f331723fb89ea5

# scsi_id --whitelisted --replace-whitespace --page=0x83 /dev/sda
36000c29d749ccef747f331723fb89ea5

# scsi_id --whitelisted --replace-whitespace --page=0x80 /dev/sda
SVMware_Virtual_disk_6000c29d749ccef747f331723fb89ea5

# ls -l /dev/disk/by-id
total 0
lrwxrwxrwx 1 root root 10 Jan 26 07:30 dm-name-vg_hostname-lv_root -> ../../dm-0
lrwxrwxrwx 1 root root 10 Jan 26 07:30 dm-name-vg_hostname-lv_swap -> ../../dm-1
lrwxrwxrwx 1 root root 10 Jan 26 07:30 dm-uuid-LVM-a9TffNHp9lmmy0FDm7S0lb9T5e4poZruhYGCJ4EF3QBqWgv3AItSn0TqDHYOxGwU -> ../../dm-3
lrwxrwxrwx 1 root root 10 Jan 26 07:30 dm-uuid-LVM-jc3er1PPOn0cgOkZOsqlZ3vyAt1imqWB7g6eDXG2KMDw2l6TUlJTxCHjLBh7zT8m -> ../../dm-0
lrwxrwxrwx 1 root root 10 Jan 26 07:30 dm-uuid-LVM-jc3er1PPOn0cgOkZOsqlZ3vyAt1imqWBWZymGcujhaeM9W4LD4Z16F1nHk1xe5aQ -> ../../dm-1
lrwxrwxrwx 1 root root 10 Jan 26 07:30 dm-uuid-LVM-qpuhuOcPMaicwoqvcFpecHfJIDF8vSSbYae3yya5Kxx5SLlr4gkD8VlQcjaSByR9 -> ../../dm-2
lrwxrwxrwx 1 root root  9 Jan 26 07:30 scsi-36000c292de4fce03a7cee1cb456200ae -> ../../sdc
lrwxrwxrwx 1 root root 10 Jan 26 07:30 scsi-36000c292de4fce03a7cee1cb456200ae-part1 -> ../../sdc1
lrwxrwxrwx 1 root root 10 Jan 26 07:30 scsi-36000c292de4fce03a7cee1cb456200ae-part2 -> ../../sdc2
lrwxrwxrwx 1 root root 10 Jan 26 07:30 scsi-36000c292de4fce03a7cee1cb456200ae-part3 -> ../../sdc3
lrwxrwxrwx 1 root root  9 Jan 26 07:30 scsi-36000c29aefc196086ce932ef4722a0af -> ../../sdb
lrwxrwxrwx 1 root root 10 Jan 26 07:30 scsi-36000c29aefc196086ce932ef4722a0af-part1 -> ../../sdb1
lrwxrwxrwx 1 root root 10 Jan 26 07:30 scsi-36000c29aefc196086ce932ef4722a0af-part2 -> ../../sdb2
lrwxrwxrwx 1 root root  9 Jan 26 07:30 scsi-36000c29d749ccef747f331723fb89ea5 -> ../../sda
lrwxrwxrwx 1 root root 10 Jan 26 07:30 scsi-36000c29d749ccef747f331723fb89ea5-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jan 26 07:30 scsi-36000c29d749ccef747f331723fb89ea5-part2 -> ../../sda2
lrwxrwxrwx 1 root root  9 Jan 26 07:30 wwn-0x6000c292de4fce03a7cee1cb456200ae -> ../../sdc
lrwxrwxrwx 1 root root 10 Jan 26 07:30 wwn-0x6000c292de4fce03a7cee1cb456200ae-part1 -> ../../sdc1
lrwxrwxrwx 1 root root 10 Jan 26 07:30 wwn-0x6000c292de4fce03a7cee1cb456200ae-part2 -> ../../sdc2
lrwxrwxrwx 1 root root 10 Jan 26 07:30 wwn-0x6000c292de4fce03a7cee1cb456200ae-part3 -> ../../sdc3
lrwxrwxrwx 1 root root  9 Jan 26 07:30 wwn-0x6000c29aefc196086ce932ef4722a0af -> ../../sdb
lrwxrwxrwx 1 root root 10 Jan 26 07:30 wwn-0x6000c29aefc196086ce932ef4722a0af-part1 -> ../../sdb1
lrwxrwxrwx 1 root root 10 Jan 26 07:30 wwn-0x6000c29aefc196086ce932ef4722a0af-part2 -> ../../sdb2
lrwxrwxrwx 1 root root  9 Jan 26 07:30 wwn-0x6000c29d749ccef747f331723fb89ea5 -> ../../sda
lrwxrwxrwx 1 root root 10 Jan 26 07:30 wwn-0x6000c29d749ccef747f331723fb89ea5-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jan 26 07:30 wwn-0x6000c29d749ccef747f331723fb89ea5-part2 -> ../../sda2

udevのルール作成

scsi_id の結果は ENV{ID_SERIAL} に格納されるため、70-persistent-disk.rules を以下のとおりに作成する。
これまで確認して来た sda に加えて、sdb, sdc についても scsi_id を確認して udev のルールに定義する。

# cat /etc/udev/rules.d/70-persistent-disk.rules
KERNEL=="sd*", BUS=="scsi", ENV{ID_SERIAL}=="36000c29d749ccef747f331723fb89ea5", NAME="sda%n" # system disk to /dev/sda
KERNEL=="sd*", BUS=="scsi", ENV{ID_SERIAL}=="36000c29aefc196086ce932ef4722a0af", NAME="sdb%n" # disk of 1GB to /dev/sdb
KERNEL=="sd*", BUS=="scsi", ENV{ID_SERIAL}=="36000c292de4fce03a7cee1cb456200ae", NAME="sdc%n" # disk of 2GB to /dev/sdc

再起動後に、udev 設定前と同じ確認を行う。特に変化は無い(認識順が変化しないため、素直な対応で作成したudevのルールの効果は見えない)。

# ls -l /dev/sd*
brw-rw---- 1 root disk 8,  0 Jan 26 08:24 /dev/sda
brw-rw---- 1 root disk 8,  1 Jan 26 08:24 /dev/sda1
brw-rw---- 1 root disk 8,  2 Jan 26 08:24 /dev/sda2
brw-rw---- 1 root disk 8, 16 Jan 26 08:24 /dev/sdb
brw-rw---- 1 root disk 8, 17 Jan 26 08:24 /dev/sdb1
brw-rw---- 1 root disk 8, 18 Jan 26 08:24 /dev/sdb2
brw-rw---- 1 root disk 8, 32 Jan 26 08:24 /dev/sdc
brw-rw---- 1 root disk 8, 33 Jan 26 08:24 /dev/sdc1
brw-rw---- 1 root disk 8, 34 Jan 26 08:24 /dev/sdc2
brw-rw---- 1 root disk 8, 35 Jan 26 08:24 /dev/sdc3

# fdisk -l
Disk /dev/sda: 42.9 GB, 42949672960 bytes
64 heads, 32 sectors/track, 40960 cylinders
Disk identifier: 0x00034b9d

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           2         501      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2             502       40960    41430016   8e  Linux LVM
Partition 2 does not end on cylinder boundary.

Disk /dev/sdb: 1073 MB, 1073741824 bytes
34 heads, 61 sectors/track, 1011 cylinders
Disk identifier: 0xe64d8f76

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         100      103669+  83  Linux
/dev/sdb2             101         200      103700   83  Linux

Disk /dev/sdc: 2147 MB, 2147483648 bytes
67 heads, 62 sectors/track, 1009 cylinders
Disk identifier: 0xe607e738

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1          50      103819   83  Linux
/dev/sdc2              51         100      103850   83  Linux
/dev/sdc3             101         150      103850   83  Linux

# ifconfig -a | grep HW
eth0      Link encap:Ethernet  HWaddr 00:0C:29:D2:B6:83  
eth1      Link encap:Ethernet  HWaddr 00:0C:29:D2:B6:8D  

# ls -l /sys/class/block | grep sd
lrwxrwxrwx 1 root root 0 Jan 26 08:24 sda -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/block/sda
lrwxrwxrwx 1 root root 0 Jan 26 08:24 sda1 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/block/sda/sda1
lrwxrwxrwx 1 root root 0 Jan 26 08:24 sda2 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/block/sda/sda2
lrwxrwxrwx 1 root root 0 Jan 26 08:24 sdb -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:1/2:0:1:0/block/sdb
lrwxrwxrwx 1 root root 0 Jan 26 08:24 sdb1 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:1/2:0:1:0/block/sdb/sdb1
lrwxrwxrwx 1 root root 0 Jan 26 08:24 sdb2 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:1/2:0:1:0/block/sdb/sdb2
lrwxrwxrwx 1 root root 0 Jan 26 08:24 sdc -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdc
lrwxrwxrwx 1 root root 0 Jan 26 08:24 sdc1 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdc/sdc1
lrwxrwxrwx 1 root root 0 Jan 26 08:24 sdc2 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdc/sdc2
lrwxrwxrwx 1 root root 0 Jan 26 08:24 sdc3 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdc/sdc3

# ls -l /sys/class/net | grep eth
lrwxrwxrwx 1 root root 0 Jan 26 08:24 eth0 -> ../../devices/pci0000:00/0000:00:16.0/0000:0b:00.0/net/eth0
lrwxrwxrwx 1 root root 0 Jan 26 08:24 eth1 -> ../../devices/pci0000:00/0000:00:17.0/0000:13:00.0/net/eth1

# ls -l /sys/class/net
lrwxrwxrwx 1 root root 0 Jan 26 08:24 eth0 -> ../../devices/pci0000:00/0000:00:16.0/0000:0b:00.0/net/eth0
lrwxrwxrwx 1 root root 0 Jan 26 08:24 eth1 -> ../../devices/pci0000:00/0000:00:17.0/0000:13:00.0/net/eth1
lrwxrwxrwx 1 root root 0 Jan 26 08:24 lo -> ../../devices/virtual/net/lo

# cat /proc/partitions 
major minor  #blocks  name

   8        0   41943040 sda
   8        1     512000 sda1
   8        2   41430016 sda2
   8       16    1048576 sdb
   8       17     103669 sdb1
   8       18     103700 sdb2
   8       32    2097152 sdc
   8       33     103819 sdc1
   8       34     103850 sdc2
   8       35     103850 sdc3

ディスク認識順の入れ替え検証

  • SCSIコントローラ0
    • ディスク1:(0:0) に接続する。変更無し。
    • ディスク2:(0:1) から(0:3) に接続位置を変更する。
    • ディスク3:(0:2) に接続する。変更無し。

ディスクの接続位置を変更し、ディスク1, ディスク3, ディスク2 の順番で認識させるようにして起動する。これまでと同じ確認を行った結果は以下のとおり。

# ls -l /dev/sd*
brw-rw---- 1 root disk 8,  0 Jan 26 08:41 /dev/sda
brw-rw---- 1 root disk 8,  1 Jan 26 08:41 /dev/sda1
brw-rw---- 1 root disk 8,  2 Jan 26 08:41 /dev/sda2
brw-rw---- 1 root disk 8, 32 Jan 26 08:41 /dev/sdb
brw-rw---- 1 root disk 8, 33 Jan 26 08:41 /dev/sdb1
brw-rw---- 1 root disk 8, 34 Jan 26 08:41 /dev/sdb2
brw-rw---- 1 root disk 8, 16 Jan 26 08:41 /dev/sdc
brw-rw---- 1 root disk 8, 17 Jan 26 08:41 /dev/sdc1
brw-rw---- 1 root disk 8, 18 Jan 26 08:41 /dev/sdc2
brw-rw---- 1 root disk 8, 19 Jan 26 08:41 /dev/sdc3

# fdisk -l
Disk /dev/sda: 42.9 GB, 42949672960 bytes
64 heads, 32 sectors/track, 40960 cylinders
Disk identifier: 0x00034b9d

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           2         501      512000   83  Linux
/dev/sda2             502       40960    41430016   8e  Linux LVM

Disk /dev/sdb: 1073 MB, 1073741824 bytes
34 heads, 61 sectors/track, 1011 cylinders
Disk identifier: 0xe64d8f76

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         100      103669+  83  Linux
/dev/sdb2             101         200      103700   83  Linux

Disk /dev/sdc: 2147 MB, 2147483648 bytes
67 heads, 62 sectors/track, 1009 cylinders
Disk identifier: 0xe607e738

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1          50      103819   83  Linux
/dev/sdc2              51         100      103850   83  Linux
/dev/sdc3             101         150      103850   83  Linux

# ifconfig -a | grep HW
eth0      Link encap:Ethernet  HWaddr 00:0C:29:D2:B6:83
eth1      Link encap:Ethernet  HWaddr 00:0C:29:D2:B6:8D

# ls -l /sys/class/block | grep sd
lrwxrwxrwx 1 root root 0 Jan 26 08:41 sda -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/block/sda
lrwxrwxrwx 1 root root 0 Jan 26 08:41 sda1 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/block/sda/sda1
lrwxrwxrwx 1 root root 0 Jan 26 08:41 sda2 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/block/sda/sda2
lrwxrwxrwx 1 root root 0 Jan 26 08:41 sdb -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdb
lrwxrwxrwx 1 root root 0 Jan 26 08:41 sdb1 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdb/sdb1
lrwxrwxrwx 1 root root 0 Jan 26 08:41 sdb2 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdb/sdb2
lrwxrwxrwx 1 root root 0 Jan 26 08:41 sdb3 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdb/sdb3
lrwxrwxrwx 1 root root 0 Jan 26 08:41 sdc -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:3/2:0:3:0/block/sdc
lrwxrwxrwx 1 root root 0 Jan 26 08:41 sdc1 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:3/2:0:3:0/block/sdc/sdc1
lrwxrwxrwx 1 root root 0 Jan 26 08:41 sdc2 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:3/2:0:3:0/block/sdc/sdc2

# ls -l /sys/class/net 
lrwxrwxrwx 1 root root 0 Jan 26 08:41 eth0 -> ../../devices/pci0000:00/0000:00:16.0/0000:0b:00.0/net/eth0
lrwxrwxrwx 1 root root 0 Jan 26 08:41 eth1 -> ../../devices/pci0000:00/0000:00:17.0/0000:13:00.0/net/eth1
lrwxrwxrwx 1 root root 0 Jan 26 08:41 lo -> ../../devices/virtual/net/lo

# cat /proc/partitions 
major minor  #blocks  name

   8        0   41943040 sda
   8        1     512000 sda1
   8        2   41430016 sda2
   8       16    2097152 sdb
   8       17     103819 sdb1
   8       18     103850 sdb2
   8       19     103850 sdb3
   8       32    1048576 sdc
   8       33     103669 sdc1
   8       34     103700 sdc2

この結果から以下の事がわかる。

  • ls -l /dev/sd* の結果から、/dev 配下のデバイスファイルは sdb のパーティションが2個(sdb1,sdb2)、sdc のパーティションが3個(sdc1,sdc2,sdc3) となっており、認識順を変更する前と同じ状態となっている。fdisk -l の結果も同様である。udev が効果を発揮しているようである。
    • ls -l /dev/sd* の結果では、デバイスのメジャー番号とマイナー番号をよくみると、sdb のマイナー番号は 32、sdc のマイナー番号は 16 と逆転している。
  • ls -l /sys/class/block および cat /proc/partitions の結果では、sdb のパーティションが3個(sdb1, sdb2, sdb3)、sdc のパーティションが2個(sdc1, sdc2)となっている。/sys と /proc (つまりカーネルの認識) 上は sdb がパーティションが3個のディスクを指し、sdc がパーティションが2個のディスクを指しているということだ。
  • カーネルは常に最初に認識したディスクを「sda」とし、次が「sdb」、次が「sdc」としている。
    • udevでどうにかなるものではない。
    • カーネルにとって「sda」は必ず「1番目」、「sdb」は必ず「2番目」なのである。
  • カーネル内で「sdb」として認識されているディスクについて、/dev 下のデバイスファイルを作成するために udev に情報が連携されたタイミングで、udev が「このENV{ID_SERIAL}(=WWID=scsi_id)を持つディスクは sdc だ!」と名前を変更したため、カーネル内の「sdb」は /dev/sdc として作成される。
  • カーネル内で「sdc」として認識されているディスクについても同様。

これを図にすると以下のとおり。

udevの定義により、元々のディスクと /dev/sdb, /dev/sdc の対応は維持できているが、それはあくまで /dev の配下のみのこと。カーネルの認識は入れ替わっている。そのため、カーネルの認識を表す /proc や /sys では本当の認識状況が現れている。ここにどうしても気持ち悪さやわかりにくさを感じるのである。

おそらく何も知らない人がこの入れ替えに起因するトラブルに巻き込まれたら、「なんでそんな不整合状態みたいなことにしてるんだ!」と怒ることだろう。たしかに、カーネル視点の sdb と /dev/sdb が指すディスクが違う、といわれたら普通は混乱する。よって、この方法をとることはよくないこと、udevの濫用であると考える。

特定のディスクを指すシンボリックリンクをudevで作成する

カーネル内の sda, sdb, sdc は素直に /dev/sda, /dev/sdb, /dev/sdc に対応付け、それとは別に特定のディスクを指すシンボリックリンクを追加するアプローチを試してみる。

/dev 配下に作成するシンボリックリンクは /dev/disk1, /dev/disk2, /dev/disk3 とする。

udevのルール作成

1GBのディスクは常に /dev/disk2、2GBのディスクは常に /dev/disk3 のシンボリックリンクを作成する定義とする。

# cat /etc/udev/rules.d/70-persistent-disk.rules
KERNEL=="sd*", BUS=="scsi", ENV{ID_SERIAL}=="36000c29d749ccef747f331723fb89ea5", SYMLINK+="disk1%n" # system disk to /dev/disk1
KERNEL=="sd*", BUS=="scsi", ENV{ID_SERIAL}=="36000c29aefc196086ce932ef4722a0af", SYMLINK+="disk2%n" # disk of 1GB to /dev/disk2
KERNEL=="sd*", BUS=="scsi", ENV{ID_SERIAL}=="36000c292de4fce03a7cee1cb456200ae", SYMLINK+="disk3%n" # disk of 2GB to /dev/disk3
ディスクの接続を最初の状態に戻しての確認

ディスクの接続を最初の状態にもどしておく。

  • SCSIコントローラ0
    • ディスク1:(0:0) に接続する。
    • ディスク2:(0:1) に接続する。
    • ディスク3:(0:2) に接続する。

起動して確認をおこなった結果は以下のとおり。/dev/disk2 から /dev/sdb へ、/dev/disk3 から /dev/sdc へのシンボリックリンクが確認できる。また、カーネル内では disk1, disk2, disk3 といったものは一切出て来ない。あくまで udev が作成した /dev 配下のシンボリックリンクでありそれ以上ではない。

# ls -l /dev/sd* /dev/disk*
lrwxrwxrwx 1 root root     3 Jan 26 10:22 /dev/disk1 -> sda
lrwxrwxrwx 1 root root     4 Jan 26 10:22 /dev/disk11 -> sda1
lrwxrwxrwx 1 root root     4 Jan 26 10:22 /dev/disk12 -> sda2
lrwxrwxrwx 1 root root     3 Jan 26 10:22 /dev/disk2 -> sdb
lrwxrwxrwx 1 root root     4 Jan 26 10:22 /dev/disk21 -> sdb1
lrwxrwxrwx 1 root root     4 Jan 26 10:22 /dev/disk22 -> sdb2
lrwxrwxrwx 1 root root     3 Jan 26 10:22 /dev/disk3 -> sdc
lrwxrwxrwx 1 root root     4 Jan 26 10:22 /dev/disk31 -> sdc1
lrwxrwxrwx 1 root root     4 Jan 26 10:22 /dev/disk32 -> sdc2
lrwxrwxrwx 1 root root     4 Jan 26 10:22 /dev/disk33 -> sdc3
brw-rw---- 1 root disk 8,  0 Jan 26 10:22 /dev/sda
brw-rw---- 1 root disk 8,  1 Jan 26 10:22 /dev/sda1
brw-rw---- 1 root disk 8,  2 Jan 26 10:22 /dev/sda2
brw-rw---- 1 root disk 8, 16 Jan 26 10:22 /dev/sdb
brw-rw---- 1 root disk 8, 17 Jan 26 10:22 /dev/sdb1
brw-rw---- 1 root disk 8, 18 Jan 26 10:22 /dev/sdb2
brw-rw---- 1 root disk 8, 32 Jan 26 10:22 /dev/sdc
brw-rw---- 1 root disk 8, 33 Jan 26 10:22 /dev/sdc1
brw-rw---- 1 root disk 8, 34 Jan 26 10:22 /dev/sdc2
brw-rw---- 1 root disk 8, 35 Jan 26 10:22 /dev/sdc3

# fdisk -l
Disk /dev/sda: 42.9 GB, 42949672960 bytes
64 heads, 32 sectors/track, 40960 cylinders
Disk identifier: 0x00034b9d

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           2         501      512000   83  Linux
/dev/sda2             502       40960    41430016   8e  Linux LVM

Disk /dev/sdb: 1073 MB, 1073741824 bytes
34 heads, 61 sectors/track, 1011 cylinders
Disk identifier: 0xe64d8f76

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         100      103669+  83  Linux
/dev/sdb2             101         200      103700   83  Linux

Disk /dev/sdc: 2147 MB, 2147483648 bytes
67 heads, 62 sectors/track, 1009 cylinders
Disk identifier: 0xe607e738

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1          50      103819   83  Linux
/dev/sdc2              51         100      103850   83  Linux
/dev/sdc3             101         150      103850   83  Linux

# ifconfig -a | grep HW
eth0      Link encap:Ethernet  HWaddr 00:0C:29:D2:B6:83  
eth1      Link encap:Ethernet  HWaddr 00:0C:29:D2:B6:8D  

# ls -l /sys/class/block | grep sd
lrwxrwxrwx 1 root root 0 Jan 26 10:22 sda -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/block/sda
lrwxrwxrwx 1 root root 0 Jan 26 10:22 sda1 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/block/sda/sda1
lrwxrwxrwx 1 root root 0 Jan 26 10:22 sda2 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/block/sda/sda2
lrwxrwxrwx 1 root root 0 Jan 26 10:22 sdb -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:1/2:0:1:0/block/sdb
lrwxrwxrwx 1 root root 0 Jan 26 10:22 sdb1 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:1/2:0:1:0/block/sdb/sdb1
lrwxrwxrwx 1 root root 0 Jan 26 10:22 sdb2 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:1/2:0:1:0/block/sdb/sdb2
lrwxrwxrwx 1 root root 0 Jan 26 10:22 sdc -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdc
lrwxrwxrwx 1 root root 0 Jan 26 10:22 sdc1 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdc/sdc1
lrwxrwxrwx 1 root root 0 Jan 26 10:22 sdc2 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdc/sdc2
lrwxrwxrwx 1 root root 0 Jan 26 10:22 sdc3 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdc/sdc3

# ls -l /sys/class/net
lrwxrwxrwx 1 root root 0 Jan 26 10:22 eth0 -> ../../devices/pci0000:00/0000:00:16.0/0000:0b:00.0/net/eth0
lrwxrwxrwx 1 root root 0 Jan 26 10:22 eth1 -> ../../devices/pci0000:00/0000:00:17.0/0000:13:00.0/net/eth1
lrwxrwxrwx 1 root root 0 Jan 26 10:22 lo -> ../../devices/virtual/net/lo

# cat /proc/partitions 
major minor  #blocks  name

   8        0   41943040 sda
   8        1     512000 sda1
   8        2   41430016 sda2
   8       16    1048576 sdb
   8       17     103669 sdb1
   8       18     103700 sdb2
   8       32    2097152 sdc
   8       33     103819 sdc1
   8       34     103850 sdc2
   8       35     103850 sdc3
# fdisk -l /dev/disk2
Disk /dev/disk2: 1073 MB, 1073741824 bytes
34 heads, 61 sectors/track, 1011 cylinders
Disk identifier: 0xe64d8f76

      Device Boot      Start         End      Blocks   Id  System
/dev/disk2p1               1         100      103669+  83  Linux
/dev/disk2p2             101         200      103700   83  Linux

# fdisk -l /dev/disk3
Disk /dev/disk3: 2147 MB, 2147483648 bytes
67 heads, 62 sectors/track, 1009 cylinders
Disk identifier: 0xe607e738

      Device Boot      Start         End      Blocks   Id  System
/dev/disk3p1               1          50      103819   83  Linux
/dev/disk3p2              51         100      103850   83  Linux
/dev/disk3p3             101         150      103850   83  Linux

図にすると以下のとおり。

ディスク認識順の入れ替え検証

先の検証と同様にディスクの接続位置を変更し、認識順を変更する。

  • SCSIコントローラ0
    • ディスク1:(0:0) に接続する。変更無し。
    • ディスク2:(0:1) から(0:3) に接続位置を変更する。
    • ディスク3:(0:2) に接続する。変更無し。

起動して確認をおこなった結果は以下のとおり。

# ls -l /dev/sd* /dev/disk*
lrwxrwxrwx 1 root root     3 Jan 26 10:44 /dev/disk1 -> sda
lrwxrwxrwx 1 root root     4 Jan 26 10:44 /dev/disk11 -> sda1
lrwxrwxrwx 1 root root     4 Jan 26 10:44 /dev/disk12 -> sda2
lrwxrwxrwx 1 root root     3 Jan 26 10:44 /dev/disk2 -> sdc
lrwxrwxrwx 1 root root     4 Jan 26 10:44 /dev/disk21 -> sdc1
lrwxrwxrwx 1 root root     4 Jan 26 10:44 /dev/disk22 -> sdc2
lrwxrwxrwx 1 root root     3 Jan 26 10:44 /dev/disk3 -> sdb
lrwxrwxrwx 1 root root     4 Jan 26 10:44 /dev/disk31 -> sdb1
lrwxrwxrwx 1 root root     4 Jan 26 10:44 /dev/disk32 -> sdb2
lrwxrwxrwx 1 root root     4 Jan 26 10:44 /dev/disk33 -> sdb3
brw-rw---- 1 root disk 8,  0 Jan 26 10:44 /dev/sda
brw-rw---- 1 root disk 8,  1 Jan 26 10:44 /dev/sda1
brw-rw---- 1 root disk 8,  2 Jan 26 10:44 /dev/sda2
brw-rw---- 1 root disk 8, 16 Jan 26 10:44 /dev/sdb
brw-rw---- 1 root disk 8, 17 Jan 26 10:44 /dev/sdb1
brw-rw---- 1 root disk 8, 18 Jan 26 10:44 /dev/sdb2
brw-rw---- 1 root disk 8, 19 Jan 26 10:44 /dev/sdb3
brw-rw---- 1 root disk 8, 32 Jan 26 10:44 /dev/sdc
brw-rw---- 1 root disk 8, 33 Jan 26 10:44 /dev/sdc1
brw-rw---- 1 root disk 8, 34 Jan 26 10:44 /dev/sdc2

# ifconfig -a | grep HW
eth0      Link encap:Ethernet  HWaddr 00:0C:29:D2:B6:83  
eth1      Link encap:Ethernet  HWaddr 00:0C:29:D2:B6:8D  

# ls -l /sys/class/block | grep sd
lrwxrwxrwx 1 root root 0 Jan 26 10:44 sda -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/block/sda
lrwxrwxrwx 1 root root 0 Jan 26 10:44 sda1 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/block/sda/sda1
lrwxrwxrwx 1 root root 0 Jan 26 10:44 sda2 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/block/sda/sda2
lrwxrwxrwx 1 root root 0 Jan 26 10:44 sdb -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdb
lrwxrwxrwx 1 root root 0 Jan 26 10:44 sdb1 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdb/sdb1
lrwxrwxrwx 1 root root 0 Jan 26 10:44 sdb2 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdb/sdb2
lrwxrwxrwx 1 root root 0 Jan 26 10:44 sdb3 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:2/2:0:2:0/block/sdb/sdb3
lrwxrwxrwx 1 root root 0 Jan 26 10:44 sdc -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:3/2:0:3:0/block/sdc
lrwxrwxrwx 1 root root 0 Jan 26 10:44 sdc1 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:3/2:0:3:0/block/sdc/sdc1
lrwxrwxrwx 1 root root 0 Jan 26 10:44 sdc2 -> ../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:3/2:0:3:0/block/sdc/sdc2

# ls -l /sys/class/net 
lrwxrwxrwx 1 root root 0 Jan 26 10:44 eth0 -> ../../devices/pci0000:00/0000:00:16.0/0000:0b:00.0/net/eth0
lrwxrwxrwx 1 root root 0 Jan 26 10:44 eth1 -> ../../devices/pci0000:00/0000:00:17.0/0000:13:00.0/net/eth1
lrwxrwxrwx 1 root root 0 Jan 26 10:44 lo -> ../../devices/virtual/net/lo

# cat /proc/partitions 
major minor  #blocks  name

   8        0   41943040 sda
   8        1     512000 sda1
   8        2   41430016 sda2
   8       16    2097152 sdb
   8       17     103819 sdb1
   8       18     103850 sdb2
   8       19     103850 sdb3
   8       32    1048576 sdc
   8       33     103669 sdc1
   8       34     103700 sdc2
# fdisk -l /dev/disk2
Disk /dev/disk2: 1073 MB, 1073741824 bytes
34 heads, 61 sectors/track, 1011 cylinders
Disk identifier: 0xe64d8f76

      Device Boot      Start         End      Blocks   Id  System
/dev/disk2p1               1         100      103669+  83  Linux
/dev/disk2p2             101         200      103700   83  Linux

# fdisk -l /dev/disk3
Disk /dev/disk3: 2147 MB, 2147483648 bytes
67 heads, 62 sectors/track, 1009 cylinders
Disk identifier: 0xe607e738

      Device Boot      Start         End      Blocks   Id  System
/dev/disk3p1               1          50      103819   83  Linux
/dev/disk3p2              51         100      103850   83  Linux
/dev/disk3p3             101         150      103850   83  Linux

図にすると以下のとおり。

NICの場合

NICの場合は /dev/eth0 などがあるわけではないため、ディスクとはやや状況が異なる。

変更前の状態確認

eth0 は PCI の 0B:00.0 のNICを指している。eth1 は 13:00.0 のNICである。dmesg 上ではNICに関するudevの動作(入れ替え)は確認できない。

# ls -l /sys/class/net 
lrwxrwxrwx 1 root root 0 Jan 26 10:44 eth0 -> ../../devices/pci0000:00/0000:00:16.0/0000:0b:00.0/net/eth0
lrwxrwxrwx 1 root root 0 Jan 26 10:44 eth1 -> ../../devices/pci0000:00/0000:00:17.0/0000:13:00.0/net/eth1
lrwxrwxrwx 1 root root 0 Jan 26 10:44 lo -> ../../devices/virtual/net/lo

# dmesg | grep eth
eth0: NIC Link is Up 10000 Mbps
eth1: NIC Link is Up 10000 Mbps
eth0: intr type 3, mode 0, 2 vectors allocated
eth0: NIC Link is Up 10000 Mbps
eth0: no IPv6 routers present
認識順変更

ネットワークアダプタ1とネットワークアダプタ2のpciSlotNumberを入れ替えることで認識順を逆にする。

(変更前)

(変更後)

認識順変更後の状態確認

eth0 は PCI の 13:00.0 のNICを指している。eth1 は 0B:00.0 のNICである。dmesg 上ではNICに関するudevの動作(入れ替え)が確認できる。/sys 上でも eth0 と eth1 は当初の状態から入れ替えられており、カーネルの認識が変わっている。この点が udev の最も有名な機能が最も udev らしからぬものと思わせる。

# ls -l /sys/class/net 
lrwxrwxrwx 1 root root 0 Jan 26 11:20 eth0 -> ../../devices/pci0000:00/0000:00:17.0/0000:13:00.0/net/eth0
lrwxrwxrwx 1 root root 0 Jan 26 11:20 eth1 -> ../../devices/pci0000:00/0000:00:16.0/0000:0b:00.0/net/eth1
lrwxrwxrwx 1 root root 0 Jan 26 11:20 lo -> ../../devices/virtual/net/lo

# dmesg | grep eth
eth0: NIC Link is Up 10000 Mbps
eth1: NIC Link is Up 10000 Mbps
udev: renamed network interface eth0 to rename2
udev: renamed network interface eth1 to eth0
udev: renamed network interface rename2 to eth1
eth0: intr type 3, mode 0, 2 vectors allocated
eth0: NIC Link is Up 10000 Mbps
eth0: no IPv6 routers present

図にすると以下のとおり。

参考サイト

  • Decoding WWIDs (or how to tell what's what) 日立のストレージにおいてLDEVごとに割り当てられるWWN(WWID)がLDEV番号や装置のシリアル番号に基づいて決まっていることを明らかにしている。