2009年2月2日月曜日

FreeBSD:portupgradeにはまる

今日も前回と似たようなネタ。FreeBSDでサーバーを立ち上げようとしてる。マシンが遅いから,なかなかソフトウェアのインストールが終わらない...ぶつぶつ。
 ところで,今日の話題はportupgrade。私にFreeBSDを教えてくれたやつは,基本はdefaultと言って,option設定もあまり追加しないし,portupgradeもあまりしない。何故って,下手にportupgradeするとアプリケーションがよく動かなくなることがあるから。でも私はセキュリティのこともあるし,と思って毎回upgradeしてしまう。で,よくトラブルに巻き込まれる。今回は今までの経験をメモしておこう。

(1) portupgrade -aの時のオプション指定。
 これって結構面倒。久々のupgradeだと,かなりの数のアプリケーションがupgradeされるから,選ばないといけないオプションも多数。たまに見て,オプション選択画面になってたら作業する,ってしてると,upgradeで数日かかってしまうこともある。そんな時には,
  > export BATCH=yes
が便利。でもこれはbashやzshの場合。cshやtcshなら
  > setenv BATCH yes
でいけるはず。要は環境変数として,BATCHをyesに設定しておく。すると,オプション選択画面の時に,単純にyesを押したのと同じことで,さっさと作業してくれる。でも時々オプションをちゃんと指定しないといけないこともあるから,気をつけてくださいな。

(2) perlのバージョンアップした場合。
 これはどういう事かというと,アプリケーションはいろいろなモジュールなどを組み合わせてできている。で,portsからインストールすると,他にどのアプリケーションを入れないといけないか,という依存関係を調べてインストールしてくれる。大きなアプリケーションだと,他のアプリケーションを利用することはあっても,利用されることは少ない。しかし基本的なアプリケーションだと多くのところで利用されている。その代表格がperl。これはそこら中で使われている。そのperlが時々upgradeの対象になる。つい最近perl 5.8.8がperl 5.8.9にあがった。それ自体は大したことないが,問題は他のアプリケーション。働かなくなるアプリが出てくることがある。何故か?それはperlに追加されるmoduleの保存場所が問題。perlに追加されるmoduleは,/usr/local/lib/perl5/の下に追加される。/usr/local/lib/perl5/5.8.8や/usr/local/lib/perl5/site_perl/5.8.8などの下に入っている。問題はディレクトリ名にバージョン番号が入っている点。バージョン番号が付いてるということは,perlがバージョンアップされると,必然的に今までのmoduleは使えなくなる。バージョンアップがportupgradeで行われても結果は同じ。折角のportupgradeなんだから,依存関係を調べて処理してくれればいいのに,まだそうなってないportsが多い。で,portupgradeすると動かなくなる,という現象に出くわす。
 その場合の解決策は,make deinstallとmake reinstall。portupgrade xxxxとアプリケーションを指定してupgradeさせると,perlのモジュールでうまく行かない時は,大抵,そのモジュールが利用しているほかのモジュールを名指して,エラーがあるぞ,xxxxxxのmoduleが既にインストールされてて,新しくインストールできないから,made deinstallとmake reinstallして,入れなおせ,みたいなメッセージが英語で出てくる。
 そこで,問題となっているモジュールのportsに行って(エラーメッセージに /database/p5-DBIxxxx などとports情報があるので,そこに行って),make deinstall と make reinstallすればよい。場合によっては,さらに別のモジュールを入れなおさないといけない,ってことになる(結構よくなる)。でも大抵はそれでうまく働く。
-------------------------------------------------------------------------------
(追記)ネットで探したら、perl-after-upgrade というコマンドがあるらしい。perlをアップデートしたら、この perl-after-upgrade でチェックするらしい。詳しくは perl-after-upgrade で検索するか、man でマニュアルを見てみて。
-------------------------------------------------------------------------------

(3) 変なエラーでだめだった。
 今回,はじめて変なエラーに遭遇した。ちゃんとしたエラーメッセージを残すの忘れてたが,gnulsをportsから入れようと思ったら,gccのファイルのstat....って変数の値がおかしい,みたいなメッセージが出てインストールできなかった。make install cleanを何度したことか!あきらめてls -Gにしてみたが,今まで慣れ親しんできたgnulsが使えないのは嫌だった。なんだかんだしてる時に,ふと最近portinstallという命令があることを知った。そこでportinstall gnulsとしてみたら,何故かインストールできた。何故だろう?うーん,よくわからんけど,うまく行ったからいいや。

(4) portsがなくなる。
 時々portsから情報が消えることがある。それは古いportsとか,他のカテゴリーに移ったから。そういうのでpkg_deleteすればいいのかなぁ?結構いっぱいカスみたいに残ってるねんけど...

0 件のコメント: