Какова правильная процедура загрузки модуля ядра при запуске в RHEL/CentOS 2.1 (ядро 2.4.x)?

Вопрос или проблема

Я работаю над историческими дистрибутивами Linux и столкнулся с проблемой управления дисками. RHEL/CentOS 2.1 поставляется с ядром Linux 2.4.x, которое включает очень раннюю поддержку SATA-устройств. Я уже обновил до окончательной версии ядра 2.4.9-e.74, которое включает поддержку необходимого модуля ядра sata_sil.o. Однако я не могу заставить подключенное устройство появиться, когда запускаю fdisk -l, поэтому не могу его смонтировать.

Я вижу свой основной диск на шине ATA:

# fdisk -l

Диск /dev/hda: 255 головок, 63 сектора, 15566 цилиндров
Единицы = цилиндры по 16065 * 512 байт

   Устройство Загрузка    Начало       Конец    Блоки   Id  Система
/dev/hda1   *         1        64    512000   83  Linux
Раздел 1 не заканчивается на границе цилиндра:
     phys=(63, 221, 30) должно быть (63, 254, 63)
/dev/hda2            64       325   2097152   82  Linux swap
Раздел 2 не заканчивается на границе цилиндра:
     phys=(324, 242, 46) должно быть (324, 254, 63)
/dev/hda3           325     15567 122424320   83  Linux

Мой SATA-диск распознается самим адаптером, но не определяется операционной системой при загрузке, что, я полагаю, и является источником проблемы. Мне каждый раз приходится загружать модуль ядра вручную.

# modprobe -a sata_sil
  Производитель: ATA       Модель: CT500MX500SSD1    Версия: M3CR
  Тип:   Прямой доступ                      ANSI SCSI версия: 05

Устройство определяется правильно, что можно подтвердить через dmesg.

# dmesg
...
Драйвер подсистемы SCSI Версия: 1.00
libata версия 1.02 загружена.
sata_sil версия 0.54
PCI: Найден IRQ 10 для устройства 00:09.0
PCI: Совместное использование IRQ 10 с 00:04.2
ata1: SATA max UDMA/100 cmd 0xE89B3080 ctl 0xE89B308A bmdma 0xE89B3000 irq 10
ata2: SATA max UDMA/100 cmd 0xE89B30C0 ctl 0xE89B30CA bmdma 0xE89B3008 irq 10
ata1: dev 0 cfg 49:2f00 82:706b 83:7409 84:4163 85:7069 86:b409 87:4163 88:407f
ata1: dev 0 ATA, max UDMA/133, 976773168 секторов: lba48
ata1: dev 0 настроен для UDMA/100
ata2: устройство не найдено (phy stat 00000000)
scsi0 : sata_sil
scsi1 : sata_sil
  Производитель: ATA       Модель: CT500MX500SSD1    Версия: M3CR
  Тип:   Прямой доступ                      ANSI SCSI версия: 05

Я также вижу устройство в /proc/scsi/scsi.

# cat /proc/scsi/scsi
Прикрепленные устройства:
Хост: scsi0 Канал: 00 ID: 00 LUN: 00
  Производитель: ATA      Модель: CT500MX500SSD1   Версия: M3CR
  Тип:   Прямой доступ                    ANSI SCSI версия: 05

Red Hat Enterprise Linux 2.1 использует более старую версию ядра (серия 2.4), которая предшествует файловой системе /sys, введенной в серии 2.6. Поэтому для повторного сканирования устройств в RHEL 2.1 необходимо действовать иначе, чем в более поздних релизах. ChatGPT предоставил следующую рекомендацию.

Сканирование шины SCSI вручную

В старых системах SATA-устройства часто рассматривались как SCSI-устройства. Вы можете попробовать принудительно запустить повторное сканирование шины SCSI, записав в интерфейс /proc/scsi/scsi. Это иногда помогает системе распознать новые диски.

Чтобы повторно просканировать шину SCSI, выполните следующие действия:

Сначала определите адаптер хоста SCSI:

    cat /proc/scsi/scsi

Затем вызовите повторное сканирование шины SCSI:

    echo "scsi add-single-device H C I L" > /proc/scsi/scsi

Замените H, C, I и L на хост, канал, ID и LUN вашего диска. Например, если ваше устройство находится на хосте 0, канале 0, ID 0 и LUN 0, команда будет:

    echo "scsi add-single-device 0 0 0 0" > /proc/scsi/scsi

Проверьте dmesg на наличие любых сообщений, связанных с новым устройством.

Это не дало никаких результатов.

Я хотел бы, чтобы это заработало, так как я смог заставить работать CentOS 3.9, 4.9, 5.11 и 6.10 с этим же SATA-адаптером. У меня есть другие планы для шины ATA, и мне бы хотелось, чтобы эта система загружалась с SATA-адаптера, если это возможно.

Хотя Silicon Image и выпустила официальные драйверы для Linux, они предоставили только предварительно скомпилированные модули ядра, ни один из которых не совместим. Мой единственный вариант — это модуль ядра sata_sil.

Из того опыта, который я получил, работая с этими старыми релизами, я полагаю, что с драйвером все в порядке, и это какая-то ошибка пользователя. Модуль ядра sata_sil не был включен в оригинальный релиз ядра 2.4.9-e.40, поэтому я полагаю, что проблема в том, что модуль ядра не загружается до того, как система сканирует подключенные устройства, и я не знаю, как это исправить.

Я пытался добавить следующую строку в /etc/modules.conf, но это не привело к тому, что модуль ядра загружался при загрузке.

alias sii3112 sata_sil

Я пробовал запускать kudzu — утилиту для обнаружения аппаратного обеспечения.

kudzu --probe

Я думаю, что это автоматически запускается при загрузке, но я могу подтвердить, что адаптер распознается правильно, а также правильно указывается модуль ядра, проверив /etc/sysconfig/hwconf.

...
class: OTHER
bus: PCI
detached: 0
driver: sata_sil
desc: "CMD Technology Inc|Silicon Image SiI 3112 SATARaid Controller"
vendorId: 1095
deviceId: 3112
subVendorId: 1095
subDeviceId: 3112
pciType: 1
...

Я пытался добавить modprobe sata_sil в /etc/rc.local. Хотя это и гарантирует, что модуль ядра загружается при загрузке, этот файл выполняется после всех остальных инициализационных скриптов, что не отличается от загрузки его после входа в систему, что не позволяет устройству появиться в fdisk -l.

Я также пробовал создать новый initrd после загрузки модуля ядра sata_sil. Это тоже не сработало.

# mkinitrd initrd-2.4.9-e.74.img 2.4.9-e.74

Какова правильная процедура настройки системы для загрузки модуля ядра sata_sil при загрузке в RHEL/CentOS 2.1 (ядро 2.4.x)? Я также хотел бы знать, возможно ли повторное сканирование шины SCSI/SATA во время работы, чтобы заставить диск работать без перезагрузки.

Дополнительная информация

Этот вопрос включает примеры, которые указывают на то, что я тестировал с Crucial MX500 500GB (CT500MX500SSD1). Я не знаю, была ли когда-либо добавлена поддержка LBA48 к этому конкретному ядру, но это не источник проблемы. Я подтвердил это, заменив диск на 128GB и продолжив сталкиваться с той же проблемой.

Прогресс

Мне удалось найти обходной путь, чтобы заставить эти диски определяться и монтироваться. Нужно снова создать initrd, используя параметры --with=scsi_mod --with=sd_mod --with=sata_sil. Добавление этих модулей в /etc/modules.conf не дает результата.

mkinitrd --with=scsi_mod --with=sd_mod --with=sata_sil /boot/initrd-$(uname -r).img $(uname -r)

Однако, есть еще один шаг. modprobe sata_sil все еще нужно вызывать после загрузки системы, либо вручную, либо через rc.local. Вывод также отличается от предыдущего, в нем показывается, что диск был подключен.

# modprobe sata_sil
  Производитель: ATA       Модель: Samsung SSD 850   Версия: EXM0
  Тип:   Прямой доступ                      ANSI SCSI версия: 05
Прикрепленный scsi-диск sda на scsi1, канале 0, id 0, lun 0
SCSI-устройство sda: 250069680 512-байтных секторов (128036 MB)

Хотя это позволяет мне монтировать SATA-диск, поскольку процесс не происходит автоматически во время загрузки, я не могу загрузиться с этого диска, что и является моей целью.

Я могу подтвердить, что это не проблема с модулем ядра sata_sil конкретно. Я воспроизвел ту же проблему и обходной путь с контроллером SATA марки Promise.

Как я могу заставить систему автоматически загружать этот модуль и загрузить его достаточно рано, чтобы сделать его доступным для загрузки?

Я думаю, что ваш файл /etc/modules.conf может уже содержать строку вроде

alias scsi_hostadapter ata_piix

Это касается контроллера вашего основного диска. Чтобы указать системе загрузить драйвер второго контроллера хранения, добавьте эту строку:

alias scsi_hostadapter1 sata_sil

в тот же файл. Это указывает системе автоматически загружать модуль sata_sil очень рано в процессе загрузки. (Если в существующей строке alias scsi_hostadapter ... нет, уберите 1 из новой строки.)

Затем перегенерируйте ваш initrd:

mkinitrd -f /boot/initrd-$(uname -r).img $(uname -r)

После этих шагов модуль sata_sil должен автоматически загружаться при загрузке.

Обратите внимание, что в старом 2.4 серии ядре (P)ATA диски будут отображаться как /dev/hd[a-d], но sata_sil рассматривается как драйвер SCSI-устройства, так что SATA-диски должны отображаться как `/dev/sd[a-z]*’

RHEL 2.1 также может содержать команду lsscsi (возможно в отдельном пакете), которая может быть полезна для любых “SCSI-подобных” устройств.

Ответ или решение

Конечно, давайте разберёмся с вашей проблемой, связанной с загрузкой модуля ядра для SATA-контроллера sata_sil в RHEL/CentOS 2.1 с ядром 2.4.x.

Правильная процедура загрузки модуля ядра при старте

Для того чтобы модуль sata_sil загружался автоматически во время загрузки системы, вам необходимо внести изменения в файл /etc/modules.conf и заново сгенерировать initrd. Вот шаги, которые вам нужно выполнить:

  1. Редактирование файла конфигурации модуля:
    Откройте файл /etc/modules.conf с помощью текстового редактора и добавьте следующую строку:

    alias scsi_hostadapter1 sata_sil

    Если в файле уже есть строка с alias scsi_hostadapter, добавьте 1 в конце, как показано выше, чтобы указать, что это второй контроллер. Если строки alias scsi_hostadapter нет, просто добавьте строку без 1.

  2. Пересоздание initrd:
    После внесения изменений в /etc/modules.conf, вам нужно пересоздать образ initrd, чтобы он включал новый модуль. Выполните следующую команду:

    mkinitrd -f /boot/initrd-$(uname -r).img $(uname -r)

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

Проверка конфигурации

После выполнения вышеуказанных шагов перезагрузите систему и проверьте, загружается ли модуль sata_sil автоматически. Вы можете использовать команду dmesg для проверки сообщений о загрузке и убедиться, что устройство теперь распознаётся:

dmesg | grep -i sata

Ресканирование SCSI/SATA шины во время работы

Если вам нужно вручную ресканировать шину SCSI/SATA во время работы системы, это можно сделать следующим образом:

  1. Ручное добавление устройства:
    Определите, какой хост адаптер используется, командой:

    cat /proc/scsi/scsi
  2. Ресканирование:
    После определения хоста и новых устройств, выполните команду для добавления устройства:

    echo "scsi add-single-device H C I L" > /proc/scsi/scsi

    где H, C, I, и L — хост, канал, ID и номер логического устройства соответственно.

Заключение

Следуя вышеизложенным шагам, вы сможете настроить автоматическую загрузку модуля sata_sil во время старта системы, что должно позволить вашему SATA-устройству быть доступным для операционной системы с момента загрузки. Если проблемы сохраняются, убедитесь, что контроллер и подключенные устройства совместимы с ядром 2.4.x, так как поддержка некоторых современных устройств может оказывать влияние на обнаружение.

Оцените материал
Добавить комментарий

Капча загружается...