1 个不稳定版本

0.1.0 2019年6月13日

#10 in #ecs-architecture

8 星 & 13 关注者

Apache-2.0/MIT

10KB
239

ECS 磁盘管理器

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

目标

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

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

架构

DiskManager 结构体,称为“世界”,包含三个内部关键字段:DiskEntitiesDiskComponentsDiskSystems。当在“世界”中执行 DiskSystemrun() 方法时,它唯一地借用了自己、DiskEntitiesDiskComponents 字段。因此,每个系统都完全控制着“世界”中任何实体和系统的创建、删除和修改。它可以安全地进行,无需引用计数,并且具有完全可变性。

此实现基于 slotmap

初始化世界

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

尽管目前是针对 Linux 的,但可以添加对其他操作系统的支持。

实体和组件

目前世界上可能遇到两种类型的实体:设备卷组。设备是系统中的任何可寻址设备,例如回环、磁盘、分区和逻辑卷。卷组不能直接由系统寻址;但与它们相关联有 LVM 物理卷;当激活时,作为系统中的可寻址设备提供逻辑卷。

DiskEntitiesDiskComponents 结构都有内部字段来区分这两种类型。特定于设备的组件位于 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许可证定义,你提交的任何有意包含在作品中的贡献,将以上述方式双许可,不附加任何额外条款或条件。

依赖项

~5MB
~102K SLoC