📌

おっさんのお小遣いで作るホームラボ 〜10万円で作るHCI〜 ④Proxmox VEでノードを構成する

に公開

個人的な備忘録ということで段々適当になってきている感じも否めない。
最近は脳の動きも如実に悪くなってるのでメモっておかないと2か月後には完全に忘れてる(¯~¯)。

基本的に公式サイトを見ればどうにかできるし、いろんなところに転がってる有志の関連記事動画を見れば大体どうにかなると思うので、ここでは自分の環境に特化して記載していこうと思う。

構築にあたって

HCIを組むにあたって、分散ストレージの設定も実施することになる。
ProxmoxではCephストレージを使うことになるんだけど、基本的にCephはRAWディスクを使用することが前提。つまり通常独立した専用ストレージメディアが必要。
しかし今回はお小遣いが足りなかったので1つしかストレージを積んでない。
この辺りも対処しつつ作っていきたい。

想定している手順

  1. Proxmoxのインストール
  2. Proxmoxのアップデート
  3. Web UIにアクセスしてProxmox側のインターフェースの設定を変える
  4. L2スイッチでLAGを構成する
  5. Proxmoxのクラスタ構築
  6. Cephによる分散ストレージの設定

(¯ω¯;) ブヒ~
使えるようになるまでは、やっぱ割と面倒くさいな。
とりあえず今回は「4. L2スイッチでLAGを構成する」まで実施していきたい。

サーバー用ミニPCのバックアップを取得する

今回買ったミニPCはWindows11ProのOS入りだった。こういう中華系格安PCに導入されているOSは大体VL版である。OEM版をきちんと提供してくれる真っ当な業者ももちろんあるけれど、あまり期待できない。またはデジタルライセンスがきちんと構成さえてれば少なくとも今入ってるOSのバージョンでは問題ないんだけども、それ自体も正規のものかどうか判断のしようがないんだよね。サポートもねえ…
ということで初回の起動する前にもうOSのバックアップは取得しておくことにする。これでまっさらにしても安心。
バックアップはAcronis Trueimageを使用する。個人用なら1ライセンスで5台まで行けるのでセーフ。
でまあ、とってみたわけだけど、案の定VL版だったわけで。ええ。

お金ない人は既にあるWindowsでWindows ADK+PEアドオンにDISMのっけてバックアップするといいと思う。
よほど変なことしてなければ今どきのドライバ大体どっかから入手できるし、ドライバの組み込みもそんなに大変じゃない。
コマンドなんてこんな感じでコピペで行けちゃうレベル。

DISM.exe /Capture-FFU /ImageFile=<バックアップ先のパス>.ffu /CaptureDrive=\\.\PhysicalDrive0 /Name:"MyBackup" /Description:"Windows FFU Backup"

しかしバックアップを適当にネットを調べると盛んに某AO社のツールをお勧めしてくるのがなんとも

導入時のネットワークの設定

Proxmox自体はLAGを組んでるポートで通信できない。
インストール後にコマンドラインでinterfacesファイルを変更してLACPに対応させることもできるようだけど、今回はGUIを使う (面倒くさい) 方法で検証してみる。

スイッチ側は簡単。
Port-channelのチャネルグループから該当インターフェースを外せばいいだけ
今回は有線NIC#1側を一度チャネルグループから外して構築する。
初期構築時点で外してmode Accessにしてあるので今回はそのままつながるはず。

Proxmoxを導入していくの巻

今回の構成における一般的な手順との差違

Proxmoxのインストーラー作成はまあいろんな所に情報があるので割愛。
そのあとは設定手順通りに実施すればインストール自体は出来る。
そんななかで、今回の構成では何が違うのかというとストレージの利用方法。
通常Cephは専用の物理ディスクまるごと割り当てして利用することになる。
検証環境では良くあると思うけど、Proxmoxのデフォルトではストレージを1つしか積んでいない状態ではシステムを入れる物理ストレージはLVMで全領域確保されてしまう。
さて、困った。

ストレージの割り当て

今回はそれではCephの領域が確保できないので、手動で領域を確保することになる。
Ceph割り当て分とローカルのデータストアについて、どの程度割り当てるのか非常に悩むところ。
Cephの川迫次第では実効容量が1/3になったりするので、いろいろ触って試験が出来る程度には容量を確保したい。
ということで、ローカルストレージで280GiB、Ceph割り当て分を200GiBとした。
理由としては以下の容量を確保した上でローカルと分散ストレージの割り当てをざっくり1:1程度確保したかったから。

・Proxmox本体:60GB(公式概算)
・CephのOSD管理用に280GB*4%=12GB

システム部の280GBのうち、空きとしては200GB程度になるはず。
うん、必要最低限は決まった。多分。

Proxmoxのインストール

の前に

ちょうどこれを書いているときに、いい感じにProxmox VEのVer.9のBATA1が出た様子。
当初は安定版の8.4を入れようかと思ったものの、どうせなら最新班を入れてみよう。
違いは公式のロードマップ参照のこと。
ふむふむ、ベースのDebianが13に上がったのと、ZFSが2.3.3になてRAIDZプールのデバイス追加サポートが増えたのとSDNでOSPFファブリック扱えるようになったのね。
自動インストールが改善されたってことは自動スケールアップやノード故障での入れ替えもより便利になったのかなあ。
NICのIF命名規則も変わるのか。まあ今回は新規だから関係なさそう。

(¯Д¯;)おお…enterprise側のISO置き場だからめちゃくちゃ遅い。
300Kbpsしか出ない。総量1.5GBもあるから、1日かかる。
やっぱり今回は8.4にしよう。
おっさんの趣味で無駄に相手のサーバーに負荷かける必要ないよね。

インストール時のメモ

インストール自体は5分ほどでサクッと終了したので、そのときのメモ

Target Harddiskで内蔵のSSDを選択
Optionを選択してhdsizeを476.0GB -> 276.0GBに設定変更。
ファイルシステムは標準のext4のまま。細かくほかのパーティションも選択できるけど残りは空で。

国は勿論Japanで。ほかは国を入れれば自動的に。

項目
Country Japan
Time zone Asia/Tokyo
Keyboard Layout Japanese

パスワードは適当に入れてEmailは”mail@lab.watomoa.com”にした。

Management Interface設定に入るので、NIC#1の方を選んでIPアドレスをセット

項目
Management Interface xenp1s0
Hostname pve1.lab.watomoa.com
IP Address 192.168.255.101/24
Gateway 192.168.255.254
DNS Server 192.168.255.254

その後インストールが終わって再起動が走ればログイン可能。
5分で導入と起動までできるとかすごい簡単。

なんで画面のキャプチャーがとれてるのか?
これを作るにあたって何か画面のスクリーンショットがとれればいいなあと思っていたところ、アマゾンのセールが来まして、ええ。
で、通常時から激安のUGREENのキャプチャボード買ってしまいました。お値段3000円。動画にハードエンコード使えて、いいねこれ。
昔々XBOXの画面キャプチャーをFHDでとりたくて、MonsterX-i つーキャプチャボードを買ったとき以来だけど、今時こんな安くても普通に使えるのは隔世の感がある。

一番いいのはIP-KVMでも買ってリモートで全部触れると素晴らしいけど、最近の超小型KVMでも5000円くらいするんだよなー。基板むき出しだし。

そのほかで起動画面がちょっとフォント小さいのでGrubをいじってコンソール解像度を変更しておく
老眼対策とかではなく、使うディスプレイがちょっとね…

Proxmoxのコンソール解像度変更方法

ProxmoxはDebianベースなので、GRUBブートローダーの設定を変更することで、ホストのコンソール解像度を調整する。
今回は800x600に。

  1. grubファイル編集
vi /etc/default/grub
  1. 以下の行を編集(800x600x60Hzに)
/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet"

/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet video=800x600@60"

に。
3. GRUBを更新

update-grub
  1. 再起動

Proxmox初期設定

Web管理画面に入れるようになったので、初っぱなにやるべきことを実施していく

  1. リポジトリの変更本体のアップデート
    今回はCephも使うのでどちらもenterpriseからno-subscriptionのリポジトリに変更。
    cephはSquid (v19)にする。
    今はGUIでサクサクできるから楽でいい。
    しかし回線がくそ遅いせいで1時間か(´・ω・`)
  2. hostsの修正
    ホスト側ではローカルの名前解決にDNSサーバーは使わないので、一応ほかのノードのを名前解決できるように、FQDNとホスト名をHOSTSに記載しておく
    /etc/hosts
    192.168.255.101 pve1.lab.watomoa.com pve1
    192.168.255.102 pve2.lab.watomoa.com pve2
    192.168.255.103 pve3.lab.watomoa.com pve3
    

Open vSwitchを使ったインターフェース冗長化設定

とりあえずWeb管理画面につながって初期のアップデートもできたので、次はNIC側の設定に入ろう。
ProxmoxではLinux標準とOpen vSwitch(OVS)のボンディングが選択できる。
今回はある程度柔軟に設定ができるようにしたい&勉強がてらOVSでのボンディングを設定してみたいと思う。
設定としてはパッケージインストール後にブリッジを作ってからボンディングを構成することになる。
今は1ポートをマネージメントポートとして使用してしまってるので、ちょっと面倒くさい。

  1. コマンドラインでOVSパッケージのインストール
    今のところOVSパッケージのインストールをGUIでやる方法が見つからなかったのでコマンドで実行する。ノード管理画面からシェルを起動してパッケージのインストール。

    apt install openvswitch-switch
    

    これで設定する準備ができた。
    一応動作確認

    root@pve1:~# systemctl status openvswitch-switch
    ● openvswitch-switch.service - Open vSwitch
      Loaded: loaded (/lib/systemd/system/openvswitch-switch.service; enabled; p>
      Active: active (exited) since Mon 2025-xx-xx xx:xx:xx JST; 1m ago
     Process: 10832 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
    Main PID: 10832 (code=exited, status=0/SUCCESS)
         CPU: 744us
    

    ヨシ!

  2. インターフェースの構成
    [システム]-[ネットワーク]からいい感じに構成変更する。
    VLANに関しては、Management Seg.はネイティブで通しているので指定はなし。
    vmbr0の役割をovsip0に引き継ぎしている。

    接続はこんな感じ。

    設定に関しては「設定を適用」するまでは反映されないので設定の戻しも簡単。
    設定を保存するとノードとの通信が一度切れるはず。

    …やっぱり直接interfacesファイルいじった方が楽だな。

    interfacesファイルの内容
    /etc/network/interfaces
       auto lo
    iface lo inet loopback
    
    auto enp1s0
    iface enp1s0 inet manual
    
    auto enp2s0
    iface enp2s0 inet manual
    
    iface wlp3s0 inet manual
    
    auto bond0
    iface bond0 inet manual
            ovs_bonds enp1s0 enp2s0
            ovs_type OVSBond
            ovs_bridge ovsbr0
            ovs_options bond_mode=balance-tcp lacp=active
    
    auto ovsbr0
    iface ovsbr0 inet manual
            ovs_type OVSBridge
            ovs_ports bond0
    
    auto ovsip0
    iface ovsip0 inet static
            address 192.168.255.101/24
            gateway 192.168.255.254
            ovs_type OVSIntPort
            ovs_bridge ovsbr0
    
    source /etc/network/interfaces.d/*
    

L2スイッチ側の構成を修正

つづけてL2スイッチの構成を修正する。
現状はPoort-channel 1にGigabitEthernet0/2(enp2s0側)しか設定していないので、GigabitEthernet0/1も設定する。
あわせて許可VLANも設定してしまおう。
IFのポート指定はこんな感じにした。

interface Port-channel1
 description to LAB-SVR#1
 switchport trunk allowed vlan 10,20,100-1000
 switchport trunk native vlan 10
 switchport mode trunk
 spanning-tree portfast edge
!
interface GigabitEthernet0/1
 switchport trunk allowed vlan 10,20,100-1000
 switchport trunk native vlan 10
 switchport mode trunk
 channel-group 1 mode active
!
interface GigabitEthernet0/2
 switchport trunk allowed vlan 10,20,100-1000
 switchport trunk native vlan 10
 switchport mode trunk
 channel-group 1 mode active   

コンフィグの保存は忘れずに。

接続の確認

ノード側とスイッチの両方の構成を修正したので、接続状態を確認する。
ノード側では想定した形で繋がっているのかGUI上ではわからないのでちょっと不便ではある。

ノード側の確認(コンソールから)
root@pve1:~# ovs-vsctl show
e4828d5d-5953-403d-b874-ef27ea27e8df
    Bridge ovsbr0
        Port ovsip0
            Interface ovsip0
                type: internal
        Port bond0
            Interface enp1s0
            Interface enp2s0
        Port ovsbr0
            Interface ovsbr0
                type: internal
    ovs_version: "3.1.0"
root@pve1:~#
root@pve1:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group defaul                               t qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master ov                               s-system state UP group default qlen 1000
    link/ether e8:ff:1e:d4:68:50 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::eaff:1eff:fed4:6850/64 scope link
       valid_lft forever preferred_lft forever
3: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master ov                               s-system state UP group default qlen 1000
    link/ether e8:ff:1e:d4:68:4f brd ff:ff:ff:ff:ff:ff
    inet6 fe80::eaff:1eff:fed4:684f/64 scope link
       valid_lft forever preferred_lft forever
4: wlp3s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default ql                               en 1000
    link/ether 40:f4:c9:6f:0e:d2 brd ff:ff:ff:ff:ff:ff
5: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group defaul                               t qlen 1000
    link/ether 8e:d0:8e:10:79:b9 brd ff:ff:ff:ff:ff:ff
6: ovsbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOW                               N group default qlen 1000
    link/ether e8:ff:1e:d4:68:50 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::8c1e:71ff:fe20:6547/64 scope link
       valid_lft forever preferred_lft forever
8: bond0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN                                group default qlen 1000
    link/ether 2a:f5:c6:41:f6:bc brd ff:ff:ff:ff:ff:ff
    inet6 fe80::28f5:c6ff:fe41:f6bc/64 scope link
       valid_lft forever preferred_lft forever
9: ovsip0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOW                               N group default qlen 1000
    link/ether 36:80:f1:01:a9:69 brd ff:ff:ff:ff:ff:ff
    inet 192.168.255.101/24 scope global ovsip0
       valid_lft forever preferred_lft forever
    inet6 fe80::3480:f1ff:fe01:a969/64 scope link
       valid_lft forever preferred_lft forever
root@pve1:~#
root@pve1:~# ovs-appctl bond/show bond0
---- bond0 ----
bond_mode: balance-tcp
bond may use recirculation: yes, Recirc-ID : 1
bond-hash-basis: 0
lb_output action: disabled, bond-id: -1
updelay: 0 ms
downdelay: 0 ms
next rebalance: 5511 ms
lacp_status: negotiated
lacp_fallback_ab: false
active-backup primary: <none>
active member mac: e8:ff:1e:d4:68:4f(enp2s0)

member enp1s0: enabled
  may_enable: true
  hash 84: 10 kB load

member enp2s0: enabled
  active member
  may_enable: true
  hash 182: 7 kB load
  hash 224: 1 kB load
  hash 228: 1 kB load

root@pve1:~#
スイッチ側の確認
LAB-L2SW#show lacp neighbor
Flags:  S - Device is requesting Slow LACPDUs
        F - Device is requesting Fast LACPDUs
        A - Device is in Active mode       P - Device is in Passive mode

Channel group 1 neighbors

Partner's information:

                  LACP port                        Admin  Oper   Port    Port
Port      Flags   Priority  Dev ID          Age    key    Key    Number  State
Gi0/1     SA      65535     e8ff.1ed4.6850  17s    0x0    0x2    0x2     0x3D
Gi0/2     SA      65535     e8ff.1ed4.6850  18s    0x0    0x2    0x3     0x3D
LAB-L2SW#

うーん、バランシングが偏ってる気もしなくもないけど動いてるからヨシ!
実際にVM動かしてから確認しよう。

疎通確認

ここまで来て疎通できないとちょっと笑えるけど一応テスト。
ping ヨシ! WEB管理画面ヨシ!

お疲れ様でした。あと2台同じように頑張りましょう。

まとめ

知っていれば簡単だけど、知らないとできない絶妙なレベル感。
次回はようやくHCIの構築になる。クラスタへの参加とCephでの分散ストレージ設定を予定。

Discussion