Вопрос или проблема
Я пытаюсь запустить свой собственный init
скрипт на некотором аппаратном обеспечении ARM и Debian Jessie с systemd. Общая концепция загрузки и init
скрипт практически идентичны x86 варианту, который работает хорошо. Для обоих устройств весь образ SD-карты предварительно был собран на хосте x86.
Когда я запускаю на оборудовании ARM с доступом к последовательной консоли, я вижу, что мой init
скрипт работает нормально до момента, когда вызывается switch_root
:
exec switch_root -c /dev/console /newroot /sbin/init
После этого ничего не происходит. Сообщений об ошибках не выводится – что затрудняет выявление проблемы.
Команда ядра выглядит так…
ro root=LABEL=IM_BOOT1 panic=10 mem=256M console=ttyS0,115200 systemd.log_level=debug
…и, насколько я знаю, это должно заставить systemd
выводить максимальное количество отладочных сообщений. К сожалению, ничего не выводится.
Есть ли у вас идеи/подсказки, что я мог бы сделать, чтобы понять, что может быть причиной зависания, или, другими словами, понять, что происходит?
Единственная странная деталь – это некоторые предупреждения в журнале ядра перед вызовом switch_root
:
<snip>
ext4: Unknown symbol jbd2_journal_errno (err 0)
ext4: Unknown symbol jbd2_journal_begin_ordered_truncate (err 0)
ext4: Unknown symbol jbd2_journal_flush (err 0)
ext4: Unknown symbol mb_cache_entry_find_next (err 0)
squashfs: version 4.0 (2009/01/31) Phillip Lougher
aufs 3.16-20150928
usbhid: Unknown symbol hid_output_report (err 0)
usbhid: Unknown symbol hidinput_count_leds (err 0)
usbhid: Unknown symbol hid_allocate_device (err 0)
usbhid: Unknown symbol hid_destroy_device (err 0)
usbhid: Unknown symbol hid_alloc_report_buf (err 0)
usbhid: Unknown symbol hid_set_field (err 0)
usbhid: Unknown symbol hid_check_keys_pressed (err 0)
usbhid: Unknown symbol hid_input_report (err 0)
usbhid: Unknown symbol hid_debug (err 0)
usbhid: Unknown symbol __hid_request (err 0)
usbhid: Unknown symbol hid_parse_report (err 0)
usbhid: Unknown symbol hid_add_device (err 0)
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
usb_storage: Unknown symbol scsi_report_device_reset (err 0)
usb_storage: Unknown symbol scsi_remove_host (err 0)
usb_storage: Unknown symbol scsi_report_bus_reset (err 0)
usb_storage: Unknown symbol scsi_sense_desc_find (err 0)
usb_storage: Unknown symbol scsi_eh_prep_cmnd (err 0)
usb_storage: Unknown symbol scsi_host_put (err 0)
usb_storage: Unknown symbol scsi_scan_host (err 0)
usb_storage: Unknown symbol scsi_is_host_device (err 0)
<snip>
…тем не менее, эти модули кажутся работающими нормально. Я не знаю, связано ли это.
Некоторые дополнительные детали:
- Установка Debian подготовлена с помощью
debootstrap
(тот же метод работает идеально на x86) - Кастомное ядро:
Linux (none) 3.16.7 #1 Mon Nov 16 08:32:55 UTC 2015 armv5tejl GNU/Linux
, пропатченное с помощью AUFS и специфического для оборудования дерева устройств - И ядро, и корневая файловая система собраны с помощью QEMU на x86 хосте
initramfs
загружается с BusyBox, настраивает конечную корневую файловую систему AUFS и в конечном итоге вызываетswitch_root
. Тот же метод (почти 100% идентичныйinit
скрипт) работает хорошо на x86- Я могу запустить интерактивную оболочку сразу перед запуском
switch_root
, и я не могу найти ничего, что не работает так, как ожидалось в этот момент
Выяснилось, что ядру не хватает некоторых важных настроек, которые необходимы для systemd
.
http://cgit.freedesktop.org/systemd/systemd/tree/README показывает, какие настройки конфигурации ядра были необходимы.
После настройки systemd
начал работать немедленно.
Ответ или решение
Для устранения проблемы заморозки systemd init
во время загрузки на вашем ARM-аппарате под управлением Debian Jessie, следует предпринять несколько шагов по отладке и изменению конфигурации ядра.
Анализ ситуации
Судя по вашему описанию, процесс загрузки успешно выполняется до вызова switch_root
, после чего вообще ничего не происходит, и отсутствуют какие-либо сообщения об ошибках. Этот симптом часто указывает на то, что система не может перейти к следующему этапу инициализации из-за отсутствия необходимых функций или модулей, требуемых systemd
.
Вы упомянули о желательных параметрах командной строки ядра, с которыми производится загрузка. Ваша строка содержит systemd.log_level=debug
, что должно позволить получать максимальные отладочные сообщения от systemd
. Однако их отсутствие указывает на то, что проблема могла возникнуть до этого этапа.
Возможные проблемы и их решение
-
Проверьте конфигурацию ядра: Как вы уже отметили, некоторые символы, нужные для работы под системами, используют модули, не загружаются с вашим ядром (например, для файловой системы ext4). Убедитесь, что ваш ядро сконфигурировано с необходимыми опциями. Обратите внимание на следующее:
- Убедитесь, что включены опции, связанные с
CONFIG_BLK_DEV_INITRD
. - Параметры для файловой системы и модули, требуемые для
systemd
, могут быть указаны в документации systemd.
- Убедитесь, что включены опции, связанные с
-
Проверка логов ядра: Обратите внимание на предупреждения о неопознанных символах в журналах ядра. Это может указывать на отсутствие модуля или ошибки в конфигурации модуля. Такие проблемы обычно исходят из несоответствия между версией ядра и модулями.
-
Параметры и модули инициализации: Измените остановку передачи управления от
initramfs
к вашей системе. Убедитесь, что все необходимые модули загружаются правильно. Вы можете временно включитьinit
в виде статики в ваше ядро или убедиться, что требуемые модули присутствуют в initramfs. -
Тестирование на другом оборудовании: Если возможно, запустите подобный образ на x86 или на другом ARM-устройстве, чтобы посмотреть, работает ли он там. Это может помочь локализовать проблему как специфичную для оборудования.
Вывод
После того как вы внесли изменения в конфигурацию ядра и проверили все необходимые модули и символы, вы должны повторно протестировать загрузку вашего образа на платформе ARM. Если все сделано правильно, systemd
должен иметь возможность отработать корректно и вы сможете увидеть отладочные сообщения, если произойдет какая-либо ошибка.
Если вы все еще сталкиваетесь с проблемами, стоит рассмотреть возможность создания новейшего образа с использованием более актуальной версии Debian или ядра, так как ваша информация указывает на использование устаревшей версии системы.