前回はP-Plamo独自のinitスクリプトの前半、
この部分では書き込み不可なsquashfsをルートファイルシステムとして利用するための作業が中心で、
aufsとは
aufsについては、
aufsはJunjiro Okajima氏が開発しているunion mountの実装で、
Erez Zadok教授のUnion FSは、
aufsについて理解するには、
# modprobe aufs # dmesg | tail aufs 2-standalone.tree-32-20100208
aufsの典型的な使い方として、
% df Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/sda4 27435156 15801396 10240100 61% / none 1557276 192 1557084 1% /dev /media 1557276 0 1557276 0% /media .... /dev/sr0 1632774 1632774 0 100% /cdrom % ls /cdrom ChangeLog initrd isolinux/
/tmpにaufs用の領域を用意し、
# mkdir /tmp/aufs ; chmod 777 /tmp/aufs # mount -t aufs -o br:/tmp/aufs:/cdrom none /cdrom # df Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/sda4 27435156 15803972 10237524 61% / none 1557276 192 1557084 1% /dev /media 1557276 0 1557276 0% /media .... /dev/sr0 1557276 26180 1531096 2% /cdrom none 1557276 26180 1531096 2% /cdrom
この状態で/cdromを見ると、
% ls /cdrom ChangeLog initrd isolinux/
一方、
% touch /cdrom/aufs_test % ls -l /cdrom 合計 6,299,136 -r--r--r-- 1 root root 5,271 3月 28日 23:53 ChangeLog -rw-r--r-- 1 kojima users 0 5月 3日 10:42 aufs_test -r--r--r-- 1 root root 6,291,456 3月 28日 01:47 initrd dr-xr-xr-x 2 root root 2,048 3月 28日 11:13 isolinux/
ChangeLogは本来DVDメディア上に存在する変更不可なファイルですが、
% sudo chmod a+rw /cdrom/ChangeLog パスワード: ***** % emacs /cdrom/ChangeLog ... % ls -l cdrom 合計 6,309,888 -rw-rw-rw- 1 root root 5,305 5月 3日 10:46 ChangeLog -rw-rw-rw- 1 kojima users 5,271 3月 28日 23:53 ChangeLog~ -rw-r--r-- 1 kojima users 0 5月 3日 10:42 aufs_test -r--r--r-- 1 root root 6,291,456 3月 28日 01:47 initrd dr-xr-xr-x 2 root root 2,048 3月 28日 11:13 isolinux/
ファイルの先頭を見ると、
% head /cdrom/ChangeLog -*- text -*- 平成22年5月3日(月) テストの入力 平成22年3月28日(日) ...
また、
% rm /cdrom/ChangeLog % ls -al /cdrom 合計 6,305,792 drwxrwxrwx 5 root root 160 5月 3日 10:57 ./ drwxr-xr-x 26 root root 4,096 4月 30日 13:59 ../ -rw-rw-rw- 1 kojima users 5,271 3月 28日 23:53 ChangeLog~ -rw-r--r-- 1 kojima users 0 5月 3日 10:42 aufs_test -r--r--r-- 1 root root 6,291,456 3月 28日 01:47 initrd dr-xr-xr-x 2 root root 2,048 3月 28日 11:13 isolinux/
この例のように、
% sudo umount /cdrom % df Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/sda4 27435156 15804032 10237464 61% / none 1557276 192 1557084 1% /dev .. /dev/sr0 1632774 1632774 0 100% /cdrom % ls -al /cdrom 合計 6,299,136 -r--r--r-- 1 root root 5,271 3月 28日 23:53 ChangeLog -r--r--r-- 1 root root 6,291,456 3月 28日 01:47 initrd dr-xr-xr-x 2 root root 2,048 3月 28日 11:13 isolinux/
aufsに書き込まれたデータは、
% ls -al /tmp/aufs/ 合計 8,192 drwxrwxrwx 4 root root 160 5月 3日 10:57 ./ drwxrwxrwt 15 root root 660 5月 3日 11:00 ../ -r--r--r-- 2 root root 0 5月 3日 10:38 .wh..wh.aufs drwx------ 2 root root 40 5月 3日 10:38 .wh..wh.orph/ drwx------ 2 root root 40 5月 3日 10:38 .wh..wh.plnk/ -r--r--r-- 2 root root 0 5月 3日 10:38 .wh.ChangeLog -rw-rw-rw- 1 kojima users 5,271 3月 28日 23:53 ChangeLog~ -rw-r--r-- 1 kojima users 0 5月 3日 10:42 aufs_test
今回はROメディアを例に用いましたが、
initスクリプトの解説(後半)
それではP-Plamoのinitスクリプトの後半部分を紹介していきましょう。実のところ、
なお、
以下の行番号はgrep -v "^#" init | uniq | cat -nという処理で採番しています。
72 losetup /dev/loop0 /cdrom/isolinux/rootimg.squash
73 mount -t squashfs /cdrom/isolinux/rootimg.squash /loop
74
見つかったsquashfsのイメージをloopback形式で /loop にマウントしています。この結果、
75 mount -t tmpfs none /loop/tmp
76
77 mkdir -p /loop/tmp/ow/var
78 mount -t aufs -o br:/loop/tmp/ow/var:/loop/var none /loop/var
79 mkdir -p /loop/tmp/ow/usr
80 mount -t aufs -o br:/loop/tmp/ow/usr:/loop/usr none /loop/usr
81
squashfsを書き込み可能にするための作業領域として/loop/
77~78行目は/var、
82 mkdir -p /loop/tmp/lib/firmware
83 mount -t aufs -o br:/loop/tmp/lib/firmware:/loop/lib/firmware none /loop/lib/firmware
84
85 firm_chk=`ls /lib/firmware | wc -l`
86 if [ $firm_chk -gt 0 ] ; then
87 echo "copying /lib/firmware to /loop/lib/firmware"
88 cp -a /lib/firmware/* /loop/lib/firmware
89 fi
90
P-Plamoでは、
91 mkdir -p /loop/tmp/ow/etc
92 mount -t aufs -o br:/loop/tmp/ow/etc:/loop/etc none /loop/etc
93 echo "copyinng modified rc.S and rc.M to /etc/rc.d/"
94 cp /etc/rc.S.modified /loop/etc/rc.d/rc.S
95 cp /etc/rc.M.modified /loop/etc/rc.d/rc.M
96 cp /etc/rc.4.modified /loop/etc/rc.d/rc.4
97 cp /etc/rc.6.modified /loop/etc/rc.d/rc.6
98 cp /etc/csh.login /loop/etc/csh.login
99 cp /etc/rc.keymap /loop/etc/rc.d/rc.keymap
100 cp /etc/modprobe.conf /loop/etc/modprobe.conf
101 chmod -x /loop/etc/rc.d/init.d/wnn.r
102
103 for i in inittab fstab passwd shadow ; do
104 echo "copying modified $i to /etc/$i"
105 cp /etc/$i /loop/etc/$i
106 done
107
P-Plamoでは、
たとえば、
rc.
squashfsはファイルシステムの圧縮処理にかなり時間がかかるため、
101行目はかな漢字変換システムWnnの起動スクリプトを実行しないようにする処理で、
108 mkdir -p /loop/tmp/ow/home
109 mount -t aufs -o br:/loop/tmp/ow/home:/loop/home none /loop/home
110
ユーザのホームディレクトリを書き込み可能にする操作です。P-Plamoではdemoというデモ用のユーザしか登録していないので、
111 mkdir -p /loop/dev
112 mount -t tmpfs tmpfs /loop/dev
113 cp -a /dev/console /loop/dev
114
デバイスファイル用の領域を書き込み可能にし、
なお、
115 echo "CD_DEV:$CD_DEV"
116 echo $CD_DEV > /loop/etc/cd_dev
起動されたDVD/
117 mount --bind /proc /loop/proc
118 mount --bind /sys /loop/sys
119
現在使っている/procや/sysファイルシステムを新しいルートファイルシステム上に引き継ぐために、
120 echo "pivot_root to /loop"
121 sleep 5
122 cd /loop
123 /bin/pivot_root . loop
124 exec chroot . /loop/sbin/init
125
以上で/loop上にマウントしたsquashfsをルートファイルシステムにするために必要な作業が終ったので、
一方、
この時点で、