我有这个 SSD:
$ lsscsi --verbose 9
[9:0:0:0] disk ATA Samsung SSD 860 4B6Q /dev/sdb
dir: /sys/bus/scsi/devices/9:0:0:0 [/sys/devices/pci0000:00/0000:00:01.3/0000:01:00.2/0000:02:06.0/0000:07:00.0/ata10/host9/target9:0:0/9:0:0:0]
它通常运行良好,但每周一 00:00 当地时间它都会出现故障。如果计算机在 00:00 开启并运行 Ubuntu 18.04,则每次磁盘访问都会失败几分钟,然后恢复正常。内核消息如下所示:
[33597.552222] ata10.00: exception Emask 0x0 SAct 0x438c0 SErr 0x0 action 0x6 frozen
[33597.552228] ata10.00: failed command: WRITE FPDMA QUEUED
[33597.552236] ata10.00: cmd 61/68:30:b0:a0:7d/01:00:05:00:00/40 tag 6 ncq dma 184320 out
res 40/00:01:00:4f:c2/00:00:00:00:00/00 Emask 0x4 (timeout)
[33597.552239] ata10.00: status: { DRDY }
[33597.552294] ata10: hard resetting link
[33598.028219] ata10: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
[33598.028480] ata10.00: supports DRM functions and may not be fully accessible
[33598.030650] ata10.00: supports DRM functions and may not be fully accessible
[33598.032509] ata10.00: configured for UDMA/133
[33598.032534] sd 9:0:0:0: [sdb] tag#12 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[33598.032538] sd 9:0:0:0: [sdb] tag#12 Sense Key : Illegal Request [current]
[33598.032541] sd 9:0:0:0: [sdb] tag#12 Add. Sense: Unaligned write command
[33598.032544] sd 9:0:0:0: [sdb] tag#12 CDB: Read(10) 28 00 01 15 57 88 00 00 38 00
[33598.032548] blk_update_request: I/O error, dev sdb, sector 18175880 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
[33598.032559] ata10: EH complete
[33598.032642] ata10.00: Enabling discard_zeroes_data
此消息序列以 30 秒的间隔重复 4 次,然后恢复正常。
如果计算机在 00:00 关闭,则在周一第一次打开时会出现问题。 GRUB 从同一磁盘加载正常,但当 Ubuntu 开始加载时,似乎磁盘停止工作,启动挂起。 按下重置后,它正常启动。
什么原因导致如此奇怪的行为?
答案1
您遇到了两个问题之一...
您的三星 860 SSD 中的固件需要更新。
您遇到了 NCQ 错误,需要修补。
固件
下载Samsung Magician
这里,并检查您的三星固件。
文件系统检查
让我们检查您的文件系统是否存在错误...
- 以“试用 Ubuntu”模式启动 Ubuntu Live DVD/USB
terminal
按Ctrl+ Alt+打开窗口T- 类型
sudo fdisk -l
- 识别“Linux 文件系统”的 /dev/sdXX 设备名称
- 输入
sudo fsck -f /dev/sdXX
,替换sdXX
为您之前找到的数字 fsck
如果有错误则重复命令- 类型
reboot
全国资格考试
NCQ 错误可以在这里看到...
[33597.552222] ata10.00: exception Emask 0x0 SAct 0x438c0 SErr 0x0 action 0x6 frozen
[33597.552228] ata10.00: failed command: WRITE FPDMA QUEUED
[33597.552236] ata10.00: cmd 61/68:30:b0:a0:7d/01:00:05:00:00/40 tag 6 ncq dma 184320 out
res 40/00:01:00:4f:c2/00:00:00:00:00/00 Emask 0x4 (timeout)
[33597.552239] ata10.00: status: { DRDY }
[33597.552294] ata10: hard resetting link
本机命令队列 (NCQ) 是串行 ATA 协议的扩展,允许硬盘驱动器内部优化接收的读写命令的执行顺序。
编辑sudo -H gedit /etc/default/grub
并更改以下行以包含此额外参数。然后执行sudo update-grub
将更改写入磁盘。重新启动。监视器挂起,并观察/var/log/syslog
或dmesg
是否继续出现错误消息。
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash libata.force=noncq"
答案2
时机的把握是由于弗斯特里姆定期修剪未使用的数据块以刷新 SSD 性能的服务。默认情况下,它配置为每周一 00:00 运行一次。
要查看服务运行:
systemctl status fstrim.timer
在设计合理的驱动器上,这是完全正确且无害的,但三星 SSD 的 NCQ 实现存在错误,与修剪交互不良。错误是否出现可能取决于主板的存储控制器或其他神秘因素。
三星喜欢宣传他们修复了该漏洞,但实际上并没有。我不知道。这是一个整体问题。参见:
- https://bugzilla.kernel.org/show_bug.cgi?id=203475
- https://bugzilla.kernel.org/show_bug.cgi?id=201693
如果您知道只有在定期修剪运行时才会出现问题,而其他时间不会出现问题,您可能希望启用 NCQ 以获得更好的整体性能,然后禁用修剪:
systemctl stop fstrim.timer
systemctl disable fstrim.timer