MyLinuxをフラッシュメモリから起動する

MyLinuxをフラッシュメモリに書き込み、MyLinuxをフラッシュメモリから起動するようにします。

フラッシュメモリに書き込む前の準備

MyLinuxの容量を確認する

# cd /usr/local/src/origlinux
# du -s

▼確認
# cd /usr/local/src/origlinux
# du -s
267520 .
#
MyLinuxの容量は、267.520Mバイトでした。

ファイルのシュリンク

コンパクトフラッシュあるいはUSBメモリが256Mバイトの容量の場合、ブートローダGNU GRUBとMyLinuxをこれらのメモリ内に収めることができ ません。
フラッシュメモリの容量をより効率的に利用するには、"ファイルのシュリンク"を実施する必要があります。
これまでコンパイルして作成したMyLinux用のコマンドやライブラリの多くには、デバッグなどに利用するシンボルの情報が含まれています。そのシンボル情報を取り除 くことによりファイルサイズを小さくすることができます。

シンボル情報の確認

コマンドやライブラリにシンボル情報が含まれるかどうかは、fileコマンドで判別することができます。
# file <コマンド名(またはライブラリ名)>

出力結果に「not stripped」と表示されたときには、シンボル情報が含まれていることになります。

シンボル情報を取り除く

シンボル情報を取り除くには、stripコマンドを用います。
# strip <コマンド名>

stripコマンドを実行すると、シンボル情報を管理するシンボルテーブルが削除されます。

bashコマンドのファイルをシュリンクする

# cd /usr/local/src/origlinux/rootsys/bin
# strip bash

▼確認
# cd /usr/local/src/origlinux/rootsys/bin
# strip bash
# file bash
bash: ELF 32-bit LSB executable, Intel 80386, version 1,
for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped
# du -s
4984 .
# cd /usr/local/src/origlinux
# du -s
265108 .
#

/usr/local/src/origlinux/rootsysディレクトリ以下のファイルをすべて調査し、「not stripped」が表示されたファイルをすべてシュリンクするようにします。

ライブラリファイルのシュリンク

# strip -S <ライブラリ名>
-Sオプションを付けます。これはデバッグ用のシンボルのみを取り除くオプションです。

(注)
ライブラリファイルに対して-Sオプションを忘れると、システムが正常に動作しないトラブルが発生します。

自動的にファイルをシュリンクする

数多くのコマンドやライブラリを一つずつ調べながら、stripコマンドを実行するのは大変です。自動シュリンク用スクリプト mylinux_shrink.shを利用することにします。

mylinux_shrink.shを作成します。
# cd /home/ono
# mkdir /mylinux
# cd mylinux
# vi mylinux_shrink.sh

#!/bin/sh

cd /usr/local/src/origlinux/rootsys

for i in `find . -type f`
do
A=`file $i | grep archive`
if [[ ! -z $A ]] ; then
strip -S $i
fi
B=`file $i | grep "not stripped"`
if [[ ! -z $B ]] ; then
C=`echo $i | grep lib`
if [[ ! -z $C ]] ; then
strip -S $i
else
strip $i
fi
fi
done

実行権限を与えます。
# chmod 755 mylinux_shrink.sh

mylinux_shrink.shを実行します。
# ./mylinux_shrink.sh

MyLinuxの容量を確認します。

# cd /usr/local/src/origlinux
# du -s

# cd /usr/local/src/origlinux
# du -s
62780 .
#

MyLinuxをフラッシュ上に完成させる

(シュリンクした)MyLinuxをフラッシュメモリに書き込む前に、MyLinuxの設定を書き換える必要があります。

rc3スクリプトの変更

/usr/local/src/origlinux/rootsys/etc/rc3スクリプトの最終行に追記します。
# vi /usr/local/src/origlinux/rootsys/etc/rc3

if [ -f /etc/mtab ] ; then
rm -f /etc/mtab
fi
/bin/ln -s /proc/mounts /etc/mtab

これで、ファイルシステムの状態を表示するdfコマンド(ディスクドライブの使用量を表示するコマンド)が利用できるようになります。

syslog.confファイルの変更

syslog.confファイルを書き換えます。様々なログをすべて/var/logディレクトリ以下に出力するように設定します。
# vi /usr/local/src/origlinux/rootsys/etc/syslog.conf

kern.* /var/log/messages
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* /var/log/maillog
cron.* /var/log/cron
*.emerg *
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log

フラッシュメモリに書き込む

フラッシュメモリにMyLinuxを書き込みます。コンパクトフラッシュとUSBメモリの2種類に書き込みます。

両者では、書き込む際のデバイス名が異なります(「/dev/hdc」、「dev/sda」など)が、手順自体はほとんど同じです。

USB接続のカードリーダを用いれば、コンパクトフラッシュでもUSBメモリと同様にSCSI接続されているデバイス(「/dev/sda」)として認識されます。その場合は、USBメモリと2カ所の設定が異なるだけです。

USBメモリのデバイス名の確認

Linux開発マシンにUSBメモリを挿し込み、dmesgコマンドを用いて、USBメモリがどのようなデバイス名で認識されているのかを確認します。

# dmesg

USBメモリは「/dev/sda」として認識されているとします。

▼確認
hid-core.c: v1.8.1 Andreas Gal, Vojtech Pavlik <vojtech@suse.cz>
hid-core.c: USB HID support drivers
pcnet32.c:v1.30c 05.25.2004 tsbogend@alpha.franken.de
pcnet32: PCnet/PCI II 79C970A at 0x2000, 00 0c 29 03 1b 44 assigned IRQ 18.
eth0: registered as PCnet/PCI II 79C970A
pcnet32: 1 cards_found.
VMware hgfs: HGFS is disabled in the host
VMware memory control driver initialized
vmmemctl: started kernel thread pid=604
VMware vmxnet virtual NIC driver
VMware hgfs: HGFS is disabled in the host
cdrom: This disc doesn't have any tracks I recognize!
hub.c: new USB device 02:02.0-1, assigned address 2
scsi1 : SCSI emulation for USB Mass Storage devices
Vendor: Generic Model: STORAGE DEVICE Rev: 9144
Type: Direct-Access ANSI SCSI revision: 02
Attached scsi removable disk sda at scsi1, channel 0, id 0, lun 0
SCSI device sda: 506016 512-byte hdwr sectors (259 MB)
sda: Write Protect is off
sda: sda1
WARNING: USB Mass Storage data integrity not assured
USB Mass Storage device found at 2
cdrom: This disc doesn't have any tracks I recognize!
[root@localhost etc]#

パーティションの作成

USBメモリ内にMyLinuxを導入するパーティションを作成します。
fdiskを起動します。
# fdisk /dev/sda

「n 」と入力して、パーティションの新規作成を開始します。

「p 」と「1 」を続けて入力してプライマリパーティションの1つ目である「sda1」というパーティションを作成します。

「最初 シリンダ...」と表示されたら、〔Enter〕キーを押します。「終点 シリンダ...」でも同様に〔Enter〕キーを押します。
これは作成するパーティションのサイズ指定であり、〔Enter〕キーを押すことで最大サイズで作成されます。

最後に、設定を反映するように、「w 」と入力してfdiskを終了します。

これで、MyLinux用のパーティション「sda1」が作成されます。

フォーマット

作成したパーティションをフォーマットします。mke2fsコマンドに、強制的にフォーマットする-Fオプションと、ジャーナリング機能を追加する-jオプションを付けて実行します。
# mke2fs -F -j /dev/sda1

sda1はExt3でフォーマットされます。

▼実行表示
]# mke2fs -F -j /dev/sda1
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
62248 inodes, 248976 blocks
12448 blocks (5.00%) reserved for the super user
First data block=1
31 block groups
8192 blocks per group, 8192 fragments per group
2008 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185

Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 27 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@localhost etc]#

MyLinuxをUSBメモリにコピー

MyLinuxを素早くコピーするために、/usr/local/src/origlinuxディレクトリ以下のファイルやディレクトリをまとめて圧縮し、1つのファイル(mylinux.tgz)として保存します。
# cd /usr/local/src/origlinux
# tar czvf ../mylinux.tgz .

▼確認
# ls ../ -l
合計 16712
drwxr-xr-x 2 root root 4096 Oct 23 22:28 bison_flex/
-rw-r--r-- 1 root root 17071643 Mar 22 18:48 mylinux.tgz
drwxr-xr-x 15 root root 4096 Mar 21 10:30 origdev/
drwxr-xr-x 7 root root 4096 Mar 21 22:32 origlinux/
drwxr-xr-x 16 root root 4096 Oct 26 00:18 origsoft/
#

USBメモリをマウントして、フラッシュメモリ上でその圧縮ファイルを展開します。
# mount /dev/sda1 /mnt
# cd /mnt
# tar xzvf /usr/local/src/mylinux.tgz

GRUBの導入

GRUBをコンパイルします。
# cd /usr/local/src/origsoft
# tar xzvf grub-0.96.tar.gz
# cd grub-0.96
# ./configure
# make
# make check
# make install

GRUBの導入に必要なファイルはLinux開発マシン上に導入し、MyLinuxにはGRUBのブートローダ部分だけを書き込みます。

ブートローダを書き込みます。
# grub-install --root-directory=/mnt /dev/sda

/mnt/boot/grubディレクトリ以下にGRUBのファイル類が作成されます。

▼実行表示
# grub-install --root-directory=/mnt /dev/sda
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt/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'.

(fd0) /dev/fd0
(hd0) /dev/hda
(hd1) /dev/sda
#

GRUBを導入したら、「device.map」という設定ファイルを書き換えます。

▼確認
# cat /mnt/boot/grub/device.map
(fd0) /dev/fd0
(hd0) /dev/hda
(hd1) /dev/sda
#

現在は、Linux開発マシンの環境に合わせて作成されているため、/mnt/boot/grub/device.mapファイルをエディタで開いて、ブートデバイスが「hd0」に割り当てられるように書き換えます。
# vi /mnt/boot/grub/device.map

●USBメモリ
(hd0) /dev/sda

●コンパクトフラッシュ
(hd0) /dev/hda

▼確認
# cat /mnt/boot/grub/device.map
(hd0) /dev/sda

grub.confの作成

GRUBの設定である/mnt/boot/grub/grub.confファイルを作成します。
# vi /mnt/boot/grub/grub.conf

●USBメモリ用のgrub.confファイル
default=0
timeout=10
title MyLinux
root (hd0,0)
kernel /boot/mylinux ro root=/dev/sda1
initrd /boot/ramdisk.img

▼確認
# cat /mnt/boot/grub/grub.conf
default=0
timeout=10
title MyLinux
root (hd0,0)
kernel /boot/mylinux ro root=/dev/sda1
initrd /boot/ramdisk.img
#

●コンパクトフラッシュ用のgrub.confファイル
default=0
timeout=10
title MyLinux
root (hd0,0)
kernel /boot/mylinux ro root=/dev/hda1
initrd /boot/ramdisk.img

grub.confファイルを作成したら、「menu.lst」というシンボリックリンクを作成します。
# cd /mnt/boot/grub
# ln -s ./grub.conf menu.lst

# ls -l menu.lst
menu.lst -> ./grub.conf

# ls -l menu.lst
lrwxrwxrwx 1 root root 11 Mar 22 19:37 menu.lst -> ./grub.conf
#

フラッシュメモリ 設定ファイルの変更操作

フラッシュメモリのramdisk.img内の設定ファイル(linuxrcや/etc/fstab)を変更します。

変更作業の前に、作業用のディレクトリ/tmp/mylinuxを作成しておきます。
# mkdir /tmp/mylinux

/usr/local/src/origilinux/boot/ramdisk.imgを/tmp/mylinuxディレクトリにファイル名ramdiskとして展開します。
# gzip -cd /usr/local/src/origilinux/boot/ramdisk.img > /tmp/mylinux/ramdisk

ramdisk.imgを/mnt/ram にマウントします。
# mount -o loop=/dev/loop1 /tmp/mylinux/ramdisk /mnt/ram
# cd /mnt/ram

linuxrcや/etc/fstabを変更します。

ramdisk.imgをアンマウントします。
# cd
# umount /mnt/ram

変更済みramdiskをgzipで圧縮(ramdisk.img)します。
# gzip -c9 /tmp/mylinux/ramdisk > /tmp/mylinux/ramdisk.img

変更済みramdisk.imgをフラッシュメモリに書き込みます。
# mount /dev/sda1 /mnt
# cd /mnt/boot
# cp -p /tmp/mylinux/ramdisk.img .

フラッシュメモリをアンマウントします。
# cd
# umount /mnt

フラッシュメモリから起動

MyLinux稼働マシンにフラッシュを挿して起動します。

「mylinux login:」というログインプロンプトが表示されたら成功です。
「root」と入力し、MyLinuxにログインします。

変更 2009.03.28
2008.07.06