バックアップ方面をどうするか色々考えた末、linuxを入れてからあんまりいじっていない起動部分構造も含めて、一旦まとめて整理してみることにした。
*ブツごとにsquashfsで小分けに圧縮、unionfsはやめてaufsで実ファイルシステムと合体、実ファイルは削除
*かつ、コア部分をinitramfsからRAM起動させる
*小分けにしたsquashfs圧縮ファイルをバックアップ、aufsでできた差分を差分バックアップ
うまくいけばなかなかスマートでないかい。
initramfsイメージ・圧縮後1.7MB
コア部・圧縮後34MB
/etc /bin /sbin /lib /var + 空の/proc /sys /tmp /usr /opt /home /root
/usr・圧縮後1.8GB
/opt・圧縮後750MB
/home・圧縮後1.4GB
実際圧縮してみるとこんな感じになった。
このうちコア部の34MBをtmpfsでメモリに常駐、squashfsでマウントしてaufsで実ファイルシステムと合体してルートとし、その後chroot。
←というスクリプトをinitramfsの中に入れておく。
initramfsの中身は具体的には、以下のようになる。
要するに超ミニLinux。
*bash cat chroot cp echo mkdir modprobe mount rmmod sed sleep umount 辺りの実行ファイル群の入ったbin sbinディレクトリ
*それに絡む必要なダイナミックライブラリの入ったlibディレクトリ、必要ならkernelモジュールも入れる
*必要なデバイスノードをあらかじめ入れてあるdevディレクトリ
*マウント用の空ディレクトリ
*空の proc sys ディレクトリ
*initスクリプト
#!/bin/bash
PATH=/bin:/sbin
mount -t proc /proc /proc
mount -t sysfs /sys /sys
ROOT=/dev/hda2
INIT=/sbin/init
for p in `cat /proc/cmdline`; do
v=`echo $p | sed 's/[^=]*=//'`
case $p in
root=*)
ROOT=$v
;;
init=*)
INIT=$v
;;
[0-6S])
RUNLEVEL=$p
;;
esac
done
echo Creating /dev
modprobe -q ehci-hcd
modprobe -q uhci-hcd
modprobe -q aufs
echo Creating root device.
mount -t tmpfs none sysroot
mount $ROOT mnt
cp mnt/squash/root.sfs boot.sfs
mkdir sysroot/boot
mount -t squashfs -o loop boot.sfs mnt2
mount -t aufs -o br:mnt/squash/changed/boot=rw:mnt2=ro,udba=inotify none sysroot/boot
echo Pivot root
cd /sysroot/boot
mount --move . /
mount
umount /proc
exec chroot . /bin/bash <<- EOF >dev/console 2>&1
exec $INIT $RUNLEVEL
EOF |
initramfs起動後chroot前の中身
/etc/*
/bin/*
/dev/*
/init
/lib/*
/mnt/
/mnt2
/proc/
/sys/
/sbin/->bin/
/sysroot/boot.sfs
/sysroot/boot/
/usr/bin/*
/usr/lib/* | 実ディスク/dev/hda2の中身
/kernel
/initrd.img
/squash/root.sfs
/squash/usr.sfs
/squash/opt.sfs
/squash/home.sfs
/squash/changed/boot/
/squash/changed/usr/
/squash/changed/opt/
/squash/changed/home / |
とりあえずうごきゃいいってなもんで、そのまんまベタな決め打ちスクリプト。
初めは
(そのためにせっかくビルドしなおした) nashで組もうと頑張っていたのだが、よくわからんので結局bashで済ませた。
なので元はRedHat系のmkinitrdが吐いたスクリプトだったりする。
カレントディレクトリで、
# find . -print | cpio -o --format=newc | gzip > /initrd.img
としてイメージ化。
ちなみに解凍する時は、
# zcat initrd.img | cpio -i
で、カレントに解凍される。
これらを設置してgrubから、
root (hd0,3)
kernel (hd0,1)/vmlinuz-2.6.24-zen
initrd (hd0,1)/initrd.img |
という感じで起動。
その後fstabでドライブ(ここでは/dev/hda2)を/mnt/sysにマウント、rc初期スクリプトの中のfsck処理の後でusr opt home を結合させる。
SFS=/mnt/sys/squash
mount -t squashfs -o loop $SFS/usr.sfs /usr
mount -t squashfs -o loop $SFS/opt.sfs /opt
mount -t squashfs -o loop $SFS/home.sfs /home
mount -t aufs -o br:$SFS/changed/usr=rw:/usr=ro,udba=inotify none /usr
mount -t aufs -o br:$SFS/changed/opt=rw:/opt=ro,udba=inotify none /opt
mount -t aufs -o br:$SFS/changed/home=rw:/home=ro,udba=inotify none /home |
以下、起動後のdf。
chrootしたので、ルートがない。
R.I.P.LinuxのUSBメモリ起動後のdfではルートが見えているんだが、無理やりmtabに書き込んでるとかそんなんではないですわな?initramfsでなくinitrdでpivot_rootだとちゃんと出るのかも?
bash-3.1# df -ahT
Filesystem 1K-blocks Used Available Use% Mounted on
/media tmpfs 505M 0 505M 0% /media
/dev/hda4 ext2 101M 42M 55M 44% /boot
/dev/hda2 xfs 14G 6.2G 7.9G 45% /mnt/sys
/mnt/sys/squash/usr.sfs
squashfs 14G 6.2G 7.9G 45% /usr
/mnt/sys/squash/opt.sfs
squashfs 14G 6.2G 7.9G 45% /opt
/mnt/sys/squash/home.sfs
squashfs 14G 6.2G 7.9G 45% /home
none aufs 14G 6.2G 7.9G 45% /usr
none aufs 14G 6.2G 7.9G 45% /opt
none aufs 14G 6.2G 7.9G 45% /home
/dev/hda3 xfs 23G 9.0G 14G 40% /media/tank
|
パフォーマンスについては総squashfs化で遅くなるかと思いきや、逆に起動関係がかなり速くなった。
負荷は仕様上、当然高くなると思われるがX31では気にならないようだ。
総じて満足満足。
あとはfsckの絡みがちゃんと動くかどうかですな。
その時が来たら対応しよう。
そういえば、今回の作業のためにとそれなりに整備したらカツカツになってしまった、救出/ブートパーティションのシステムも同じような起動方式にしてみたところ、
/dev/hda4 ext2 101M 93M 2.4M 98% /boot
だったのが、
/dev/hda4 ext2 101M 42M 55M 44% /boot
になった。
スゲー。
そろそろHDDをデカくしようかと思っていたのだが、お流れだ。
それはともかく。
長いことギャラリーを更新していないな。
溜まったら溜まったで更新するのが面倒だ。
などと言ってる場合ではない……更新しよう、今度。