FreeBSDのUSBメモリスティックからのブート

FreeBSD 8.2R + Raidz + HP ProLiant Microserverを構築中。

インストールの手順は:

  1. DVDから起動
  2. インストール先にda0を選択(後述)
  3. fdisk内でA(自動)を選んで全部割り当て
  4. 普通のブートマネージャをインストール
  5. disklabelでもAを選んで自動割り当て
  6. インストール元にCD/DVDを選択
  7. ZFSを構成
  8. ちまちま設定

となった。

まずはUSBメモリスティックからのブート時に出た問題を列挙する。Macばかり使うようになって久しいのでPCのUSBブートの条件などまったく把握しておらず、またFreeBSDも浦島太郎すぎで初めてのようなもの。ひどく試行錯誤をして、ようやく少し把握した次第。大きく分けて、

  1. インストール時にfdiskがメモリスティックを認識しない
  2. インストーラが書き込もうとするとデバイスファイルが見つからない
  3. 書き込みそのものができない
  4. インストール後に止まるようになった

である。3はカードリーダーの不良だったが、1,2,4は知らないとうまくいかないことだった。

1. インストール時にfdiskがメモリスティックを認識しない

現象: インストール先メディアを選択する際に、USBメモリのデバイス/dev/da0が出てこない

Alt+F2のコンソールには、メモリスティックを抜き差しするたびに告知が出ているのに、インストーラのドライブ選択画面では:

    ┌───────────── Select Drive(s) ───────────────┐
    │ Please select the drive, or drives, on which you wish to perform    │  
    │ this operation.  If you are attempting to install a boot partition  │  
    │ on a drive other than the first one or have multiple operating      │  
    │ systems on your machine, you will have the option to install a boot │  
    │ manager later.  To select a drive, use the arrow keys to move to it │  
    │ and press [SPACE] or [ENTER].  To de-select it, press it again.     │  
    │                                                                     │  
    │ Use [TAB] to get to the buttons and leave this menu.                │  
    │ ┌──────────────────────────────────┐ │  
    │ │                      [ ] ad10  ad10                           │ │  
    │ │                      [ ] ad4   ad4                            │ │  
    │ │                      [ ] ad6   ad6                            │ │  
    │ │                      [ ] ad8   ad8                            │ │  
    │ └──────────────────────────────────┘ │  
    ├─────────────────────────────────────┤  
    │                       [  OK  ]       Cancel                         │
    │                       [  OK  ]       Cancel                         │  
    └──[ Press F1 for important information regarding disk geometry! ]─┘

といった具合で、HDDしか認識されていなかった。

解法: Optionsの右下にあるRe-scan Devices <*>にカーソルを合わせてSpaceまたはEnterを押す。
速すぎて見えにくいが、何度も押していると「リスキャン中」みたいな表示が出ていた。

Options画面はこんな風で:

 Options Editor

 Name            Value                   Name            Value
 ----            -----                   ----            -----
 NFS Secure      NO                      Browser Exec    /usr/local/bin/links
 NFS Slow        NO                      Media Type      
 NFS TCP         NO                      Media Timeout   300
 NFS version 3   YES                     Package Temp    /var/tmp
 Debugging       NO                      Newfs Args      -b 16384 -f 2048
 No Warnings     NO                      Fixit Console   serial
 Yes to All      NO                      Re-scan Devices <*>
 DHCP            NO                      Use Defaults    [RESET!]
 IPv6            NO
 FTP username    ftp
 Editor          vi
 Extract Detail  high
 Release Name    8.2-RELEASE
 Install Root    /
 Browser package links

 Use SPACE to select/toggle an option, arrow keys to move,
 ? or F1 for more help.  When you're done, type Q to Quit.

 Re-run sysinstall's initial device probe

ここでリスキャンしたあとでドライブ選択画面に戻ると、ちゃんと認識されていた。

    ┌───────────── Select Drive(s) ───────────────┐
    │ Please select the drive, or drives, on which you wish to perform    │  
    │ this operation.  If you are attempting to install a boot partition  │  
    │ on a drive other than the first one or have multiple operating      │  
    │ systems on your machine, you will have the option to install a boot │  
    │ manager later.  To select a drive, use the arrow keys to move to it │  
    │ and press [SPACE] or [ENTER].  To de-select it, press it again.     │  
    │                                                                     │  
    │ Use [TAB] to get to the buttons and leave this menu.                │  
    │ ┌──────────────────────────────────┐ │  
    │ │                      [ ] ad10  ad10                           │ │  
    │ │                      [ ] ad4   ad4                            │ │  
    │ │                      [ ] ad6   ad6                            │ │  
    │ │                      [ ] ad8   ad8                            │ │  
    │ └──────────────────────────────────┘ │  
    ├─────────────────────────────────────┤  
    │                       [  OK  ]       Cancel                         │
    │                       [  OK  ]       Cancel                         │  
    └──[ Press F1 for important information regarding disk geometry! ]─┘    

参考: http://pub.ne.jp/double_star/?entry_id=3080830

2. インストーラが書き込もうとするとデバイスファイルが見つからない

現象: インストールをコミットしようとすると

Unable to find device node for /dev/da0 in /dev

(次画面)

The creation of filesystems will be aborted

と出る。

解法: パーティションテーブルが壊れているので修復する。

これはわかりにくかったが、MBRが壊れると起きる現象みたい。なぜこんなことが起きたかというと、microSDにmemstick.imgを書き込んだ際に、Macで以下のようなコマンドを叩いたためだ:

dd if=FreeBSD-8.1-STABLE-201008-i386-memstick.img of=/dev/disk1 bs=10240

これが悪かった。disk1(2番目のハードディスク。この場合はUSBメモリスティック。デバイスファイル名を知るには、USBメモリスティックを抜き差ししながらls -ltr | tailするとよい)の先頭から書いたら壊れた。たぶんof=/dev/disk1s1を指定すれば大丈夫だった。

修復は、MacのDisk Utility.appでFATのパーティションを切ることで行った。ふたたびメモリスティックとして普通に認識されるようになり(memstick.imgを書き込んだ状態だとMacから認識されなくなる)、FreeBSDインストーラからデバイスノードが見えないということもなくなった。

MBRにゼロを書き込む手もあるらしい。

dd if=/dev/zero of=/dev/ad0 bs=512 count=64

この場合はFreeBSDMBRを書き直してくれるのだろう。

3. 書き込みそのものができない

現象: めでたくデバイスノードが見えるようになったのに、

Unable to write data to disk da0

と出てきた。

これはSDカードリーダが中途半端に不良品で、しっかり差し込むとうまく書き込めなかったり、突然認識されなくなったりするというものだった。他のカードリーダを持ってきたら何のも問題もなく進行した。
ようやくインストール成功!

4. インストール後に止まるようになった

現象: インストール後に再起動するとUSBメモリスティックのルートファイルシステムをマウントしてくれない。

これはUSBブート周りのトラブルとして有名なものらしい。カーネルのブートに軽くディレイをかけてやることでうまくいくとのこと。

解法: /boot/boot.conf に

kern.cam.boot_delay=10000

を書く。最初はboot.confをいじれないので、ブートメニューで6.を選んでプロンプトに落ち、

set kern.cam.boot_delay=10000
boot

でうまくいく。

参考: かけまわる子犬。: FreeBSD RELENG_8 で USB 機器からブートする。

その他

  • まともにfdiskなパーティションテーブルがあれば、どのソケットに挿してもブートする

USBブートは条件が厳しい世界だと思っていたのだが、実はわりと自由だった。写真の読み込みなどに使っている多機能で大型のカードリーダからでも普通にブートしてくれるなど、とても楽しい機能である。ただ、常時ここからブートしていると起動中に引っこ抜きそうなので、早めに新しい小型リーダを買わねばならぬ。

つづく。