ata1.00: exception Emask 0x0 SAct 0x8000000 SErr 0x0 action 0x6 frozen 硬盘问题
测试发现嵌入式linux vfat 文件系统的sata固态硬盘偶然启动时出现异常打印如下:
ata1.00: exception Emask 0x0 SAct 0x8000000 SErr 0x0 action 0x6 frozen
ata1.00: failed command: READ FPDMA QUEUED
ata1.00: cmd 60/08:d8:00:00:00/00:00:00:00:00/40 tag 27 ncq 4096 in
res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
ata1.00: status: { DRDY }
ata1: hard resetting link
ata1: SATA link up 1.5 Gbps (SStatus 113 SControl 310)
ata1.00: configured for UDMA/133
ata1.00: device reported invalid CHS sector 0
ata1: EH complete
sda:
sda: detected capacity change from 0 to 512110190592
sd 0:0:0:0: [sda] Attached SCSI disk
寻找说明,参考Libata error messages - ata Wiki (kernel.org)
1. 错误每一行都有前缀,前缀ata3.00解释为:
- ata:该前缀指明这是条libata端口或设备信息
- 1:端口号,从1开始记
- 00:设备号,一般从0记,除非端口多路复用或是使用PATA主从设备
2. 异常描述行(第一行)给出异常处理状态(EH)概述
exception Emask 0x0 SAct 0x8000000 SErr 0x0 action 0x6 frozen
- Emask:错误分类掩码(代码中的 AC_ERR_xxx )
- SAct:SATA SActive 寄存器
- SErr:SATA SError 寄存器
- action: ATA_EH_xxx操作,如revalidate,softreset,hardreset(参见include / linux / libata.h)
- frozen:如果存在,表示端口被冻结为EH
- t3:这项也是可选的,表重试次数,t3表示3次
3. cmd行(第二行)给出了发送到设备的ATA命令(taskfile)
cmd 60/08:d8:00:00:00/00:00:00:00:00/40 tag 27 ncq 4096 in
上述命令按’/’及空格分割分5段解释:
- 60:命令号?
- 08:d8:00:00:00:(第一个)Feature : 需查询源文件
- 00:00:00:00:00:(第二个)HOB Feature : HOB NSect : HOB LBA L : HOB LBA M : HOBLBA H
- a0:设备/头
- tag : NCQ tag 号, NCQ如果没有激活或不适用,则为0。
4. (第三行)包含当前ATA设备寄存器的dump信息及错误摘要:
res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
5. ATA状态扩展
status: { DRDY }
将输出任务文件中返回的ATA状态寄存器扩展为其组件位:
- Busy:设备忙(所有其他位无效)
- DRDY:设备就绪,正常的情况下一般为1。
- DRQ:数据准备好通过PIO发送/接收
- DF: 设备故障
- ERR: 错误(有关详细信息,请参阅错误寄存器)
6. ATA错误扩展
如果错误寄存器中的任何位置1,则错误寄存器内容将扩展为其组件位,例如:
error: { ICRC ABRT }
- ICRC:Ultra DMA传输时接口CRC错误 - 通常是线或电源问题,驱动程序设置错误的Ultra DMA模式也会导致该问题
- UNC : 无法纠正的错误 - 通常是由于磁盘上的坏扇区造成的
- IDNF :未找到请求的地址
- ABRT : 命令已中止 - 或者命令不支持,无法完成或接口CRC存在问题(如上例,与ICRC一起出)
7. SATA SError扩展
如果SATA SError寄存器中的任何位置1,则SError寄存器内容将扩展为其组件位,例如:
SError:{PHYRdyChg CommWake}
这些寄存器的位通常是由SATA host接口设置的,以响应SATA链路上的错误。除非设备热插拔或拔出操作,否则这些位不会被设置。如果这些位被置上了,则强烈怀疑是硬件问题(通常是SATA线不行或电源不良或供电不足)。
- RecovData:出现数据完整性错误,但接口已恢复
- RecovComm:设备和主机之间的通信暂时丢失,但已重连上了
- UnrecovData:发生数据完整性错误,但接口没有恢复
- Persist:持久通信或数据完整性错误
- Proto:检测到SATA协议不符合规范
- HostInt:主设备总线适配器内部错误
- PHYRdyChg:PhyRdy信号状态改变
- PHYInt:PHY内部错误
- CommWake:PHY检测到COMWAKE(PHY唤醒)
- 10B8B:10b到8b的解码错误
- Dispar:检测到不正确的差异
- BadCRC:链路层CRC错误
- Handshk: 帧传输返回接收到了R_ERR握手响应
- LinkSeq:链路状态机错误
- TrStaTrns :传输层状态转换错误
- UnrecFIS:收到无法识别的FIS(帧信息结构)
- DevExch:设备存在状态改变
8. 关于第二行failed command: READ FPDMA QUEUED
参考关于Linux报错解决方案:READ FPDMA QUEUED-CSDN博客及failed command: READ FPDMA QUEUED - 裸睡的猪 - 博客园 (cnblogs.com)
可能跟内核对SSD硬盘的兼容相关。
强制关机导致内核提示
FAT-fs (mmcblk0): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
FAT-fs (sda): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
综上,未确认cmd具体含义,仅从简单信息看,似乎有超时发生,且发生了硬件重连;
最早有发生掉电锁盘为只读的情况,所以启动脚本添加“umount 再 mount硬盘”指令,之后才偶尔出现以上信息,目前看无太大影响,准备换ext4文件格式测试。
此贴也记录了一些状态信息:ata1.01: status: { DRDY } - Ubuntu中文论坛