この記事で試しているのはRocky Linuxですが特別な機能は用いていないため最近のREHL系なら多分同様に動作します。
インターネットに接続できない環境(以下閉域環境)でLinuxを使う場合、インターネット上からファイルを取得する通常のパッケージインストールや更新はできません。この記事では dnf コマンドによるパッケージの追加、更新を閉域環境で使えるようにする方法を紹介します。
ざっくりやることをまとめると次の通りです
- ネット接続可能な環境でパッケージを収集
- ネット接続可能な環境で最新にしたパッケージ含むリポジトリを閉域環境のマシンのファイルとして扱えるようにする(何がしかのファイル移動かコピーかをする想定です)
- 閉域環境上でローカルリポジトリを作り、それを使ってインストール
インターネットにつながらないDockerコンテナを利用して試した例が次です。
1. オンライン環境で .rpm
を収集
まずは rockylinux:9
イメージを使って、オンラインの作業用コンテナを立ち上げます。このネット接続可能なコンテナでインターネット上からパッケージを集めます。
docker run -it --name rocky-online \
-v /tmp/offline-repo:/offline-repo \
rockylinux:9 bash
dnfからRPMをダウンロード
dnf makecache
dnf update --downloadonly --downloaddir=/offline-repo
このコマンドは、アップデート対象のパッケージすべてを /offline-repo
にRPMファイルとして保存します。
補足
必要に応じて、特定パッケージだけに限定することも可能です:
dnf download --resolve --alldeps --destdir=/offline-repo vim
2. オフライン用ローカルリポジトリの準備
ダウンロードした .rpm
ファイルをローカルリポジトリ化するために、createrepo
を使います。
dnf install -y createrepo
createrepo /offline-repo
これで /offline-repo/repodata/
が生成され、リポジトリとして認識可能になります。
3. オフライン環境へのコピー
ここではホストの /tmp/offline-repo
をそのまま閉域環境として扱う別のコンテナで使います。実運用では物理的にファイルをコピーする想定です(ローカルネットワークとして繋いで送信するなど)。
docker create -it --name rocky-offline \
-v /tmp/offline-repo:/offline-repo \
rockylinux:9
docker start -ai rocky-offline
4. 閉域環境でローカルリポジトリを設定
まずデフォルト設定として入っているオンライン用のリポジトリを無効化しておきます。
sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/*.repo
続いて、ローカルリポジトリ用の .repo
ファイルを作成します:
cat << EOF > /etc/yum.repos.d/offline.repo
[offline-repo]
name=Offline Repository
baseurl=file:///offline-repo
enabled=1
gpgcheck=0
EOF
5. パッケージをオフラインで更新/追加
ローカルリポジトリを使ってパッケージを更新できるになったのでオフラインでの更新を行います。
dnf clean all
dnf update -y
特定のパッケージのみインストールしたい場合は次のようにできます:
dnf install -y vim
※ dnf
は自動的にローカルリポジトリから依存関係を解決してくれます。
こんな感じでインターネットにつながらない環境でもパッケージを追加したり更新したりが比較的容易にできます。