【高速起動Linux Xandros Presto USBフラッシュメモリにinstall】 [高速起動Linux]
高速起動Linux Xandros PrestoをUSBメモリにインストールした。
MSI Wind U100で起動したところ、USBメモリの認識で起動時間が多少伸びたが、それでも十分高速、約15秒で起動する。
Xandros Prestoは通常WindowsXPの場合、C:\Program Files\Prestoにインストールされる。
必要ファイルはその中のbootフォルダとPRESTO_SQ.IMG,PRESTO_USER.IMGだ。
それからC:\presto.lstをgrub.confにする。
USBメモリ(8GB)はfdiskコマンドで2つのパーティションに分割する。
1番目はFAT16、2番目はext2(linux)でフォーマットする。
Prestoのbootフォルダは1番目のFATにコピーして、PRESTO_SQ.IMG、PRESTO_USER.IMGは2番目のext2にprestoディレクトリを作成しその中にコピーする。
更にUSBメモリにgrubをインストールしてUSBメモリをブータブルにする。
USBメモリの構成例
・パーティション1(FAT16 約3GB)
boot/
initramfs.img
System.map-2.6.29-presto
config-2.6.29-presto
vmlinuz-2.6.29-presto
boot/grub/
grub.conf
device.map他
・パーティション2(ext2 約4GB)
presto/
PRESTO_SQ.IMG
PRESTO_USER.IMG
最初はUSBメモリの全領域をFAT32でフォーマットしたが、initでUSBメモリをmountするところで「FAT: codepage cp850 not found」でエラーとなりmountできなかった。
解決できなかったので、ext2フォーマットの第2パーティションを作り回避した。
USBメモリに必要ファイルコピーの手順
fdisk -l /dev/sdb
デバイス Boot Start End Blocks Id System
/dev/sdb1 * 1 19201 3072152 6 FAT16
/dev/sdb2 19202 48947 4759360 83 Linux
mkdosfs -F16 -nXPC /dev/sdb1
mkfs.ext2 /dev/sdb2
mkdir /mnt/sdb1
mkdir /mnt/sdb2
mount /dev/sdb1 /mnt/sdb1
mount /dev/sdb2 /mnt/sdb2
cp -r /media/OS_Install/Program\ Files/Presto/boot /mnt/sdb1/
mkdir /mnt/sdb2/presto
cp /media/OS_Install/Program\ Files/Presto/*.IMG /mnt/sdb2/presto/
grub-install --no-floppy --recheck --root-directory=/mnt/sdb1 /dev/sdb
「OS_install」は内蔵ハードディスクのWindowsシステムパーティションのラベル名だ。
次がちょっと難しい。/boot/initramfs.imgの中のinitスクリプトを書き換えなければならない。
initスクリプトで、USBメモリを認識しUSBメモリ中のPRESTO_SQ.IMGとPRESTO_USER.IMGをマウントする様書き換える。initramfs.imgはcpioとgzipでアーカイブされているので、展開してinitを書き換えた後、再作成する。
cp /mnt/sdb1/boot/initramfs.img .
mkdir initramfs
cd initramfs
zcat ../initramfs.img | cpio -i -c
ls
bin init mnt-boot mnt-user png sbin tmp
dev mnt mnt-system modules proc sys
vi init <-- initスクリプトを書き換える。
find . | cpio --quiet -c -o | gzip -c > ../initramfs2.img
cp ../initramfs2.img /mnt/sdb1/boot/initramfs.img
initスクリプトの変更内容(赤字が追加変更行)
(28行目から)
mount -t proc proc /proc
mount -t sysfs sys /sys
insmod /modules/usbcore.ko
insmod /modules/uhci-hcd.ko
insmod /modules/ehci-hcd.ko
insmod /modules/libusual.ko
insmod /modules/usb-storage.kowhile
[ -z "$CHECK" ]
do
CHECK=`cat /proc/partitions | sed -n 's/.*sd/\/dev\/sd/p' | grep 'sdb'`
sleep 2
done
(追加後79行目、追加前67行目)
# if ! ntfs-3g -o syncio $PRESTODEV /mnt-boot 2> /dev/null; then (コメントアウト)
if ! mount -t ext2 $PRESTODEV /mnt-boot 2> /dev/null; then
(以下変更無し)
USBメモリを認識するためusbcore.ko,usb-storage.koなどカーネルモジュールをロードした。
while文はUSBメモリが/dev/sdbとして認識するまでループして待っている。
USBメモリが認識される前にPRESTODEV(= /dev/sdb2)をmountするとエラーになるためだ。
c:\presto.lstを若干書き換えて/boot/grub/grub.confにリネームする。
default 0
timeout 0
hiddenmenu
title Xandros Presto
root (hd0,0)
kernel /boot/vmlinuz-2.6.29-presto fastboot ahci.ignore_sss=1 quiet PRESTODEV=/dev/sdb2 PRESTOPATH=presto WINDEV=/dev/sda2
initrd /boot/initramfs.img
PRESTODEVはPRESTO_SQ.IMG、PRESTO_USER.IMGが格納されているパーティションなので、USBメモリの2番目のパーティション(/dev/sdb2)を指定する。
WINDEVはWindowsが格納されているパーティションなので、MSI Windでは内蔵のSATAハードディスクの第2パーティション(/dev/sda2)になる。
initスクリプトに追加したwhile文はUSBメモリが/dev/sdbで認識されることが前提で、PCの構成によっては、USBメモリが/dev/sdaかもしれないし、/dev/sdcになるかもしれない(もっといい書き方があれば教えてください。お願いします)。
Linuxの起動は、BIOS設定で、リムーバブルメディア->HDDに設定して起動しているのですか?
もし、そうではなくて、USBのFATパーティションにあるWin32プログラムから、Linuxのブートローダーを経由して、起動する方式なら、USBのFATパーティションに、"AUTORUN.INF"を作成すれば、良いような気もしますが...
by hack3510 (2009-05-04 10:40)
あるいは、USBのFATパーティションにある、ブートローダーイメージを起動するWin32プログラムがあれば、良いのかも知れません。
ただし、Win32プログラム経由で起動する方式だと、Windows起動中に、USBメモリを挿すと、ハードウェアの競合が起こるかもしれませんので、その辺りは、自己責任で、お願いします!<(_ _)>
by hack3510 (2009-05-04 10:46)