1 个不稳定版本
0.1.0 | 2019年7月14日 |
---|
#9 在 #ecs-architecture
8 个星 & 13 个关注者
6KB
147 行
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许可证2.0版本(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或https://open-source.org.cn/licenses/MIT)
任选其一。
注意,在Linux上,libcryptsetup和libblkid的许可证为LGPL-2.0+。因此,如果您的应用程序不是LGPL-2.0+或GPL,请不要将其静态链接。
贡献
除非您明确声明,否则您根据Apache-2.0许可证定义的,有意提交以包含在作品中的任何贡献,都应双重许可,如上所述,无任何附加条款或条件。
依赖关系
约8MB
约173K SLoC