1 个不稳定版本
0.1.0 | 2019年6月10日 |
---|
#8 在 #ecs-architecture
8 个星标 & 13 个关注者
15KB
374 代码行
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
文件系统的额外信息。通过 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 或 http://opensource.org/licenses/MIT)
根据您的选择。
请注意,在Linux上,libcryptsetup和libblkid采用LGPL-2.0+许可。因此,如果您的应用程序不是LGPL-2.0+或GPL,请勿静态链接它们。
贡献
除非您明确声明,否则任何按照Apache-2.0许可定义提交给作品并由您有意包含的贡献,将以上双许可,不附加任何额外条款或条件。
依赖关系
~6.5MB
~152K SLoC