#qcow2 #qemu #io-uring #async #disk #disk-image #block-size

bin+lib qcow2-rs

用于异步/await 读取/写入 qcow2 图像的库

3 个版本

新版本 0.1.3 2024 年 8 月 17 日
0.1.2 2024 年 3 月 5 日
0.1.1 2024 年 1 月 18 日
0.1.0 2024 年 1 月 18 日

505文件系统

Download history 5/week @ 2024-05-20 4/week @ 2024-05-27 4/week @ 2024-06-03 27/week @ 2024-06-10 6/week @ 2024-06-24 1/week @ 2024-07-01 4/week @ 2024-07-08 3/week @ 2024-07-15 16/week @ 2024-07-22 11/week @ 2024-08-05 328/week @ 2024-08-12

每月 356 次下载
用于 rublk

MIT/Apache 许可

235KB
5.5K SLoC

qcow2-rs

license license

qcow2-rs 中的库用于从 qcow2 图像读取/写入数据,并遵循其功能

  • 异步/await,支持多个 IO 引擎,已在 tokio-uring 上验证,原始 Linux 同步 IO 系统调用,tokio 和 io-uring^3 与 smol^2 运行时

  • 支持直接 IO 和缓冲 IO,对于直接 IO,它需要异步运行时支持,例如 tokio 不允许它。

  • 数据文件、辅助文件和压缩图像上的基本读写功能

  • 以切片方式加载和存储 l2 表和 refcount 块,最小切片大小是块大小,最大大小是集群大小

  • 类似于块设备的接口,最小读写单位与 qcow2 图像的文件系统块大小对齐

  • 跨平台支持,已在 Linux (Fedora/ubuntu)、FreeBSD 和 Windows 上验证

此项目基于来自 rsd^1 的 qcow2 实现

此项目的动机是为了支持 ublk-qcow2^4,但最终它成为了一个通用的异步 qcow2 库。归功于 Rust async/.await,该库设计良好且实现得当,易于扩展(添加新功能、改进等)

此项目包含一个工具,可以转储 qcow2 元数据,显示任何与图像相关的元数据统计信息,检查图像元数据的完整性以及主机集群泄漏,格式化 qcow2 图像并在 qcow2 和原始之间进行转换。

示例


    use qcow2_rs::qcow2_default_params;
    use qcow2_rs::utils::qcow2_setup_dev_uring;
    use qcow2_rs::helpers::Qcow2IoBuf;

    tokio_uring::start(async move {
        let params = Qcow2DevParams::new(9, None, None, false, false);
        let path = std::path::PathBuf::from("test.qcow2");

        // setup one qcow2 device
        let dev = qcow2_setup_dev_uring(&path, &params).await.unwrap();

        // create one slice like & aligned IO buffer
        let mut buf = Qcow2IoBuf::<u8>::new(4096);

        // read 4096 bytes to `buf` from virt offset 0 of `test.qcow2`
        let _ = dev.read_at(&mut buf, 0).await.unwrap();

        // write 4096 bytes from `buf` to virt offset 4096 of `test.qcow2`
        let _ = dev.write_at(&buf, 4096).await.unwrap();

        // flush meta data lazily, which is done in soft update style
        dev.flush_meta().await.unwrap();
    });

测试

  • 要运行内置测试,需要 qemu-img,因此需要安装 qemu-utils(Debian/Ubuntu)或 qemu-img(Fedora、RHEL 等)的软件包

  • 构建 CI 涵盖了 ubuntu 和 windows 上的 'carget test'

许可证

此项目受 MIT 或 Apache 许可证许可。

贡献

欢迎各种贡献!

参考

依赖项

~9–20MB
~269K SLoC