Вопрос или проблема
Прикрепляю немного больше журнала загрузки.
HugeTLB зарегистрирован 1.00 GiB размер страницы, предварительно выделено 0 страниц
HugeTLB зарегистрирован 32.0 MiB размер страницы, предварительно выделено 0 страниц
HugeTLB зарегистрирован 2.00 MiB размер страницы, предварительно выделено 0 страниц
HugeTLB зарегистрирован 64.0 KiB размер страницы, предварительно выделено 0 страниц
iommu: Тип домена по умолчанию: Переведенный
iommu: Политика аннулирования TLB для домена DMA: строгий режим
SCSI подсистема инициализирована
EDAC MC: Вер: 3.0.0
clocksource: Переключено на source arch_sys_counter
workingset: timestamp_bits=62 max_order=19 bucket_order=0
Слой блоков SCSI generic (bsg) драйвер версии 0.4 загружен (major 252)
io scheduler mq-deadline зарегистрирован
cacheinfo: Не удалось обнаружить иерархию кэша для CPU 0
brd: модуль загружен
VFS: Смонтировано корневое (tmpfs файловая система) на устройстве 0:15.
Освобождение неиспользуемой памяти ядра: 704K
Запуск /init как процесса init
с аргументами:
/init
с окружением:
HOME=/
TERM=linux
Kernel panic - не синхронизируется: Запрошенный init /init завершился неудачей (ошибка -2).
CPU: 0 PID: 1 Comm: swapper/0 Не испорчен 5.15.0-rc7-00001-g8d7daa446b53-dirty #33
Трассировка вызовов:
dump_backtrace+0x0/0x1d0
show_stack+0x14/0x20
dump_stack_lvl+0x64/0x7c
dump_stack+0x14/0x2c
panic+0x158/0x304
kernel_init+0xf0/0x150
ret_from_fork+0x10/0x20
Смещение ядра: отключено
Особенности CPU: 0x00001001,20000802
Лимит памяти: нет
---[ конец Kernel panic - не синхронизируется: Запрошенный init /init завершился неудачей (ошибка -2). ]---
Я строю встроенную Linux ОС для экспериментальной платформы FPGA. Я использовал upstream U-boot(загрузчик), linux(ядро) и buildroot(только для файловой системы).
Я следовал нескольким примерам и включил необходимую поддержку initrd/initramfs в своей конфигурации linux.
CONFIG_BLK_DEV_INITRD=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=1
CONFIG_BLK_DEV_RAM_SIZE=10240
Я использовал команду bootm в u-boot для загрузки FIT-образа, который состоит из ядра linux, dtb и rootfs.cpio(скомпилированного из buildroot). Соответствующая информация здесь:FIT_Test
Вот bootargs, переданные в ядро:
console=ttyS0,9600 earlyprintk maxcpus=1 earlycon root=/dev/ram init=/init rw rootfstype=tmpfs debug
Примечание:
Несколько других вещей, которые я попытался сделать, но все равно получил ту же ошибку.
- Передача ядра, dtb и изображения fs отдельно.
- Попытался создать базовый initramfs с просто init-скриптом, простой структурой каталогов и отдельно скомпилированным busybox, помещенным в /bin/busybox с символическими ссылками.
- Вместо передачи внешней FS, я передал путь к исходнику initramfs и скомпилировал его в ядро с CONFIG_INITRAMFS_SOURCE.
Я был бы признателен за любые отзывы/подсказки о том, чего я мог бы не заметить, уже некоторое время застрял на этом.
Загрузка linux успешно дошла до командной строки. Я переключился на другую цепочку инструментов компилятора gcc arm. Я пробовал версии aarch64-linux-gnu- и linaro, и они не сработали. Но использование aarch64-none-linux-gnu- (версия 10.3) сработало. Не знаю, почему это изменило ситуацию. Использование Initramfs определенно помогло прогрессу загрузки.
Хотя я не уверен, почему цепочка инструментов aarch64-none-linux-gnu- решила ваши проблемы, мне удалось преодолеть эту проблему, заставив busybox быть статически связанным.
Ответ или решение
Анализ и решение проблемы "Kernel panic – not syncing: Requested init /init failed (error -2)"
Введение
Сообщение об ошибке, возникающее в процессе загрузки ядра Linux, содержит ключевую информацию, которая поможет диагностировать и решить проблему. В данном случае, ошибка "Kernel panic – not syncing: Requested init /init failed (error -2)" связана с отсутствием файла инициализации /init
, который не может быть загружен. Это сообщение указывает на сбой в процессе загрузки, что зачастую связано с неправильной конфигурацией файловой системы или отсутствием необходимых файлов.
Контекст и детали проблемы
Ваш проект включает в себя создание встроенной операционной системы Linux для экспериментальной платформы FPGA с использованием Upstream U-Boot в качестве загрузчика, ядра Linux и Buildroot для файловой системы. Обратите внимание на несколько важных аспектов:
-
Конфигурация ядра:
Вы правильно включили поддержкуinitrd/initramfs
, что позволило загружать файловую систему в память. Однако, надо убедиться, что вы правильно настроили конфигурацииCONFIG_BLK_DEV_INITRD
,CONFIG_BLK_DEV_RAM
,CONFIG_BLK_DEV_RAM_COUNT
иCONFIG_BLK_DEV_RAM_SIZE
. -
Переданные аргументы загрузки:
Аргументы, которые вы передаете ядру, также должны быть тщательно проверены. Обратите внимание наroot=/dev/ram
, который указывает ядру на использование временной файловой системы (tmpfs). Убедитесь, что эта файловая система действительно содержит корректные файлы, включаяinit
. -
Загрузка образов:
Вы упомянули, что использовали командуbootm
в U-Boot для загрузки FIT-изображения, содержащего ядро, DTB и корневую файловую систему в формате cpio. Убедитесь, что в вашем FIT-образе корректно упакованы все компоненты.
Возможные причины и пути решения
-
Отсутствие файла
/init
:
Ошибкаerror -2
обычно указывает на то, что не найден файл или директория. Вам следует удостовериться, что файлinit
действительно присутствует в корневой файловой системе. В случае с cpio-архивом его структура должна включать нужные файлы по стандартному пути. -
Статическая компиляция BusyBox:
Недостаток необходимых библиотек может вызывать проблемы при загрузке. Вы уже упомянули, что статическая компиляция BusyBox позволила вам продвинуться дальше. Это решение позволяет избежать зависимостей от динамически линковочных библиотек, которые могут отсутствовать в образе вашего initramfs. -
Проблемы с инструментом сборки:
Вы заметили, что изменение инструментов сборки наaarch64-none-linux-gnu-
помогло. Это может быть связано с различиями в настройках компилятора, которые влияют на подходящие библиотеки и оптимизации для вашего целевого оборудования. Убедитесь, что выбранный вами инструмент соответствует требованиям вашего проекта. -
Разделение образов для загрузки:
Если использование FIT-образа не дало результата, стоит рассмотреть возможность загрузки ядра, DTB и файловой системы по отдельности. Это поможет легко идентифицировать сбой в загрузке каждого компонента. -
Анализ загрузочного лога:
Рекомендуется внимательно проанализировать загрузочный лог, чтобы выявить любые дополнительные ошибки или предупреждения, которые могут указать на источник проблемы.
Заключение
Решение проблемы с загрузкой системы требует всестороннего анализа и проверки всех компонентов вашего проекта. Следует систематически исключать возможные причины и тестировать каждый элемент — от конфигурации ядра до структуру файлов. Результаты статической компиляции и использование различных инструментов сборки продемонстрировали, что даже небольшие изменения могут существенно повлиять на успешность загрузки. Надеюсь, приведённые рекомендации помогут вам в дальнейшем разрешении данной проблемы и успешной реализации вашего проекта.