2011-11-14 4 views
1

ファイルIO API(オープン、作成statなど)の64ビットバージョンをテストする必要があります。このプロセスでは、64ビットのinodeを持つファイルを作成して、内部の64ビットのデータ構造/変数がテストされ、APIが作成されるようにする必要があります。 64ビットのiノードを作成するにはどうすればよいですか?64ビットのiノードを作成するには?

私は各ディレクトリに1024個のファイルを含むディレクトリのネストされた配列を作成しようとしているところでスクリプトを書いています。スクリプトは実行に膨大な時間を要し、突然終了します。私は進めることができません、それを達成する他の方法はありますか?

+1

[fuse](http://fuse.sourceforge.net/)でファイルシステムを作成して、必要な処理を行うことができます。しかし、可能かどうかは確かです。 – Mat

+0

@Mat:これは正しい答えだと思います。投稿したいかもしれません.64ビットのinodeを返す独自のモックファイルシステムを作成してください。 –

+0

@JörgWMittag:投稿前に実際に可能であることを確認したかったのですが、FUSEが内部的にiノード番号を処理したかどうかはわかりませんでした。それがうまくいくように思われるので、答えを投稿してください。 – Mat

答えて

0

ファイルまたはディレクトリを4294967296作成する必要があります。

これを実行するには、ファイルシステムを準備する必要があります。使用しているファイルシステムによっては、可能かもしれないし、そうでないかもしれません。 (私はext4ファイルシステムでこれを実行しようとしましたが、機能しませんでした)

+0

私は複数のディレクトリを作成し、各ディレクトリには1024個のファイルが含まれています。これは "ls"コマンドが問題なく動作するように行われました。そうでなければ、 "ls"は数多くの引数に対してベビーベッドになります。 – user1045419

1

FUSEを使用して、任意のiノード番号をシミュレートできます。

FUSEに付属のhello_ll.cの例を見てください。これは、inode番号2を持つ1つのファイルを持つファイルシステムを作成します。あなたは、そのファイルをかなり簡単に変更して、必要なinode番号を持つファイルを作成することができます。

0x10000000FFFFFFLとの簡単なテストがこれを行う:FUSE以外

$ stat fuse/hello 
    File: `fuse/hello' 
    Size: 13   Blocks: 0   IO Block: 4096 regular file 
Device: 11h/17d Inode: 4503599644147711 Links: 1 
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root) 

、私は「本物」のファイルシステム上のinode番号を強制する実用的な方法を知っています。

--- hello_ll.c.orig 2011-11-14 13:22:19.000000000 +0100 
+++ hello_ll.c 2011-11-14 13:20:27.000000000 +0100 
@@ -9,6 +9,7 @@ 
*/ 

#define FUSE_USE_VERSION 26 
+#define MYINO 0x10000000FFFFFFL 

#include <fuse_lowlevel.h> 
#include <stdio.h> 
@@ -31,7 +32,7 @@ 
     stbuf->st_nlink = 2; 
     break; 

- case 2: 
+ case MYINO: 
     stbuf->st_mode = S_IFREG | 0444; 
     stbuf->st_nlink = 1; 
     stbuf->st_size = strlen(hello_str); 
@@ -65,7 +66,7 @@ 
     fuse_reply_err(req, ENOENT); 
    else { 
     memset(&e, 0, sizeof(e)); 
-  e.ino = 2; 
+  e.ino = MYINO; 
     e.attr_timeout = 1.0; 
     e.entry_timeout = 1.0; 
     hello_stat(e.ino, &e.attr); 
@@ -117,7 +118,7 @@ 
     memset(&b, 0, sizeof(b)); 
     dirbuf_add(req, &b, ".", 1); 
     dirbuf_add(req, &b, "..", 1); 
-  dirbuf_add(req, &b, hello_name, 2); 
+  dirbuf_add(req, &b, hello_name, MYINO); 
     reply_buf_limited(req, b.p, b.size, off, size); 
     free(b.p); 
    } 
@@ -126,7 +127,7 @@ 
static void hello_ll_open(fuse_req_t req, fuse_ino_t ino, 
       struct fuse_file_info *fi) 
{ 
- if (ino != 2) 
+ if (ino != MYINO) 
     fuse_reply_err(req, EISDIR); 
    else if ((fi->flags & 3) != O_RDONLY) 
     fuse_reply_err(req, EACCES); 
@@ -139,7 +140,7 @@ 
{ 
    (void) fi; 

- assert(ino == 2); 
+ assert(ino == MYINO); 
    reply_buf_limited(req, hello_str, strlen(hello_str), off, size); 
} 
+0

お返事ありがとうございました。FUSEのドキュメントを確認し、Linuxカーネルでのみ動作することを確認しました。私はAIXに取り組んでいます。私はそれが私のためにどのように機能するか見る必要があります。 – user1045419

0

あなたは単にのstat呼び出しによって返されたiノード番号をつり上げるためにSystemTapのスクリプトを使用することができます。


はここでそれを生成するために使用される最小限のパッチです。 ext4の上で

、のようなもの:

probe kernel.statement("[email protected]/ext4/inode.c+21") 
{ 
    $stat->ino = $stat->ino + 4294967295; 
} 

probe begin { log("starting probe") } 

は、トリックを行うだろう(あなたはext4_getattrがあなたのツリーに異なる場合は「21」、オフセットを調整する必要がある場合があります)。

関連する問題