2011-11-14 3 views
1

64 비트 버전의 파일 IO API (오픈, 스탯 생성 등)를 테스트해야합니다. 이 과정에서 64 비트 inode를 가진 파일을 만들어 내부 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 예제를 살펴보십시오. 그것은 inode 번호가 2 인 단일 파일을 가진 파일 시스템을 생성합니다. 원하는 파일 번호로 파일을 생성하기 위해 파일을 쉽게 수정할 수 있습니다. 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

당신의 빠른 응답을위한 Thanks Mat, FUSE 문서를 확인하고 리눅스 커널에서만 작동한다는 것을 알았습니다. 저는 AIX에서 일하고 있습니다. 어떻게 작동하는지 알아야합니다. – user1045419

0

당신은 단순히 합계 호출에 의해 반환 된 아이 노드 번호를 충돌하는 SystemTap의 스크립트를 사용할 수 있습니다


여기에 그것을 생산하는 데 최소한의 패치입니다. 같은

에서 ext4에

, 뭔가 :

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

probe begin { log("starting probe") } 

트릭을 할 것입니다 (당신이 조정해야 할 수도 "(21)"ext4_getattr이 트리에서 다른 경우, 오프셋).

관련 문제