yumローカルリポジトリの構築について【yum redhat centos linux オフライン環境構築】

linux

【2022/05/12追記】

おはようございます!

今回は、redhat, CentOSで用いるyumコマンドについてですが、

インターネット接続のない環境下でyumをするための「ローカルリポジトリ」の立て方について解説します。
補足記事も書きました。ここで書いた内容について、入力を楽にする方法やマウント自動化により失敗を減らす方法について書いています。よかったら読んでみてくださいね〜!

また、本記事では実施環境としてRHEL7,CentOS7を対象にしています。
RHEL8,CentOS8をお使いの方は、対応する記事をご確認ください!

<モチベーション>
情報としては「よくあるもの」です。
ですが、
「筆者が挫折した方法があったから」

という単純な動機で、出来たものとできなかったものを比較するという趣旨で書きました。

網羅的ではないですが、やり方2つを比較しています。
取り敢えず動かしたい方は前者だけ試せば大丈夫なはずです。

少しでも同じことをしたい方が楽できたらいいよな、と思ったので、
よかったら少し覗いてコピペしていってください。

<環境など>
OS : CentOS7.8.2003
マシン : virtualbox 6.1.16

※「うまくいかなかった方法」はあくまで筆者が挫折した方法であり、
本記事は元記事様の内容を否定、批判するものではありません

読んで欲しい人


【対象者】本記事は、linux(RedHat, CentOS)環境構築時のyumコマンドに関する
ある種「局所的なニーズでの使い方」について解説します。
特に以下のような方に読んでいただけると幸いです。

  1. プロキシやインターネット接続の制限などにより、yumで外部ネットワークに接続せずにマシン環境構築をしなければいけない方
  2. webアプリをvirtualbox等の仮想マシン上にデプロイして簡単に動作確認したい方
  3. 同様のことを試そうとしたが途中でややこしくなってうまくいかなかった方

はじめに

筆者の困りごと

業務内でネットワークから隔絶された環境にlinuxの環境を構築したり、その中で必要パッケージをインストールしたりすることはよくあると思います。
筆者が初めて実施時した際に「ローカルリポジトリ」が何かすら知らず(クソ雑魚)時間がかかったので、

「わかってしまえば割と簡単である」ということを皆さんにも共有できればと思い記事にしました。

今回試したもの

うまくいった方法

概要

URL:http://ykuri.sub.jp/linux/003.html

ポイント・・・

  1. RHELのインストールに使えるisoファイル(ブート用のディスク)をマウントして使います(isoは要オプション設定!注意!)
  2. マウントしたディスクに聞きに行くような設定の.repoファイルを作ります。(gpgの設定は無効にしましょう。セキスペとかでいう「真正性」のチェックですが、ローカルリポジトリであればDL元、改ざんチェックは不要のはずです)
  3. yumコマンドを打つときは面倒ですが、通常リポジトリをオフにして、ローカルリポジトリを有効化するようなオプションでコマンドを実行しましょう!

だいたい前述の通りですが、
普段我々はyumコマンドでパッケージをインターネットから取得しますが、linux(RHEL系)標準のパッケージは
「OSのインストールディスクにすでに入っている」のです。

そこで今回、上記のパッケージをインストールするにあたってそのOSディスクからyumコマンドでインストールできる設定にしよう、という内容になります。

イメージは下図のような感じです。

通常yumコマンド実行時
ローカルリポジトリでのyum

方法

方法といっても上記URLの通りですが、
まず今回想定している条件は下記のようなシチュエーションです。

  • 既に構築対象マシン自体の用意、OSのインストールは済んでいる
  • 構築対象マシンにscp等でファイルのアップロードが可能である

まず、ローカルマシン(特に制約のないマシン、OSはなんでもOK)で
tera term等を起動し、ターミナル上で下記のように入力して「構築対象マシンにインストールしたOSのディスクイメージ」をアップロードします。(構築対象マシンにDVD等でインストールディスクが入っているならここは不要です)

# phase 1
# "<",">"は実際は入力不要です。
scp <ディスクイメージのパス> <ユーザ>@<構築対象マシンのIPアドレス>:<配備場所パス>
# 例) ディスクイメージがdisk_file, testuserで192.168.1.1の/tmpに格納する場合
scp disk_file testuser@192.168.1.1:/tmp

次に、構築対象マシンにログインの上、ターミナル上で下記のように入力し、そのディスクイメージをマウントします。オプションをつけないとisoでは失敗します。

# phase 2
# isoファイルの場合。DVDなら付帯オプションは不要。
mount -t iso9660 -o loop <phase 1 で配備したディスクイメージ> <任意のマウント先パス>
# 例1) isoファイルを使う場合。ディスクイメージがdisk_fileでマウント先パスが/mnt/media/というディレクトリの場合
mkdir -p /mnt/media 
mount -t iso9660 -o loop disk_file /mnt/media
#例2 DVDやCDの場合(virtualboxとかで「光学ディスク」として選択した場合)
mkdir -p /mnt/media 
mount -o loop /dev/cdrom /mnt/media

そして、構築対象マシンの/etc/yum.repos.d/ 配下に以下のように.repoファイルを作成します。

# (記入例)media.repoファイルの中身
[media] # リポジトリ名です。後のyum入力時に使います。任意の文字列でOKです。
name=media #割となんでも大丈夫です。
baseurl=file://<phase2でディスクイメージをマウントした先のパス>
gpgcheck=0
enabled=0

#例)
echo "[media]" > /etc/yum.repos.d/media.repo
echo "name=media" >> /etc/yum.repos.d/media.repo
echo "baseurl=file:///mnt" >> /etc/yum.repos.d/media.repo
echo "gpgcheck=0" >> /etc/yum.repos.d/media.repo
echo "enabled=0" >> /etc/yum.repos.d/media.repo

ここまでできたら、あとはyumコマンドを実行するだけです。
ただ、そのまま実行するともともとデフォルトで参照される設定の.repoファイルを用いたyumを実行しようとするので、インターネット接続を試みた上で失敗しました、というログが出て終わりになってしまいます。そこで、

「デフォルトのリポジトリを使わない」「使用するリポジトリを明示的に指定」
これらをオプションで記述して実行する必要があります。
コマンドは下記のようになります。

#yumコマンド実行模様
yum --disablerepo=\* --enablerepo=<.repoに設定したリポジトリ名> <updateなりinstall ●● なりやりたい操作> 
#例)
yum --disablerepo=\* --enablerepo=media install daxio

これでできます。やってみると単純ですね。

単純だけ度入力がめんどくさいわ!って思ったあなた。
その通りですね。楽にする方法も書いてみましたのでよかったら。

途中で諦めた方法

概要

URL : https://itbasesta.com/local-repository

ポイント・・・

  1. OSインストーラディスクを使う考え方は一緒
  2. ディスクの中からパッケージをコピペで持ってくる
  3. “createrepo”コマンドを使う

大体想像がついてらっしゃる方もいるかもしれませんが、
筆者は”createrepo”の用意ができませんでした。。。後述もしますが、
筆者が以前別でもつまづいたことのあるglibc系パッケージのrpmからのインストールがどうにもダメでした。。。

先ほどはディスクをマウントしてそこに直でアクセスしましたが、こちらはパッケージが入ったディレクトリを指定して、そこをリポジトリとします。

実際の操作による確認は取れていませんが、パッケージを自分で選択的にディレクトリに配置できる為、先程のインストールメディアに入っていないパッケージもyumできるようになることから、【拡張性は高い方法である】と筆者はイメージしてます。(違ったらごめんなさい)

方法

前述の通りなのと完遂できていない(最初のうまくいく方法を用いれば結局基本パッケージはyumできるようになる為筆者の挫折ポイントも結果として超えられるため解決はしなかった)為、こちらの手法についてはそこまで解説しませんが、大体下記の流れです。

  1. パッケージを構築対象マシンの任意ディレクトリに配備する
  2. createrepo <パッケージを置いたディレクトリ> としてリポジトリを作る

先ほども述べましたが、筆者は”createrepo”が使えませんでした。
インストール時に最小インストールだったからなのか、コマンドがなかった為こちらを先にインストールする必要がありました。
createrepoコマンドには、下記の順にパッケージのインストールが必要です。

#パッケージインストール
rpm -ivh deltarpm-3.6-3.el7.x86_64.rpm
rpm -ivh python-deltarpm-3.6-3.el7.x86_64.rpm
rpm -ivh libxml2-python-2.9.1-6.el7_2.3.x86_64.rpm
rpm -ivh createrepo-0.9.9-28.el7.noarch.rpm

問題は、libxml2-python-2.9.1-6.el7_2.3.x86_64.rpmインストール時に起こりました。想像がつくかもですが、依存関係が激しく、最終的に”libc.so.6~”ライクな名前のパッケージのインストールの際に下図のような状況に陥ったのです。

…なんで?

以前、makeコマンド(ビルドツールのようなコマンド)インストールのため、gcc等のパッケージをrpmからインストールしようと四苦八苦、最終的に諦めた経験もあり筆者は心が折れ、この方法は諦めました

結論:依存パッケージ勝手に持ってきてくれてありがとうyum

得られたもの

リポジトリの立て方

ひとまず、ネットワーク環境のないところにリポジトリを立てる方法がわかりました。
後述のようにネットワークの形態により「ネット環境の設定が面倒な時」にも使えます。

yumコマンド オプション

yumにリポジトリ指定のオプションがあったとは といったところを知ることができました。
下記のように、なかなか多いです。

6.6. yumコマンドによるパッケージ管理 -yumコマンド- | $ cat user Linux
6.6. yumコマンドによるパッケージ管理 -yumコマンド-【コマンド説明】yum:Yellowdog Updater Modifiedyumコマンドは、ネットワーク経由でリポジトリ(ダウンロード元のサーバー)からrpmパッケージをダウンロードして、自動でインストールを実行するコマンドです。目的のパッケージをインス...

ただ、yumそのものの挙動、リポジトリのパッケージ配備模様など未確認事項も多く、
筆者としてもyumそのものへの理解は未だ浅薄です。

mountコマンド オプション

こちらは上記のyum以上にオプションが多いです。。。 yumにはupdateなど-無しのオプションがあるとはいえ、それでも真面目に覚えようとするとこちらの方が大変そうです。
普段はそこまで使う機会はないと思いますが、、、

rpmへの恐怖

今回また少しrpmを自分で手打ちでインストールすることへの恐怖が強まりました。。。
特定パッケージ(特にCコンパイラ系、よりC言語が苦手になっていく。。。)

最後に

ユースケース的に

ずっと言っていますが、

ネット接続がないところでのインストールが一番想定しているユースケースです。

「インターネットだけ繋がないでおいて、virtualboxで仮想マシンを立ててWebアプリをデプロイして動作確認する」
みたいな時も若干便利です。

virtualboxで比較的設定が簡単な「ホストオンリーアダプタ」でも環境構築が可能であり、更に「ホストオンリーアダプタ」であるためNATなどでホストマシンからゲストマシンにアクセスするときのようなポートフォワーディング等も無いため、余計なネットワーク設定を考えずにWebアプリ動作確認環境の構築ができます。

補足記事として、ここでお勧めした一つ目の方法を少し楽に入力する方法も書いてみました。
よろしければどうぞ!

みんな気をつけてね

yumは便利です。CentOSの環境構築系の記事でこれを見ない日はありません。
そんなyumを、今までより簡単に、制限された環境下でも使えるようにする、
そんな方法がこの「ローカルリポジトリ」です。

チープな記事ですが、読んでくださってありがとうございました!
皆さんのシチュエーションに合った「楽な」環境構築方法のヒントとなれば最高に嬉しいです。

それでは、またの機会に!

コメント

  1. […] yumローカルリポジトリについて【yum linux】 […]

タイトルとURLをコピーしました