1 个不稳定版本
0.1.0 | 2019年6月11日 |
---|
#2 在 #lvm
8 星 & 13 关注者
17KB
414 行
ECS 磁盘管理器
这是一个在 Rust 中围绕 ECS 架构创建完整磁盘管理库的实验,为程序提供简单的 API 以进行交互。除了作为库之外,它还将以守护进程的形式提供带有 RPC 功能,以便与用其他语言编写的软件或不愿将其磁盘管理器链接到应用程序中的软件进行交互。
目标
该项目的主要目标是替换 distinst
中的所有复杂磁盘管理逻辑。为了使 distinst
能够与磁盘进行所需操作,它包含了一个完整的磁盘管理解决方案。然而,这个磁盘管理解决方案过于复杂,难以维护,并且仅处理有限的磁盘配置场景。此外,它严重依赖 libarted
,这是一个非常慢的库,不能在多线程环境中使用。
作为独立解决方案的库的副产品是开发基于 Rust 编写的新的磁盘管理工具的可能性。GParted 正在显示出其过时,并且缺乏对 Wayland、LVM 和 LUKS 的支持。GNOME Disks 支持 Wayland、LVM 和 LUKS,但磁盘管理功能有限。基于此的新工具可能对 Linux 和 Redox OS 都同样有用。
架构
DiskManager
结构体,称为“世界”,包含三个内部关键字段:DiskEntities
、DiskComponents
和 DiskSystems
。当在“世界”中执行 DiskSystem
的 run()
方法时,它会独特地借用自身、DiskEntities
和 DiskComponents
字段。因此,每个系统都可以完全控制世界中任何实体和系统的创建、删除和修改。它能够安全地做到这一点,无需引用计数,并且具有完全可变性。
此实现基于 slotmap。
初始化世界
要获取有关块设备的信息,系统从 /proc/partitions
获取设备信息,然后使用 libblkid
绑定进行探测,并从内核的 /sys/class/block
文件系统中补充额外信息。通过 lvmdbus1
DBus API 提供LVM支持。LUKS支持通过 libcryptsetup
绑定提供。这些都是扫描系统的一部分。
尽管目前是针对Linux的,但可以添加对其他操作系统的支持。
实体和组件
在“世界”中可能会遇到两种类型的实体:设备 和 卷组。设备是系统中的任何可寻址设备,例如循环设备、磁盘、分区和逻辑卷。卷组不能直接被系统寻址;但与LVM物理卷相关联;当激活时,作为系统中的可寻址设备提供逻辑卷。
DiskEntities
和 DiskComponents
结构体都包含内部字段来区分这两种类型。特定于设备的组件位于 components.devices
字段中,而特定于卷组的组件在 components.vgs
中。
DiskComponents
中还有一个额外的 QueuedChanges
字段,所有对组件的修改都排队在此,最终在系统执行期间提取并应用。这将理论状态与实际状态分开,因此可以干净地应用取消操作,或者在系统执行期间优雅地处理错误,而无需再次探测系统。
系统
除了扫描系统之外,以下系统计划在“世界”中存在,并按以下顺序执行
RemoveSystem
:删除设备ResizeSystem
:调整设备大小CreationSystem
:创建设备ModificationSystem
:使用文件系统格式化设备,并更改分区标签
系统方法的好处之一是每个系统都可以安全地在并行中读取并应用到世界中的动作。例如,RemoveSystem
可以同时打开多个设备的分区表,并并行写入所有更改。同样,ModificationSystem
可以并行格式化所有标记为格式化的分区。
许可证
根据以下之一授权
- Apache License,版本 2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
请注意,在Linux上,libcryptsetup 和 libblkid 的许可证为LGPL-2.0+。因此,如果您的应用程序不是LGPL-2.0+ 或 GPL,请不要静态链接它们。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在作品中的任何贡献,应如上双许可,不附加任何额外条款或条件。
依赖关系
~6.5MB
~149K SLoC