NetBSD GSoC 2026 改进 RAIDframe
摘要
这篇文章报道了Google Summer of Code 2026年在NetBSD中改进RAIDframe的工作,包括实现用于多磁盘镜像的N-way RAID 1和添加RAID scrubbing支持。
暂无内容
查看缓存全文
缓存时间: 2026/08/24 16:51
# NetBSD 博客
来源:https://blog.netbsd.org/tnf/entry/gsoc2026_raidframe
## Google Summer of Code 2026 报告:改进 RAIDframe(https://blog.netbsd.org/tnf/entry/gsoc2026_raidframe)
2026年8月23日 由*Leonardo Taccari*发布
本报告由 Emmanuel Nyarko 作为 Google Summer of Code 2026 项目的一部分撰写。
独立磁盘冗余阵列(RAID)是由卡内基梅隆大学开发的磁盘管理框架。NetBSD 使用 RAIDframe 作为其磁盘管理模块之一。它涉及设置多个磁盘并从中创建一个磁盘单元。当前的 NetBSD RAIDframe 框架支持在单个阵列中配置多种磁盘排列级别,详见 raid(4)(https://man.netbsd.org/raid.4)。
NetBSD 的 RAIDframe 支持 RAID 级别 0、1、5 和 6。然而,存在一些限制,本项目旨在进行改进。首先,RAID 级别 1(也称为镜像)仅允许在单个镜像对中使用两个磁盘。其次,RAIDframe 的数据清洗功能(涉及读取磁盘以检查读取故障)尚未得到支持。第三,RAID 级别 6 虽然包含在源代码中,但未经充分测试,不鼓励使用。
在本项目中,我致力于:
- 实现名为 **N-way RAID 1** 的 RAID 级别 1 扩展,以支持在 RAIDframe 镜像中使用多个磁盘
- 实现 **RAID 数据清洗**
## N-way RAID 1
RAID 级别 1 涉及将包含相同数据的两个磁盘进行镜像。它们被构建为一个主磁盘和一个校验(辅助)磁盘。对 raid 设备的每次写入都会写入设置中所有活动的磁盘。对 raid 设备的每次读取都会从 I/O 队列最短(对磁盘的写入/读取队列)的磁盘读取。如果遇到任何磁盘故障,则会以降级模式读取,即从任何可用磁盘获取数据。如果所有磁盘都故障,则 I/O 中止。
在 RAID 1 设置中引入了一种称为 N-way RAID1 的新扩展。这涉及在 RAID 1 阵列设置中配置两个以上的磁盘,其中包含一个主磁盘和多个辅助磁盘。这增加了冗余性,提高了对可能导致数据丢失的磁盘故障的数据安全性。
例如,在五路 RAID1 设置中,将包含一个主磁盘和 4 个校验/辅助磁盘。因此,每次磁盘写入将尝试写入所有五个磁盘。每次磁盘读取将尝试从主磁盘或 I/O 队列最短的辅助磁盘读取。
### 使用方法
可以使用以下命令通过 raidctl(8)(https://man.netbsd.org/raidctl.8)配置五个磁盘,形成 5 路 RAID 1 设置以实现冗余:
``
raidctl /dev/raid1 create N /dev/dk1 /dev/dk2 /dev/dk3 /dev/dk4 /dev/dk5.
``
其中 `/dev/raid1` 是 raid 设备的设备文件,`N` 是级别。在磁盘顺序中,第一个列出的被认为是主磁盘,其余被认为是辅助磁盘。
`/dev/dk*` 是用于独立磁盘的 NetBSD 磁盘分区(wedge)驱动程序,详见 dk(4)(https://man.netbsd.org/dk.4)和 dkctl(8)(https://man.netbsd.org/dkctl.8)。
默认情况下,此设置将条带单元设为 128 个扇区,采用先进先出排队算法,最大队列长度为 100。
这可以类似地转换为以下设置中的 `raid.conf` 结构。
``
# numrow numcol numspare
1 5 0
# 识别物理磁盘
START disks
/dev/dk1
/dev/dk2
/dev/dk3
/dev/dk4
/dev/dk5
# 布局很简单 - 每条带 64 个扇区
START layout
# Sect/StripeUnit StripeUnit/ParityUnit StripeUnit/#ReconUnit RaidLevel
128 1 1 N
# 无备用盘
START spare
START queue
fifo 100
``
### 项目交付成果
#### RAIDframe 布局
为 RAIDframe 级别 `N` 引入了新的布局结构。主磁盘数量保持为 1。校验/辅助磁盘数量变为磁盘数减 1。RAID 1 的其余布局组件(与条带相关的属性)保持不变,因此被纳入 RAID `N`。
#### 扇区/条带映射
当前 RAID 1 的设计涉及 ASM(地址条带映射)结构,其中包含 PDA(物理磁盘地址),用于将 RAID 级别软件地址映射到物理磁盘地址。PDA 结构包含列号、起始扇区、扇区/块数、设置中的磁盘类型(数据/校验磁盘)、数据缓冲区指针,以及对应于物理磁盘地址的虚拟 RAID 地址。对于涉及两个磁盘的简单 RAID 1 镜像,写入或读取根据 `raid.conf` 中 `SectorsPerStripeUnit` 设置的值或使用 raidctl(8)(https://man.netbsd.org/raidctl.8)时的默认值 128,条带化到两个磁盘。因此,128 个扇区的块根据 PDA 的定义写入每个条带。
对于 RAID 1 设置中的两个磁盘,单个条带写入由每个列的一个 PDA 定义。为了引入 N-way RAID 1,PDA 的数量无法在编译时确定。PDA 的数量在运行时由校验列的数量动态定义。这是因为,在 N-way 设置中,辅助磁盘的数量可以变化,而 RAID 1 已知有一个主磁盘和一个辅助磁盘。
#### DAG 执行
RAIDframe 使用 DAG(有向无环图)来触发用于读取和写入的 I/O 节点。这些 DAG 节点也依赖于 PDA。DAG 节点创建结构也需要更新,以适应使用 RAID 级别 `N` 时超过两个 PDA 的情况。
#### 重建
RAIDframe 的重建已更新,为 RAID 级别 `N` 腾出空间。当磁盘故障时,当前算法会识别一个未故障的磁盘,从该磁盘读取数据并写入正在重建的磁盘。代码中已添加了针对 RAID N 的新检查,以确保只从未故障的一个磁盘读取到正在重建的磁盘。这避免了在重建过程中随机地跨磁盘阵列进行读写。
#### 项目效益
该项目为您的磁盘数据管理增加了更多冗余性,降低了在任何磁盘故障情况下数据丢失的风险。
工作链接(https://github.com/Emmankoko/altq_refactoring_gsoc/commit/4550afba69fe38ca9407f76d5a7289e3c43d69c2)
## RAIDframe 数据清洗
数据清洗的实现是对磁盘阵列中所有组件的磁盘扇区进行健康检查。跨每个组件的所有条带读取磁盘扇区,I/O 返回在每个组件上遇到的读取失败次数。NetBSD 支持所有 RAID 级别的磁盘数据清洗。
使用 `raidctl` 可以在 raid 设备上启动数据清洗。可以清洗磁盘的特定部分或整个阵列中的磁盘。
### 使用方法
RAID 数据清洗通过以下语法实现:
``
raidctl $device scrub percentage $start_percentage $end_percentage
``
考虑一个有 100 条带的三磁盘 raid 5 阵列:
``
raidctl raid5 scrub percentage 20 30
```
这会启动对 RAID 组件的数据清洗,从所有组件的第二十个百分位开始到第三十个百分位结束。上述命令将读取的条带索引在数学上由以下 `$start_stripe` 和 `$end_stripe` 范围表示:
``
$start_stripe = 100 * 20 / 100 = 20
$end_stripe = 100 * 30 / 100 = 30
$end_stripe = $end_stripe - 1
```
这会从条带索引 20 读取磁盘到条带索引 29。
### 成功清洗后的结果/内核输出
``
raid5: Total number of read failures on Component /dev/dk1: 10
raid5: Total number of read failures on Component /dev/dk2: 4
raid5: Total number of read failures on Component /dev/dk3: 0
```
### 解释
这表明 `dk1` 上有 10 次读取失败,`dk2` 上有 4 次读取失败,`dk3` 上有 0 次读取失败。
省略百分比参数将清洗整个阵列(100%)。
``
raidctl raid5 scrub
```
**注意**:`end_stripe` 减少了 1,因为条带索引从 0 开始。
工作链接(https://github.com/Emmankoko/altq_refactoring_gsoc/commit/36a34a5b416bb10cd5ea84dd24057b7c8a02681f)
## 测试
测试这些改进涉及设置不同磁盘大小的 N-way RAID 1 布局。一个 2GB 的三路 RAID 1 设备和一个 10GB 的五路 RAID 1 被分别配置并用于测试。执行诸如创建文件系统、挂载、卸载、写入原始字节、组件故障、重建、添加热备件、就地重建等操作作为此测试的一部分。这样做是为了提供对使用 N-way RAID 1 和其他 RAIDframe 子系统的信心。
## 未来工作
作为测试的一部分,必须验证其他 RAID 级别(例如 RAID 级别 0、1 和 5),以确保它们未受到新变更的不利影响。将进一步评估和测试 RAID 级别 6。RAID `N` 工作可能会合并到 NetBSD 代码树中,作为现有 RAID1 的替代。
## 经验教训
参与 NetBSD 的 Google Summer of Code 非常有意义。我积累了关于内核多线程的大量经验,并对存储系统的运作方式有了更深入的了解。我鼓励任何想要更深入理解计算机系统的人考虑参与 NetBSD 的 Google Summer of Code 项目。
## 致谢
我衷心感谢我的导师 Greg Oster 和 NetBSD 社区为完成此项目提供的巨大支持。
\[1 条评论 (https://blog.netbsd.org/tnf/entry/gsoc2026_raidframe#comments)\]
相似文章
改进和稳定 NetBSD 中的 racoon2 IKE 守护进程
Google Summer of Code 2026 项目报告:对 NetBSD 的 racoon2 IKE 守护进程进行现代化改造,添加符合 RFC 规范的 IKE 分片功能、NAT 穿越支持(NAT-OA 载荷与 NAT-T 地址替换)、IPv6 支持以及单元测试框架,使其成为可靠的 IKEv2/L2TP VPN 服务器。
NetBSD GSoC 2026:测试兼容性 Linux 系统调用
一份 Google Summer of Code 2026 项目报告详细介绍了使用 Linux Test Project 改进 NetBSD 的 Linux 兼容层测试的努力,包括编译测试、创建包和记录系统调用模拟。
探索NetBSD磁盘标签
这篇文章通过十六进制编辑和C编程示例,详细介绍了NetBSD 11上BSD磁盘标签的格式、文档来源和结构。
GEFS on OpenBSD: 早期预览版
GEFS,一个安全可靠且支持快照的文件系统,其早期预览版已移植到 OpenBSD。该移植版本是实验性的,存在若干问题,但已开放供社区测试。
基于 NetBSD 的研究
本 NetBSD 画廊页面重点展示了各类基于该操作系统的学术及工业研究项目,包括 NASA 的卫星 TCP 实验、KAME IPv6/IPsec 项目以及高速网络演示。