14.10. 仮想マシンの SCSI パススルーの設定
仮想マシン (VM) が、ストレージエリアネットワーク (SAN) の論理ユニット番号 (LUN) ディスクデバイスなどのホスト SCSI デバイスに直接アクセスできるように、SCSI パススルーを設定できます。
SCSI パススルーを使用すると、ローカルディスクやマルチパスデバイスをパススルーすることができます。
-
ローカルディスクをパススルーする場合、仮想マシンはディスクへの単一のパスを使用します。たとえば、単一の
/dev/disk/by-path/や/dev/sdbなどのデバイスです。 -
マルチパスデバイスを使用する場合、ホストは複数のパスを通じて同じ LUN を提示し、それらを 1 つのマッパーデバイス (例:
/dev/mapper/mpatha) に集約します。これにより、いずれかのパスに障害が発生した場合も、冗長性とフェイルオーバー機能が確保されます。
前提条件
ホストが以下のいずれかの CPU アーキテクチャーを使用している。
- Intel 64
- AMD64
- ARM 64
- ホストがサポートされている RHEL およびカーネルバージョンを使用している。詳細は、仮想マシンにおける SGIO サポートに必要な RHEL バージョン を参照してください。
- マルチパス化された仮想ディスク (vDisk) を使用する場合は、ホスト上でマルチパス設定が正しくセットアップされている。詳細は、Device Mapper Multipath の設定 を参照してください。
手順
仮想マシンの XML 設定を開きます。
# virsh edit <vm_name><devices>セクションに、VirtIO-SCSI コントローラーの行を追加します (まだない場合)。<controller type='scsi' model='virtio-scsi' index='0'/>マルチパスデバイスの場合、ホスト上のマルチパスデバイスマッパーを特定します。
# multipath -lmpatha (36001438005deb1d00000000000000001) dm-0 NETAPP ,LUN size=100G features='0' hwhandler='0' wp=rw `-+- policy='service-time 0' prio=50 status=active `- 2:0:0:1 sdb 8:16 active ready running `- 3:0:0:1 sdc 8:32 active ready runningマルチパスデバイス名 (例:
mpatha) をメモしておきます。デバイスパスは/dev/mapper/<name>です。たとえば、/dev/mapper/mpathaです。ls /dev/mapper/コマンドを使用して、マルチパスデバイスのノードをリスト表示することもできます。ホスト上の SCSI ディスクデバイスを定義する XML ファイルを作成して開きます。以下に例を示します。
# vim scsi-passthrough-device.xmlXML ファイルに SCSI デバイスの設定を追加します。
マルチパスデバイスの場合:
<disk type='block' device='lun'> <driver name='qemu' type='raw'/> <source dev='/dev/mapper/mpatha'/> <target dev='sdb' bus='scsi'/> <alias name='ua-scsi-mpath0'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk>この例では、マルチパスデバイスは単一の
disk要素として定義されています。-
<source dev='/dev/mapper/mpatha'/>は、ホスト上のデバイスマッパーマルチパスデバイスを指定します。 - ホストのマルチパスレイヤーがすでにパスを集約しているため、仮想マシンは 1 つのブロックデバイスを受け取り、パスのフェイルオーバーはホスト側で処理されます。
-
ローカルディスクをパススルーする場合:
<disk type='block' device='lun'> <driver name='qemu' type='raw'/> <source dev='/dev/sdb'/> <target dev='sdc' bus='scsi'/> <alias name='ua-scsi-lun0'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk>この例では、SCSI ディスクデバイスが以下のパラメーターで定義されています。
-
type='block': デバイスがブロックデバイスであることを指定します。 -
device='lun': これが SCSI 論理ユニット番号 (LUN) デバイスのパススルーであることを示しています。 -
<driver name='qemu' type='raw'/>: 直接デバイスにアクセスするための raw 形式の QEMU ドライバーを指定します。 -
<source dev='/dev/sdb'/>: ホストブロックデバイスのパスを指定します。デバイスノード (例:/dev/sdb) を直接使用することも、再起動後の永続性を高めるために/dev/disk/by-path/エントリーを使用することもできます。 -
<target dev='sdc' bus='scsi'/>: 仮想マシン内でデバイスがどのように表示されるかを指定します。このデバイスは SCSI バス上でsdcとして表示されます。 -
alias: これは、libvirtコマンドでデバイスを接続解除するときなど、目的のデバイスを指定するのに使用できるオプションのユーザー定義エイリアスです。libvirtのユーザー定義エイリアスは、すべて "ua-" というプレフィックスで始まる必要があります。 -
<address type='drive' controller='0' bus='0' target='0' unit='0'/>: 仮想マシン内でデバイスがどのように表示されるかを指定します。controller属性は、仮想マシン内の SCSI コントローラーを参照します。このコントローラーは、デバイスを接続する前に存在している必要があります。
-
XML ファイルを使用して、定義済みの SCSI ディスクデバイスを仮想マシンに接続します。たとえば、
scsi-passthrough-device.xmlで定義されたデバイスを、実行中の<vm_name>仮想マシンに永続的に接続するには、以下を実行します。# virsh attach-device <vm_name> scsi-passthrough-device.xml --live --config--liveオプションは、実行中の仮想マシンにのみデバイスを接続します。再起動後に永続性は維持されません。--configオプションは、設定の変更を永続化します。--liveオプションを指定せずに、デバイスをシャットダウンした仮想マシンに接続することもできます。オプション: SCSI ディスクを仮想マシンに接続する必要がなくなった場合は、
virsh detach-deviceコマンドを使用してディスクを接続解除できます。シャットダウンした仮想マシンから SCSI ディスクデバイスを接続解除する場合:
# virsh detach-device <vm_name> scsi-passthrough-device.xml --config実行中の仮想マシンから SCSI ディスクデバイスを接続解除する場合:
# virsh detach-device <vm_name> scsi-passthrough-device.xml --live --config警告実行中の仮想マシンから SCSI デバイスを接続解除すると、そのデバイスが使用中の場合、データの損失や破損が発生する可能性があります。デバイスを接続解除する前に、ゲストオペレーティングシステム上のどのアプリケーションからもデバイスにアクセスされていないことを確認してください。
検証
RHEL 仮想マシンでは、ブロックデバイスをリスト表示することで、ゲスト OS 上で SCSI デバイスが認識されていることを確認できます。マルチパス設定の場合、LUN ディスクは単一のブロックデバイスとして表示されます。
# lsblk -nd -o name,size,type,wwnNAME SIZE TYPE WWN sda 20G disk sdb 100G disk 0x36001438005deb1d00000000000000001この例では、SCSI デバイスは World Wide Name (WWN) を持つディスクとして表示されています。マルチパス設定の場合、ゲストに単一のブロックデバイスが提示され、パスのフェイルオーバーがホスト側で処理されます。
提示されたデバイスのサイズが、ホスト上の LUN ディスクのサイズと同じであることを確認してください。
ホスト側では、実行中の仮想マシンの XML 設定を表示することで、デバイスの接続を確認できます。
# virsh dumpxml <vm_name><domain type='kvm'> <name>vm_name</name> ... <devices> ... <disk type='block' device='lun'> <driver name='qemu' type='raw'/> <source dev='/dev/sdb'/> <target dev='sdc' bus='scsi'/> <alias name='ua-scsi-lun0'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> ... </devices> ... </domain>この例の
disk要素は、ホストパス/dev/sdbの SCSI デバイスが SCSI バス上のsdcとして仮想マシンに接続されていることを示しています。