2022/02/24

[Rust][libc]statvfsを呼び出してdiskの使用量などを計測する

rust

概要

mountされているdiskの容量が圧迫してきたらアラートを出すようにしたく、以前はstack driverなどを使って使用量が特定のバイト数を超えたらアラートを出すみたいな設定を行なっていましたが
stack driverだと痒いところに手が届かない感じがあり(例えば、diskを拡張したら、アラートの閾値を逐一修正しなくてはいけなかったり等)
せっかくなので、rustのアプリケーションでモニタリングしてアラートを飛ばすようにしました。

その際に Rustから statvfsというシステムコールを呼び出して、結果をもとに解析を行いアラートを飛ばすようにしました。

以下は、statvfsをRustから呼ぶ部分を備忘録として記載しておきます。

実装

[dependencies]
libc = "0.2"
use std::{ffi, mem, os::unix::ffi::OsStrExt, path};

fn main() {
    let mount_point = path::PathBuf::from("/bitcoin/.bitcoin");
    let c_mount_point = ffi::CString::new(mount_point.as_os_str().as_bytes()).unwrap();
    let mut statvfs = mem::MaybeUninit::<libc::statvfs>::uninit();
    unsafe {
        let code = libc::statvfs(c_mount_point.as_ptr(), statvfs.as_mut_ptr());
        assert!(code == 0);
        let statvfs = statvfs.assume_init();
        println!("f_bsize: {}", statvfs.f_bsize);
        println!("f_frsize: {}", statvfs.f_frsize);
        println!("f_blocks: {}", statvfs.f_blocks);
        println!("f_bfree: {}", statvfs.f_bfree);
        println!("f_bavail: {}", statvfs.f_bavail);
        println!("f_files: {}", statvfs.f_files);
        println!("f_ffree: {}", statvfs.f_ffree);
        println!("f_favail: {}", statvfs.f_favail);
        println!("f_fsid: {}", statvfs.f_fsid);
        println!("f_flag: {}", statvfs.f_flag);
        println!("f_namemax: {}", statvfs.f_namemax);
    }
}

結果の戻り値のf_bavailf_blocksなどから空き容量などを計算して、利用しました。

参考

以上です。