Как уже указывалось 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 & emsp; ≠ & emsp; 0,52 = df.percentage / 100
Исходный код реализации df
coreutils проливает некоторый свет на эту проблему. три строки 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)
, который не включает метаданные.
Однако тест показал, что ...
это не может быть полной историей. Следующий скрипт генерирует файловую систему FAT12 и ext2 внутри файла размером 2 МБ. Сценарий должен быть выполнен с использованием 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 КиБ = 2 МиБ в обоих случаях. Обе файловые системы вообще не имели файлов, но для ext2 df
сообщалось об использовании 21 КиБ (может быть связано с этим вопросом ).