LXCの非特権コンテナの移行

ゴール

  • 旧サーバにあるRedmineコンテナとMySQLコンテナを新サーバに移行

前提

参考リンク

kurochan-note.hatenablog.jp

旧サーバでやること

コンテナの停止

$ lxc-stop -n mysql
$ lxc-stop -n redmine

コンテナをtarで固める

$ cd /home/container/.local/share/lxc
$ sudo tar zcvf $HOME/mysql.tar.gz mysql
$ sudo tar zcvf $HOME/redmine.tar.gz redmine

↑sudoつけておく。使用するソフトウェアによっては自動的に独自のユーザを作ることもあり、所有者がバラバラでも正常に固めるため。

tarの転送

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

コンテナ用DHCPファイルも移行

$ scp /etc/lxc/dnsmasq.conf container@{移行先ホストのIP}:

新サーバでやること

tarの展開

$ mkdir -p /home/container/.local/share/lxc
$ sudo tar --numeric-owner -xpzf /home/container/mysql.tar.gz -C /home/container/.local/share/lxc
$ sudo tar --numeric-owner -xpzf /home/container/redmine.tar.gz -C /home/container/.local/share/lxc

↑sudoつけること!忘れると所有者情報が更新されてしまう。

パーミッションの設定

$ sudo chown :container /home/container/.local/share/lxc/{mysql,mysql/config}
$ sudo chown :container /home/container/.local/share/lxc/{redmine,redmine/config}

.local/share/lxc/{mysql,redmine}になるように配置できていればOK。いなければ適宜配置。

lxcインストール

非特権で動かせるように。DHCPの設定をしてる場合はそれもする。

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

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

sub uid/gidの追加

# sudo usermod -v 165536-231071 -w 165536-231071 container
↑確認したsub uid/gidから65535足した数値の範囲

おわり

移行完了。念のため一度再起動しておく。 確認として、移行先で

$ lxc-ls --fancy
NAME          STATE    IPV4        IPV6  AUTOSTART
--------------------------------------------------
mysql         STOPPED  -           -     NO
redmine       STOPPED  -           -     NO
$ ls -l /home/container/.local/share/lxc/mysql
total 16
drwxrwx---  3    165536 container 4096 May 13 01:18 ./
drwxr-xr-x  9 container container 4096 May 18 21:51 ../
-rw-rw-r--  1 container container  701 May 13 01:18 config
drwxr-xr-x 21    165536    165536 4096 May 18 19:56 rootfs/

となっていればOK。ほかのユーザとsub uid/gidが被ることがあるが大丈夫なのかなあ…