我需要測試64位版本的文件IO API(打開,創建統計等)。在這個過程中,我需要創建一個具有64位索引節點的文件,以便測試內部64位數據結構/變量以及API。我如何創建一個64位的inode?如何創建64位inode?
我寫了一個腳本,我嘗試在每個目錄中創建一個包含1024個文件的目錄的嵌套數組。該腳本花費大量時間來執行並突然終止。我無法繼續,有沒有其他辦法可以實現它?
我需要測試64位版本的文件IO API(打開,創建統計等)。在這個過程中,我需要創建一個具有64位索引節點的文件,以便測試內部64位數據結構/變量以及API。我如何創建一個64位的inode?如何創建64位inode?
我寫了一個腳本,我嘗試在每個目錄中創建一個包含1024個文件的目錄的嵌套數組。該腳本花費大量時間來執行並突然終止。我無法繼續,有沒有其他辦法可以實現它?
您將不得不創建4294967296文件或目錄。
爲了做到這一點,你必須準備好文件系統來爲此留出空間。根據您使用的文件系統,它可能或不可能。 (我只是試圖用ext4文件系統來做這件事,但它不起作用。)
我創建了多個目錄,每個目錄包含1024個文件。這樣做是爲了使「ls」命令毫無問題地工作,否則「ls」將會因爲參數數量而產生問題。 – user1045419
您可以使用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);
}
感謝您的快速響應,我檢查了FUSE文檔,並意識到它僅適用於Linux內核。我正在AIX上工作,我需要看看它是如何工作的。 – user1045419
你可以使用腳本的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是樹中的不同)。
您可以使用[fuse](http://fuse.sourceforge.net/)創建一個文件系統,它可以實現您想要的功能。不知道它是否可能。 – Mat
@Mat:我認爲這是正確的答案,你可能想發佈:編寫你自己的模擬文件系統,它返回一個64位的inode。 –
@JörgWMittag:想要確保在發佈之前它確實可行 - 不知道FUSE是否在內部處理了inode編號。似乎它的工作原理,所以發佈了一個答案。 – Mat