VMware におけるSCSIコントローラの認識順序(追加検証)

前の記事「VMware におけるSCSIコントローラの認識順序」を書いているなかででてきた以下の疑問について追加検証する。

  • SCSIコントローラ0は必ず pciSlotNumber = "160" となるのか?
  • pciSlotNumber の割り当て順序にルールがあるのではないか?

検証に使用した環境は VMware ESXi 5.0.0 と CentOS 6.4 x86_64 である。

SCSIコントローラ0は必ず pciSlotNumber = "160" となるのか?

結論から書けば、「ならない」である。仮想マシンの設定手順次第では、SCSIコントローラ1をSCSIコントローラ0より先に認識させることもできるし、pciSlotNumber = "160" にネットワークアダプタが割り当たることもある。

検証の流れ

検証の流れは以下のとおり。非常に意地悪な作成順だが、淡々と追加順に基づいて構成が決まっていることがよくわかるのだ。

  1. ディスクもネットワークアダプタも接続しない仮想マシンを作成して状態を確認する。
  2. ネットワークアダプタを1個追加して状態を確認する。
  3. SCSIコントローラ1に接続するディスクを1個追加して状態を確認する。
  4. SCSIコントローラ0に接続するディスクを1個追加して状態を確認する。
検証

ディスクもネットワークアダプタも接続しない仮想マシンを作成。

作成直後のvmxファイルではPCIブリッジのpciSlotNumberさえも生成されていない。

仮想マシンを一旦起動・停止することでPCIブリッジのpciSlotNumberが生成される。
どうもPCIブリッジのpciSlotNumberは固定で決まっているように思える。

ネットワークアダプタを1個追加する。

仮想マシンを一旦起動・停止することで、追加したネットワークアダプタ(ethernet0)のpciSlotNumberが生成される。
pciSlotNumber = "160" があっさり使用されてしまった。

SCSIコントローラ1(1:0)に接続するディスクを1個追加する。

仮想マシンを一旦起動・停止することで、追加したSCSIコントローラ(scsi1)のpciSlotNumberが生成される。
pciSlotNumber = "192" である。

SCSIコントローラ0(0:0)に接続するディスクを1個追加する。

仮想マシンを一旦起動・停止することで、追加したSCSIコントローラ(scsi0)のpciSlotNumberが生成される。
pciSlotNumber = "224" である。

pciSlotNumberとブリッジの情報から接続状態を導き出すと、認識順は無情にも以下のとおりであることが明らかである。

  1. 【ethernet0】ネットワークアダプタ1 [pciSlotNumber = "160"]
  2. 【scsi1】SCSIコントローラ1 (1ディスク接続) [pciSlotNumber = "192"]
  3. 【scsi0】SCSIコントローラ0 (1ディスク接続) [pciSlotNumber = "224"]


pciSlotNumber の割り当て順序にルールがあるのではないか?

結論から書けば、「割り当て順序にはルールがある」である。ただし、マニュアルに記載があるかは未確認であり、あくまでも実機検証から導かれるというだけである。バージョンが変われば動作が変わる可能性は十分にある。

検証の流れ

検証の流れは以下のとおり。追加により割り当てのルールを推測し、削除と追加によりpciSlotNumberの再利用の有無を確認する。

  1. ディスクもネットワークアダプタも接続しない仮想マシンを作成して状態を確認する。
  2. ネットワークアダプタを1個追加する。
  3. SCSIコントローラ1に接続するディスクを1個追加する。
  4. SCSIコントローラ0に接続するディスクを1個追加する。
  5. ネットワークアダプタを1個ずつ、計9個追加する。
  6. SCSIコントローラ2に接続するディスクを1個追加する。
  7. ネットワークアダプタ2とネットワークアダプタ3を削除する。
  8. SCSIコントローラ3に接続するディスクを1個追加する。
  9. ネットワークアダプタを2個追加する。
検証

SCSIコントローラ2に接続するディスクを1個追加する手順までを実施した状態である(SCSIコントローラが3個、ネットワークアダプタが10個)。

ethernet0からethernet6までのpciSlotNumberを確認する。

ethernet7からethernet9までのpciSlotNumberを確認する。

scsi0からscsi2までのpciSlotNumberを確認する。


追加順とpciSlotNumber、接続位置を整理すると以下のとおりである。
これから見えてくるルールは、「pciBridge4からpciBridge7の小さいFunction番号を優先して割り当てている」ということだ。

  • pciBridge4からpciBridge7までのFunction 0が割り当て済みになると、pciBridge4のFunction 1を使い始める。
  • pciBridge4からpciBridge7までのFunction 1が割り当て済みになると、pciBridge4のFunction 2を使い始める。
  • pciBridge4からpciBridge7までのFunction 2が割り当て済みになると、・・・
追加順バイスpciSlotNumberpciSlotNumber[2進数]接続するBusの上位PCIブリッジとFunction
1ethernet0160000 00101 00000 (0,5,0)pciBridge4 Function 0
2scsi1192000 00110 00000 (0,6,0)pciBridge5 Function 0
3scsi0224000 00111 00000 (0,7,0)pciBridge6 Function 0
4ethernet1256000 01000 00000 (0,8,0)pciBridge7 Function 0
5ethernet21184001 00101 00000 (1,5,0)pciBridge4 Function 1
6ethernet31216001 00110 00000 (1,6,0)pciBridge5 Function 1
7ethernet41248001 00111 00000 (1,7,0)pciBridge6 Function 1
8ethernet51280001 01000 00000 (1,8,0)pciBridge7 Function 1
9ethernet62208010 00101 00000 (2,5,0)pciBridge4 Function 2
10ethernet72240010 00110 00000 (2,6,0)pciBridge5 Function 2
11ethernet82272010 00111 00000 (2,7,0)pciBridge6 Function 2
12ethernet92304010 01000 00000 (2,8,0)pciBridge7 Function 2
13scsi23232011 00101 00000 (3,5,0)pciBridge4 Function 3

ネットワークアダプタ2(ethernet1)とネットワークアダプタ3(ethernet2)を削除する。

ethernet1およびethernet2の定義情報が削除される。
仮想マシンを一旦起動・停止してみたが、削除していないネットワークアダプタSCSIコンンローラのpciSlotNumberに変化はなく、接続位置は維持されることがわかる。

SCSIコントローラ3に接続するディスクを1個追加する。

仮想マシンを一旦起動・停止することで、追加したSCSIコントローラ(scsi3)のpciSlotNumberが生成される。
pciSlotNumber = "256" である。これは削除したネットワークアダプタ2(ethernet1)に割り当てられていた番号だ。

ネットワークアダプタ2(ethernet1)とネットワークアダプタ3(ethernet2)を再作成する。

仮想マシンを一旦起動・停止することで、追加したネットワークアダプタ(ethernet1およびethernet2)のpciSlotNumberが生成される。
再作成したethernet1はpciSlotNumber = "1184" である。これは削除したネットワークアダプタ3(ethernet2)に割り当てられていた番号だ。
再作成したethernet2はpciSlotNumber = "3264" である。これは(ルールに基づく)新規の番号だ。

追加順とpciSlotNumber、接続位置を再度整理すると以下のとおりである。
これから見えてくるさらなるルールは以下のとおり。

  • バイスが削除されると割り当てられていたpciSlotNumberは解放される(vmxファイル上から情報が消える)。
  • 一部のデバイスが削除されても、残るデバイスに割り当てられていたpciSlotNumberは影響を受けずに維持される。
  • pciSlotNumberは再利用される。
    • 小さいFunction番号に空きがあれば優先してそれを再利用する(pciBridge4のFunction 1よりpciBridge7のFunction 0を優先して再利用した事実から)。
追加順バイスpciSlotNumberpciSlotNumber[2進数]接続するBusの上位PCIブリッジとFunction
1ethernet0160000 00101 00000 (0,5,0)pciBridge4 Function 0
2scsi1192000 00110 00000 (0,6,0)pciBridge5 Function 0
3scsi0224000 00111 00000 (0,7,0)pciBridge6 Function 0
4ethernet1256000 01000 00000 (0,8,0)pciBridge7 Function 0
5ethernet21184001 00101 00000 (1,5,0)pciBridge4 Function 1
6ethernet31216001 00110 00000 (1,6,0)pciBridge5 Function 1
7ethernet41248001 00111 00000 (1,7,0)pciBridge6 Function 1
8ethernet51280001 01000 00000 (1,8,0)pciBridge7 Function 1
9ethernet62208010 00101 00000 (2,5,0)pciBridge4 Function 2
10ethernet72240010 00110 00000 (2,6,0)pciBridge5 Function 2
11ethernet82272010 00111 00000 (2,7,0)pciBridge6 Function 2
12ethernet92304010 01000 00000 (2,8,0)pciBridge7 Function 2
13scsi23232011 00101 00000 (3,5,0)pciBridge4 Function 3
14追加順4と5で追加していたネットワークアダプタ2(ethernet1)とネットワークアダプタ3(ethernet2)を削除する。
15scsi3256000 01000 00000 (0,8,0)pciBridge7 Function 0
16ethernet11184001 00101 00000 (1,5,0)pciBridge4 Function 1
17ethernet23264011 00110 00000 (3,6,0)pciBridge5 Function 3