2009年1月11日日曜日

(FreBSD, ML115G5) いつもの方法でFreeBSD 7.1-RELEASEにアップデートにしてみたけど… 途中でキー入力できなくなった

先日、FreeBSD 7.1-RELEASEが公開されて、その後、すでにopensslなどのSecurity Advisoryが出ちゃってますが、とりあえず、ML115 G5なFreeBSDマシン(あまり使ってないので、テスト環境という感じ)を、7.1-RELEASEにアップデートしてみました。



FreeBSDを最新バージョンへアップデートする方法としては、お手軽さの順番で並べてみると(独断と偏見の判定基準による)



  1. freebsd-updateコマンドを使う


  2. ISOイメージファイルをCDに焼いて、そのCDでブートしてアップグレード・インストールを行う


  3. cvsup(csup)して、make buildworldなど自分でコンパイルしてアップデートする


といった方法があります。



freebsd-updateコマンドは、個人的になじめないため…あと、ネットワークが混雑して大変なことになっているという情報もあったし…

(FreeBSD) freebsd-updateを初めて使ってみた

となると、CDを作ってsysinstallでやるか、ってなるけど、CDを焼くのもめんどくさい。



ということで、ときどき私がやってる、メチャクチャな方法 ~普通の人にはお勧めできません~、それは、



  • ISOイメージファイルから、/boot以下のファイルを抜いてきて、現在動作中のFreeBSDの/boot(←ハードディスク上にあるもの)と入れ替え、


  • その後、ハードディスクから、新しい/bootでブートして、


  • インストーラ(sysinstall)にてアップグレード・インストールする


というもの。失敗したら、FreeBSDが起動しなくなるおそれもあるので、それでお勧めできない、ということです。



以前、ちょこっと、その手順を書いたこともあったりしました。

FreeBSDのアップデート
CDもフロッピーディスクも作らずに、ネットブートもせずPC1台だけで、手軽?に、FreeBSDを最新版にアップデートする方法。



FreeBSD 7.0-CURRENT-200701にアップグレード・インストールしてみたのですが…

今回その方法を行ってみたところ、あれっ?!キーボードから文字が入力できない、というトラブルがあったので、自分用メモとして、もう一度、書き残しておきます。





アップグレードインストールするまえに



今動いているシステムの/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パーティションとするかを入力できます。



こんな感じ



200901110



いつもなら、ここで、「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内のインストーラが起動しました。



200901111



というわけで、あとは、ごく普通に、sysinstallでUpgrade Installすればよし、と。



その後はとくに問題なく、7.1-RELEASEになりました。



そしたら、/boot/loader.confを、元々使っていたものへ置き換えます。





今は、動作確認もかねて、portupgradeしまくってます。





P.S.



ふと思ったんですが、ブートローダでatkbd0をdisableすれば、boot -aしたときキー入力できるようになるのかも???
試していませんが。







0 件のコメント:

コメントを投稿