Ubuntu 26.04 使用 mdadm 组建四盘软件 RAID0(软 RAID)完整实战:磁盘清理、ext4 格式化、UUID 自动挂载及 YABS/fio 性能测试

📅 2026/8/2 4:13:23
Ubuntu 26.04 使用 mdadm 组建四盘软件 RAID0(软 RAID)完整实战:磁盘清理、ext4 格式化、UUID 自动挂载及 YABS/fio 性能测试
Ubuntu 26.04 使用 mdadm 组建四盘 RAID0UUID 自动挂载与 fio 性能测试本文记录在 Ubuntu 26.04 LTS 中使用4块4TB机械硬盘创建软件 RAID0 的完整过程包括检查磁盘及 SMART 状态清除各分区的文件系统签名清除整盘分区表创建 GPT 分区和 RAID0格式化为 ext4使用文件系统 UUID 自动挂载到/data配置 mdadm 开机自动组装使用 YABS 测试混合读写性能使用 fio 手动测试顺序读写性能一、环境说明服务器磁盘情况如下NAME SIZE MODEL 用途 sda 3.6T HGST HUS726T4TAL RAID0成员盘 sdb 3.6T HGST HUS726T4TAL RAID0成员盘 sdc 3.6T HGST HUS726T4TAL RAID0成员盘 sdd 3.6T HGST HUS726T4TAL RAID0成员盘 nvme0n1 476.9G WDC CL SN720 SDAQNTW-512G-2000 系统盘最终配置RAID设备/dev/md0 RAID级别RAID0 成员数量4 条带大小512KiB 文件系统ext4 挂载目录/data 阵列容量14.55TiB约16TBRAID0没有任何数据冗余。任意一块成员盘损坏都可能导致整个阵列的数据丢失。重要数据必须另行备份。本文中的清除和格式化命令会破坏目标磁盘上的原有文件执行前必须确认磁盘名称避免误操作系统盘。二、安装所需工具aptupdateaptinstall-ymdadmpartedsmartmontools fiocurlsysstat主要工具作用如下mdadm创建和管理 Linux 软件 RAIDparted创建 GPT 分区表和磁盘分区smartmontools读取硬盘 SMART 健康信息fio测试磁盘 I/O 性能curl下载 YABS 脚本sysstat提供iostat等磁盘监控命令三、确认目标磁盘首先查看磁盘型号、容量和序列号lsblk-d-oNAME,SIZE,MODEL,SERIAL本次确认的4块成员盘为/dev/sda V6HE7H9S /dev/sdb V6GP92NS /dev/sdc V6GN81KS /dev/sdd V6H483LS系统盘为/dev/nvme0n1后续任何清除、分区和 RAID 创建命令都不能包含系统盘。继续查看磁盘原有文件系统和挂载状态lsblk-oNAME,SIZE,TYPE,FSTYPE,UUID,MOUNTPOINTS如果目标磁盘原来有分区处于挂载状态需要先停止使用并卸载。例如umount/dev/sda1如果提示设备正忙可以查看占用进程fuser-vm/dev/sda1如果磁盘原来属于其他 RAID、LVM、LUKS 或被用作 Swap也必须先停止或停用对应设备。四、检查机械硬盘 SMART 状态创建 RAID0 前建议先检查成员盘健康状态fordiskin/dev/sda /dev/sdb /dev/sdc /dev/sdd;doecho$disksmartctl-H$disksmartctl-A$disk|grep-EReallocated_Sector|Current_Pending_Sector|Offline_Uncorrectable|Power_On_Hoursdone重点关注SMART overall-health应为PASSEDReallocated_Sector_Ct最好为0Current_Pending_Sector应为0Offline_Uncorrectable应为0本次4块硬盘以上关键项目均为0SMART总体状态为PASSED。SMART正常不代表硬盘绝对不会损坏特别是 RAID0 没有容错因此仍然需要独立备份。五、清除原文件系统签名和整盘分区表这里采用的是“快速逻辑清空”不会对整块硬盘执行全盘写零。它会清除文件系统签名旧 RAID 签名LVM、LUKS 等可识别签名GPT、MBR 分区表原来的文件将无法正常访问但未被新数据覆盖前仍可能被专业工具恢复。5.1 清除各分区的文件系统签名先自动找出4块磁盘上的现有分区再清除分区签名fordiskin/dev/sda /dev/sdb /dev/sdc /dev/sdd;dowhileread-rpart;doecho清除分区签名$partwipefs-a$partdone(lsblk-lnpoNAME,TYPE$disk|awk$2 part {print $1})donewipefs -a只清除文件系统、RAID、LVM等结构的识别签名不会像全盘写零一样覆盖所有数据扇区。如果磁盘没有分区这一步不会产生实际操作。5.2 清除整盘分区表接着清除整盘上的 GPT、MBR 等分区表签名fordiskin/dev/sda /dev/sdb /dev/sdc /dev/sdd;doecho清除整盘分区表$diskwipefs-a$diskdone让内核重新读取磁盘状态partprobe udevadm settle检查lsblk-oNAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS此时4块硬盘应当没有分区、文件系统和挂载点。还可以使用只读方式检查是否存在可识别签名fordiskin/dev/sda /dev/sdb /dev/sdc /dev/sdd;doecho$diskwipefs-n$diskdonewipefs -n只检查不执行修改。六、创建 GPT 分区为每块硬盘创建 GPT 分区表并建立一个占满整盘的 RAID 分区fordiskin/dev/sda /dev/sdb /dev/sdc /dev/sdd;doparted-s$diskmklabel gptparted-s$diskmkpart primary 1MiB100%parted-s$diskset1raid ondone从1MiB开始分区可以保证常见硬盘扇区和 RAID 条带对齐。重新读取分区表partprobe udevadm settle检查结果lsblk-oNAME,SIZE,TYPE,FSTYPE,PARTTYPENAME预期结构如下sda └─sda1 Linux RAID sdb └─sdb1 Linux RAID sdc └─sdc1 Linux RAID sdd └─sdd1 Linux RAID七、创建 RAID0使用4个分区创建/dev/md0条带大小设置为512KiBmdadm--create/dev/md0\--level0\--raid-devices4\--chunk512K\/dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1参数说明--level0创建 RAID0--raid-devices4使用4个成员设备--chunk512K单盘条带块大小为512KiB/dev/sda1/dev/sdd1阵列成员分区如果出现确认提示确认设备无误后输入yesRAID0不需要像 RAID1、RAID5 那样执行数据同步因此创建后即可使用。检查阵列cat/proc/mdstatmdadm--detail/dev/md0正常状态应包含Raid Level : raid0 State : clean Active Devices : 4 Working Devices : 4 Failed Devices : 0 Chunk Size : 512K本次创建后的容量为14.55TiB约16.00TB八、配置 mdadm 开机自动组装先查看阵列扫描结果mdadm--detail--scan输出类似ARRAY /dev/md0 metadata1.2 UUIDb035c5fe:8a7777ad:d579eb19:364caa63备份现有配置cp-a/etc/mdadm/mdadm.conf\/etc/mdadm/mdadm.conf.bak.$(date%Y%m%d-%H%M%S)将/dev/md0的阵列信息写入配置并避免重复添加ARRAY_LINE$(mdadm--detail--scan|grep^ARRAY /dev/md0 )grep-qxF$ARRAY_LINE/etc/mdadm/mdadm.conf||printf%s\n$ARRAY_LINE/etc/mdadm/mdadm.conf检查cat/etc/mdadm/mdadm.conf更新 initramfs使系统启动阶段能够读取最新的 mdadm 配置update-initramfs-u九、格式化为 ext4将/dev/md0格式化为 ext4mkfs.ext4\-Ldata\-m0\-Estride128,stripe-width512\/dev/md0参数说明-L data设置文件系统标签为data-m 0不为 root 预留默认的5%空间stride128512KiB条带除以4KiB文件系统块结果为128stripe-width512128乘以4块成员盘结果为512对于约16TB的数据盘如果保留默认5%会占用大量空间因此这里设置为0。该参数更适合专用数据盘不建议直接套用到系统根分区。格式化完成后检查lsblk-f/dev/md0 blkid /dev/md0这里会生成一个新的 ext4 文件系统 UUID。它与mdadm --detail中显示的 RAID UUID不是同一个 UUID。十、使用 UUID 挂载到/data创建挂载目录mkdir-p/data获取 ext4 文件系统 UUIDblkid-sUUID-ovalue /dev/md0备份/etc/fstabcp-a/etc/fstab\/etc/fstab.bak.$(date%Y%m%d-%H%M%S)编辑nano/etc/fstab在文件末尾添加UUID实际的文件系统UUID /data ext4 defaults,nofail,x-systemd.device-timeout30s 0 2参数说明defaults使用默认挂载参数nofail阵列异常时允许系统继续启动适合远程服务器x-systemd.device-timeout30s启动时最多等待设备30秒0 2关闭 dump并将文件系统检查顺序设置为2检查配置语法findmnt--verify--verbose重新加载 systemd 并测试挂载systemctl daemon-reloadmount-a确认挂载结果findmnt /datadf-hT/data lsblk-f正常情况下应看到TARGET SOURCE FSTYPE OPTIONS /data /dev/md0 ext4 rw,relatime,stripe512容量信息类似Filesystem Type Size Used Avail Use% Mounted on /dev/md0 ext4 15T 2.1M 15T 1% /data如果应用程序不是以 root 用户运行需要根据实际服务调整目录所有者。例如交给ubuntu用户使用chownubuntu:ubuntu /datachmod755/data不建议直接使用chmod 777。十一、重启验证确认mount -a没有报错后重启reboot重启后检查cat/proc/mdstatmdadm--detail/dev/md0 findmnt /datadf-hT/data如果阵列状态为clean4块成员盘均为active sync并且/data已挂载到/dev/md0说明自动组装和 UUID 自动挂载均已生效。十二、使用 YABS 测试 RAID0YABS 项目地址https://github.com/masonr/yet-another-bench-scriptYABS 会在“当前工作目录”创建临时测试文件因此必须确保脚本运行目录位于/data。如果直接在/root或用户家目录运行测试到的会是系统盘而不是 RAID0。12.1 下载脚本根据服务器访问 GitHub 的情况从下面两种方式中选择一种即可。方式一不使用代理服务器可以正常访问 GitHub Raw 时直接下载curl-fL\https://raw.githubusercontent.com/masonr/yet-another-bench-script/master/yabs.sh\-o/tmp/yabs.shchmodx /tmp/yabs.sh方式二使用 gh-proxy.com 代理如果服务器访问 GitHub Raw 较慢或无法连接可以通过gh-proxy.com下载curl-fL\https://gh-proxy.com/https://raw.githubusercontent.com/masonr/yet-another-bench-script/master/yabs.sh\-o/tmp/yabs-gh-proxy.sh下载完成后将脚本内部可能访问的 GitHub Raw 地址也替换为代理地址sed-i\s#https://raw.githubusercontent.com/#https://gh-proxy.com/https://raw.githubusercontent.com/#g\/tmp/yabs-gh-proxy.shchmodx /tmp/yabs-gh-proxy.sh这不仅通过代理下载 YABS 脚本也可以让脚本运行过程中可能发生的 GitHub Raw 文件下载经过代理。由于前面已经安装了 Ubuntu 软件仓库中的fioYABS通常会直接使用本机的 fio不再下载预编译版本。不过代理方式仍然保留了脚本内部 GitHub Raw 地址的加速处理。12.2 执行 RAID0 磁盘测试YABS会在当前工作目录中创建临时测试文件因此必须先进入/data。根据前面选择的下载方式执行对应命令。方式一不使用代理测试如果下载的是无代理版本执行(cd/dataecho测试目录$PWDfindmnt-T./tmp/yabs.sh-ign)|tee/root/yabs-raid0-$(date%Y%m%d-%H%M%S).log方式二使用代理测试如果下载的是代理版本执行(cd/dataecho测试目录$PWDfindmnt-T./tmp/yabs-gh-proxy.sh-ign)|tee/root/yabs-raid0-$(date%Y%m%d-%H%M%S).log此时运行的是已经将内部 GitHub Raw 地址替换为gh-proxy.com的代理版本。参数说明-i跳过 iperf3 网络测试-g跳过 Geekbench-n跳过公网网络信息查询tee在终端显示结果同时保存到/root下的日志文件不要使用-f或-d因为这两个参数会关闭 fio 磁盘测试。无论是否使用代理测试结果标题都必须显示fio Disk Speed Tests (Mixed R/W 50/50) (Partition /dev/md0):如果显示Partition /dev/nvme0n1p3说明脚本是在系统盘目录下运行测试到的是 NVMe 系统盘而不是挂载在/data的 RAID0。12.3 本次 YABS 测试结果Block Size | 4k (IOPS) | 64k (IOPS) Read | 6.32 MB/s (1.5k) | 68.53 MB/s (1.0k) Write | 6.31 MB/s (1.5k) | 68.91 MB/s (1.0k) Total | 12.64 MB/s (3.0k) | 137.44 MB/s (2.0k) Block Size | 512k (IOPS) | 1m (IOPS) Read | 243.78 MB/s (464) | 274.32 MB/s (261) Write | 256.73 MB/s (489) | 292.59 MB/s (279) Total | 500.52 MB/s (953) | 566.91 MB/s (540)YABS采用50%读取、50%写入的随机混合测试因此结果不能直接等同于纯顺序读写峰值。对于机械硬盘4K随机读写较低属于正常现象512K和1M大块混合读写更能体现 RAID0 的并行吞吐能力YABS使用较高队列深度和较小测试文件不能代表所有实际业务负载测试期间可以在另一个 SSH 窗口观察成员盘负载iostat-dx1/dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/md0十三、使用 fio 手动测试顺序性能为了测试 RAID0 的纯顺序读写性能在/data中创建一个64GiB测试文件。测试文件大于服务器的15.5GiB内存同时使用direct1绕过系统页缓存可以减少内存缓存对结果的影响。13.1 顺序写入测试fio\--nameseq-write\--filename/data/fio-seq-test.bin\--size64G\--rwwrite\--bs1M\--ioenginelibaio\--iodepth32\--direct1\--numjobs1\--group_reporting主要参数--size64G测试文件大小为64GiB--rwwrite顺序写入--bs1M单次I/O块大小为1MiB--iodepth32同时保持32个I/O请求--direct1使用Direct I/O减少页缓存影响--group_reporting合并显示测试结果本次顺序写入结果WRITE: bw840MiB/s (881MB/s) io64.0GiB run78005msec err013.2 顺序读取测试写入完成后使用同一个文件测试读取fio\--nameseq-read\--filename/data/fio-seq-test.bin\--size64G\--rwread\--bs1M\--ioenginelibaio\--iodepth32\--direct1\--numjobs1\--group_reporting本次顺序读取结果READ: bw842MiB/s (883MB/s) io64.0GiB run77789msec err0顺序读写结果汇总测试项目阵列速度平均到单盘顺序写入840MiB/s约881MB/s约210MiB/s顺序读取842MiB/s约883MB/s约210MiB/s4块成员盘的读写量基本一致测试中没有出现 I/O 错误、短读写或请求丢失说明阵列负载分配正常。当前阵列几乎为空64GiB文件大概率位于机械盘外圈因此测试结果接近最佳状态。随着磁盘逐渐写满机械盘内圈的顺序速度通常会有所下降。13.3 删除测试文件测试完成后删除64GiB文件rm-f/data/fio-seq-test.binsyncdf-hT/data不要将 fio 的--filename设置为/dev/md0。直接对/dev/md0进行写测试会破坏 ext4 文件系统和现有数据。十四、日常检查命令查看 RAID 状态cat/proc/mdstatmdadm--detail/dev/md0查看挂载情况findmnt /datadf-hT/data查看磁盘 SMART 状态fordiskin/dev/sda /dev/sdb /dev/sdc /dev/sdd;doecho$disksmartctl-H$diskdone查看实时磁盘负载iostat-dx1/dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/md0十五、总结本文在 Ubuntu 26.04 LTS 中使用4块4TB机械硬盘创建了一个约14.55TiB的 RAID0并完成了检查磁盘及 SMART 状态清除各分区文件系统签名清除整盘 GPT、MBR 分区表创建新的 GPT RAID 分区使用 mdadm 创建 RAID0配置 mdadm 开机自动组装创建 ext4 文件系统通过文件系统 UUID 挂载到/data验证重启后的自动组装和挂载使用 YABS 测试随机混合读写使用 fio 测试纯顺序读写本次阵列顺序读取约883MB/s顺序写入约881MB/s符合4块企业级机械硬盘 RAID0 的预期性能。需要再次强调RAID0只提升容量和吞吐性能不提供数据安全保障。任意一块成员盘损坏都可能导致整个阵列不可用因此重要数据必须保存在独立设备或远程备份中。说明免责声明与版权声明本文内容由个人发布仅用于学习、技术研究与经验交流。文中涉及的软件包括正版及第三方版本仅供测试与学习用途不构成任何形式的分发、破解、商业使用或侵权行为的鼓励。若您需要长期使用或商业部署请前往官方网站购买或获取正版授权。作者不对任何软件的使用、修改、传播及由此产生的后果承担法律责任。读者应自行判断、下载与使用软件并遵守所在地法律法规及相关许可协议。部分内容参考或摘录自公开资料、官方文档或其他技术文章均已尽可能注明原作者及来源链接。若原作者或版权方认为本文存在不当引用或侵权内容请联系作者处理作者将在核实后及时修改或删除相关内容。知识共享许可声明除特别说明外本文中的原创文字、图片、图表及资料均依据CC BY-NC-SA 4.0署名非商业性使用相同方式共享许可协议发布。您可以在遵守本协议的前提下复制、转载和分享本文内容对本文内容进行修改、改编和二次创作将本文内容用于个人学习、研究和非商业用途。同时必须满足以下条件保留原作者署名及原文链接明确标注内容来源不得将本文及其衍生作品用于任何商业用途基于本文进行修改、改编或再创作的作品必须继续采用相同协议进行发布。特别声明未经作者书面授权禁止以下行为将本文原创内容用于商业培训、付费课程、付费社群、收费咨询等商业活动将本文原创内容转载至以盈利为目的的网站、平台、出版物或知识付费平台将本文原创内容批量采集、镜像、聚合或作为数据库内容进行商业运营将本文原创内容用于人工智能模型训练、知识库构建、数据集整理或其他商业化用途删除、修改或隐藏原作者署名、原文链接及版权声明。对于违反上述声明的行为作者保留依法追究相关责任的权利。AI 辅助生成声明本文部分内容在撰写、整理、润色或结构优化过程中使用了 AI 工具进行辅助生成。AI 生成内容仅作为写作辅助参考最终内容已由作者进行人工审阅、修改、校对与确认。本文观点、技术步骤、命令示例及相关说明均以作者最终发布版本为准。读者在参考本文内容进行实际操作前应结合自身环境进行验证作者不因 AI 辅助生成内容可能存在的遗漏、错误或不适用情况承担额外责任。