2016年5月7日土曜日

Red Hat Enterprise LinuxやCentOSでローカルディレクトリをyumのリポジトリとして設定する方法

Redhat Enterprise Linux(RHEL)やCentOSでyumを使う場合、インターネットへ接続する必要がある。しかし、インターネットに接続することはネットワークポリシーやセキュリティ上難しい環境だったりする場合が多々あって、利用するのに難儀することが多い。

とはいえ最新のパッケージを適用することもセキュリティ上重要なので、以下の様な手順にて実施することを考える。

 ①一台、yum用のインターネットに接続するLinuxを構築
 ②上記のLinuxにてyumを利用して最新のrpmパッケージをダウンロード
 ③ダウンロードしたrpmパッケージを実際に適用するサーバーへコピー
 ④ローカルディレクトリをyumリポジトリとして登録し、パッケージを適用

# (2016/5/15追記)
#  上記④についてもっと簡単な方法があった。詳細は別記事参照

ただし、上記方法はyum用のLinuxサーバを別に構築する必要があって、それなりの手間が発生してしまう。さらに、RHELの場合はサブスクリプションが1台分余計に用意する必要があるということで、コスト面でもデメリットがある点に注意。

(RHELのみ)サブスクリプション登録

RHELの場合はyumを利用する場合は最初にサブスクリプションの登録作業が必要となる。今回30日の評価版サブスクリプションにて実施する。

まず、何もしていない状態でyumを実行すると「サブスクリプションが登録されてないよ」というエラーが出力される。

# yum check-update
--------------------------
読み込んだプラグイン:product-id, security, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
--------------------------

以下コマンドにてサブスクリプションの確認を行うと、状態が不明となっていることがわかる。

# subscription-manager list
--------------------------
+-------------------------------------------+
    インストール済み製品のステータス
+-------------------------------------------+
製品名:           Red Hat Enterprise Linux Server
製品 ID:          69
バージョン:       6.7
アーキテクチャー: x86_64
状態:             不明
状態の詳細:    
開始:          
終了:          
--------------------------

まずは、サブスクリプションが紐づくRed Hatアカウントの登録を行う。

# subscription-manager register
--------------------------
ユーザー名: <Red Hatアカウント名>
パスワード: <上記のパスワード>
このシステムは次の ID で登録されました: 6956a621-f62a-4fcd-97cb-xxxxxxxxxxxx
--------------------------

再度確認。今度は状態が「サブスクライブしていません」になる。

# subscription-manager list
--------------------------
+-------------------------------------------+
    インストール済み製品のステータス
+-------------------------------------------+
製品名:           Red Hat Enterprise Linux Server
製品 ID:          69
バージョン:       6.7
アーキテクチャー: x86_64
状態:             サブスクライブしていません
状態の詳細:       有効なサブスクリプションでサポートされていません
開始:          
終了:          
--------------------------

次に利用可能なサブスクリプション一覧を確認する。評価版の30日サブスクリプションが存在することがわかる。赤字箇所の「プールID」をコピーしておく。

# subscription-manager list --available
--------------------------
+-------------------------------------------+
    利用可能なサブスクリプション
+-------------------------------------------+
サブスクリプション名:     30 Day Red Hat Enterprise Linux Server Self-Supported
                          Evaluation
提供:                     Red Hat Container Images Beta
                          Red Hat Beta
                          Red Hat Enterprise Linux Atomic Host Beta
                          Oracle Java (for RHEL Server)
                          Red Hat Container Images
                          Red Hat Enterprise Linux Server
                          Red Hat Enterprise Linux Atomic Host
SKU:                      RH00065
契約:                     10947308
プール ID:                8a85f981542c878e0154xxxxxxxxxxxx
管理の提供:               いいえ
数量:                     2
推奨:                     1
サービスレベル:           Self-Support
サービスタイプ:           L1-L3
サブスクリプションタイプ: インスタンスベース
終了:                     2016年05月19日
システムタイプ:           物理
--------------------------

先ほど確認したプールIDを指定して、サブスクリプションの割り当てを実施。

# subscription-manager subscribe --pool=8a85f981542c878e0154xxxxxxxxxxxx
--------------------------
サブスクリプションが正しく割り当てられました: 30 Day Red Hat Enterprise Linux Server Self-Supported Evaluation
--------------------------

最後に確認。状態が「サブスクライブ済み」となればOK。

# subscription-manager list
--------------------------
+-------------------------------------------+
    インストール済み製品のステータス
+-------------------------------------------+
製品名:           Red Hat Enterprise Linux Server
製品 ID:          69
バージョン:       6.7
アーキテクチャー: x86_64
状態:             サブスクライブ済み
状態の詳細:    
開始:             2016年04月19日
終了:             2016年05月19日
--------------------------

yumの設定

ダウンロードしたrpmファイルを消さない設定をするため、yum.confを編集する。

/etc/yum.conf
--------------------------
cachedir=/var/cache/yum/$basearch/$releasever   ←★ダウンロードしたrpmの保存先。確認だけしておく
keepcache=1   ←★ダウンロードしたrpmを消さない設定。0→1へ変更
--------------------------

また、環境によってはリポジトリの追加を実施する。今回は「rhel-6-server-optional-rpms」が必要となったので追加する。まずは、現状のリポジトリの一覧を確認する。

# yum repolist all
--------------------------
読み込んだプラグイン:product-id, security, subscription-manager
リポジトリー ID                                       リポジトリー  状態
rhel-6-server-beta-debug-rpms                         Red Hat Enter 無効
rhel-6-server-beta-rpms                               Red Hat Enter 無効

~(中略)~

rhel-6-server-optional-rpms                           Red Hat Enter 無効   ←★ここを有効化する

~(中略)~

rhel-6-server-rpms                                    Red Hat Enter 有効: 16,856

~(中略)~

rhel-source                                           Red Hat Enter 無効
rhel-source-beta                                      Red Hat Enter 無効
repolist: 16,856
--------------------------

有効化するコマンドは以下のとおりとなる。

# yum-config-manager --enable rhel-6-server-optional-rpms

再度確認。

# yum repolist all
--------------------------
読み込んだプラグイン:product-id, security, subscription-manager
リポジトリー ID                                       リポジトリー  状態
rhel-6-server-beta-debug-rpms                         Red Hat Enter 無効
rhel-6-server-beta-rpms                               Red Hat Enter 無効

~(中略)~

rhel-6-server-optional-rpms                           Red Hat Enter 有効:  9,520   ←★有効化された

~(中略)~

rhel-6-server-rpms                                    Red Hat Enter 有効: 16,856

~(中略)~

rhel-source                                           Red Hat Enter 無効
rhel-source-beta                                      Red Hat Enter 無効
repolist: 26,376
--------------------------

yumの実行

yumにてパッケージをインストールせずダウンロードだけするには「downloadonly」のオプションを付与する。

# yum update --downloadonly
--------------------------
読み込んだプラグイン:product-id, security, subscription-manager
更新処理の設定をしています
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package SDL.x86_64 0:1.2.14-6.el6 will be 更新
---> Package SDL.x86_64 0:1.2.14-7.el6_7.1 will be an update
---> Package bash.x86_64 0:4.1.2-33.el6 will be 更新
---> Package bash.x86_64 0:4.1.2-33.el6_7.1 will be an update

~(中略)~

udev                     x86_64 147-2.63.el6_7.1      rhel-6-server-rpms 355 k
 zip                      x86_64 3.0-1.el6_7.1         rhel-6-server-rpms 259 k
依存性関連でのインストールをします。:
 pcsc-lite-libs           x86_64 1.5.2-15.el6          rhel-6-server-rpms  28 k

トランザクションの要約
================================================================================
インストール         2 パッケージ
アップグレード     123 パッケージ

総ダウンロード容量: 214 M
これでいいですか? [y/N]y
パッケージをダウンロードしています:
(1/125): SDL-1.2.14-7.el6_7.1.x86_64.rpm                 | 193 kB     00:00  
(2/125): bash-4.1.2-33.el6_7.1.x86_64.rpm                | 908 kB     00:00  
(3/125): bind-libs-9.8.2-0.37.rc1.el6_7.7.x86_64.rpm     | 887 kB     00:00  

~(中略)~

(123/125): tzdata-java-2016d-1.el6.noarch.rpm            | 180 kB     00:00  
(124/125): udev-147-2.63.el6_7.1.x86_64.rpm              | 355 kB     00:00  
(125/125): zip-3.0-1.el6_7.1.x86_64.rpm                  | 259 kB     00:00  
--------------------------------------------------------------------------------
合計                                            801 kB/s | 214 MB     04:33  
exiting because --downloadonly specified   ←★このメッセージが表示される
--------------------------

ダウンロードされたrpmパッケージは以下ディレクトリに保存されているので、別のディレクトリに退避するなどして保存しておくこと。

/var/cache/yum/x86_64/6Server/rhel-6-server-rpms/packages/
/var/cache/yum/x86_64/6Server/rhel-6-server-optiional-rpms/packages/

ちなみに、ダウンロードしたパッケージを削除する場合は以下コマンド。

# yum clean packages
--------------------------
読み込んだプラグイン:product-id, security, subscription-manager
リポジトリーを清掃しています: rhel-6-server-optional-rpms rhel-6-server-rpms
5 packageファイルを削除しました
--------------------------


ローカルディレクトリをyumのリポジトリにする

例として/root/update_rpmsをリポジトリとして設定する。先ほどダウンロードしたrpmパッケージを事前にこのディレクトリにコピーしておくこと。試しに、このディレクトリに移動して、単純にrpmですべてを適用しようとしても、エラーで弾かれてしまった。

# rpm -ivh *
--------------------------
ファイル /usr/bin/zip (パッケージ zip-3.0-1.el6_7.1.x86_64 から) は、パッケージ zip-3.0-1.el6.x86_64 からのファイルと競合しています。
ファイル /usr/bin/zipcloak (パッケージ zip-3.0-1.el6_7.1.x86_64 から) は、パッケージ zip-3.0-1.el6.x86_64 からのファイルと競合しています。
ファイル /usr/bin/zipnote (パッケージ zip-3.0-1.el6_7.1.x86_64 から) は、パッケージ zip-3.0-1.el6.x86_64 からのファイルと競合しています。
ファイル /usr/bin/zipsplit (パッケージ zip-3.0-1.el6_7.1.x86_64 から) は、パッケージ zip-3.0-1.el6.x86_64 からのファイルと競合しています。
--------------------------

しかし、yumであれば依存関係を考慮して一括で適用してくれるのでメリットがある。

まずは、createrepoのパッケージをインストールする。事前にyumでインストールするか、rpmパッケージで個別にインストールしておくこと。私の環境では、依存関係があるパッケージが追加で2つインストールされた。

# yum install createrepo
--------------------------
~(中略)~

インストール:
  createrepo.noarch 0:0.9.9-22.el6                                            

依存性関連をインストールしました:
  deltarpm.x86_64 0:3.5-0.5.20090913git.el6                                  
  python-deltarpm.x86_64 0:3.5-0.5.20090913git.el6                            

完了しました!
--------------------------

createrepoコマンドにて、リポジトリとして必要な処理を行う。

# createrepo /root/update_rpms
--------------------------
Spawning worker 0 with 125 pkgs
Workers Finished
Gathering worker results

Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
--------------------------

以下ファイルを新規作成し、local-repositoryという名前でリポジトリを設定する。

/etc/yum.repos.d/local.repo
--------------------------
[local-repository]
name=local repository
baseurl=file:///root/update_rpms/
gpgcheck=0
enabled=0
--------------------------

上記完了後、yumを実行してみる

# yum clean all   ←★一旦yumを綺麗にしておく

# yum repolist all   ←★リポジトリの一覧を確認
--------------------------
リポジトリー ID                                       リポジトリー  状態
local-repository                                      local reposit 有効:    125   ←★有効になっている
--------------------------

# yum check-update   ←★check-updateの実行でlocal-repositoryが参照されていればOK
--------------------------
~(中略)~

tzdata.noarch                        2016d-1.el6                local-repository
tzdata-java.noarch                   2016d-1.el6                local-repository
udev.x86_64                          147-2.63.el6_7.1           local-repository
zip.x86_64                           3.0-1.el6_7.1              local-repository
--------------------------

以上で設定は完了となる。