debian i386/amd64 Lenny/Squeeze USB起動インストーラ

■ネットブックのWindowsの調子が悪くなってきたので、
 いつでもdebianをインストールする環境を整えたい。


■multi-arch版(i386/amd64)のUSB起動のdebianを作成する。

debian lenny amd64版のシステムからネットブックで使えるUSB起動ディスクを作成します。

USB起動ディスク:microSD 16GB(microSDアダプタでSD起動でもOK)
アーキテクチャ  :i386/amd64

■pxebootでもいいんじゃない?

毎回クライアント側のMACアドレスを登録したり、
各アーキテクチャ用のインストールイメージを毎回展開したりの設定が不要。

LANに参加出来ない場合でもUSB起動なら出来ます。
無線LANが自動認識しない場合でも後でのんびり設定出来ます。
最近のBIOSのほとんどがUSB起動にも対応してます。

ちなみにBIOS側でUSB起動に対応していなくても、FD/CD起動で
grubが起動して、USBディスクを認識出来るならば、
パスを指定して起動出来るます。

■BIOS操作画面の起動とブートデバイスの設定(by ゆうゆう様)

http://wizardyuuyuu.shikisokuzekuu.net/bootdisc/bios.htm

BIOSはOSに関係無く触りますよね。

■流れ。

過去の私のページです。
http://www.labunix.net/usb-vmknoppix/index.html

■それでははじめましょう。

 16GBも(?)あるので、Lenny版とSqueeze版で、
 ターゲットはi386とamd64ですので、対象のISOをダウンロードします。
 
 Lenny ISO-CDイメージ(amd64/i386/powerPC)(alpha/hppa/ia64)
 http://cdimage.debian.org/cdimage/archive/5.0.8/multi-arch/iso-cd/

 squeeze ISO-CDイメージ(amd64/i386)
 http://cdimage.debian.org/debian-cd/current/multi-arch/iso-cd/

■まずはUSBディスクがシステムに認識されているかを確認します。
 16039MB⇒16GBとして認識されています。

$ dmesg | grep sdb
[ 3948.283951] sd 2:0:0:0: [sdb] 31326208 512-byte hardware sectors (16039 MB)
[ 3948.285830] sd 2:0:0:0: [sdb] Write Protect is off
[ 3948.285833] sd 2:0:0:0: [sdb] Mode Sense: 4b 00 00 08
[ 3948.285835] sd 2:0:0:0: [sdb] Assuming drive cache: write through
[ 3948.293957] sd 2:0:0:0: [sdb] 31326208 512-byte hardware sectors (16039 MB)
[ 3948.296832] sd 2:0:0:0: [sdb] Write Protect is off
[ 3948.296834] sd 2:0:0:0: [sdb] Mode Sense: 4b 00 00 08
[ 3948.296836] sd 2:0:0:0: [sdb] Assuming drive cache: write through
[ 3948.296840] sdb: sdb1
[ 3948.299177] sd 2:0:0:0: [sdb] Attached SCSI removable disk

■パーティションを確認します。
 以下は16GBx2枚で1つのDebianとして使うようにしていたディスクなので、
 はじめからLinux用になってます。
 認識しているディスクがmicroSDかどうかだけ確認出来ればよいので、ここは軽く流します。

$ sudo fdisk -l /dev/sdb

Disk /dev/sdb: 16.0 GB, 16039018496 bytes
255 heads, 63 sectors/track, 1949 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x0005815d

Device Boot Start End Blocks Id System
/dev/sdb1 * 1 1950 15659008 83 Linux

■Windowsでも修正できるように起動パーティションを切ります。
 他はLinux専用にします。
 
/dev/sda1 -> 128MB(FAT16)
/dev/sda2 -> 500MB
/dev/sda3 -> 500MB
/dev/sda4 -> 残り全部

※USBでISOという特殊な環境の為、LVMやジャーナリングは使いませんし、swapも作りません。
 どうしてもswapしたい時は、ファイルで対応します。

 (パーテーション操作)FDISKの使い方(Linux 活用日記)
 http://saminnet.dip.jp/servercomputer/Lmemo/opt/fdisk.html

# fdisk -l /dev/sdb

Disk /dev/sdb: 16.0 GB, 16039018496 bytes
255 heads, 63 sectors/track, 1949 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x0005815d

Device Boot Start End Blocks Id System
/dev/sdb1 1 17 136521 6 FAT16
/dev/sdb2 18 79 498015 83 Linux
/dev/sdb3 80 141 498015 83 Linux
/dev/sdb4 142 1949 14522760 83 Linux


■debianはデフォルトでは、VFATをフォーマットできません。

$ whereis mkfs | for list in `xargs`;do echo "$list" ;done | column
mkfs: /sbin/mkfs.ext3
/sbin/mkfs.cramfs /sbin/mkfs.bfs
/sbin/mkfs.minix /sbin/mkfs
/sbin/mkfs.ext4 /sbin/mkfs.ext2
/sbin/mkfs.ext4dev /usr/share/man/man8/mkfs.8.gz

■これで、msdosとvfatが使えます。

$ sudo apt-get install dosfstools

$ whereis mkfs | for list in `xargs`;do echo "$list";done | column -c 80
mkfs: /sbin/mkfs.ext3
/sbin/mkfs.cramfs /sbin/mkfs.bfs
/sbin/mkfs.minix /sbin/mkfs
/sbin/mkfs.ext4 /sbin/mkfs.msdos
/sbin/mkfs.vfat /sbin/mkfs.ext2
/sbin/mkfs.ext4dev /usr/share/man/man8/mkfs.8.gz

■フォーマットします。

$ sudo mkfs.vfat /dev/sdb1
mkfs.vfat 3.0.1 (23 Nov 2008)

$ for num in 2 3 4;do sudo mkfs.ext2 /dev/sdb${num};done

■パーティションをチェックします。

$ sudo fsck.vfat /dev/sdb1
dosfsck 3.0.1, 23 Nov 2008, FAT32, LFN
/dev/sdb1: 0 files, 0/34092 clusters

$ for num in 2 3 4;do sudo fsck.ext2 /dev/sdb${num};done
e2fsck 1.41.3 (12-Oct-2008)
/dev/sdb2: clean, 11/124928 files, 18084/498012 blocks
e2fsck 1.41.3 (12-Oct-2008)
/dev/sdb3: clean, 11/124928 files, 18084/498012 blocks
e2fsck 1.41.3 (12-Oct-2008)
/dev/sdb4: clean, 11/909312 files, 65940/3630690 blocks


■07までのloopデバイスがあって、まだどれもマウントされていないことを確認します。

$ ls /dev/loop*
/dev/loop0 /dev/loop2 /dev/loop4 /dev/loop6
/dev/loop1 /dev/loop3 /dev/loop5 /dev/loop7

$ mount | grep loop

■loopデバイスの小さい方から順にマウントします。

$ mkdir squeeze;mkdir lenny_alpha;mkdir lenny_amd64
$ test -d squeeze;echo $?;test -d lenny_alpha;echo $?;test -d lenny_amd64;echo $?
$ sudo mount -o loop=/dev/loop0 debian-6.0.2.1-amd64-i386-netinst.iso squeeze/
$ sudo mount -o loop=/dev/loop1 debian-508-amd64-i386-powerpc-netinst.iso lenny_amd64/

■microSDのvfatパーティションをマウントします。これが起動パーティションになります。

$ test -d /media/sdb1 && sudo mount /dev/sdb1 /media/sdb1
$ mount | grep sdb1
/dev/sdb1 on /media/sdb1 type vfat (rw)

$ sudo mkdir -p /media/sdb1/boot/squeeze_i386
$ sudo mkdir -p /media/sdb1/boot/squeeze_amd64
$ sudo mkdir /media/sdb1/boot/lenny_i386
$ sudo mkdir -p /media/sdb1/boot/lenny_amd64

■Lennyのi386/amd64用の起動イメージを確認します。
 PowerPC/PowerPC64は使いません。386/amd以下のgtkも使いません。

$ ls lenny_amd64/install*
lenny_amd64/install:
boot.msg ofboot.b pegasos powerpc powerpc64 yaboot yaboot.conf

lenny_amd64/install.386:
gtk initrd.gz vmlinuz

lenny_amd64/install.amd:
gtk initrd.gz vmlinuz

■squeezeののi386/amd64用の起動イメージを確認します。
 386/amd以下のinstall.batは使いません。gtkも使いません。

$ ls squeeze/install.*
squeeze/install.386:
gtk initrd.gz install.bat vmlinuz xen

squeeze/install.amd:
gtk initrd.gz install.bat vmlinuz xen

※ちなみにinstall.batはWindowsからloadlin.exeを使ってインストールするためのものです。

$ cat squeeze/install.*/install.bat
\tools\loadlin.exe vmlinuz initrd=initrd.gz
\tools\loadlin.exe vmlinuz initrd=initrd.gz

■i386/amd64用の起動イメージをコピーします。

$ sudo cp -pi lenny_amd64/install.386/[iv]* /media/sdb1/boot/lenny_i386/
$ sudo cp -pi lenny_amd64/install.amd/[iv]* /media/sdb1/boot/lenny_amd64/
$ ls squeeze/install.386/[iv]* | grep -v bat | sudo cp -pi `xargs` /media/sdb1/boot/squeeze_i386/
$ ls squeeze/install.amd/[iv]* | grep -v bat | sudo cp -pi `xargs` /media/sdb1/boot/squeeze_amd64/

■きちんとコピーされたか確認します。

$ for list in /media/sdb1/boot/*;do echo "$list";strings ${list}/vmlinuz | grep "Debian";done
/media/sdb1/boot/lenny_amd64
2.6.26-2-amd64 (unknown@Debian) #1 SMP Sun Nov 21 09:17:22 UTC 2010
/media/sdb1/boot/lenny_i386
2.6.26-2-486 (unknown@Debian) #1 Sat Nov 20 22:54:50 UTC 2010
/media/sdb1/boot/squeeze_amd64
2.6.32-5-amd64 (unknown@Debian) #1 SMP Tue Jun 14 09:42:28 UTC 2011
/media/sdb1/boot/squeeze_i386
2.6.32-5-486 (unknown@Debian) #1 Sat Jun 11 19:49:29 UTC 2011

■grubをインストールします。

$ sudo mkdir /media/sdb1/boot/grub

$ sudo mount -o remount,dev,rw /dev/sdb1 /media/sdb1; \
sudo grub-install --root-directory=/media/sdb1 /dev/sdb
grub-probe: error: Cannot find a GRUB drive for /dev/sdb1. Check your device.map.

/usr/sbin/grub-install: line 374: [: =: unary operator expected
Installation finished. No error reported.
This is the contents of the device map /media/sdb1/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

(hd0) /dev/sda
(hd1) /dev/sdb

■device.mapを確認します。起動の順序によっては、sdaとして認識される可能性があります。

$ cat /media/sdb1/boot/grub/device.map
(hd0) /dev/sda
(hd1) /dev/sdb


■インストールされたgrubメニューを確認します。

$ tail -11 /media/sdb1/boot/grub/menu.lst
title Debian GNU/Linux, kernel 2.6.26-2-amd64
root (hd0,0)
kernel /boot/vmlinuz-2.6.26-2-amd64 root=/dev/sda1 ro quiet
initrd /boot/initrd.img-2.6.26-2-amd64

title Debian GNU/Linux, kernel 2.6.26-2-amd64 (single-user mode)
root (hd0,0)
kernel /boot/vmlinuz-2.6.26-2-amd64 root=/dev/sda1 ro single
initrd /boot/initrd.img-2.6.26-2-amd64

### END DEBIAN AUTOMAGIC KERNELS LIST

■titile は4種類です。

$ TITLE=`for list in /media/sdb1/boot/*;do strings ${list}/vmlinuz | grep "Debian" | awk '{print $1}';done`
$ echo $TITLE
2.6.26-2-amd64 2.6.26-2-486 2.6.32-5-amd64 2.6.32-5-486

■起動用のディレクトリも4種類です。

BOOT=`for list in /media/sdb1/boot/*;do echo ${list};done | sed s%/media/sdb1/boot/%%g | grep -v grub`
$ echo $BOOT
lenny_amd64 lenny_i386 squeeze_amd64 squeeze_i386

■準備します。

$ TITLE="${TITLE} ${BOOT}"
$ echo $TITLE
2.6.26-2-amd64 2.6.26-2-486 2.6.32-5-amd64 2.6.32-5-486 lenny_amd64 lenny_i386 squeeze_amd64 squeeze_i386

$ sudo cp -pi /media/sdb1/boot/grub/menu.lst /media/sdb1/boot/grub/menu.lst.org

for num in `seq 1 4`;do
let newvar=$num+4;echo "$num $newvar";done

■余りキレイではありませんが、以下のようにします。
 ※root権限です。

$ export TITLE
$ su
Password:

# env | grep TITLE -A 6
TITLE=2.6.26-2-amd64
2.6.26-2-486
2.6.32-5-amd64
2.6.32-5-486 lenny_amd64
lenny_i386
squeeze_amd64
squeeze_i386

# for num in `seq 1 4`;do \
let newvar=$num+4;
echo "title Debian GNU/Linux, kernel "$(echo $TITLE | awk '{print $'$num'}')" sdb"; \
echo "root (hd0,0)"; \
echo "kernel /boot/"$(echo $TITLE | awk '{print $'$newvar'}')"/vmlinuz root=/dev/sdb1 ro quiet"; \
echo "initrd /boot/"$(echo $TITLE | awk '{print $'$newvar'}')"/initrd.gz"; \
echo ""; \
done >> /media/sdb1/boot/grub/menu.lst

# tail -20 /media/sdb1/boot/grub/menu.lst
title Debian GNU/Linux, kernel 2.6.26-2-amd64 sdb
root (hd0,0)
kernel /boot/lenny_amd64/vmlinuz root=/dev/sdb1 ro quiet
initrd /boot/lenny_amd64/initrd.gz

title Debian GNU/Linux, kernel 2.6.26-2-486 sdb
root (hd0,0)
kernel /boot/lenny_i386/vmlinuz root=/dev/sdb1 ro quiet
initrd /boot/lenny_i386/initrd.gz

title Debian GNU/Linux, kernel 2.6.32-5-amd64 sdb
root (hd0,0)
kernel /boot/squeeze_amd64/vmlinuz root=/dev/sdb1 ro quiet
initrd /boot/squeeze_amd64/initrd.gz

title Debian GNU/Linux, kernel 2.6.32-5-486 sdb
root (hd0,0)
kernel /boot/squeeze_i386/vmlinuz root=/dev/sdb1 ro quiet
initrd /boot/squeeze_i386/initrd.gz

■念の為、sda1として認識した場合のメニューも作っておきます。

# for num in `seq 1 4`;do \
let newvar=$num+4;
echo "title Debian GNU/Linux, kernel "$(echo $TITLE | awk '{print $'$num'}')" sda"; \
echo "root (hd0,0)"; \
echo "kernel /boot/"$(echo $TITLE | awk '{print $'$newvar'}')"/vmlinuz root=/dev/sda1 ro quiet"; \
echo "initrd /boot/"$(echo $TITLE | awk '{print $'$newvar'}')"/initrd.gz"; \
echo ""; \
done >> /media/sdb1/boot/grub/menu.lst

# tail -20 /media/sdb1/boot/grub/menu.lst
title Debian GNU/Linux, kernel 2.6.26-2-amd64 sda
root (hd0,0)
kernel /boot/lenny_amd64/vmlinuz root=/dev/sda1 ro quiet
initrd /boot/lenny_amd64/initrd.gz

title Debian GNU/Linux, kernel 2.6.26-2-486 sda
root (hd0,0)
kernel /boot/lenny_i386/vmlinuz root=/dev/sda1 ro quiet
initrd /boot/lenny_i386/initrd.gz

title Debian GNU/Linux, kernel 2.6.32-5-amd64 sda
root (hd0,0)
kernel /boot/squeeze_amd64/vmlinuz root=/dev/sda1 ro quiet
initrd /boot/squeeze_amd64/initrd.gz

title Debian GNU/Linux, kernel 2.6.32-5-486 sda
root (hd0,0)
kernel /boot/squeeze_i386/vmlinuz root=/dev/sda1 ro quiet
initrd /boot/squeeze_i386/initrd.gz

■Windowsを直接読み込むメニューの追加。
 NTFSのパーティションかどうかはgrubメニューで「c」を選んで確認した方がよい。
 私のネットブックでは、(hd0,1)は再インストール用の隠しパーティションだった。
 ※デバイスマップは常に正しいわけではないので、柔軟に。

# echo 'title sdb2 lenny multi-arch
root (hd0,1)
makeactive
chainloader +1

title sdb3 squeeze multi-arch
root (hd0,2)
makeactive
chainloader +1

' >> /media/sdb1/boot/grub/menu.lst

# tail -9 /media/sdb1/boot/grub/menu.lst
title sdb2 lenny multi-arch
root (hd0,1)
makeactive
chainloader +1

title sdb3 squeeze multi-arch
root (hd0,2)
makeactive
chainloader +1

■sdbのMGRは、jump命令から始まる

# dd if=/dev/sdb bs=4 count=1 | hexdump -C
1+0 records in
1+0 records out
00000000 eb 48 90 10 |.H..|
00000004
4 bytes (4 B) copied, 2.3144e-05 s, 173 kB/s

■同MBRにGRUBのエラーメッセージが含まれる

# dd if=/dev/sdb bs=512 count=1 | strings
1+0 records in
1+0 records out
512 bytes (512 B) copied, 2.3652e-05 s, 21.6 MB/s
ZRrI
D|f1
GRUB
Geom
Hard Disk
Read
Error

■sda1はFAT16で正しくフォーマットされている

# dd if=/dev/sdb1 bs=64 count=1 | hexdump -C
00000000 eb 3c 90 6d 6b 64 6f 73 66 73 00 00 02 08 01 00 |.<.mkdosfs......|
00000010 02 00 02 00 00 f8 86 00 3f 00 ff 00 00 00 00 00 |........?.......|
00000020 92 2a 04 00 00 00 29 77 70 37 08 20 20 20 20 20 |.*....)wp7. |
00000030 20 20 20 20 20 20 46 41 54 31 36 20 20 20 0e 1f | FAT16 ..|
00000040
1+0 records in
1+0 records out
64 bytes (64 B) copied, 0.499453 s, 0.1 kB/s

■おまけ(bootフラグが無いと次のようなメッセージが出ます)

# dd if=/dev/sdb1 bs=64 skip=1 count=2 | hexdump -C
2+0 records in
2+0 records out
128 bytes (128 B) copied, 3.2638e-05 s, 3.9 MB/s
00000000 be 5b 7c ac 22 c0 74 0b 56 b4 0e bb 07 00 cd 10 |.[|.".t.V.......|
00000010 5e eb f0 32 e4 cd 16 cd 19 eb fe 54 68 69 73 20 |^..2.......This |
00000020 69 73 20 6e 6f 74 20 61 20 62 6f 6f 74 61 62 6c |is not a bootabl|
00000030 65 20 64 69 73 6b 2e 20 20 50 6c 65 61 73 65 20 |e disk. Please |
00000040 69 6e 73 65 72 74 20 61 20 62 6f 6f 74 61 62 6c |insert a bootabl|
00000050 65 20 66 6c 6f 70 70 79 20 61 6e 64 0d 0a 70 72 |e floppy and..pr|
00000060 65 73 73 20 61 6e 79 20 6b 65 79 20 74 6f 20 74 |ess any key to t|
00000070 72 79 20 61 67 61 69 6e 20 2e 2e 2e 20 0d 0a 00 |ry again ... ...|
00000080

■ISOが正しくコピーできているか確認する

# dd if=/dev/sdb2 bs=512 skip=2 count=1 | strings 1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.0029183 s, 175 kB/s
Debian 5.0.8 M-A 1
Apple_HFS

# dd if=/dev/sdb3 bs=512 count=1 | strings
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.00254304 s, 201 kB/s
fSfQ
xpu
isolinux.bin missing or corrupt.
f`f1
{fRfP
Operating system load error.

■起動して確認する

メニューから自身に合ったアーキテクチャとバージョンを選びます。
日本語を選択して進めると、cdromが見つからないと出ます。
CD-ROMドライバをリムーバブルメディアからロードしますか?⇒いいえ
CD-ROMモジュールとデバイスを手動で選択しますか?⇒はい
CD-ROMのアクセスに必要なモジュール⇒cdrom
CD-ROMにアクセスするためのデバイスファイル⇒/dev/sdb2 or /dev/sdb3(選択したkernelイメージに応じて)

■sdb4で最小インストールを試す。

そのままsdb4にインストールが出来る事を確認します。(14.9GB)

ネットブックから行なうと、86版のdebianシステムが出来上がります。
また、amd64のサーバから行なうとamd64版のdebianシステムが出来上がります。

なぜか、ネットブックではsqueezeが起動しなかったので、
lennyだな。