前言

本帖记录在栗子派华为昇腾310B开发板套件开发板上完成 NVMe 固态硬盘读写测试的全过程。开发板搭载 NPU Ascend 310B4,系统为 Ubuntu 22.04 LTS (aarch64),运行内核 5.10.0+,Ascend 软件版本 23.0.rc3

NVMe 分区为 /dev/nvme0n1p1,文件系统 ext4,先创建 /mnt/nvme 后挂载

验收标准:写入和读取成功,测试文件可校验并彻底删除,原有数据不受影响。


一、硬件连接

开发板断电后安装 NVMe 固态硬盘,确认固定螺钉锁紧,不允许硬盘翘起或金手指未完全插入开发板断电后安装 NVMe 固态硬盘,确认固定螺钉锁紧。

警告:插拔 NVMe 前必须断电。NVMe 测试严禁直接执行 mkfs、fdisk、parted、wipefs 等命令,否则可能破坏已有分区和数据。


二、识别与挂载检查

NVMe 测试不重新分区、不格式化。首先用 lsblk 确认设备、已有分区和文件系统。若看到 /dev/nvme0n1p1 且 FSTYPE 为 ext4,但 MOUNTPOINTS 为空,说明硬盘已经识别、只是尚未挂载。

echo "========== NVMe设备与分区 =========="
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,RO,MODEL
lsblk -f

# 仅当已确认存在 /dev/nvme0n1p1 且文件系统为 ext4 时继续
# 1. 创建挂载目录(这一步不能省略)
mkdir -p /mnt/nvme

# 2. 挂载已有分区
mount /dev/nvme0n1p1 /mnt/nvme

# 3. 验证挂载和容量
findmnt /mnt/nvme
df -hT /mnt/nvme

# 4. 如需重启后自动挂载,可写入 /etc/fstab
UUID=$(blkid -s UUID -o value /dev/nvme0n1p1)
cp /etc/fstab /etc/fstab.bak
grep -q "UUID=$UUID " /etc/fstab || echo "UUID=$UUID /mnt/nvme ext4 defaults,nofail 0 2" >> /etc/fstab
mount -a
findmnt /mnt/nvme

挂载成功后,findmnt /mnt/nvme 应显示来源为 /dev/nvme0n1p1,df -hT /mnt/nvme 应显示 ext4 文件系统及实际容量。Linux 显示容量与硬盘标称容量可能不同,例如标称 1 TB 的硬盘显示约 953.9G 属于正常的单位换算差异

若 lsblk 只有 nvme0n1 而没有分区,或 FSTYPE 为空,应停止本节测试并确认硬盘初始化状态,不要直接格式化。


三、安全读写测试

测试仅在已经挂载成功的 /mnt/nvme 下创建 nvmewritetest.bin,不修改其他文件。开始写入前先用 mountpoint / findmnt 再次确认 /mnt/nvme 确实是 NVMe 挂载点,避免在未挂载时误把测试文件写入系统盘根分区。

TEST_FILE=/mnt/nvme/nvme_write_test.bin

# 阶段0:确认 /mnt/nvme 已真正挂载,未挂载则立即停止
mountpoint -q /mnt/nvme || { echo "[失败] /mnt/nvme 尚未挂载,请先执行上一节"; exit 1; }
findmnt /mnt/nvme

# 阶段1:删除旧测试文件
rm -f "$TEST_FILE"

# 阶段2:记录测试前容量
df -hT /mnt/nvme

# 阶段3:写入100 MiB测试文件
dd if=/dev/zero of="$TEST_FILE" bs=1M count=100 conv=fsync status=progress
sync

# 阶段4:确认文件存在
ls -lh "$TEST_FILE"

# 阶段5:计算SHA256
sha256sum "$TEST_FILE"

# 阶段6:读取完整性与读取速度测试
dd if="$TEST_FILE" of=/dev/null bs=4M status=progress

本次实测写入 104857600 字节(100 MiB),耗时约 1.00573 s,终端显示写入速度约 104 MB/s;文件大小显示为 100M,SHA256 能正常生成,读取测试返回"测试文件读取正常",说明文件可写、可读且路径正确。


四、删除测试文件与容量复核

TEST_FILE=/mnt/nvme/nvme_write_test.bin

# 阶段7:删除测试文件
rm -f "$TEST_FILE"

# 阶段8:确认文件已经删除
if [ -e "$TEST_FILE" ]; then
  echo "[失败] 测试文件仍然存在"
else
  echo "测试文件已成功删除"
fi

# 阶段9:再次查看容量
df -hT /mnt/nvme

测试文件创建、SHA256 校验、读取和删除均成功;删除后 df 再次显示约 1.1G 已用空间,与测试前一致,说明 100 MiB 测试文件已经清理,没有长期占用硬盘容量。


五、常见问题与处理

故障现象

原因分析

处理方法

lsblk 看不到 nvme0n1

硬盘未插紧、供电不足或硬件不兼容

断电重新安装并固定硬盘,查看 dmesg \| grep -i nvme

mount 提示 mount point does not exist

/mnt/nvme 目录尚未创建,或 mkdir 命令输入错误

先执行 mkdir -p /mnt/nvme,再执行 mount /dev/nvme0n1p1 /mnt/nvme

df 提示 /mnt/nvme 不存在或 dd 无法创建测试文件

挂载目录不存在,或 NVMe 尚未挂载

依次执行 mkdir、mount、findmnt、df,确认后再测试

lsblk 看到 nvme0n1p1 但 MOUNTPOINTS 为空

硬盘和 ext4 分区正常,但当前未挂载

直接挂载已有分区到 /mnt/nvme;不要重新分区或格式化

重启后 /mnt/nvme 未自动挂载

只做了临时 mount,没有配置 fstab

使用 blkid 获取 UUID,将 UUID=... /mnt/nvme ext4 defaults,nofail 0 2 写入 /etc/fstab,并用 mount -a 验证

dd 提示 No space left on device 或速度异常

空间/inode 不足,或系统负载、缓存、温度影响

执行 df -hTdf -i 检查容量;固定测试条件后重复测试,不要在未挂载状态下写入


六、验收结果

测试项

实际结果

判定

NVMe 挂载

/dev/nvme0n1p1,ext4,已创建 /mnt/nvme 并挂载;容量以实际硬盘为准

通过

NVMe 写入

100 MiB 文件写入约 104 MB/s

通过

NVMe 读取与清理

SHA256 生成、读取成功、测试文件删除、容量恢复

通过


总结

NVMe 在确认已有 ext4 分区后创建 /mnt/nvme 并挂载,可完成 100 MiB 文件写入(约 104 MB/s)、SHA256 校验、读取与删除。交付要点已固化为:识别已有分区 → 创建 /mnt/nvme → 挂载并验证 → 再读写测试,可避免现场重复踩坑。
希望对各位开发者有所帮助。如有问题欢迎回帖交流。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐