検証用にProxmoxサーバーを建てる

いつか別で記事にするかもしれないけどそのための端書
動機 : 最近Tauriフレームワーク等の記事を書くにあたり、記事に書かれた内容の再現性の確認を取れる環境の需要が自分の中で増している。
Linuxを動かす仮想環境は色々あるけどもWindowsに関しては少ない。Windows Pro等であれば最初からWindowsサンドボックスが存在するが、この仮想環境は再起動ができず、ソフトウェアのインストール等の操作が挟まる場合検証には不向きである。
そこで、Windows仮想環境も構築できるという噂を聞きProxmoxサーバーを建てることとした。なお他の手段については未検討である。

公式サイト: https://www.proxmox.com/en/
どこか個人ブログ見ても良かったかもしれないけど詰まるまでは公式を参考にしてみる。
1. Download ISO image
最新版(執筆時点 Proxmox VE 8.0 ISO Installer )のISOイメージを公式から取ってくる。
起動用USBを作れとのことなのでその手のソフトでUSBに焼く。今回はbalenaEtcherを使用した。
ちなみに詳細は省くもののRufusだと上手く行かなかった。
(なおスクショを載せようか迷ったが特に迷うところがなかったので省略)

2. Boot from USB or CD/DVD
空っぽなSSD付きのまっさらな鯖にUSBを挿し、起動順序をUSB優先にして起動。
デフォルトで選ばれているグラフィカルを選択。
規約に同意。
「一番下で選ばれているTarget Harddiskに勝手にパーティション作ってインストールするけどおk?」といった内容。
選ばれているディスクが空のディスクであることを確認してNext
地域を選ぶ...こういうときいつも英語か日本語か迷うけどタイムゾーン優先で素直に日本にしておくのが吉
パスワードとEメールを指定。Eメールに色々通知してくれるらしい?便利
ホスト名とIPアドレス、ゲートウェイ、DNSサーバを聞かれる。LANで運用する場合ホスト名は好きに付けて良いのかな...?(その場合 .local
をつければ良いが、それで良いか要確認かも...あんまり良くない)
IPアドレス、ゲートウェイ、DNSサーバのIPアドレスはIPv4かIPv6かで統一されている必要がある。隠す必要はなかったけど一応黒塗りにしている
設定項目の要約が出る。問題がなければInstall!
待ちます。完了するとInstallation Success!という表示が出て(☑を入れていれば)再起動されます。
スクショ取り逃したorz

3. Configure the host machine
ここからはLAN上のPCからアクセスする。筆者の場合は、対象の8006ポートからアクセスできるよと案内された。
http :// ローカルIP :8006
こんな感じのURLを打つとログイン画面が出た。
「ユーザ名なんて設定していないが?」と思ったけどrootで良いらしい。良いのか
パスワードはインストール時に指定したものです。
有効なサブスクが無いと言われてもねぇ...こちとら始めたばかりなのですよ()
とりあえずUbuntuとWindowsの仮想環境を建てるところまでやってみます。
詰まったので検索...
ISOイメージをアップロードすれば良いみたい
右上のアップロードボタンを押すとファイル選択ダイアログが出るのでファイルを選んでアップロード
いい感じ
画面右上に「VMを作成」というあからさまなボタンがあるのでここからVMを作っていきます
他いっぱい設定項目があるけどとりあえず動かしたいだけなので全部デフォルトで!
起動したら「コンソール」タブから画面が見れます!
この後は普通にインストールして...なので次は本命のWindowsを確認して終わりたいと思います。

当初は簡単にWindows環境について記述して終わるつもりだったが、出来心で中古で買ってしまい持て余していたグラボGeForce GTX TITAN Xを導入しようと思ったところWindows環境を整える数倍面倒だったので、関連事項を先にメモすることにした。
このスクラップが無事に完成し、もし問題がなければ順番を並び替えるなりなんなりしようと思う。
SSHの確認とaptエラー対策
Proxmox環境自体で開発したり等はありえないものの、設定ファイルの編集はWeb管理画面だときついものがあるため、SSHからエディタでやってみる。
$ ssh root@ローカルIP
大抵のlinuxマシン同様デフォルトでsshdが立ち上がっているのでLAN内からなら容易にアクセスできる。Vimは苦手なのでついでにここでEmacsを入れておこうと思う
apt update
が無償版を使っているがゆえにエラーを吐いてしまうらしく次の記事に従い対応した
もう一個エラーになるリポジトリを参照していたらしく、/etc/apt/sources.list.d/ceph.list
の内容もコメントアウトする必要があった
-deb https://enterprise.proxmox.com/debian/ceph-quincy bookworm enterprise
+#deb https://enterprise.proxmox.com/debian/ceph-quincy bookworm enterprise

以降コマンドは管理者プロンプト #
であるとする。気をつけて打とう。
NVIDIAグラボをパススルーする
次の記事様がとても参考になった。というか色々参照するとむしろ迷う。
もう少し詳細が知りたい場合Arch wikiが詳しかった。(ProxmoxではなくKVMやQEMUに関連した記事)
なお公式のwikiもあり詳細も書かれていたが、英弱なのと本作業を行った時に予定がありあまり時間がなかったこともあり、一旦見なかったことにした(おい
Qiita記事そのままの内容を検証していく。
マザーボード(BIOS/UEFI)の設定
重要な操作です。
- VT-dの有効化 (必須)
-
プライマリグラフィックアダプターをPCIeからオンボードに変える
- もちろんオンボードGPU付きCPUが乗っている場合のみ。オンボードが無い時はパススルー対象のGPUがロックされないようになんとかする(2枚刺し等)
- どうしても上記が無理な場合、ROMの吸い出しが要るらしい...?(未検証)
- ここが一番難易度に影響しそう(オンボの映像出力が常に得られるかという点において)
- (1敗)
IOMMUの有効化
IOMMUとはwikipedia曰くメインメモリとPCIeデバイスの間に入る管理ユニットらしく、仮想メモリを扱えるようにするものらしい。有効化が必須の模様
ブートローダー(GRUB)の設定 ( /etc/default/grub
) を変更することで有効化する
-GRUB_CMDLINE_LINUX_DEFAULT="quiet"
+GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off"
筆者はi5-8500
を使用しているためintel_iommu=on
の方を追記した。AMDのRyzen等を使用している方はamd_iommu=on
とする。オプションに関する解説は元記事参照のこと
設定を反映する。
# update-grub
vfio-pci ドライバが読み込まれるようにする
記事ではここで再起動をするとグラボのHDMIから出力がなくなる、と書かれているが、筆者環境では普通に映った。おそらく仮想化用のドライバ( vfio-pci
)があてがわれていないからと思われる。実際、ここまでの段階では nouveau
が使われていた。
# lspci -v
...省略...
01:00.0 VGA compatible controller: NVIDIA Corporation GM200 [GeForce GTX TITAN X] (rev a1) (prog-if 00 [VGA controller])
...省略...
Kernel driver in use: nouveau
Kernel modules: nvidiafb, nouveau
記事に従い/etc/modules
と/etc/modprobe.d/blacklist.conf
にモジュールの設定を行う。
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
blacklist pcspkr
blacklist radeon
blacklist nvidia
blacklist nvidiafb
blacklist nouveau
blacklist amdgpu
blacklist vfio
ここで再起動してみたが変わらず。
Arch wikiの方と、元記事の後半を参照すると、text:/etc/modprobe.d/vfio.conf
への設定が必要な模様。
まず、 vfio-pci
ドライバをあてる対象となるグラボのベンダー/デバイスIDを控える。
# lspci -nn
...省略...
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GM200 [GeForce GTX TITAN X] [10de:17c2] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation GM200 High Definition Audio [10de:0fb0] (rev a1)
...省略...
/etc/modprobe.d/vfio.conf
に先程控えたデバイスを記述する
options vfio-pci ids=10de:17c2,10de:0fb0 disable_vga=1
vfio-pci
が先に読み込まれるように/etc/mkinitcpio.conf
に設定記述
MODULES=(vfio_pci vfio vfio_iommu_type1 vfio_virqfd)
HOOKS=(modconf)
CPUベースPCIeに挿している影響か(違うスロットでも映らず。)、プライマリグラボだけでなくCPUのオンボードからも映像出力が無くなってしまったが、設定を戻せば良いだけなのでとりあえずSSHできる今は良しとする。(こういう時のためにシリアルコンソールの使い方を知りたいかもしれない)
↑マザーボードの設定でオンボに出力を変更できることに気づいていなかった時の記述
残りの設定
やっておいた方が良さそうな設定をしておく。公式wikiにも書いてある設定だが、どのような効果があるかはよくわかってない。
/etc/modprobe.d/kvm.conf
へ設定:
options kvm ignore_msrs=1
/etc/modprobe.d/iommu_unsafe_interrupts.conf
へ設定:
options vfio_iommu_type1 allow_unsafe_interrupts=1

書かれているページが見当たらないが大事な設定、Resource Mappingsを行う。
左のタブで、データセンター > Resource Mappingsを選び、PCI Devicesを追加する。
...なにか警告が出ているが大丈夫なはず...
今度こそWindows仮想環境 with GPUを作成していく。(GPUを使わない環境は使わない環境で別に用意した方が良さそう)
だいぶ投稿が空いてしまったので、ストレージのISOイメージにOSのイメージをアップロードしなければならないことをリマインドしておく
「VMを作成」から、仮想環境を作成していく。
「システム」は参照している記事に合わせた。 GPUが「none」ということはつまりWeb上からは見ることができないということだが、それで合っている 。動かす時は物理的にグラボのHDMIから映像出力を得る。
一旦これで「完了」を押す。VMのタブを開いた後、「ハードウェア」からPCIeデバイスの追加等を行う。
USBポートは適当。
virtioドライバーが必要になるのでダウンロード後、OSイメージと同様にストレージ(local 某) > IOSイメージでアップロードし、CD/DVD ドライブから追加。このドライバーは例えばネットワークアダプター等を有効化するために使う。 🪟を右クリックしてデバイスドライバー > ⚠がついているデバイスに充てる。
追加後全体(諸事情で一部異なるかも)↓
最後に /etc/pve/qemu-server/(VM番号).conf
でcpuを編集
-cpu: host
+cpu: host,+kvm_pv_unhalt,+kvm_pv_eoi,hv_vendor_id=whatever,kvm=off,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time,smep\
=off,-pcid,-spec-ctrl,-ssbd,-hv-evmcs,+aes
起動して、パススルーしているグラボのHDMIから出力が得られれば成功。駄目な場合、ホストにGPUをロックされている可能性が高い。