我需要测试64位版本的文件IO API(打开,创建stat等)。在这个过程中,我需要创建一个具有64位inode的文件,以便测试内部64位数据结构/变量,从而测试API。如何创建64位inode? p>
我编写了一个脚本,我试图创建一个嵌套的目录数组,每个目录中包含1024个文件。该脚本需要花费大量时间来执行并突然终止。我无法继续,有没有其他方法可以实现它?
答案 0 :(得分:2)
您可以使用FUSE来模拟所需的任何inode编号。
查看FUSE附带的hello_ll.c
示例。它创建一个文件系统,其中包含一个inode编号为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之外,我知道在“真实”文件系统上强制使用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);
}
答案 1 :(得分:0)
您必须创建4294967296个文件或目录。
为此,您必须准备好文件系统以获得空间。根据您使用的文件系统,可能会也可能不会。 (我只是尝试使用ext4文件系统,但它没有用。)
答案 2 :(得分:0)
您可以使用systemtap脚本简单地提升状态调用返回的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”偏移量。)