0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

linux系统下M.2硬盘调试和测试全指南:从初始化失败到读写满速,避坑就看这篇

jf_44130326 来源:Linux1024 2026-02-02 17:18 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

嵌入式开发中,M.2接口NVMe硬盘凭借高速读写和小巧体积,成了RK瑞芯微)等平台的性能担当。但调试时总绕不开几个坑:主机初始化失败、硬盘挂载不上、测试后重启翻车……

今天结合实际项目文档,从调试(硬件+配置)测试(挂载+读写),手把手教你搞定M.2硬盘,附带避坑要点,新手也能少走弯路。

一、调试篇:先解决认得到,再谈用得好

M.2硬盘(NVMe协议)依赖PCIe链路通信,调试的核心是PCIe链路通、电源稳、配置对。最常见的问题是主机初始化失败,先从这入手。

1.硬件先查:电源+时钟生命线

wKgZPGkanJiANiUcAAHujs1uwQc296.png

M.2硬盘要工作,首先得有稳定的电源和时钟,这一步别光看原理图,要结合实际测量:

电源:VCC3V3_PCIE30必须到位

原理图中M.2的供电依赖VCC3V3_PCIE30(文档2原理图标注),实际调试时要确认两点:

电源芯片输出是否稳定(用万用表测电压,需在3.25~3.35V之间);

电源使能GPIO是否正常(文档2中用gpio4 RK_PB2控制,通过/sys/kernel/debug/gpio查看状态):

#查看GPIO电平,确认电源使能(gpio-138对应vcc3v3-ssdout hi表示已使能)

cat /sys/kernel/debug/gpio | grep vcc3v3-ssd

若显示out lo,说明电源没打开,需检查DTS中电源regulator配置(下文会讲)。

时钟:PCIE_CLKREQn引脚别浮空

M.2PCIe时钟需要PCIE_CLKREQn引脚(文档2中是pcie20x1_0_clkreqn_m1,对应gpio4 RK_PB4)控制,该引脚负责请求时钟输出:

原理图中时钟路径需无虚焊(比如HCSL差分线阻抗匹配);

② DTS中引脚配置要符合硬件(文档2中是&pcfg_pull_none,若之前遇到过不稳定,可参考历史经验改为&pcfg_pull_down)。

2. DTS配置:3个关键节点不能错

RK平台的M.2硬盘(NVMe)依赖PCIe控制器PHY配置,DTS中这3个节点必须写对,少一个都可能初始化失败:

1PCIe PHY配置:指定工作模式

&pcie30phy节点控制PCIe PHY的工作模式,M.2 NVMe通常用聚合模式AGGREGATION):

&pcie30phy {

rockchip,pcie30-phymode = ; //聚合模式,适配NVMe

status = "okay"; //启用PHY

};

2PCIe控制器配置:电源+复位+引脚

&pcie3x4PCIe控制器节点,需关联电源供应、复位GPIO和时钟引脚:

&pcie3x4 {

reset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>; //复位GPIO,高电平有效

vpcie3v3-supply = <&vcc3v3_pcie30>; //关联PCIe 3.3V电源

pinctrl-names = "default";

pinctrl-0 = <&pcie20x1_0_clkreqn_m1>; //关联时钟请求引脚

status = "okay"; //启用控制器

};

重点:vpcie3v3-supply必须指向正确的电源regulator(下文节点),否则控制器没电,直接初始化失败。

3)电源Regulator:确保稳定供电

单独配置M.2硬盘的电源regulator,加入延迟避免上电冲击:

pcie20_vcc3v3_ssd_4G: vcc3v3-ssd{

compatible = "regulator-fixed"; //固定电压调节器

gpio = <&gpio4 RK_PB2 GPIO_ACTIVE_HIGH>; //电源使能GPIO

pinctrl-names = "default";

pinctrl-0 = <&pcie20_3v3_drv_4G>; //电源使能引脚配置

regulator-name = "pcie20_3v3_ssd"; //电源名称,与控制器对应

enable-active-high; //高电平使能电源

start-delays-us = <5000>; //启动延迟5ms,避免冲击

off-on-delay-us = <5000>; //切换延迟5ms

regulator-always-on; //始终供电,避免休眠断电

regulator-boot-on; //启动阶段即供电,保证初始化

};

3.排查:主机初始化失败?两步定位

wKgZPGkanJiAfRu9AADaSDWNfrg397.png


若开机后dmesg看不到NVMe设备,提示主机初始化失败,按这两步查:

第一步:看PCIe链路是否“Link up”

通过dmesg查看PCIe控制器日志,核心看“LTSSM状态PCIe链路训练状态机):

#过滤PCIe控制器日志(以fe150000.pcie为例,根据实际地址修改)

dmesg | grep fe150000

成功标志:日志中出现PCIe Link up, LTSSM is 0x230011(如文档2中的成功日志),说明PCIe链路已建立;

失败标志:若LTSSM停在0x30x210022,说明链路没训练成功,回头查硬件(电源、时钟引脚虚焊)。

第二步:查电源GPIO是否正常

如前文所述,通过/sys/kernel/debug/gpio查看电源使能GPIO(比如gpio-138):

若显示out lo:检查DTSregulator节点的enable-active-high是否配置正确,或GPIO引脚复用冲突;

若电压正常但GPIO无输出:排查GPIO引脚是否被其他驱动占用(用cat /sys/kernel/debug/pinctrl/pinctrl-soc/registered-pins查看)。

二、测试篇:三步走,测性能还不翻车

搞定初始化后,下一步是测试硬盘的挂载和读写性能,但要注意:测试会损坏硬盘格式,必须按流程来

1.第一步:挂载硬盘,先确保挂得上

M.2 NVMe硬盘在Linux下识别为/dev/nvme0n1(若多个则为nvme0n2等),挂载分临时挂载开机自动挂载

临时挂载:快速测试

# 1.创建挂载点(比如/mnt/ssd

mkdir /mnt/ssd

# 2.挂载ext4格式的硬盘(若未格式化,先执行mkfs.ext4 /dev/nvme0n1

mount -t ext4 /dev/nvme0n1 /mnt/ssd

# 3.检查是否挂载成功(看/dev/nvme0n1是否在列表中)

df -h

成功示例:文档2df -h显示/dev/nvme0n1 469G 28K 445G 1% /mnt/ssd,说明挂载正常。

开机自动挂载:避免每次手动操作

临时挂载重启后失效,通过/etc/fstab配置自动挂载:

# 1.先检查/dev/nvme0n1UUID(避免设备名变动导致挂载失败)

blkid /dev/nvme0n1

# 2.将挂载信息写入/etc/fstab(示例,UUID需替换为实际值)

echo 'UUID=xxxx-xxxx/mnt/ssdext4defaults00' | sudo tee -a /etc/fstab

# 3.测试自动挂载(无需重启)

sudo mount -a

# 4.验证:再次用df -h查看,确认已挂载

避坑:不要直接写/dev/nvme0n1,用UUID更稳定(设备名可能因插其他硬盘变动)。

2.第二步:用dd测读写速率,看性能达标没

M.2硬盘的核心优势是速度,用dd指令测试读写速率(文档1中的核心指令),注意指令含义和参数:

测试读取速率

# if=输入文件(从硬盘读),of=输出文件(丢弃到/dev/null),bs=块大小1MBcount=1024次(共1GB

dd if=/dev/nvme0n1 of=/dev/null bs=1M count=1024

文档2中实际结果:1073741824字节已复制, 0.535s, 2.0 GB/s,说明读取速率达标(PCIe 3.0×4的理论上限是4GB/s,实际因损耗在2GB/s左右正常)。

测试写入速率

# if=输入文件(从/dev/zero读零数据),of=输出文件(写入硬盘),conv=fdatasync(强制同步到硬件,避免缓存干扰)

dd if=/dev/zero of=/dev/nvme0n1 bs=1M count=1024 conv=fdatasync

文档2中实际结果:1073741824字节已复制, 0.944s, 1.1 GB/s,写入速率略低是正常现象(NVMe硬盘通常读快于写)。

3.关键一步:测试后必须格式化,否则重启翻车

重点提醒:上述dd指令会直接读写硬盘原始扇区,导致ext4格式损坏——若不重新格式化,下次重启会找不到硬盘

正确流程:测试后立即卸载并重新格式化:

# 1.先卸载挂载点(必须先卸载,否则无法格式化)

umount /mnt/ssd

# 2.重新格式化为ext4格式(注意:会清除所有数据,测试后执行)

mkfs.ext4 /dev/nvme0n1

# 3.格式化后重新挂载,确保正常使用

mount /mnt/ssd

避坑:若忘记格式化,重启后df -h看不到硬盘,需重新执行上述指令修复。

三、避坑总结:3个关键要点记牢

1.DTS配置:电源+时钟别漏配

控制器节点(&pcie3x4)必须关联vpcie3v3-supply,否则没电;

时钟请求引脚(pcie20x1_0_clkreqn_m1)拉取状态要匹配硬件,不稳定就改下拉。

1.测试后:格式化是保命步骤

dd指令直接操作原始扇区,不格式化会破坏文件系统,重启必翻车;

格式化前务必umount,否则会提示设备忙

1.排查时:先看链路和GPIO

初始化失败先查dmesgPCIe Link是否up

电源问题直接看/sys/kernel/debug/gpio,比测电压更高效。

结尾

M.2硬盘调试看似复杂,实则围绕电源稳、链路通、配置对、测试规范这几个核心。你在调试时遇到过挂载后掉盘”“速率不达标这类问题吗?欢迎在评论区分享你的踩坑经历,一起交流解决!



声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5212

    文章

    20769

    浏览量

    338824
  • 硬盘
    +关注

    关注

    3

    文章

    1369

    浏览量

    60106
  • Linux系统
    +关注

    关注

    4

    文章

    618

    浏览量

    30237
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    串口通信基石:Air8000Modbus RTU串口初始化详解!

    串口初始化是Modbus RTU通信稳定可靠的关键起点。本篇深入剖析Air8000开发板串口参数配置、初始化代码实现及调试要点,结合master_rtu示例,分享实际操作中的经验与
    的头像 发表于 10-28 16:33 1860次阅读
    串口通信基石:Air8000<b class='flag-5'>下</b>Modbus RTU串口<b class='flag-5'>初始化</b>详解!

    将1YN M.2与COOLDIM_PRG_BOARD NUCLEO-H753ZI结合使用,初始化Wi-Fi失败的原因?

    测试了 BLE,但是当使用示例代码“wifi_bt_tester”测试 WiFi 类型 - 1YN 时,出现如下错误: 接口未启动/NULL,在函数 whd_deinit 第 193 行失败
    发表于 03-05 06:22

    别让连接器毁了你的设计:三大常用连接器选型陷阱与指南

    不稳定、VSWR 恶化。 指南 : 购买一把 0.9 N·m(标准 SMA 扭矩) 的扭矩扳手,贴在工位墙上。 批量生产中,对需要反复插拔的测试
    发表于 05-07 09:03

    M.2固态硬盘无法识别的两个原因和解决方法

    。但是,有些朋友正在使用M.2 SSD,并且计算机无法识别硬盘。在这种现象的情况,我们该怎么办? 一般情况,当主板可以连接到M.2固态
    发表于 09-25 20:24

    BPI启动,Flash初始化失败

    我有一个KC705评估板配置为在x16模式使用BPI Flash。在使用JTAG端口加载设计位文件的后,我可以初始化闪存。但是,当我BPI启动我的设计时,闪存初始化
    发表于 10-11 13:11

    MIMXRT1024-EVK闪存初始化失败的原因?

    我正在使用 EVK 套件 MIMXRT1024。当我尝试调试时出现以下错误闪存驱动程序 V.2 启动失败 - rc Ef(34):初始化闪存超时。芯片
    发表于 04-11 06:37

    【资料分享】NXP i.MX 8M Mini评估版测试手册(1)

    -u 图 28 1.6 DDR读写测试Linux系统启动时,在U-Boot的SPL阶段完成DDR的初始化,并打印DDR实际容量,如下图
    发表于 06-15 14:32

    AD2S1210初始化读写寄存器失败的原因?如何解决?

    配置:并口通讯。 问题: 初始化读写寄存器失败。正常工作后读取速度数据失败初始化中配置模式,读写
    发表于 12-04 06:33

    LINUX系统引导和初始化-LINUX内核解读

    Linux系统引导和初始化 ----------Linux2.4.22内核解读之一 一、 系统引导和
    发表于 11-03 22:31 53次下载

    Linux内存初始化

    之前有几篇博客详细介绍了Xen的内存初始化,确实感觉这部分内容蛮复杂的。这两天在看Linux内核启动中内存的初始化,也是看的云里雾里的,想尝试下边看边写,在写博客的过程中慢慢思考,最后也能把自己
    发表于 10-12 11:16 0次下载

    在51平台初始化文件的引入导致全局变量无法初始化的问题如何解决

    本文档的主要内容详细介绍的是在51平台初始化文件的引入导致全局变量无法初始化的问题如何解决。
    发表于 08-20 17:31 0次下载
    在51平台<b class='flag-5'>下</b><b class='flag-5'>初始化</b>文件的引入导致全局变量无法<b class='flag-5'>初始化</b>的问题如何解决

    如何使用精确估计秩空间相关矩阵实现MNMF稳定初始化的方法

    相关矩阵的最大特征值的特征向量。本文比较了秩和秩1初始化类型。另一方面,独立低秩矩阵分析(ILRMA)通过使用秩1分解矩阵代替空间相关矩阵来加速矩阵分解。上述初始化方法可应用于ILRMA。ILRMA的缺点是过度确定的情况,在这
    发表于 10-16 08:00 3次下载
    如何使用精确估计<b class='flag-5'>满</b>秩空间相关矩阵实现MNMF稳定<b class='flag-5'>初始化</b>的方法

    MPU6050初始化失败

    MPU6050初始化失败osDelay(1000); //上电uint8_t mpu_ok = MPU_init();uint8_t cnt = 0;while
    发表于 12-06 12:36 13次下载
    MPU6050<b class='flag-5'>初始化</b><b class='flag-5'>失败</b>

    M.2接口的固态硬盘有何优势?

    。 首先,M.2接口固态硬盘具有更小的尺寸。M.2接口是一种小型、薄型的连接器,其尺寸通常仅为SATA接口固态硬盘的一半。这对于需要紧凑设计的设备非常重要,比如超薄笔记本电脑、
    的头像 发表于 01-15 14:31 4477次阅读

    多块 M.2 硬盘拆到崩溃?M.2 硬盘抽取盒才是救星!

    当电脑装多块M.2固态硬盘,你是否常为调取文件,不得不关程序、断电开机箱,在狭小空间拧螺丝、拔插硬盘?本需几分钟的操作,沦为耗时费力的工程;这就像有装满珍宝的保险库,取物却要大动干戈。你需要的不是
    的头像 发表于 10-11 15:15 1069次阅读
    多块 <b class='flag-5'>M.2</b> <b class='flag-5'>硬盘</b>拆到崩溃?<b class='flag-5'>M.2</b> <b class='flag-5'>硬盘</b>抽取盒才是救星!