外部メディアを一切使わずに i386 からamd64 へ2007年06月03日 11時56分47秒

少々、手の込んだ小細工が必要だが、CD 等の外部メディアや、ディアルブートなどの複数のシステムが無くても、i386 から amd64 に上げる方法を仕立てあげた。

それでも、一時的に別のシステムを入れるので、ある意味ズルをしているのかも知れない。

この方法を要約すると以下のようになる。まず、本鑑のシステムで i386 と amd64 のビルドを終わらせておく。それから、md64 をインストールする為の踏台にする、i386 を別の場所にインストールする。一時的な i386 システムを起動して、DESTDIR を用いて、本鑑のシステムを i386 から amd64 に移行する。

まず、そのためには一つ余分なパーティションが必要になる。全く使っていないパーティションがあればそれでもいい。一パーティションしか無いという人も光明が無いわけでもない。特に大きい必要もないので、スワップパーティションを一時的に使えばいい。残念ながら、mdconfig などで代換することは出来ない。

第一ディスクの第一スライスを使っていると仮定する。つまり ad0s1 だ。


# swapoff /dev/ad0s1b
# newfs -U /dev/ad0s1b
# mount -onoatime /dev/ad0s1b /mnt/tmp

ここで、make buildworld TARGET_ARCH=amd64 で終わらせておく。今回は第一ローダの部分を簡単にこなす為の方法なので、i386 の buildworld と buildkernel が必要になる。TARGET_ARCH=amd64 の物を使うときは、第一ブートローダで、ad(0,1,b) などとして、ブートしないと無理だと思う。加えて、二度目の install{world,kernel} の時に、/usr/obj の使われ方がi386 で実行するときと、amd64 で実行するときで、微妙に違うので、ad0s1b に amd64 版を入れるときは、更に注意が必要になる。


# vi /etc/fstab
/dev/ad0s1b             /               ufs     rw              0       0
#/dev/ad0s1b             none            swap    sw              0       0
#/dev/ad0s1a             /               ufs     rw              1       1
#/dev/ad0s1d             /usr            ufs     rw,noatime      2       2

fstab を編集し、ad0s1b から起動するように変える。


# cd /usr/src
# make installkernel installworld DESTDIR=/mnt/tmp
# cd /
# tar cf - /etc | tar xf - -C /mnt/tmp
# df /mnt/tmp
Filesystem  1K-blocks   Used  Avail Capacity  Mounted on
/dev/ad0s1b   1012974 171700 760238    18%    /mnt/tmp

/mnt/tmp にインストールし、/etc 以下をコピーする。installworld では入らないためだ。200MB 以下なので、amd64 が載っている計算機だったら、そのくらいのスワップ領域は割り当ててあるだろう。

その後、再起動をして、作業を再開する。


# reboot
...
login : root
password :
#
# mount /dev/ad0s1a /mnt/tmp
# mount /dev/ad0s1d /mnt/tmp/usr
# mount_nullfs /mnt/tmp/usr/src /usr/src
# mount_nullfs /mnt/tmp/usr/obj /usr/obj
# cd /usr/src
# make TARGET_ARCH=amd64 DESTDIR=/mnt/tmp install{kernel,world}

普段使っているパーティションをマウントする。/usr/src と /usr/obj が ad0s1b には無いので、nullfs を活用する。あとは、DESTDIR と TARGET_ARCH を指定して、インストール。


# vi /etc/fstab
#/dev/ad0s1b             none            swap    sw              0       0
/dev/ad0s1a             /               ufs     rw              1       1
/dev/ad0s1d             /usr            ufs     rw,noatime      2       2

fstab を元に戻して、再起動する。失敗した時の為に、swap は無効にしたまま、起動できるか試す。


# uname -m
amd64
# uname -p
amd64

特に何の支障もなく amd64 で起動した。buildworld は全て済んでいた。ad0s2b にインストールしてから、ad0s1a から amd64 で起動するまでの所要時間は三十分だった。

FreeBSD 6.1 で試したのだが、amd64 に変えた後に動かなくなっている ports も結構あった。32-bit 互換は有効になっている。実際、startx で XOrg は問題なく起動する。それ以外の物が、かなりの割合で動かなくなっていた。恐らく、FreeBSD 5.x を動かしていた時のライブラリは、COMPAT_IA32 が有効になっていても、作られないのだろう。もし、FreeBSD 5.x が入っていて、4.x からの遺産が無ければ、このような 32-bit 互換の問題は無いかも知れない。

今回の例から言っても、遊び用や実験の為であれば i386 から amd64 に上げるのもいいかも知れない。しかし、実務用に使われている物では避けるべきだろう。

前回次回

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2007/06/03/1552367/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。