ファイルシステムの凍結
Rev.1を表示中。最新版はこちら。
ファイルシステムの凍結は、ファイルシステム単位で書き込む処理をウエイトさせる。これはデータベース等のバックアップを行う場合、バックアップ処理においてレコードの整合性が失われないように、ファイルシステム単位で書き込みを禁止するものである。以下はその検証を行うサンプル。ここで注意しなければならない事は、凍結するファイルシステムはルートファイルシステムであってはいけない。ファイルへの書き込みを必要とする、システムとして動作しなければならないカーネル処理も、ウエイトされ、一種のデッドロック状態に陥る。(当たり前と言えばあたりまえ)
#include <fcntl.h> #include <sys/ioctl.h> #include <linux/fs.h> #include <stdio.h> #include <string.h> int main(int argc, char* argv[]) { pid_t pid; int i, fid, ret; char* p; p = "fsfreez test\n"; fid = open("/mnt/test/aaa", O_RDWR); ret = ioctl(fid, FIFREEZE, NULL); pid = fork(); if(!pid) { for (i = 0; i < 5; i++) { printf("sleep:%d\n", i); sleep(i); } ret = ioctl(fid, FITHAW, NULL); return 0; } write(fid, p, strlen(p)); printf("writed\n"); close(fid); }ループバックデバイスで、データ用ファイルシステムを作成しマウントする。このファイルシステムに空のファイルaaaを作成する。
[root@localhost test]# dd if=/dev/zero of=disk bs=1M count=10 10+0 レコード入力 10+0 レコード出力 10485760 バイト (10 MB) コピーされました、 0.766505 秒、 13.7 MB/秒 : [root@localhost test]# mkfs.ext3 disk mke2fs 1.41.14 (22-Dec-2010) disk is not a block special device. Proceed anyway? (y,n) y : [root@localhost test]# mount -o loop disk /mnt/test/ [root@localhost test]# touch /mnt/test/aaaサンプルを動作。子プロセスがファイルシステムを解凍するまで、親プロセスのファイル書き込みがウエイトされている事がわかる。
[root@localhost test]# ./fsfreez sleep:0 sleep:1 sleep:2 sleep:3 sleep:4 writed [root@localhost test]# cat /mnt/test/aaa fsfreez test凍結するファイルIDで、ioctlを呼び出しているが、これはそのファイルを凍結するのでなく、このファイルが属しているファイルシステムを凍結することになる。