ゼロスピンドル Let's note W2 で Debian 4.0 Etch
http://d.hatena.ne.jp/sa-y/20070629 の続き.
/var/log の tmpfs 化の続き
宿題の答えは「UnionFS*1 を使って /var/log をフラッシュメモリと tmpfs を合成したディレクトリにする」でした.
UnionFS とは?
UnionFS は複数のディレクトリを同じマウントポイントに重ねてマウントできるという便利ファイルシステムです.ファイルを読み込むときは一番上から探していって最初に見付かったファイルが読み込まれ,ファイルを書き込むときには一番上に書き込まれます.書き込みは常に一番上の層に書かれるのでそこだけが rw でマウントされ2層目以下は ro ってことになります*2.
この機能を使ってフラッシュメモリ内の既存のディレクトリやファイルを参照しつつ書き込んだデータは tmpfs に書かせてやれば問題解決です.
UnionFS のインストール
まずモジュールとユーティリティーのインストールします.
% apt-cache search unionfs unionfs-modules-2.6-486 - Unionfs modules for Linux 2.6 on x86 unionfs-modules-2.6-686 - Unionfs modules for Linux 2.6 on PPro/Celeron/PII/PIII/P4 unionfs-modules-2.6-686-bigmem - Unionfs modules for Linux 2.6 on PPro/Celeron/PII/PIII/P4 unionfs-modules-2.6-amd64 - Unionfs modules for Linux 2.6 on AMD64 unionfs-modules-2.6-k7 - Unionfs modules for Linux 2.6 on AMD K7 unionfs-modules-2.6.18-4-486 - Unionfs modules for Linux 2.6.18 on x86 unionfs-modules-2.6.18-4-686 - Unionfs modules for Linux 2.6.18 on PPro/Celeron/PII/PIII/P4 unionfs-modules-2.6.18-4-686-bigmem - Unionfs modules for Linux 2.6.18 on PPro/Celeron/PII/PIII/P4 unionfs-modules-2.6.18-4-amd64 - Unionfs modules for Linux 2.6.18 on AMD64 unionfs-modules-2.6.18-4-k7 - Unionfs modules for Linux 2.6.18 on AMD K7 unionfs-source - Source for the union filesystem unionfs-tools - Tools to manage unionfs filesystems unionfs-utils - Transition package for unionfs-tools rename % apt-get install unionfs-modules-2.6-686 unionfs-tools unionfs-utils
/var/log の UnionFS 化
まず下の層になる部分をフラッシュ上に作ります.
% cd /var % mkdir log.flash % cd log.flash % mkdir fsck news exim4 % ls exim4 fsck news
中身は空のディレクトリを3つだけ. exim4 と news は使わないようにしたので必要ないんだけど一応作っておく.
/var/log.tmpfs に tmpfs をマウントします.
% cd /var % mkdir log.tmpfs % mount -t tmpfs tmpfs /var/log.tmpfs
/var/log を使っているデーモンを停止してさらに tmpfs がマウントされている /var/log をアンマウントします.
% /etc/init.d/acpid stop % /etc/init.d/sysklogd stop % umount /var/log
/var/log.tmpfs と /var/log.flash を /var/log 上で合成します.
% mount -t unionfs -o dirs=/var/log.tmpfs=rw:/var/log.flash=ro unionfs /var/log
確認してみます.
% unionctl --list /var/log /var/log.tmpfs (rw-) /var/log.flash (r--) % ls /var/log exim4 fsck news % touch /var/log/hello.txt % ls /var/log exim4 fsck hello.txt news % ls /var/log.flash exim4 fsck news % ls /var/log.tmpfs hello.txt
問題なさげなので停止していおたデーモンを再起動します.
% /etc/init.d/sysklogd start Starting system log daemon: syslogd % /etc/init.d/acpid start Loading ACPI modules: battery ac processor button fan thermal Starting Advanced Configuration and Power Interface daemon: acpid.
起動時にマウントされるように /etc/fstab の /var/log の部分をを以下のように変更して再起動.
tmpfs /var/log.tmpfs tmpfs defaults 0 0 unionfs /var/log unionfs dirs=/var/log.tmpfs=rw:/var/log.flash=ro 0 0
問題なくマウントできることを確認.
しかしシャットダウンしようとしたら…
umount: /var/log.tmpfs : device is busy faild.
怒られたですよ… /var/log をアンマウントする前に /var/log.tmpfs をアンマウントしようとして失敗しているのかな?シャットダウン時に tmpfs のアンマウントに失敗したとしても実害があるとは思えないけどちょっと気になります.どうしたらいいでしょうかねぇ?
*1:http://en.wikipedia.org/wiki/UnionFS
*2:全部を ro にすることもできます