我們都知道,在Windows中,右鍵單擊一個文件或文件夾,選屬性(Properties)可以看到這個文件或文件夾的大小。而這個大小是文件的原始大小,即邏輯大小(logical size)。即一個1KB的文本文件,通過這種方式,看到的大小就是1KB, 我們這里說的是“size”。
嚴格上來說,Windows上顯示出來的是兩個size,一個叫做“size”,另一個叫做“size on disk”. 此二者的區別,大致如下:Windows在格式化磁盤的時候,會選擇使用什么文件系統來format,並且,同樣的文件系統在格式化的時候也可以指定allocation unit (即cluster)的大小。 這個allocation unit的大小就是文件系統上尋址的最小單位。即假設我們format一塊磁盤的時候,選擇了NTFS,並且選擇了allocation unit的大小是64KB,那么如果我們往這塊盤上放一個1KB的文件,那么同時就會有63KB的空間被浪費掉。這時, 在文件上點右鍵,看屬性,就會發現size是1KB,而size on disk是64KB。
如何查看Windows的某一塊盤的allocation unit是多大呢?
假設我們想看C盤,那么可以使用命令:
fsutil fsinfo ntfsinfo c:
Linux下也可以查看同樣的概念,這個概念在Linux下叫做Sector。
查看所有分區,可以使用命令:
fdisk –l
然而,在有保護的文件系統上,比如Isilon的OneFS,那么文件的大小就有了變化。而且當OneFS上啟用了壓縮功能,那么這個文件的大小如何查看就更是個值得仔細琢磨一下的問題了。
OneFS默認的文件保護等級是2d:1n, 即可以容忍任意兩塊磁盤同時壞掉或者一個節點的丟失。要達到這個保護等級,對於小文件來說就是需要3份拷貝,對於大文件來說就是要增加FEC的數據塊,從而可以計算對丟失的數據進行恢復。那么2d:1n的保護等級會對一個比較大的文件增加多少數據塊呢?說來有點復雜,這取決於Isilon cluster包含多少個節點。具體請看下圖:
看2d:1n的一列,可以看到,集群小的時候每4個數據塊就添加兩個FEC數據塊,集群大的時候可以每16個數據塊添加兩個FEC塊。
說了這么多,現在回到正題,假設我有一個logical size(即原始文件大小)為48MB的文件,假如把它存儲在一個4個節點的2d:1n的Isilon cluster上,那么OneFS會以8*6+8*2= 64MB的空間來存儲這個文件。那么我該使用什么命令來查看從而得到文件的原始大小48MB和實際存儲這個文件所消耗的磁盤空間64MB呢?
在FreeBSD操作系統上,可以通過如下命令來得到:
du –sh
使用這個命令來得到文件或文件夾實際占用的磁盤空間,如果是上文的例子,那么這個命令會得到64MB。(實際上,如果使用du –sk命令的話,得到的會是“文件的數據的大小”,與“inode的三份mirror大小24KB”的和)。
du –Ash
使用這個命令來得到文件或文件夾的logical size,這個命令會得到48MB。
在一台普通的H500上,查看文件大小的命令結果如下:
在開啟了壓縮的環境里,這個差距可能會更大,如下:
===============
Why is There a Big Difference Between ‘Size’ and ‘Size on Disk’?
https://www.howtogeek.com/180369/why-is-there-a-big-difference-between-size-and-size-on-disk/
How can I view the allocation unit size of a NTFS partition in Vista?
HOW TO FIND BLOCK SIZE IN LINUX AND UNIX
https://www.linuxnix.com/find-block-size-linux/
Finding the sector size of a partition
https://unix.stackexchange.com/questions/2668/finding-the-sector-size-of-a-partition