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を設定する
以上です!!動いてよかった!