Обновление прошивки и BIOS на контроллере дисков LSI SAS9305-24i

Введение

На одном из серверов случилась проблема, сопровождавшаяся сообщениями следующего вида в журналах сервера:

Apr 08 12:09:35 mysql0 kernel: INFO: task mysqld:559417 blocked for more than 120 seconds.
Apr 08 12:09:35 mysql0 kernel:       Not tainted 6.1.0-13-amd64 #1 Debian 6.1.55-1
Apr 08 12:09:35 mysql0 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Apr 08 12:09:35 mysql0 kernel: task:mysqld          state:D stack:0     pid:559417 ppid:1      flags:0x00000002

Состояние процесса D означает uninterruptible sleep (usually IO) - непрерываемый сон, обычно из-за ожидания операции ввода-вывода.

Подозрение пало на контроллер дисков: возможно неисправен он сам, есть ошибки в его прошивке или в драйвере контроллера для Linux. Было принято решение попробовать обновить прошивку контроллера. Я подробно задокументировал процесс поиска решения, включая тупиковые варианты, чтобы эта статья помогла кому-то быстрее найти решение.

Идентификация контроллера

Для идентификации контроллера дисков воспользуемся утилитой lspci:

# lspci | grep SAS
18:00.0 Serial Attached SCSI controller: Broadcom / LSI SAS3224 PCI-Express Fusion-MPT SAS-3 (rev 01)

Подробнее информацию о контроллере можно посмотреть с помощью следующей команды:

# lspci -vs 18:00.0
18:00.0 Serial Attached SCSI controller: Broadcom / LSI SAS3224 PCI-Express Fusion-MPT SAS-3 (rev 01)
        Subsystem: Broadcom / LSI SAS9305-24i
        Flags: bus master, fast devsel, latency 0, IRQ 38, NUMA node 0
        I/O ports at 4000 [size=256]
        Memory at 9d800000 (64-bit, non-prefetchable) [size=64K]
        Expansion ROM at <ignored> [disabled]
        Capabilities: [50] Power Management version 3
        Capabilities: [68] Express Endpoint, MSI 00
        Capabilities: [a8] MSI: Enable- Count=1/1 Maskable+ 64bit+
        Capabilities: [c0] MSI-X: Enable+ Count=96 Masked-
        Capabilities: [100] Advanced Error Reporting
        Capabilities: [1e0] Secondary PCI Express
        Capabilities: [1c0] Power Budgeting <?>
        Capabilities: [190] Dynamic Power Allocation <?>
        Capabilities: [148] Alternative Routing-ID Interpretation (ARI)
        Kernel driver in use: mpt3sas
        Kernel modules: mpt3sas

Из вывода утилиты можно найти два индентификатора устройства:

  • Broadcom / LSI SAS3224 PCI-Express Fusion-MPT SAS-3 - модель самого контроллера,
  • Broadcom / LSI SAS9305-24i - модель микросхемы контроллера.

Поиск свежей прошивки

  • Переходим на официальный сайт производителя Broadcom.
  • Выбираем в меню наверху "Support and Services",
  • выбираем в меню слева "Choose Your Product",
  • выбираем в меню правее "MegaRAID and HBAs Support".
  • Откроется страница MegaRAID and HBAs Support.
  • Внизу страницы есть три блока, блок в середине называется "Resources".
  • Внутри блока нажимаем на строчку "Support Documents and Downloads".
  • Откроется страница Support Documents and Downloads.
  • На странице есть форма, в которой нужно заполнить несколько полей.
  • В поле "Product Group" выбираем "Storage Adapters, Controllers, and ICs",
  • Под полем появится галочка "Include Legacy Products" - отмечаем её,
  • В поле "Product Family" выбираем "Legacy Host Bus Adapters",
  • В поле "Product Name" выбираем "SAS 9305-24i Host Bus Adapter",
  • В поле "Asset Type" выбираем "Firmware",
  • Нажимаем кнопку "Search".
  • В результатах поиска появляется строка "Firmware", жмём на неё.
  • В открывшемся списке самая свежая версия прошивки датируется 7 декабря 2020 года, жмём на ссылку "9305_24i_Pkg_P16.12_IT_FW_BIOS_for_MSDOS_Windows" в этой строке.
  • Открывается страница 9305_24i_Pkg_P16.12_IT_FW_BIOS_for_MSDOS_Windows.
  • Выводится всплывающее окно с заголовком "Download Agreement - Personal Use License".
  • Нужно прочитать текст уведомления/прокрутить его до конца,
  • Отметить галочку в тексте "By checking this box you acknowledge that you have read this agreement",
  • Нажать кнопку "I Agree".

После этого начнётся скачивание архива с именем 9305 24i Pkg P16.12 IT FW BIOS for MSDOS Windows.zip.

Внутри архива можно найти файл sas3Flash_quickRefGuide_rev1-0.pdf, в котором описано использование утилиты sas3flash.

Краткое описание опций утилиты sas3flash

Ниже приведено краткое описание основных опций утилиты:

  • -biosall filename1 - прошить BIOS всех контроллеров прошивкой из файла filename1

    Поддерживается только обновление, старые версии прошить этой командой нельзя.

    Пример:

    sas3flash -biosall mptsas.rom
    
  • -b filename1 - прошить BIOS прошивкой из файла filename1

    Можно указать несколько опций подряд, указав файлы с прошивками типов x86 BIOS, FCODE и UEFI BSD.

    Пример:

    sas3flash -b mptsas.rom
    
  • -cpci num1:num2:num3:num4 - выбрать контроллер по индентификатору PCI шина:устройство:функция или шина:устройство:функция:сегмент

    Примеры:

    sas3flash -cpci 5:3:0
    sas3flash -cpci 1:3:2:0
    
  • -c num1 - выбрать контроллер по номеру num1

    Нумерация начинается с 1, номер контроллера - шестнадцатеричное значение.

    Пример:

    sas3flash -c 1
    
  • @filename1 - использовать файл с командами filename1

    Пример:

    sas3flash @command.txt
    

    Пример файла command.txt:

    -c 2
    -b mptsas3.rom
    -f ir1068.fw
    -reset
    
  • -debug - включить отладочный вывод

    Пример:

    sas3flash -debug
    
  • -ver - показать версию утилиты SAS3Flash

    Пример:

    sas3flash –ver
    
  • -fwall filename1 - попытаться прошить все контроллеры прошивкой из файла filename1

    Поддерживается только обновление, сатрые версии прошить этой командой нельзя. Сначала прошивка прописывается во временную область и если прописанное совпадёт с содержимым файла, то для загрузки будет использоваться эта область.

    Пример:

    sas3flash –fwall image.fw
    
  • -f filename1 - прошить прошивку контроллера из файла filename1

    Пример:

    sas3flash –f image.fw

  • -? или -h - вывести справочную информацию об опциях командной строки

    Пример:

    sas3flash –h
    sas3flash -?
    
  • -list - вывести информацию о выбранном контроллере

    Пример:

    `sas3flash –list`
    
  • -listall - вывести информацию обо всех контроллерах

    Пример:

    sas3flash –listall
    
  • -l filename1 - записывать сообщения в файл filename1

    Если файла нет, он создаётся. Если файл уже есть, он перезаписывается новыми сообщениями.

    Пример:

    sas3flash –l logfilename.log
    
  • -s - включить тихий режим

    При указании файла, сообщения записываются в него. В этом режиме утилита не предлагает скорректировать или проигнорировать ошибки.

    Пример:

    sas3flash –s
    sas3flash –s silent_logfile.txt
    
  • -ubios filename1 - сохранить BIOS в файл filename1

    Если файл существует, он будет перезаписан. Команда может не сработать, если на диске нет достаточно свободного места.

    Пример:

    sas3flash –ubios image.rom
    
  • -ufirmware filename1 - сохранить образ прошивки в файл filename1

    Если файл существует, он будет перезаписан. Команда может не сработать, если на диске нет достаточно свободного места.

    Пример:

    sas3flash –ufirmware image.fw
    

У утилиты имеются так же дополнительные опции, доступные в расширенном режиме. Расширенный режим используется только инженерами, разрабатывающими прошивку контроллера. Этот режим доступен при использовании опции -o, но подробнее почитать о них лучше в докуменатции.

Прошивка из FreeDOS

Поскольку в архиве с прошивкой и BIOS были утилиты лишь для DOS и двух вариантах Windows (для архитектур x86 и x86-64), а на сервере был установлен Linux, то я решил воспользоваться вариантом утилиты для DOS. В этот момент я ещё не знал о существовании утилиты в варианте для Linux и других операционных систем и архитектур. Чтобы не терять времени, лучше сразу перейти к следующему разделу, в котором описано, где взять эти утилиты. Здесь я опишу подготовку образа флеш-накопителя с FreeDOS, утилитой sas3flsh прошивкой контроллера и его BIOS.

Для прошивки будем использовать FreeDOS.

  • Перейдём на официальный сайт FreeDOS,
  • Нажмём на кнопку Download FreeDOS 1.3,
  • Откроется страница Download FreeDOS 1.3.
  • На странице есть 4 блока, правый верхний блок называется "For real hardware", на нём есть ссылки FullUSB и LiteUSB.
  • Скачиваем архив по второй ссылке - LiteUSB.

Далее распаковываем архив:

$ unzip FD13-LiteUSB.zip

В текущем каталоге появится файл с образом загрузочной флешки FD13LITE.img.

Под пользователем root смонтируем его:

# losetup /dev/loop0 FD13LITE.img
# mount /dev/loop0 /mnt/

И скопируем на него утилиту для прошивки и файлы для прошивки:

# cd /mnt
# mkdir sas9305-24i
# cd sas9305-24i
# cp /home/stupin/Загрузки/9305_24i_Pkg_P16.12_IT_FW_BIOS_for_MSDOS_Windows/sas3flash_dos_rel/sas3flsh.exe .
# cp /home/stupin/Загрузки/9305_24i_Pkg_P16.12_IT_FW_BIOS_for_MSDOS_Windows/uefi_bsd_rel/mpt3x64.rom .
# cp /home/stupin/Загрузки/9305_24i_Pkg_P16.12_IT_FW_BIOS_for_MSDOS_Windows/sasbios_rel/mptsas3.rom .
# cp /home/stupin/Загрузки/9305_24i_Pkg_P16.12_IT_FW_BIOS_for_MSDOS_Windows/Firmware/SAS9305_24i_IT_P/SAS9305_24i_IT_P.bin .

Отмонтируем образ:

# cd /
# umount /mnt/
# losetup -d /dev/loop0

Если загрузиться с этого образа в виртуальной машине (или загрузить с него сервер), то можно увидеть содержимое корневого его каталога:

freedos root.png

В каталоге SAS930~1 можно найти утилиту, прошивки для контроллера и для его BIOS:

freedos sas930.png

Однако, при попытке воспользоваться утилитой на сервере я столкнулся с ошибкой ERROR: Failed to initialize PAL. Exiting program.:

freedos sas3flsh pal.png

Поиск в интернете по тексту ошибки привёл меня на обсуждение на сайте Reddit: Updating SAS 9305-24i - Where to get sas3flash for EFI or Linux?.

Там говорится, что для прошивки нужно использовать EFI-вариант утилиты, который можно запустить прямо из UEFI BIOS.

В обсуждении проблемы на Reddit имеется ссылка на статью Flashing firmware and BIOS on LSI SAS HBAs на официальном сайте Broadcom.

В этой статье есть такой текст:

The DOS version of sas2flsh (sas3flsh for 12 Gb/sec HBAs) requires that the motherboard support the BIOS32 service directory feature. If the BIOS32 service directory feature isn't supported, when DOS is booted and sas2flsh.exe is run, an error message "ERROR: Failed to initialize PAL. Exiting program." will be displayed. You can either use the UEFI version of sas2flsh (called sas2flash.efi for 6 Gb/sec, or sas3flash.efi for 12 Gb/sec), or contact the motherboard vendor and ask if it is possible to add BIOS32 service directory support to the motherboard (most likely via a motherboard BIOS update).

То есть для того, чтобы сработала утилита sas3flsh для DOS, необходима поддержка функций BIOS32 в BIOS.

В конце статьи имеется ссылка на вариант утилиты sas3flash в варианте EFI Installer_P14_for_UEFI.zip.

Прошивка из Linux

Однако, можно попытаться поискать утилиту через функцию поиска на сайте Broadcom.

В результатах поиска можно найти ссылку на архив в утилитой sas3flash для различных операционных систем и архитектур: SAS3FLASH_P15.zip

В частности, в этом архиве есть вариант утилиты для Linux и архитектуры x64 (некорректное название для amd64 или x86-64).

Я скопировал утилиту, прошивку для контроллера дисков и его BIOS через SFTP на сервер и воспользовался ими для обновления.

Посмотрим, какие версии прошивки и BIOS используются в контроллере сейчас:

# ./sas3flash -listall
Avago Technologies SAS3 Flash Utility
Version 16.00.00.00 (2017.05.02) 
Copyright 2008-2017 Avago Technologies. All rights reserved.

        Adapter Selected is a Avago SAS: SAS3224(A1)

Num   Ctlr            FW Ver        NVDATA        x86-BIOS         PCI Addr
----------------------------------------------------------------------------

0  SAS3224(A1)  16.00.01.00    10.00.00.03    08.37.00.00     00:18:00:00

        Finished Processing Commands Successfully.
        Exiting SAS3Flash.

Обновим BIOS:

# ./sas3flash -biosall mpt3x64.rom 
Avago Technologies SAS3 Flash Utility
Version 16.00.00.00 (2017.05.02) 
Copyright 2008-2017 Avago Technologies. All rights reserved.

        Ignoring All other commands except for output flags

        Attempting to flash Boot Service to Avago SAS SAS3224(A1):

                Validating BIOS Image...

                BIOS Header Signature is Valid

                BIOS Image has a Valid Checksum. 

                BIOS PCI Structure Signature Valid.

                BIOS Image Compatible with the SAS Controller.

                Attempting to Flash BIOS Image...

                Verifying Download...

                Flash BIOS Image Successful.

        Finished Processing Commands Successfully.
        Exiting SAS3Flash.

# ./sas3flash -biosall mptsas3.rom 
Avago Technologies SAS3 Flash Utility
Version 16.00.00.00 (2017.05.02) 
Copyright 2008-2017 Avago Technologies. All rights reserved.

        Ignoring All other commands except for output flags

        Attempting to flash Boot Service to Avago SAS SAS3224(A1):

                Validating BIOS Image...

                BIOS Header Signature is Valid

                BIOS Image has a Valid Checksum. 

                BIOS PCI Structure Signature Valid.

                BIOS Image Compatible with the SAS Controller.

                Attempting to Flash BIOS Image...

                Verifying Download...

                Flash BIOS Image Successful.

        Finished Processing Commands Successfully.
        Exiting SAS3Flash.

Обновим прошивку контроллера:

# ./sas3flash -fwall SAS9305_24i_IT_P.bin 
Avago Technologies SAS3 Flash Utility
Version 16.00.00.00 (2017.05.02) 
Copyright 2008-2017 Avago Technologies. All rights reserved.

        Ignoring All other commands except for output flags

        Attempting to flash firmware to Avago SAS SAS3224(A1):

        Executing Operation: Flash Firmware Image

                Firmware Image has a Valid Checksum. 
                Firmware Version 16.00.12.00
                Firmware Image compatible with Controller. 

                Valid NVDATA Image found. 
                NVDATA Major Version 10.00 
                Checking for a compatible NVData image... 

                NVDATA Device ID and Chip Revision match verified.
                NVDATA Versions Compatible.
                Valid Initialization Image verified.
                Valid BootLoader Image verified.

                Beginning Firmware Download...
                Firmware Download Successful.

                Verifying Download...

                Firmware Flash Successful.

                Resetting Adapter...
                Adapter Successfully Reset.

                NVDATA Version 10.00.00.03
        Finished Processing Commands Successfully.
        Exiting SAS3Flash.

После прошивки контроллера в выводе команды dmesg можно обнаружить события, соответствующие перезапуску контроллера:

[ 6504.983597] mpt3sas_cm0: sending diag reset !!
[ 6508.896003] mpt3sas_cm0: diag reset: SUCCESS
[ 6508.963018] mpt3sas_cm0: CurrentHostPageSize is 0: Setting default host page size to 4k
[ 6509.119519] mpt3sas_cm0: _base_display_fwpkg_version: complete
[ 6509.119529] mpt3sas_cm0: FW Package Ver(16.00.12.00)
[ 6509.119967] mpt3sas_cm0: LSISAS3224: FWVersion(16.00.12.00), ChipRevision(0x01), BiosVersion(08.37.00.00)
[ 6509.119979] mpt3sas_cm0: Protocol=(Initiator,Target), Capabilities=(TLR,EEDP,Snapshot Buffer,Diag Trace Buffer,Task Set Full,NCQ)
[ 6509.120080] mpt3sas_cm0: sending port enable !!
[ 6518.187343] mpt3sas_cm0: port enable: SUCCESS
[ 6518.187496] mpt3sas_cm0: search for end-devices: start
[ 6518.188875] scsi target0:0:1: handle(0x0019), sas_addr(0x300062b207022208)
[ 6518.188887] scsi target0:0:1: enclosure logical id(0x500062b207022200), slot(19)
[ 6518.188950] scsi target0:0:2: handle(0x001a), sas_addr(0x300062b207022209)
[ 6518.188957] scsi target0:0:2: enclosure logical id(0x500062b207022200), slot(18)
[ 6518.189017] scsi target0:0:3: handle(0x001b), sas_addr(0x300062b20702220a)
[ 6518.189023] scsi target0:0:3: enclosure logical id(0x500062b207022200), slot(16)
[ 6518.189083] scsi target0:0:4: handle(0x001c), sas_addr(0x300062b20702220b)
[ 6518.189089] scsi target0:0:4: enclosure logical id(0x500062b207022200), slot(17)
[ 6518.189149] scsi target0:0:5: handle(0x001d), sas_addr(0x300062b20702220c)
[ 6518.189154] scsi target0:0:5: enclosure logical id(0x500062b207022200), slot(23)
[ 6518.189214] scsi target0:0:6: handle(0x001e), sas_addr(0x300062b20702220d)
[ 6518.189219] scsi target0:0:6: enclosure logical id(0x500062b207022200), slot(22)
[ 6518.189279] scsi target0:0:7: handle(0x001f), sas_addr(0x300062b20702220e)
[ 6518.189284] scsi target0:0:7: enclosure logical id(0x500062b207022200), slot(20)
[ 6518.189344] scsi target0:0:8: handle(0x0020), sas_addr(0x300062b20702220f)
[ 6518.189350] scsi target0:0:8: enclosure logical id(0x500062b207022200), slot(21)
[ 6518.189410] scsi target0:0:9: handle(0x0021), sas_addr(0x300062b207022210)
[ 6518.189415] scsi target0:0:9: enclosure logical id(0x500062b207022200), slot(11)
[ 6518.189474] scsi target0:0:10: handle(0x0022), sas_addr(0x300062b207022211)
[ 6518.189480] scsi target0:0:10: enclosure logical id(0x500062b207022200), slot(10)
[ 6518.189541] scsi target0:0:0: handle(0x0023), sas_addr(0x300062b207022212)
[ 6518.189547] scsi target0:0:0: enclosure logical id(0x500062b207022200), slot(8)
[ 6518.189607] scsi target0:0:11: handle(0x0024), sas_addr(0x300062b207022213)
[ 6518.189613] scsi target0:0:11: enclosure logical id(0x500062b207022200), slot(9)
[ 6518.189672] scsi target0:0:12: handle(0x0025), sas_addr(0x300062b207022214)
[ 6518.189678] scsi target0:0:12: enclosure logical id(0x500062b207022200), slot(15)
[ 6518.189738] scsi target0:0:13: handle(0x0026), sas_addr(0x300062b207022215)
[ 6518.189743] scsi target0:0:13: enclosure logical id(0x500062b207022200), slot(14)
[ 6518.189804] scsi target0:0:14: handle(0x0027), sas_addr(0x300062b207022216)
[ 6518.189809] scsi target0:0:14: enclosure logical id(0x500062b207022200), slot(12)
[ 6518.189870] scsi target0:0:15: handle(0x0028), sas_addr(0x300062b207022217)
[ 6518.189875] scsi target0:0:15: enclosure logical id(0x500062b207022200), slot(13)
[ 6518.189960] mpt3sas_cm0: search for end-devices: complete
[ 6518.189964] mpt3sas_cm0: search for end-devices: start
[ 6518.189967] mpt3sas_cm0: search for PCIe end-devices: complete
[ 6518.189970] mpt3sas_cm0: search for expanders: start
[ 6518.189973] mpt3sas_cm0: search for expanders: complete
[ 6518.189982] mpt3sas_cm0: mpt3sas_base_hard_reset_handler: SUCCESS
[ 6518.189987] mpt3sas_cm0: Ioctl: host reset: SUCCESS
[ 6518.190052] mpt3sas_cm0: removing unresponding devices: start
[ 6518.190061] mpt3sas_cm0: removing unresponding devices: end-devices
[ 6518.190070] mpt3sas_cm0: Removing unresponding devices: pcie end-devices
[ 6518.190074] mpt3sas_cm0: removing unresponding devices: expanders
[ 6518.190078] mpt3sas_cm0: removing unresponding devices: complete
[ 6518.190097] mpt3sas_cm0: scan devices: start
[ 6518.190953] mpt3sas_cm0:     scan devices: expanders start
[ 6518.191023] mpt3sas_cm0:     break from expander scan: ioc_status(0x0022), loginfo(0x310f0400)
[ 6518.191029] mpt3sas_cm0:     scan devices: expanders complete
[ 6518.191033] mpt3sas_cm0:     scan devices: end devices start
[ 6518.193085] mpt3sas_cm0:     break from end device scan: ioc_status(0x0022), loginfo(0x310f0400)
[ 6518.193094] mpt3sas_cm0:     scan devices: end devices complete
[ 6518.193097] mpt3sas_cm0:     scan devices: pcie end devices start
[ 6518.193117] mpt3sas_cm0: log_info(0x3003011d): originator(IOP), code(0x03), sub_code(0x011d)
[ 6518.193145] mpt3sas_cm0: log_info(0x3003011d): originator(IOP), code(0x03), sub_code(0x011d)
[ 6518.193156] mpt3sas_cm0:     break from pcie end device scan: ioc_status(0x0021), loginfo(0x3003011d)
[ 6518.193161] mpt3sas_cm0:     pcie devices: pcie end devices complete
[ 6518.193164] mpt3sas_cm0: scan devices: complete
[ 6518.312995] sd 0:0:0:0: Power-on or device reset occurred
[ 6518.313051] sd 0:0:11:0: Power-on or device reset occurred

Несмотря на то, что операционная система не потеряла доступ к дискам, я предпочёл всё же перезагрузить сервер.

Теперь можно убедиться, что версии прошивки и BIOS контроллера дисков повысились:

# ./sas3flash -listall
Avago Technologies SAS3 Flash Utility
Version 16.00.00.00 (2017.05.02) 
Copyright 2008-2017 Avago Technologies. All rights reserved.

        Adapter Selected is a Avago SAS: SAS3224(A1)

Num   Ctlr            FW Ver        NVDATA        x86-BIOS         PCI Addr
----------------------------------------------------------------------------

0  SAS3224(A1)  16.00.12.00    10.00.00.03    08.37.02.00     00:18:00:00

        Finished Processing Commands Successfully.
        Exiting SAS3Flash.

Из вывода команды можно заметить, что версия прошивки контроллера обновилась с 16.00.01.00 до 16.00.12.00, а версия BIOS контроллера обновилась с 08.37.00.00 до 08.37.02.00.