基本的KVMコマンドの使い方【Ubuntu24.04,GPUパススルー,RTX3060】

ubuntu コンピュータ
ubuntu

幾度かの失敗を経て、KVMでホストOSをUbuntu24.04、ゲストOSをUbuntu22.04でGPUをパススルーでRTX3060のドライバーをインストールするところまでこぎ着けました。
今後KVMのコマンドを使うことが増えそうなので記事にしてみました。

KVMの基本コマンド

実行中の仮想マシンをリスト表示

virsh list
全ての仮想マシンをリスト表示

virsh list --all

停止中の仮想マシンも表示されます。

仮想マシンを起動

virsh start <仮想マシン名>
仮想マシンをシャットダウン

virsh shutdown <仮想マシン名>
仮想マシンを強制停止

virsh destroy <仮想マシン名>
仮想マシンの詳細情報を表示

virsh dominfo <仮想マシン名>
仮想マシンのコンソールに接続

sudo virsh console <仮想マシン名>

接続終了はCtrl+]

仮想マシンの定義を削除

sudo virsh undefine <仮想マシン名>

KVMのインストール

sudo apt -y install qemu-kvm libvirt-daemon-system libvirt-daemon virtinst bridge-utils libosinfo-bin

各種設定内容

ブリッジネットワーク

br0を作成します。

sudo vi /etc/netplan/50-cloud-init.yaml
network:
  version: 2
  ethernets:
    enp5s0:
      #addresses:
      #- "192.168.128.76/24"
      #nameservers:
      #  addresses:
      #  - 8.8.8.8
      #  search: []
      #routes:
      #- to: "default"
      #  via: "192.168.128.1"
      dhcp4: false
      dhcp6: false
  bridges:
    br0:
      interfaces: [enp5s0]
      dhcp4: false
      addresses: [192.168.128.76/24]
      routes:
        - to: "default"
          via: "192.168.128.1"
      nameservers:
        addresses:
        - 8.8.8.8
      parameters:
        stp: false
      dhcp6: false
  version: 2

IPアドレスは固定にしてあります。

以下のコマンドで変更を適用

sudo netplan apply

結果を確認

sudo ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether 9c:6b:00:3f:24:fd brd ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether ee:de:b5:7d:9e:4d brd ff:ff:ff:ff:ff:ff
    inet 192.168.128.76/24 brd 192.168.128.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 240a:61:528c:1672:ecde:b5ff:fe7d:9e4d/64 scope global mngtmpaddr noprefixroute
       valid_lft forever preferred_lft forever
    inet6 fe80::ecde:b5ff:fe7d:9e4d/64 scope link
       valid_lft forever preferred_lft forever
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:85:00:64 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
5: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UNKNOWN group default qlen 1000
    link/ether fe:54:00:3e:99:d6 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:fe3e:99d6/64 scope link
       valid_lft forever preferred_lft forever

GPUパススルー設定

GPUのデバイス情報を取得

sudo lspci -nn | grep -i nvidia
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA106 [GeForce RTX 3060 Lite Hash Rate] [10de:2504] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation GA106 High Definition Audio Controller [10de:228e] (rev a1)

grubを編集(CPUはAMD)
GRUB_CMDLINE_LINUX=を編集

sudo vi /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`( . /etc/os-release; echo ${NAME:-Ubuntu} ) 2>/dev/null || echo Ubuntu`
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX="amd_iommu=on iommu=pt vfio-pci.ids=10de:2504,10de:228e"

~以下略~
# grubを編集したら以下のコマンドで適用
update-grub
sudo vi /etc/modules-load.d/vfio-pci.conf
追記内容:
vfio-pci

sudo reboot

(これ忘れていて、だいぶ時間を無駄にしました)

設定の適用を確認

sudo  dmesg | grep -E "DMAR|IOMMU"
[    1.409236] pci 0000:00:00.2: AMD-Vi: IOMMU performance counters supported
[    1.452542] perf/amd_iommu: Detected AMD IOMMU #0 (2 banks, 4 counters/bank).
sudo dmesg | grep -i vfio
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-6.8.0-59-generic root=UUID=b9afd73c-f4d4-454a-99a2-04c7993dd16d ro amd_iommu=on iommu=pt vfio-pci.ids=10de:2504,10de:228e
[    0.043107] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-6.8.0-59-generic root=UUID=b9afd73c-f4d4-454a-99a2-04c7993dd16d ro amd_iommu=on iommu=pt vfio-pci.ids=10de:2504,10de:228e
[    4.152518] VFIO - User Level meta-driver version: 0.3
[    4.174842] vfio-pci 0000:01:00.0: vgaarb: deactivate vga console
[    4.174848] vfio-pci 0000:01:00.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=none
[    4.174964] vfio_pci: add [10de:2504[ffffffff:ffffffff]] class 0x000000/00000000
[    4.222683] vfio_pci: add [10de:228e[ffffffff:ffffffff]] class 0x000000/00000000

GPUパススルーで仮想マシンのインストール

sudo virt-install \
 --name ubuntu22 \
 --ram 8192 \
 --disk path=/var/kvm/images/ubuntu22.img,size=256 \
 --vcpus 4 \ --os-variant ubuntu22.04 \
 --network bridge=br0 \
 --graphics vnc,listen=0.0.0.0,password=password \
 --video vga \
 --console pty,target_type=serial \
 --location /home/ubuntu-22.04.2-live-server-amd64.iso,kernel=casper/vmlinuz,initrd=casper/initrd \
 --extra-args 'console=ttyS0,115200n8' \
 --host-device 01:00.0 \
 --features kvm_hidden=on \
 --machine q35

–disk path … ゲストOSのイメージファイル size=256の単位はGByte
–location … ゲストOSのインストールメディアのパス
–network bridge … ネットワーク あらかじめbr0を作成する必要あり。
–host-device … パススルーするデバイス(GPU)のPCIeアドレス パススルーを有効にする設定やアドレスを事前に調べる必要あり。

ゲストOSのインストール

仮想マシンのインストールコマンドを実行した後「Waiting for installation to complete.」と表示され、いつまでたってもセットアップが開始されませんでした。
実は仮想マシンは起動されており、別のコンソールから”仮想マシンのコンソールに接続”するとゲストOSのセットアッププログラムが実行します。初めてだと、なかなか気が付くことが出来ませんでした。

ゲストOSでGPUドライバーのインストール

GPUパススルーが成功していれば普通のドライバーのインストール手順でインストールすることが出来ます。

KVMとは関係のない話ですが、推奨ドライバーをインストールして
nvidia-smi
コマンドを実行し、ドライバーが適用されていると情報が表示されます。

その際、CUDAのバージョンが表示されるので、そのバージョンのCUDA Tool kitをインストールすると良いみたいです。

過去の記事と同じビデオカードで同じOSなので同じ手順を行おうとしたところ、GPUのドライバーのバージョンが異なるためか、CUDA Tool Kitのインストールが途中で失敗しました。
Ubuntu22.04にNvidia RTX3060のドライバーをインストールした話
マザーボード B365とCPU Core i3 9100F及びGPU RTX3060の組み合わせでUbuntu22.04にNvidiaのグラフィックドライバーとCUDA Toolkitをインストールしたお話です。さいしょに、Ubuntuのイ...

たまたま、自分の環境がそうだったかもしれませんが、バージョンは合わせておいた方が無難な感じがします。

感想

Ubuntu22.04上で動作するソフトウェア環境を保存するためKVMを導入してみましたが、GPUドライバーやCUDA Tool Kitは最新を導入するハメになり、たくらみは失敗に終わりました。これならDockerの方が良かったかもしれません。
ただ、ホストOSであるUbuntu24.04にはGPUのドライバーはインストールしていませんが、ゲストOSのUbuntu22.04はGPUを認識しているあたり、パススルーしていることが実感できます。せっかく動く環境が出来ましたので、必要なソフト関係をインストールして動くことを確認したいと思います。

コメント