Linux 上的 df / fdisk / parted 的 size 是怎么计算的,为什么得到的结果不一样
原谅我的强迫症,但是看着各种显示都不一样着实难受。
先放命令的 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 的空间?
inode bytes dev size7 条回复 • 2021-07-13 11:17:39 +08:00
anzu 1
anzu 20 小时 39 分钟前
再看看 lsblk
generic 2
generic 20 小时 30 分钟前
文件系统除了 inode 还有其它元数据,如 journal, GDT 。
https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout
jaredyam 3
jaredyam 14 小时 59 分钟前
离得近的也可能只是 1k=1024 or 1000 的区别
gyf304 4
gyf304 10 小时 37 分钟前
有挺多原因的
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 9 小时 44 分钟前
df: ext4 分区的**用户可见**容量(不包括系统占用且对用户不可见的容量)
fdisk -l: ext 类型分区的**总**容量(包括系统占用)
parted -l: 跟 fdisk 不一样的是他用的是 GB 不是 GiB
mingl0280 6
mingl0280 9 小时 39 分钟前
另外,不要指望能获得正好 df XXXG 的显示——这个算起来贼坑爹,完全是浪费时间。你非要算的话得手工算出来文件系统有多少 overhead,但是这个数值对于每个分区大小都不太一样。
libook 7
libook 3 小时 24 分钟前
看 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 的数反推分区空间,这个可能跟各个文件系统的标准有关吧,通常没有这种需求,所以也不知道怎么算。