突然自宅サーバ兼ディスクトップが応答しなくなりました。帰って原因を 調べると、Disk I/Oエラーです。今後の対策として「なるべく頑丈にしたい」 と考え、これを計画しました。
| Media | Dir | R/W | type | 説明 |
|---|---|---|---|---|
| CF | / | RO | cramfs | 基本システム一式 |
| CF | /boot | RO | ext2 | カーネルおよびgrubの設定ファイルを置く |
| CF | /etc.org | RO | ext2 | 起動時に使用する標準の設定ファイルを置く。 |
| RAM | /etc | RW | tmpfs | 実行中に使用している設定ファイルを置く。起動時に/etc.orgからコピー |
| RAM | /tmp | RW | tmpfs | テンポラリ。起動時は空。 |
| RAM | /dev | RW | tmpfs | パーミション書き換えたりするので。 |
| HDD | /var | RW | bind | 動作中に変更される不揮発のデータ。 |
| HDD | /home | RW | bind | ユーザのデータ。 |
| HDD | /usr | RW | bind | 各種プログラム |
| HDD | /lib/module | RW | bind | カーネルモジュール。 |
性能は ここを参照。cramfsは圧縮率はやや低めですが、HDDに限定すれば一番速 いようです。これを使用します。
| システムs | 説明 |
|---|---|
| cramfs | 小容量ROM用。読み込み専用。 |
| cloop | Knoppixで使われている。読み込み専用。 |
| squashfs | cloopを上回る性能?。読み込み専用。 |
| jffs2 | MTDと連動するためF-ROM専用。書き込み可能。 |
最終的にはCF-IDE変換のコネクタを噛ませますが、まずは手持ちの256M CF カードをUSB接続して起動しました。64Mあれば問題ないでしょう。
USBカードリーダに差し込んで、
# fdisk /dev/sda
# mkfs.ext2 /dev/sda1 # mkfs.ext2 /dev/sda2
cramfs用のツールをここから落し
$ tar xfvz cramfs-1.1.tar.gz $ cd cramfs-1.1 $ make # cp cramfsck mkcramfs /usr/sbin/
動作に最低限必要な物をコピーします。また、マウントポイントを作成します。
$ mkdir TARGET $ cd TARGET # cp -a /bin /dev /lib /sbin . # mkdir -p boot etc etc.org home initrd mnt opt proc root sys tmp usr var $ cd ..
# mkcramfs TARGET target.cramfs # cp target.cramfs /dev/sda3
起動に必要な処理を書きます。
#! /bin/sh
load_modules()
{
insmod /lib/modules/"`uname -r`"/kernel/fs/cramfs/cramfs.ko
}
mount_root_partition()
{
while [ -z "`cat /proc/partitions | grep sda3`" ] ; do
sleep 1;
echo "Searching root partition"
done
mkdir -p /newroot
mount -t cramfs /dev/sda3 /newroot
}
mount_etc_partition()
{
mount -t tmpfs tmpfs /newroot/etc
mount -t ext2 -o ro /dev/sda2 /newroot/etc.org
cp -a /newroot/etc.org/* /newroot/etc
}
make_dev_partition()
{
cd /newroot
tar cf /dev.tar dev
mount -t tmpfs tmpfs dev
tar xf /dev.tar
rm /dev.tar
cd /
}
make_mnt_partition()
{
mount -t tmpfs tmpfs /newroot/mnt
mkdir -p /newroot/mnt/data
mkdir -p /newroot/mnt/sys
}
mount_tmp_partition()
{
mount -t tmpfs tmpfs /newroot/tmp
}
mount_boot_partition()
{
mount -t ext2 -o ro /dev/sda1 /newroot/boot
}
change_root()
{
cd newroot
pivot_root . initrd
}
echo "Load Module"
load_modules
mount -t proc proc proc
echo "Mount Root/Boot/Etc/Tmp"
mount_root_partition
mount_boot_partition
mount_etc_partition
mount_tmp_partition
echo "Make Dev/Mnt"
make_dev_partition
make_mnt_partition
echo "Swap Root"
umount /proc
change_root
# mount -t proc proc /newroot/proc
echo "Start init daemon"
exec chroot . /sbin/init < /dev/console > /dev/console 2>&1BuxyBoxのページから取得して、解凍。
# cd ~/busybox-1.01 # make menuconfig(static link、insmod、sysctlを有効にする) # make # make install PREFIX=TARGET
# dd count=20480 if=/dev/zero of=initrd # mkfs.ext2 initrd # mount -o loop initrd /mnt/usb2/ # cd /mnt/usb2/ # mkdir -p etc usr var home boot mnt opt proc sys tmp root # chmod 777 tmp # chmod 700 root Busyboxを入れる # cp -a ~/buxybox-1.01/TARGET/* . 自作のlinuxrcを使用するように設定 # rm linuxrc # cp ~/linuxrc . 書き込み # umount /mnt/usb2/ # gzip -9 initrd # mount /dev/sda1 /mnt/boot # cp initrd.gz /mnt/boot # umount /mnt/boot
カーネルのコンフィグレーションを変更し、ramdiskをカーネルに組み込み、 initrdを有効にします。また、reiserfs、cramfs、usbなどをモジュール(or組 み込み)にします。モジュールにしたもので起動に必要なものは、initrdの中 にコピーしておきlinuxrcでinsmodしておきます。
# mount /dev/sda1 /mnt/boot # grub-install --root-directory=/mnt/boot /dev/sda # cp -a /boot/* /mnt/boot # cp -a vmlinuz /mnt/boot # mkdir /mnt/boot/etc # cp -a /etc/grub.conf /mnt/boot/etc # vi /mnt/boot/etc/grub.conf
title RomBoot root (hd0,0) kernel (hd0,0)/vmlinuz rw ramdisk=66000 root=/dev/ram0 init=/linuxrc initrd (hd0,0)/initrd.gz
# umount /mnt/boot
# mount /dev/sda2 /mnt/etc # cp -a /etc/* /mnt/etc # vi /mnt/etc/fstab # vi /mnt/etc/rc.d/rc.S
fstabは、Rootをマウントしないようにし、また、linuxrcで操作しないマ ウント(主にbindマウントする物)を追記します。
rc.Sには、initrdのアンマウント&メモリ解放を追記します。
# umount /initrd # blockdev --flushbufs /dev/ram0