2005年06月14日

アップグレードトラブルをできるだけ避けるには

Woody→Sarge更新で、辻田さんが大いにハマっていたようだ。

アップグレードテストも行われたとはいえ、サンプル数がだいぶ足りないし、そもそもこれだけ大規模なパッケージ群の中から千差万別にチョイスされた実働環境からの移行をスムーズに行かせるというのはなかなか難しい。

さて、この失敗ケースを基にどうベターなアップグレード方法があるかを考えてみる。ちょっとinstallation-manualからは逸脱しているところもあり。

  • apt-get -d dist-upgradeでまずダウンロードしておく。ネットワークからダウンロードするようにしており、かつディスクに余裕があるときには「ダウンロードしてから」アップグレード作業をしたほうが安心かと思います。ちなみに、PCMCIAカード+NFSでfile://でダウンロードするようにしている場合、pcmcia-csの更新でネットワークが切れてインストールがそこでコケる、ということがあるので、最初にcopy://にしておいてpcmcia-csをダウンロードしておくという手がありますね。
  • いきなりdist-upgradeをかけない。実働環境のアップグレードの場合、いきなりdist-upgradeだと、もし途中でエラーが出たときに一体何が起きたのかわからないまま大量のゴミメッセージに埋もれてしまうことになります。apt-get -s dist-upgradeをリダイレクトして何が更新されるのかをファイルに記録しておき、これを見ながら「これが基幹そうだな」と思うものをapt-get installで手動で1つずつ更新します。たとえばssh、bind、MTAあたり。その他、要求サービスに応じて。libcはどうせほかのものに紐付けられて入るので、あえて明示してインストールする必要はないでしょう。止まってると困るというものが全部片付いたら、あとはdist-upgrade。
  • apt-get -fやdpkg --configure -aを駆使する。パッケージ間でファイルが移動するなどした場合、conflictして更新できない、と言われることがあります(本来はうまく解決できるようにしてるはずなのですが、順番をうまくaptが解析できないとこうなっちゃう)。でそこで作業が止まってしまうと。このとき半インストール状態のものが多数あるので、dpkg --configure -aでそれを済ませます(依存問題で2回くらい実行しないとだめなこともある)。apt-get -f installで依存を満たす作業も必要かもしれません。ひとまず保留のものが0になったら、再度dist-upgradeを実行します。
  • 作業記録を残す。上記のアップグレードを施す前に、apt-listchangesパッケージを入れるとよいでしょう。dpkg-reconfigureでNEWSとchangelogの両方をメールするようにしたほうがいいかと思います。アップグレードの作業の前にはscriptを実行し、ファイルに手順を記録します(ディスクフルになって別の問題が起きないように、余裕のある場所で)。リモートでの作業の場合には途中でSSHが不意に切れた、ということも考えてscreenも併用したほうがよいです(install-manualにもあるようにtelnet、rshは処理途中で切断される可能性が高いので使ってはだめ)。