Вопрос или проблема
Я работаю над историческими дистрибутивами 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. Вот шаги, которые вам нужно выполнить:
-
Редактирование файла конфигурации модуля:
Откройте файл/etc/modules.conf
с помощью текстового редактора и добавьте следующую строку:alias scsi_hostadapter1 sata_sil
Если в файле уже есть строка с
alias scsi_hostadapter
, добавьте1
в конце, как показано выше, чтобы указать, что это второй контроллер. Если строкиalias scsi_hostadapter
нет, просто добавьте строку без1
. -
Пересоздание 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 во время работы системы, это можно сделать следующим образом:
-
Ручное добавление устройства:
Определите, какой хост адаптер используется, командой:cat /proc/scsi/scsi
-
Ресканирование:
После определения хоста и новых устройств, выполните команду для добавления устройства:echo "scsi add-single-device H C I L" > /proc/scsi/scsi
где
H
,C
,I
, иL
— хост, канал, ID и номер логического устройства соответственно.
Заключение
Следуя вышеизложенным шагам, вы сможете настроить автоматическую загрузку модуля sata_sil
во время старта системы, что должно позволить вашему SATA-устройству быть доступным для операционной системы с момента загрузки. Если проблемы сохраняются, убедитесь, что контроллер и подключенные устройства совместимы с ядром 2.4.x, так как поддержка некоторых современных устройств может оказывать влияние на обнаружение.