固态硬盘在采用英特尔 7 系列 SATA 控制器的交换机上为只读
症状
在运行 Cumulus Linux 5.0 及更高版本的 NVIDIA SN2410、SN2410B、SN2700 和 SN2700B 交换机上,固态硬盘可能变为只读。
在故障切换到只读状态之前,您会在 /var/log/syslog
文件中看到以下错误
kernel: [3238274.795264] ata1.00: exception Emask 0×10 SAct 0×40 SErr 0×4050000
action 0xe frozen
kernel: [3238274.803288] ata1.00: irq_stat 0×00000040, connection status
changed
kernel: [3238274.809868] ata1: SError: { PHYRdyChg CommWake DevExch }
kernel: [3238274.815419] ata1.00: failed command: WRITE FPDMA QUEUED
kernel: [3238274.820912] ata1.00: cmd 61/48:30:f8:3e:0d/00:00:00:00:00/40 tag 6
ncq dma 36864 out
kernel: [3238274.820912] res 40/00:30:f8:3e:0d/00:00:00:00:00/40 Emask 0×10
(ATA bus error)
kernel: [3238274.837175] ata1.00: status: { DRDY }
kernel: [3238274.841065] ata1: hard resetting link
概述
在 Cumulus Linux 5.0 及更高版本中,SATA 链路电源管理 (LPM) 策略发生了更改,内核设置 SATA_MOBILE_LPM_POLICY
控制该策略。
- Cumulus Linux 4.0 到 4.4 不提供
SATA_MOBILE_LPM_POLICY
配置设置,但使用固件的默认值,即max_performace
。 - Cumulus Linux 5.0 及更高版本使用 Debian 默认配置中的
SATA_MOBILE_LPM_POLICY
值,该值为 3 或中等功耗,并启用了设备发起的 PM (med_power_with_dipm
)。
并非所有 SATA 主机控制器和存储设备的组合都与默认的 med_power_with_dipm
设置配合良好。例如,使用英特尔 7 系列芯片组控制器的平台在访问固态硬盘时可能会遇到超时和链路降级;NVIDIA SN2410、SN2410B、SN2700 和 SN2700B 交换机具有英特尔 7 控制器
#lspci | grep SATA
00:1f.2 SATA controller: Intel Corporation 7 Series Chipset Family 6-port SATA
Controller [AHCI mode] (rev 04) (prog-if 01 [AHCI 1.0])
解决方法
要恢复当前处于只读状态的交换机,请重启交换机电源。恢复后,请按照以下步骤解决此问题。
要在运行时应用修复程序
将 SATA LPM 策略设置为
max_perfomance
cumulus@switch:~$ sudo -i cumulus@switch:~$ echo "max_performance" > /sys/class/scsi_host/host0/link_power_management_policy
在运行时应用解决方案时,无需重启交换机。
确认设置
cumulus@switch:~$ cat /sys/class/scsi_host/host0/link_power_management_policy max_performance
运行时更改在重启后不会持久存在。交换机重启后,重新应用更改或实施持久修复。
要应用修复程序使其在重启后仍然存在
编辑
/etc/default/grub
文件,将ahci.mobile_lpm_policy=1
添加到GRUB_CMDLINE_LINUX
行cumulus@switch:~$ vim /etc/default/grub GRUB_CMDLINE_LINUX="cl_platform=mlnx_x86_MSN2410 console=tty0 console=ttyS0,115200n8 ahci.mobile_lpm_policy=1 acpi_enforce_resources=lax acpi=noirq"
或者,使用
sed
替换控制台速度中的最后几个字符并添加 LPM 策略值,然后验证更改cumulus@switch:~$ sudo sed -i -e "s/200n8/200n8 ahci.mobile_lpm_policy=1/g" /etc/default/grub
cumulus@switch:~$ grep 200n8 /etc/default/grub GRUB_CMDLINE_LINUX="cl_platform=mlnx_x86_MSN2410 console=tty0 console=ttyS0,115200n8 ahci.mobile_lpm_policy=1 acpi_enforce_resources=lax acpi=noirq"
运行
update-grub
命令以应用新的/etc/default/grub
配置cumulus@switch:~$ sudo update-grub
重启交换机
cumulus@switch:~$ sudo reboot