Red Hat Linuxに最新のアップデートをあてる

Red Hat

Red Hat Linuxに最新のアップデートをあてる方法をアップロードしました。インストール直後の状態は非常に脆弱で、そのままThe Internetに接続すればワームやウイルスに感染するまで1日とかかりません。7.0〜9.0までいずれでも脆弱性が既に確認されているので(7.0未満はもう古いので言及しません)、感染するまでの時間の多少の差こそあれ、同じ状況でしょう。この文書を元に作業をして発生したいかなる結果にも筆者は責任を持ちませんが、参考にはなるはずです。

Red Hat Linuxではrpmの採用でパッケージの更新が比較的簡単です。しかしながら依存性の解消については少々コツが必要ですので、簡単にまとめておきます。

なお以下の説明の前提として、パッケージグループ・Network Support、Web Serverがインストールされていることと、rpmコマンドの使い方をある程度理解していることが必要です。

7.0/7.1での方法

全てのupdatesパッケージをダウンロード

wgetコマンドで取得する方法をお薦めしますが、wgetコマンドがない場合、先にインストールしておく必要があります。updatesは2003/08/08現在で、それぞれ以下の容量になっています(i386/i686/noarchディレクトリのみ)。

  • 7.0 : 397MB
  • 7.1 : 713MB
  • 7.2 : 875MB
  • 7.3 : 765MB
  • 8.0 : 1.1GB
  • 9 : 412MB
[root@test /root]# export FTPSERVER='ftp://jpix.ftp.ne.jp/'
[root@test /root]# export FTPDIR='00/redhat/linux/updates/7.0/en/os/'
[root@test /root]# mkdir i386 i686 noarch
[root@test /root]# wget -t 0 -P i386 $FTPSERVER$FTPDIR'i386/*'
[root@test /root]# wget -t 0 -P i686 $FTPSERVER$FTPDIR'i686/*'
[root@test /root]# wget -t 0 -P noarch $FTPSERVER$FTPDIR'noarch/*'

※この際、同一パッケージの複数のバージョンやアーキテクチャが混在することがあるので、取り除いておきます。混在しているとパッケージの更新時に不具合が出ることがあります。

特にカーネルのパッケージには注意してください。起動できなくなることがあります。例えば、kernel-2.4.20-18.7.i386.rpm, kernel-2.4.20-19.7.i386.rpm, kernel-2.4.20-18.7.i686.rpm, kernel-2.4.20-19.7.i686.rpm等です。この場合、kernel-2.4.20-19.7.i686.rpmを残して他は削除します。

全てのupdateパッケージをテスト

[root@test /root]# rpm -F --test i386/* i686/* noarch/*
エラー: 依存性の欠如:
        mod_bandwidthは apache-1.3.27-1.7.1 に必要とされています
        mod_putは apache-1.3.27-1.7.1 に必要とされています
        mod_throttleは apache-1.3.27-1.7.1 に必要とされています
        libexpat.so.0  は apache-1.3.27-1.7.1 に必要とされています
        libmm.so.11  は apache-1.3.27-1.7.1 に必要とされています

        glibc-common = 2.2.4-18.7.0.9は glibc-2.2.4-18.7.0.9 に必要とされています

        makeは mod_ssl-2.8.12-1.7 に必要とされています

        libltdl.so.0  は php-4.1.2-7.0.6 に必要とされています
        libpspell-modules.so.1  は php-4.1.2-7.0.6 に必要とされています
        libpspell.so.2  は php-4.1.2-7.0.6 に必要とされています

        /usr/bin/getent  は stunnel-3.10-2 に必要とされています
        libcrypto.so.0は stunnel-3.10-2 に必要とされています
        libssl.so.0は stunnel-3.10-2 に必要とされています

        up2datepoptmodule.soは up2date-2.8.39-1.7.0 に必要とされています

        makeは ypserv-2.5-2.7x に必要とされています

たくさん表示されますが、個別に見ていけば依存関係が解けます。

最初の依存性のグループであるapacheについてテスト

[root@test i386]# rpm -F --test apache-1.3.27-1.7.1.i386.rpm 
エラー: 依存性の欠如:
        mod_bandwidthは apache-1.3.27-1.7.1 に必要とされています
        mod_putは apache-1.3.27-1.7.1 に必要とされています
        mod_throttleは apache-1.3.27-1.7.1 に必要とされています
        libexpat.so.0  は apache-1.3.27-1.7.1 に必要とされています
        libmm.so.11  は apache-1.3.27-1.7.1 に必要とされています
        apache = 1.3.12-25は mod_ssl-2.6.6-25 に必要とされています

ここから、mod_bandwidth、mod_put、mod_throttle、expat、mm、mod_sslが必要なことが分かります。また、2の「makeは mod_ssl-2.8.12-1.7 に必要とされています」から、mod_sslのインストールにはmakeが必要なことが分かります。先ほどの結果と合わせると、以下のようになります。

libexpat.so.0が何というパッケージに含まれるのかは、

rpm -q --redhatprovides libexpat.so.0

で分かることになっていますがあまり役に立ちません。たいていの場合、libhogeという名前のままか、最初の”lib”を除くとパッケージ名になるのでそれで探してみましょう。それでも見つからない場合はhttp://www.rpmfind.net/で探すのが良いでしょう。

makeをインストール

[root@test i386]# wget $FTPSERVER$FTPDIR'i386/RedHat/RPMS/make-3.79.1-5.i386.rpm'
[root@test i386]# rpm -Uvh make-3.79.1-5.i386.rpm

mod_sslをテスト

[root@test i386]# rpm -F --test mod_ssl-2.8.12-1.7.i386.rpm エラー: 依存性の欠如:
        libcrypto.so.1  は mod_ssl-2.8.12-1.7 に必要とされています
        libssl.so.1  は mod_ssl-2.8.12-1.7 に必要とされています

ここでlibcryptとlibsslが必要なことが分かります。libsslはopensslパッケージが提供します。そこで、opensslパッケージが提供する機能の一覧を見ると、

[root@test i386]# rpm -q -p --provides openssl-0.9.6-16.i386.rpm
libcrypto.so.1  
libssl.so.1  
openssl = 0.9.6-16

となるので、opensslをインストールすれば、mod_sslをインストール出来ることが分かります。

opensslをテスト

[root@test i386]# rpm -F --test openssl-0.9.6-16.i386.rpm 
エラー: 依存性の欠如:
        libcrypto.so.0は cyrus-sasl-1.5.24-6 に必要とされています
        libcrypto.so.0は mod_ssl-2.6.6-25 に必要とされています
        libcrypto.so.0は openssh-2.1.1p4-1 に必要とされています
        libcrypto.so.0は openssh-clients-2.1.1p4-1 に必要とされています
        libcrypto.so.0は openssh-server-2.1.1p4-1 に必要とされています
        libcrypto.so.0は python-1.5.2-27 に必要とされています
        libcrypto.so.0は stunnel-3.8-4 に必要とされています
        libssl.so.0は mod_ssl-2.6.6-25 に必要とされています
        libssl.so.0は python-1.5.2-27 に必要とされています
        libssl.so.0は stunnel-3.8-4 に必要とされています

opensslは、上記パッケージと依存していることが分かります。図にすると以下です。

各パッケージをテスト

[root@test i386]# rpm -F --test openssh-server-3.1p1-5.i386.rpm  
エラー: 依存性の欠如:
        openssh = 3.1p1-5は openssh-server-3.1p1-5 に必要とされています
        libcrypto.so.1  は openssh-server-3.1p1-5 に必要とされています
        libc.so.6(GLIBC_2.2.4)  は openssh-server-3.1p1-5 に必要とされています

opensslと依存関係にある各パッケージをテストすると、openssh-serverがglibcと依存していることが分かります。手順2のテストと合わせると、以下のようになります。

apacheに関連する一群のパッケージをアップデートするテストを実行

[root@test i386]# rpm -Uvh --test apache-1.3.27-1.7.1.i386.rpm¥
mod_bandwidth-2.0.3-2.i386.rpm¥
mod_put-1.3-2.i386.rpm¥
mod_throttle-3.1.2-3.i386.rpm¥
mod_ssl-2.8.12-1.7.i386.rpm¥
expat-1.95.1-1.i386.rpm¥
mm-1.1.3-11.i386.rpm¥
openssl-0.9.6-16.i386.rpm¥
python-1.5.2-43.71.i386.rpm¥
openssh-3.1p1-5.i386.rpm¥
openssh-server-3.1p1-5.i386.rpm¥
openssh-clients-3.1p1-5.i386.rpm¥
cyrus-sasl-1.5.24-22.7.i386.rpm¥
../i686/glibc-2.2.4-18.7.0.9.i686.rpm¥
glibc-common-2.2.4-18.7.0.9.i386.rpm¥
stunnel-3.10-2.i386.rpm 
エラー: 依存性の欠如:
        libcrypto.so.0は stunnel-3.10-2 に必要とされています
        libssl.so.0は stunnel-3.10-2 に必要とされています

stunnelとopensslの両パッケージが含まれるのに、stunnelとlibcrypto、libsslの依存性が解消出来ないことが分かります。libcrypto.so.0は/usr/lib/にあり(どこにあるか分からない時は、find / -name libcrypto.so.0)、

[root@test i386]# ls -l /usr/lib/libcrypto*
lrwxrwxrwx    1 root     root           19  8月  8 02:02 /usr/lib/libcrypto.so.0 -> libcrypto.so.0.9.5a
-rwxr-xr-x    1 root     root       865620  8月 31  2000 /usr/lib/libcrypto.so.0.9.5a

同じディレクトリにあるlibcrypto.so.0.9.5aへのシンボリックリンクになっていることが分かります。この共有ライブラリを提供するパッケージは、

[root@test i386]# rpm -qf /usr/lib/libcrypto.so.0.9.5aopenssl-0.9.5a-14

openssl-0.9.5a-14であることが分かりますので、openssl-0.9.6-16.i386.rpmをインストールすれば、stunnelの依存性は解消されるはずです。

apacheに関連する部分を全てを更新

[root@test i386]# rpm -Uvh --nodeps apache-1.3.27-1.7.1.i386.rpm¥
mod_bandwidth-2.0.3-2.i386.rpm¥
mod_put-1.3-2.i386.rpm¥
mod_throttle-3.1.2-3.i386.rpm¥
mod_ssl-2.8.12-1.7.i386.rpm¥
expat-1.95.1-1.i386.rpm¥
mm-1.1.3-11.i386.rpm¥
openssl-0.9.6-16.i386.rpm¥
python-1.5.2-43.71.i386.rpm¥
openssh-3.1p1-5.i386.rpm¥
openssh-server-3.1p1-5.i386.rpm¥
openssh-clients-3.1p1-5.i386.rpm¥
cyrus-sasl-1.5.24-22.7.i386.rpm¥
../i686/glibc-2.2.4-18.7.0.9.i686.rpm¥
glibc-common-2.2.4-18.7.0.9.i386.rpm¥
stunnel-3.10-2.i386.rpm
apache                      ##################################################
mod_bandwidth               ##################################################
mod_put                     ##################################################
mod_throttle                ##################################################
glibc-common                ##################################################
警告: /etc/localtime は /etc/localtime.rpmnew として作成されます
glibc                       ##################################################
/usr/share/locale/el/LC_MESSAGES を削除できません - ディレクトリが空でありません
/usr/share/locale/el を削除できません - ディレクトリが空でありません
......

ここで出た警告は無視して構わないものです。

2番目の依存性のグループであるphpについてテスト

[root@test i386]# rpm -F --test php*
エラー: 依存性の欠如:
        libltdl.so.0  は php-4.1.2-7.0.6 に必要とされています
        libpspell-modules.so.1  は php-4.1.2-7.0.6 に必要とされています
        libpspell.so.2  は php-4.1.2-7.0.6 に必要とされています

libltdlはlibtoolパッケージに含まれます。また、libpspellはpspellパッケージに含まれます。

libtoolsのテスト

[root@test i386]# wget $FTPSERVER$FTPDIR'i386/RedHat/RPMS/libtool-1.3.5-8.i386.rpm'
[root@test i386]# rpm -Uvh --test libtool-1.3.5-8.i386.rpm
エラー: 依存性の欠如:
        autoconf  は libtool-1.3.5-8 に必要とされています
        automake  は libtool-1.3.5-8 に必要とされています
        m4  は libtool-1.3.5-8 に必要とされています
        libtool-libs = 1.3.5-8は libtool-1.3.5-8 に必要とされています

さらにautoconf、automake、m4、libtool-libsが必要なことが分かります。

[root@test i386]# wget $FTPSERVER$FTPDIR'i386/RedHat/RPMS/m4-1.4.1-3.i386.rpm'
[root@test i386]# wget $FTPSERVER$FTPDIR'i386/RedHat/RPMS/automake-1.4-8.noarch.rpm'
[root@test i386]# wget $FTPSERVER$FTPDIR'i386/RedHat/RPMS/autoconf-2.13-9.noarch.rpm'
[root@test i386]# wget $FTPSERVER$FTPDIR'i386/RedHat/RPMS/libtool-libs-1.3.5-8.i386.rpm

ダウンロードが終了したところで、インストールします。

[root@test i386]# rpm -Uvh autoconf-2.13-9.noarch.rpm¥
automake-1.4-8.noarch.rpm¥
libtool-1.3.5-8.i386.rpm¥
libtool-libs-1.3.5-8.i386.rpm¥
m4-1.4.1-3.i386.rpm 
autoconf                    ##################################################
automake                    ##################################################
m4                          ##################################################
libtool                     ##################################################
libtool-libs                ##################################################

pspellのインストール

[root@test i386]# wget $FTPSERVER$FTPDIR'i386/RedHat/RPMS/pspell-0.11.2-1.i386.rpm'
[root@test i386]# rpm -Uvh pspell-0.11.2-1.i386.rpm 
pspell                      ##################################################

phpの更新

[root@test i386]# rpm -F php*

3番目の依存性のグループ・up2dateを更新

up2dateは、up2datepoptmodule.soを必要としています。これは、python-popt-0.8.8-7.x.1.i386.rpmが提供する共有ライブラリなので、python-popt-0.8.8-7.x.1.i386.rpmをインストールします。

[root@test i386]# rpm -Uvh python-popt-0.8.8-7.x.1.i386.rpm 
python-popt                 ##################################################

全てを更新

ここまでの作業で全ての依存性が解消されたので、全てのパッケージを更新します。

[root@test 7.0]# rpm -F i386/* i686/* noarch/*
警告: /var/lib/rpm/Basenames は /var/lib/rpm/Basenames.rpmnew として作成されます
警告: /var/lib/rpm/Conflictname は /var/lib/rpm/Conflictname.rpmnew として作成されます
......

7.2での方法

全てのupdatesパッケージをダウンロード

ダウンロードについては7.0/7.1での方法に同様です。

全てのupdateパッケージをテスト

[root@test up2date]# rpm -F --test 7.2/i386/* 7.2/i686/* 7.2/noarch/*
エラー: 依存性の欠如:
        perl-CPANは perl-5.6.1-26.72.3 に必要とされています
        perl-CGIは perl-5.6.1-26.72.3 に必要とされています
        perl-DB_Fileは perl-5.6.1-26.72.3 に必要とされています
        perl-NDBM_Fileは perl-5.6.1-26.72.3 に必要とされています
        poptmodule.soは up2date-2.8.39-1.7.2 に必要とされています
        bcm5820 < 1.81 kernel-2.4.20-19.7 と競合します

このうち、bcm5820は/etc/rc.d/init.d/に起動スクリプトがインストールされているBroadcom E-COMMERCE Processorなので、不必要であれば削除してしまって構いません。

[root@test up2date]# find / -name bcm5820*
/etc/rc.d/init.d/bcm5820
[root@test i386]# rpm -qf /etc/rc.d/init.d/bcm5820 
bcm5820-1.17-6
[root@test up2date]# rpm -e bcm5820

最初の依存性のグループであるperlをインストール

[root@test i386]# rpm -Uvh perl-*
Preparing...                ########################################### [100%]
   1:perl-NDBM_File         ########################################### [ 20%]
   2:perl-DB_File           ########################################### [ 40%]
   3:perl-CPAN              ########################################### [ 60%]
   4:perl                   ########################################### [ 80%]
   5:perl-CGI               ########################################### [100%]

2番目の依存性のグループであるpoptmoduleについてテスト

[root@test i386]# rpm -U --test python-popt-0.8.8-7.x.2.i386.rpm 
エラー: 依存性の欠如:
        rpm < 4.0.4 python-popt-0.8.8-7.x.2 と競合します
[root@test i386]# rpm -qa | grep rpm
rpm-4.0.3-1.03
rpm-python-4.0.3-1.03

現在インストールされているrpmが4.0.3であるために、python-poptパッケージと競合しています。

rpmパッケージのテスト

[root@test i386]# rpm -F --test rpm*
エラー: 依存性の欠如:
        popt = 1.6.4は rpm-4.0.4-7x に必要とされています
        popt = 1.6.4は rpm-python-4.0.4-7x に必要とされています

つまり、rpm-4.0.3-1.03、rpm-python-4.0.3-1.03、popt-1.6.4-7x.i386.rpm、python-popt-0.8.8-7.x.2を同時に更新すれば良いことになります。

[root@test i386]# rpm -Uvh rpm-4.0.4-7x.i386.rpm¥
rpm-python-4.0.4-7x.i386.rpm¥
popt-1.6.4-7x.i386.rpm¥
python-popt-0.8.8-7.x.2.i386.rpm 
Preparing...                ########################################### [100%]
   1:popt                   ########################################### [ 25%]
   2:rpm                    ########################################### [ 50%]
   3:rpm-python             ########################################### [ 75%]
   4:python-popt            ########################################### [100%]

全てを更新

[root@test up2date]# rpm -F 7.2/i386/* 7.2/i686/* 7.2/noarch/*
警告: /usr/lib/gconv/gconv-modules created as /usr/lib/gconv/gconv-modules.rpmnew
警告: /usr/share/ssl/openssl.cnf created as /usr/share/ssl/openssl.cnf.rpmnew
......

7.3/8.0での方法

全てのupdatesパッケージをダウンロード

ダウンロードについては7.0/7.1/7.2での方法に同様です。

全てのupdateパッケージをテスト

[root@test up2date]# rpm -F --test 7.3/i386/* 7.3/i686/* 7.3/noarch/*

もちろんインストールしているパッケージにもよりますが、7.3では特に依存性の問題は出ません。 8.0では以下の警告が出ますが、これはパッケージの問題で、インストールの障害になるものではありません。

警告: 8.0/i386/Canna-3.5b2-70.8.0.1.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e

全てを更新

[root@test up2date]# rpm -F 7.3/i386/* 7.3/i686/* 7.3/noarch/*
警告: /etc/php.ini created as /etc/php.ini.rpmnew

9での方法

全てのupdatesパッケージをダウンロード

ダウンロードについては7.0/7.1/7.2/7.3/8.0での方法に同様です。

全てのupdateパッケージをテスト

[root@test up2date]# rpm -F --test 9/i386/* 9/i686/* 9/noarch/*
警告: i386/LPRng-3.8.19-3.1.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
エラー: Failed dependencies:
        gettext is needed by mutt-1.4.1-1
[root@test 9]# rpm -qa | grep get
mingetty-1.01-1
wget-1.8.2-9

gettextパッケージはインストールされていないので、wgetで取得します。

[root@test 9]# wget $FTPSERVER$FTPDIR'/RedHat/RPMS/gettext-0.11.4-7.i386.rpm'

gettextパッケージをテスト

[root@test 9]# rpm -Uvh --test gettext-0.11.4-7.i386.rpm 
警告: gettext-0.11.4-7.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
エラー: Failed dependencies:
        libgcj.so.3 is needed by gettext-0.11.4-7
[root@test 9]# rpm -qa | grep libgcj

libgcjパッケージもインストールされていないので、wgetで取得します。

[root@test 9]# wget $FTPSERVER$FTPDIR'/RedHat/RPMS/libgcj-3.2.2-5.i386.rpm'

gettext、libgcjをインストール

[root@test 9]# rpm -Uvh libgcj-3.2.2-5.i386.rpm gettext-0.11.4-7.i386.rpm 
警告: libgcj-3.2.2-5.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
Preparing...                ########################################### [100%]
   1:libgcj                 ########################################### [ 50%]
   2:gettext                ########################################### [100%]

全てを更新

[root@test up2date]# rpm -F 9/i386/* 9/i686/* 9/noarch/*
警告: 9/i386/LPRng-3.8.19-3.1.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
Stopping sshd:[  OK  ]
Starting sshd:[  OK  ]
タイトルとURLをコピーしました