USBでブートしてネットワークインストールという簡単なお仕事ができなかった私

顛末というかメモはこちら→Intel Atom... - Kazutaka Ogaki - FriendFeed。今時のコンパクトなマザーボード(miniITXとかいうらしい)はパラレルなATA(IDE)なんかついてないので、CD(DVD)ドライブが使えないんですね。
以下、USBデバイスのフォーマットの確認の事項以外はごくごく当たり前のことしか書いてません。かつ、あくまで自分用のメモなので、抜けもあるかと思いますんで念の為。
結論から言うと、以下のようなプロセスならば、何処の馬の骨ともわからないUSBメモリを使ったとしても失敗は少ないのではないかと思います。

prerequisite

  • CentOS 5.4がインストールの対象
  • 作業用にLinuxのマシンがある。VMware(Vsphere4.0とか)で仮想化されている場合には、USBデバイスが接続できないかもしれないので(Xen Server5.0やRedhat系OS(CentOS等)付属のxen3ではどうかは試していない)、物理サーバであれば安心
  • USBメモリのサイズは十分に大きい(自分の場合は2GB)

手順

以下、断りがなければroot権限で作業

利用するUSBメモリがどのようなフォーマットであるか確認する

大抵はUSBメモリは/dev/sdc とかいうデバイス名に割り振られるので、確認してみる

# fdisk -lu /dev/sdc

Disk /dev/sdc: 1999 MB, 1999568384 bytes
62 heads, 62 sectors/track, 1015 cylinders, total 3905407 sectors
Units = セクタ数 of 1 * 512 = 512 bytes

This doesn't look like a partition table
Probably you selected the wrong device.

デバイス Boot      Start         End      Blocks   Id  System
/dev/sdc1   ?  3020518592  3021025229      253319   e4  SpeedStor
領域 1 は異なった物理/論理開始位置になっています(Linux では無い?):
     物理=(190, 120, 0) 論理=(785774, 53, 51)
領域 1 は異なった物理/論理終点になっています:
     物理=(544, 125, 44) 論理=(785906, 41, 24)
Partition 1 does not end on cylinder boundary.
/dev/sdc2   ?  1006562073  2994530118   993984023   98  不明
領域 2 は異なった物理/論理開始位置になっています(Linux では無い?):
     物理=(1010, 16, 43) 論理=(261852, 48, 10)
領域 2 は異なった物理/論理終点になっています:
     物理=(205, 205, 22) 論理=(779014, 4, 55)
Partition 2 does not end on cylinder boundary.
:
以下、ずらずらと出てくる
:

これでは気味が悪いかもしれないので、マウントしてみて、/etc/mtabの登録内容を見てみると、vfatというタイプであると認識はされている。

# mkdir /mnt/usb
# mount /dev/sdc /mnt/usb
# mount | grep sdc
/dev/sdc on /mnt/usb type vfat (rw)

上記のfdiskコマンドの結果がごくあっさりしたものだった場合、フォーマットが特殊なものになっている可能性があるので、まずフォーマットからやり直す。
たとえば、VSphere4.0のESXi4のイメージをddコマンドで書き込んだ場合にはこんな風にfdiskの結果が変化する。また、mountもできない(VMware ESXiは独自のファイルシステムVMFSを使っているから、それに対応していないOSではマウントできない。下記/dev/sdc7のあたり)

# fdisk -lu /dev/sdc

Disk /dev/sdc: 1999 MB, 1999568384 bytes
64 heads, 32 sectors/track, 1906 cylinders, total 3905407 sectors
Units = セクタ数 of 1 * 512 = 512 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sdc1            8192     1843199      917504    5  拡張領域
/dev/sdc4   *          32        8191        4080    4  FAT16 <32M
/dev/sdc5            8224      520191      255984    6  FAT16
/dev/sdc6          520224     1032191      255984    6  FAT16
/dev/sdc7         1032224     1257471      112624   fc  VMware VMKCORE
/dev/sdc8         1257504     1843199      292848    6  FAT16
USBメモリのフォーマット

まず、本当にUSBメモリのデバイス名が /dev/sdc とかで正しいのかを確認する。現在マウントされていなければ、まず大丈夫なので、dfコマンドを実行して出てこなければOK

フォーマットは、FAT16, FAT32とかいろいろあるようだが、Linuxの世界ではvfatで指定すれば大丈夫なようだ。何もオプションをつけないと、既存のファイルシステムに上書きできないので、-Iのオプションをつけた。

# mkfs -t vfat -I /dev/sdc
で、必要最小限のものをUSBに焼く

なにがminimumかっていうと、diskboot.imgですかね。これがあれば、ネットワークインストールもCDなどのメディアからのインストールも開始可能。
よく使うrikenさんのところから、持ってきてみました。

# wget http://ftp.riken.jp/Linux/centos/5.4/os/x86_64/images/diskboot.img
# dd if=diskboot.img of=/dev/sdc

通常なら、これだけでUSBのインストールメディアの出来上がり。*1

まったくの余談 diskboot.imgの中身
# mount -o loop diskboot.img /mnt/usb
# ls -l /mnt/usb
合計 9306
-rwxr-xr-x 1 root root     292 101 16:53 boot.msg
-rwxr-xr-x 1 root root     919 101 16:53 general.msg
-rwxr-xr-x 1 root root 7397850 101 16:53 initrd.img
-rwxr-xr-x 1 root root   10648 101 16:53 isolinux.bin
-r-xr-xr-x 1 root root    9660 101 16:53 ldlinux.sys
-rwxr-xr-x 1 root root   94600 101 16:53 memtest
-rwxr-xr-x 1 root root     817 101 16:53 options.msg
-rwxr-xr-x 1 root root     517 101 16:53 param.msg
-rwxr-xr-x 1 root root     490 101 16:53 rescue.msg
-rwxr-xr-x 1 root root   63803 101 16:53 splash.lss
-rwxr-xr-x 1 root root     338 101 16:53 syslinux.cfg
-rwxr-xr-x 1 root root 1932284 101 16:53 vmlinuz

こうなるとinitrd.img(initial RAM Disk image)の中身が見たくなるのは人情ですが、たしかMiracle Linuxのブログかなんかで書いてあったような。*2
こんな記事もLinux 初期 RAM ディスク (initrd) の概要。最近は圧縮されたcpioのアーカイブになってるので、いきなりマウントはできんのですか。そうですか。その代わり単に解凍するだけ。つーことは、上記のファイルのいずれかがcpio相当の機能を持ってるってことですか。isolinux.binかldlinux.sys、vmlinuz(カーネル)だっけ?memtestを実行してみたくもあり、、、
ちなみにsyslinux.cfgの中身。grepしたところでは、このファイルを読むのはldlinux.sys。

default linux
prompt 1
timeout 600
display boot.msg
F1 boot.msg
F2 options.msg
F3 general.msg
F4 param.msg
F5 rescue.msg
label linux
  kernel vmlinuz
  append initrd=initrd.img
label text
  kernel vmlinuz
  append initrd=initrd.img text
label ks
  kernel vmlinuz
  append ks initrd=initrd.img
label memtest86
  kernel memtest
  append -

....仕事しよ。

*1:通常なら、と書いたけれど、通常ならWindowsで操作するわけだから、こうはならないですねw

*2:見つけた。これだ→[http://blog.miraclelinux.com/uraura/2006/06/initrd_b3c8.html:title]。これも面白い記事だった→[http://www.fan.gr.jp/~azure/links/ramlinux.html:title]