硬盘错误:感测数据损坏/缺失

硬盘错误:感测数据损坏/缺失

我最近尝试使用以下命令检查硬盘的旋转时间:

sudo hdparm -I /dev/sdb | grep level

并收到错误:

SG_IO: bad/missing sense data, sb[]:  70 00 05 00 00 00 00 0a 00 00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

该驱动器可以正常读取和写入数据,并且在启动时也可以安装。我就是无法在该驱动器上运行此命令而不出错

这是什么意思?我该如何解决这个问题?

答案1

我的 Seagate Backup Slim 和 WD Black SCSI 硬盘也遇到了类似的问题。我也在使用它们hdparm。对我有用的是sdparm实用程序。

安装

sudo apt install sdparm

获取所有参数/设置

sudo sdparm -l -a /dev/sdX

这里-a获取所有输出字段并-l获取长输出,即输出字段的解释。/dev/sdX是所讨论的驱动器(类似于/dev/sda)。

使用以下方法获取旋转计时器和STANDBY标志:

sudo sdparm -l --get SCT /dev/sdX
sudo sdparm -l --get STANDBY /dev/sdX

这里的旋转时间SCT以毫秒为单位,STANDBY标志是旋转计时器开/关(1/0)开关

如果您的输出类似于:

# STANDBY     0  [cha: y, def:  1, sav:  1]
# SCT       4294967286  [cha: y, def:18000, sav:18000]

这意味着您的设备未设置为减速。

如果需要,您可以使用以下命令更改当前会话的这些设置:

sudo sdparm -l --set SCT=6000 /dev/sdX
sudo sdparm -l --set STANDBY=1 /dev/sdX

重启后这些设置将会丢失。

永久改变为:

sudo sdparm -l --save --set SCT=6000 /dev/sdX
sudo sdparm -l --save --set STANDBY=1 /dev/sdX

这里我选择了6秒(6000毫秒)但是你可以根据自己的要求进行选择。

如果由于某种原因您无法保存设置,则可以将其放入/etc/rc.local启动时设置中:

sdparm -l --set SCT=6000 --set STANDBY=1 /dev/sdX

我希望这有帮助。

答案2

该问题通常是由于 USB-SATA 桥接器实现损坏或不正确而导致的,并且仅在使用 USB 连接的磁盘盒时才会出现。

如果是外置 USB 磁盘,系统需要使用 UAS(USB 连接 SCSI)协议通过 SAT(SCSI / ATA 转换)与机箱内的 SATA 驱动器通信,以通过 USB 上的 SCSI 发送原始 ATA 命令(由hdparm或发送smartctl)。此协议链如此复杂的原因是由于历史原因。

在 USB – UAS – SCSI – SAT – SATA 链中的某个地方,某些硬件的实现不正确。通常,所有这些都由机箱内的单个微芯片(称为 USB-SATA 桥接器)完成,一些众所周知的变体是 ASM1051、ASM1053 和 ASM1153。其中,ASM1051 已知存在错误,任何包含此芯片的硬件都应避免使用 UAS。ASM1053 和 ASM1153 可能会或可能不会工作,具体取决于芯片内的实际固件(制造商可以自定义固件,参考实现确实可以正常工作)。例如,Seagate 制造的许多机箱使用带有自定义固件的 ASM1153,并且在某些 ATA 命令方面存在问题,即使同一芯片可以与参考固件一起正常工作。(例如,只要操作系统从不发送任何 12 位或 16 位命令,Seagate 的一些机箱就可以正常工作。Linux为此usb_storage支持怪癖t。)最终用户通常无法更换固件,因此如果您的芯片/固件有问题,您唯一的选择就是向制造商投诉。就 Seagate 而言,他们通过声明他们仅正式支持 Windows 和 OS X(并且这些操作系统不支持配置 SATA 设备,也不支持通过 USB 获取 SMART 数据,因此一切都“正常”)来“解决”问题。Seagate 现在正式与 Linux 社区合作,因此他们的产品将来也许会真正发挥作用。

找出桥接芯片的唯一真正方法是拆开外壳并检查实际微芯片中的标记。

更新:“Seagate Backup Plus Hub” 机箱具有正常工作的 USB-SATA 桥接器,并且 UAS 正常工作(请注意,这与“Seagate Backup Plus”是不同的产品!)但是,由于 Seagate 机箱的历史记录不佳,Linux 内核t默认应用了此怪癖,从而阻止此机箱使用所有 SATA 功能。您可以使用以下命令启用包括 SMART 功能在内的完整 SATA 支持:

echo "0bc2:ab38:" > /sys/module/usb_storage/parameters/quirks

请注意,后面的冒号是空的,它禁用所选供应商:产品的所有内置功能。lsusb如果需要,请检查您的供应商和产品 ID。

如果您的设备存在足够多的错误,您可能需要完全禁用 UAS 支持。这可以通过uquirk 来完成。例如,如果我想禁用 Seagate Backup Plus Hub 上的 UAS 支持,我会以 root 身份运行以下命令:

echo "0bc2:ab38:u" > /sys/module/usb_storage/parameters/quirks

此后,外部磁盘将仅使用速度较慢但通常可以正常工作的 USB 存储设备功能,最终运行速度会变得缓慢。如果您只需要传输一些大文件,差异就不是那么大。如果您有很多小文件,那么拥有有效的 UAS 支持与否的速度差异可能超过 10 倍。

答案3

看起来您的驱动器控制器不支持该查询方法,并非所有 USB SATA 芯片组都是一样的。您没有说明您使用的驱动器或控制器的型号,因此很难在这里提供更多建议。

您可以通过插入另一个 USB 控制器或使用具有相同控制器的不同驱动器来测试这一点,或者更好的是直接通过 SATA 进行测试。

对于某些 usb2 时代的控制器来说,3TB 驱动器可能太大,因此我建议改用信誉良好的 usb3 sata 桥接器,它的速度也会快得多。

答案4

对于上述和/或 modprobe 调整无效的系统/设备(例如 Raspberry Pi 3),请提供其他信息:

必须将怪癖添加到启动参数中。对于 RPi 3/Raspbian,启动参数位于文件中/boot/cmdline.txt

[other command line parameters...] usb_storage.quirks=YOUR_VENDOR_ID:YOUR_DEVICE_ID:QUIRK_FLAGS

就我而言,我需要清除设备的怪癖标志,因此我将其添加到/boot/cmdline.txt

usb_storage.quirks=0bc2:a0a4:

这解决了我的问题,希望它能帮助别人

相关内容