Proxmoxの7から8へのアップグレード

Proxmoxの7から8へのアップグレード

仮想環境といえばProxmox

ホームラボや社内開発環境でよく使う仮想環境といえばProxmoxです。私はVersion6の時から使っています。

以前一緒に仕事をしていたアメリカの会社のエンジニアから教えてもらいましたが、とても重宝しているツールの一つです。

その時から4つのProxmox環境を自宅で立ち上げ、つい最近Version7からVersion8にアップグレードをしました。色々機能が追加されてきているのですが、Version8が2023年6月22日に公開されてからもう1年半経ちました。

そろそろ使っていないと話についていけなくなるので、導入したいと思います。

今までは新しいバージョンを入れるときは新規インストールしていましたが、今回はアップグレードしたいと思います。

なぜかというと、2011年のIntel Core iシリーズ第二世代のSandy Bridgeと同じ世代のXeonで動いているデスクトップPCから、ProxmoxのインストールされているSataSSDをRyzen9 4900HのミニPCに移植しました。その際に、アップグレードも一緒に行ってみたというわけです。

いろいろ問題が発生したので、記録として残しておきます。

アップグレード前の確認

ProxmoxはDebianベースで、VE7はDebian11、VE8はDebian12をベースにしています。OSカーネルごと一気にアップグレードしてしまいます。

まずは、ハードウェアサポートされるか確認します。

VE7ではCore2DuoやDell PERC 5/6 RAID Controller、IDE HDDなどがサポートされましたが、それらはVE8ではサポートされません。

CPU的に言うと、IntelのCore iシリーズの第2世代(一部の低電圧モデルは除く)以降、AMDのRyzenのZEN第一世代(Ryzen1000シリーズ)以降であればサポートされています。かなり古いハードもサポートされていますね。

VE7でも必要と言えば必要なのですが、仮想化支援機構(VT-x/VT-d、AMD-V/IOMMU)が搭載されていないCPUはVE8ではサポートされないようです。

ざっくりいうと10年以上のハードを使用する場合は要確認といったレベルでしょうか。金欠エンジニアにはとてもありがたいです。

今回は、マザーボードが変更になったので、チップセットやグラフィック、NICも含めて全部変わっています。

VE8からはLinuxカーネル6.2を採用しています。ZFSの強化やWebUIの更新、Cephの新バージョン対応など、いろいろ向上しているのでもっと早く切り替えればよかったですね。

基本的なアップグレード方法

NICの変更対応

これは本来はアップグレードとは関係ない部分ですが、行った作業なので載せておきます。

そもそもアップグレードはインターネットにつながらないとできないので、そのための準備となります。

マザーボードを変更したので、NICが変更になりました。OSがサポートする範囲内なら勝手に認識はするのですが、NIC名が変わってしまいました。

マザーボード変更後のNIC一覧は「ip a」コマンドなどで確認できます。詳細は省略しますが、以下のように出ていました。

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
2: eno1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
3: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master vmbr0 state UP group default qlen 1000
4: wlp3s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
5: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000

「/etc/network/interfaces」のファイルを確認します。

root@pve:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback

iface enp3s0 inet manual

auto vmbr0
iface vmbr0 inet static
        address 192.168.1.50/24
        gateway 192.168.1.254
        bridge-ports enp3s0
        bridge-stp off
        bridge-fd 0

iface wlx503eaa32210b inet manual

Debianのネットワーク設定ファイルでifaceはネットワークインターフェースのどれを使うかをOS上で定義する設定です。そして、Proxmoxでデフォルトで内部ネットワークとして使用するのが「vmbr0」です。

「vmbr0」は仮想インターフェースなので、それ用にどのインターフェースを使うという設定が必要となります。

私の環境では、以前は「enp3s0」がProxmoxで使用されていましたが、新しいマザーボードではその名前のNICはありませんね。

どのNICでもよいのですが、私の環境ですと「eno1」と「enp4s0」が有線、「wlp3s0」が無線でした。ちなみに、このPCは先日メインマシンから引退したMinisforumのHM90です。

それで、2.5Gbpsの「enp4s0」をメインとして使用することにします。このNICはOSでアクティブになっている必要があります。

とりあえず、Proxmoxをネットにつなげることが目的なので、設定ファイルの「enp3s0」を「enp4s0」に書き換えて保存し、OSを再起動します。

これでパソコンがインターネットにつながるようになりました。

グラフィックカードのドライバインストール

この項目も同じPC上でハードウェアを変えずにアップグレードする人には不要な項目です。

私の場合はIntelマザーボードにRageonを古いカードを搭載していましたが、新しいPCはAMDのZen2の統合GPUに変更になりましたので、その対応です。

root@pve:~# dmesg | grep -i vga
[    0.498848] pci 0000:06:00.0: vgaarb: setting as boot VGA device
[    0.498848] pci 0000:06:00.0: vgaarb: bridge control possible
[    0.498848] pci 0000:06:00.0: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none
[    0.498848] vgaarb: loaded
[    1.173614] ACPI: video: Video Device [VGA] (multi-head: yes  rom: no  post: no)
[    5.375384] snd_hda_intel 0000:06:00.1: Handle vga_switcheroo audio client
[    7.662095] amdgpu 0000:06:00.0: vgaarb: deactivate vga console
root@pve:~#

1行目からGPUは認識していることが分かります。

7行目からGPU内臓のオーディオが検出されていることが分かります。

8行目からVGAデバイスとしてアクティブであることが分かります。

しかし、AMDGPU-PROのドライバーがそもそも当たっていないので、まずそのドライバをあてます。

まず、必要なヘッダーをインストールしておきます。

root@pve:~# apt install -y pve-headers
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  inetutils-telnet pve-kernel-5.13.19-3-pve pve-kernel-5.15.39-4-pve telnet
Use 'apt autoremove' to remove them.
The following additional packages will be installed:
  proxmox-default-headers proxmox-headers-6.8 proxmox-headers-6.8.12-5-pve
The following NEW packages will be installed:
  proxmox-default-headers proxmox-headers-6.8 proxmox-headers-6.8.12-5-pve pve-headers
0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 13.7 MB of archives.
After this operation, 97.1 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-5-pve amd64 6.8.12-5 [13.7 MB]
Get:2 http://download.proxmox.com/debian/pve bookworm/pve-no-subscription amd64 proxmox-headers-6.8 all 6.8.12-5 [10.3 kB]
Get:3 http://download.proxmox.com/debian/pve bookworm/pve-no-subscription amd64 proxmox-default-headers all 1.1.0 [1,848 B]
Get:4 http://download.proxmox.com/debian/pve bookworm/pve-no-subscription amd64 pve-headers all 8.3.0 [2,868 B]
Fetched 13.7 MB in 2s (6,723 kB/s)
Selecting previously unselected package proxmox-headers-6.8.12-5-pve.
(Reading database ... 91645 files and directories currently installed.)
Preparing to unpack .../proxmox-headers-6.8.12-5-pve_6.8.12-5_amd64.deb ...
Unpacking proxmox-headers-6.8.12-5-pve (6.8.12-5) ...
Selecting previously unselected package proxmox-headers-6.8.
Preparing to unpack .../proxmox-headers-6.8_6.8.12-5_all.deb ...
Unpacking proxmox-headers-6.8 (6.8.12-5) ...
Selecting previously unselected package proxmox-default-headers.
Preparing to unpack .../proxmox-default-headers_1.1.0_all.deb ...
Unpacking proxmox-default-headers (1.1.0) ...
Selecting previously unselected package pve-headers.
Preparing to unpack .../pve-headers_8.3.0_all.deb ...
Unpacking pve-headers (8.3.0) ...
Setting up proxmox-headers-6.8.12-5-pve (6.8.12-5) ...
Setting up proxmox-headers-6.8 (6.8.12-5) ...
Setting up proxmox-default-headers (1.1.0) ...
Setting up pve-headers (8.3.0) ...

AMDのサイトにDebian用のドライバーはありません。それで、Debian12と作りが似ているUbuntu22.04用のドライバーを準備します。
※UbuntuはDebianベースのLinuxOSであり、同じカーネルを使っているバージョンという意味です

https://www.amd.com/en/resources/support-articles/release-notes/RN-AMDGPU-UNIFIED-LINUX-23-30.html

root@pve:~# wget https://repo.radeon.com/amdgpu-install/23.30.2/ubuntu/jammy/amdgpu-install_5.7.50702-1_all.deb
--2024-12-22 13:11:58--  https://repo.radeon.com/amdgpu-install/23.30.2/ubuntu/jammy/amdgpu-install_5.7.50702-1_all.deb
Resolving repo.radeon.com (repo.radeon.com)... 104.90.5.240, 23.44.236.233, 2600:140f:2e00::b856:7038, ...
Connecting to repo.radeon.com (repo.radeon.com)|104.90.5.240|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 16632 (16K) [application/octet-stream]
Saving to: ‘amdgpu-install_5.7.50702-1_all.deb’

amdgpu-install_5.7.50702-1_al 100%[=================================================>]  16.24K  --.-KB/s    in 0.002s

2024-12-22 13:11:58 (9.97 MB/s) - ‘amdgpu-install_5.7.50702-1_all.deb’ saved [16632/16632]

root@pve:~# ls
amdgpu-install_5.7.50702-1_all.deb

ダウンロードしたドライバをインストールする。また、抜けがないかも確認する。

root@pve:~# dpkg -i /root/amdgpu-install_5.7.50702-1_all.deb
Selecting previously unselected package amdgpu-install.
(Reading database ... 103342 files and directories currently installed.)
Preparing to unpack .../amdgpu-install_5.7.50702-1_all.deb ...
Unpacking amdgpu-install (5.7.50702-1683306.22.04) ...
Setting up amdgpu-install (5.7.50702-1683306.22.04) ...

root@pve:~# apt --fix-broken install
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

root@pve:~# amdgpu-install --usecase=graphics --no-dkms
INFO: i386 architecture has not been enabled with dpkg.
Installation of 32-bit run time has been excluded.
・・・
0 upgraded, 65 newly installed, 0 to remove and 0 not upgraded.
Need to get 64.7 MB of archives.
After this operation, 228 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
・・・
Setting up amdgpu-lib (1:5.7.50702-1683306.22.04) ...
Processing triggers for fontconfig (2.14.1-4) ...
Processing triggers for libc-bin (2.36-9+deb12u9) ...
Processing triggers for man-db (2.11.2-2) ...

インストールが終わったら、確認します。問題なければ再起動します。

root@pve:~# dmesg | grep amdgpu
[    7.637101] [drm] amdgpu kernel modesetting enabled.
[    7.651280] amdgpu: Virtual CRAT table created for CPU
[    7.651312] amdgpu: Topology: Add CPU node
[    7.651512] amdgpu 0000:06:00.0: enabling device (0006 -> 0007)
[    7.654192] amdgpu 0000:06:00.0: amdgpu: Fetched VBIOS from VFCT
[    7.654195] amdgpu: ATOM BIOS: 113-RENOIR-031
[    7.662095] amdgpu 0000:06:00.0: vgaarb: deactivate vga console
[    7.662099] amdgpu 0000:06:00.0: amdgpu: Trusted Memory Zone (TMZ) feature enabled
[    7.662103] amdgpu 0000:06:00.0: amdgpu: MODE2 reset
[    7.662214] amdgpu 0000:06:00.0: amdgpu: VRAM: 512M 0x000000F400000000 - 0x000000F41FFFFFFF (512M used)
[    7.662217] amdgpu 0000:06:00.0: amdgpu: GART: 1024M 0x0000000000000000 - 0x000000003FFFFFFF
[    7.662359] [drm] amdgpu: 512M of VRAM memory ready
[    7.662361] [drm] amdgpu: 31859M of GTT memory ready.
[    7.663537] amdgpu 0000:06:00.0: amdgpu: Will use PSP to load VCN firmware
[    8.433723] amdgpu 0000:06:00.0: amdgpu: RAS: optional ras ta ucode is not available
[    8.442616] amdgpu 0000:06:00.0: amdgpu: RAP: optional rap ta ucode is not available
[    8.447302] amdgpu 0000:06:00.0: amdgpu: Secure display: Generic Failure.
[    8.447308] amdgpu 0000:06:00.0: amdgpu: SECUREDISPLAY: query securedisplay TA failed. ret 0x0
[    8.448231] amdgpu 0000:06:00.0: amdgpu: SMU is initialized successfully!
[    8.450650] snd_hda_intel 0000:06:00.1: bound 0000:06:00.0 (ops amdgpu_dm_audio_component_bind_ops [amdgpu])
[    8.458328] kfd kfd: amdgpu: Allocated 3969056 bytes on gart
[    8.458344] kfd kfd: amdgpu: Total number of KFD nodes to be created: 1
[    8.458480] amdgpu: Virtual CRAT table created for GPU
[    8.458732] amdgpu: Topology: Add dGPU node [0x1636:0x1002]
[    8.458734] kfd kfd: amdgpu: added device 1002:1636
[    8.458744] amdgpu 0000:06:00.0: amdgpu: SE 1, SH per SE 1, CU per SH 8, active_cu_number 8
[    8.458749] amdgpu 0000:06:00.0: amdgpu: ring gfx uses VM inv eng 0 on hub 0
[    8.458751] amdgpu 0000:06:00.0: amdgpu: ring gfx_low uses VM inv eng 1 on hub 0
[    8.458753] amdgpu 0000:06:00.0: amdgpu: ring gfx_high uses VM inv eng 4 on hub 0
[    8.458755] amdgpu 0000:06:00.0: amdgpu: ring comp_1.0.0 uses VM inv eng 5 on hub 0
[    8.458756] amdgpu 0000:06:00.0: amdgpu: ring comp_1.1.0 uses VM inv eng 6 on hub 0
[    8.458758] amdgpu 0000:06:00.0: amdgpu: ring comp_1.2.0 uses VM inv eng 7 on hub 0
[    8.458760] amdgpu 0000:06:00.0: amdgpu: ring comp_1.3.0 uses VM inv eng 8 on hub 0
[    8.458762] amdgpu 0000:06:00.0: amdgpu: ring comp_1.0.1 uses VM inv eng 9 on hub 0
[    8.458763] amdgpu 0000:06:00.0: amdgpu: ring comp_1.1.1 uses VM inv eng 10 on hub 0
[    8.458765] amdgpu 0000:06:00.0: amdgpu: ring comp_1.2.1 uses VM inv eng 11 on hub 0
[    8.458767] amdgpu 0000:06:00.0: amdgpu: ring comp_1.3.1 uses VM inv eng 12 on hub 0
[    8.458769] amdgpu 0000:06:00.0: amdgpu: ring kiq_0.2.1.0 uses VM inv eng 13 on hub 0
[    8.458771] amdgpu 0000:06:00.0: amdgpu: ring sdma0 uses VM inv eng 0 on hub 8
[    8.458773] amdgpu 0000:06:00.0: amdgpu: ring vcn_dec uses VM inv eng 1 on hub 8
[    8.458774] amdgpu 0000:06:00.0: amdgpu: ring vcn_enc0 uses VM inv eng 4 on hub 8
[    8.458776] amdgpu 0000:06:00.0: amdgpu: ring vcn_enc1 uses VM inv eng 5 on hub 8
[    8.458778] amdgpu 0000:06:00.0: amdgpu: ring jpeg_dec uses VM inv eng 6 on hub 8
[    8.464730] [drm] Initialized amdgpu 3.57.0 20150101 for 0000:06:00.0 on minor 0
[    8.466467] amdgpu 0000:06:00.0: [drm] Cannot find any crtc or sizes

root@pve:~# lsmod | grep amdgpu
amdgpu              13271040  0
amdxcp                 12288  1 amdgpu
drm_exec               12288  1 amdgpu
gpu_sched              61440  1 amdgpu
drm_buddy              20480  1 amdgpu
drm_suballoc_helper    12288  1 amdgpu
drm_ttm_helper         12288  1 amdgpu
ttm                    98304  2 amdgpu,drm_ttm_helper
drm_display_helper    225280  1 amdgpu
i2c_algo_bit           16384  1 amdgpu
video                  73728  1 amdgpu
root@pve:~# reboot

再起動後に、インストールしたドライバが正しく読み込まれていることを確認します。

root@pve:~# lspci | grep VGA
06:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Renoir (rev f0)

これで、新しいPCのGPUは正しく読み込まれています。

OSアップグレードの準備

DebianはUbuntuやCentOSと同じくLinuxなので、アプリケーションやカーネルなどの最新のものはリポジトリから取得します。パッケージ管理にはaptコマンドを使用しています。

それで、まずはリポジトリを書き換えます。

# nano /etc/apt/sources.list

変更前

deb http://ftp.jp.debian.org/debian bullseye main contrib
deb http://security.debian.org bullseye-security main
deb http://ftp.jp.debian.org/debian bullseye-updates main

deb http://download.proxmox.com/debian/pve bullseye pve-no-subscription

変更後

deb http://ftp.jp.debian.org/debian bookworm main contrib
deb http://security.debian.org bookworm-security main
deb http://ftp.jp.debian.org/debian bookworm-updates main

deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription

これで、今まで見ていたProxmoxVE7(Debian11ベース)のリポジトリからProxmoxVE8(Debian12ベース)のリポジトリを見るようになります。

OSのアップグレード

以下のコマンドを実行して、OSをアップグレードする。

apt update
apt full-upgrade

アップグレード中にはユーザー操作が必要な個所が何か所かあります。ダウンロードする量も多いので、私の場合は2時間くらいかかったように思います。

アップグレード後の後処理

エンタープライズリポジトリが再度有効になっているので、それを無効に戻します。

nano /etc/apt/sources.list.d/pve-enterprise.list

以下の行をコメントアウトします。

# deb https://enterprise.proxmox.com/debian/pve bookworm pve-enterprise

最後にさらにアップグレードがないかもう一度確認します。

apt update
apt dist-upgrade

サブスクリプションメッセージを非表示にする(任意)

無償リポジトリを使用すると、Web UIにサブスクリプションがない旨の通知が表示されます。

ログイン時に毎回表示されるこのダイアログが嫌な場合は、消すことができます。

通知を出しているスクリプトを修正します。

nano /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js

CTRL+Wで「No valid subscription」検索して、以下の部分を見つけます。

    555         Proxmox.Utils.API2Request(
    556             {
    557                 url: '/nodes/localhost/subscription',
    558                 method: 'GET',
    559                 failure: function(response, opts) {
    560                     Ext.Msg.alert(gettext('Error'), response.htmlStatus);
    561                 },
    562                 success: function(response, opts) {
    563                     let res = response.result;
    564                     if (res === null || res === undefined || !res || res
    565                         .data.status.toLowerCase() !== 'active') {
    566                         Ext.Msg.show({
    567                             title: gettext('No valid subscription'),
    568                             icon: Ext.Msg.WARNING,
    569                             message: Proxmox.Utils.getNoSubKeyHtml(res.data.url),
    570                             buttons: Ext.Msg.OK,
    571                             callback: function(btn) {
    572                                 if (btn !== 'ok') {
    573                                     return;
    574                                 }
    575                                 orig_cmd();
    576                             },
    577                         });
    578                     } else {
    579                         orig_cmd();
    580                     }
    581                 },
    582             },
    583         );

それを以下のように「Ext.Msg.show」を実行せずに「orig_cmd()」のみ実行して、ダイアログを表示しないようにします。

    562                 success: function(response, opts) {
    563                     let res = response.result;
    564                     /*
    565                     if (res === null || res === undefined || !res || res
    566                         .data.status.toLowerCase() !== 'active') {
    567                         Ext.Msg.show({
    568                             title: gettext('No valid subscription'),
    569                             icon: Ext.Msg.WARNING,
    570                             message: Proxmox.Utils.getNoSubKeyHtml(res.data.url),
    571                             buttons: Ext.Msg.OK,
    572                             callback: function(btn) {
    573                                 if (btn !== 'ok') {
    574                                     return;
    575                                 }
    576                                 orig_cmd();
    577                             },
    578                         });
    579                     } else {
    580                     */
    581                         orig_cmd();
    582                     // }
    583                 },

保存して、最後にサービスを再起動します。

systemctl restart pveproxy

アップブレード後にWindowsのVMが立ち上がらなくなるのを直す

アップグレードの確認として、VMが立ち上がるのか、インターネットにつながるかなどを順番に確認する。

そうすると、Linuxは問題ないのに、WindowsのVMが立ち上がらなくなっている。

swtpm_setup: Not overwriting existing state file.
kvm: Cannot use spice audio without -spice
stopping swtpm instance (pid 61544) due to QEMU startup error
TASK ERROR: start failed: QEMU exited with code 1

VMのハードウェアのページを開く。
※このVMはBIOSがUEFIになっていて、EFIも追加されている。vmwareから引っ越してきたVMのためにこのようなことになっていますが、SeaBIOSでも操作内容は同じです。

Displayをダブルクリックして開く。

GPUを「VirtIO-GPU」に変更して、VRAMも設定する。

これで立ち上がるようになる。

なお、SPICEは私の環境ではうまく動いていないので、ここでは触れないこととする。

まとめ

Proxmoxはできるだけ、新しいバージョンで使った方がいい。

新しく追加したノードとバージョンを合わせるためにもそうすることをお勧めする。

アップグレードはひっかかるポイントが多いので、よく準備してから行ってほしい。

(付録)ProxmoxでWindows11を使うには

ちなみに、Windows11をインストールしたり、Windows10からアップグレードする際に、引っかかる人が多いので参考情報を書いておく。

Windows11を普通に動かすためには、Intel Core iシリーズの第8世代以降、またはRyzen2000以降が必要なので、ホストPCは当然それをクリアしている必要がある。

VM上のCPUは物理的に対応している「host」を選んでおけば問題ない。

加えてVE7以降で対応したTPMモジュールをインストールする必要がある。

これで、Windows11のインストール要件を満たせるはずだ。