Linuxローカル環境用に最小限のyumリポジトリを作成する方法

環境的にyumが使えない(例えばインターネット接続がない、OSメディアをマウントできない)Linuxマシンにyumでパッケージを追加インストールするための、最小のローカルリポジトリとインストーラを別のPC上で作成する方法。

概略

yumが使えないRed Hat Enterprise LinuxもしくはCentOSマシンを target と呼ぶ。

  1. target と同じバージョンの Linux 仮想マシンを最小インストールで新規作成する。これを source と呼ぶ。 source はインターネットもしくはOSメディアなどを利用してyumが利用できる環境とする。 仮想マシンを作成する方法は割愛。
  2. source 上でローカル環境向けのリポジトリを作成する。これを repo と呼ぶ。
  3. target に repo をコピーしてyumで repo 内のパッケージを target にインストールする。

repo の作成

#!/bin/bash
#
# makelocalrepo.sh - Make local minimal yum repository
#
set -eu

[[ $# > 1 ]] || {
  echo "$(basename $0) dest package..."
  echo "  dest:    Name of local repository to create. dest.tar.gz is created."
  echo "  package: Name of yum package to include into dest."
  exit 1
}

dest=${1%.tar.gz}
[[ ! -e "$dest" ]] || {
  echo "$dest should not exist."
  exit 1
}

shift
packages=$*
repo="$dest/repo"

rpm -q --quiet yum-utils || yum install -y yum-utils
mkdir -p $repo
yumdownloader --resolve --destdir=$repo $packages
rpm -q --quiet createrepo || yum install -y createrepo
createrepo $repo

cat > "$dest/install.sh" <<EOS
#!/bin/bash
set -eu

cat > /etc/yum.repo.d/localrepo.repo <<EOF
[localrepo]
name=localrepo
baseurl=file://\$(readlink -f \$(dirname "\$0"))/repo
enabled=0
gpgcheck=0
EOF

yum --disablerepo=* --enablerepo=localrepo -y install $packages
EOS

chmod +x "$dest/install.sh"
tar czf "$dest.tar.gz" "$dest"

というシェルスクリプトを準備して後はインストールしたいパッケージを指定して実行する。

例えば jqtree をインストールしたければ

sudo makelocalrepo.sh localrepo jq tree

とするとカレントディレクトリに localrepo というディレクトリと localrepo.tar.gz というファイルが作成される。 localrepo.tar.gz にインストーラとリポジトリが含まれる。

ちなみに

  • yumの downloadonly プラグインは非推奨となっておりyumdownloaderが今後の推奨になっている。
  • yumdownloaderの resolve オプションで依存関係も全て解決される。ありがたい。

target へ repo をインストール

出来上がったファイル(上の例では localrepo.tar.gz )を target へコピーして以下を target 上で実行する。

sudo tar xzf localrepo.tar.gz
sudo cd localrepo && ./install.sh