先日、FreeBSD 7.1-RELEASEが公開されて、その後、すでにopensslなどのSecurity Advisoryが出ちゃってますが、とりあえず、ML115 G5なFreeBSDマシン(あまり使ってないので、テスト環境という感じ)を、7.1-RELEASEにアップデートしてみました。
FreeBSDを最新バージョンへアップデートする方法としては、お手軽さの順番で並べてみると(独断と偏見の判定基準による)
- freebsd-updateコマンドを使う
- ISOイメージファイルをCDに焼いて、そのCDでブートしてアップグレード・インストールを行う
- cvsup(csup)して、make buildworldなど自分でコンパイルしてアップデートする
といった方法があります。
freebsd-updateコマンドは、個人的になじめないため…あと、ネットワークが混雑して大変なことになっているという情報もあったし…
となると、CDを作ってsysinstallでやるか、ってなるけど、CDを焼くのもめんどくさい。
ということで、ときどき私がやってる、メチャクチャな方法 ~普通の人にはお勧めできません~、それは、
- ISOイメージファイルから、/boot以下のファイルを抜いてきて、現在動作中のFreeBSDの/boot(←ハードディスク上にあるもの)と入れ替え、
- その後、ハードディスクから、新しい/bootでブートして、
- インストーラ(sysinstall)にてアップグレード・インストールする
というもの。失敗したら、FreeBSDが起動しなくなるおそれもあるので、それでお勧めできない、ということです。
以前、ちょこっと、その手順を書いたこともあったりしました。
FreeBSDのアップデート
CDもフロッピーディスクも作らずに、ネットブートもせずPC1台だけで、手軽?に、FreeBSDを最新版にアップデートする方法。
今回その方法を行ってみたところ、あれっ?!キーボードから文字が入力できない、というトラブルがあったので、自分用メモとして、もう一度、書き残しておきます。
☆
アップグレードインストールするまえに
今動いているシステムの/etc以下を、どこか別の場所に(もしあれば別のWindowsパソコンなどへ)、コピーして、アップグレード作業中に見られるようにしておいたほうがいいと思います。
というのは、アップグレードインストール作業中に、/etc/fstabや、/etc/rc.confに書いてある情報が必要になるためです。
具体的に必要になるのは、以下のもの。
- デバイスファイル名(/dev/ad0s1eなど)と、ファイルシステムのマウントポイント(/usrなど)の対応関係。fstabに書いてある。
- ネットワークの設定。たとえばIPアドレスなど。rc.conf中で、ifconfig_bge0などで指定している。
これくらいなら、チラシの裏にメモっておくだけでも十分です。
ISOイメージファイルのダウンロード
たとえば、このへんからダウンロード
ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/7.1
sysinstallでネットワーク経由でインストールするなら、bootonlyと書いてある、ファイルサイズの小さいものでかまいません。
7.1-RELEASE-i386-bootonly.iso をダウンロードしました。
ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/7.1/7.1-RELEASE-i386-bootonly.iso
ネットワーク経由でインストールできない場合は、disc1と書いてあるものを選びます(disc1だけで十分だと思います)。
ISOイメージファイルからファイルを抜き出す
mdconfigとmountを使って、こんな感じ。root権限で行います。
# mdconfig -a -t vnode -f 7.1-RELEASE-i386-bootonly.iso
md0
# mount -o ro -t cd9660 /dev/md0 /mnt
# ls /mnt
boot boot.catalog cdrom.inf
#
状況によっては、mdconfigを実行後、「md0」ではなく「md1」とか、別の数字が表示されることもありますが、そのときは、その表示されたものを、mountコマンドの引数で指定します。
そして、/bootを入れ替える。
# mv /boot /boot-
# cd /mnt
# tar cf - boot | tar xvf - -C /
disc1なISOイメージをダウンロードして、ネットワーク経由のアップグレード・インストールをしない場合は、/boot以外に、/7.1-RELEASE以下のファイルも、現在使っているハードディスクにコピーしておきます。
# ls /mnt/7.1-RELEASE/
base doc kernels proflibs
catpages games manpages src
dict info ports
たくさんディレクトリがありますが、インストールするものだけコピーすればOK。私だったら、base、doc、kernels、games、manpages、dict、infoなどでしょうか。
sysinstallでインストール作業を行うときに、元ファイルをどこからもってくるか指定するところがあります(CDとかFTPとHTTPとか)。その選択肢の中に、既存のファイルシステムから、という指定ができるので、そのときに、コピーした7.1-RELEASEの内容を指定します。
最近やってないのでいい加減な情報ですが、コピー先のディレクトリ名は、FreeBSDにしておけばよかったと思います。
FreeBSDを再起動して、インストーラで起動する
ごく普通に、rebootして、ハードディスクからブートすれば、新しい/bootでブートしてきます。
インストールCDに記録されている/bootでは、loader.confを見るとわかりますが、mfsroot.gzというRAMディスクのイメージファイルを使ってブートできるような設定がされています。このRAMディスクのイメージファイルの中に、FreeBSDのインストーラが入っているわけです。
ちなみに、mfsroot.gzの中をのぞいてみると、こんな感じです。
# cp /boot/mfsroot.gz /var/tmp/
# gunzip /var/tmp/mfsroot.gz
# mdconfig -a -t vnode -f /var/tmp/mfsroot
md1
# mkdir /mnt2
# mount -o ro /dev/md1 /mnt2
# ls -l /mnt2/
total 4
drwxrwxr-x 2 root operator 512 1 2 00:17 .snap
lrwxrwxrwx 1 root wheel 6 1 2 00:17 bin -> /stand
drwxr-xr-x 2 root wheel 512 1 2 00:17 boot
drwxr-xr-x 2 root wheel 512 1 2 00:17 dev
drwxr-xr-x 3 root wheel 512 1 2 00:17 etc
drwxr-xr-x 2 root wheel 512 1 2 00:17 mnt
lrwxrwxrwx 1 root wheel 6 1 2 00:17 sbin -> /stand
drwxr-xr-x 4 root wheel 1024 1 2 00:17 stand
drwxr-xr-x 3 root wheel 512 1 2 00:17 var
さて、これでFreeBSDをブートすれば、インストーラで起動すると思いきや、普通のマルチユーザーモードなFreeBSDが起動しちゃいます。ただし、カーネルは最新のカーネルになっています(/boot/kernel/以下は、さっき置き換えたので。だからハードウェアによっては、起動途中にコケるかも…)。
なぜかっていうと、ルートファイルシステムとしてマウントされるのが、RAMディスク(mfsroot)ではなくて、もともとハードディスクにあったルートパーティション(/dev/ad0s1aなど)になっちゃうからです。たぶん、親切心から、そうやってくれてるんでしょう(?)
ルートファイルシステムをどこにするかは、boot時に指定できます。いつも私が使っている方法としては、boot時に「-a」オプションを指定するものです(これって、大昔のBSD系Unix、SunOSとかNEWS-OSとかでも使えてたような気がする)。
FreeBSDのブート時のメニューで「6. Escape to loader prompt」を選択すると、「OK」というプロンプトが表示されるので、そこで「boot -a」と入力します。
すると、カーネルが起動して、途中で、「Manual root filesystem specification:」と表示され、そこで、どこをrootパーティションとするかを入力できます。
こんな感じ
いつもなら、ここで、「ufs:md0a」と入力します。
ところが、今回、ここで、はまりました。HPのML115 G5で、PS2キーボードを接続して操作していたのですが、ここで、なぜかキーボードからキー入力ができなくなりました。
bootローダのところではキー入力できてましたし、マルチユーザーモードでもキー入力できます。ここでだけキー入力できない???
以前どこかのWebサイトで、ML115 G5では、PS2キーボードは、実はUSBから変換されてPS2になっているので、OSからは(ソフトウェア的には)USBキーボードとして認識されている、みたいな情報を見かけたことがあったのですが、それがこれと関係あるのでしょうか?
PS2キーボードなデバイスatkbd0と、USBキーボードなデバイスukbd0の2つが認識されるのですが、もしかすると、実際には存在しない側のatkbd0を使ってしまっているのかも?
# dmesg | grep kbd
kbd1 at kbdmux0
atkbdc0: <Keyboard controller (i8042)> at port 0x60,0x64 on isa0
atkbd0: <AT Keyboard> irq 1 on atkbdc0
kbd0 at atkbd0
atkbd0: [GIANT-LOCKED]
atkbd0: [ITHREAD]
psm0: <PS/2 Mouse> irq 12 on atkbdc0
ukbd0: <ServerEngines SE USB Device, class 0/0, rev 1.10/0.01, addr 2> on uhub0
kbd2 at ukbd0
う~ん、まいった。いつもだったら「USBキーボード関係のトラブルのときは、とりあえずPS2キーボードをつなげばOK」、だったのに、今回は元々PS2キーボードを使っているわけで、どうしょうもないです。
でも、bootローダ(「OK」プロンプトのとき)で、ルートファイルシステムの場所を指定できるよね、絶対大丈夫だよ! と思い、テキトーにアタリをつけてみると・・・
# grep root /boot/defaults/loader.conf
#root_disk_unit="0" # Force the root disk unit number
#rootdev="disk1s1a" # Set the root filesystem
#boot_askname="" # -a: Prompt the user for the name of the root device
#boot_cdrom="" # -C: Attempt to mount root file system from CD-ROM
#boot_dfltroot="" # -r: Use the statically configured root file system
#init_script="" # Initial script to run by init(8) before chrooting.
#init_chroot="" # Directory for init(8) to chroot into.
#vfs.root.mountfrom="" # Specify root partition in a way the
「vfs.root.mountfrom」が正解でした。
currdevとかrootdevというのがありますが、これは、BIOSレベルでアクセスできるデバイスを指定するものらしく、今回のようにRAMディスク(md0)は指定できないみたいです。
「OK」プロンプトにて、
set vfs.root.mountfrom="ufs:md0a"
と指定して、
boot
とすれば、うまいこと、mfsroot内のインストーラが起動しました。
というわけで、あとは、ごく普通に、sysinstallでUpgrade Installすればよし、と。
その後はとくに問題なく、7.1-RELEASEになりました。
そしたら、/boot/loader.confを、元々使っていたものへ置き換えます。
今は、動作確認もかねて、portupgradeしまくってます。
P.S.
ふと思ったんですが、ブートローダでatkbd0をdisableすれば、boot -aしたときキー入力できるようになるのかも???
試していませんが。
0 件のコメント:
コメントを投稿