環境
ubuntu 16.04
linux ubuntu 4.4.0-159-generic
$criu check
root@ubuntu:~# criu check
Warn (criu/autofs.c:77): Failed to find pipe_ino option (old kernel?)
Looks good.
ライブマイグレーション 実行
エラーログとりわすれ
dump faile failedみたいなエラーが出ていた.
kernelのバージョンに問題(対応していないか、criuにバグがある)
https://github.com/lxc/lxd/issues/2788
kernel 4.4.0-45までは正常に動いていたとの報告がある.とりあえずライブマイグレーションができていたカーネルに戻すことにしました.
4.4.0-159 -> 4.15.0-62
カーネルのダウンロードと変更方法
カーネルダウンロード方法
https://qiita.com/ego/items/36e9baccc80097950195
カーネル変更方法
http://sweng.web.fc2.com/ja/linux/ubuntu/change-default-boot-kernel.html
カーネルを戻して試しても効果なし
メモリのサイズが問題かと思い
4Gb->8Gbに変更しても同様の問題が発生する。
そもそもの原因が
CRIUを利用したコンテナのライブマイグレーション動作を手動してみて
dumpファイルの作成OK
dumpファイルの転送OK
dumpファイルの復元OK
で失敗する部分がコンテナが起動した状態では失敗するみたいでした。
コンテナを起動した状態で、マイグレーションを行うと失敗しない。
CRIUのバージョンを上げてみることにした。
apt-get install criu
を行い得られたバージョンが2.6
最新がver.3.13
ライブマイグレーションに成功したときの環境にいれていたものがver3.11なので入れ直すことにしました.
https://github.com/checkpoint-restore/criu/tree/v3.11
上記から任意のバージョンをクローン後
makeするのだがエラーが出まくる.
https://translate.google.com/translate?hl=ja&sl=en&u=https://github.com/checkpoint-restore/criu/issues/481&prev=search
足りないものがあるので適宜入れる.
それでもエラーが発生する.
root@ubuntu:/var/log/lxd/beloved-raccoon# cat migration_restore_2019-10-21T14:20:11+09:00.log | grep Error
(00.585853) 549: Error (criu/namespaces.c:252): Can't setns 2/mnt: Invalid argument
(00.585860) 549: Error (criu/files.c:1196): Unable to open fd=10 id=0x1b6
(00.588945) 1: Error (criu/cr-restore.c:1455): 549 exited, status=1
(00.590859) 489: Error (criu/servicefd.c:148): sfd: Service fd PROC_PID_FD_OFF is being modified in protected context
(00.592092) 489: Error (criu/util.c:1364): stack 489#0: /usr/local/sbin/criu(print_stack_trace+0x2c) [0x4a565c]
(00.596152) 489: Error (criu/util.c:1364): stack 489#1: /usr/local/sbin/criu() [0x48a3ac]
(00.596155) 489: Error (criu/util.c:1364): stack 489#2: /usr/local/sbin/criu(close_service_fd+0x65) [0x48a8d5]
(00.596156) 489: Error (criu/util.c:1364): stack 489#3: /usr/local/sbin/criu(close_pid_proc+0x18) [0x4a2fd8]
(00.596158) 489: Error (criu/util.c:1364): stack 489#4: /usr/local/sbin/criu(__mntns_get_root_fd+0x165) [0x468d15]
(00.596159) 489: Error (criu/util.c:1364): stack 489#5: /usr/local/sbin/criu(open_path+0x10d) [0x44fa9d]
(00.596160) 489: Error (criu/util.c:1364): stack 489#6: /usr/local/sbin/criu() [0x44fff3]
(00.596161) 489: Error (criu/util.c:1364): stack 489#7: /usr/local/sbin/criu(open_vmas+0x6b) [0x462eab]
(00.596162) 489: Error (criu/util.c:1364): stack 489#8: /usr/local/sbin/criu() [0x4430ff]
(00.596163) 489: Error (criu/util.c:1364): stack 489#9: /usr/local/sbin/criu() [0x4453bb]
(00.596165) 489: Error (criu/servicefd.c:150): sfd: BUG at criu/servicefd.c:150
(00.681691) Error (criu/cr-restore.c:2334): Restoring FAILED.
一応解決した方法
ライブマイグレーションができない理由として
rawソケットにCRIUが対応していないこと
そのためdhcpなどのプロセスがコピーできず失敗する。
引っかかるプロセスとして/cupsd/dhclient/が私の環境ではエラーで止まる。
他の理由として
Apparmorがアクセスを制限している?
Apparmorについてそこまで詳しく知らないため、これだけが問題とは限らない。
もう一つの理由として、CRIUのバージョン
criu version 3.8をインストールするとうまくいった。
最新版がうまく動くとは限らないので、そもそも少し古いものをいれておくべきだった。
criu 3.8
http://download.openvz.org/criu/criu-3.8.tar.bz2
たまにライブグレーション元のコンテナの削除に失敗するため
安定してはいない.
そもそもバージョン下げたら治ったでは根本的な原因がわからないので
もう少し調べる必要がある.
わかったら追記します.
10/23 追記
CRIUを使用したライブマイグレーションに失敗する原因だが
上記に挙げた問題を改善しても失敗する。原因としてCRIUはipv4のTCPコネクションの保持までは行えるが、IPv6のTCPコネクションのリストができない
そのため
ソケットオプションに"IP_FREEBIND"を追記する必要がある。