幾度かの失敗を経て、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をインストールすると良いみたいです。

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