Вопрос или проблема
Я пытаюсь запустить свой встроенный модуль с initramfs. В данный момент ‘init’ в этом initramfs просто выводит сообщение, чтобы проверить, выполняется ли он.
Мой скрипт инициализации:
#!/bin/sh
echo "HELLO INITRAMFS"
Мой файл cpio для initramfs содержит статически связанный busybox. ‘init’ находится в /init в файловой системе. Сначала я создаю архив cpio, а затем конвертирую его для u-boot.
(find initramfs-test | cpio -o -H newc --quiet) > initramfs.cpio
mkimage -A arm -a 80008000 -e 80008000 -T ramdisk -C none -n uInitrd -d initramfs.cpio ./uInitrd
Я помещаю этот файл uInitrd вместе с моим ядром в FAT-раздел на SD-карте и, загрузившись на командную строку u-boot, загружаю оба файла в память, устанавливаю свои bootargs и загружаю.
RIM-U-Boot# fatload mmc 0 0x81000000 uImage
чтение uImage
4024775 байт прочитано за 415 мс (9.2 MiB/s)
RIM-U-Boot# fatload mmc 0 0x85000000 uInitrd
чтение uInitrd
1410112 байт прочитано за 148 мс (9.1 MiB/s)
RIM-U-Boot# setenv bootargs console=${console} root=/dev/ram0 rootfstype=ramfs initrd=0x85000000
RIM-U-Boot# bootm 0x81000000 0x85000000
## Загрузка ядра из образа Legacy на 81000000 ...
Имя изображения: Linux 4.1 + Devicetree
Тип изображения: ARM Linux Kernel Image (несжатый)
Размер данных: 4024711 байт = 3.8 MiB
Адрес загрузки: 80008000
Точка входа: 80008000
Проверка контрольной суммы ... ОК
## Загружается init Ramdisk из образа Legacy на 85000000 ...
Имя изображения: uInitrd
Тип изображения: ARM Linux RAMDisk Image (несжатый)
Размер данных: 1410048 байт = 1.3 MiB
Адрес загрузки: 80008000
Точка входа: 80008000
Проверка контрольной суммы ... ОК
Загружается изображение ядра ... ОК
OK
Запуск ядра ...
[ 0.000000] Загрузка Linux на физическом CPU 0x0
[ 0.000000] Инициализация подсистем cgroup cpuset
[ 0.000000] Инициализация подсистем cgroup cpu
[ 0.000000] Инициализация подсистем cgroup cpuacct
[ 0.000000] Версия Linux 4.1.18-ts-armv7l-crown-1.0 (mjohn@vbox) (версия gcc 4.8.3 (Timesys 20161024) ) #1 SMP Вт Ноя 13 16:40:10 EST 2018
[ 0.000000] CPU: ARMv7 Processor [413fc082] ревизия 2 (ARMv7), cr=10c5387d
[ 0.000000] CPU: PIPT / VIPT неализационная кэш данных, VIPT ализационная кэш инструкций
[ 0.000000] Модель машины: Crown RIM
[ 0.000000] cma: Зарезервировано 16 MiB при 0x86800000
[ 0.000000] Политика памяти: Запись данных кэша
[ 0.000000] CPU: Все CPU(ы) запущены в SVC режиме.
[ 0.000000] AM335X ES2.1 (неон )
[ 0.000000] PERCPU: Встроенные 13 страниц/CPU @c7c77000 s23296 r8192 d21760 u53248
[ 0.000000] Составлено 1 zonelists в порядке зоны, группировка мобильности включена. Всего страниц: 31968
[ 0.000000] Командная строка ядра: console=ttyO3,115200n8 root=/dev/ram0 rootfstype=ramfs initrd=0x85000000
[ 0.000000] Записи хеш-таблицы PID: 512 (порядок: -1, 2048 байт)
[ 0.000000] Записи хеш-таблицы кэш-дент: 16384 (порядок: 4, 65536 байт)
[ 0.000000] Записи хеш-таблицы кэш-инод: 8192 (порядок: 3, 32768 байт)
[ 0.000000] Память: 91580K/129024K доступно (7192K код ядра, 871K rwdata, 2580K rodata, 464K init, 8225K bss, 21060K резервировано, 16384K cma-зарезервировано, 0K highmem)
[ 0.000000] Виртуальная память ядра:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
[ 0.000000] vmalloc : 0xc8800000 - 0xff000000 ( 872 МБ)
[ 0.000000] lowmem : 0xc0000000 - 0xc8000000 ( 128 МБ)
[ 0.000000] pkmap : 0xbfe00000 - 0xc0000000 ( 2 МБ)
[ 0.000000] modules : 0xbf000000 - 0xbfe00000 ( 14 МБ)
[ 0.000000] .text : 0xc0008000 - 0xc09935f0 (9774 kB)
[ 0.000000] .init : 0xc0994000 - 0xc0a08000 ( 464 kB)
[ 0.000000] .data : 0xc0a08000 - 0xc0ae1fd0 ( 872 kB)
[ 0.000000] .bss : 0xc0ae4000 - 0xc12ec688 (8226 kB)
[ 0.000000] Запуск RCU самопроверки
[ 0.000000] Иерархическая реализация RCU.
[ 0.000000] Проверка зависимостей блокировок RCU включена.
[ 0.000000] Дополнительная информация по CPU выводится с остановками.
[ 0.000000] RCU ограничивает CPU от NR_CPUS=2 до nr_cpu_ids=1.
[ 0.000000] RCU: Настройка геометрии для rcu_fanout_leaf=16, nr_cpu_ids=1
[ 0.000000] NR_IRQS:16 nr_irqs:16 16
[ 0.000000] IRQ: Найден INTC при 0xfa200000 (ревизия 5.0) с 128 прерываниями
[ 0.000000] OMAP clockevent source: timer2 на 24000000 Гц
[ 0.000021] sched_clock: 32 бита на 24 МГц, разрешение 41 нс, оборачивается каждые 89478484971 нс
[ 0.000052] clocksource timer1: маска: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns
[ 0.000118] OMAP clocksource: timer1 на 24000000 Гц
[ 0.001261] Консоль: цветное устройство-думка 80x30
[ 0.001339] Проверка зависимостей блокировки: Авторские права (c) 2006 Red Hat, Inc., Инго Молнар
[ 0.001352] ... MAX_LOCKDEP_SUBCLASSES: 8
[ 0.001363] ... MAX_LOCK_DEPTH: 48
[ 0.001373] ... MAX_LOCKDEP_KEYS: 8191
[ 0.001384] ... CLASSHASH_SIZE: 4096
[ 0.001393] ... MAX_LOCKDEP_ENTRIES: 32768
[ 0.001404] ... MAX_LOCKDEP_CHAINS: 65536
[ 0.001414] ... CHAINHASH_SIZE: 32768
[ 0.001424] память, используемая для информации о зависимости блокировок: 5167 kB
[ 0.001435] память на структуре задачи: 1152 байт
[ 0.001466] Калибровка задержки... 718.02 BogoMIPS (lpj=3590144)
[ 0.108307] pid_max: по умолчанию: 32768 минимум: 301
[ 0.108753] Инициализирована система безопасности
[ 0.109015] Записи хеш-таблицы кэша-монтажа: 1024 (порядок: 0, 4096 байт)
[ 0.109041] Записи хеш-таблицы кэша-точки монтажа: 1024 (порядок: 0, 4096 байт)
[ 0.113214] Инициализация подсистемы cgroup blkio
[ 0.113271] Инициализация подсистемы cgroup памяти
[ 0.113392] Инициализация подсистемы cgroup устройств
[ 0.113510] Инициализация подсистемы cgroup заморозки
[ 0.113689] Инициализация подсистемы cgroup perf_event
[ 0.113771] CPU: Тестирование согласованности буфера записи: ок
[ 0.115776] CPU0: поток -1, cpu 0, сокет -1, mpidr 0
[ 0.115920] Настройка статической идентификаторной карты для 0x80008280 - 0x800082f0
[ 0.126396] Запущено 1 CPU
[ 0.126434] SMP: Всего 1 процессор активирован (718.02 BogoMIPS).
[ 0.126448] CPU: Все CPU(ы) запущены в SVC режиме.
[ 0.131751] devtmpfs: инициализирован
[ 0.178685] Поддержка VFP v0.3: разработчик 41 архитектуры 3 часть 30 вариант c ревизия 3
[ 0.251639] omap_hwmod: debugss: _wait_target_disable не удалось
[ 0.308946] clocksource jiffies: маска: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[ 0.312216] core pinctrl: инициализирована подсистема pinctrl
[ 0.319501] СЕТЬ: Зарегистрирована семейство протоколов 16
[ 0.327296] DMA: предварительно выделен пул в 256 KiB для атомарных согласованных аллокаций
[ 0.330401] cpuidle: используется губернатор лестницы
[ 0.330444] cpuidle: используется губернатор меню
[ 0.347621] OMAP аппаратная версия GPIO 0.1
[ 0.379407] omap-gpmc 50000000.gpmc: не удалось найти pctldev для узла /ocp/l4_wkup@44c00000/scm@210000/pinmux@800/pinmux_nandflash_pins, отложенное исследование
[ 0.384981] Нет ATAG?
[ 0.385022] hw-breakpoint: архитектура отладки 0x4 не поддерживается.
[ 0.385802] omap4_sram_init: невозможно выделить sram, необходимый для обработки errata I688
[ 0.385826] omap4_sram_init: невозможно получить пул sram, необходимый для обработки errata I688
[ 0.446811] edma 49000000.edma: драйвер TI EDMA DMA engine
[ 0.449438] reg-fixed-voltage fixedregulator@1: не удалось найти pctldev для узла /ocp/l4_wkup@44c00000/scm@210000/pinmux@800/pinmux_wl12xx_gpio, отложенное исследование
[ 0.453649] Инициализирована подсистема SCSI
[ 0.455728] usbcore: зарегистрирован новый драйвер интерфейса usbfs
[ 0.455982] usbcore: зарегистрирован новый драйвер интерфейса hub
[ 0.456188] usbcore: зарегистрирован новый драйвер устройства usb
[ 0.479540] tps65910 0-002d: Нет поддержки прерываний, нет основного IRQ
[ 0.614304] omap_i2c 44e0b000.i2c: шина 0 rev0.11 на 100 кГц
[ 0.615013] pps_core: зарегистрирована версия API LinuxPPS вер. 1
[ 0.615032] pps_core: Программная версия 5.3.6 - Авторские права 2005-2007 Родольфо Джиометти [email protected]
[ 0.615109] Поддержка часов PTP зарегистрирована
[ 0.620004] Bluetooth: основная версия 2.20
[ 0.620170] СЕТЬ: Зарегистрирована семейство протоколов 31
[ 0.620185] Bluetooth: Инициализирован менеджер устройств и соединений HCI
[ 0.620332] Bluetooth: Инициализирован уровень сокетов HCI
[ 0.620370] Bluetooth: Инициализирован уровень сокетов L2CAP
[ 0.620592] Bluetooth: Инициализирован уровень сокетов SCO
[ 0.624095] Переключено на источник тактирования timer1
[ 0.820693] СЕТЬ: Зарегистрирована семейство протоколов 2
[ 0.823356] Хеш-таблицы установленных TCP: 1024 (порядок: 0, 4096 байт)
[ 0.823542] Хеш-таблицы привязки TCP: 1024 (порядок: 3, 36864 байт)
[ 0.824172] TCP: Хеш-таблицы настроены (установленные 1024 привязать 1024)
[ 0.824497] Хеш-таблицы UDP: 256 (порядок: 2, 20480 байт)
[ 0.824757] Хеш-таблицы UDP-Lite: 256 (порядок: 2, 20480 байт)
[ 0.825968] СЕТЬ: Зарегистрирована семейство протоколов 1
[ 0.828351] RPC: Зарегистрирован модуль транспортного протокола именованных UNIX-сокетов.
[ 0.828381] RPC: Зарегистрирован модуль транспортного протокола udp.
[ 0.828394] RPC: Зарегистрирован модуль транспортного протокола tcp.
[ 0.828407] RPC: Зарегистрирован модуль передачи обратного канала NFSv4.1 tcp.
[ 0.831337] CPU PMU: Не удалось разобрать /pmu/interrupt-affinity[0]
[ 0.831463] hw perfevents: включен с драйвером armv7_cortex_a8 PMU, 5 счетчиков доступно
[ 0.838002] хеш-таблицы futex: 256 (порядок: 2, 16384 байт)
[ 0.838313] аудит: инициализация подсистемы netlink (выключена)
[ 0.838639] аудит: type=2000 audit(0.830:1): инициализирован
[ 0.845262] VFS: Диск квот dquot_6.6.0
[ 0.845456] VFS: Записи хеш-таблицы кэша квот: 1024 (порядок 0, 4096 байт)
[ 0.847891] squashfs: версия 4.0 (31/01/2009) Филлип Лоугер
[ 0.849171] NFS: Регистрация типа ключа id_resolver
[ 0.849744] Тип ключа id_resolver зарегистрирован
[ 0.849764] Тип ключа id_legacy зарегистрирован
[ 0.860204] io scheduler noop зарегистрирован
[ 0.860252] io scheduler deadline зарегистрирован
[ 0.860327] io scheduler cfq зарегистрирован (по умолчанию)
[ 0.863209] pinctrl-single 44e10800.pinmux: 142 пина по адресу f9e10800 размером 568
[ 0.867560] Серийный: драйвер 8250/16550, 4 порта, разрешено совместное использование IRQ
[ 0.876098] omap_uart 44e09000.serial: нет wakeirq для uart0
[ 0.877001] 44e09000.serial: ttyO0 на MMIO 0x44e09000 (irq = 158, base_baud = 3000000) это OMAP UART0
[ 0.879864] omap_uart 48022000.serial: нет wakeirq для uart1
[ 0.880322] 48022000.serial: ttyO1 на MMIO 0x48022000 (irq = 159, base_baud = 3000000) это OMAP UART1
[ 0.882065] omap_uart 481a6000.serial: нет wakeirq для uart3
[ 0.882510] 481a6000.serial: ttyO3 на MMIO 0x481a6000 (irq = 160, base_baud = 3000000) это OMAP UART3
[ 1.699898] консоль [ttyO3] активирована
[ 1.705757] omap_uart 481aa000.serial: нет wakeirq для uart5
[ 1.712068] 481aa000.serial: ttyO5 на MMIO 0x481aa000 (irq = 161, base_baud = 3000000) это OMAP UART5
[ 1.760738] brd: модуль загружен
[ 1.785830] loop: модуль загружен
[ 1.789963] (stk): созданные записи sysfs
[ 1.800178] mtdoops: mtd устройство (mtddev=name/number) должно быть указано
[ 1.874092] davinci_mdio 4a101000.mdio: ревизия davinci mdio 1.6
[ 1.880499] davinci_mdio 4a101000.mdio: обнаружена маска phy fffffff5
[ 1.894287] libphy: 4a101000.mdio: опрошен
[ 1.898524] davinci_mdio 4a101000.mdio: phy[1]: устройство 4a101000.mdio:01, драйвер неизвестен
[ 1.906962] davinci_mdio 4a101000.mdio: phy[3]: устройство 4a101000.mdio:03, драйвер неизвестен
[ 1.917029] cpsw 4a100000.ethernet: Обнаружен MACID = d0:ff:50:ab:2d:b7
[ 1.927796] PPP общий драйвер версии 2.4.2
[ 1.933714] Модуль сжатия PPP BSD зарегистрирован
[ 1.938845] Модуль сжатия PPP Deflate зарегистрирован
[ 1.945366] usbcore: зарегистрирован новый драйвер интерфейса cdc_acm
[ 1.951296] cdc_acm: драйвер USB Абстрактной Управляющей Модели для USB модемов и ISDN адаптеров
[ 1.959997] usbcore: зарегистрирован новый драйвер интерфейса usb-storage
[ 1.970707] 47401300.usb-phy supply vcc не найден, используется фиктивный регулятор
[ 1.983582] musb-hdrc musb-hdrc.0.auto: Не удалось запросить rx1.
[ 1.990461] musb-hdrc musb-hdrc.0.auto: musb_init_controller не удался со статусом -517
[ 2.000788] 47401b00.usb-phy supply vcc не найден, используется фиктивный регулятор
[ 2.012019] musb-hdrc musb-hdrc.1.auto: Не удалось запросить rx1.
[ 2.018436] musb-hdrc musb-hdrc.1.auto: musb_init_controller не удался со статусом -517
[ 2.055667] mousedev: устройство мыши PS/2 общее для всех мышей
[ 2.062865] драйвер записей /dev для i2c
[ 2.072753] omap_wdt: OMAP таймер с watchdog Rev 0x01: первоначальный таймаут 60 сек
[ 2.082969] omap_hsmmc 48060000.mmc: Получен CD GPIO
[ 2.089408] vmmc: подается от vbat
[ 2.139221] ledtrig-cpu: зарегистрирован для указания активности на CPU
[ 2.147462] oprofile: использует arm/armv7
[ 2.151464] Сообщения Netfilter через NETLINK v0.30.
[ 2.157069] nf_conntrack версия 0.5.0 (1686 ведер, 6744 максимум)
[ 2.164144] ctnetlink v0.93: регистрация с nfnetlink.
[ 2.170652] ipip: драйвер туннелирования IPv4 поверх IPv4
[ 2.179323] ip_tables: (C) 2000-2006 Команда ядра Netfilter
[ 2.185436] arp_tables: (C) 2002 Дэвид С. Миллер
[ 2.190642] Инициализация сокета netlink XFRM
[ 2.195447] СЕТЬ: Зарегистрирована семейство протоколов 17
[ 2.200200] СЕТЬ: Зарегистрирована семейство протоколов 15
[ 2.207048] Bluetooth: уровень TTY RFCOMM инициализирован
[ 2.212284] Bluetooth: уровень сокетов RFCOMM инициализирован
[ 2.217831] Bluetooth: RFCOMM версия 1.11
[ 2.221818] Bluetooth: BNEP (Эмуляция Ethernet) версия 1.3
[ 2.227427] Bluetooth: фильтры BNEP: мультимедийный протокол
[ 2.232927] Bluetooth: уровень сокетов BNEP инициализирован
[ 2.238179] Bluetooth: HIDP (Эмуляция Человеческого Интерфейса) версия 1.2
[ 2.244432] Bluetooth: уровень сокетов HIDP инициализирован
[ 2.249798] Значение GPIO BT WLAN: 10
[ 2.254432] Значение GPIO включения WD: 114
[ 2.258976] Значение GPIO тактов WD: 115
[ 2.263340] Значение GPIO BT_WLAN: 10
[ 2.267239] WL1271: Включение BT/WLAN
[ 2.284032] Инициализация переводчика напряжения завершена
[ 2.302427] mmc0: хост не поддерживает чтение переключателя только для чтения, предполагается включение записи
[ 2.310942] WD: Включить
[ 2.313464] WD: Такт
[ 2.317180] Тип ключа dns_resolver зарегистрирован
[ 2.322818] omap_voltage_late_init: Поддержка драйвера напряжения не добавлена
[ 2.329621] sr_dev_init: Для smartreflex0 не указан домен напряжения. Невозможно инициализировать
[ 2.338138] sr_dev_init: Для smartreflex1 не указан домен напряжения. Невозможно инициализировать
[ 2.348688] Поддержка ThumbEE CPU включена.
[ 2.353214] Регистрация обработчика эмуляции SWP/SWPB
[ 2.358356] Класс SmartReflex3 инициализирован
[ 2.364460] mmc0: новая карта SDHC высокой скорости по адресу 0001
[ 2.373404] mmcblk0: mmc0:0001 SD32G 29.3 GiB
[ 2.384627] mmcblk0: p1 p2
[ 2.399807] omap-gpmc 50000000.gpmc: ревизия GPMC 6.0
[ 2.405715] gpmc_mem_init: отключение cs 0, отображаемого на 0x0-0x1000000
[ 2.416508] nand: устройство обнаружено, Идентификатор производителя: 0x01, Идентификатор чипа: 0xf1
[ 2.423165] nand: AMD/Spansion S34ML01G2
[ 2.427383] nand: 128 MiB, SLC, размер стирания: 128 KiB, размер страницы: 2048, размер OOB: 64
[ 2.435458] nand: используется схема ECC OMAP_ECC_BCH4_CODE_HW
[ 2.441305] 8 разделов ofpart обнаружено на устройстве MTD 8000000.nand
[ 2.447640] Создание 8 разделов MTD на "8000000.nand":
[ 2.453212] 0x000000000000-0x000000020000 : "SPL"
[ 2.467798] 0x000000020000-0x000000040000 : "SPL.backup1"
[ 2.478062] 0x000000040000-0x000000060000 : "SPL.backup2"
[ 2.488203] 0x000000060000-0x000000080000 : "SPL.backup3"
[ 2.498676] 0x000000080000-0x000000260000 : "U-Boot"
[ 2.508970] 0x000000260000-0x000000280000 : "U-Boot Env"
[ 2.518872] 0x000000280000-0x000000780000 : "Ядро"
[ 2.531256] 0x000000780000-0x000008000000 : "Файловая система"
[ 2.610135] musb-hdrc musb-hdrc.0.auto: MUSB HDRC драйвер хоста
[ 2.617210] musb-hdrc musb-hdrc.0.auto: новая USB шина зарегистрирована, назначен номер шины 1
[ 2.628376] usb usb1: Новое USB устройство найдено, idVendor=1d6b, idProduct=0002
[ 2.635588] usb usb1: Новые строки устройства USB: Мфр=3, Продукт=2, Серийный номер=1
[ 2.643149] usb usb1: Продукт: MUSB HDRC драйвер хоста
[ 2.648380] usb usb1: Производитель: Linux 4.1.18-ts-armv7l-crown-1.0 musb-hcd
[ 2.655881] usb usb1: Серийный номер: musb-hdrc.0.auto
[ 2.667430] hub 1-0:1.0: Найден USB хаб
[ 2.672216] hub 1-0:1.0: 1 порт обнаружен
[ 2.692454] musb-hdrc musb-hdrc.1.auto: MUSB HDRC драйвер хоста
[ 2.698661] musb-hdrc musb-hdrc.1.auto: новая USB шина зарегистрирована, назначен номер шины 2
[ 2.708020] usb usb2: Новое USB устройство найдено, idVendor=1d6b, idProduct=0002
[ 2.715198] usb usb2: Новые строки устройства USB: Мфр=3, Продукт=2, Серийный номер=1
[ 2.722758] usb usb2: Продукт: MUSB HDRC драйвер хоста
[ 2.727986] usb usb2: Производитель: Linux 4.1.18-ts-armv7l-crown-1.0 musb-hcd
[ 2.735499] usb usb2: Серийный номер: musb-hdrc.1.auto
[ 2.743553] hub 2-0:1.0: Найден USB хаб
[ 2.747851] hub 2-0:1.0: 1 порт обнаружен
[ 2.877465] hctosys: невозможно открыть устройство rtc (rtc0)
[ 2.882786] sr_init: Нет PMIC подключения для инициализации smartreflex
[ 2.888543] sr_init: регистрация драйвера платформы не удалась для SR
[ 2.930249] VFS: Смонтирован корень (файловая система ramfs) в режиме только для чтения на устройстве 0:15.
[ 2.937980] devtmpfs: ошибка при монтировании -2
[ 2.943047] Освобождение неиспользуемой памяти ядра: 464K (c0994000 - c0a08000)
[ 2.950460] Кратковременная ошибка ядра - не синхронизируется: Не найдено рабочее init. Попробуйте передать параметры init= ядру. Смотрите документацию Linux init.txt для получения справки.
[ 2.964386] ---[ конец Кратковременная ошибка ядра - не синхронизируется: Не найдено рабочее init. Попробуйте передать параметры init= ядру. Смотрите документацию Linux init.txt для получения справки.
[ 79.333959] random: неблокирующий пул инициализирован
Как видно, ядро не может найти init в initramfs. Есть идеи, почему?
Ядро 4.1.18, а u-boot 2013.09.
Спасибо
Редактирование:
Ответ на вопросы jc__:
1.
Нет, нет переключателей ядра в дереве устройств
2.
Я пытался установить initrd=/dev/ram0
, и у меня та же ошибка.
Я также пробовал указать init как init=/init
и получил следующую ошибку:
[ 2.953050] Освобождение неиспользуемой памяти ядра: 464K (c0994000 - c0a08000)
[ 2.960261] Кратковременная ошибка ядра - не синхронизируется: Запрошенный init /init не удался (ошибка -2).
[ 2.968092] ---[ конец Кратковременная ошибка ядра - не синхронизируется: Запрошенный init /init не удался (ошибка -2).
3.
Я использую файл cpio, так что это initramfs, но я пытаюсь загрузить его отдельно (не часть образа ядра) и не уверен, может ли initramfs работать таким образом. Что-то, что я нашел, заставило меня подумать, что это возможно.
Моя файловая система initramfs.cpio содержит /dev
.
Эти модули в настоящее время встроены в ядро.
4.
Я не включаю initramfs в образ ядра, так что он должен содержать только стандартный.
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=16384
5.
Я мог бы включить его в свое ядро, но это потребовало бы дополнительных усилий. Ядро собирается системой сборки Timesys Factory, а initramfs.cpio создается позже.
Ответ на sourcejedi
Я попытался изменить это на:
# setenv bootargs console=${console} root=/dev/ram0 init=/init
И получил:
[ 2.882766] sr_init: Нет PMIC подключения для инициализации smartreflex
[ 2.888519] sr_init: регистрация драйвера платформы не удалась для SR
[ 2.930847] omap_hsmmc 481d8000.mmc: карта утверждает, что поддерживает напряжения ниже установленного диапазона
[ 2.946830] Список всех разделов:
[ 2.950696] 0100 16384 ram0 (драйвер?)
[ 2.955763] 0101 16384 ram1 (драйвер?)
[ 2.960639] 0102 16384 ram2 (драйвер?)
[ 2.965564] 0103 16384 ram3 (драйвер?)
[ 2.970442] 0104 16384 ram4 (драйвер?)
[ 2.975364] 0105 16384 ram5 (драйвер?)
[ 2.980239] 0106 16384 ram6 (драйвер?)
[ 2.985153] 0107 16384 ram7 (драйвер?)
[ 2.990029] 0108 16384 ram8 (драйвер?)
[ 2.994937] 0109 16384 ram9 (драйвер?)
[ 2.999791] 010a 16384 ram10 (драйвер?)
[ 3.004781] 010b 16384 ram11 (драйвер?)
[ 3.009725] 010c 16384 ram12 (драйвер?)
[ 3.014700] 010d 16384 ram13 (драйвер?)
[ 3.019642] 010e 16384 ram14 (драйвер?)
[ 3.024616] 010f 16384 ram15 (драйвер?)
[ 3.029577] b300 30707712 mmcblk0 драйвер: mmcblk
[ 3.035191] b301 9216 mmcblk0p1 00011b5e-01
[ 3.040769] b302 440320 mmcblk0p2 00011b5e-02
[ 3.046421] 1f00 128 mtdblock0 (драйвер?)
[ 3.051727] 1f01 128 mtdblock1 (драйвер?)
[ 3.057074] 1f02 128 mtdblock2 (драйвер?)
[ 3.062380] 1f03 128 mtdblock3 (драйвер?)
[ 3.067723] 1f04 1920 mtdblock4 (драйвер?)
[ 3.073030] 1f05 128 mtdblock5 (драйвер?)
[ 3.078369] 1f06 5120 mtdblock6 (драйвер?)
[ 3.083676] 1f07 123392 mtdblock7 (драйвер?)
[ 3.089006] Никакая файловая система не могла смонтировать корень, пробовали: ext3 ext2 ext4 cramfs squashfs vfat msdos
[ 3.098220] Кратковременная ошибка ядра - не синхронизируется: VFS: Невозможно смонтировать корневую файловую систему на unknown-block(1,0)
[ 3.107068] ---[ конец Кратковременная ошибка ядра - не синхронизируется: VFS: Невозможно смонтировать корневую файловую систему на unknown-block(1,0)
То же самое, если я изменю это на:
# setenv bootargs console=${console} root=/dev/ram0 initrd=/dev/ram0 init=/init
Редактирование 2:
Попробовал:
# setenv bootargs console=${console} root=/dev/ram0 initrd=0x85000000,2M
И вижу ту же ошибку, кроме того, что теперь я получаю
[ 2.978095] RAMDISK: Не удалось найти действительное изображение RAM-диска, начинающееся с 0.
[ 2.992086] Список всех разделов:
[ 2.996226] 0100 16384 ram0 (драйвер?)
[ 3.001097] 0101 16384 ram1 (драйвер?)
[ 3.006041] 0102 16384 ram2 (драйвер?)
[ 3.010895] 0103 16384 ram3 (драйвер?)
Кажется, что ядро не видит initramfs по адресу /dev/ram0
. Может это неверно? Когда u-boot загружает uImage и uInitrd в память, как /dev/ram0
связано с этим адресом, 0x85000000?
Редактирование 3:
Я включил мой initramfs.cpio в свое ядро и смог увидеть сообщение эха. Так что мой initramfs действителен, но я не уверенн, что именно я сделал неправильно, пытаясь загрузить его внешне.
Некоторые моменты для рассмотрения:
1:
## Загрузка ядра из Legacy образа на 81000000 ...
Имя изображения: Linux 4.1 + Devicetree
Содержит ли дерево устройств переключатели ядра, которые могут конфликтовать с setenv bootargs console=${console} root=/dev/ram0 rootfstype=ramfs initrd=0x85000000
2:
setenv bootargs console=${console} root=/dev/ram0 rootfstype=ramfs initrd=0x85000000
Нужен ли ядру адрес памяти initrd=0x850000000 или только местоположение dev/ram0.
3:
Вы используете initramfs или initrd? Собираете ли вы ядро самостоятельно? Содержит ли образ ядра уже встроенный initramfs?
Проверьте это в конфигурации ядра:
CONFIG_BLK_DEV_INITRD
CONFIG_INITRAMFS_SOURCE
[ 0.131751] devtmpfs: инициализирован
[ 2.937980] devtmpfs: ошибка при монтировании -2
Похоже, что devtmpfs монтируется дважды. Что смонтировало его в первый раз (встроенный initramfs)?
Согласен с комментарием @sourcejedi.
Нет /dev
из-за отсутствия rootfs.
Кроме того, ядро инициализирует оборудование. Bluetooth, USB, mmc и другие. Если эти модули скомпилированы в ядро, а не загружены как модули, они загружаются откуда-то. (встроенный initramfs)?
4:
Если вы используете initrd вместо initramfs, и образ ядра не содержит встроенного initramfs…
Я думаю, что конфигурация ядра нуждается в:
BLK_DEV_RAM
“Если используется, современные ядра используют /dev/ram0 для initrd.”
./linux-4.x.x/Documentation/blockdev/ramdisk.txt
Не будет ли это initrd=/dev/ram0
, а не initrd=0x85000000
?
“Старый initrd всегда был отдельным файлом, в то время как initramfs архив встроен в образ ядра Linux.”
./linux-4.x.x/Documentation/filesystems/ramfs-rootfs-initramfs.txtramfs-rootfs-initramfs.txt
“Программа, запущенная старым initrd (которая называлась /initrd, а не /init), выполняла некоторые настройки и затем возвращалась к ядру…”
./linux-4.x.x/Documentation/filesystems/ramfs-rootfs-initramfs.txtramfs-rootfs-initramfs.txt
Должен ли init быть /initrd
вместо /init
?
5:
Если вы собираете собственное ядро, это значительно сэкономит ваше время, если позволите процессу сборки ядра объединить initramfs с образом ядра.
CONFIG_BLK_DEV_INITRD
CONFIG_INITRAMFS_SOURCE
Вам не нужно rootfstype=ramfs
. В этом я уверен. Хотя, насколько я вижу, это не настоящая проблема.
Монтирование ramfs
игнорирует блочное устройство (root=/dev/ram0
в данном случае). ramfs
изначально пустой и не подкреплен никаким файловым устройством.
Поэтому, если rootfstype=ramfs
будет иметь эффект, это просто смонтирует пустую файловую систему. Следовательно, не будет никакой программы init
для выполнения. (Это также вызовет ошибку 2 = ENOENT = “Нет такого файла или каталога”, когда ядро попытается смонтировать devtmpfs на /dev
, как это видно в вашем журнале).
Вы показали, что используете новый стиль initramfs, т.е. архив cpio вместо образа файловой системы. Это хорошо. Но тогда вы должны получить сообщение “Распаковка initramfs…”, когда ядро обнаружит новый стиль и распакует его.
Оригинальная документация говорит, что initramfs должен быть сжатым cpio. Однако я думаю, что текущий код также работает с несжатыми cpio.
Как вы сказали, у вас, похоже, проблема, что ядро не распознает initramfs.
По крайней мере, initrd_start
похоже равняется 0
при входе в populate_rootfs()
. Если бы это значение было ненулевым, вы бы увидели хотя бы одно сообщение или ошибку, связанную с initrd или initramfs.
https://elixir.bootlin.com/linux/v4.1/source/init/initramfs.c#L608
ИЛИ initramfs.c
даже не включается в ядро, потому что вы не включили CONFIG_BLK_DEV_INITRD. Это то, что init/Makefile говорит мне.
initrd: https://www.kernel.org/doc/html/v4.18/admin-guide/initrd.html
initramfs: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
RIM-U-Boot# bootm 0x81000000 0x85000000
## Загрузка ядра из Legacy образа на 81000000 ...
Имя изображения: Linux 4.1 + Devicetree
Тип изображения: ARM Linux Kernel Image (несжатый)
Размер данных: 4024711 байт = 3.8 MiB
Адрес загрузки: 80008000
Точка входа: 80008000
Проверка контрольной суммы ... ОК
## Загружается init Ramdisk из образа Legacy на 85000000 ...
Имя изображения: uInitrd
Тип изображения: ARM Linux RAMDisk Image (несжатый)
Размер данных: 1410048 байт = 1.3 MiB
Адрес загрузки: 80008000
Точка входа: 80008000
Проверка контрольной суммы ... ОК
Загружается изображение ядра ... ОК
Что-то выглядит неправильно здесь. Адрес загрузки для ядра не должен пересекаться с адресом загрузки для initrd!
Для сравнения, смотрите https://community.nxp.com/thread/305045#comment-322873
Воссоздайте uInitrd, используя адрес загрузки 0x80408000
.
Я не знаю ваше оборудование. Предложенные аллокации не должны конфликтовать друг с другом, насколько я вижу, надеюсь, они не конфликтуют ни с чем другим :-).
Не используйте варианты загрузки ядра rootfsype=ramfs
или root=/dev/ram0
. Я не думаю, что они должны повлиять на ваши проблемы независимо от того, что вы установите. Но они неправильные, поэтому давайте обойдемся без отвлечения. Вам не нужно ни то, ни другое для загрузки initramfs. (Мой компьютер загружает Linux с использованием initramfs и не использует ни один из этих параметров загрузки!)
Вам не нужно использовать initrd=...
, потому что вы передаете адрес в качестве второго параметра к bootm
. (Но с учетом вышеизложенного, правильное значение будет initrd=0x80408000,2M
, так что не передавайте никакой другой адрес!).
Я встретил такую же ситуацию. Я наконец понял, что ключевое отличие в том, как вы создаете initramfs, не является неправильным. Вы ДОЛЖНЫ cd
в папку initramfs, а затем создать архив cpio.
Лучший способ создать initramfs.gz – следовать документации ядра.
В документе есть удобный скрипт.
#!/bin/sh
# Авторские права 2006 Роб Ландли <[email protected]> и TimeSys Corporation.
# Лицензировано по GPL версии 2
if [ $# -ne 2 ]
then
echo "использование: mkinitramfs директория imagename.cpio.gz"
exit 1
fi
if [ -d "$1" ]
then
echo "создание $2 из $1"
(cd "$1"; find . | cpio -o -H newc | gzip) > "$2"
else
echo "Первый аргумент должен быть директорией"
exit 1
fi
Вам не нужно root=/dev/ram0 initrd=0x85000000,2M
в параметрах загрузки вообще, если вы используете initramfs.
Некоторые ключи для использования initramfs:
CONFIG_BLK_DEV_INITRD=y
в конфигурации вашего ядра- Используйте вышеуказанный скрипт для создания initramfs.gz
- Убедитесь, что у вас есть исполняемый файл
/init
в вашем initramfs. Вы можете указать другой процесс инициализации черезrdinit=/bin/sh
в параметрах загрузки - Если вы используете u-boot для загрузки
initramfs.gz
, убедитесь, что ваш initramfs.gz в формате uImage - Передайте правильный адрес из команды u-boot
bootm <адрес ядра> <адрес initramfs/ramdisk> <адрес dtb>
Существует два “init” при использовании initrd:
rdinit=/init и
init=/sbin/init
(значения по умолчанию)
Первый (rdinit=) говорит раннему пространству пользователей, что запускать после того, как ядро распакует и смонтирует initrd. По умолчанию это /init.
БЕЗ initrd, второй (init=) говорит ядру, какой init запускать (так же, как root= говорит ядру, какое устройство монтировать как /)
С initrd init= используется переключателем root в конце раннего пространства пользователей не только для монтирования нового, реального корня, но и для запуска реального /sbin/init – или чего бы вы ни хотели: init=/sbin/test_init
(/init не обязательно обязательно менять корень; вы можете оставаться в initrd навсегда… стиль встроенного оборудования)
Я полностью согласен с Чарльзом, единственным, кто упоминает rdinit=:
Убедитесь, что у вас есть /init исполняемый файл в вашем initramfs. Вы можете указать
другой процесс инициализации через rdinit=/bin/sh в параметрах загрузки
rdinit=/init и init=/init также должны быть возможными, это разные файлы: первый “https://unix.stackexchange.com/” означает верх вашего initrd (ваш cpio), второй “https://unix.stackexchange.com/” означает верхний слой root= т.е. новый корень.
Ответ или решение
Судя по вашему сообщению, у вас возникла проблема, связанная с тем, что ядро не может найти init
в образе initramfs. Давайте рассмотрим некоторые основные проблемы и возможные решения.
1. Проверка структуры initramfs
Первое, что следует проверить, это структура вашего initramfs. Убедитесь, что файл init
действительно находится в корне вашего initramfs (по пути /init
). Вы упомянули, что файл init
выводит сообщение "HELLO INITRAMFS", что свидетельствует о том, что он был скомпилирован правильно. Убедитесь также, что файл имеет права на выполнение:
chmod +x init
2. Корректное создание cpio-архива
Неправильный способ создания cpio-архива может привести к ошибкам. Убедитесь, что вы создали cpio-архив из корневой директории вашего initramfs. Например:
cd initramfs-directory
find . | cpio -o -H newc | gzip > ../initramfs.gz
3. Параметры загрузки U-Boot
Когда вы загружаете ядро и initramfs через U-Boot, убедитесь, что вы корректно устанавливаете параметры переноса. Например, команда, которую вы используете:
setenv bootargs console=${console} root=/dev/ram0 initrd=0x85000000
Убедитесь, что передаете адрес initramfs (0x85000000) в правильном формате. Например:
bootm 0x81000000 0x85000000
4. Проверка конфигурации ядра
Убедитесь, что ваша конфигурация ядра правильно настроена для поддержки initramfs. Проверьте следующие параметры:
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="" # Убедитесь, что это поле пустое
CONFIG_BLK_DEV_RAM=y
Если у вас включен CONFIG_INITRAMFS_SOURCE
, то убедитесь, что он указывает на правильный источник, или сбросьте его, чтобы использовать отдельный initramfs.
5. Использование правильного адреса
Попробуйте изменить адрес, по которому загружается ваш initramfs. Убедитесь, что он не конфликтует с адресом ядра. Например, задайте:
mkimage -A arm -a 0x80408000 -e 0x80408000 ...
и попробуйте загрузить с этого адреса при загрузке.
6. Настройка для анализа ошибок
Если после всех вышеуказанных шагов проблема сохраняется, рассмотрите возможность добавления отладочных параметров в командную строку загрузки, например:
setenv bootargs console=${console} root=/dev/ram0 rdinit=/init
Эти параметры могут предоставить дополнительную информацию при загрузке и помогут проанализировать, где возникает проблема.
Заключение
Если вы следовали всем предложенным выше рекомендациям, но проблема все еще не решена, возможно, стоит попробовать интегрировать initramfs непосредственно в ваше ядро и проверить, работает ли оно корректно. Это поможет локализовать проблему, связана ли она с форматом или методом загрузки.
Также стоит отметить, что иногда полезно обратиться к документации или форуму, связанному с вашим конкретным оборудованием или дистрибутивом, так как у них могут быть уникальные нюансы.