Gentoo x86からx86_64に移行しました

無職の人間は暇をもてあますものだと思いますが、そんな暇を使って、前々からやりたかったGentoo x86_64 (amd64とどっちが正確な呼び名なのでしょう?)の導入をやってみました。

導入先のマシンは、2年以上Gentoo x86一筋で稼動しているマシンで、簡単なスペックは以下の通り。

  • Core-i7 870 @ 2.93GHz
  • 4GB RAM
  • Intel SSD 80GB + WDの2TB HDD
  • GTS 430 1GB

確かこんな具合でした。自作したやつなのですが、安定稼動すぎて中身を開けないので細かいところを覚えてません。

さて、今回32bit→64bitに向けて色々調べると、「32bitから64bitへのアップグレード方法は、クリーンインストールのみ」という手段しかありません。まぁそりゃそうだろうとは思いますが、心境としてはよくわかります。
調べる内に、「32bitの環境をそのままに、別のパーティションに64bitをインストールして、そっちを起動させればいい」ということをしている方がいましたので、それを実際にやってみました、ということです。

その前に、導入前のマシンにおけるパーティションの分け方と、fstabがどんな感じになっていたかですが、

ファイルシステムはすべてext4です。という感じで、起動自体はHDD内のbootパーティションに格納されたカーネルからやってますが、ルートディレクトリをSSDにすることで、システム部分がSSDになるようにしています。

では実際にやっていった手順を書いていきます、といっても、基本的にはGentoo Handbookに従ってやるだけです。なので、以下では固有の部分だけ書いていきます。

パーティションの分割

一番手間取ったのはここです。前述の通り、SSDは一つのパーティションしかなく、その上ext4です。パーティションの縮小とかで調べると、partedを使えばよい、と書いている場合がほとんどなんですが、partedはどうもext4には(まだ?)対応していないようで、helpをやってもresizeが出てきてくれません。
こればっかりはどうしようもないので、今のSSDをまるごとバックアップして、パーティションを再度切り直して、バックアップした中身をコピーする、という原始的な手順でやることにしました。

# dd if=/dev/sdb -of=/mnt/gentoo.backup/backup/sdb.bak
# parted /dev/sdb    # パーティションを削除して、40GBのパーティションを二つ作る
# mkdir /mnt/sdb
# mount -o loop,offset=0 /mnt/gentoo.backup/backup/sdb.bak /mnt/sdb
# mount /dev/sdb1 /mnt/gentoo
# cp -r /mnt/sdb /mnt/gentoo

dd、cp -r で結構な時間がかかりました。もうちょっといい手段が無いものかとは思いましたが・・・。まぁ、とりあえずこれで元の環境と、64bit環境をインストールするための領域を作れました。後は、このパーティションをベースにしてHandbook通りにインストールしていきます。
32bitの環境をそのまま参照できるので、カーネルの.config、make.confなどをコピーしてきてやれば、非常に手っ取り早いかと思います。

ただし、grubはインストールする必要はありません。すでに/boot領域として使っているHDDにはgrubがインストールされていますので。ですので、ただコンパイルしたカーネルを/bootに放りこんで、/boot/grub/grub.confを書き換えるだけでいいです。
ちなみに私のgrub.confはこんな感じになっています。

# This is a sample grub.conf for use with Genkernel, per the Gentoo handbook
# http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?part=1&chap=10#doc_chap2
# If you are not using Genkernel and you need help creating this file, you
# should consult the handbook. Alternatively, consult the grub.conf.sample that
# is included with the Grub documentation.

default 0
timeout 30
splashimage=(hd0,0)/boot/grub/splash.xpm.gz

title Gentoo Linux 3.6.6
root (hd0,0)
kernel /boot/kernel-3.6.6 root=/dev/sdb1 real_root=/dev/sdb1

title Gentoo Linux 3.6.6_64
root (hd0,0)
kernel /boot/kernel-3.6.6_64 root=/dev/sdb2 real_root=/dev/sdb2

title Gentoo Linux 3.3.1
root (hd0,0)
kernel /boot/kernel-3.3.1 root=/dev/sdb1 real_root=/dev/sdb1

#initrd /boot/initramfs-genkernel-x86-2.6.24-gentoo-r5

# vim:ft=conf:

32bitと64bitで、root指定が違うのがミソです。3.3.1は3.6.6を入れた時に、万が一動かなかった場合の保険として残してあるやつですので気になさらず。

ここまできたら後は再起動して、必要なパッケージとかを入れていったり、ユーザを作成したりするのですが、ここで一点だけ要注意な点がありまして、作成するユーザは、/homeにすでにいるユーザと同じuid,gidにするようにしてください。じゃないと色々と泣きを見ます、多分。
入れるパッケージは、前の環境の/var/lib/portage/worldと今の環境のworldとの差分を取りつつ、前の環境で使っていたpackage.keywordやpackage.useをコピーしてくれば、ほとんど前の環境と変わらない環境ができあがると思います。私はGnomeとかKDEじゃなくてawesomeなので、Xを入れるのが一番時間かかりましたが、GnomeとかKDEの人はまる一日を覚悟した方がいいかもしれません。
・・・あ、chromiumをバイナリじゃないパッケージから入れてる人は、いつもの通り長い時間待つことになります(自分含む)。

やってみて

で、この記事は64bitに移行した後で書いているわけですが、基本的な使用感覚はまったく変わりありません。ただ、やっぱり問題は出ていて、「Skypeが動かない」というのが一番の問題です。検索してみると、どうもLDPATHの問題があるみたいですが、去年の8月時点で報告されていて、修正はされているように書かれているのですが、色々書かれている方法ではまったく歯が立ちませんでした。
ところが、ふと/etc/ld.so.conf.d/05gcc-x86_64-pc-linux-gnu.confを覗いたら、

/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.4

とだけ書かれていました。そこで、これを

/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.4
/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.4/32

こんな風にして、env-updateをかましたら、ldconfig -pに、libstdc++.so.6の32bit版が出てくるじゃありませんか。ということでこれについても解決しています。
ちなみにfirefoxとかflashとかは、最初っから何の問題も無く動いています。素敵です。

私の環境は少し変わっているものですが、逆に64bit移行時には、もし駄目だった場合でも、32bitの環境にいつでも戻れる、というのは安心感が違います。まぁ、メモリが4Gのままなので、別段速くなったとかは実感できません。メモリを買う金があれば・・・。