固态硬盘在采用英特尔 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])

解决方法

要恢复当前处于只读状态的交换机,请重启交换机电源。恢复后,请按照以下步骤解决此问题。

要在运行时应用修复程序

  1. 将 SATA LPM 策略设置为 max_perfomance

    cumulus@switch:~$ sudo -i
    cumulus@switch:~$ echo "max_performance" > /sys/class/scsi_host/host0/link_power_management_policy
    

    在运行时应用解决方案时,无需重启交换机。

  2. 确认设置

    cumulus@switch:~$ cat /sys/class/scsi_host/host0/link_power_management_policy
    max_performance
    

运行时更改在重启后不会持久存在。交换机重启后,重新应用更改或实施持久修复。

要应用修复程序使其在重启后仍然存在

  1. 编辑 /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"
    
  2. 运行 update-grub 命令以应用新的 /etc/default/grub 配置

    cumulus@switch:~$ sudo update-grub
    
  3. 重启交换机

    cumulus@switch:~$ sudo reboot