2011-12-11 96 views
0

我正在寫C中的一些軟件,遞歸列出給定目錄中的所有文件,現在我需要解決內部碎片問題。MINIX內部碎片2

我花了很長時間研究這個,發現ext2的內部碎片只發生在最後一個塊中。我知道從理論上的inode號碼你應該能夠得到第一個和最後一個塊地址,但我不知道如何。

我已經調查stat()fcntl()和各種方式。我如何從inode號碼獲取最後的塊地址?

我也想通了,一旦我有最後一個塊,我可以測試一下,看看有多少可用空間是在該塊的地址,這會給我的內部碎片。

我知道有一個get_inode和一個get_block命令,但除此之外不知道!

+0

檢查,如何'filefrag'公用工程。 http://linux.die.net/man/8/filefrag說它使用FIEMAP或FIBMAP - 它是ioctl的 – osgx

+0

謝謝,即時通訊正在尋找現在找到filefrags代碼,看看它是如何做到的... – Charlie

+0

Ollie,它是e2fsprogs的一部分,路徑是'/ misc/filefrag.c'。這個工具是特定於linux的,並且可能不適用於某些FS(支持EXT2/3/4) – osgx

回答

1

我不認爲你可以通過正規系統的磁盤塊的地址得到調用,如stat()。您可能需要在磁盤上找到原始inode(這意味着訪問原始磁盤,並且需要提升權限)並從那裏處理數據。

通常,您會發現文件的直接塊,間接塊,雙重間接塊和三重間接塊。然而,相關的文件系統類型幾乎和渡渡鳥一樣死了(我不認爲我已經看到過這個千年的文件系統類型),所以現在不太可能有什麼幫助。

有可能是一個非標準的系統調用來獲取信息,但我懷疑它。

+0

因此它會是一個巨大的痛苦的屁股?這是我的文檔所說的'3。下一步將是弄清楚如何遍歷所有目錄並訪問每個文件的起始i節點。從這一點開始,您可以識別文件的最後一個塊,並計算出該塊內剩餘的空間。所以也許有人對我說謊! – Charlie

+0

是的,這將是一個龐大的PitA。給定inode,你可以(理論上)通過從磁盤讀取inode本身來找到文件的最後一個塊(因此需要對原始磁盤進行特權訪問)並確定最後一個塊的存儲位置等。_OTOH_,讓我們退後一步...不是文件的大小,模塊化磁盤塊大小,最後一個塊使用的空間量?這不會給你這些塊的磁盤地址 - 但它確實爲你提供了推斷內部碎片所需的信息,不是嗎? –

+0

是的,但我正在努力學位課程規範,我希望我可以改變他們說我們需要做的事情,但我不能:-(我已經花了大約2天的時間看着這個現在,它真的開始風我起來! – Charlie

1

也許你覺得太複雜,但大致的內部碎片應該能夠計算出,如果你的塊大小分割文件大小,並利用模。與稀疏文件或文件持有多少「等信息」(如巨大的ACL或擴展屬性),有可能是一個差 -

但是,如果該文件是一個「典型的一個:」這是唯一有效的。 (我不知道他們存儲在何處,但我能想象,有可能是將它們存儲在最後一個塊,有效(但unnoticedly)減少內部碎片的文件系統。)