V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
SSang
V2EX  ›  Linux

Linux 上的 df / fdisk / parted 的 size 是怎么计算的,为什么得到的结果不一样

  •  
  •   SSang · 2021-07-12 17:33:24 +08:00 · 2281 次点击
    这是一个创建于 990 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原谅我的强迫症,但是看着各种显示都不一样着实难受。

    先放命令的 result

    # df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sdb1       511M  7.9M  504M   2% /boot/efi
    /dev/sdb2       457G  129G  306G  30% /
    
    # fdisk -l
    /dev/sdb1     2048   1050623   1048576   512M EFI System
    /dev/sdb2  1050624 976771071 975720448 465.3G Linux filesystem
    
    # parted -l
    Number  Start   End    Size   File system  Name  Flags
     1      1049kB  538MB  537MB  fat32              boot, esp
     2      538MB   500GB  500GB  ext4
    

    居然三个命令得到 3 个结果 “457G/465.3G/500G”,( parted 不是很熟就没仔细验证了)


    一开始我以为是进制转换问题,于是 df 用 Bytes 输出

    # df -B1
    Filesystem         1B-blocks          Used     Available Use% Mounted on
    /dev/sdb2       490652508160  142457827328  323199463424  31% /
    
    975,720,448 * 512bytes = 499,568,869,376 
    
    499,568,869,376 - 490,652,508,160 = 8,916,361,216
    

    也就是说 df 和 fdisk 查出来的 size 相差了 8,916,361,216 bytes

    怀疑是 Inode 消耗,于是查 Inode 占用

    # tune2fs -l /dev/sdb2 | grep -E "Inode count|Inode size"
    Inode count:              30498816
    Inode size:               256
    

    用 Inode count * Inode size 得到 30,498,816 * 256 = 7,807,696,896 bytes

    算下来还差 8,916,361,216 - 7,807,696,896 = 1,108,664,320 bytes

    迷惑了,还有什么地方会占用吗?


    另问:为了在 df -h 获得正好 450G 的显示,我应该为他分配多少 bytes 的空间?

    13 条回复    2021-07-24 13:18:53 +08:00
    anzu
        1
    anzu  
       2021-07-12 18:02:25 +08:00
    再看看 lsblk
    generic
        2
    generic  
       2021-07-12 18:11:42 +08:00
    文件系统除了 inode 还有其它元数据,如 journal, GDT 。
    https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout
    jaredyam
        3
    jaredyam  
       2021-07-12 23:42:24 +08:00
    离得近的也可能只是 1k=1024 or 1000 的区别
    gyf304
        4
    gyf304  
       2021-07-13 04:04:16 +08:00
    有挺多原因的
    1. 分区大小和文件系统占用空间不一定相同,分区 1T 文件系统可以只用前 500G 见 `man resize2fs`

    ```
    The resize2fs program does not manipulate the size of partitions. If you wish to enlarge a
    filesystem, you must make sure you can expand the size of the underlying partition first.
    This can be done using fdisk(8) by deleting the partition and recreating it with a larger
    size or using lvextend(8), if you're using the logical volume manager lvm(8). When recreat‐
    ing the partition, make sure you create it with the same starting disk cylinder as before!
    Otherwise, the resize operation will certainly not work, and you may lose your entire
    filesystem. After running fdisk(8), run resize2fs to resize the ext2 filesystem to use all
    of the space in the newly enlarged partition.
    ```

    2. ext4 默认有 5% 的 reserve
    3. 如上面说的,各种元数据
    4. 可能部分文件系统支持的 quota 也有可能影响
    mingl0280
        5
    mingl0280  
       2021-07-13 04:58:01 +08:00
    df: ext4 分区的**用户可见**容量(不包括系统占用且对用户不可见的容量)
    fdisk -l: ext 类型分区的**总**容量(包括系统占用)
    parted -l: 跟 fdisk 不一样的是他用的是 GB 不是 GiB
    mingl0280
        6
    mingl0280  
       2021-07-13 05:03:02 +08:00
    另外,不要指望能获得正好 df XXXG 的显示——这个算起来贼坑爹,完全是浪费时间。你非要算的话得手工算出来文件系统有多少 overhead,但是这个数值对于每个分区大小都不太一样。
    libook
        7
    libook  
       2021-07-13 11:17:39 +08:00
    看 parted 的手册,
    https://www.gnu.org/software/parted/manual/parted.html
    2.4.14 小结表明进率用的 1000,如果是 1024 应该用 GiB 单位(但这个貌似也没有统一)。

    fdisk 、parted 看的是分区大小,df 看的是文件系统大小,分区里除了文件系统以外还需要额外的空间来存放其他必要信息,所以实际分区会比文件系统更大。

    (这段可能需要求证)如果不是磁盘上最前面的分区的话,fdisk 可能会小于 parted,因为 fdisk 是比较精确的,会从分区实际开始的地方算,而 parted 可能是从前一个分区结束的地方开始算,但实际上分区只能以扇区为最小单位,如果前一个分区的结束位置在扇区中间,那么扇区剩下的部分是无法被后面的分区利用的,也就是说后面分区实际的起点是下一个扇区的开头。

    所以引导分区做为第一个分区,的空间计算比较明确了,512*1024*1024/1000/1000≈537 。

    至于用 df 的数反推分区空间,这个可能跟各个文件系统的标准有关吧,通常没有这种需求,所以也不知道怎么算。
    mingl0280
        8
    mingl0280  
       2021-07-14 08:58:15 +08:00 via Android
    @libook 不正确,parted 也是从分区开始算的。
    libook
        9
    libook  
       2021-07-14 09:35:49 +08:00 via Android
    @mingl0280 嗯,那误差可能就只是因为 parted 四舍五入到整数位了。
    SSang
        10
    SSang  
    OP
       2021-07-14 10:10:02 +08:00
    @mingl0280 @libook 感谢,大致看了一下,感觉算下来应该是个类阶梯函数,确实太难算了,我决定还是不要强迫症了
    SSang
        11
    SSang  
    OP
       2021-07-14 10:12:13 +08:00
    只是看各个云服务商给的系统盘 df 出来都是整数 40G/50G/200G 这样的,感觉挺神奇的,就很好奇他们是怎么算出来的
    mingl0280
        12
    mingl0280  
       2021-07-16 22:49:20 +08:00
    @SSang 因为他们用的底层存储系统不一样,他们那个相当于虚拟盘基础上单独加分区,那个可以算。
    GoodRui
        13
    GoodRui  
       2021-07-24 13:18:53 +08:00 via iPhone
    其实我很想知道,为什么网站上的代码块里写的代码,为啥字体、高亮配色都看着这么舒服,我用的 Mac,为啥找不到一个好的终端能,不求别的,就要求简约明晰,方便阅读...关键字能高亮...有没有大佬指点下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1386 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 23:40 · PVG 07:40 · LAX 16:40 · JFK 19:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.