あっきぃ日誌

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

自宅サーバーのESXi上のVMをKVM仮ホストに移行した

先月書いていた、自宅WebサーバーのPHPスクリプトおよびプロダクトのPHP8.3化に目処がついて、WebサーバーもようやっとUbuntu Server 24.04になりました。

akkiesoft.hatenablog.jp

これで自宅ESXiサーバー内の、今後もVMとして運用していくものがすべてUbuntu Server 24.04に移行できたので、いよいよ仮ホストに移行しました。クソ長いブログですが、これでもまだ完了できておらず、途中経過です。

この1年くらいの移行作業まとめ

まずはおさらい。1年くらい前にESXiサ終ブログを書いてから実行していた、自宅サーバーの移行作業を改めて書くとこんな感じ。

akkiesoft.hatenablog.jp

  1. イクラをDockerコンテナ化
  2. 仮ホストのM75q-2にUbuntu Server 24.04をセットアップしてCockpitを触り慣れる
  3. DHCP+DNSサーバーVMと、VM上のDockerホストから持っていけそうなコンテナをPi 5に移行する
  4. 今後もVMとして運用していくVMUbuntu Server 24.04化

書いていて思い出したんですが、今回の移行がのびのびになったのは、まず仮ホストにしようと思っていたM75q-2が仕事に使われることになって、数ヶ月客先のDCに出張していた影響があったのでした。そして、帰ってきてやれやれと思ったらProxmoxのお仕事が入って、脳みそのリソースがそっちに振られていました。あと、ブログを見返したら、RPiのOSアップデートもやっていました。ものが多いと管理するものも多くてダメですね。

というわけで、本格的な作業はほとんどが今年に入ってからエイヤでやっていました。

Pi 5移行は16GB RAM版が来たので思いつきでやりましたが、本来は予定外で、すべて元の自宅サーバーに収めるつもりでいました。ぜんぶ終わったらまた自宅サーバーに戻してPi 5を片付けても良さそうですが、まあ、いいかなと。

Pukiwikiの作業はまあまあ重かったかも。たぶんこれで別の日記が書けそうですが、基本的には公式のUTF-8化ツールでコンバートして、VScodeで最新のコードとdiffを取りながら設定とスキンを最新化したみたいな、泥臭い内容なのでたぶん役に立たないです。あと、EUC-JPのURLからUTF-8のURLにリダイレクトしたいなと思ってググったら、自分の記事を引用している別の人の記事がでてきてひっくり返りました。Pukiwikiの作業は、社内サーバーでも同様の作業が発生しました。PHP8.3でも動くPukiwikiすごいよな……。

今日のブログの作業

振り返りが長すぎましたが、以下が今日のブログでやる作業。

  1. ESXi上に残っている、Pi 5には持っていかないコンテナ(Mastodonとマイクラ)を仮ホストに移行して、Ubuntu Server 20.04なDockerホストVMx2をたたむ
  2. ESXi上のVMを仮ホストに移行
    • ルーターVMの動作検証と仮ホストのブリッジ調整
  3. 仮ホスト上でバックアップ体制の調整←いまここ

コンテナの仮ホストへの移行

新本番環境では、KVMホストとDockerホストが兼用になる想定なので、仮ホストも同様に構成してあります。

よって、2つのコンテナは、コンテナだけを仮ホストにゴリッと移行します。シンプルにdocker-compose downして、構成とボリュームをrsyncし、仮ホストでdocker compose up -dしました。バックアップは移行前のスクリプトをベースに微調整するだけ。と思いきや、Mastodonコンテナのバックアップがガバガバでガッツリ修正ですよね。

Dockerの移行後、Cockpitではこんな感じで見えるようになりました。

docker-compose管理なので、ここで上げ下げをすることはないですが、ログを見たり、コンソールに入ったりするのは簡単なので、このへんは重宝しそうです。って書きながらスクショ用に開いたマイクラコンテナのログが不穏だったので、ブログを書き終わったら調査しないといけなくなりました。


ESXi上のVMを仮ホストへの移行

ESXi上のVMKVM環境に持って来るには、virt-v2vコマンドを使用しました。今回は最新化されたUbuntu Serverというわかりやすい環境だったためか、拍子抜けするほど楽に持ってこれました。これがCentOS8系だとかWindowsだとかだったら何かしら苦戦するのかしら……。

まず、仮ホストには、VMイメージを配置する用のNVMe SSDを1発差して、/vmimagesで見えるようにしておきました。この作業自体もCockpitでできたりして便利。さらに、仮想マシンの管理では以下のSSの通りストレージプールにできますが、VMの移行自体には不要でした。たぶん作らなくていいです。

また、仮ホストでSSH鍵を生成して、ESXiホストに公開鍵を登録して、パスワードなしでSSH接続できるようにしました。パスワードを指定する方法もありますが、鍵のほうがおすすめです。

(ESXi)# vi /etc/ssh/keys-root/authorized_keys
※仮ホストでSSH公開鍵を追記して保存

準備ができたら、ESXi上のVMをシャットダウンしてから、virt-v2vコマンドを実行します。オンライン移行はできないので注意(それはそう)。-o localはローカルストレージに配置、-osでパスを指定です。

# virt-v2v -i vmx -it ssh 'ssh://root@192.168.29.10/vmfs/volumes/970EVO/ejerouter/ejerouter.vmx' -o local -os /vmimages -of qcow2

ここで、-o libvirt -os <ストレージプール名>として、先のストレージプールを利用するパターンもありますが、これだとPermission deniedなどと怒られて起動できず、localに変更したら起動できるようになりました。

  • of qcow2はディスク形式の指定です。指定しないとrawになり、実際の移行は指定し忘れてrawでやってしまったのですが、qcow2のほうがディスクの実使用量を抑えられたりなんだり便利なので、指定すると良いでしょう。

rawで作ってしまった分は、VMを停止した状態にしてから、以下の手順で変換・修正可能です。実行の際はストレージの空き容量に注意です。面倒かつやっても許される状態なら、virt-v2vをやり直しても良いでしょう。

(ディスクイメージをrawからqcow2に変換)
akkie@m75q-2:/vmimages$ sudo qemu-img convert -f raw -O qcow2 zabbix2404-sda zabbix-sda.qcow2
akkie@m75q-2:/vmimages$ virsh edit zabbix

    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>※rawからqcow2に変更
      <source file='/vmimages/zabbix-sda.qcow2'/>※ファイル名を、変換したqcow2イメージに変更
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </disk>

※保存したら仮想マシンを起動して確認。不要なら変換元ディスクイメージを片付け

仮想マシン移行後のCockpitの仮想マシン一覧はこんな感じ。

仮想マシンの詳細画面もスッキリしていてすきですね。


仮想ディスクの拡張

そういえば、NASVMではディスク使用量が20%を切っているディスクイメージがあることを忘れてたので拡張をやりたくなりました。が、リサイズはCockpitではできないらしいので、コマンドで対応しました。qemu-imgコマンドでできるのは、うろ覚えレベルで知っていましたが、今後はちょくちょく必要になると思うので改めてメモします。これもVMを停止した状態で作業します。コマンドを実行したあとはVMを起動して、OS側の拡張作業をします。

akkie@m75q-2:/vmimages$ sudo qemu-img resize nasbi-sdb.qcow2 +20G

ルーターVMの動作検証と仮ホストのブリッジ調整

ルーターVMでは、LAN用の仮想NICと別に、プロバイダへのPPPoE接続用に仮想NICがありました。ESXiではvSwitchが分けてあり、そんな必要あったかなと思いましたが、結果的には不要で、仮ホストでは一つのブリッジに2つの仮想NICをぶら下げました。

が、VMを持ってきて起動しようとすると、OSがネットワーク起動待ちのまま起動せず、他のVMの疎通も壊れ始めるなど不穏な状態になりました。あれこれ調べた結果、ブリッジインターフェイスのSTPが有効になっていることが原因のようでした。以下の通りブリッジの設定を変更して解決できました。ブリッジのSTPってこう言うとき?に影響するのかあ。

akkie@m75q-2:~$ sudo nmcli con mod bridge0 bridge.stp no
akkie@m75q-2:~$ sudo nmcli con up bridge0

VMのバックアップ←いまここ

VMのバックアップはESXiサ終記事で一度検証していますが、改めて検証というか、まずは1世代でもいいから毎日のバックアップを取りたいです。まずは前回の記事通りにXMLを作成して、バックアップを取ります。

<domainbackup>
  <disks>
    <disk name="vda" backup="yes" type="file">
            <target file="/home/akkie/backup/kvm-backup/vm/ejerouter/ejerouter-vda.qcow2" />
            <driver type='qcow2'/>
    </disk>
  </disks>
</domainbackup>

コマンドを実行……アレ、Permission denied?

akkie@m75q-2:~$ virsh backup-begin ejerouter --backupxml /home/akkie/backup/kvm-backup/conf/ejerouter.xml
error: operation failed: failed to format image: 'Could not create '/home/akkie/vda.img': Permission denied'

/home/akkie/backupはNFSのマウントポイントなのですが、パーミッションとか他の保存先を試した結果、どうやら/home以下にマウントした私が悪かったっぽく、/backupを掘って変えてみたら成功しました。ええやん別に。

それはさておき。今までのESXi環境では、ghetto-vcbでフルバックアップ3世代保持でやっていました。日付ごとにディレクトリが作られる大変シンプルなもので、これを踏襲できたら良さそうですが、XMLの書き換えが実行ごとに必要なのが面倒そうですね。PythonとJinja2を使ってXMLを生成してジョブ管理とレポート生成みたいなのを思い浮かべましたが、ちょっと壮大な気もします。ヴーン。

あと、XMLを色々いじれば増分バックアップとかの世代管理てきなこともできそうなので、その辺りも活用できるならバックアップウィンドウが小さくできて良さそうです。悩ましい。

libvirt.org

あまり脱線してもいけないので、まずは以前を踏襲のスクリプトだけでも作りたいです。

まとめと今後のタスク

今回は、ESXiから仮ホストに一通り移して、ESXiの稼働VMをゼロにするところまでを作業しました。現在のESXiはこのとおり、何も動いていない状態です。

今後のタスクはこんな感じです。

  1. さっきのマイクラコンテナのエラーなんだった?
  2. 仮ホストでVMのバックアップを整える
  3. ESXi上のVMのうち、残しておきたいやつをどこかに退避。NASiSCSI領域かなあ
  4. ESXiサーバーのでUbuntu Server 24.04 + Docker + KVM + Kockpit環境を構築
  5. 仮ホストからVMとコンテナを移動
  6. 仮ホストを片付け

ESXiのVMで残しておきたいのはWebサーバーあたりでしょうか。コンテンツ整理でうっかり消えてるもののバックアップして残しておきたい程度ですけど。リストを見ながらさっさと片付けたいところ。

ESXiのマシンは、当初の想定通り、新ホストとして継続して使うつもりです。M75q-2だとCPUメモリの性能も上かつコンパクトでいいなと思ったのですが、10GbE接続ができないので、10GbE接続ができる現在のマシンを引き続き使いたいです。10GbE接続だと、MacからNASVMにCIFS接続したときに早くていいんですよね……そこが理由のほぼ100%を占めています。

さて、マイクラのコンテナを見に行きますか……。