ファイルシステムの凍結


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を呼び出しているが、これはそのファイルを凍結するのでなく、このファイルが属しているファイルシステムを凍結することになる。

最終更新 2012/08/25 16:26:15 - north
(2012/08/25 16:26:15 作成)


検索

アクセス数
3589576
最近のコメント
コアダンプファイル - sakaia
list_head構造体 - yocto_no_yomikata
勧告ロックと強制ロック - wataash
LKMからのファイル出力 - 重松 宏昌
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
Adsense
広告情報が設定されていません。