我正在尝试让我自己的init
脚本运行一些ARM硬件以及带有 systemd 的 Debian Jessie。整体启动概念和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 和特定于硬件的设备树进行修补 - 内核和根文件系统都是在 x86 主机上借助 QEMU 构建的
initramfs
靴子与忙碌盒,设置 AUFS 最终根 fs 并最终调用switch_root
.相同的方法(几乎 100% 相同的init
脚本)在 x86 上运行良好- 我可以在运行之前运行一个交互式 shell
switch_root
,但我找不到任何此时无法按预期工作的内容
答案1
事实证明,内核缺少一些systemd
.
http://cgit.freedesktop.org/systemd/systemd/tree/README显示了必要的内核配置设置。
配置完成后,systemd
立即开始工作。