1

C 言語を使用して、ext2 イメージ内の特定の i ノード (その番号を使用) にアクセスしたいと考えています。open() システムコールで ext2 イメージを開き、inode に到達するまで、適切なオフセットで lseek() を使用してトラバースすることで、これを実行しようとしています。これは正しいです?それとも私は何か間違ったことをしていますか?open() の使用が正しいのか、それともこれを行うためのより適切な関数があるのか​​、少し混乱しています。

int fd = open("ext2fs.img", O_RDONLY);
assert(fd != -1);


off_t startPosition = lseek(fd, 0, SEEK_CUR);
assert(startPosition != -1);

inode に到達するまで、startPosition にオフセットを追加する必要がありますか? しかし、特定の inode を検索するにはどうすればよいでしょうか?

UPDATED(より具体的に)

私はすでに ext2 ファイル システム ( http://www.nongnu.org/ext2-doc/ext2.html ) のレイアウトを持っています。これにより、必要なすべて (すべてのオフセット) が得られます。そして、メタデータとデータを操作する C プログラムを作成する必要があります。たとえば、ファイルの削除とコピーのように。

何をすべきかはわかっていますが、それを実装するのに問題があります。

例: 自分が何をしているかを理解しているかどうかをテストするために、教授から提供された ext2 ディスク イメージの空き inode の数を読み取ろうとしています。

#define SUPER_BLOCK 1024

int main()
{
    int freeInodes;

    int fd = open("path.img", O_RDONLY);
    off_t startPosition = lseek(fd, 0, SEEK_CUR);

    lseek(fd, startPosition + SUPER_BLOCK + 16, SEEK_CUR);
    read(fd, freeInodes, 4);
    printf("Number of free inodes: %d", freeInodes);
}

私が受け取る出力は次のとおりです。「空き inode の数: 32767」

read() から取得したデータを正しく解釈していますか? 受け取ったこの値が正しいかどうかはわかりません。

4

2 に答える 2

1

ファイル システム イメージの生の読み取りを試すことができますfsck.ext{2,3,4}。ただし、inode ビットマップの場所を特定するには、ext{2,3,4} レイアウト、ディスク上の構造、およびマジック ナンバー (ビットマップ/その他のメタデータを指すディスク上のオフセット) に関する広範な知識が必要です。ディスクで開始します。

于 2014-11-20T02:06:39.527 に答える
1

ファイル システムのセキュリティを回避する場合を除いて、inode によるアクセスを実際に使用するケースはありません。Linux では、debugfsそれを行うことができます。絶対必要だと思われる場合は、debugfs のソース コードを試してください。

ファイル ツリー ウォーク (ftw()/nftw() ) からの stat() 呼び出しをコールバックとして使用するか、または stat() + scandir() を直接使用してコーディングを高速化することを検討してください。どちらの方法でも、stat へのアクセス許可を持つファイルのすべての inode を取得できます。そしてオープンか何か。

于 2014-11-20T00:58:13.900 に答える