SSブログ

【高速起動Linux Xandros Presto USBフラッシュメモリにinstall】 [高速起動Linux]

高速起動Linux Xandros PrestoをUSBメモリにインストールした。
MSI Wind U100で起動したところ、USBメモリの認識で起動時間が多少伸びたが、それでも十分高速、約15秒で起動する。

snapshot3 

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.ko

while
    [ -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になるかもしれない(もっといい書き方があれば教えてください。お願いします)。


nice!(0)  コメント(2)  トラックバック(1) 

nice! 0

コメント 2

hack3510

Linuxの起動は、BIOS設定で、リムーバブルメディア->HDDに設定して起動しているのですか?
もし、そうではなくて、USBのFATパーティションにあるWin32プログラムから、Linuxのブートローダーを経由して、起動する方式なら、USBのFATパーティションに、"AUTORUN.INF"を作成すれば、良いような気もしますが...

by hack3510 (2009-05-04 10:40) 

hack3510

あるいは、USBのFATパーティションにある、ブートローダーイメージを起動するWin32プログラムがあれば、良いのかも知れません。
ただし、Win32プログラム経由で起動する方式だと、Windows起動中に、USBメモリを挿すと、ハードウェアの競合が起こるかもしれませんので、その辺りは、自己責任で、お願いします!<(_ _)>

by hack3510 (2009-05-04 10:46) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 1

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。