PowerEdge T330/PERC H330環境でPVE 8がEFI stubうんちゃらで起動できない件
PowerEdge T330とITファームを書き込んでHBA化したPERC H330環境で、H330に接続したストレージにインストールしたProxmox VE 8.0-2を起動しようとすると、EFI stub: Loaded initrd from LINUX_EFI_INITRD_MEDIA_GUID device path
と出て止まってしまう。マザボから生えてる内蔵SATAの方だと問題ない。
PVEのフォーラムでも同様の現象が報告されている。
ZFSがらみの何かっぽくext4なら大丈夫らしい。根本的な解決策は見当たらないが、PVE 7をインストールしアップデートでPVE 8にした場合は起動するそうで、試しにやってみたら確かに問題なくPVE 8が立ち上がった。すんごい気持ち悪いんですけど。
BIOSとiDRACあたりとの相性かと思い数時間かけて頑張って更新したが、完全な無駄足になってしまった…。更新後はJava版の仮想コンソールが何故か起動に失敗すること多いし、PVEで仮想コンソールのキー入力が全く効かないわ、ACPIシャットダウンが機能しないわでマジで意味がわからん。ただの無駄足であってくれた方がなんと良かったことか……
一応PVEの動作に問題はなさそうだけど、どうしたものか。
Proxmox VEで仮想ディスクを4Knデバイスとして扱う
Proxmox VEの仮想ディスクは、仮想マシンから512バイトセクタのストレージとして見える。正確にはQEMUのデフォルト挙動で、仮想環境における極々一般的な挙動なので普通に使う分には困らないし、意識すらしないだろう。
じゃあどんな時に困るかというと、物理・論理セクタサイズの両方が4096バイトの、いわゆる4KnデバイスをRDMでVMにアタッチする場合や、4Kn環境をそのままP2Vした時のディスクイメージとかで困る。例えばパーティションテーブルなんかはLBA(セクタ番号)で管理されているので「パーティション1はセクタ1~262144」という設定は、4kセクタ環境なら1GiB、512バイトセクタ環境なら128MiBのパーティションを表すことになり、だいぶマズいわけですよ。(そもそも、GPTの配置自体が“LBA 1”と規定されているのでセクタサイズが合ってないとパーティションテーブル自体が正しく認識されない。)
というわけで、仮想ディスクを4Knとして認識させるには、/etc/pve/qemu-server/VMID.conf
をエディタで直接編集し、args:
に下記の設定を追加してやればよい。
args: -set device.scsi0.physical_block_size=4096 -set device.scsi0.logical_block_size=4096
scsi0
の0の部分はSCSI IDなので任意に読み替え可能で、複数のデバイスも同様に設定が可能。SATAやvirtio-blkも行けると思うけど未確認。
説明するまでもないだろうが、物理と論理のセクタサイズをそれぞれ4096に指定してあげればよい。物理4096, 論理512にすれば512e扱いになるかも?
上記設定を行った4KnのSSD×3、512eのHDD×5をRDMしてる当方の仮想環境では、想定通りに認識されている。
$ dmesg | grep sectors da0: 2969600MB (760217600 4096 byte sectors) da1: 2969600MB (760217600 4096 byte sectors) da2: 2969600MB (760217600 4096 byte sectors) da3: 17166336MB (35156656128 512 byte sectors) da4: 17166336MB (35156656128 512 byte sectors) da5: 17166336MB (35156656128 512 byte sectors) da6: 17166336MB (35156656128 512 byte sectors) da7: 17166336MB (35156656128 512 byte sectors) cd0: 998MB (511254 2048 byte sectors)
また一つ、どーでもよいノウハウがたまってしまった。
参考サイト
空き容量0でZFSが壊れた?Input/Output errorが発生→再起動で直った
不注意でProxmox VEのZFSプールを使い切り、空き容量がゼロという状態になってしまった。すべてのデータセットのAVAILが0という本物のゼロである。VMのディスクがthinで図らずもオーバーコミット状態となっており、VM内で物理容量以上のファイルコピーを行ってしまったのが原因。当然ながらVMは固まるわ、PVEもWebコンソールから何もできないわで超焦った…。
幸い物理コンソールは生きていたので、不要なZVOLを消して事なきを得たと思いきや、ファイル操作をするとInput/output errorが起きるようになってしまった。
root@myserver:/etc/pve/nodes/myserver/qemu-server# touch test touch: cannot touch 'test': Input/output error
ファイル/ディレクトリの作成、削除がダメ。既存ファイルの読み込みは問題なさそうで、書き込み系がダメっぽい。それもすべての場所でダメというわけではなく、ルートディレクトリ直下は大丈夫だったりする。同じデータセットなのに。
もちろんzpool scrub
でエラーが出ないことは確認済み。というわけで実に厄介というかヤバい状況なのであーる。どうすんのこれ…
関係しそうなバグチケ報告もあるにはある。
が、ほとんど関係ない気がしなくもない。うちはサイレントじゃないし。実は静かに壊れてて今回ので発現した可能性もあるが、ほんの数日前にVM追加してるしちょっと考えにくい。FreeBSDの方では何だかんだ10年ほどZFSを使っているが、データが壊れたのはそれなりに原因が分かっている2回しかない(1回目、2回目)。
容量ゼロをトリガーにLinux側とZFS側で何らかの齟齬が発生し、容量の回復がLinux側に伝わってないとかが原因なら再起動で直りそうなものの、シャットダウンしたが最後、完全に壊れてPVEが立ち上がらなくなる可能性もありそうで恐ろしい。この記事も書いているメイン環境は、そのPVE上で動いているのでPVEの死=メイン環境の死なので慎重にならざるを得ない。
(2021-11-24 追記)
意を決してPVEマシンを再起動してみたら、Input/output errorは出なくなった。何事もなかったようにVMも動いている。
ZFSではCoWの関係上、一般的に空き容量がプール容量の10~20%1)を切ると危険水域とされている。予めプール全体にquotaをかけておけば、今回のようなヤベェ自体は予防できるだろう。
メインPCとサーバをP2VしてRyzenおじさんからHaswellおじさんになった
住環境が変わって、メインPCと自宅サーバを同じ部屋に置くことになった。
自宅サーバは無駄に高スペックだったが(といっても逸般の誤家庭の人からは鼻で笑われる程度)、ほぼ自分専用のFreeBSDなNASやNextcloudサーバ程度にしか使ってなかった。まさに性能と電気代の無駄遣い状態。それでもPCと鯖を分けていたのは、煩い鯖を居住空間内に置いときたくなかったから(っていうのと自宅鯖という物理体に憧れがあったから。)
その制約がなくなった今──ある意味、自室にサーバを置かざるを得ない最大の制約が課されたとも言えるが、マシンを分ける意義がなくなったので、統合することにしたのが2020年10月。付けっぱなしの鯖と、寝てるとき以外はほぼ付けてるメインPCを1台にまとめれば、PCがいつでも使えるようになって電気代も節約できて一石二鳥という皮算用もあった。
その後、数々の検証と困難を乗り越え、ようやくProxmox VE基盤でメインPCと家鯖の仮想化による統合が完了した。このところ、PVEや仮想化関連の更新をしまくってたのはこのせい。旧メインPCは解体の後、パーツ類はヤフオクにドナドナされ、名実ともにRyzenおじさんからHaswell-EPおじさんにダウングレードだ😇
統合にあたっては、家鯖マシンをPVE基盤に流用した。本当はEPYCに変えたかったけどお金がないのさ…。そうは言っても、メインマシンとして使うにはCPUが心許なかったのでヤフオクお安く調達。ストレージまわりも整理した。
変更前 | 変更後 | |
---|---|---|
CPU | Xeon E5-2648Lv3 (1.8GHz/12C/24T) ×2 | Xeon E5-2673v3 (2.4GHz/12C/24T) ×2 |
SSD | PM983 960GB ×2 | PM963 1.92TB ×2 |
HDD | WD80EMAZ ×2 (ミラー) 色々8TB ×4 (RAID-Z) | ST10000NM0086 ×5 (RAID-Z2) |
旧メインマシンの構成は下表のとおり。
CPU | Ryzen 7 1700 |
---|---|
M/B | X370 SLI Plus |
RAM | DDR4-3200 16GB×4 = 64GB |
GPU | GeForce RTX 2070 SUPER |
SSD | WD Black SN750 500GB (NVMe) |
SSD | 東芝 THNSNJ960PCSZ 960GB (SATA) |
NIC | ConnectX-3 Pro EN |
仮想化後のマシン構造は下図のとおり。
仮想化という割には、パススルーやらRDMやらで物理とがっつり密結合してる。今後収容予定のルータは、正しく仮想マシンになる予定(SR-IOVのVFを除く)。
2ヵ月ほど使った感想としては、物理環境と遜色なく使えている。ハード的な性能は旧メイン機から間違いなく下がっており、当初こそブラウザの若干のもたつきを感じこそすれど気のせいないし慣れの範疇で、今は何の不満もない。3Dのゲームも動くし、USB DAC経由でiTunes再生、NVEncも問題なし。
改めて第10世代Coreと2070 SUPERなマシンを触ってみたら、ブラウザの表示がチョッパヤで驚いた…。P2V後のもたつきは気のせいではなかった。リンクをクリックした際、前者はまさにパッと表示が切り替わるのに対し、後者はわずかな空白期間があってからパッと出る感じ。
GPUはGeForce RTX 2070 SUPERからGTX 1650へと大幅ダウングレードしているが、これは3060への乗り換えを見越しての措置。折からのGPU不足による中古価格上昇で、2070の売却代でオトクに3060へ乗り換えるつもりだった。が、いざ蓋を開けてみると3060は微妙な感じだし、今なお2070Sの中古価格は上昇傾向だしで、正直売らなきゃよかった……。
仮想メイン環境をPVEで自動起動設定すれば、ホストマシン電源オンでゲストのWindowsも起動する。また、ゲストエージェントを入れとけば、ホストのシャットダウンも何てことはない。ゲストのブラウザからPVE管理画面を開き、ホストをシャットダウンすれば自動でWindowsのシャットダウン処理が走り、その後ホストの電源が切れる。再起動も同様だ。こうした使い勝手の面でも、物理環境と大差なくて素晴らしい。
メインマシンを仮想化する上での最大の障壁はGPUだが、Proxmox VE (KVM)を使えば難なくGPUパススルーできる。仮想BIOSの画面が物理モニタに映し出された時は妙な感動を覚えた。
USBまわりはPCIパススルーでコントローラをVMに割り当てると、普通の物理マシンの感覚で使えてよい。
今回はネットワークまわりも、SR-IOVでもって物理デバイスのように扱っている。対向のL3スイッチからはVMが直接接続されているように見え、構成的に綺麗な気がする。何よりソフトウェアブリッジを使わずに済むので、パフォーマンス的にも負荷的にも有利である。
仮想化技術さまさまですわ。
電気代削減効果はちょっと微妙かなぁ。VM起動したアイドル状態で140W程度。理想は100W切ってほしいけど、CPU 2個に32GBのRDIMM 6本、GPU/NIC/USB/U.2×2 PCIeを差してるし、むべなるかな。
状態 | 消費電力 | メイン機 アイドル | 合計 | |
---|---|---|---|---|
旧サーバ | 待機(HDDスピンダウン) | 100W | 40W | 140W |
待機(HDD×6スピンアップ) | 130W | 170W | ||
新サーバ | 待機(HDDスピンダウン) | 120W | - | 120W |
待機(HDD×6スピンアップ) | 140W | 140W |
※新サーバのHDDが5台ではなく6台なのは間違いではない。
一応、トータル30W程度の節電だけど、旧サーバのデータは不正確なので怪しいところ。1ヵ月で21kWh節電の計算となるが、現状目に見えて電気代が安くなったとかはない。在宅勤務でおうち時間が長くなってる影響が大きいのかも。今更ながら、140Wで1ヵ月だと100kWhか…馬鹿にならんな……。
その他、メイン機を仮想化した際に気になったこと、運用上の注意点は以下に箇条書きで。
- GPUパススルー
- ネットに転がってる解説記事に従って難なく可能
- 一部記述が古かったり、曖昧だったりする箇所があるのは要注意
- プライマリディスプレイが4kモニタだと、EFIからOSに制御が移った時にコケる。WUXGAモニタだと問題なし。
- (2022-01-12 追記) PVE 7にしたらROM-Barオンでも仮想BIOS→Windowsログイン画面の遷移も問題なくなった、
- 仮想マシンの仮想BIOS表示→Windowsの起動ロゴまでは映るが、ログイン画面に切り替わるあたりで無信号状態になる。
- それでもWindows自体は正常に起動している。
- ROM-Bar (GPUのBIOS)を切ると、仮想BIOS→Windowsの起動ロゴは出なくなる代わりに、ログイン画面が出るようになる。
- 仮想BIOSを弄ることは早々ないので、ROM-Barオフで運用。ログイン画面が出るまで真っ暗なのでちょっと不安ではあるけど。
- GeForce RTX 2070 SUPER、GTX 1650で確認。ラデは知らん。
- ネットワーク
- ConnectX-3のSR-IOVをパススルーで利用
- WindowsからNICとして認識されリンクアップしているものの、パケットが流れないことがある。
- 何度か仮想マシンを再起動すると直る。一度直ればVMを落とすまで大丈夫。
- 多少不便だけどログイン画面で判断できるので許容内。
- なぜかiTunesのネットワークまわりの挙動が怪しい。
- Gracenoteに繋がらない(そもそもネットワークが繋がってない判定を食らう)
- 別マシンからホームシェアリングで繋ぎ、切断後再接続すると接続が打ち切られ、ライブラリから表示が消える。
- iTunesを再起動すると繋がるようになる。
- virtio-netだと問題なし。
- ネットワークの状態ダイアログの送受信パケット数カウンターが動いてないのが原因?
- これ自体はドライバのバグっぽい:PVEとConnectX-3とWindowsでSR-IOVが使えないのはMLNX_OFEDが古いせい
- VFとLinux Bridge (vmbr0)にぶら下がっている仮想NICの間で疎通できないかも?
- vmbr0のFDB2)にVFのMACアドレスが載らないのが原因らしい?
- USBパススルー
- マザボのUSBコントローラをPCIパススルーでも行けるが、後付けしたUSBカードをパススルーする方が無難。
- (IPMIの)KVMの入力がパススルー先のVMに持っていかれ、KVMが用を成さなくなるから。
- 仮想マウスと仮想キーボードは内部的にUSB接続されているのだ。
- いざという時に困る(PVEのWeb UIが応答しなくなって、物理ターミナル経由でrebootしなきゃいけないときとか)
- マザボのUSBはPCIデバイス的にはUSB 2.0/3.0が別々に認識され、片方のみパススルー設定できるが、結局両方ともパススルーされる模様。
- USBのパケットが途切れることがあるっぽい
- キー入力、マウスカーソルがプチフリすることがある。地味にイラつくが致命的ではない。
- USBサウンドがたまにプチプチ切れる。地味に(ry
- スリープ、ダメ、ゼッタイ
- VM(のWindows)をスリープさせたが最後、復帰できなくなるのでスリープさせてはいけない。
- 少なくともパススルーしてるUSBマウス・キーボードをガチャガチャでは復帰せず
- PVEの管理画面から何か叩けば行けるかも?
- (2022-01-12 追記) 管理画面からスリープ解除するとVM自体は起き上がるようだが、やはり画面が出ない。
- モニタのスリープは大丈夫。
PVEとConnectX-3とWindowsでSR-IOVが使えないのはMLNX_OFEDが古いせい
Proxmox VE 6.3のWindows 10ゲストでConnectX-3のSR-IOVが機能しないのは、PVE内蔵のmlx4ドライバが激古なのが原因のようだ。正確にはLinuxのインボックスドライバだが。
この状態だと、SR-IOVは有効でWindows側にVirtual Functionが生えているにもかかわらず、コード43となって、どうあがいてもデバイスが動かない。PVE側では以下のようなログが出る。
mlx4_core 0000:01:00.0: vhcr command:0x43 slave:1 failed with error:0, status -22 mlx4_core 0000:01:00.0: Received reset from slave:1
“Mellanox OFED for Linux Archived Bug Fixes”を眺めると、Internal Ref 1178129に、まさにそれっぽいバグが載っていた。
Description: Fixed an issue that prevented Windows virtual machines running over MLNX_OFED Linux hypervisors from operating ConnectX-3 IB ports.
When such failures occurred, the following message (or similar) appeared in the Linux HV message log when users attempted to start up a Windows VM running a ConnectX-3 VF:
“mlx4_core 0000:81:00.0: vhcr command 0x1a slave:1 in_param 0x793000 in_mod=0x210 op_mod=0x0 failed with error:0, status -22”
バグはIBポート、うちはEthポートという違いがあるが、状況としては極めて近い。この問題はMLNX_OFED v4.2-1.2.0.0で修正済みで、2021-02-10現在の最新版はv4.9-2.2.4.0 LTSであるから、とっくの昔に解決済みのハズである。
そんなバグに何で今更遭遇するの~?と思いきや、Linuxのインボックスドライバはなんとv4.0相当という事実が判明/(^o^)\ Kernel.orgのBugzillaでも指摘されてるが、ガン無視の模様…。
しゃーないので自前ビルドしたら無事動いた。なんだよもう、めっちゃハマったやんけ!
それでも完全解決とはいかず、デバイスは動いているように見えるものの、なぜかパケットが流れない事がある。初期化系の何かっぽくて、何度かVMを再起動して一度通信できる状態になれば、途中で途絶する事はないのが不幸中の幸いではあるが。
もう1つ気になるのは「イーサネットの状態」のパケット数カウントが何かおかしいこと。受信パケットが常に0で、これが原因かわからんがVF経由だとiTunesでGracenoteへの接続に失敗する。virtio-netの方だと大丈夫なので、うちのネットワークがおかしい訳ではない。
SR-IOVまわりは情報があまりなくて、よう分からん。
(2021-12-07 追記)
WinOF v5.50.5400のKnown Issuesを眺めてたら、Internal Ref. 1297888にパケット数カウントがおかしい問題が思いっきり載っていた……というわけで、Windowsドライバのバグで確定。
回避策がN/Aなのでドライバ修正を待つしかないが、果たして更新されることはあるのだろうか。もうConnectX-3はLTSフェイズだしなぁ。ConnectX-4がお安く手に入ればいいんだけど。