рассчитать процент использования диска для соответствия df Use% output - PullRequest
3 голосов
/ 30 октября 2019

Я пытаюсь рассчитать и отобразить в процентах текущее использование диска с помощью:

use nix::sys::statvfs::statvfs;

macro_rules! cast {
    ($x:expr) => {
        u64::from($x)
    };
}

fn main() {
    let stat = statvfs("/var/db".as_bytes()).unwrap();
    // f_frsize
    // let total_space = cast!(stat.fragment_size()) * cast!(stat.blocks());
    // let avail_space = cast!(stat.fragment_size()) * cast!(stat.blocks_available());
    // f_bsize
    let total_space = cast!(stat.block_size()) * cast!(stat.blocks());
    let avail_space = cast!(stat.block_size()) * cast!(stat.blocks_available());
    let used = total_space - avail_space;
    let usage = used * 100 / total_space;
    println!("total: {}", total_space);
    println!("avail: {}", avail_space);
    println!("used:  {}", used);
    println!("use%:  {}%", usage);
}

Выходные данные моей текущей тестовой системы:

total: 6779424768
avail: 3697811456
used:  3081613312
use%:  45%

Выходные данные df -B 1 /var/db

# df -B 1 /var/db
Filesystem      1B-blocks       Used  Available Use% Mounted on
/dev/loop3     6779424768 2713636864 3697811456  43% /var/db

Used поле не соответствует 2713636864 Я вычисляю его, выполнив 6779424768-3697811456 = 3081613312

Вывод df -h /var/db:

# df -h /var/db
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop3      6.4G  2.6G  3.5G  43% /var/db

Iкажется, что я что-то упускаю, вероятно, преобразование единиц, я уже пытался использовать f_frsize вместо f_bsize и результат все тот же, код выше возвращает 45 и df 43.

Есть идеи?

...