Skip to content

Instantly share code, notes, and snippets.

@261shimizu
Last active October 1, 2021 18:37
Show Gist options
  • Save 261shimizu/941512952ecaa97631b35f0c0f9fc2ce to your computer and use it in GitHub Desktop.
Save 261shimizu/941512952ecaa97631b35f0c0f9fc2ce to your computer and use it in GitHub Desktop.
RHELやyumについて

CentOS6.2からCentOS6.5(非最新)へのアップデート

6.2の用意


これは適当に。
vagrantで持ってくると汚しても壊してやり直せるので楽

最新版へのアップデート


yumコマンドを使う。
**yum update**すると、最新版にアップデートされる(バージョン指定オプションなしの場合)
しかし、メジャーアップデートは別。マイナーアップデートできるものの中で最新版
また、今回の様に、指定バージョンへのアップデートをするには、すこし作業が必要

yum updateは、大体-y(選択は自動的にyesにする)を使う
yum clean allできれいにしてからアップデートするのが良い

指定バージョンへのアップデート

まず、指定バージョンへのアップデートの方法。
上述のように、yum update -yとすると、6.7までバージョンが上がる

これを解決する方法は、何通りかある

  1. yum update -y --releasever=6.5

    • オプション--releaseverを使う方法。これで6.5を指定すると、指定までのバージョンで止めてくれる
  2. echo '6.5' >| /etc/yum/vars/releasever

    • releasever(新規作成)というファイルに6.5と記述した上で、yum update -yする
  3. /etc/yum.repo.d/CentOS-Base.repo'の、urlの部分にある$releaseverを6.5に変える

    • 1や2の方法よりめんどくさい

3つの方法はいずれも、変数releaseverを指定しているだけ。原理は変わらない

躓いたところ


実際に指定バージョンにアップデートしようとして躓く。

not using ftp, http[s], or file for repos, skipping - 4 is not a valid release or hasnt been released yet
remove mirrorlistなんちゃら
Cannot find a valid baseurl for repo: base

こんなエラーが出た。
このエラー自体は、いろいろな原因で出るらしい
80番ポートがブロックされていたり、IPではじかれていたり、、、
ともかく、まとめていうと、yumが参照しようとするリポジトリが参照できなくなっているということ

yumによって参照されるレポジトリのミラーは、

/etc/yum.repo.d/CentOS-Base.repo

で設定されている

で、何が問題だったかというと、
CentOSの古いバージョンはミラーから削除されていること

なので、ミラーのURLを変更しなければならない
デフォルトのところに行くと、ヒントが書いてあって、
古いやつは、http://vault.centos.org/バージョン以下で管理してるので、そこを参照してねとのこと

ということで、解決法は、 vim /etc/yum.repos.d/CentOS-Base.repo として設定ファイルをいじる
mirrorlistのところをコメントアウトしてから、baseurlのコメントアウトを外して、

baseurl=http://vault.centos.org/$releasever/○○(osとか、updatesとか、、、)/$basearch

に変更する
それぞれ5箇所位
これでOK

もっと簡単にしてもできるかも
例のファイル(/etc/yum.repos.d/CentOS-Base.repo)の中身を全部消去して(安全を期すなら残しておいてenable=0にするとか)、

[vault]
name=CentOS-$releasever - Vault
baseurl=http://vault.centos.org/(OSのバージョン)/os/$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/(OSのバージョン)/os/$basearch/RPM-GPG-KEY-centos6
priority=1
protect=1

に書き換えてもできるっぽい(6.5⇒6.6で実験して成功)
/os/のみで大丈夫なのか、というところはわからず

ちなみに、gpgkeyというのは、ITPROによれば、

「GnuPG」(GNU Privacy Guard)という暗号化ソフトで生成される公開鍵です。Linuxの場合,apt-getコマンドやyumコマンドを使ってインターネットから入手できるパッケージが正しい配布先のものかどうかのチェックなどに利用しています。

ということらしい。公開鍵暗号方式をつかっているみたい

手順まとめ


  1. 設定ファイル書き換え(この時点で、$releaseverを6.5とか指定してしまってもよい)

    $ sudo sed -i -e "s|mirror\.centos\.org/centos/\$releasever|vault\.centos\.org/$releasever|g" /etc/yum.repos.d/CentOS-Base.repo  
    $ sudo sed -i -e "s|#baseurl=|baseurl=|g" /etc/yum.repos.d/CentOS-Base.repo  
    $ sudo sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-Base.repo  
    
  2. アップデート(手順1で変数を指定していれば、オプション--releaseverはいらない)
    yum update -y --releasever=6.5

RHEL&yum検証結果まとめ

RHELのサポートについて


  • メジャーバージョン(ex.RHEL6,RHEL7)に関しては、リリース後10年はサポートされている
  • 別途有料アドオンがあれば、10年の後3年ほどはサポートされる模様 ← ※訂正。期間未定。redhatの思うまま。有料アドオンいらないかも
  • マイナーバージョン(ex.RHEL6.5,RHEL7.1)に関しては、次のマイナーバージョンがリリースされた時点でサポート終了 ←**※訂正。メジャーでまとめてサポート対象**
  • しかし、マイナーバージョンには、EUSというアドオンが存在し、EUCなら旧バージョンでもリリース後2年間はサポート対象 ←**※訂正。アドオンがあれば大したことないパッチでも修正可能だよっていう話**
  • 2016年5月19日現在、RHEL6(RHEL6.8)はサポート対象であるがRHEL6.5はサポート対象 ←**※訂正。RHEL6でまとめてサポート対象**
  • RHEL6(RHEL6.8)のサポートは2020年11月30日まで
運用フェーズという概念に沿って、サポートが行われる  
運用フェーズ1なら、新しいハードウェアへの対応、機能拡張、バグフィックス、セキュリティフィックスが行われる。目安としてリリースから5年半  
運用フェーズ2なら、新しいハードウェアへの対応、バグフィックス、セキュリティフィックスが行われる  
運用フェーズ3なら、バグフィックス、セキュリティフィックスが行われる。もはやマイナーリリースは行われない  
延長ライフフェーズは、5までしかない、、、?  

yumコマンドについて


  • yumコマンドは、レポジトリからパッケージ情報を取得してインストール・更新を行っている
  • RHELの場合、サブスクリプション登録をしていなければ公式レポジトリ(インターネット上)からはパッケージ情報を取得できない
  • したがって、サブスクリプション登録をしていない場合やインターネット接続がない場合、デフォルトではyumコマンドが使えない状態になっている
  • これを解消する方法は、レポジトリをローカルに置く方法と、外部レポジトリ(非公式)を使う方法がある
    1. ローカルにレポジトリを置く場合、isoファイルをマウント&コピーしてレポジトリ設定ファイルを編集する必要がある
    2. 外部サイトを参照する場合(ex.epel,remi,rpmforge等)にも、レポジトリ設定ファイルを編集する必要がある(インターネット環境必須)
    3. 上記二つの方法を組み合わせた方法として、1つのホスト(サーバ)にローカルレポジトリを設置してhttpで公開し、他のホスト(クライアント)ではhttp経由でサーバのローカルレポジトリを参照する方法がある(相互通信が可能であればインターネット環境不要)
    4. http経由でない場合には、sshを使ってサーバのレポジトリをコピー・バックアップする方法もある(rsyncコマンド、sshがあればインターネット環境不要)
  • 各方法の詳細な手順については、下の記事で説明している

RHELサブスクリプションについて


主な流れは、サブスクリプションにシステムを登録(システムの登録)⇒マシンをシステムに紐づけるという2段階(システムのアタッチ)
オフラインでできることは、サブスクリプション登録されたシステムに、マシンを紐づけることであるが、オフラインだとマシン側で勝手に作業が進むだけで、
システム側からの突合せができないので、結局最終的なサブスクリプション登録をするにはオンライン環境が必要だということ。

以下、メモとして書いたもの

・サブスクリプション ⇒サブスクリプションと、システムを紐づける(システムの登録)。紐づいているシステムと、マシンを紐づける(システムのアタッチ)。この2段階が必要。 ⇒サブスクリプション証明書には、エンタイトルメント証明書と、識別証明書の2つがある。 ⇒こないだ試したのは、エンタイトルメント証明書のダウンロード・コピー・インポート。インポートまで行けばオフラインなら問題ない(識別証明書のコピーもすべき?)。 ⇒マシンとシステムの突合せがオンラインでないとできないので、オフラインではsubscription-manager listとしても不明となる。 ⇒しかし、インポートした時点で、subscription-manager list --consumed とした時に、使用しているサブスクリプションが表示される。 ⇒オンライン時に備えて、オプションとして識別証明書をダウンロード・コピー・ディレクトリ移動すると、subscription-manager list とした時にシステムとの突合せが行われ、ちゃんと表示されるようになる。この時点で公式レポジトリも追加される。

yumレポジトリについて


  • 公式レポジトリ
    redhat.repoと表示される。
    サブスクリプション登録とインターネット環境が必要。
    redhat.repoに書いてあるURLにブラウザでアクセスする(サブスクリプション登録なし)と、
    Access Denied
    You don't have permission to access
    と表示され、アクセス許可がないと怒られる

    rhel-source.repoとは
    デフォルトでレポジトリリストに存在するレポジトリ
    本来は、rpmのソースファイル(SRPM:src.rpm)のレポジトリだと思うが、なぜか使用不可能
    これとほぼ同じ内容で、/etc/yum.repos.d/source.repoファイルを作ると、
    redhatが提供しているrpmのソースファイルを、サブスクリプション登録なしで持ってこれるようになる。
    (RHEL7だとURL変わっている可能性あり)
    rpmのソースファイルのダウンロードは、yumdownloaderコマンド(yum-utils)にオプションをつけて、yumdownloader --source パッケージとする
    ソースパッケージがダウンロードできれば、rpmbuildコマンド等でインストールできる模様
    ちなみに、yumdownloader --resolve パッケージとすると、依存関係を解決してダウンロードしてくれる(ソースパッケージのダウンロードでこれができるかは不明)

    $ vi /etc/yum.repos.d/srpm.repo
    [rhel-src]
    name=Red Hat Enterprise Linux $releasever - $basearch - Source
    baseurl=ftp://ftp.redhat.com/pub/redhat/linux/enterprise/$releasever/en/os/SRPMS/
    enabled=1
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
  • isoファイルから取得したレポジトリ(準公式)
    rhel-local,rhel-server,rhel-client等で表示(名前は任意、拡張子は.repo)。
    ローカルリポジトリ。インターネット環境不要。sshやhttpが必要な場合もある
    システムやパッケージの更新をかけたい場合、レポジトリを更新する必要がある
    修正パッチの適用は、ローカル(Packages配下)に該当rpmファイルを置く必要がある(依存関係も解消する必要がある)

  • 外部レポジトリ
    epel.repo,remi.repoなど。
    インターネット接続が必要。サブスクリプション登録不要。
    公式ではない(epelは比較的信頼できる模様)
    レポジトリを追加するという使い方が主なので、公式レポジトリの補完的な意味合いが強い。
    したがって、最新版のインストールや、公式レポジトリにないパッケージがほしいときなどに使う。

    • EPEL
      Exxtra Packages for Enterprise Linuxの略。
      Fedraプロジェクトによって管理される
      Fedraで使っているパッケージをRHEL向けにビルドしたもの
      公式レポジトリに入っていないものが多い
      今回の検証環境では、デフォルトでインストールされているパッケージは1つもEPELには入っていなかった

    • Remi
      Remi's RPM repository
      remiレポジトリを使うにはEPELが必要なので、インストールするときには無ければEPELも一緒にインストールされる
      こちらは最新版が多い模様

    他にも外部レポジトリはいろいろある(RPMforgeなど)

  • まとめ

    デフォルトSRPM redhat公式 redhatSRPM 第三者レポジトリ(epel,remi...) ローカルレポジトリ(自作サーバ含む)
    サブスクリプションあり ×
    サブスクリプションなし × ×
    インターネット接続なし × × × ×
  • レポジトリの状態

    • パッケージさえあればよい。
    • パッケージディレクトリもいらない、rpmファイルがあれば、createrepoコマンドによってレポジトリ化できる。
    • 更に、必要なrpmファイルだけ(+依存関係解決:インストール済みのもので解決できるなら必要ない。あくまで未インストールのものが依存関係に含まれているならそれも置いておかなければならない)
    • つまり、レポジトリにあるrpmだけがインストールできる

検証したこと


  1. redhat6.5サポート状況 ⇒ サポート対象外
  2. サーバのローカルリポジトリを、クライアント側で参照 ⇒ rsyncでも、httpでも可能
  3. アップデート対象rpmを、Packages配下に入れるだけでアップデートできるか ⇒ createrepoコマンド+依存関係を解決すれば可能
  4. Packages配下に、更新対象のrpm以外の物を削除してもアップデートできるか ⇒ createrepoコマンド+依存関係を解決すれば可能
  5. サブスクリプションとレポジトリの関係 ⇒ サブスクリプションが関係しているものはredhat公式レポジトリだけ
    他のレポジトリはインターネットにつながれば、yum list availableで表示されるものはインストールできるし、
    最新版があれば、yum updateもできる
  6. サブスクリプションが無くても、redhat提供のrpmは持ってこれるか ⇒ ソースrpmなら持ってこれる。これを展開する方法もある
  7. サブスクリプションのオフラインでの登録 ⇒ 不明。可能なはずだが失敗した。**公式回答を得て解決した。オフライン登録は可能であるが、yumコマンドの状態には影響なし(オフラインでは)
  8. rpmファイルを全消去して、必要なものだけそののちに追加してもyumを使うことができるか ⇒ 可能。createrepoは必要だけど。rpmファイルさえあれば問題ない(依存関係も解決必須)。

結論: オフラインでも、サブスクリプションなくても、必要なrpmとレポジトリさえ用意できればyum使える

RHELにおけるローカルyumリポジトリの更新

概要


インターネットにつながらない、相互に通信可能なRHEL6.5ホスト2台(サーバ、クライアント)のyumリポジトリ更新方法(6.5⇒6.8)について
リポジトリ作成方法は、ISOイメージを何らかの手段(DVD等)で持ち込み、サーバにマウント・コピーした上でyumがコピーをリポジトリとして参照するように設定する
クライアント側では、サーバ側のローカルリポジトリをクライアント側にコピーすることでローカルにリポジトリを作成し、これを参照する

セキュリティに関する修正などの適用(リポジトリの一部更新)は、該当rpmファイルをリポジトリの配下に置くことで実現する

なお、今回は、ホスト2台をVirtual Boxの上に作り、その2台はいずれもブリッジ接続にした

  • 環境・条件
    RHEL6.5ホスト2台(相互に通信可能、インターネット接続無)
    RHEL6.8のISOイメージ
    修正されたrpmファイル
    (createrepoコマンド)
    (httpd)

更新手順(6.5⇒6.8)


  1. サーバ側に6.8イメージをマウント
  2. マウントしたイメージを、ローカルにコピー
  3. yumのレポジトリ設定ファイルを編集
  4. アップデート
  5. クライアント側で、サーバのリポジトリをコピー
  6. クライアントのyumレポジトリ設定ファイルを編集
  7. アップデート

詳細手順(サーバ側)


# 現在のバージョン確認  
[root@server ~]# cat /etc/issue  
Red Hat Enterprise Linux Server release 6.5 (Santiago)  
Kernel \r on an \m  

# 既にマウントされているものがないか確認  
[root@server ~]# ls -l /mnt/  
合計 0  

# DVDのISOイメージをマウント(今回はDVD形式とする)  
[root@server ~]# mount /dev/cdrom /mnt  
mount: ブロックデバイス /dev/sr0 は書き込み禁止です、読込み専用でマウントします  

# マウントの確認  
[root@server ~]# ls -l /mnt  
合計 875  
dr-xr-xr-x.  3 root root   2048  4月 14 23:56 2016 EFI  
...
...
略
...
...

# レポジトリのディレクトリを作る  
[root@server ~]# mkdir -p /usr/local/repo/RHEL6.8/  

# 確認  
[root@server ~]# ls -l /usr/local/repo  
合計 4  
drwxr-xr-x. 13 root root 4096  5月 12 13:53 2016 RHEL_6.8  

# 確認  
[root@server ~]# ls -l@ /usr/local/repo/RHEL6.8  
合計 0  

# ISOイメージのコピー  
[root@server ~]# cp -pR /mnt/* /usr/local/repo/RHEL_6.8/  

# 確認  
[root@server ~]# ls -l /usr/local/repo/RHEL_6.8  
合計 472  
dr-xr-xr-x.  3 root root   4096  4月 14 23:56 2016 EFI  
...
...
略
...
...

# レポジトリの参照設定ファイルを編集  
[root@server ~]# vim /etc/yum.repos.d/rhel-local.repo  

[root@server ~]# cat /etc/yum.repos.d/rhel-local.rpeo  

# rhel-local.repo  
#  
#  外部リポジトリを参照出来ないため、ローカルにyumリポジトリを作成している。  
#  内容は rhel-server-6.8-x86_64-dvd.iso の中身そのもの。   
#  
#  デフォルトで有効にしているので通常のyumコマンドで参照される。  
#  
#  このリポジトリのみ有効にする場合は次のように実施する:  
#  
#  yum --disablerepo=\* --enablerepo=rhel-local [command]  

[rhel-local]  
name=rhel-local  
baseurl=file:///usr/local/repo/RHEL_6.8/  
gpgcheck=0  
enabled=1  

# レポジトリのリストを確認  
[root@server ~]# yum repolist  
Loaded plugins: product-id, security, subscription-manager  
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.  
rhel-local                   rhel-local                                                        3,855  
repolist: 3,855  

# rhel-localがenbleになっているか確認  
[root@server ~]# yum repolist all  
Loaded plugins: product-id, security, subscription-manager  
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.  
repo id                repo name                                                     status  
--略--  
rhel-local             rhel-local                                                    enabled:  3,855  
--略--  

# yumのキャッシュをクリーンに  
[root@server ~]# yum clean all  
Loaded plugins: product-id, security, subscription-manager  
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.  
Cleaning repos: epel rhel-local
Cleaning up Everything  

# アップデート  
[root@server ~]# yum update  
....  
....  
....  
--略--  
....  
....  
....  
....  
Complete!  

# 更新されたか確認  
[root@server ~]# cat /etc/issue  
Red Hat Enterprise Linux Server release 6.8 (Santiago)  
Kernel \r on an \m  

詳細手順(クライアント側)


サーバ側にレポジトリを作成後にこちらの作業をする

# 現在のバージョン確認  
[root@client ~]# cat /etc/issue  
Red Hat Enterprise Linux Server release 6.5 (Santiago)  
Kernel \r on an \m  

[root@client ~]#  
[root@client ~]#  
[root@client ~]#  

# 今のrepo配下の状況確認  
[root@client ~]# ls -l /usr/local/repo  
合計 0  
[root@client ~]#  
[root@client ~]#  

# サーバ側のレポジトリのディレクトリをクライアント側へコピー(鍵認証にしておくと良い)  
[root@client ~]# rsync -r root@サーバのIPアドレス:/usr/local/repo/RHEL_6.8 /usr/local/repo/  
[email protected]'s password:  
[root@client ~]#  
[root@client ~]#  

# コピーできたか確認  
[root@client ~]# ls -l /usr/local/repo  
合計 4  
drwxr-xr-x. 13 root root 4096  5月 17 02:19 2016 RHEL_6.8  
[root@client ~]#  
[root@client ~]#  

# 現在のレポジトリ参照設定ファイルの確認  
[root@client ~]# ls -l /etc/yum.repos.d/  
合計 4  
-rw-r--r--. 1 root root 529 10月 31 00:05 2013 rhel-source.repo  
[root@client ~]#  
[root@client ~]#  

# 設定ファイル編集
[root@client ~]# vim /etc/yum.repos.d/rhel-client.repo  
[root@client ~]#  
[root@client ~]#  
[root@client ~]#  
[root@client ~]# cat /etc/yum.repos.d/rhel-client.repo  
#  rhel-client.repo  
#  
#  外部リポジトリを参照出来ないため、ローカルにyumリポジトリを作成している。  
#  内容はサーバ側のローカルリポジトリと同じもの。  
#  
#  デフォルトで有効にしているので通常のyumコマンドで参照される。  
#  
#  このリポジトリのみ有効にする場合は次のように実施する:  
#  
#  yum --disablerepo=\* --enablerepo=rhel-client [command]  

[rhel-client]  
name=rhel-client  
baseurl=file:///usr/local/repo/RHEL_6.8/  
gpgcheck=0  
enabled=1  

[root@client ~]#  
[root@client ~]#  

# yumのキャッシュクリア  
[root@client ~]# yum clean all  
Loaded plugins: product-id, security, subscription-manager  
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.  
Cleaning repos: rhel-client  
Cleaning up Everything  
[root@client ~]#  
[root@client ~]#  

# yumレポジトリリスト表示  
[root@client ~]# yum repolist  
Loaded plugins: product-id, security, subscription-manager  
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.  
rhel-client                                                                                                                                          | 4.1 kB     00:00 ...  
rhel-client/primary_db                                                                                                                               | 3.1 MB     00:00 ...  
repo id                                                                            repo name                                                                          status  
rhel-client                                                                        rhel-client                                                                        3,855  
repolist: 3,855  
[root@client ~]#  
[root@client ~]#  

# rhel-clientがenableになっていることを確認  
[root@client ~]# yum repolist all  
Loaded plugins: product-id, security, subscription-manager  
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.  
repo id                                                    repo name                                                                                          status  
rhel-client                                                rhel-client                                                                                        enabled: 3,855  
rhel-source                                                Red Hat Enterprise Linux 6Server - x86_64 - Source                                                 disabled  
rhel-source-beta                                           Red Hat Enterprise Linux 6Server Beta - x86_64 - Source                                            disabled  
repolist: 3,855  
[root@client ~]#  
[root@client ~]#  

# アップデート  
[root@client ~]# yum update  
...  
...  
--略--  
...  
...  
Complete!  

[root@client ~]#  
[root@client ~]#  

# アップデートできたかどうか確認  
[root@client ~]# cat /etc/issue  
Red Hat Enterprise Linux Server release 6.8 (Santiago)  
Kernel \r on an \m  

レポジトリの一部を更新


OSのバージョンを上げずに、バグやセキュリティの修正を適用したい場合には、
該当するrpmファイルを入手し、Packages配下に置いて、レポジトリの更新をかけてアップデートすることで実現できる

  • 手順

    1. 該当するrpmファイルの古いバージョンをバックアップする
    2. 新しいrpmファイルを、レポジトリのディレクトリ配下にあるPackagesの配下に置く
    3. yumのキャッシュをクリア
    4. yumレポジトリの更新をかける
    5. yum update 更新したいパッケージ
ls -l /usr/local/repo/RHEL_6.5/Packages | grep libvirt  

mv /usr/local/repo/RHEL_6.5/Packages/libvirt* /usr/local/repo/bk  

mv libvirt.rpm /usr/local/repo/RHEL_6.5/Packages  

createrepo --update /usr/local/repo/RHEL_6.5  

yum clean all  

yum update libvirt  

注意として、パッケージは依存関係があるので、1つアップデートしようと思ってもエラーとなることがある
関係するパッケージを新しいものに置き換えて(Packages配下に置いて)、アップデートしなければうまくいかないと思われる

ちなみに


サーバ側のレポジトリをHTTPで公開して、クライアント側でそこを参照するようにすると、クライアント側でローカルにレポジトリを持たなくとも、アップデートができる
クライアント側でもローカルでレポジトリを持つ場合、サーバ側のレポジトリと同期をとらねばならないデメリットがある

apacheを利用したyumレポジトリサーバ構築と、クライアント側でのアップデート手順


  • サーバ側の作業
    1. apacheインストール(&80番ポート解放)
    2. isoファイルをマウント&コピー
    3. 設定ファイル編集
$ yum install httpd  

$ service httpd start  

# ここでブラウザから、http://サーバアドレス/として、apacheのwelcomeページが開かれるかチェック
# 開かれなければ、
$ iptables -I INPUT -p tcp -m tcp --dport 80 --syn -j ACCEPT  
$ service iptables save  
$ service iptables restart  
# として、80番ポートを開ける(原因が80番ポートの非解放にあった場合。他の原因としては、ネットワークがNATの場合にポートフォワーディングの設定の不備などがある)  

$ mount /dev/cdrom /mnt  

$ mkdir /var/www/html/RHEL_6.8  

$ cp -pR /mnt/* /var/www/html/RHEL_6.8/  

$ vim /etc/yum.repos.d/rhel-server.repo  

[rhel-server]  
name=rhel-server  
baseurl=http://サーバのIPアドレス(またはlocalhost)/RHEL_6.8/  
gpgcheck=0  
enabled=1  

$ yum clean all  

$ yum repolist all  

$ yum update  
  • クライアント側の作業
    1. 設定ファイル編集
$ vim /etc/yum.repos.d/rhel-server.repo  

[rhel-server]  
name=rhel-server  
baseurl=http://サーバのIPアドレス/RHEL_6.8/  
gpgcheck=0  
enabled=1  

$ yum clean all  

$ yum repolist all  

$ yum update  

以上

yumとrpmについて

用語


yum : Yellowing Updater Modified
rpm : Redhat Package Manager
パッケージ : ソフトウェアの一連のファイルをまとめたもの
リポジトリ : パッケージの保管場所
RPMデータベース : rpm形式のパッケージがインストールされると、/usr/lib/rpmに情報が格納される。このデータのまとまりのこと

概要


かつて、Linuxプログラムの多くはソースコードとっして配布されていた。
このソースコードを、ユーザが必要なmanページ、構成ファイルなどと併せてビルドして1つのプログラム、あるいは一連のプログラムに組み込むという仕組みだった
最近では、事前にビルドされたプログラムを使用するのがほとんど
このプログラムのセットをパッケージと呼び、ディストリビューションによってパッケージの管理方法が異なる

ディストリビューションごとのパッケージ管理方法は以下のようになっている

Redhat系⇒RPM
Debian系⇒deb
FreeDSB⇒ports
Solaris⇒pkg

となっている。

これらのパッケージを管理するツールが、ディストリビューションによって用意されている
例えば、
RPM(RPM Package Manager)←超ややこしいけど、そういうこと
YUM
APT(Advanced Package Tool:デビアン系)
など。

YUMやRPMやAPTには、多くの共通点がある

  • パッケージのインストールと削除を行うことができる
  • インストールされているパッケージに関する情報はデータベースに保持される
  • いずれも基本的なコマンドライン機能を備え、ツールを追加することでさらに便利になる
  • インターネットからパッケージを取得できる

RPMパッケージは、それぞれ以下の規則により名前が付けられている 「パッケージ名 バージョン番号 リリース番号.アーキテクチャ.rpm」

アーキテクチャのリスト

アーキテクチャ 説明
alpha Alpha
i386 i386以降のx86
noarch 機種に依存しない
ppc PowerPC
sparc SPARCStation
src ソースファイル

以降では、YUMとRPM焦点をあてる

※ちなみに、Yumに続くパッケージ管理ツールとして、DNF(Dandifled Yum)が登場している
これは、Yum3.4をフォーク↓後継ツールで、Yumの問題点であったドキュメントの整理と、依存関係のアルゴリズム改善、メモリ使用量の改善など多く改善がなされている

Fedora22では、デフォルトのパッケージ管理ツールにDNFが採用されていて、CentOS7などでも使用できる

Tips - ソースコード形式のパッケージ -


上で、ソースコードをコンパイルしたバイナリと関連するファイルのことをパッケージと呼ぶ、とした。
が、ソースコード形式のパッケージ(SRPM)という一見意味不明なものがある。
SRPMとはRPMパッケージを作るためのソースで、SRPMをビルドすることでRPMパッケージを作成できる
RPMであればパッケージ作成者の意図通りのディレクトリ先や構成になるが、SRPMを編集すれば自分好みのRPMパッケージを作成できる

SRPMのファイル名は、プログラム名-バージョン.src.rpmとなっている

SRPMからプログラムをインストールするには、

なんと、インストールと同じ

rpm -ivh SRPM名

とすると、ソース→バイナリ→インストールまでやってくれる。お手軽。便利。
どこに展開されたかはrpm --showrc | grep _topdirでわかる

んで、なんかSRPM編集した場合(パッチを当てたり)

rpmbuild --rebuild SRPM名

とすると、バイナリファイルができる
あとは、このバイナリパッケージを見つけて、rpm -ivhとかでインストールすればよい。

YUMとRPMの違い


どちらもパッケージ管理ツールであり、同じディストリビューションに用意されている
機能的にも同じように見えるが、少し異なる

YUMは、RPMに自動更新機能と依存関係の管理を含めたパッケージ管理機能を追加した物という認識で問題ない。
ざっくりいうとRPMの高機能バージョン
また、リポジトリと連携する機能がある(APTもそう)

つまり、
YUMはパッケージインストール時に依存関係を自動で解消し、必要なものも一緒にインストールしてくれる
RPMは、インストール時に、これに依存関係があることを把握はするが、依存関係を解決することまではいない。

更に、RPMは、インストール時に「パッケージ名 バージョン番号 リリース番号.アーキテクチャ.rpm」とrpmファイル名で指定しなければならない
YUMであれば、yum install gclというように、パッケージ名で指定できる

また、Yumはリポジトリを参照することにより、インストールされていないパッケージの情報を検索することができる
RPMはインストールされていないパッケージの情報検索には不向き(パッケージファイルを既にダウンロードしているか、パッケージファイルのURLがわかっていないと検索できない)

したがって、RPMはほしいものがどのパッケージで、どんな依存関係があって、どこにあるのか、というのを探すのがめんどくさい

しかし、上記のように、YUMはRPMの機能追加版のようなものであり、全く別物ではない。
実は、YUMは、内部でRPMを呼び出して使用している

基本的には、yumを使って、必要なときにrpmを使用するのが良い
最近はgithubにrpmとか置いてあったりするから、そういうのをダウンロードインストールするときはrpmを使用する

パッケージの保管場所


パッケージはどこにあるのか。
yumの場合、リポジトリを参照するので、リポジトリの場所を知る必要がある。
リポジトリの場所は、/etc/yum.repos.d/配下の.repoファイルに記述されている
(/etc/yum.confで/etc/yum.repos.d/以外にも指定できる)
この.repoファイルには、リポジトリの場所だけでなく、リポジトリの有効/無効など、GPG署名の有効/無効などリポジトリに関する情報が記述されている

典型的な.repoファイルは、標準パッケージ用、デバッグ・パッケージ用、ソース・パッケージ用の3セクションに分かれている
一般にディストリビューションのパッケージは異なる保管場所(ミラー)からそれぞれにコピーを入手することができる
そのためrepoファイルは、yumに対し、セクションごとのミラーの最新リストを検索する場所を伝えている

yumとrpmは、ローカルデータベースを使用してインストール済みのパッケージを判断する
ローカルデータベースに保管されたパッケージに関するメタデータは有効化されたリポジトリから取得される
ローカル側に保管された情報を部分的に消去するにはyum clean コマンドを、有効化された.repoの情報をローカルデータベースに作成するには yum makecacheを使用する

ちなみに、.rpmファイルとcreaterepoコマンドさえあれば、どのディレクトリでもリポジトリとして使用できる。
createrepoコマンドがメタデータを作っぽい

多分、今のところの自分の理解としては、

yumとrpmはともにローカルデータベースを参照してインストール済みのパッケージに対する参照を行うが、yumはレポジトリを参照することで未インストールのパッケージも参照できる  
rpmは、ダウンロードしてないと未インストールのパッケージを参照できない(参照するにはURLが必要)  
rpmは、ダウンロードしたパッケージはパスで指定してあげてインストールする形になる  

以下、YumとRPMの使い分け


  • パッケージ検索時の使い分け(yum)
  • パッケージ検索時の使い分け(rpm)
  • パッケージのインストール
  • パッケージのアンインストール

パッケージ検索時の使い分け(yum)


rpm は「-q」オプション(query の略)を付けて実行すると RPM データベース内を検索することができます。すなわち既にインストールされたパッケージの情報を検索できます。一方で、インストールされていないパッケージを検索しても、インストールされていない旨が表示されるだけです。 これに対して yum は、RPM データベース内に加えリポジトリも参照することができるので、まだインストールされていないパッケージの情報も検索することができます。 したがって、ほとんどの場合、yum だけ覚えていれば事足ります。

  • yum list コマンド

インストールされているパッケージと、(インストールされていないけれども)利用可能なパッケージを一覧表示します。 インストールしたいパッケージが、本当にまだインストールされていないか確認するときや、対象のパッケージが yum からインストール可能かどうかを調べるときに使います。

  • yum search コマンド

あるパッケージについて調べたいのだけれど、正確なパッケージ名が分からないときは「yum list | grep xxx」よりも「yum search」コマンドのほうをよく使います。 というのも、各パッケージの名称だけではなく概要についても表示してくれるので、同じようなパッケージ名が複数あるなかから目的とするパッケージを見つけ出すのに適しています。 また、例えば下記のように「yum search mysql」を実行すると、パッケージ名に「mysql」が含まれていなくても「mysql」に関連するパッケージまで一覧表示してることも「yum list」にはない特長です(例: php-pdo.x86_64)

  • yum info コマンド

パッケージの詳細情報を表示します。同じようなパッケージ名が複数あって目的とするパッケージを見つけ出す場面において、「yum search」が表示する情報だけでは不十分というときに使います

パッケージ検索時の使い分け(rpm)


繰り返しになりますが、yum は rpm よりも高機能なので、ほとんどの場合 rpm よりも yum を使ったほうが便利であり、ほとんどの場合、yum だけ覚えていれば事足ります。 しかし、yum は使えず rpm しか使えないという場面もあります。

rpmでのパッケージ検索は、ローカルデータベース(/usr/lib/rpm???)しか参照しない(Installedしか見れない、Availableはない)
パッケージ内のファイルを表示させるとき、リポジトリに含まれていないパッケージを扱う場面でrpmコマンドが活躍する

  • -qオプション

パッケージ検索の基本となるオプションです。rpm コマンドに「-q」オプション(query の略)を付けて実行すると、RPM データベースに対して検索できます。また、インストールされていないパッケージを検索しようとすると、インストールされていない旨が表示されます。

  • -aオプション

該当するものをすべて表示します。grep と一緒に使うと便利です。 お気づきのとおり「yum list」コマンドと非常に似ています。あるパッケージが既にインストールされているか否かの確認や、インストールされているパッケージのバージョン確認に使います。

  • -lオプション

パッケージ内のファイルを一覧表示します。パッケージ内のファイルを表示する機能は yum にはないので、rpm を使う場面のひとつです。

  • -pオプション

引数に rpm パッケージファイル(拡張子が「.rpm」のファイル)を指定するときに必要です。インターネット上にある rpm パッケージファイルの URL を指定したり、ダウンロードした rpm ファイルを指定するときに使います。 これも yum にはない機能です。yum はリポジトリに含まれないパッケージに対してはコマンドを実行できないので、リポジトリに含まれないパッケージを検索するときにはこのオプションが役に立ちます。

  • -iオプション

パッケージの詳細情報を表示します。使う場面は「yum info」と似ていますが、表示される情報が異なります。

パッケージのインストール


yumはyum install パッケージ名とするだけ
rpmは、-i(installの略)オプションを使う

よく使うのは、rpm -ivhとか、rpm -Uvhとか

-vは、詳細なログを表示させる
-hは、進捗状況を表示させる
-Uは、パッケージがインストール済みであればアップデート、未インストールであればインストールを行う
よく似たものに、-Fオプションがある
-Fは、インストール済みのパッケージのみをアップデートする

ちなみに、-qiとすると、同じiでも、検索して詳細情報(information)表示なので注意

パッケージアンインストール


  • 特定のパッケージとそれに依存するすべてのパッケージをアンインストールする場合
yum remove パッケージ名
  • 特定のパッケージをアンインストールする場合
rpm -e パッケージ名

この場合、依存関係が発覚すると、エラーが出てアンインストールされない
これを無視する場合は、--nodepsオプションによって依存関係を無視してアンインストールを実行する

以上

リポジトリからのRPMファイルのダウンロード


yumは自動的にリポジトリからパッケージを取得するものの、インストールしてもrpmファイルはダウンロードしない。
ダウンロードしたい場合には、downloadonlyプラグインを使うとリポジトリからrpmパッケージをダウンロードできる
また、yumdownloaderコマンドを使ってもできる

downloadonlyは、リポジトリにある未インストールのパッケージをダウンロードする
yum install yum-plugin-downloadonly
yum install yum-downloadonly(RHEL5のみ)
でプラグインをダウンロードして、 yum install --downloadonly --downloaddir=ダウンロード先ディレクトリ パッケージ名
とする。

-downloaddir オプションを使用しない場合、デフォルトではファイルは /var/cache/yum/ 内の rhel-{arch}-channel/packages に保存されます。

しかし、これは未インストールのものしかダウンロードできない

インストール済みのパッケージをダウンロードするには、yumdownloaderが必要
yum install yum-utils
としてyumdownloaderをインストールして、
yumdownloader パッケージ名
とすると、リポジトリからとってくる

デフォルトでは、パッケージファイルはカレントディレクトリに保存されます。別のディレクトリを指定するには、--destdir オプションを使用します。 依存パッケージをダウンロードする必要がある場合は、--resolve オプションを付けてください。

--sourceとすると、ソースファイルをダウンロードする

ちなみに、、、、

RPM をインストールするのではなく、ダウンロードしてパッケージの内容を調べる必要がある場合には、rpm2cpio コマンドを使用してパッケージの内容を cpio アーカイブに変換すれば、その後に cpio コマンドを使って個々のファイル、またはパッケージに含まれるすべてのファイルを解凍することができます。リスト 26 では、この変換操作を gcl-selinux パッケージに対して行った後、パッケージから解凍されたファイル (およびディレクトリー) の内容を表示しています。rpm2cpio および cpio コマンドについての詳細は、それぞれの man ページを参照してください。

リスト26↓

[ian@echidna ~]$ yumdownloader gcl-selinux
Loaded plugins: presto, refresh-packagekit
gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm        |  17 kB     00:00     
[ian@echidna ~]$ mkdir gcl-selinux
[ian@echidna ~]$ cd gcl-selinux
[ian@echidna gcl-selinux]$ rpm2cpio ../gcl-selinux*.rpm | cpio -idv
./usr/share/selinux/packages/gcl
./usr/share/selinux/packages/gcl/gcl.pp
182 blocks
[ian@echidna gcl-selinux]$ find .
.
./usr
./usr/share
./usr/share/selinux
./usr/share/selinux/packages
./usr/share/selinux/packages/gcl
./usr/share/selinux/packages/gcl/gcl.pp

参考


初心者の頃に知っておきたかったrpmとyumの違いと使い分け
↓詳細
Linuxの101試験対策

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment