HouseServerProj 2 台目のミニ PC を購入し自宅サーバ環境をアップデートする (HouseServer-4) Proxmox の中に Proxmox VM を立てて複数クラスタを試す
はじめに
前回のノートでは Proxmox のなかに Proxmox VM を立ててクラスタを作成しました。 また、 ceph や cloud-init についても学びました。
このノートでは Proxmox に Windows VM を立ててゲームをプレイする、ことに挑戦します。
Windows VM を立てる
https://qiita.com/Bacalhau/items/e74af3bd39b51516e151 https://subro.mokuren.ne.jp/1872.html https://www7390uo.sakura.ne.jp/wordpress/archives/1702 https://zenn.dev/northeggman/articles/49c6b73c03c81c
上記 のサイトを参考にさせていただきました。
ISO をダウンロードする
Windows 11 の ISO ディスクイメージをダウンロードします。 https://www.microsoft.com/ja-jp/software-download/windows11 の URL から x64 向けの ISO を選択肢ダウンロードしています。
また、 virtio を Windows からも行えるように virtio-win という ISO をダウンロードしてドライバとして Windows にインストールできるようにします。 virtio や仮想化については下記を参考ください。
url: https://zenn.dev/junjunjunjun/articles/27ede76931cc85
title: "Virtioと完全仮想化・準仮想化"
host: zenn.dev
image: https://res.cloudinary.com/zenn/image/upload/s--Zpzu3zGL--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:Virtio%25E3%2581%25A8%25E5%25AE%258C%25E5%2585%25A8%25E4%25BB%25AE%25E6%2583%25B3%25E5%258C%2596%25E3%2583%25BB%25E6%25BA%2596%25E4%25BB%25AE%25E6%2583%25B3%25E5%258C%2596%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:junyaU%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzJmZWY4MzNkNjkuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png
url: https://www.slideshare.net/slideshow/20101126hbstudy17/5909512
title: "エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)"
description: "エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17) - Download as a PDF or view online for free"
host: www.slideshare.net
image: https://cdn.slidesharecdn.com/ss_thumbnails/20101126hbstudy17-101125111846-phpapp02-thumbnail.jpg?width=640&height=640&fit=bounds
virtio-win ISO は下記からダウンロードします。 https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
VM 設定をおこなう
windows11
& 201 にしました。
ご自身でよい名前& vmid にしていただければと。
Local Storage の Win11 ISO を選択します。
また、 Type
を Linux から Microsoft Windows に変更しました。
そして、追加の VirtIO Driver として virtio-win.iso を選択します。
EFI Storage そして TPM Storage には local-lvm を指定しました。 また、 Qemu Agent をインストールします。
Disk について参考記事では Write back を選択していましたが、デフォルトの No cache にしました。
割り当て領域は 256 GB と多めに割り当てています。
また、 Discard
を設定しています。おそらく、 windows で使わない領域があったらそれを削減して Thin Provisioning の領域を狭めてくれる設定だと考えています。
3 コアを割り当てました。 BMAX は 4 コア構成ですが、結構多めに割り当てました。
ひとまず 4096 MB にしています。 Windows VM を実行してみて重ければ 8192 MB ぐらいまで増やすかもしれません。
Windows VM をセットアップする
参考記事にもあったとおり Press any key...
という表示がでたためキーを入力しました。
合計 2 回ぐらい下記画面がでたため1回入力して成功した!と油断するとまずそうです。
Windows 11 セットアップが起動したため進めていきます。 画像の通りに設定しています。
プロダクトキーを入力する画面がでたため (HouseServer-1) 2 台目のミニ PC を購入したので Windows のライセンスや性能を確認する で控えていたライセンスを入力しました。 問題なく動作したようです。
続いて、インストール領域を設定する画面が出てきます。 まだ virtio-win ドライバをインストールしていないため、ホストから割り当てた scsi0 (256 GB) を認識していないようです。
そのため、 virtio-win ドライバをインストールします。
virtio-win の NetKVM > w11 > amd64
を選択してインストールします。
virtio-win は D ドライブとして認識されているようですね。
これでインストールされるのは RedHat 製 virtio イーサネットアダプタ のようです。
続いて amd64 > w11
をインストールします。
これは 同じく RedHat 製の SCSI パススルードライバのようです。
イーサネット & SCSI をインストールすることで HDD ディスクがちゃんと認識されるようになりました。
ディスク 0 の未割り当て領域を選択します。
インストールを開始します。
あとは普段のながれで Windows 11 の初期設定を行います。
D:/vioserial/w11/amd64
ドライバをインストールします。
これで VirtIO Serial Port 用のドライバをインストールできます。
このポートは qemu guest agent が利用するようです。
また、 D:/Balloon/w11/amd64
もインストールします。
VirtIO Ballooning という機能を有効にするためのドライバです。
ホストとゲスト OS 間で動的にメモリをやり取りするための仕組みです。
https://kvm.hatenadiary.org/entry/20081016/1224171825
qemu-guest-agent をインストールします。 これをインストールすることでホスト OS の Proxmox から Windows VM にいろいろな便利操作があります。 できるようになる操作については下記 Redhat を参照してください。
USB メモリや Bluetooth を使いたい場合は下記のように認識させる設定をおこなうとよさそうです。
さらに追加設定・インストールをおこなう
どうやら快適につかうためにはまだ設定が必要そうでした。
virtio-win-gt-x64.msi
を追加で実行します。
こちらを実行することで色々とドライバを勝手に有効にしてくれるようです。
この1つ前のステップで Balloon などを手動でインストールしていましたが、それらも自動でやってくれるようです。
https://www7390uo.sakura.ne.jp/wordpress/archives/1702
なんかいろいろ勝手にいれてくれそう!
続いて、 virtio-win-guest-tools.msi
をインストールします。
など必要な agent ツールを入れてくれます。
画像を取り忘れて再実行したため下記の画像のようになっていますが、普通にインストール画面が出るためインストールすればよいです。
設定が間違っていたので治す
https://pve.proxmox.com/wiki/Windows_2025_guest_best_practices
上記の 2025 best practices を参考に直します。
VirtIO SCSI single を選択していたため、 VirtIO SCSI に変更します。
No cache にしていましたが、 Write back に変更します。
解像度と音声ドライバを設定する
解像度を設定します。
NoVNC 自体の解像度は Windows VM BIOS の OUMF から設定できるようです。
Window VM を立ち上げたときに Esc
を入力すると BIOS に入れます。
また WIndows 自体のディスプレイ解像度を変えるために Display
を VirtIO-GPU
に変更します。
これは gemini に聞いたらそうしろと言われただけです。
VirtIO-GPU にしたところディスプレイ解像度を変更できるようになりました。
サウンドが一切設定されていないため、サウンドドライバを追加します。 Hardware から Audio Device として indel-hda, spice を追加しました。
ちゃんと Audio Driver が認識されています。
その後 SPICE クライアントで接続しようとおもったのですが、Macbook の Spice クライアントがうまく動きませんでした。 (HouseServer-2) MiniPC に Proxmox をインストールする で Linux に Spice 接続したときは macbook からちゃんと接続できたのですが…
Parsec を繋いでみる
parsec を Windows VM そして Macbook それぞれにインストールして、 Parsec 経由で接続してみます。
Windows VM に Parsec をインストールしようとしたところ、必要な仮想ディスプレイドライバが勝手に入りました。
macbook から接続自体はできたのですが The host is using software encoding.
とでており非常に遅く、音声や映像もプツプツになってしまいました。
考えられる原因は 2 つです。
- そもそも CPU が弱い
- 3 core をすべて使い切っている
- ただ、GPU がやるべき仕事を CPU がやっているためそれで重いのかも
- N150 の iGPU
Intel Corporation Alder Lake-N
を使えていない- dxdiag で Direct X のディスプレイをみると、 Red Hat VirtIO GPU DOD controller になっている
- 仮想 GPU であり、おそらくホストまたは WindowsVM の CPU が仮想的に実行している?
iGPU によるパススルーを設定する(失敗)
https://www.derekseaman.com/2024/07/proxmox-ve-8-2-windows-11-vgpu-vt-d-passthrough-with-intel-alder-lake.html https://www.technicalife.net/proxmox-sr-iov-gpu-passthrough/
SR-IOV はシングルルート仮想化 (Single Root I/O Virtualization) であり、 1 つの GPU を複数の VM からシェアできるようにする技術です。 また、 Intel 内蔵グラフィック (Intel HD Graphics) のドライバーが i915 のようです。 そして、 DKMS (Dynamic Kernel Module Support) はカーネルがアップデートされたときにカーネルモジュールを自動で更新してくれるシステムです。
下記コマンドは i915 ドライバに SR-IOV のパッチがあたったドライバーを得るためのコマンドです。
そして、 i915-sriov-dkms
を DKMS に登録しています。
apt update && apt install git sysfsutils pve-headers mokutil -y
rm -rf /usr/src/i915-sriov-dkms-*
rm -rf /var/lib/dkms/i915-sriov-dkms
rm -rf ~/i915-sriov-dkms*
find /lib/modules -regex ".*/updates/dkms/i915.ko" -delete
cd ~
git clone https://github.com/strongtz/i915-sriov-dkms.git
apt install build-* dkms
cd ~/i915-sriov-dkms
dkms add .
下記コマンドで i915-sriov-dkms モジュールを DKMS を利用して、コンパイルしたうえでカーネルモジュールディレクトリに登録します。 しかし、 kernel 6.8.12-11-pve 用のカーネルヘッダーが見つからずエラーになりました。
VERSION=$(dkms status -m i915-sriov-dkms | cut -d':' -f1)
dkms install -m $VERSION --force
dkms status
Sign command: /lib/modules/6.8.12-11-pve/build/scripts/sign-file
Binary /lib/modules/6.8.12-11-pve/build/scripts/sign-file not found, modules won't be signed
Error! Your kernel headers for kernel 6.8.12-11-pve cannot be found at /lib/modules/6.8.12-11-pve/build or /lib/modules/6.8.12-11-pve/source.
Please install the linux-headers-6.8.12-11-pve package or use the --kernelsourcedir option to tell DKMS where it's located.
i915-sriov-dkms/2025.05.18: added
エラーに書いてあるように kernel header をインストールしたうえで再度実行します。 無事正常にインストールできました。
root@pve:~/i915-sriov-dkms# apt update
apt install pve-headers-6.8.12-11-pve
Hit:1 http://security.debian.org/debian-security bookworm-security InRelease
Hit:2 http://deb.debian.org/debian bookworm InRelease
Hit:3 http://deb.debian.org/debian bookworm-updates InRelease
Hit:4 http://download.proxmox.com/debian/pve bookworm InRelease
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
27 packages can be upgraded. Run 'apt list --upgradable' to see them.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Note, selecting 'proxmox-headers-6.8.12-11-pve' instead of 'pve-headers-6.8.12-11-pve'
The following NEW packages will be installed:
proxmox-headers-6.8.12-11-pve
0 upgraded, 1 newly installed, 0 to remove and 27 not upgraded.
Need to get 13.7 MB of archives.
After this operation, 97.2 MB of additional disk space will be used.
Get:1 http://download.proxmox.com/debian/pve bookworm/pve-no-subscription amd64 proxmox-headers-6.8.12-11-pve amd64 6.8.12-11 [13.7 MB]
Fetched 13.7 MB in 16s (833 kB/s)
Selecting previously unselected package proxmox-headers-6.8.12-11-pve.
(Reading database ... 95239 files and directories currently installed.)
Preparing to unpack .../proxmox-headers-6.8.12-11-pve_6.8.12-11_amd64.deb ...
Unpacking proxmox-headers-6.8.12-11-pve (6.8.12-11) ...
Setting up proxmox-headers-6.8.12-11-pve (6.8.12-11) ...
root@pve:~/i915-sriov-dkms#
root@pve:~/i915-sriov-dkms# VERSION=$(dkms status -m i915-sriov-dkms | cut -d':' -f1)
dkms install -m $VERSION --force
dkms status
Sign command: /lib/modules/6.8.12-11-pve/build/scripts/sign-file
Signing key: /var/lib/dkms/mok.key
Public certificate (MOK): /var/lib/dkms/mok.pub
Certificate or key are missing, generating self signed certificate for MOK...
Building module:
Cleaning build area...
make -j4 KERNELRELEASE=6.8.12-11-pve -C /lib/modules/6.8.12-11-pve/build M=/var/lib/dkms/i915-sriov-dkms/2025.05.18/build........................................................
Signing module /var/lib/dkms/i915-sriov-dkms/2025.05.18/build/i915.ko
Signing module /var/lib/dkms/i915-sriov-dkms/2025.05.18/build/kvmgt.ko
Cleaning build area...
i915.ko:
Running module version sanity check.
- Original module
- Installation
- Installing to /lib/modules/6.8.12-11-pve/updates/dkms/
kvmgt.ko:
Running module version sanity check.
- Original module
- Installation
- Installing to /lib/modules/6.8.12-11-pve/updates/dkms/
depmod....
i915-sriov-dkms/2025.05.18, 6.8.12-11-pve, x86_64: installed
`i915-sriov-dkms/2025.05.18, 6.8.12-11-pve, x86_64: installed installed とでており正常にインストールされています。
後の工程でセキュアブートするときに必要なコマンドです。 ここで、パスワード設定が求められるため新しいパスワードを設定します。 自分は root パスワードと同じものを設定しました。
mokutil --import /var/lib/dkms/mok.pub
下記コマンドで iGPU (SR-IOV) を Proxmox の GRUB ブートローダに設定しているようです。
root@pve:~/i915-sriov-dkms# cp -a /etc/default/grub{,.bak}
sudo sed -i '/^GRUB_CMDLINE_LINUX_DEFAULT/c\GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7"' /etc/default/grub
update-grub
update-initramfs -u -k all
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.8.12-12-pve
Found initrd image: /boot/initrd.img-6.8.12-12-pve
Found linux image: /boot/vmlinuz-6.8.12-11-pve
Found initrd image: /boot/initrd.img-6.8.12-11-pve
Found linux image: /boot/vmlinuz-6.8.12-9-pve
Found initrd image: /boot/initrd.img-6.8.12-9-pve
Found memtest86+ 64bit EFI image: /boot/memtest86+x64.efi
Adding boot menu entry for UEFI Firmware Settings ...
done
update-initramfs: Generating /boot/initrd.img-6.8.12-12-pve
Running hook script 'zz-proxmox-boot'..
Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync.
update-initramfs: Generating /boot/initrd.img-6.8.12-11-pve
Running hook script 'zz-proxmox-boot'..
Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync.
update-initramfs: Generating /boot/initrd.img-6.8.12-9-pve
Running hook script 'zz-proxmox-boot'..
Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync.
ここで、 PIC PCIe をリストアップして、 VGA、つまりグラフィック要素を持つ PCI デバイスを控えておきます。 PCIe スロットにグラフィックカードや SSD などのデバイスが接続されており、今回の iGPU を取得したいためです。
自分の環境だと 00:02.0
でした。
root@pve:~/i915-sriov-dkms# lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N [Intel Graphics]
システム起動時に SR-IOV の仮想関数を設定できるように sysfs.conf に設定を追加します。
ブログだと 7
が設定されていましたが、そんなに VM を立てないので 3 にしています。
→ 2 に変えました。
echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 3" > /etc/sysfs.conf
root@pve:~/i915-sriov-dkms# cat /etc/sysfs.conf
devices/pci0000:00/0000:00:02.0/sriov_numvfs = 3
その後記事の通りの Enroll MOK し reboot しました。 しかし、下記のように Alder Lake-N が仮想的に増えておらず、 iGPU (vt-d) されていません。
root@pve:~# lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N [Intel Graphics]
root@pve:~# dmesg | grep i915
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-6.8.12-12-pve root=/dev/mapper/pve-root ro quiet intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7
[ 0.044701] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-6.8.12-12-pve root=/dev/mapper/pve-root ro quiet intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7
なにが原因か?
前の節のように、結局 BMAX B4 Turbo n150 で自分の環境だと SR-IOV がうまく動作しませんでした。 1日ほどずっと試行錯誤したのですがうまくいかず…。
https://forum.proxmox.com/threads/intel-n150-gpu-passthrough.160477/
色々と n150 GPU passthrough を調べたのですが、うまくいった、という記事が見つけられませんでした。 iGPU (Intel Graphics) が悪いのか、自分の手順が悪いのか、それともマザーボード (BMAX) が対応していないのか…。
必ず VM 上でゲームがしたいわけではないし、おそらくやらないためうまく動作しなくてもよいのですが悔しいですね…
1 年ほど置いて n150 におけるパススルーの記事がでてきたら再度試そうと思います。
まとめ
- Windows VM を立てるときは virtio-win が必要になる
- Linux にはデフォルトで VirtIO フレームワークが設定されている
- 準仮想化フレームワーク
- ゲスト OS とハイパーバイザーが直接通信することで効率化している
- Linux にはデフォルトで VirtIO フレームワークが設定されている
- Windows VM では色々と Hardware 設定を丁寧に行う必要がある
- gpu パススルーには 2 種類ある
- 普通の GPU パススルー
- ある 1 つの VM がホストの GPU を占有する
- SR-IOV (VT-d) によるパススルー
- 1 つの GPU を N 個に仮想化する
- 複数の VM が共有して利用できる
- 普通の GPU パススルー
- n150 だとうまく動かなかった…
- 色々と記事が出揃ったら再度チャレンジする
次のノートでは terraform の導入を行います。 ひとまず proxmox 編は次でおそらく終わりになり、その後は terraform で立てた ubuntu-server に ansible でセットアップを自動化する、などをやることになるとおもいます。