日記ブログ、または雑多なメモ
2008年3月23日

aufs RAM起動 @ X31 再整備





 まず「udba=inotify」のオプションは今の使い方では特に意味がなく、パフォーマンスに悪影響があるだけなことに気がついたので、削除。 squashfsを合体させるときはroよりrrの方がパフォーマンスが良いらしいのでこれも変更。 さらにvmwareを酷使したりなんたりすると デカいファイルを書き込み終了直後、aufsが死亡することがあるのでinitramfs内でのマウントポイントを変えてみたりしたがやはり死亡するときはする模様。 うーむ。

 なるべくaufs死亡の被害度を減らすためrootは完全にRAM起動オンリーにしてみる。 そうなるとブロックデバイスが無いからかmount --move できない。 結局chrootするのになぜmount --move をする(kernelのドキュメントによる) のかはよく理解していないのだが、まあできないんだから仕方がないので、とりあえずただ単にchrootだけさせる。 ついでにchroot前に不要になったinitramfs内を掃除。

ーその後、gcc-4.3をgcc-4.2.3に戻し、glibcとkernelをビルドしなおしてみたらaufsが死ななくなった。 気がする。

init改
#!/bin/bash
PATH=/bin:/sbin
mount -t proc /proc /proc
mount -t sysfs /sys /sys
ROOT=/dev/hda2
HDDROOT=mnt
SFSROOT=mnt2
NEWROOT=sysroot/root

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
mkdir $HDDROOT $NEWROOT
mount $ROOT $HDDROOT
pushd $HDDROOT/squash
if [ ! -e "root.sfs.old" ] ; then
 if [ -e "root.sfs.new" ] ; then
  mv root.sfs root.sfs.old
  mv root.sfs.new root.sfs
  mv -f changed/root changed/root.old
  mv -f changed/var changed/var.old
  mv -f changed/etc changed/etc.old
  mkdir changed/root changed/var changed/etc
 fi
fi
popd
mount -t squashfs -o loop $HDDROOT/squash/root.sfs $SFSROOT
cp -ar $SFSROOT/* $NEWROOT
umount $SFSROOT
umount $HDDROOT
echo Pivot root
cd $NEWROOT
umount /proc /sys
./lib/ld-linux.so.2 --library-path ./lib ./bin/rm -rf \
 /lib /bin /sbin /etc /usr /dev /mnt
exec ./lib/ld-linux.so.2 --library-path ./lib \
 ./bin/chroot . ./bin/bash <<- EOF >dev/console 2>&1
exec $INIT $RUNLEVEL
EOF
echo Chroot failed.
exit


initramfs起動後chroot前の中身
/etc/*
/bin/*
/dev/*
/init #スクリプト
/lib/*
/mnt  #HDD読み出し用マウントポイント
/mnt2 #root.sfsマウントポイント
/proc/
/sys/
/sbin/->bin/
/sysroot #tmpfsマウントポイント
/sysroot/root/ #新ルート
/usr/lib/*
実ディスク/dev/hda2の中身
/kernel
/initrd.img
/squash/root.sfs
/squash/usr.sfs
/squash/opt.sfs
/squash/home.sfs
/squash/changed/usr/
/squash/changed/opt/
/squash/changed/home
/
/squash/changed/etc/
/squash/changed/var/

/etc/rc.d/rc.S内でusr home opt 合体マウント。 単純重ね合わせでvar etc も追加
#### Mount aufs dirs
SFS=/mnt/sys/squash
for i in `echo "usr opt home"` ;
do
 if [ ! -e "$SFS/$i.sfs.old" ] ;then
  if [ -e "$SFS/$i.sfs.new" ] ;then
   mv $SFS/$i.sfs $SFS/$i.sfs.old
   mv $SFS/$i.sfs.new $SFS/$i.sfs
   mv -f $SFS/changed/$i $SFS/changed/$i.old
   mkdir $SFS/changed/$i
  fi
 fi
 mount -t squashfs -o loop $SFS/$i.sfs /$i
 mount -t aufs -o br:$SFS/changed/$i=rw:/$i=rr none /$i
done
mount -t aufs -o br:$SFS/changed/var=rw:/var=ro none /var
mount -t aufs -o br:$SFS/changed/etc=rw:/etc=ro none /etc

 それにしても完全にRAM起動だとさすがに起動が速い。 root.sfs(展開後150M)のRAMへのコピー時間も含めて55秒で起動した。 それはともかくaufsが死亡するのは、なんとかせんと実用できない。 ……といいつつ今さら普通の状態に戻すのは大変なので、そのまま使用中。 ちょうどムービーのレンダリングをしているためにデカいデータを扱うのでよく死亡して困る。


 すでに「aufs RAM起動」になっていないことに今気がついた。


コメント欄
(投稿なし)

コメントなどありましたらこちらからどうぞ
名前
内容
 ※名前、内容ともに入力必須です
- C'sGallery Blogっぽく見えるシステム3.2 -
小武 (管理人) eta2@tim.hi-ho.ne.jp