Mini PC で自宅サーバーをリプレイスしたい - (2) Proxmox インストール

まえがき

前回 はハードウェアのスペックなどを記事にしました。今回はいよいよホスト OS のインストールをしていきます。

Proxmox VE という 仮想プラットフォーム

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 をセットアップする際にやったことを書いて聞きたいと思います。

玄人志向の SSD/HDD ドライブケース(JMicron コントローラ)との相性問題?

今回の構成では Proxmox をホスト OS として稼働させ、その中のゲスト OS として OpenMediaVault で NAS(SMB) を構築していきます。

先の記事でも書いた通り、内蔵のストレージインターフェースが足りないので「SSD⇔USB 変換ケーブルを使用した外付けストレージによる Raid1 ミラーリング」を実現しようと考えました(下図参照)。

引用: Amazon 販売ページ

…で、玄人志向さんの SSD / HDD ドライブケースを買ってみた&組んでみたんですが…、どうにも動作がアヤシイ。いろいろ試行錯誤した結果を書いていきます。

① HDD と認識されたり、SSD と認識されたり、、はっきりしない

ホストマシンに 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
→ ルールを反映

常に スピンドルなし と認識されるようになりました。めでたしめでたし。

② USB デバイスが頻繁に再起動している...?

デバイスのフォーマットや書き込みを行うと、頻繁に 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 じゃなくなった

めでたしめでたし。

ゲスト OS 側でも N100 の iGPU を使えるようにしたい

どうやら、第 12 世代の Intel CPU に内蔵されている GPU も SR-IOV (Single-Root Input/Output Virtualization) に対応しているらしい。

SR-IOV とは「ホストに接続されている物理デバイスをハイパーバイザやゲスト OS に複数の個別デバイスとして認識させる技術」のことで、 つまるところどういうことかというと「ゲスト OS で GPU 資源が活用できる(=ゲームや機械学習がはかどる!?)」ということ。

ただし、実現できるカーネルやモジュールのバージョンがシビアとのことなので、動いたらラッキーぐらいに思っておくといい(私の環境では現時点で成功したように見えている…)。

環境バージョンなど
ホストカーネルLinux 6.5.11-7-pve
i915-srio-dkmscdb1399821e942db6fcc2b8322da72b517a9bc0d
ゲスト OSWindows 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 側のコンソールだとうまく行かないんですが、リモートデスクトップなどで接続してあげるとドラクエベンチなども走ります。

まぁ、ゲームとかはやらないけどハードウェア資産は利用できることに越したことはない。めでたしめでたし。

参考文献

SSD-USB の話

SR-IOV の話

© 2021 czu.jp