RHEL Atomic Hostとは
RHEL Atomic Hostは、Dockerを利用するために専用に設計されたLinuxディストリビューションです。RHEL7をベースとして、Dockerの利用に必要なパッケージ、および、etcdなど、Kubernetesから管理するための前提パッケージが含まれた構成になっています。現在、Red Hatから、パブリックベータが公開されています。
RHEL/CentOSに普通にDockerをインストールした場合、Docker Imageの保存領域(dm-thinで管理するディスク領域)がスパース形式のディスクイメージファイルという、ちょっとイケてない構成になりますが、RHEL Atomic Hostでは、専用の論理ボリュームがイメージの保存領域として用意されるなど、Dockerの利用に特化したカスタマイズ/チューニングも行われています。
RHEL Atomic Hostのバージョン管理方式
驚くことに、RHEL Atomic Hostには、「yumコマンド」が入っていません。Docker専用OSなので、個別パッケージの追加などのカスタマイズは不要という発想なのです。ただし、RHEL Atomic Hostそのもののバージョンアップは存在します。初期バージョンは「7.0.0」ですが、現時点では、マイナーバージョン「7.0.1」がリリースされています。バージョンアップ処理は、次の「atomic」コマンドを利用します。
まず、現在のバージョンを確認します。
# atomic status VERSION ID OSNAME REFSPEC * 7.0.0 dcf0c846ff rhel-atomic-host rhel-atomic-host:rhel-atomic-host/7/x86_64/standard
次のコマンドで、最新バージョンをRHN(Red Hat Network)から取得します。(事前にRHNへのサブスクリプション登録が必要です。)
# atomic upgrade ...(中略)... Updates prepared for next boot; run "systemctl reboot" to start a reboot
最後のメッセージにあるように、次回のリブート時は、新しいバージョンで起動してきます。リブート前にステータスを確認すると、次のように2つのバージョンが存在することが分かります。
# atomic status VERSION ID OSNAME REFSPEC 7.0.1 18a9998c80 rhel-atomic-host rhel-atomic-host-beta-ostree:rhel-atomic-host/7/x86_64/standard * 7.0.0 dcf0c846ff rhel-atomic-host rhel-atomic-host-beta-ostree:rhel-atomic-host/7/x86_64/standard
リブート後にステータスを確認すると、「7.0.1」で起動していることが分かります。
# atomic status VERSION ID OSNAME REFSPEC * 7.0.1 18a9998c80 rhel-atomic-host rhel-atomic-host-beta-ostree:rhel-atomic-host/7/x86_64/standard 7.0.0 dcf0c846ff rhel-atomic-host rhel-atomic-host-beta-ostree:rhel-atomic-host/7/x86_64/standard
やっぱり元のバージョンに戻したくなった時は、次のコマンドでOKです。
# atomic rollback 7.0.0
中の仕組み
ついにバージョンアップ後のロールバック機能が実装されたのかと胸熱になりますが、内部的には、rpm-ostreeという、Gitと類似の仕組みを使っています。(レイヤー型ファイルシステムのようなことはしていません。)複数バージョンのディレクトリーツリーをマージしたリポジトリーを内部に用意しておき、それぞれのバージョンのファイル群を個別のディレクトリーに「チェックアウト」(ostree用語で「デプロイ」)しています。システム起動時は、指定のバージョンがチェックアウトされたディレクトリーにchrootして起動してきます。
なお、「/var」は、rpm-ostreeの管理対象外となっているので、バージョンアップで消える(変更される)と困るファイルは、/var以下に保存する必要があります。ルートディレクトリーを見ると、次のように、書き込みが発生するディレクトリーは、/varの下に移動された構成になっていることが分かります。
# ls -l / | grep var lrwxrwxrwx. 1 root root 8 Jan 9 19:38 home -> var/home lrwxrwxrwx. 1 root root 7 Jan 9 19:38 mnt -> var/mnt lrwxrwxrwx. 1 root root 7 Jan 9 19:38 opt -> var/opt lrwxrwxrwx. 1 root root 12 Jan 9 19:38 root -> var/roothome lrwxrwxrwx. 1 root root 7 Jan 9 19:38 srv -> var/srv drwxr-xr-x. 24 root root 4096 Jan 9 19:19 var
「/etc」については、また違う特別扱いで、バージョンアップ時は、既存のファイルとバージョンアップ後の内容がマージされるようになっています。
そして、通常、書き込みが発生しない「/usr」は、Readonlyでマウントされており、この中のファイルは変更ができません。そのため、複数バージョンで同じ内容のファイルは、内部的に同一ファイルへのハードリンクを用いて、重複排除するようになっています。