gpt4 book ai didi

python - 为什么 shutils 和 df 报告的磁盘大小有几个百分比的差异?

转载 作者:行者123 更新时间:2023-11-28 21:32:18 28 4
gpt4 key购买 nike

我正在编写一个简单的监控脚本,我想在其中添加磁盘空间检查。但是我发现报告的可用空间在系统 dfshutils.disk_usage() 之间是不同的.

在安装了三个磁盘的系统上:

# df / /mnt/2TB1 /mnt/1TB1
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 472437724 231418380 216997128 52% /
/dev/sdb1 1921802520 1712163440 111947020 94% /mnt/2TB1
/dev/sdc1 960380648 347087300 564438888 39% /mnt/1TB1

# python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34)
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import shutil
>>> (t, u, f) = shutil.disk_usage('/')
>>> (t, u, f)
(483776229376, 236973805568, 222203674624)
>>> u/t
0.48984177224594366
>>> (t, u, f) = shutil.disk_usage('/mnt/2TB1')
>>> (t, u, f)
(1967925780480, 1753255362560, 114633748480)
>>> u/t
0.8909153891628782
>>> (t, u, f) = shutil.disk_usage('/mnt/1TB1')
>>> (t, u, f)
(983429783552, 355400192000, 578002624512)
>>> u/t
0.361388477290517

分别是3%、5%和3%。它来自哪里,哪个结果是正确的?

最佳答案

作为ChristiFati已经指出,比率used / total两种工具都相同,但是 Use% df 报告的字段不同于 100 · used / total .

例如,让我们检查 /dev/sda1 的值安装在 / 上.

df.total = 472437724
df.used = 231418380
df.available = 216997128
df.percentage = 52

shutil.total = 483776229376
shutil.used = 236973805568
shutil.free = 222203674624

df.used/df.total = 0.4898 = shutil.free/shutil.total
但是……
df.used/df.total = 0.4898 0.52 = df.percentage/100

source code coreutils 的 df实现阐明了这个问题。 three lines 1171-1173是相关的。 pct是百分比。

uintmax_t u100 = v->used * 100;
uintmax_t nonroot_total = v->used + v->available;
pct = u100 / nonroot_total + (u100 % nonroot_total != 0);

正如我们所见df不计算 used / total但是used / (used + free) .注意 used + free < total .

我怀疑……

total包括为元数据保留的空间,例如哪个文件驻留在文件系统中的位置(取决于文件系统,这可能包括胖表、 inode 等)。由于您不能将该空间用于常规文件,因此空间被排除在 Use% 中通过使用 (used + free)相反,它不包括元数据。

然而,一项测试表明......

这不是完整的故事。以下脚本在 2 MiB 文件中生成 FAT12 和 ext2 文件系统。必须使用 sudo 执行脚本.

#! /bin/bash

check() {
head -c 2MiB /dev/zero > fs
mkfs."$@" fs
mkdir fsmount
mount -o loop fs fsmount
df fsmount
umount fsmount
rm -r fs fsmount
}

echo fat12:
check fat -F 12

echo ext2:
check ext2

我得到了输出

fat12:
[...]
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/loop0 2028 0 2028 0% /tmp/fsmount
ext2:
[...]
Creating filesystem with 2048 1k blocks and 256 inodes
[...]
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/loop0 2011 21 1888 2% /tmp/fsmount

请注意,两种总大小都小于文件系统,在两种情况下均为 2048 KiB = 2 MiB。两个文件系统都没有文件,但对于 ext2 df报告使用了 21 KiB(可能与 this question 有关)。

关于python - 为什么 shutils 和 df 报告的磁盘大小有几个百分比的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56837749/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com