NetBSD GSoC 2026 改进 RAIDframe

Hacker News Top 新闻

摘要

这篇文章报道了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 守护进程

Lobsters Hottest

Google Summer of Code 2026 项目报告:对 NetBSD 的 racoon2 IKE 守护进程进行现代化改造,添加符合 RFC 规范的 IKE 分片功能、NAT 穿越支持(NAT-OA 载荷与 NAT-T 地址替换)、IPv6 支持以及单元测试框架,使其成为可靠的 IKEv2/L2TP VPN 服务器。

NetBSD GSoC 2026:测试兼容性 Linux 系统调用

Lobsters Hottest

一份 Google Summer of Code 2026 项目报告详细介绍了使用 Linux Test Project 改进 NetBSD 的 Linux 兼容层测试的努力,包括编译测试、创建包和记录系统调用模拟。

探索NetBSD磁盘标签

Lobsters Hottest

这篇文章通过十六进制编辑和C编程示例,详细介绍了NetBSD 11上BSD磁盘标签的格式、文档来源和结构。

GEFS on OpenBSD: 早期预览版

Hacker News Top

GEFS,一个安全可靠且支持快照的文件系统,其早期预览版已移植到 OpenBSD。该移植版本是实验性的,存在若干问题,但已开放供社区测试。

基于 NetBSD 的研究

Hacker News Top

本 NetBSD 画廊页面重点展示了各类基于该操作系统的学术及工业研究项目,包括 NASA 的卫星 TCP 实验、KAME IPv6/IPsec 项目以及高速网络演示。