月別アーカイブ: 2015年9月

Debian Jessie i386をamd64に無理やり移行させる

i386環境から再インストールをしないでamd64に移行させる作業をやってみました。なんとか実現できたものの、今のところは無理やり感が否めません。実際にやってみた感触を記録しておきます。

背景

Debianはメジャーリリース間のアップグレードが行えることを重要視しているディストリビューションであり、実際自分もbo(1.3)からwheezy(7.x)まで更新し続けているインスタンスを持っています。

しかしながら、当然そのような古くからのシステムはアーキテクチャがi386のままです。amd64が公式にサポートされたのはetch(4.0.x, 2007~)からです。途中でmultiarchという複数のアーキテクチャのパッケージを一つのシステムに導入する仕組みもできましたが、それはi386→amd64への移行に直接利用できるようなものではありません。

手法

i386→amd64化を試みた人はこれまでにもあり、いくつかはネット上の私的なドキュメントとして残されています。今回はDebian Wikiに書かれている方法をとってみました。

作業の流れ

大まかに実施する作業の流れを以下に示します。

  • amd64 kernelパッケージのインストール
    • i386アーキテクチャでもlinux-image-*-amd64パッケージがあり、kernelだけ64bit化することはできる
  • debootstrapで/chroot64 以下にamd64の最小環境を構築
    • あとで必要になるパッケージ群を追加で入れる(libc6-i386 file bzip2 openssh-client lftp)
  • Live CD/USB等を使って起動し、/chroot64以下の実行ファイルを/にコピー
    • /chroot64/etc/ld.so.cache も忘れずコピーする
    • /chroo64/lib64は/lib64にコピーを行う
      • Wikiではsymlinkを張る、と記述されているがコピーでないと正常に動作しなかった
      • 動作するかどうかは実際にchroot /chroot64 /bin/sh 等を実行してみれば判断できる
  • amd64 kernelでブートする
    • この段階でパニックを起こした場合、/lib64等が適切に処理されておらずdll不足でinitが実行できなかった可能性が高い
  • インストールされているパッケージをi386からamd64に入れ替える
    • apt-get updateを実行
    • 依存関係と戦いながらi386パッケージをamd64に置き換える
      • インストールパッケージ数が多いほどここの作業は大変
      • 何かあったら以下の手段を試す
        • dpkg –remove –force-all [パッケージ名]:i386; apt-get install [パッケージ名]
        • apt-get -f install
        • cd /var/cache/apt/archives; dpkg -i –force-all [パッケージ名]*.deb ; apt-get -f install

簡単な解説

やっていることは、最低限のバイナリをamd64に置き換えて、あとはapt/dpkgに任せてパッケージを入れ替えます。dpkgがamd64 binaryに変わった時点でシステムの認識はi386からamd64に変わります。しかしaptのDBはi386のままなので、まず一度apt-get updateを行う必要があります。

i386なバイナリもdllさえそろっていれば動作します(/chroot64にlibc6-i386を入れるのはこのため)。再起動した時点で一応システム全体は動くようです。

しかしi386が混在しているのでパッケージの衝突は発生します。dpkg –force-allとapt-get -f installを駆使してなんとか乗り切りましょう。

個人的なハマリポイント

ネットワークの設定はnetwork-manager任せにしていたので、ssh越しに作業をしていたらnetwork-managerの更新がかかったタイミングで通信できなくなり、コンソールからの作業を余儀なくされました。GNU screen/tmuxを活用すべきだったと反省しています。