Watanabebashi.netや私が自鯖で運用しているインフラは基本的にLXDコンテナで運用しているのですが、今回新サーバに移行するためLXDコンテナをホスト間に移行する方法をまとめます。

私の環境

  • 移行元ホストと移行先ホストの両方にLXDをインストール済み
  • 両ホストともLXDのストレージプールはdir
  • 移行前と移行後のLXDのバージョンは同じ(v5.0.2)

移行先ホストの初期設定

移行ホストでLXDの初期設定をします。

基本的にストレージプールとバージョンが同じだと大きな問題は起こらないのですが、コンテナに固定IP設定をしていたり、コンテナ間の通信でLXDホスト名(コンテナ名.lxd)ではなく、固定IPで通信している場合は、移行先ホストで同じサブネットマスクを設定し、同じIPアドレスが割り当てられるようにしておく必要があります。

上記のケースに該当しないと思っていても気づかずにそういった設定をしている場合もあるので、念のため以下のコマンドで移行すべきでしょう。

まず移行ホストで以下のコマンドを実行し、LXDのブリッジネットワーク設定を確認します。

lxc network show lxdbr0

すると以下のような出力が得られます。

config:
  ipv4.address: [自分のアドレス]
  ipv4.firewall: "false"
  ipv4.nat: "true"
  ipv6.address: [自分のアドレス]
  ipv6.firewall: "false"
  ipv6.nat: "true"
...

上記のipv4.addressとipv6.addressの値をメモしておき、移行先ホストでlxd initを実行する際に同じ値を設定します。

これでひとまずコンテナを移行する前の準備は完了しました。

コンテナの移行

コンテナを移行するには、移行ホストで以下のコマンドでパスワードを設定します。推測されにくいパスワードを設定してください。

lxc config set core.trust_password <パスワード>

次に、通信に必要な8443ポートを空けます。

クラスタリング等で利用している場合を除き、8443ポートは移行元ホスト以外がアクセスする必要はないためファイアウォールで移行元ホストからのアクセスのみ許可する設定にしてください。

例としてUFWでデフォルトはポートを閉じている場合以下のコマンドを実行します。

sudo ufw allow from <移行元ホストのIP> to any port 8443 proto tcp

その後、移行先ホストで以下のコマンドを実行し、LXDが外部からの接続を受け付けるようにします。

lxc config set core.https_address "[::]:8443"

そこから移行ホストで以下のコマンドを実行し、移行ホストをリモートとして登録します。

lxc remote add <任意の名前> <移行先ホストのIP>

その後通信に成功すると以下のような表示が出ます。

Generating a client certificate. This may take a minute...
Certificate fingerprint:<フィンガープリント>
ok (y/n/[fingerprint])?

ここで移行先ホストのフィンガープリントが正しいか確認を求められるので、移行ホストで以下のコマンドを実行し、フィンガープリントが一致していれば「y」と入力します。

lxc info | grep certificate_fingerprint

するとパスワードを求められるので先ほど設定したものを入力します。

以下の出力が出ると成功です。

Client certificate now trusted by server: <自分が設定した名前>

これで移行に必要な設定が完了したので、コンテナを停止してから移行します。

公式ドキュメントいわく、仮想マシンはライブマイグレーションが可能ですがコンテナでは限定的にサポートされているとのことなので当方は停止してから移行することにしました。

なお、私はlxc moveではなくcopyで移行しました。lxc moveの場合、移行元ホストでコンテナが削除されるため、移行に失敗した場合に備えてcopyが安全なのでおすすめです。

lxc stop <コンテナ名>
lxc copy <コンテナ名> <設定したリモート名>:<コンテナ名> --mode=push

Transferring instance: <コンテナ名> :xxxMBとでるので待ちます。

移行先を固定IPにしていた場合でも、コンテナOSサイドで何かいじってる場合は別ですが、サブネットマスクを同じにしたら基本的にlxc copyで引き継いでくれるので特段追加設定は不要です。

以上で移行は完了です。このコマンドで移行先ホストの8443ポートを閉じ、パスワードも削除しましょう。

lxc config unset core.https_address
lxc config unset core.trust_password

ufwの許可も削除しておきましょう。

ufw status numbered
ufw delete <設定したルールの番号>

LXDはこのように簡単に移行でき、バックアップやその復元も簡単なのでおすすめです。