#磁盘 #管理 #ecs-架构 #实验 #设计 #灵活

pop-os/cryptsetup

基于Rust的ECS架构设计灵活的磁盘管理库的实验

1个不稳定版本

0.1.0 2019年6月11日

#1142 in 文件系统

8 星级 & 13 关注者

Apache-2.0/MIT

6KB
159 代码行

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` 文件系统的额外信息。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许可定义,有意提交以包含在您的工作中的贡献,将按照上述方式双重许可,不附加任何额外条款或条件。

依赖项

~43KB