如何让 CentOS 在启动时以 3Gb/s 的速度运行 SATA 驱动器?
背景:
我遇到了一个问题,主板声称支持 6Gb/s SATA 传输速度,但当在其上使用 4 个驱动器时,在具有大量磁盘 IO 的软件 RAID 10 中,一些 SATA 链接开始抛出内核错误,即。ata1.00: failed command: WRITE FPDMA QUEUED
但每次都是不同的驱动器,并不总是 ata1,并且在每个磁盘上单独运行扩展测试不会产生任何错误。
发生错误时,内核/操作系统 (CentOS 6.2) 最终会多次重置链接,当链接继续失败时,它会将链接速度更改为 3Gb/s。一旦发生这种情况,该驱动器的错误就会在会话的剩余时间内停止。
我想做的是告诉操作系统在启动时将 SATA 链接设置为 3Gb/s,因为我认为主板的 SATA 总线无法以 6Gb/s 的速度处理所有 4 个驱动器。我在主板的 BIOS 中找不到更改链接速度的选项。
问题:
我该怎么做呢?例如配置文件?
可以在系统运行时组装 RAID 阵列并安装根分区时完成此操作吗,还是需要从救援 CD 启动?
这会导致数据丢失吗?我当然有备份,但重新安装/恢复需要几个小时的工作,如果可能的话,我想避免。
答案1
不幸的是,运行时没有任何东西(/sys/class/ata_link 包含只读信息)。
但在启动时,似乎您可以设置所需的参数强制值。相关文档在此处:https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html
Specifically
libata.force= [LIBATA] Force configurations. The format is comma
separated list of "[ID:]VAL" where ID is
PORT[.DEVICE]. PORT and DEVICE are decimal numbers
matching port, link or device. Basically, it matches
the ATA ID string printed on console by libata. If
the whole ID part is omitted, the last PORT and DEVICE
values are used. If ID hasn't been specified yet, the
configuration applies to all ports, links and devices.
If only DEVICE is omitted, the parameter applies to
the port and all links and devices behind it. DEVICE
number of 0 either selects the first device or the
first fan-out link behind PMP device. It does not
select the host link. DEVICE number of 15 selects the
host link and device attached to it.
The VAL specifies the configuration to force. As long
as there's no ambiguity shortcut notation is allowed.
For example, both 1.5 and 1.5G would work for 1.5Gbps.
The following configurations can be forced.
* Cable type: 40c, 80c, short40c, unk, ign or sata.
Any ID with matching PORT is used.
* SATA link speed limit: 1.5Gbps or 3.0Gbps.
* Transfer mode: pio[0-7], mwdma[0-4] and udma[0-7].
udma[/][16,25,33,44,66,100,133] notation is also
allowed.
* [no]ncq: Turn on or off NCQ.
* nohrst, nosrst, norst: suppress hard, soft
and both resets.
* dump_id: dump IDENTIFY data.
If there are multiple matching configurations changing
the same attribute, the last one is used.
从表面上看,内核参数 libata.force=3.0G 应该可以起作用。
至于数据丢失,可能不会——但坦率地说,由于 SATA 供应商显然没有正确遵守 SATA 规范(或其有缺陷或其他什么),那么谁知道呢。
答案2
MIfe 的回答是一个很好的线索(+1 作为有用的参考),但并不完全完整。
要将 SATA 链接设置为 3Gb/s:
编辑
/boot/grub/grub.conf
找到以 开头的行
kernel
。在我的电脑上,它是:kernel /vmlinuz-2.6.32-220.17.1.el6.x86_64 ro root=/dev/mapper/vg_lago-host rd_NO_LUKS LANG=en_US.UTF-8...
将其添加
libata.force=3.0
到内核行的某处。重启
完成上述操作后,我现在能够运行 IO 密集型操作,例如将虚拟机映像从磁盘的一部分复制到另一部分,而不会出现任何WRITE FPDMA QUEUED
错误。
答案3
有人可能会像我一样被这个问题难倒:解决这个问题的一个非常简单的方法就是更换 SATA 电缆。我将 2014 年的 SSD 移到 2018 年左右的系统中,并使用旧的非屏蔽电缆连接它。我得到的正是这里描述的错误和问题。在我将电缆换成现代屏蔽电缆后,它们就完全消失了。
我甚至可以看到/var/log/syslog
SATA 控制器尝试将链接速度重置为 1.5 GB,但仍然无法与磁盘通信。无需任何配置更改,连接新电缆后,它完全可以完美运行。
因此,在应用一些配置更改之前,您可能只需尝试一种简单的解决方案。
答案4
通过这种方式降级到 3Gbps 可能不可行,但应该可以将链路降级到 1.5Gbps。除非您有 10k 驱动器或它们是 SSD,否则它们无论如何都无法使 150MB/s 链路饱和...
大多数硬盘驱动器都可以通过跳线强制降低速度。谷歌搜索“Sata 1 跳线你的驾驶模式“