#disk #management #ecs-architecture #experiment #flexible #design

sys pop-os/cryptsetup-sys

Rust 库实验,设计一个具有 ECS 架构的灵活磁盘管理库

1 个不稳定版本

0.1.0 2019 年 6 月 11 日

11#ecs-architecture

8 个星 & 13 个关注者

Apache-2.0/MIT

2KB

ECS 磁盘管理器

这是一个在 Rust 中围绕 ECS 架构创建完整磁盘管理库的实验,为程序提供简单的 API 进行交互。除了作为库之外,它还将作为一个具有 RPC 交互能力的守护进程提供,以便与用其他语言编写的软件或其他不希望将其磁盘管理器链接到其应用程序的软件进行交互。

目标

此项目的目标将是替换 distinst 中的所有复杂磁盘管理逻辑。为了使 distinst 能够与磁盘进行交互,它包含了一个完整的磁盘管理解决方案。然而,这个磁盘管理解决方案过于复杂,难以维护,并且只能处理有限的磁盘配置场景。此外,它还严重依赖于 libarted,它非常慢,并且不能在多线程环境中使用。

作为独立解决方案的库的一个副产品将是开发用 Rust 编写的新的磁盘管理工具的可能性。GParted 已经显得过时,并且缺乏对 Wayland、LVM 和 LUKS 的支持。GNOME 磁盘支持 Wayland、LVM 和 LUKS,但磁盘管理功能有限。基于此的新工具在 Linux 上的潜在用途可能与 Redox OS 上的潜在用途一样有用。

架构

《DiskManager》结构,被称为“世界”,包含三个内部关键字段:`DiskEntities`、`DiskComponents`和`DiskSystems`。当在“世界”中执行`DiskSystem`的`run()`方法时,它会独特地借用自身、`DiskEntities`和`DiskComponents`字段。因此,每个系统都完全控制着“世界”中任何实体和系统的创建、删除和修改。它能够在不使用引用计数的情况下安全地执行,并且具有完全可变的能力。

此实现基于slotmap

初始化世界

为了获取块设备的信息,系统从`/proc/partitions`获取设备信息,然后使用`libblkid`的绑定进行探测,并补充来自内核`/sys/class/block`文件系统的额外信息。LVM支持通过`lvmdbus1` DBus API提供。LUKS支持由绑定到`libcryptsetup`提供。这些都是扫描系统的一部分。

尽管目前仅限于Linux,但有可能添加对其他操作系统的支持。

实体和组件

在“世界”中可能会遇到两种实体:`设备`和`卷组`。设备是系统中的任何可寻址设备,例如回环设备、磁盘、分区和逻辑卷。卷组不能直接被系统寻址;但与LVM物理卷相关联;当激活时,提供逻辑卷作为系统中的可寻址设备。

`DiskEntities`和`DiskComponents`结构都有内部字段来区分这两者。特定于设备的组件位于`components.devices`字段中,而特定于卷组的组件位于`components.vgs`字段中。

`DiskComponents`中还有一个额外的`QueuedChanges`字段,所有组件的修改都排队在此处,并在系统执行期间最终被拉取并应用。这从理论状态分离出实际状态,因此可以干净地应用取消操作,或者在系统执行过程中优雅地处理错误,而无需再次探测系统。

系统

除了扫描系统外,以下系统计划存在于“世界”中,并按以下顺序执行

  1. RemoveSystem:删除设备
  2. ResizeSystem:调整设备大小
  3. CreationSystem:创建设备
  4. ModificationSystem:使用文件系统格式化设备,并更改分区标签

系统方法的好处之一是每个系统都可以安全地并行读取和向世界应用操作。例如,`RemoveSystem`可以同时打开多个设备的分区表,并并行写入所有更改。同样,`ModificationSystem`可以并行格式化所有标记为格式化的分区。

许可证

根据以下任一项获得许可

任选其一。

请注意,在Linux上,libcryptsetup和libblkid的许可证为LGPL-2.0+。因此,如果您的应用程序不是LGPL-2.0+或GPL,则不要将其静态链接。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在作品中的任何贡献,应按上述方式双授权,不附加任何额外条款或条件。

无运行时依赖

~0–2.3MB
~44K SLoC