Я пытаюсь рассчитать и отобразить в процентах текущее использование диска с помощью:
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
.
Есть идеи?