メモ：CoreOS の自動アップデートを手動でロールバックする

<ins>更新(2014/07/11)：<br/> 
自動アップデートをスキップする方法を最後に追加しました。</ins>
<br/>
<br/>
<ins>お詫びと訂正(2014/07/10)：<br/>
本エントリの中で、「ロールバック後アップデートがスキップされ次回アップデートまでそのまま使い続けられる」旨の記述がありましたが、間違いでした。<br/>
しばらくすると、再度同じアップデートが行われてしまいます。<br/>
これが意図された正しい動作なのか疑問が残りますが、アップデートは必ず実行されるようです。<br/>
不正確な情報発信をしてしまい、申し訳ありませんでした。
</ins>

CoreOS は、リードオンリーの /usr パーティションを A、B ２つ持っていて、自動アップデートでは使われていない方のパーティションにインストールされ、リブート(これも自動)時に切り替えています。

下の図では 最初 A が使われていて、A が起動中に自動アップデートが始まると、B に対してインストールが始まります。
インストール後、B をプライマリに設定して、リブートがかかり、B をマウントして起動します。

![Updates & Patches - CoreOS 2014-07-01 11-54-52 2014-07-01 11-55-01.png](https://qiita-image-store.s3.amazonaws.com/0/1932/ea3cab0a-105a-24f4-b717-6f7d1c643ef8.png)

ここで、B でブートに失敗すると、A がブート対象になり、自動的にロールバックがかかります。

<del>ちなみに、アップデート・サーバは各 CoreOS マシンの machine-id を見ている？ので、同じアップデートは２回実行されることはありません。</del>
<del>起動時に `/var/lib/update_engine/prefs/` をチェックして、前回のアップデートを認識していました。</del>

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 でブートされます。
<del>同じアップデートは２回実行されないので、次のリリースまで、このまま A を使い続けることが出来ます。</del>

<ins>追記(2014/07/11)：</ins>
自動アップデートに関わるファイルで編集／カスタマイズ可能なファイルは、
`/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/