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を活用すべきだったと反省しています。