LXCの非特権コンテナを別ホストに移行する

Ubuntu14.04の非特権コンテナをUbuntu14.10にマイグレーションしようとして、ちょっとだけハマったので、移行手順をまとめておきます。

一度必要な設定をやってしまえば、移行は簡単でした。

旧ホスト(Ubuntu14.04)側

コンテナのバックアップ

コンテナの停止

今回はmysqlという名前のコンテナを移行してみたいと思います。

コンテナを実行しているユーザでログイン(ここではcontainer)

移行したいコンテナが停止している事を確認

STATEがRUNNINGになっていたら、lxc-stop -n {コンテナ名}で止める

$ lxc-ls --fancy
NAME     STATE    IPV4       IPV6  GROUPS  AUTOSTART
----------------------------------------------------
develop  STOPPED  -          -     -       YES
mysql    STOPPED  -          -     -       YES

コンテナを固める

$ tar zcvf mysql.tar.gz /home/container/.local/share/lxc/mysql
$ ls
mysql.tar.gz

コンテナを新しいホストに転送する

移行先ホストでもcontainerユーザで稼働させる前提です。

$ scp mysql.tar.gz container@{移行先ホストのIP}:/home/container

新ホスト(Ubuntu14.10)側

containerユーザでログインします。

LXCのインストール

$ sudo aptitude install lxc

LXCの設定

NICが10個まで使えるように設定

$ sudo sh -c 'echo "container veth lxcbr0 10" >> /etc/lxc/lxc-usernet'

コンテナを展開するディレクトリの作成

$ mkdir -p /home/container/.local/share/lxc

転送したコンテナの展開

--numeric-ownerをつけてuid/gidを保持するのがポイントです。

$ sudo tar --numeric-owner -xpzf /home/container/mysql.tar.gz -C /home/container/.local/share/lxc
$ sudo chown container:container /home/container/.local/share/lxc/{mysql,mysql/config}

使用するsub uid/gidの割り当て

コンテナで使用しているsub uid/gidを確認

以下のコマンドで、設定ファイルから探します

$ cat /home/container/.local/share/lxc/mysql/config | grep lxc.id_map
lxc.id_map = u 0 234071 65536
lxc.id_map = g 0 234071 65536

ここでは234071という数値と65536という数値がそれぞれ、sub uid/gidと、idを何個使うかを表しています(環境によってこの数値は違います)。この数値を覚えておいてください。

sub uid/gidの追加

今探した数値を使用します。 範囲で指定するので、今回の場合は234071〜299607です。 後半の数字は、234071 + 65535で求められます。

sudo usermod -v 234071-299607 -w 234071-299607 container

これで移行は完了です。

コンテナの起動

移行ができましたので、あとは通常どおりコンテナを起動するだけです。

$ lxc-start -n mysql

まとめ

普通にディレクトリごとコピーするだけではsub uid/gidが環境によって異なるため、設定をしないと動きませんでした。

ポイントとしては、

  • tarの展開時に--numeric-ownerを付ける
  • usermodコマンドでsub uid/gidを設定する

以上です!!動いてよかった!