zoukankan      html  css  js  c++  java
  • 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 内我觉得够了。

  • 相关阅读:
    Ext JS学习第三天 我们所熟悉的javascript(二)
    Ext JS学习第二天 我们所熟悉的javascript(一)
    Ext JS学习第十七天 事件机制event(二)
    Ext JS学习第十六天 事件机制event(一)
    Ext JS学习第十五天 Ext基础之 Ext.DomQuery
    Ext JS学习第十四天 Ext基础之 Ext.DomHelper
    Ext JS学习第十三天 Ext基础之 Ext.Element
    Ext JS学习第十天 Ext基础之 扩展原生的javascript对象(二)
    针对错误 “服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF” 的原因分析
    C# 使用HttpWebRequest通过PHP接口 上传文件
  • 原文地址:https://www.cnblogs.com/cool4ever/p/5258228.html
Copyright © 2011-2022 走看看