Доступные блоки с `df`

Я использую statvfs для очень простой внутренней команды df.

Помимо того, что я не знаю, как получить путь к устройству файловой системы, моя главная проблема заключается в том, что доступные блоки размером 1 КБ различаются в моей реализации и выводе df.

Вот мой:

Filesystem       1K-blocks            Used       Available           Use%      Mounted on
/dev/x           959863856        21399352       938464504               2      /

df's:

Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda2      959863856 21399352 889636296   3% /

«Использовано» и «Доступно» указаны в 1K-блоках. Процент может быть из-за округления. Как получить доступное место?

Вот моя реализация:

int main(int argc, char *argv[]) {
    struct statvfs stats;
    statvfs(argv[1], &stats);

    unsigned long n_1k_blocks = stats.f_blocks * stats.f_frsize / 1024;
    unsigned long avail = stats.f_bfree * stats.f_frsize / 1024;
    unsigned long used = n_1k_blocks - avail;
    printf("%-*s\t%*lu\t%*lu\t%*lu\t%*.0f\t%s\n", 
        spaces, "/dev/x", 
        spaces, n_1k_blocks,
        spaces, used, 
        spaces, avail,
        spaces, 100 - (float)stats.f_bfree * 100.0 / stats.f_blocks,
        argv[1] // e.g. " / "
    );
    return 0;
}

Я называю это как: ./a.out / для файловой системы, смонтированной в /

Примечание: осмотревшись, я прочитал df source от busybox; coreutils сейчас для меня слишком сложен


person bicup    schedule 27.08.2019    source источник


Ответы (1)


(938464504-889636296)/959863856 = .05

Разница в количестве доступных блоков составляет 5%. Это число, скорее всего, происходит от зарезервированных блоков, т.е. стандартная df исключает зарезервированные блоки из вывода, так как они недоступны для обычных пользователей.

Например, объяснение из mkfs.ext4(8):

-m процент зарезервированных блоков Укажите процент блоков файловой системы, зарезервированных для суперпользователя. Это позволяет избежать фрагментации и позволяет демонам, принадлежащим root, таким как syslogd(8), продолжать работать правильно после того, как непривилегированным процессам будет запрещена запись в файловую систему. Процент по умолчанию составляет 5%.

РЕДАКТИРОВАТЬ: вы должны использовать f_bavail вместо f_bfree, если хотите получить те же результаты, что и стандартная утилита df.

person gudok    schedule 27.08.2019
comment
f_bavail действительно исправляет Доступно, но портит Используемое, которое осталось n_1k_blocks - avail - person bicup; 27.08.2019