mkfs.ext4出錯


 

轉自http://blog.csdn.net/jakieyoung/article/details/6885418

在linux上格式化一個磁盤分區時,出現如下錯誤 

root@debian:~# mkfs.ext4 /dev/sdb1  
  1. mke2fs 1.41.12 (17-May-2010)  
  2. mkfs.ext4: inode_size (128) * inodes_count (0) too big for a  
  3.     filesystem with 0 blocks, specify higher inode_ratio (-i)  
  4.     or lower inode count (-N).  
使用fdisk查看分區類型為Extended

 Device Boot      Start         End      Blocks   Id  System  

  1. v/sdb1               1      121534   976221823+   5  <span style="color:#ff0000;">Extended</span>  
先刪掉這個分區,然后再添加一個logical或者primary的分區

方法fdisk /dev/sdb1 -> d -> n-> p(或者l) ->1(或其他數字)...-> w(寫入)

 Device Boot      Start         End      Blocks   Id  System  

  1. 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 內我覺得夠了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM