VEOS:仮想マシンでVEを利用する方法 Date:2023/09 この文書は VEOS version 3.0.2 以降についての情報を記載しています ●仮想マシンはVE30 でのみ利用可能です。 ●VEを利用可能な管理ソフト/仮想化プログラムは、libvirt/qemu-kvmです。 ●VMゲストにて使用可能なVE数は基本1個です。複数接続する場合は別途設定が必要になります 注意事項2を参照願います ■ 仮想マシンへのVEの割り当て方 前提:VMゲスト が g1-rhel86 として作成されているものとします。 1)ホストのBIOS の設定 Intel VT-x および AMD-V Virtualization ハードウェア拡張の有効化を する必要があります。 BIOS メニューにて、以下の機能を有効にし、設定をセーブして再起動します 設定方法は、BIOSメニューを参照願います Intel機 :VT-d(Intel Virtualization Technology) AMD機 :IOMMU 2)ホストのGrub 設定ファイルにカーネルパラメータを追加設定する 2.1 /etc/sysconfig/grub の GRUB_CMDLINE_LINUXの行末に以下を追加します INTEL機: intel_iommu=on iommu=pt AMD機 : amd_iommu=on iommu=pt 例:AMD系 GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rhel0-swap \ rd.lvm.lv=rhel0/root rd.lvm.lv=rhel0/swap amd_iommu=on iommu=pt rhgb quiet" 2.2 grub の設定ファイルの再生成します (/boot/efi/EFI/*/grub.cfg があれば、UEFIベースです) BIOSベース : $grub2-mkconfig -o /boot/grub2/grub.cfg UEFIベース(RHEL) : $grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg UEFIベース(Rocky): $grub2-mkconfig -o /boot/efi/EFI/rocky/grub.cfg 3)ホストをリブートし、VT-d or AMD IOMMU が 有効になっているか確認します。 $ reboot 起動後、以下を実行し、設定が有効であるか確認します。 $if compgen -G "/sys/kernel/iommu_groups/*/devices/*" >/dev/null ;\ then echo IOMMU or VT-D is enabled; else echo IOMMU or VT-D is not enabled; fi IOMMU or VT-D is enabled 上記表示でない場合は、1)、2)を確認してください。 4)ゲスト(g1-rhel86)の設定を追加更新します。 4.1 ゲスト(g1-rhel86)が既に起動している場合は、一旦、ここで、停止します $ virsh shutdown g1-rhel86 4.2 ゲスト(g1-rhel86)の設定ファイルに、以下の + の行の部分を修正、追加します。 $ virsh edit g1-rhel86 以下の+の行を追加します。 + ;;; + + + + セーブして終了します。 5)ホストに搭載されているVEのうち、ゲスト(g1-rhel86)へ割り当てるVEを決定し、そのVEの識別情報 が記録された xml file を作成し、ゲスト(g1-rhel86) に割り当てます。 5.1 ホストに搭載されているVEの一覧を表示します。 vecmd を使用して、識別情報(ドメイン(0000固定)、バス、スロット、ファンクション)付きで、 搭載デバイスを確認することができます。 以下の例ではVEが、8枚搭載されており、この中から、ゲストに割り当てるVEを決定します。 $ /opt/nec/ve/bin/vecmd state all Vector Engine MMM-Command v3.0.1.15 Command: state -n 0,1,2,3,4,5,6,7 all ------------------------------------------------------- [ve_state] [os_state] [ownership] VE 0 [45:00.0] : AVAILABLE ONLINE 361173(veos) VE 1 [46:00.0] : AVAILABLE ONLINE 361257(veos) VE 2 [c6:00.0] : AVAILABLE ONLINE 361630(veos) VE 3 [c5:00.0] : AVAILABLE ONLINE 361578(veos) VE 4 [07:00.0] : AVAILABLE ONLINE 361132(veos) VE 5 [06:00.0] : AVAILABLE ONLINE 361134(veos) *このVEをゲストにて使用する VE 6 [89:00.0] : AVAILABLE ONLINE 361350(veos) VE 7 [8a:00.0] : AVAILABLE ONLINE 361472(veos) ------------------------------------------------------- 選択したVE 5 [06:00.0]のデバイス名と識別情報は、以下のようになっています。 VE 5 [06:00.0] | | | | | | | +ファンクション(0x0) | | +スロット(0x00) | +バス(0x06) | | ドメインは、0x0000 固定です | + /dev/veslot5 以上により、ゲストに割り当てるVEデバイスは,識別情報として、0000:06:00.0 を持つ、/dev/veslot5 になります。ここで、選択したデバイスが表示されない場合は、既に、他のゲストへ割り当てられているか、 使用可能なデバイスではないので別のデバイスを選択してください。 5.2 識別情報(ドメイン(domain)、バス(bus)、スロット(slot)、ファンクション(function))を使用し、 以下のようにxml fileを作成します。 作成した xml ファイルは、割り当て解除にも使用するので、ゲスト管理用のディレクトリ等に保存してく ださい $vi g1-rhel86-veslot5.xml
5.3 veslot5用使用しているveos を停止します。 $systemctl stop ve-os-launcher@5 $systemctl stop ve-os-state-monitor@5 5.4 mmm の管理からveslot5のデバイスを外します。 $/opt/nec/ve/bin/vecmd -N 5 remove 5.5 作成した、g1-rhel86-veslot5.xml ファイルを使用して、/dev/veslot5をゲスト(g1-rhel86) に割り当てます $ virsh attach-device g1-rhel86 ./g1-rhel86-veslot5.xml --persistent 6)ゲスト(g1-rhel86)の起動 $virsh start g1-rhel86 このコマンドを実行すると、VEが自動でホストから外され、ゲストへ割り当てられます。 #ホストから外されるときに、対応するMMMとVEOSが動作していれば、killされます。 7)起動されたゲストにloginして、VEが見えることを確認します。 $ lspci | grep NEC 07:00.0 Co-processor: NEC Corporation Device 0039 (rev 01) 8)ゲストへのVE関連ソフトウェアのインストール ホストでVE関連ソフトウェアをセットアップする方法 (https://sxauroratsubasa.sakura.ne.jp/documents/guide/pdfs/InstallationGuide_J.pdf) と同様な方法でゲスト(g1-rhel86)にVE関連ソフトウェアをインストールします。 これで、設定終了です。ゲストでVEが使用可能になります。 9)一度設定が完了すれば、VEの割り当ては、以下のような動作になります。 ゲストを開始すれば、自動でホストから外され、ゲストへ割り当てられます。 ホストから外されるときに、該当デバイスに対する、MMMのremove や、VEOSの停止がない場合、 MMMとVEOSはkillされます。 ゲストを停止をすれば、ゲストへの割り当てが解除され、自動でホストに再接続されます。 注意事項1の場合には、再接続されません。 設定は、ホストのリブート後も有効です。 ■ゲストへのVEの割り当てを解除し、ホストに割り当てを戻す方法 1 ゲスト(g1-rhel86)をシャットダウンします。 $virsh shutdown g1-rhel86 2 g1-rhel86-veslot5.xml ファイルを使用して、ゲスト(g1-rhel86) への割り当てを解除します $virsh detach-device g1-rhel86 ./g1-rhel86-veslot5.xml --persistent 3 ホストに /dev/veslot5 が作成されることを確認します。 $ls -l /dev/veslot5 ただし、注意事項1の場合には、作成されません。 ■ VEを割り当てたゲストを自動起動にする場合の設定 VEを割り当てたゲストを自動起動に設定する時は、ゲストに割り当てたVEをホスト起動時に ホストに認識 させないようにする必要があります。 1. システム起動時のドライバロード。エディタにて以下のファイルを作成します $vi /etc/modules-load.d/vfio-pci.conf vfio-pci 2. vfio-pciドライバのロード時オプション設定。エディタにて以下のファイルを作成します. $vi /etc/modprobe.d/vfio.conf install vfio-pci /opt/nec/ve/veos/sbin/vfio-pci-override.sh 3. ve デバイスのドライバとして、vfio-pciが使用されるようにする為のファイルを作成します。 3.1 エディタにて以下の/opt/nec/ve/veos/sbin/vfio-pci-override.shファイルを作成します. 割り当ての時に作成したg1-rhel86-veslot5.xmlファイルを使用します. 以下のコマンドにて表示されたものを、/opt/nec/ve/veos/sbin/vfio-pci-override.sh ファイルの、VE_FOR_GUEST 変数に追加します。 $printf "%04x:%02x:%02x.%x\n" `grep -o "0x[0-9a-fA-F]*" g1-rhel86-veslot5.xml` 0000:06:00.0 xml ファイルがない場合は、代わりにゲスト(virsh start に指定するドメイン名)を使い 以下を実行します $ printf "%04x:%02x:%02x.%x\n" `virsh dumpxml g1-rhel86 | \ grep managed -A 3| grep -v pci |grep -o "0x[0-9a-fA-F]*"` 0000:06:00.0 VE_FOR_GUEST="0000:06:00.0" のように追加します。 $vi /opt/nec/ve/veos/sbin/vfio-pci-override.sh #!/bin/bash # set VE_FOR_GUEST="domain:bus:slot.function" # 複数であれば、スペース空けて追加する VE_FOR_GUEST="0000:06:00.0" for dbf in $VE_FOR_GUEST do echo "vfio-pci">/sys/bus/pci/devices/${dbf}/driver_override done modprobe -i vfio-pci 3.3 パーミッションを設定します $chmod 755 /opt/nec/ve/veos/sbin/vfio-pci-override.sh 4. initramfs の再生成 4.1 エディタにて以下のファイルを作成します。 $vi /etc/dracut.conf.d/vfio-pci.conf install_optional_items="/opt/nec/ve/veos/sbin/vfio-pci-override.sh /etc/modprobe.d/vfio.conf" 4.2 initramfsを再生成します。 $dracut -f 5. 自動起動の設定 $virsh autostart g1-rhel86 6. 必要に応じて再起動 $reboot 再起動後、g1-rhel86が自動起動します。 ■ VEを割り当てたゲストの自動起動を解除する方法 「VEを割り当てたゲストを自動起動にする場合の設定」の設定でホストが起動している場合、ゲストを shutdown してもホストへ自動でデバイスは再接続されません。ホストに接続したい場合は、以下を 実行してください。 その後、 vfio-pciのデバイスリストから割り当てデバイスを削除し、自動起動を解除し、dracut -f を実施します。 1. ゲストのshutdown $virsh shutdown g1-rhel86 2.割り当てデバイスへの vfio-pciを指定 解除 割り当ての時に使用した xml file(g1-rhel86-veslot5.xml)を使用します 以下のコマンドにて,割り当ていたデバイスを VE_FOR_GUEST 変数に追加します。 設定されていることを確認します。 $VE_FOR_GUEST=`printf "%04x:%02x:%02x.%x\n" \ \`grep -o "0x[0-9a-fA-F]*" g1-rhel86-veslot5.xml\`` $echo $VE_FOR_GUEST 0000:06:00.0 xml ファイルがない場合は、代わりにゲスト(virsh start に指定するドメイン名)を使い 以下を実行します $if virsh dumpxml g1-rhel86 | grep managed >/dev/null;then \ VE_FOR_GUEST=`printf "%04x:%02x:%02x.%x\n" \`virsh dumpxml g1-rhel86 | \ grep managed -A 3| grep -v pci |grep -o "0x[0-9a-fA-F]*"\`` ;\ else \ echo VEs are not assigned to guests.; \ fi VE_FOR_GUEST に設定されていることを確認します $echo $VE_FOR_GUEST 0000:06:00.0 vfio-pciの指定を解除します $for dbf in $VE_FOR_GUEST; \ do \ echo >/sys/bus/pci/devices/${dbf}/driver_override; \ done 3. システムにデバイスを再認識させます。 $for dbf in $VE_FOR_GUEST; \ do \ echo $dbf >/sys/bus/pci/devices/${dbf}/driver/unbind; \ echo $dbf >/sys/bus/pci/drivers_probe;\ done 起動後、一度でもホストに認識させた後に、再度、ゲストをstartする場合は、開始前にMMMのremove やVEOSの停止の実施してください。停止しない場合は、MMM,VEOSは、Killされます。また、ホストに 一度でも認識された後のゲストのshutdown後は、自動でホストへ接続されます 4./opt/nec/ve/veos/sbin/vfio-pci-override.sh ファイル内のVE_FOR_GUEST変数から削除します $vi /opt/nec/ve/veos/sbin/vfio-pci-override.sh VE_FOR_GUEST="" 5. initramfs の再生成 $dracut -f 6. 自動起動の解除 $virsh autostart --disable g1-rhel86 7. 必要に応じて再起動 $reboot ■ 注意事項 1. 自動起動設定に伴い、「VEを割り当てたゲストを自動起動にする場合の設定」を実施している場合は、 ゲストを停止しても、自動でホストには再接続されません。再接続する為には、 「VEを割り当てたゲストの自動起動を解除する方法」 を実施してください 2. 複数のVEをゲストに割り当てる場合 一つのVMゲストにて複数のVEを割り当てる場合は、他のVEを他のゲストに割り当てて使用することは、 可能ですが、ホストでの使用はできません。 VEカードでは ATS (Address Translation Services) がサポートされないため、仮想マシンにおける VEノード間の性能が十分に出ません。 また、AMD製CPUを搭載しているSX-Aurora TSUBASAにおいて、仮想マシンに複数VEを割り当て、VE間の データ転送を行う場合は、別途 デプロイメントマニュアルに従い、PCIe:Access Control Service (ACS)設定を有効にする必要があります。 3. 仮想マシンに割り当てるVEと同じ数のx86のコアを割り当てる必要があります 4. 仮想マシンには5GB以上のメモリを割り当てる必要があります