第13章 Image Mode for RHEL でのファイルシステムの管理
イメージモードは OSTree をバックエンドとして使用し、デフォルトではストレージの composefs を有効にします。つまり、たとえば /opt
および /usr
のローカルパスはプレーンディレクトリーであり、/var
へのシンボリックリンクがないため、派生コンテナーイメージにサードパーティーのコンテンツを簡単にインストールできます。
サードパーティーのコンテンツを /opt
にインストールすると、サードパーティーコンポーネントは実行時に /opt
内のサブディレクトリーへの書き込みを試みることもあり、競合が生じる可能性があることがあります。
13.1. /sysroot による物理ルートと論理ルート
bootc システムが完全に起動すると、chroot
によって作成された環境と似ています。つまり、オペレーティングシステムは、現在実行中のプロセスとその子の明らかな root ディレクトリーを変更します。物理ホストのルートファイルシステムは /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
/var ディレクトリーに単一の共有および永続的な /ostree/deploy/$stateroot
/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
RUN rmdir /opt/exampleapp/logs && ln -sr /var/log/exampleapp /opt/exampleapp/logs
オプションで、これらのマウントを動的に実行するサービスを起動するように systemd ユニットを設定することもできます。以下に例を示します。
BindPaths=/var/log/exampleapp:/opt/exampleapp/logs
BindPaths=/var/log/exampleapp:/opt/exampleapp/logs
- 一時ルートを有効にする
-
永続化する必要があるコンテンツ用の
/var
へのシンボリックリンクを使用して、/usr
および/opt
を含むすべてのトップレベルディレクトリーにソフトウェアが一時的に (次回の再起動まで) 書き込むことを可能にするには、一時的なルートを有効にします。デフォルトで完全に一時的な書き込み可能なrootfs
を有効にするには、/usr/lib/ostree/prepare-root.conf
で次のオプションを設定します。
[root] transient = true
[root]
transient = true
これにより、永続化する必要のあるコンテンツ用の /var
へのシンボリックリンクを使用して、ソフトウェアが一時的に /opt
に書き込めるようになります。
関連情報