我想知道stat命令如何計算文件的塊。我讀了 article,它說:stat命令如何計算文件的塊?
值的st_blocks給出了512字節的塊中的文件的大小。 (這可能小於st_size/512,例如,當文件有空洞時。)值st_blksize爲高效的文件系統I/O提供「首選」塊大小。 (以較小的塊寫入文件可能導致讀取 - 修改 - 重寫效率低下。)
但我無法在我的測試中驗證它。
我的文件系統是ext3。
的dumpe2fs -h的/ dev/sda3上顯示:
...
First block: 0
Block size: 4096
Fragment size: 4096
...
然後我跑
[email protected]:~/Desktop$ stat Email
File: `Email'
Size: 965 Blocks: 8 IO Block: 4096 regular file
Device: 80ah/2058d Inode: 746095 Links: 1
Access: (0644/-rw-r--r--) Uid: (1000/ kent) Gid: (1000/ kent)
Access: 2009-08-11 21:36:36.000000000 +0200
Modify: 2009-08-11 21:36:35.000000000 +0200
Change: 2009-08-11 21:36:35.000000000 +0200
如果此塊是指:有多少塊512字節,這個數字應該是2不8.我認爲,文件系統(io塊)的塊大小是4k。如果fs將得到文件Email,它將從磁盤取得最小4k(8 x 512字節塊),這意味着965/512 + 6 = 8。我不確定猜測是否正確。
另一個測試:
[email protected]:~/Desktop$ stat wxPython-demo-2.8.10.1.tar.bz2
File: `wxPython-demo-2.8.10.1.tar.bz2'
Size: 3605257 Blocks: 7056 IO Block: 4096 regular file
Device: 80ah/2058d Inode: 746210 Links: 1
Access: (0644/-rw-r--r--) Uid: (1000/ kent) Gid: (1000/ kent)
Access: 2009-08-12 21:45:45.000000000 +0200
Modify: 2009-08-12 21:43:46.000000000 +0200
Change: 2009-08-12 21:43:46.000000000 +0200
3605257/512=7041.xx = 7042
按照上述我的猜測,這將是7042 + 6 = 7048但stat結果顯示7056
而在http://www.computerhope.com/unix/stat.htm
從互聯網的另一個例子。我在這裏複製頁面底部的示例:
File: `index.htm'
Size: 17137 Blocks: 40 IO Block: 8192 regular file
Device: 8h/8d Inode: 23161443 Links: 1
Access: (0644/-rw-r--r--) Uid: (17433/comphope) Gid: (32/ www)
Access: 2007-04-03 09:20:18.000000000 -0600
Modify: 2007-04-01 23:13:05.000000000 -0600
Change: 2007-04-02 16:36:21.000000000 -0600
在此示例中,FS塊大小爲8k。我想塊的數量應該是16xN,但它是40.迷路了...
任何人都可以解釋,stat是如何計算Blocks的?
謝謝!
同意。 'st_blocks'只會因歷史原因而被調用。不要認爲它是塊,而是作爲文件使用的磁盤空間量,以512字節爲單位。 512字節是一個方便的單元,因爲它幾乎是任何人使用的最小分配單元。 – mark4o 2009-08-28 14:23:11
感謝您的解釋。幾乎清楚。 但仍有問題。我不確定是否正確理解: st_blocks =(IO塊大小/ 512)*(文件使用了多少個IO塊)。 電子郵件的例子可以這樣解釋:(4096/512)* 1 = 8 wxpython不是。因爲該文件使用了881個IO塊,並且(4096/512)* 881 = 7048不是7056. 而最後一個示例不是: 40甚至不能完全除以16(8192/512).. 是所有系統的「512bytes」一樣嗎? 謝謝 – Kent 2009-08-29 09:38:32