エアギャップ搬入を完走する
目標
持ち込みバンドルを作ってマニフェストで検証し、アーカイブにまとめて展開し、リポジトリを立てて、それだけでインストールします。エアギャップ環境の手順の全体を、一度で通します。
なぜ重要なのか
持ち込み媒体にrpmだけを入れてはいけません。rpm、repodata、GPG鍵、マニフェスト、チェックサム、インストール手順書の6つがすべて必要で、実際に最もよく抜けるのが、マニフェストとGPG鍵です。
そして検証は双方向である必要があります。マニフェストのすべてのファイルが媒体にあるか(欠落の検査)、そして媒体にマニフェストにないファイルがあるか(追加の検査)。欠落はインストールの失敗ですぐに表面化しますが、追加されたファイルは誰にも気づかれずに通り過ぎます。持ち込みの審査の観点では、こちらのほうが危険です。
ステップ
/root/airgap/rpmsディレクトリを作成し、treeとnanoを、依存関係まですべて(すでにインストール済みのものも含めて)そのディレクトリへダウンロードしてください。/root/airgap/MANIFEST.tsvを作成してください。1行目はNAME EPOCH VERSION RELEASE ARCH SHA256 FILEのヘッダー(タブ区切り)で、各rpmについて1行ずつ、その値を埋める必要があります。epochがないパッケージは0で埋めてください。rpmsディレクトリとマニフェストを/root/airgap/bundle.tar.gzにまとめ、そのアーカイブのsha256を/root/airgap/bundle.sha256に保存してください。/root/airgap/unpacked/にアーカイブを展開し、マニフェストのチェックサムと実際のファイルを突き合わせた結果を/root/airgap/verify.txtに保存してください。そして、マニフェストにないのにディレクトリにあるファイルの数を、数字1行で/root/airgap/extra.txtに書いてください(0である必要があります)。/root/airgap/unpacked/rpmsにメタデータを作成し、/etc/yum.repos.d/airgap.repoを作成してください。リポジトリIDはairgap-localで、nameにsnapshotと日付、baseurl=file:///root/airgap/unpacked/rpms、enabled=1、gpgcheck=0、metadata_expire=-1を含める必要があります。- ほかのリポジトリをすべて無効にして
airgap-localだけを有効にした状態で、treeを再インストールし、出力を/root/airgap/install.txtに保存してください。 - 状態の記録を残してください。
/root/airgap/state-modules.txtにモジュール一覧を、/root/airgap/state-userinstalled.txtにユーザーがインストールしたものの一覧を保存してください。 /root/airgap/report.txtを次の6行で作成してください。BUNDLE_ID=airgap-<오늘 날짜 YYYY-MM-DD>/PACKAGES=<rpms 안 .rpm 개수>/MANIFEST_LINES=<매니페스트의 헤더 제외 줄 수>/VERIFY=OK/EXTRA=0/INSTALLED_FROM=airgap-local(プレースホルダーは順に、今日の日付、rpmsの中の.rpmの数、ヘッダーを除いたマニフェストの行数です)
参考
- ダウンロードは
dnf download --resolve --alldeps --destdir=/root/airgap/rpms tree nanoです。 - NEVRAの取り出し:
rpm -qp --queryformat '%{NAME}\t%|EPOCH?{%{EPOCH}}:{0}|\t%{VERSION}\t%{RELEASE}\t%{ARCH}' <파일>(プレースホルダーはファイルです) - マニフェストにないファイルの探し方:
comm -13 <(정렬된 매니페스트 파일명) <(정렬된 실제 파일명)(プレースホルダーは、並べ替えたマニフェストのファイル名と、並べ替えた実際のファイル名です) - 1つのリポジトリだけを使う:
dnf --disablerepo='*' --enablerepo=airgap-local install -y tree(すでに入っていれば、install --reinstallではなくreinstallサブコマンドを使ってください。このdnfでは、前の形はエラーになります) - よくある間違い1: ステップ2で、epochが
(none)のまま入ってしまう場合です。三項表記で0を埋めてください。 - よくある間違い2: ステップ4で、マニフェストを絶対パスで作ってしまい、別のディレクトリで突き合わせが壊れる場合です。
持ち込みバンドルの収集
/root/airgap/rpmsディレクトリを作成し、treeとnanoを、依存関係まですべて(すでにインストール済みのものも含めて)そのディレクトリへダウンロードしてください。
依存関係まで取得しつつ、すでにインストール済みのものも飛ばさないオプションの組み合わせが必要です。
マニフェストの生成
/root/airgap/MANIFEST.tsvを作成してください。1行目はNAME EPOCH VERSION RELEASE ARCH SHA256 FILEのヘッダー(タブ区切り)で、各rpmについて1行ずつ、その値を埋める必要があります。epochがないパッケージは0で埋めてください。
NEVRAとチェックサムを一緒に入れます。epochがないパッケージを0で埋める表記があります。
アーカイブにまとめる
rpmsディレクトリとマニフェストを/root/airgap/bundle.tar.gzにまとめ、そのアーカイブのsha256を/root/airgap/bundle.sha256に保存してください。
媒体に入れる単一のオブジェクトを作ります。アーカイブ自体のチェックサムも残してください。
展開して検証
/root/airgap/unpacked/にアーカイブを展開し、マニフェストのチェックサムと実際のファイルを突き合わせた結果を/root/airgap/verify.txtに保存してください。そして、マニフェストにないのにディレクトリにあるファイルの数を、数字1行で/root/airgap/extra.txtに書いてください(0である必要があります)。
別のパスに展開して、チェックサムを突き合わせます。マニフェストにないファイルも確認してください。
リポジトリの構成
/root/airgap/unpacked/rpmsにメタデータを作成し、/etc/yum.repos.d/airgap.repoを作成してください。リポジトリIDはairgap-localで、nameにsnapshotと日付、baseurl=file:///root/airgap/unpacked/rpms、enabled=1、gpgcheck=0、metadata_expire=-1を含める必要があります。
メタデータを作って、.repoファイルを書きます。エアギャップ環境なので、期限の設定を調整してください。
そのリポジトリだけでインストール
ほかのリポジトリをすべて無効にしてairgap-localだけを有効にした状態で、treeを再インストールし、出力を/root/airgap/install.txtに保存してください。
ほかのリポジトリをすべて無効にして、持ち込んだリポジトリだけを有効にした状態でインストールします。
モジュールの状態の記録
状態の記録を残してください。/root/airgap/state-modules.txtにモジュール一覧を、/root/airgap/state-userinstalled.txtにユーザーがインストールしたものの一覧を保存してください。
モジュール一覧と、ユーザーがインストールしたものの一覧を残します。持ち込みの記録の一部です。
持ち込みレポート
/root/airgap/report.txtを次の6行で作成してください。
BUNDLE_ID=airgap-<오늘 날짜 YYYY-MM-DD> / PACKAGES=<rpms 안 .rpm 개수> / MANIFEST_LINES=<매니페스트의 헤더 제외 줄 수> / VERIFY=OK / EXTRA=0 / INSTALLED_FROM=airgap-local(プレースホルダーは順に、今日の日付、rpmsの中の.rpmの数、ヘッダーを除いたマニフェストの行数です)
バンドルの情報と検証結果をまとめます。値は実際の確認結果である必要があります。