如何调试启动过程中 systemd“init”冻结?

如何调试启动过程中 systemd“init”冻结?

我正在尝试让我自己的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立即开始工作。

相关内容