第13章 Image Mode for RHEL でのファイルシステムの管理
イメージモードでは、バックエンドとして OSTree が使用され、ストレージ用に composefs がデフォルトで有効になっています。そのため、/opt などに書き込む派生コンテナーイメージに、サードパーティーのコンテンツを簡単にインストールできます。/opt および /usr のローカルパスはプレーンディレクトリーであり、/var へのシンボリックリンクではないためです。
サードパーティーのコンテンツを /opt にインストールすると、サードパーティーのコンポーネントも実行時に /opt 内のサブディレクトリーに書き込もうとする可能性があります。そのため、競合が発生する可能性があります。
13.1. /sysroot による物理ルートと論理ルート リンクのコピーリンクがクリップボードにコピーされました!
bootc システムが完全に起動すると、システムは chroot よって作成された環境と似た状態になります。つまり、オペレーティングシステムが、現在実行中のプロセスとその子プロセスの見かけ上のルートディレクトリーを変更します。物理ホストのルートファイルシステムは /sysroot にマウントされます。chroot ファイルシステムはデプロイメントルートと呼ばれます。
残りのファイルシステムパスは、システムブートの最終ターゲットとして使用されるデプロイメントルートの一部です。システムは、ostree=kernel 引数を使用してデプロイメントルートを検索します。
/usr-
すべてのオペレーティングシステムのコンテンツを
/usrに保存することが望ましいですが、必須ではありません。/binなどのディレクトリーは、/usr/binへのシンボリックリンクとして機能します。このレイアウトにより、オペレーティングシステムとホスト固有のリソースが分離されます。
composefs が有効な場合、/usr は / と変わりません。両方のディレクトリーは同じ不変イメージの一部であるため、bootc システムで完全な UsrMove を実行する必要はありません。
/usr/local-
bootc システムを使用すると、デフォルトのエントリーポイントとしてカスタムコンテナーイメージを作成できます。そのため、ベースイメージでは
/usr/localが通常のディレクトリー、つまりデフォルトのディレクトリーとして設定されます。
デフォルトのファイルシステムレイアウトでは、/opt と /usr/local の両方が通常のディレクトリーとして存在します。つまり、これらのディレクトリーはビルド時には書き込み可能で、実行時には変更できません。これは、たとえば、これらのシンボリックリンクを /var に作成する RHEL CoreOS とは異なります。
/etc/etcディレクトリーにはデフォルトで変更可能な永続状態が含まれますが、etc.transient configオプションを有効にすることがサポートされています。ディレクトリーが変更可能な永続状態にある場合は、アップグレード全体で 3 方向のマージが実行します。-
新しいデフォルトの
/etcをベースとして使用します -
現在の
/etcと以前の/etcの差分を新しい /etc ディレクトリーに適用します。 -
同じデプロイメントのデフォルトの
/usr/etcとは異なる、ローカルで変更されたファイルを/etcに保持します。
-
新しいデフォルトの
ostree-finalize-staged.service は、新しいブートローダーエントリーを作成する前に、シャットダウン時にこれらのタスクを実行します。
これは、Linux システムの多くのコンポーネントが /etc ディレクトリーにデフォルトの設定ファイルを置いて出荷されるために発生します。デフォルトパッケージに含まれていない場合でも、デフォルトではソフトウェアは /etc 内の設定ファイルのみをチェックします。/etc の明確なバージョンを持たない、bootc イメージベースではない更新システムは、インストール時にのみ設定され、インストール後は変更されません。これにより、/etc システムの状態が初期イメージバージョンの影響を受けるようになり、たとえば /etc/sudoers.conf に変更を適用する際に問題が発生し、外部からの介入が必要になる可能性があります。ファイル設定の詳細は、RHEL bootc イメージのビルドとテスト を参照してください。
/var-
/varディレクトリーは 1 つのみです。デフォルトでは、/varディレクトリーに配置されたファイルとデータは、明示的に削除されるまで保持され、異なるセッションやシステムの再起動後も利用できます。/var パーティションまたはそのサブディレクトリーは、一時ファイルシステム (TMPFS) やネットワークマウントポイントのようなマウントポイントにすることもできます。/varに専用のパーティションを作成しない場合、システムによってバインドマウントが実行され、単一の共有の永続的な/ostree/deploy/$stateroot/varが/varディレクトリーに作成されます。これにより、両方のディレクトリーがデプロイメント間で同じデータを共有するようになります。
/var ディレクトリーは 1 つだけです。別個のパーティションでない場合、物理的には /var ディレクトリーは /ostree/deploy/$stateroot/var へのバインドマウントとなり、利用可能なブートローダーエントリーのデプロイメント間で共有されます。
デフォルトでは、/var 内のコンテンツはボリュームとして機能します。つまり、コンテナーイメージのコンテンツは最初のインストール時にコピーされ、その後は更新されません。
/var ディレクトリーと /etc ディレクトリーは異なります。比較的小さな設定ファイルには /etc を使用でき、必要な設定ファイルは、多くの場合 /usr 内のオペレーティングシステムバイナリーにバインドされます。/var ディレクトリーには、システムログ、データベースなどの任意の大きさのデータが格納されます。デフォルトでは、オペレーティングシステムの状態がロールバックされても、このディレクトリーはロールバックされません。
たとえば、dnf downgrade postgresql などの更新を実行しても、/var/lib/postgres 内の物理データベースには影響しません。同様に、bootc update または bootc rollback を実行しても、このアプリケーションデータには影響しません。
/var を別々にしておくと、新しいオペレーティングシステムの更新を適用する前にステージングをスムーズに実行できるようになります。つまり、更新はダウンロードされて準備完了ですが、再起動時にのみ有効になります。同じことが Docker ボリュームにも当てはまり、アプリケーションコードとそのデータが切り離されます。
アプリケーションに /var/lib/postgresql などの事前に作成されたディレクトリー構造を持たせたい場合に、このケースを使用できます。これには systemd tmpfiles.d を使用します。ユニットで StateDirectory=<directory> を使用することもできます。
- その他のディレクトリー
-
コンテナーイメージ内の
/run、/proc、またはその他の API ファイルシステム内のコンテンツを出荷することはサポートされていません。それ以外にも、/usrや/optなどの他のトップレベルディレクトリーは、コンテナーイメージとともにライフサイクル化されます。 /opt-
bootcはcomposefsを使用するため、/optディレクトリーは/usrなどの他の最上位ディレクトリーと同様に読み取り専用になります。
ソフトウェアが /opt/exampleapp 内の独自のディレクトリーに書き込む必要がある場合は、ログファイルなどの操作のために、たとえば /var にリダイレクトするシンボリックリンクを使用するのが一般的なパターンです。
RUN rmdir /opt/exampleapp/logs && ln -sr /var/log/exampleapp /opt/exampleapp/logs
オプションで、これらのマウントを動的に実行するサービスを起動するように systemd ユニットを設定することもできます。以下に例を示します。
BindPaths=/var/log/exampleapp:/opt/exampleapp/logs
- 一時ルートを有効にする
-
永続化する必要があるコンテンツ用の
/varへのシンボリックリンクを使用して、/usrおよび/optを含むすべてのトップレベルディレクトリーにソフトウェアが一時的に (次回の再起動まで) 書き込むことを可能にするには、一時的なルートを有効にします。デフォルトで完全に一時的な書き込み可能なrootfsを有効にするには、/usr/lib/ostree/prepare-root.confで次のオプションを設定します。
[root]
transient = true
これにより、永続化する必要のあるコンテンツ用の /var へのシンボリックリンクを使用して、ソフトウェアが一時的に /opt に書き込めるようになります。