我已经尝试了几天了,但仍然无法弄清楚如何使用 python 脚本获得 HDD 驱动器的正确大小。我的硬盘是1Tb。据我所知,以 Gb 为单位,大约为 1000Gb,以 GiB 为单位,大约为 931GiB。当我在终端中输入时,lsblk
它显示:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 931,5G 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
└─sda2 8:2 0 931G 0 part /
好的。然后我尝试lshw --class disk
它也显示 931GiB:
*-disk
description: ATA Disk
product: ST1000LM035-1RK1
physical id: 0.0.0
bus info: scsi@0:0.0.0
logical name: /dev/sda
version: SDM2
serial: WDEWEKZF
size: 931GiB (1TB)
capabilities: gpt-1.00 partitioned partitioned:gpt
configuration: ansiversion=5 guid=f166251c-436c-421f-aba8-9910d76f9fab logicalsectorsize=512 sectorsize=4096
然后我尝试通过 python 脚本获取大小:
total, used, free, percent = disk_usage('/')
print(f"Total: {total}")
print(f"Used: {used}")
print(f"Free: {free}")
total2, used2, free2, percent2 = disk_usage('/boot/efi')
print(f"Total: {total2}")
print(f"Used: {used2}")
print(f"Free: {free2}")
输出:
Total: 982900588544
Used: 118413897728
Free: 814486605824
Total: 535805952
Used: 5484544
Free: 530321408
982900588544 / 1024 / 1024 / 1024 = 915 GiB。
535805952 = 500 MiB。
df
命令显示:
Filesystem 1K-blocks Used Available Use% Mounted on
udev 8092080 0 8092080 0% /dev
tmpfs 1627768 1712 1626056 1% /run
/dev/sda2 959863856 115646148 795389500 13% /
tmpfs 8138832 12368 8126464 1% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 8138832 0 8138832 0% /sys/fs/cgroup
/dev/sda1 523248 5356 517892 2% /boot/efi
tmpfs 1627764 24 1627740 1% /run/user/1000
所有 1K 块的总和就是 1Tb。
那么,另外 931 - 915 = 16 GiB 的 HDD 空间在哪里?以及如何以正确的方式获得尺寸? Linux 薄荷 20.1 x64
谢谢。
答案1
如果是 ext4,则文件系统元数据(主要是索引节点表)丢失的大小。例如,这里有一个 /home 分区。
- 分区大小为 751619276800 字节 (
sudo /sbin/blockdev --getsize64 /dev/mapper/Watt-home
) - “df”大小为 739691814912 (
df --block-size=1 /home
) - 索引节点计数为 45875200 (
df -i /home
) - ext4 上的索引节点为 256 字节。
所以如果你算一下,(751619276800-739691814912-(45875200*256))/1024^2 ≈ 175MiB。这是文件系统元数据的其余部分(超级块等)。
为了确保这是正确的,请与使用较低 inode 比率初始化的文件系统进行比较 — 一种方法是使用-T largefile
or-T largefile4
选项(请参阅/etc/mke2fs.conf
参考资料 的可能性)。我这里有一个:
- 分区大小:429496729600
- df 大小:429229522944
- 索引节点:409600
请注意 df 大小与分区大小的接近程度(超过 99.9%)。那是因为 inode 少得多。如果你再做一次数学计算,(429496729600-429229522944-(409600*256))/1024^2 ≈ 155MiB。
请记住,在 ext4 上,inode 的数量是您可以拥有的文件数量的硬性限制。它(或者更确切地说,每 N 个块 1 个 inode 的比率)也在 mkfs 中设置一次并且无法更改。但是,如果您知道一个文件系统仅用于存储大文件,则可以通过减少 inode 来节省一些空间,就像我在第二个文件系统上所做的那样。
您可以在内核源代码中看到减去的开销:https://elixir.bootlin.com/linux/latest/source/fs/ext4/super.c#L6095- 还有一个minixdf
挂载选项的存在可以阻止它这样做,也许还会造成更多奇怪的事情。我没有检查,我找到的关于它的唯一文档是他们试图将其删除,但当人们抱怨时保留它。
顺便说一句:除了索引节点表等的开销之外,通常还会保留 5% 的空间,通常用于根目录。这不会从总大小中减去,但会从可用空间中减去。您可以更改此金额tune2fs -m
;其他选项允许您改为按块计数指定 ( -r
) 并更改哪个用户 ( -u
) 或组 ( -g
) 可以使用保留空间。好处之一是,即使用户填满了一个分区,系统管理员也有一些空间可用于恢复。
注意:ext2/ext3 使用 128 字节 inode,大小的一半。小文件系统仍然如此。您实际上可以使用以下选项将其设置为 mkfs 时间-I
;有关注意事项,请参阅 mkfs.ext4 联机帮助页(我不建议更改为 128)。
答案2
它被文件系统本身用来记录所有文件结构的隐藏内部数据丢失。您正在使用的工具不会显示它,因此显示为丢失。