14.9. 仮想マシンの 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) を使用している場合、ホスト上でマルチパス設定が正しく設定されている必要があります。詳細は、デバイスマッパーのマルチパス設定を 参照してください。
手順
仮想マシンの 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>この例では、マルチパスデバイスは単一の
ディスク要素として定義されています。-
<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'/>: 直接デバイスにアクセスするための生フォーマットの 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 デバイスを取り外すと、そのデバイスが使用中の場合、データの損失や破損が発生する可能性があります。デバイスを取り外す前に、ゲストオペレーティングシステム上のどのアプリケーションからもデバイスにアクセスされていないことを確認してください。
検証
仮想マシン内でブロックデバイスのリストを表示し、ゲスト 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>この例では、
ディスク要素は、ホストパス/dev/sdbの SCSI デバイスが SCSI バス上のsdcとして仮想マシンに接続されていることを示しています。