*できるかな? … 成功![#p8b5474c]
-''概要''~
USB接続した外部ストレージをルートデバイスとして起動する。~
~
-''利点''~
様々なディストリビューション等を、USBストレージ上で手軽に試行することができる。~
~
-''実験構成''~
以下の物でUSBストレージを構成して、起動実験を試みた。~
--BUFFALO社MCR-CF-LT/U2~
USB2.0&USB1.1対応カードリーダー/ライター スタンドレスタイプ コンパクトフラッシュ専用~
&ref(MCRCFLTU2.jpg,nolink);~
--HGST社MicroDrive~
&ref(MicroDrive.jpg,nolink);~
--これらもルートデバイスにすることが可能と思われる。~
---USB接続型HDD
---USBメモリスティック
*カーネルの準備 [#e5b3a182]
-''ramdisk.gzの作成''~
initrd用のRAM DISKを作成します。~
#pre{{
landisk:/share/src/kernel# dd if=/dev/zero of=ramdisk bs=1024 count=2048
landisk:/share/src/kernel# mke2fs ramdisk
landisk:/share/src/kernel# mount -o loop ramdisk /mnt
}}
/mnt にinitrdの起動システムを構築します。~
/mnt/bin下のコマンドは全てbusyboxを使用しました。~
#pre{{
landisk:/share/src/kernel# find /mnt
/mnt
/mnt/lost+found
/mnt/bin
/mnt/bin/cp
/mnt/bin/ln
/mnt/bin/ls
/mnt/bin/mv
/mnt/bin/rm
/mnt/bin/sh
/mnt/bin/ash
/mnt/bin/cat
/mnt/bin/env
/mnt/bin/pwd
/mnt/bin/sed
/mnt/bin/yes
/mnt/bin/echo
/mnt/bin/expr
/mnt/bin/test
/mnt/bin/chgrp
/mnt/bin/chmod
/mnt/bin/chown
/mnt/bin/lsmod
/mnt/bin/mkdir
/mnt/bin/mknod
/mnt/bin/mount
/mnt/bin/rmmod
/mnt/bin/sleep
/mnt/bin/touch
/mnt/bin/modprobe
/mnt/bin/insmod
/mnt/bin/umount
/mnt/bin/busybox
/mnt/busybox.config
/mnt/dev
/mnt/dev/console
/mnt/dev/hda
/mnt/dev/hda1
/mnt/dev/hda2
/mnt/dev/hda3
/mnt/dev/hda4
/mnt/dev/hda5
/mnt/dev/hdb
/mnt/dev/hdb1
/mnt/dev/hdb2
/mnt/dev/hdb3
/mnt/dev/hdb4
/mnt/dev/hdb5
/mnt/dev/sda
/mnt/dev/sda1
/mnt/dev/sda2
/mnt/dev/sda3
/mnt/dev/sda4
/mnt/dev/sda5
/mnt/dev/sdb
/mnt/dev/sdb1
/mnt/dev/sdb2
/mnt/dev/sdb3
/mnt/dev/sdb4
/mnt/dev/sdb5
/mnt/dev/ttySC0
/mnt/dev/ttySC1
/mnt/lib
/mnt/lib/modules
/mnt/lib/modules/ehci-hcd.ko
/mnt/lib/modules/ohci-hcd.ko
/mnt/lib/modules/usb-storage.ko
/mnt/lib/modules/usbcore.ko
/mnt/linuxrc
/mnt/proc
}}
/linuxrc はこの様な物を準備しました。~
usb-storage.koをinsmodしてから、デバイスが認識されるまで、sleepで待たせています。~
これを行わないと、すぐさまマウントシーケンスに突入してしまい、ハングアップします。~
USB1.1のデバイスを接続する場合は、もう少し待ったほうが良いかもしれません。~
~
&color(red){補足:赤文字の部分は [[FireWireのデバイスからLinuxをブート:http://www-6.ibm.com/jp/developerworks/linux/040820/j_l-fireboot.html]] を参考にした。};~
&color(red){SCSIバス(エミュレーション)のスキャンを行っているらしい。};~
&color(red){成功する時と失敗する時があって、なんか不安定なんだよな〜!};~
#pre{{
#!/bin/sh
export PATH=/bin
mount -nt proc none /proc
insmod /lib/modules/usbcore.ko
sleep 2
insmod /lib/modules/ehci-hcd.ko
sleep 2
insmod /lib/modules/ohci-hcd.ko
sleep 2
insmod /lib/modules/usb-storage.ko
sleep 10
&color(red){echo "scsi add-single-device 0 0 0" > /proc/scsi/scsi};
&color(red){echo "scsi add-single-device 1 0 0" > /proc/scsi/scsi};
&color(red){echo "scsi add-single-device 2 0 0" > /proc/scsi/scsi};
sleep 5
#echo "0x303" > proc/sys/kernel/real-root-dev
umount proc
exit 0
}}
圧縮します。~
#pre{{
landisk:/share/src/kernel# umount /mnt
landisk:/share/src/kernel# gzip -9 ramdisk
}}
-''カーネルパラメータ….config''~
initrd関連のオプションをイネーブルにします。~
#pre{{
Device Drivers --->
Block devices --->
<*> RAM disk support
(16) Default number of RAM disks
(4096) Default RAM disk size (kbytes)
[*] Initial RAM disk (initrd) support
() Initramfs source file(s)
SH initrd options --->
[*] Embed root filesystem ramdisk into the kernel (NEW)
(ramdisk.gz) Filename of gziped ramdisk image (NEW)
}}
なお、先ほど作成した ramdisk.gzを、zImageへ組み込みます。~
下記の場所へコピーして、ビルドを行います。~
#pre{{
linux-2.6.12/arch/sh/ramdisk/ramdisk.gz
}}
*ルートファイルシステムの準備 [#uc046d70]
-USBストレージにアクセスするには?
--hotplugのインストール
#pre{{
landisk:~# apt-get install hotplug
}}
--あとは挿すだけ。~
#pre{{
landisk:~# dmesg
usb 3-2: new high speed USB device using ehci_hcd and address 3
Initializing USB Mass Storage driver...
scsi0 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 3
usb-storage: waiting for device to settle before scanning
usbcore: registered new driver usb-storage
USB Mass Storage support registered.
Vendor: BUFFALO Model: MCR HS-CF Rev: 1.95
Type: Direct-Access ANSI SCSI revision: 00
SCSI device sda: 3999744 512-byte hdwr sectors (2048 MB)
sda: Write Protect is off
sda: Mode Sense: 03 00 00 00
sda: assuming drive cache: write through
SCSI device sda: 3999744 512-byte hdwr sectors (2048 MB)
sda: Write Protect is off
sda: Mode Sense: 03 00 00 00
sda: assuming drive cache: write through
sda: sda1
Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
usb-storage: device scan complete
}}
/proc/partitionsによるとsda(SCSI)デバイスとして認識されています。~
#pre{{
landisk:~# cat /proc/partitions
major minor #blocks name
3 0 156290904 hda
3 1 8193118 hda1
3 2 265072 hda2
3 3 40965750 hda3
3 4 106864380 hda4
&color(red){ 8 0 1999872 sda};
&color(red){ 8 1 1999840 sda1};
}}
-''パーティション設定''~
この様な感じでパーティション分割した。~
#pre{{
landisk:~# fdisk /dev/sda
Command (m for help): p
Disk /dev/sda: 2047 MB, 2047868928 bytes
64 heads, 63 sectors/track, 992 cylinders
Units = cylinders of 4032 * 512 = 2064384 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 40 80608+ 83 Linux
/dev/sda2 41 95 110880 82 Linux swap / Solaris
/dev/sda3 96 992 1808352 83 Linux
Command (m for help):
}}
-''ファイルシステムのフォーマット''~
--/dev/sda1 ext2
--/dev/sda2 swap
--/dev/sda3 reiserfs
とする。~
#pre{{
landisk:~# mke2fs -c /dev/sda1
landisk:~# mkswap /dev/sda2
landisk:~# mkreiserfs /dev/sda3
}}
-''debian26の導入''~
--mount
#pre{{
landisk:~# mount -t reiserfs /dev/sda3 /mnt
}}
--あとは/mnt/下へ、通常通りdebian26環境を構築~
唯一の変更点は/etc/fstabかな!~
#pre{{
# UNCONFIGURED FSTAB FOR BASE SYSTEM
/dev/sda3 / reiserfs defaults 0 1
proc /proc proc defaults 0 0
/dev/sda2 swap swap defaults 0 0
}}
--umount~
umountしておきましょう。~
#pre{{
landisk:~# mount -t reiserfs /dev/sda3 /mnt
}}
*起動 [#p45a8d0f]
-''kernelsw.conf''~
以下のkernelsw.confを使用して、kernelsw(26).plでブートします。~
&color(red){ミソはappendにrootデバイスのメジャー/マイナー番号を16進数で指定することです。};~
&color(red){LinuxSHのバグ?なのかな!!};~
#pre{{
linear
boot=/dev/sda
disk=/dev/sda
bios=0x80
timeout=50
default=linux
image=/boot/zImage-usbstorage
label=linux
root=/dev/hda3
append="mem=64M console=ttySC1,9600 &color(red){root=803};"
}}
-''立ち上がり後の確認''~
/dev/sda3がルートデバイスとしてマウントされている。~
#pre{{
landisk:~# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 1808260 121964 1686296 7% /
tmpfs 31176 0 31176 0% /dev/shm
}}
-''ご参考まで''~
本実験で実際に使用したカーネルなど…~
http://eggplant.ddo.jp/www/download/kernel26/boot_at_usbstorage/~