3 个版本
新版本 0.1.3 | 2024 年 8 月 17 日 |
---|---|
0.1.2 | 2024 年 3 月 5 日 |
0.1.1 | 2024 年 1 月 18 日 |
0.1.0 |
|
505 在 文件系统 中
每月 356 次下载
用于 rublk
235KB
5.5K SLoC
qcow2-rs
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, ¶ms).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