日記ブログ、または雑多なメモ
見栄子LINEスタンプ
広告

 バックアップ方面をどうするか色々考えた末、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をデカくしようかと思っていたのだが、お流れだ。



 それはともかく。 長いことギャラリーを更新していないな。 溜まったら溜まったで更新するのが面倒だ。 などと言ってる場合ではない……更新しよう、今度。
- C'sGallery Blogっぽく見えるシステム3.2 -
小武 (管理人) eta2@tim.hi-ho.ne.jp