めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

RHEL Atomic Hostのバージョン管理方式

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でマウントされており、この中のファイルは変更ができません。そのため、複数バージョンで同じ内容のファイルは、内部的に同一ファイルへのハードリンクを用いて、重複排除するようになっています。