2013年4月16日 星期二

ext4 filesystem VS stat command.

這篇文章我不知道要如何命名比較恰當 , 主要會使用 mkfs.ext4 和 stat 這兩個utility 所以就簡單命名了 !!

在 embedded system 中 nand flash space 是很寶貴的 , 不能太浪費 !!
需求來了, 我需要計算要放入的資料大小(包含一堆目錄)然後建立一個 剛剛好大小的 image file , 這個 image file 需要包含 ext4 filesystem ,量產時只要將這個 image file 直接燒錄到eMMC 對應的partition 中即可.

問題是.... 現在我每次都計算部準確 .... 常常 空間不足夠 , 又不能浪費一堆空間 (這個是純資料 , Device 會使用 mount -o r ..... read-only type , 所以浪費的也用不到 !! )

先說 stat 吧 !!

stat 可以將檔案 , 資料夾所需要的 block & size都列印出來 , 指令如下:

  STAT="/bin/stat"
   size=`${STAT} -c%s $1`
   block=`${STAT} -c%b $1
`


也可以利用 stat 來知道是檔案還是資料夾

${STAT} ${dir_list} | grep -q "directory"
    if [ $? != 0 ];then
##        echo "###### FileStatus ${dir_list}"
        FileStatus ${dir_list}
    else
##        echo "###### DirectStatus ${dir_list}"
        DirectStatus ${dir_list}
        if [ DIRECT_COUNT != 0 ];then
            let DIRECT_COUNT=DIRECT_COUNT-1
        fi
    fi


然後用 shell file 計算所有資料夾需要的 size 和 block count .

這邊要注意 , ext2/ext4 的 block size 有 1024/2048 & 4096 區分 .
一樣會有內部斷裂問題 (小於 block size會使用一個 block 去儲存) .

stat -c%b 回應的值是 disk 的最小block 單位 目前都是 512 bytes.
或者可以用 stat -c%B 去讀取 確定的大小值 .
我寫了一個 xstat.sh shell scrip 去計算所有資料的大小 , 如下:

example :

[jeff@instant ec910-sdk]$ ./build/xstat.sh src/
file count:145
folder count:7
file size:2055196
folder size:94208
total need block:603
[jeff@instant ec910-sdk]$



這個 shell 統計出 需要 603 個 block 也就是需要 603 * 4096 bytes.


ext4 filesystem structure:



沒有留言:

張貼留言