更新(2014/07/11):
自動アップデートをスキップする方法を最後に追加しました。
お詫びと訂正(2014/07/10):
本エントリの中で、「ロールバック後アップデートがスキップされ次回アップデートまでそのまま使い続けられる」旨の記述がありましたが、間違いでした。
しばらくすると、再度同じアップデートが行われてしまいます。
これが意図された正しい動作なのか疑問が残りますが、アップデートは必ず実行されるようです。
不正確な情報発信をしてしまい、申し訳ありませんでした。
CoreOS は、リードオンリーの /usr パーティションを A、B 2つ持っていて、自動アップデートでは使われていない方のパーティションにインストールされ、リブート(これも自動)時に切り替えています。
下の図では 最初 A が使われていて、A が起動中に自動アップデートが始まると、B に対してインストールが始まります。
インストール後、B をプライマリに設定して、リブートがかかり、B をマウントして起動します。
ここで、B でブートに失敗すると、A がブート対象になり、自動的にロールバックがかかります。
ちなみに、アップデート・サーバは各 CoreOS マシンの machine-id を見ている?ので、同じアップデートは2回実行されることはありません。
起動時に /var/lib/update_engine/prefs/
をチェックして、前回のアップデートを認識していました。
CoreOS ではブートパーティションの管理に cgpt
が使われています。
使用中のパーティションを調べる
core@localhost ~ $ sudo su
localhost core # findmnt -n --raw --output=source --target=/usr
/dev/sda3
localhost core # cgpt show -v /dev/sda3
start size part contents
264192 2097152 3 Label: "USR-A"
Type: Alias for coreos-rootfs
UUID: 7130C94A-213A-4E5A-8E26-6CCE9662F132
Attr: priority=1 tries=0 successful=1
localhost core # cgpt show -v /dev/sda4
start size part contents
2492416 2097152 4 Label: "USR-B"
Type: Alias for coreos-rootfs
UUID: E03DD35C-7C2D-4A47-B3FE-27F15780A57C
Attr: priority=0 tries=0 successful=0
priority
が大きい方が最初に選択されます。
tries
の数だけリトライされ、0 になってもダメな場合は、次の priority をブートします。
successful
をセットすると、ブート可能のものと判断され、使い続けられます。
自動アップデートが実行され、B に対してインストールされると、
localhost core # cgpt show -v /dev/sda4
start size part contents
2492416 2097152 4 Label: "USR-B"
Type: Alias for coreos-rootfs
UUID: E03DD35C-7C2D-4A47-B3FE-27F15780A57C
Attr: priority=2 tries=1 successful=0
の状態でリブートがかかります。
リブート後に見てみると、
localhost core # findmnt -n --raw --output=source --target=/usr
/dev/sda4
localhost core # cgpt show -v /dev/sda4
start size part contents
2492416 2097152 4 Label: "USR-B"
Type: Alias for coreos-rootfs
UUID: E03DD35C-7C2D-4A47-B3FE-27F15780A57C
Attr: priority=2 tries=0 successful=0
しばらくすると、successful=1
に更新されます。
さて、ここでブートには成功したものの、内部のプログラムにバグやデグレードがあった場合、手動で A にロールバックしたくなります。
手動ロールバック
cgpt prioritize
を使って起動したパーティションのプライオリティを上げてリブートします。
localhost core # cgpt show -v /dev/sda3
start size part contents
264192 2097152 3 Label: "USR-A"
Type: Alias for coreos-rootfs
UUID: 7130C94A-213A-4E5A-8E26-6CCE9662F132
Attr: priority=1 tries=0 successful=1
localhost core # cgpt prioritize /dev/sda3
localhost core # cgpt show -v /dev/sda3
start size part contents
264192 2097152 3 Label: "USR-A"
Type: Alias for coreos-rootfs
UUID: 7130C94A-213A-4E5A-8E26-6CCE9662F132
Attr: priority=2 tries=0 successful=1
localhost core # reboot
これで、A でブートされます。
同じアップデートは2回実行されないので、次のリリースまで、このまま A を使い続けることが出来ます。
追記(2014/07/11):
自動アップデートに関わるファイルで編集/カスタマイズ可能なファイルは、
/etc/coreos/update.conf
ここにスキップしたい最新バージョンを書き込めば次回リリースまで更新を停止出来ます。
GROUP=alpha
↓
GROUP=alpha
COREOS_RELEASE_VERSION=367.0.0
ただし、次回のリリースで更新が完了したら、元に戻さないとアップデートが繰り返されてしまいますので、注意。
ちなみに、GROUP
を変更すると、現在使用しているリリースチャンネルを変更することも出来ます。(これは公式ガイドあり)
Switching Release Channels
http://coreos.com/docs/cluster-management/setup/switching-channels/