为什么我的 HDD 总空间小于 931 GiB?

Roy*_*non 9 linux size hard-disk

我已经尝试了几天,但仍然无法弄清楚如何使用 python 脚本获得正确的 HDD 驱动器大小。\n我的 HDD 是 1Tb。据我所知,以 Gb 为单位,它是 1000Gb,以 GiB 为单位,大约是 931GiB。\n当我在终端中输入时,lsblk它会显示以下内容:

\n
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT\nsda      8:0    0 931,5G  0 disk \n\xe2\x94\x9c\xe2\x94\x80sda1   8:1    0   512M  0 part /boot/efi\n\xe2\x94\x94\xe2\x94\x80sda2   8:2    0   931G  0 part /\n
Run Code Online (Sandbox Code Playgroud)\n

好的。然后我尝试lshw --class disk它也显示 931GiB:

\n
*-disk                    \n       description: ATA Disk\n       product: ST1000LM035-1RK1\n       physical id: 0.0.0\n       bus info: scsi@0:0.0.0\n       logical name: /dev/sda\n       version: SDM2\n       serial: WDEWEKZF\n       size: 931GiB (1TB)\n       capabilities: gpt-1.00 partitioned partitioned:gpt\n       configuration: ansiversion=5 guid=f166251c-436c-421f-aba8-9910d76f9fab logicalsectorsize=512 sectorsize=4096\n
Run Code Online (Sandbox Code Playgroud)\n

然后我尝试通过 python 脚本获取大小:

\n
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT\nsda      8:0    0 931,5G  0 disk \n\xe2\x94\x9c\xe2\x94\x80sda1   8:1    0   512M  0 part /boot/efi\n\xe2\x94\x94\xe2\x94\x80sda2   8:2    0   931G  0 part /\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
Total: 982900588544\nUsed: 118413897728\nFree: 814486605824\n\nTotal: 535805952\nUsed: 5484544\nFree: 530321408\n
Run Code Online (Sandbox Code Playgroud)\n

982900588544 / 1024 / 1024 / 1024 = 915 GiB。

\n

535805952 = 500 MiB。

\n

df命令显示:

\n
Filesystem     1K-blocks      Used Available Use% Mounted on\nudev             8092080         0   8092080   0% /dev\ntmpfs            1627768      1712   1626056   1% /run\n/dev/sda2      959863856 115646148 795389500  13% /\ntmpfs            8138832     12368   8126464   1% /dev/shm\ntmpfs               5120         4      5116   1% /run/lock\ntmpfs            8138832         0   8138832   0% /sys/fs/cgroup\n/dev/sda1         523248      5356    517892   2% /boot/efi\ntmpfs            1627764        24   1627740   1% /run/user/1000\n
Run Code Online (Sandbox Code Playgroud)\n

所有 1K 块的总和就是 1Tb。

\n

那么,另外 931 - 915 = 16 GiB 的 HDD 空间在哪里?\n如何以正确的方式获取该大小?\nLinux Mint 20.1 x64

\n

谢谢。

\n

der*_*ert 18

如果是 ext4,则文件系统元数据(主要是索引节点表)丢失的大小。例如,这里有一个 /home 分区。

\n
    \n
  • 分区大小为 751619276800 字节 ( sudo /sbin/blockdev --getsize64 /dev/mapper/Watt-home)
  • \n
  • “df”大小为 739691814912 ( df --block-size=1 /home)
  • \n
  • 索引节点计数为 45875200 ( df -i /home)
  • \n
  • ext4 上的索引节点为 256 字节。
  • \n
\n

所以如果你算一下,(751619276800-739691814912-(45875200*256))/1024^2 \xe2\x89\x88 175MiB。这是文件系统元数据的其余部分(超级块等)。

\n

为了确保这是正确的,请与使用较低 inode 比率 \xe2\x80\x94 初始化的文件系统进行比较,一种方法是使用-T largefileor-T largefile4选项(请参阅/etc/mke2fs.conf参考资料 的可能性)。我这里有一个:

\n
    \n
  • 分区大小:429496729600
  • \n
  • df 大小:429229522944
  • \n
  • 索引节点:409600
  • \n
\n

请注意 df 大小与分区大小的接近程度(超过 99.9%)。那是因为 inode 少得多。如果你再做一次数学计算,(429496729600-429229522944-(409600*256))/1024^2 \xe2\x89\x88 155MiB。

\n

请记住,在 ext4 上,inode 的数量是您可以拥有的文件数量的硬性限制。它(或者更确切地说,每 N 个块 1 个 inode 的比率)也在 mkfs 中设置一次并且无法更改。但是,如果您知道一个文件系统仅用于存储大文件,则可以通过减少 inode 来节省一些空间,就像我在第二个文件系统上所做的那样。

\n

您可以在内核源代码中看到减去的开销:https://elixir.bootlin.com/linux/latest/source/fs/ext4/super.c#L6095 \xe2\x80\x94 并且还存在minixdfmount 选项将阻止它这样做,并且可能还会造成更多奇怪的事情。我没有检查,我找到的关于它的唯一文档是他们试图将其删除,但当人们抱怨时保留它。

\n

顺便说一句:除了索引节点表等的开销之外,通常还会保留 5% 的空间,通常用于根目录。这不会从总大小中减去,但会从可用空间中减去。您可以更改此金额tune2fs -m;其他选项允许您通过块计数来指定 ( -r) 并更改哪个用户 ( -u) 或组 (-g ) 可以使用保留空间。好处之一是,即使用户填满了一个分区,系统管理员也有一些空间可用于恢复。

\n

注意:ext2/ext3 使用 128 字节 inode,大小的一半。小文件系统仍然如此。您实际上可以使用以下命令将其设置为 mkfs 时间-I;有关注意事项,请参阅 mkfs.ext4 联机帮助页(我不建议更改为 128)。

\n