轉自http://blog.csdn.net/jakieyoung/article/details/6885418
在linux上格式化一個磁盤分區時,出現如下錯誤
- mke2fs 1.41.12 (17-May-2010)
- mkfs.ext4: inode_size (128) * inodes_count (0) too big for a
- filesystem with 0 blocks, specify higher inode_ratio (-i)
- or lower inode count (-N).
Device Boot Start End Blocks Id System
- v/sdb1 1 121534 976221823+ 5 <span style="color:#ff0000;">Extended</span>
方法fdisk /dev/sdb1 -> d -> n-> p(或者l) ->1(或其他數字)...-> w(寫入)
Device Boot Start End Blocks Id System
- v/sdb1 1 121534 976221823+ 83 Linux
以下轉自http://blog.csdn.net/hunanchenxingyu/article/details/41832639
數據是寶貴的,為了避免我多年的收藏付諸東流,我入一個西部數據 2T 硬盤,趁希捷那貨還能讀取趕緊把數據復制西數這個過來。
這個 2T 硬盤的分區方案就是一個 Ext4 分區,當數據倉庫盤用,於是我就用 GParted 格式化了,結果這一個過程花了差不多 8 分多鍾,而且格式化后就已經使用了差不多 30G,太坑爹了吧。
我第一時間想到是 保留空間,但經過我大膽假設小心求證后,得出結論,這個保留空間依然算在未使用里面的。保留空間意思是給 root 賬戶保留的空間,比如保留空間是 100M,當一個分區用得差不多后,剩下 100M 了,那么普通用戶就無法繼續建立新文件了,提示空間不足了。換到 root 賬戶后,就能繼續使用這 100M。而格式化后這 30G,可是實打實的已經被使用掉。
可以知道這已使用空間是分配給索引區的,就是 inode(不清楚 inode 是什么 Google 去)和日志以及各種 Ext4 需要記錄的信息。不過 30G,也太巨了吧,格式化一次要 8 分鍾,感覺很不好。於是我就去研究一下原理,算不算浪費和有沒有得優化空間。
在 STFW 和 RTFM,格式化了 n 次后,現在我格式化這個 2T 只需要半分鍾,使用空間只占了 700 多 M,感覺良好。
好了,那么是什么原因導致格式化這個 2T 要 8 分鍾,並一下用掉 30G 呢?答案是 inode 數量。在 Linux 的文件系統中,一個文件對應一個 inode。一個 inode 大小現在默認值是 256 字節。當然 256 字節是記錄不了大文件所有數據地址的,於是有間接塊,間接塊就是……呃,總之就是
有多少個 inode 就能存多少個文件,無論文件有多大,而一個 inode 要 256 字節。
而 inode 數量是由格式化程序(這里就是 mkfs.ext4)根據自動算出來的。默認是 16K 一個 inode也就是說,就算你在這個分區全是 16K 小的文件,都有足夠數量的 inode 使用。
但問題是,對於我這種拿來當倉庫用的分區,不可能全是 16K 的文件呀,高清電影和光盤映像都是上 G 的東西了。上面說過,一個文件要 inode,就算這個分區都塞滿了,肯定還有很多 inode 沒被使用,明顯是浪費掉了。
扯了這么多還是在個實際例子吧,就拿我這個 2T 新硬盤為例。格式化時會輸出一些信息
$ sudo mkfs.ext4 -n /dev/sdc1 mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=1 blocks, Stripe width=0 blocks 122101760 inodes, 488378368 blocks 24418918 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=4294967296 14905 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000, 214990848
看到有 122101760 個 inodes 吧,一個 inode 占256字節,那么換算成 M 單位是:(122101760 * 256) / (1024 ** 20 = 29810M,差不多 30G 啊!
警告!警告!嚴重警告! 上面的命令怎么多了個 -n 參數?-n 參數表示模擬運行,但不格式化,這樣可以看不同的格式化參數會有什么效果。如果沒有這個參數,那就真的格式化了。所以對有數據的分區測試時千萬要記得加上-n 參數!下面我都帶上這個參數。
但是運行 mkfs.ext4 需要 root 權限,漏了 -n 太危險,可以用 tune2fs 查看文件系統各種信息。
sudo tune2fs -l /dev/sdc1
找 Inode count 一行。
man 一下 mkfs.ext4,發現有兩個參數可以制定 inode 數量
-i bytes-per-inode:多少個字節一個 inode-N number-of-inodes:直接制定 inode 數量
默認 16k 一個 inode 相當於
sudo mkfs.ext4 -i 16384 -n /dev/sdc
把這個數字加大了就行了,最好是 1024 的倍數。比如 1M,即 1048576 字節。
sudo mkfs.ext4 -i 1048576 -n /dev/sdc
其實在 /etc/mke2fs.conf 定義了一些默認值,可以用 -T 來指定類型,比如 largefile 類型就是 1M 一個 inode,上一個命令相當於
sudo mkfs.ext4 -T largefile -n /dev/sdc
還有一個 largefile4,4M 一個 inode。不過比 largefile 才少了 300M,對於 2T 來說小意思了,沒必要省,萬一小文件過多 inode 不夠呢?
於是
$ sudo mkfs.ext4 -T largefile -n /dev/sdc1 mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=1 blocks, Stripe width=0 blocks 1907840 inodes, 488378368 blocks 24418918 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=4294967296 14905 block groups 32768 blocks per group, 32768 fragments per group 128 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000, 214990848
還有 1907840 個 inode,可以保存 1907840 個文件,真夠了,估計也難用滿。(1907840 * 256) / (1024 ** 2) = 465M, 省出 29810 - 465 = 29345M,29G!十來部高清了。
格式化也只需半分鍾,占用 700M 左右,因為還有日志其它什么的,過度優化沒必要了,控制在 1G 內我覺得夠了。
