2

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

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

4

3 に答える 3

2

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

hello_ll.cFUSEに付属している例を見てください。iノード番号2の単一ファイルでファイルシステムを作成します。そのファイルを非常に簡単に変更して、任意のiノード番号のファイルを作成できます。

の簡単なテスト0x10000000FFFFFFLはこれを行います:

 $ 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)

FUSE以外に、「実際の」ファイルシステムにiノード番号を強制する実用的な方法はありません。


これを生成するために使用される最小限のパッチは次のとおりです。

--- 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);
 }
于 2011-11-14T12:24:41.980 に答える
0

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

そのためには、ファイル システムにこのためのスペースを用意する必要があります。使用するファイル システムによっては、可能な場合と不可能な場合があります。(ext4ファイルシステムでそうしようとしましたが、うまくいきませんでした。)

于 2011-11-14T11:04:04.157 に答える
0

systemtap スクリプトを使用して、stat 呼び出しによって返される inode 番号を単純に増やすことができます。

ext4 では、次のようになります。

probe kernel.statement("ext4_getattr@fs/ext4/inode.c+21")
{
  $stat->ino = $stat->ino + 4294967295;
}

probe begin { log("starting probe") }

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

于 2013-09-15T16:31:10.120 に答える