インストールされたソフトのアップグレード(CVSupとportupgrade)

1.はじめに

FreeBSDには便利なPackageとPortsがあります
私のHPでは両方を多用していますが、最近は全てPortsにしています
そのPortsですが各ソフトのバージョンアップが頻繁に行われるので関連づけされているソフトも合わせて
バージョンを上げるにはPackageだとあれこれアンインストールしないと上げられない場合があるのでPortsに移行しています
さて、そのアップグレードですが非常に便利なcvsupとportupgradeを利用する事により簡単にアップグレードできましたので
HPにまとめてみます

2.cvsupでportsを最新にする

/usr/ports にあるデータを最新にするにはFTPで落として来るのは毎回面倒なのですが
それを自動で最新にするのがcvsupです
Portsはソースからコンパイルするのでコンパイルの条件などをカスタマイズしておきます
/etc/make.conf
CPUTYPE=pentium4
CFLAGS= -O -pipe
COPTFLAGS= -O -pipe
NO_PROFILE=true
私はSASL以外はこれだけ入れています
詳しくは
/usr/src/share/examples/etc/make.conf
を見ましょう。FreeBSDのバージョンによって書き方が違います
これは6.1の場合になります
それ以外にもオプションが入れられます、例えばSendmailのSASLあたりを見て見てください

ではcvsupをインストールします
# cd /usr/ports/net/cvsup-without-gui
# make install clean
そのままのcvsupもありますが私はX11を入れていないのでwithout-guiにしています

設定をします
まず設定ファイルをコピーします
# cp /usr/share/examples/cvsup/ports-supfile /etc/
# chmod 644 /etc/ports-supfile
# vi /etc/ports-supfile
中身の変更箇所は
*default host=cvsup2.jp.FreeBSD.org
*default base=/usr
私の変更した箇所はこれだけです
ホストはこちら(CVSサイト一覧)から選びましょう。
さて、このままでは全てのportsが一新するので不要な物だけパスするように設定します
/usr/sup/ のディレクトリーは一度cvsupした場合は自動で作成されていますのでそのままrefuseを編集して下さい
# cd /usr
# mkdir sup
# chmod 755 sup
# cd sup
# vi refuse
そしてrefuseの中は
ports/arabic
ports/chinese
ports/french
ports/german
ports/hebrew
ports/hungarian
ports/korean
ports/polish
ports/portuguese
ports/russian
ports/ukrainian
ports/vietnamese
と、他言語のみ更新しません
他にもいらないのは各自設定しましょう
さてそれではいよいよportsを最新にします
# cvsup -g /etc/ports-supfile
で更新が始まります
かなり時間がかかりますので余裕のある時かcronで実行するといいでしょう
私はportupgradeは週末しか出来ないので、土曜日の朝早い時間にcronで実行しています

3.portupgradeで最新に

portsが最新に出来るようになったところで、アップグレード環境を作成しアップグレードします
必要なソフトはportupgradeです
まずportsからインストールします

# cd /usr/ports/sysutils/portupgrade
# make install clean
インストールが終了したら何がアップグレード必要かのINDEXを作成します
# portsdb -Uu
これでINDEXは作成できましたので、リストを表示させます
# portversion -v | grep needs
こうするとバージョンアップされている物のみ出て来ます
たとえばこんな感じに
bind9-9.3.2                 <  needs updating (port has 9.3.2.1)
bsdpan-DBD-mysql-3.0003     <  [held] needs updating (port has 3.0007)
cyrus-sasl-2.1.21_2         <  needs updating (port has 2.1.22)
cyrus-sasl-saslauthd-2.1.21_1  <  needs updating (port has 2.1.22)
e2fsprogs-libuuid-1.38      <  needs updating (port has 1.39)
freetype2-2.1.10_5          <  needs updating (port has 2.2.1_1)
gmake-3.80_2                <  needs updating (port has 3.81_1)
ja-nkf-2.05                 <  needs updating (port has 2.0.7,1)
ja-p5-nkf-2.05              <  needs updating (port has 2.0.7,1)
mhonarc-2.6.15              <  needs updating (port has 2.6.16)
mysql-client-5.0.24a        <  needs updating (port has 5.0.24a_1)
namazu2-2.0.14              <  needs updating (port has 2.0.16_1)
net-snmp-5.2.2_1            <  needs updating (port has 5.2.3_3)
p5-Digest-1.14              <  needs updating (port has 1.15)
p5-File-MMagic-1.26         <  needs updating (port has 1.27)
p5-PathTools-3.19           <  needs updating (port has 3.21)
php5-5.1.6                  <  needs updating (port has 5.1.6_2)
php5-mysql-5.1.6            <  needs updating (port has 5.1.6_2)
php5-pcre-5.1.6             <  needs updating (port has 5.1.6_2)
proftpd-1.3.0.r3            <  needs updating (port has 1.3.0_2)
ruby-1.8.4_4,1              <  needs updating (port has 1.8.5_3,1)
smartmontools-5.33_5        <  needs updating (port has 5.36)
squid-2.5.12_4              <  needs updating (port has 2.5.14_2)
一度はgrep無しで実行すれば全部出て来ますので見て見てください
そしてアップグレードを一つ一つします
たとえばsquidだったら
# portupgrade -r squid
とこんな感じです

リストに[held]と出ているのはportupgradeでバージョンアップできません
出来ない物を指定しているのは
/usr/local/etc/pkgtools.conf
に記載されています。自分で追記する事もできます

パッケージでインストールしたのもアップグレード可能ですが
その場合はportsからは初めてなので「make config」で出て来るメニューが出てしまいますので
cronで自動とは行きません。安定するまでは手動で行い、ころあいをみて自動にして見てください。
但しバージョンアップの度にソースからコンパイルしますのでパワーを食いますし
更新したソフトが走っている場合はそのソフトを再起動しないと意味がないので私は結局リストまでで
あとは手動で行っています。

4.自動化

さて、手動で気がついた時にやるのは大変なので自動化して見ます
但し、私の場合はアップグレードするのではなくリスト作成までにしています
理由はアップグレードしてもそのソフトを再起動しないと意味がないですからね

まずは、自動スクリプトのシェルを作成します
私のはこんな感じです
/root/ports_up.sh
#!/bin/sh
export PATH=$PATH:/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin
cvsup -g /etc/ports-supfile > NULL
portsdb -Uu > NULL
portversion -v | grep need

初めは手動で実行してもいいでしょう
これをcronで実行させます。
私の場合、週末にしか作業できないので土曜日の早朝に実行して土日でアップグレード作業をしています

/var/cron/tabs/root へ下記行を追加
1 5 * * 6 /root/ports_up.sh
意味は土曜日の午前5時1分に実行するという感じです。
webminから設定すると楽に作れます

すると、あとは自動的に実行した後にroot宛メールに来ますので
それにしたがってportupgradeすればOKです

5.最適化

CVSupのサイトもたくさん有り、自分に一番マッチしたサイトを利用したいですよね
時々、落ちている時のことも考えて最適化+自動化をやってみます。

最適なサイトを探すのにfastest_cvsupというのがあります。
使い方は簡単、-c jp をつけるだけで一番戻りの早いサイトを表示してくれます。

ではまずインストールして見ましょう
# cd /usr/ports/sysutils/fastest_cvsup
# make install clean
オプションは1個だけでOFFです

インストールが終了したらテストして見ましょう
# rehash
# fastest_cvsup -c jp
>> Querying servers in countries: jp
--> Connecting to cvsup.jp.freebsd.org [210.224.172.75]...
- server replied: OK 17 0 SNAP_16_1h CVSup server ready
- time taken: 21.54 ms
--> Connecting to cvsup2.jp.freebsd.org [203.216.196.85]...
- server replied: OK 17 0 SNAP_16_1h CVSup server ready
- time taken: 11.64 ms
--> Connecting to cvsup3.jp.freebsd.org [210.188.224.44]...
- server replied: OK 17 0 SNAP_16_1h CVSup server ready
- time taken: 10.97 ms
--> Connecting to cvsup4.jp.freebsd.org [133.1.44.1]...
- server replied: OK 17 0 SNAP_16_1f CVSup server ready
- time taken: 22.20 ms
--> Connecting to cvsup5.jp.freebsd.org [210.161.150.4]...
- server replied: OK 17 0 SNAP_16_1h CVSup server ready
- time taken: 13.96 ms
--> Connecting to cvsup6.jp.freebsd.org [210.188.224.44]...
- server replied: OK 17 0 SNAP_16_1h CVSup server ready
- time taken: 10.24 ms

>> Speed Daemons:
- 1st: cvsup6.jp.freebsd.org
- 2nd: cvsup3.jp.freebsd.org
- 3rd: cvsup2.jp.freebsd.org
と、こんな感じで出て来ます。

ではこれを利用して先程のports_up.shへ組み込みます
#!/bin/sh
export PATH=$PATH:/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin
SITE=$(fastest_cvsup -c jp | grep 1st | awk '{print $3}')
cvsup -g /etc/ports-supfile -h $SITE
portsdb -Uu
portversion -v | grep need
とcvsupする直前に1stのサイトを変数に入れcvsupを実行します
シェルに組み込む事により、cronで走る時間帯でBESTなサイトを使用します
固定しているとサーバーが止まっている時に駄目ですからそういう意味でも
組み込んでおくのがよろしいのでは無いかと思います。
と思ったら混んでいてなのかfastest_cvsupがエラーすることが時々・・・
ということでシェルを少し改良
#!/bin/sh
export PATH=$PATH:/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin
SITE=$(fastest_cvsup -c jp | grep 1st | awk '{print $3}')
case $SITE in
        cvsup*)
                echo $SITE
                cvsup -g /etc/ports-supfile -h $SITE > NULL
                ;;
        *)
                echo "fastest_cvsup error"
                cvsup -g /etc/ports-supfile > NULL
                ;;
esac
portsdb -Uu > NULL
portversion -v | grep need
これでfastest_cvsupがエラーした時にはオリジナルの設定したサイトを使用することにしました。