2011-11-14 97 views
1

我需要測試64位版本的文件IO API(打開,創建統計等)。在這個過程中,我需要創建一個具有64位索引節點的文件,以便測試內部64位數據結構/變量以及API。我如何創建一個64位的inode?如何創建64位inode?

我寫了一個腳本,我嘗試在每個目錄中創建一個包含1024個文件的目錄的嵌套數組。該腳本花費大量時間來執行並突然終止。我無法繼續,有沒有其他辦法可以實現它?

+1

您可以使用[fuse](http://fuse.sourceforge.net/)創建一個文件系統,它可以實現您想要的功能。不知道它是否可能。 – Mat

+0

@Mat:我認爲這是正確的答案,你可能想發佈:編寫你自己的模擬文件系統,它返回一個64位的inode。 –

+0

@JörgWMittag:想要確保在發佈之前它確實可行 - 不知道FUSE是否在內部處理了inode編號。似乎它的工作原理,所以發佈了一個答案。 – Mat

回答

0

您將不得不創建4294967296文件或目錄。

爲了做到這一點,你必須準備好文件系統來爲此留出空間。根據您使用的文件系統,它可能或不可能。 (我只是試圖用ext4文件系統來做這件事,但它不起作用。)

+0

我創建了多個目錄,每個目錄包含1024個文件。這樣做是爲了使「ls」命令毫無問題地工作,否則「ls」將會因爲參數數量而產生問題。 – user1045419

1

您可以使用FUSE來模擬所需的任何inode編號。

查看FUSE附帶的hello_ll.c示例。它創建一個文件系統,其中有一個文件,其索引編號爲2.您可以很容易地修改該文件,以創建具有任意inode編號的文件。

快速測試與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,我知道強迫的「真實」的文件系統索引節點號沒有實際的辦法。


這裏是用來產生一個最低補丁:

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

你可以使用腳本的SystemTap簡單地撞了一個統計調用返回的inode編號。

在ext4的,是這樣的:

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

probe begin { log("starting probe") } 

會做的伎倆(您可能必須調整「21」的偏移,如果ext4_getattr是樹中的不同)。

相關問題