日記帳

日記です。

ゼロスピンドル 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 にすることもできます