あっきぃ日誌

ラズピッピブログのようなオタクブログのようななにか

自宅サーバーをCockpit(KVM+Docker)に移行完了!と思ったらESXi無償版再開マジ?

自宅サーバーリプレースの続きです。前回から間があきましたが、ブログを書いた数日後には今回の話はあらかた済んでいました。

akkiesoft.hatenablog.jp

昨晩やっとVMバックアップスクリプトを書き終えて運用開始した(なお失敗)ので、ブログを書いて、ESXiからKVM環境への移設の記録は完結です。と思ったら、ESXi無償版の公開が再開したらしく、マジ?となっておるところです……。

KVMホストから元のマシンに戻す作業

今回の移行ではマシンを流用するため、仮ホストにVMをいったんすべて乗せて、元のマシンが空になった後、Ubuntuをインストールして、仮ホストから元のマシンにVMマイグレーションしています。

SSDも流用しようとしたのですが、気がつけば5年保証の満了まであと数ヶ月で、SMARTの読み書き総量のデータもしっかり使い込まれた数字がでてきたので、SSDは買い替えることにしました。

Data Units Read: 999,683,761 [511 TB]
Data Units Written: 241,890,831 [123 TB]

スイッチサイエンスさんの配信があった日、ちょうど場所がアキバだったので、Samsung 990 EVO Plus 1TBを購入してきました。

配信後に飲んだり喋ったりして疲れているはずなのに、深夜テンションでそのまま組み付けて

OSをセットアップして

結局VMの移設まで完了してしまいました。3時までやっているMastodonのログがでてきて、アホだ……。

VMの移設がそんな時間だったので、ふつうにシャットダウンして、VMの構成ファイルとディスクイメージを転送し、移行先でvirsh defineして完了という具合です。Dockerコンテナも、止めて全部転送して立ち上げるだけでした。

バックアップスクリプトの構築

バックアップは、virshのバックアップの仕組みを自でてどうにかしようとしましたが、XMLの用意が面倒すぎたので、このへんをうまいことコマンド化しているvirtnbdbackupを使用しました。

github.com

Ubuntu Serverはaptでインストールできるので、これでサクッと導入しました。というか、はじめGitHubから持ってきたら、依存関係があまりに面倒で断念しました。

$ sudo apt install virtnbdbackup

シンプルにバックアップするコマンドがこんな感じ。

sudo virtnbdbackup -d shrimp -l full -o /usb-ssd/kvm-backup/shrimp
sudo virtnbdbackup -d shrimp -l inc -o /usb-ssd/kvm-backup/shrimp

ESXiの頃に使っていたghettvcbはフルバックアップのみだったので、増分バックアップが取れるのは嬉しいですね。旧サーバーのSSDの総読み込み量が多かったのは、おそらくバックアップの量と思われるので、増分バックアップSSDの使用カウントが減らせるならアリです。

そういうわけで、増分バックアップを利用したバックアップスクリプトを作ってみました。

gist.github.com

日曜日にフルバックアップを作成して、それ以外の曜日は増分バックアップをしています。バックアップ先は日曜日の日付のディレクトリ以下にしていて、2週分を保持し、入れより古くなったものは削除しています。つまり、最大14世代くらいは確保できている感じですね。以前はフルバックアップ3世代だったので、だいぶ増やせました。

バックアップ作成先は、先ほどの旧SSDをUSB変換ケースに突っ込んで接続して使用することにしました。保証はまもなく終わりますが、書き込み保証まではまだまだあるので、これを使い潰すプランです。

スクリプトのログ出力機能がザルなので、このあたり拡充はまたおいおいやりたいと思います。やったら上のスクリプトも更新します。(追記)やってないんですが、細かなミスを直したりするのでgistに移動しました。

リストアの確認

リストアができなければバックアップにはならないので、テストもしっかり。導入当初に一回やりましたが、ブログ用を兼ねてもう一度、READMEの手順に沿ってやってみました。

まず、-o dumpオプションバックアップ状況を確認。JSONでズラッとバックアップのリストがでてきます。最初がフルバックアップ、以降が増分バックアップであることが確認できました。

akkie@joie:~$ virtnbdrestore -i /usb-ssd/kvm-backup/20250406/shrimp -o dump
[2025-04-13 15:42:52] INFO lib common - printVersion [main]:  Version: 2.0 Arguments: /usr/bin/virtnbdrestore -i /usb-ssd/kvm-backup/20250406/shrimp -o dump
[2025-04-13 15:42:52] INFO root files - dump [main]:  Dumping saveset meta information
[2025-04-13 15:42:52] INFO root files - dump [main]:  /usb-ssd/kvm-backup/20250406/shrimp/vda.full.data
[2025-04-13 15:42:52] INFO root files - dump [main]:  /usb-ssd/kvm-backup/20250406/shrimp/vda.inc.virtnbdbackup.1.data
[2025-04-13 15:42:52] INFO root files - dump [main]:  /usb-ssd/kvm-backup/20250406/shrimp/vda.inc.virtnbdbackup.2.data
[2025-04-13 15:42:52] INFO root files - dump [main]:  /usb-ssd/kvm-backup/20250406/shrimp/vda.inc.virtnbdbackup.3.data
[2025-04-13 15:42:52] INFO root files - dump [main]:  /usb-ssd/kvm-backup/20250406/shrimp/vda.inc.virtnbdbackup.4.data
[
    {
        "virtualSize": 42949672960,
        "dataSize": 7107969024,
        "date": "2025-04-03T00:37:10.168819",
        "diskName": "vda",
        "diskFormat": "qcow2",
        "checkpointName": "virtnbdbackup.0",
        "compressed": false,
        "compressionMethod": "lz4",
        "parentCheckpoint": "",
        "incremental": false,
        "streamVersion": 2
    },
    {
        "virtualSize": 42949672960,
        "dataSize": 2224422912,
        "date": "2025-04-09T09:50:45.344842",
        "diskName": "vda",
        "diskFormat": "qcow2",
        "checkpointName": "virtnbdbackup.1",
        "compressed": false,
        "compressionMethod": "lz4",
        "parentCheckpoint": "virtnbdbackup.0",
        "incremental": true,
        "streamVersion": 2
    },
    ...(あと3つぶんあるけど略)..
}

増分バックアップを含むデータなので、リストアには--untilオプションを使用します。パラメータには、JSONデータのcheckpointNameの値を指定します。

virtnbdrestore -i /usb-ssd/kvm-backup/20250406/shrimp -o /tmp/restore-shrimp --until virtnbdbackup.1

実行中の様子。データ読込中のデータサイズが、実際よりもなんかやたら多く見えるのはよくわからないですが、買い物で100円のところ「はーい100万円!」って言ってくるおっちゃんみたいなものだと思うことにします。

最後にこんなお知らせが出てきましたが、これはvirshで管理してないところに出力されてるから、登録は自分で頑張れという意味ですね。

[2025-04-13 15:49:46] WARNING virt client - refreshPool [main]:  Restore path [/tmp/restore-shrimp] seems not to be an libvirt managed pool, skipping refresh.

リストアされたファイルを見てみます。xmlVMの構成ファイル、qcow2ファイルがディスクイメージですね。

akkie@joie:/tmp/restore-shrimp$ ls
shrimp-sda.qcow2  vmconfig.virtnbdbackup.4.xml

オリジナルが稼働中ですので、うまいこと名前を変えて、起動してみます。まずはディスクイメージの移動と、VM構成ファイルの書き換えをします。名前・UUID、MACアドレスは重複がないように書き換えます。やり忘れて、オリジナルの設定を書き換えてしたって焦りましたがなんとかなりました。ディスクイメージのパスも変更後の名前にして、ネットワークデバイスはリンクダウンの状態にします(OS内のIPアドレス設定が固定だと重複するため)。

# ディスクイメージを名前変更しながら移動
akkie@joie:/tmp/restore-shrimp$ sudo mv shrimp-sda.qcow2 /vmimages/restored-shrimp-sda.qcow2
# VM設定ファイルを編集
akkie@joie:/tmp/restore-shrimp$ vi vmconfig.virtnbdbackup.4.xml 

  <name>restored-shrimp</name> ※名前を変更する
  <uuid>67c8d2d8-87a3-4da2-8a96-f43bc73570e8</uuid> ※UUIDが重複しないように1番違いとかにする
(略)
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/vmimages/restored-shrimp-sda.qcow2' index='2'/> ※ファイル名を変更する
      <backingStore/>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </disk>
(略)
    <interface type='bridge'>
      <mac address='****************'/> ※MACアドレスが重複しないように1番違いとかにする
      <source bridge='bridge0'/>
      <target dev='vnet0'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
      <link state="down"/> ※リンクダウンの状態にするために追記
    </interface>
<source file='/vmimages/restoredshrimp-sda.qcow2' index='2'/>

設定ファイルが変更できたら、virsh defineで登録します。

# 
akkie@joie:/tmp/restore-shrimp$ virsh define vmconfig.virtnbdbackup.4.xml 
Domain 'restored-shrimp' defined from vmconfig.virtnbdbackup.4.xml

Cockpitで確認。VM一覧にVMが増えていますね。

VMの詳細画面。ディスクイメージ名がリストアしたものになっていて、ネットワークデバイスはUnplugされた状態です。

VMを起動します。無事起動して、ログインできたらリストア成功です。ここからファイルをレスキューしたいときなどは、IPアドレスを書き換えてからネットワークデバイスを接続して、ファイルをやり取りすれば良いでしょう。


まとめ。そして無償版ESXiのやつ

これでついに脱ESXiが完了しました。技術スタックをまとめると、こんな感じになっています。

ESXiの前がCentOS 5とか6でXenホストを組んでいたので、10何年か振りにLinuxに戻ってきましたね。

ふう…やれやれ、と思っていたら、冒頭のとおり、今週になってESXiの無償ライセンス版が復活したとのこと。ESXi 8.0U3eでは無償ライセンスキーが組み込まれた状態でISOイメージが提供されているようです。Broadcomアカウントアカウントの取得が必要ですが、無償で取得できるので、手続きさえできればダウンロードできました。

私の自宅環境はもう移行作業を終えてしまったので、ここからまたVMwareに戻ることはなく、失った信頼を取り戻すのは大変ですねという感じです。

また、ガチ目的で使って、またライセンスがどうだこうだで振り回されるのもイヤといえばイヤなので、すぐ飛びついていいものなのかどうかは、試されるところではあります。空いているマシンにでも入れて、検証自体はしようと思いますが。

ESXi無償版復活を素直に喜んでいいのかは悩みつつも、それ自体は歓迎です。いいぞ……次はvSphere Essentials系というか、手頃な中小規模の価格設定の復活だ……(?????????)。