前回 はハードウェアのスペックなどを記事にしました。今回はいよいよホスト OS のインストールをしていきます。
Proxmox Virtual Environment is a complete open-source platform for enterprise virtualization. With the built-in web interface you can easily manage VMs and containers, software-defined storage and networking, high-availability clustering, and multiple out-of-the-box tools using a single solution.
引用: Proxmox 公式
ということで、ざっくり要約すると、KVM ハイパーバイザによる完全仮想環境、Linux コンテナ(LXC)によるコンテナ仮想環境を提供するオープンソースの仮想化プラットフォームということで、仮想マシンや仮想ネットワーク、HA クラスタなどを専用 Web UI から簡単に操作することができるステキ環境です。
KVM や LXC が扱えるということから推察できる通り、ベース OS は Linux(おそらく Debian 系)になっているので、 なにか込み入った設定をしたい場合やトラブルが発生した場合には Linux 周りの知見が活かせるのがいいところです。
細かなインストール方法などは他の方の記事に譲るとして、この記事では Trigkey G5 をセットアップする際にやったことを書いて聞きたいと思います。
今回の構成では Proxmox をホスト OS として稼働させ、その中のゲスト OS として OpenMediaVault で NAS(SMB) を構築していきます。
先の記事でも書いた通り、内蔵のストレージインターフェースが足りないので「SSD⇔USB 変換ケーブルを使用した外付けストレージによる Raid1 ミラーリング」を実現しようと考えました(下図参照)。
…で、玄人志向さんの SSD / HDD ドライブケースを買ってみた&組んでみたんですが…、どうにも動作がアヤシイ。いろいろ試行錯誤した結果を書いていきます。
ホストマシンに USB 接続すると、Hard Disk と認識されたり SSD と認識されたりする。具体的には lsblk コマンドを発行したときに、SSD なのに ROTA = 1 (スピンドルあり=HDD) と認識される。
# lsblk -o name,model,rota
NAME MODEL ROTA
sda SA66002TBY3G1 0 ← これが 1 だったり 0 だったり…
sdb SA66002TBY3G1 0 ← これが 1 だったり 0 だったり…
nvme0n1 CT2000P2SSD8 0
├─nvme0n1p1 0
├─nvme0n1p2 0
└─nvme0n1p3 0
さしあたっての実害は無いみたいなのですが、一応正しく認識させるために udev ルールを調整して強制的に ROTA = 0 (スピンドルなし=SSD) として認識させるようにしました。
# udevadm info -a -p $(udevadm info -q path -n /dev/sda)
→ 引っ掛けられそうな属性を探す
# vim.tiny /etc/udev/rules.d/00-sdx.rules
ACTION=="add|change", ATTRS{serial}=="370000000620", ATTR{queue/rotational}="0"
ACTION=="add|change", ATTRS{serial}=="3700000006A0", ATTR{queue/rotational}="0"
→ ATTRS の属性を引っ掛けて、無理くり rotational の値を 0 に上書きする
# udevadm control --reload
→ ルールを反映
常に スピンドルなし と認識されるようになりました。めでたしめでたし。
デバイスのフォーマットや書き込みを行うと、頻繁に IO がフリーズしてしまう現象が多発した。
裏側で dmesg を眺めていると頻繁にデバイスがリセットされているようで、どうやら USB3.0 から登場した UAS (USB Attached SCSI) とストレージコントローラーの相性問題が発生している模様。
# dmesg
:
(略) uas_eh_device_reset_handler success # ← デバイスが頻繁にリセットされてるっぽい。このログがめっちゃ出る。
:
実際に USB に接続されているデバイス情報を見るとこんな感じで、Driver として UAS が当てられていることがわかる。
# lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 10000M
|__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=uas, 10000M # ← Driver が uas になってる
|__ Port 2: Dev 3, If 0, Class=Mass Storage, Driver=uas, 10000M # ← Driver が uas になってる
この場合、UAS を除外して、従来の usb-storage をドライバとして読み込ませることで現象が回避できるとのこと。
ネット上では Raspberry Pi 界隈で SSD ⇔ USB 接続している場合にもよく発生する問題のようで、 起動時のコマンドラインによる抑止方法が多く見つかるが、今回は通常の PC なのでデバイス接続時のモジュールのロードの際にドライバを差し替える方法で対応する。
# echo "options usb-storage quirks=152d:0562:u" >> /etc/modprobe.d/usb-storage-quirks.conf
→ 152d がベンダーID、0562 がデバイスID に相当する(要するに今回の玄人志向の SSDケース のこと)。
ちなみに UAS ドライバのほうが動作が高速らしいのだが、対処後もそれほど性能の劣化は感じられないので、まぁ、これで良しとする。
# lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 10000M
|__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 10000M # ← uas じゃなくなった
|__ Port 2: Dev 3, If 0, Class=Mass Storage, Driver=usb-storage, 10000M # ← uas じゃなくなった
めでたしめでたし。
どうやら、第 12 世代の Intel CPU に内蔵されている GPU も SR-IOV (Single-Root Input/Output Virtualization) に対応しているらしい。
SR-IOV とは「ホストに接続されている物理デバイスをハイパーバイザやゲスト OS に複数の個別デバイスとして認識させる技術」のことで、 つまるところどういうことかというと「ゲスト OS で GPU 資源が活用できる(=ゲームや機械学習がはかどる!?)」ということ。
ただし、実現できるカーネルやモジュールのバージョンがシビアとのことなので、動いたらラッキーぐらいに思っておくといい(私の環境では現時点で成功したように見えている…)。
環境 | バージョンなど |
---|---|
ホストカーネル | Linux 6.5.11-7-pve |
i915-srio-dkms | cdb1399821e942db6fcc2b8322da72b517a9bc0d |
ゲスト OS | Windows 11 23H2 ビルド 22631.2861 |
ゲストドライバ | Intel Graphics Driver 31.0.101.5084 (gfx_win_101.5084_101.5122.exe) |
基本的には参考文献に掲載させていただいた手順通りになるのだが、ざっと私の環境で実施した手順を記しておきます。
まずは必要なパッケージ類をインストール
# apt install git dkms build-* unzip sysfsutil -y
DKMS のソースをリポジトリから取得
# mkdir repo
# cd repo
# git clone https://github.com/strongtz/i915-sriov-dkms.git
# cd i915-sriov-dkms/
ビルド用にカーネルのバージョンなどを下記の通りに指定する
# cat dkms.conf
----
PACKAGE_NAME="i915-sriov-dkms"
PACKAGE_VERSION="6.5"
----
ソースコードを所定の場所に移してビルド
# cp -rp i915-sriov-dkms/ /usr/src/i915-sriov-dkms-6.5
# dkms install --force -m i915-sriov-dkms -v 6.5
DKMS のステータス確認
# dkms status
----
i915-sriov-dkms/6.5, 6.5.11-7-pve, x86_64: installed
----
カーネルパラメータへの追加
# vim.tiny /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=2"
(※ max_vfs が仮想デバイス数。MAX で 4個まで生やせるけど、1個あたり RAM を 2GB 消費するらしいので程々に。)
GRUB を使用しているので ブートイメージを更新
# update-grub
# update-initramfs -u
デバイスのPCIeバスを確認
# lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics]
仮想デバイスを生やすおまじない
# echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 2" >> /etc/sysfs.conf
再起動するとデバイスが生えてる!!
# lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics]
00:02.1 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics]
00:02.2 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics]
あとは VM 側でデバイスを認識できるようにパススルーの設定をして、ゲスト OS 側でドライバをインストールしてあげれば OK です。 Proxmox 側のコンソールだとうまく行かないんですが、リモートデスクトップなどで接続してあげるとドラクエベンチなども走ります。
まぁ、ゲームとかはやらないけどハードウェア資産は利用できることに越したことはない。めでたしめでたし。