诊断开机问题:
- 串口控制台:启动阶段按‘e’,编辑linux启动命令行,添加以下内容,可让systemd记录大量有效的调试信息
systemd.log_level=debug systemd.log_target=console console=ttyS0,38400 - 进入救援模式或紧急模式
systemd.unit=rescue.target 或 1添加到内核命令行。若无法进入,尝试下面步骤:
systemd.unit=emergency.target 或 emergency 添加到内核命令行。在此模式下,需要重新以可读写的方式挂载根文件系统在你编辑任何文件前:
mount -o remount,rw /
如果紧急模式也无法进入,直接在内核命令行添加 init=/bin/sh来进入shell,这一般适用于systemd本身或其依赖的一些库被损坏,或许需要重新安装受影响的包。 - 在内核命令行添加以下:
systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M printk.devkmsg=on
使用journalctl -b 查看日志
使用systemctl list-jobs命令查看当前服务进行问题排查
诊断关机问题:
- 使用reboot -f 或 poweroff -f命令看内核是否会重启,若都不奏效,说明是内核bug,不是systemd的bug
- 如果reboot或者poweroff奏效,但是时间过长,十分可以,可以采取以下措施:
在grub中内核参数中添加以下调试项:
systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M printk.devkmsg=on enforcing=0
注意,也可以在开机的时候按e键编辑
然后执行命令:grub2-mkconfig -o /boot/grub2/grub.cfg,生成新的grub配置。(对于uefi系统上的指令是grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg)
编辑以下内容到/usr/lib/systemd/system-shutdown/debug.sh
#!/bin/sh
mount -o remount,rw /
dmesg > /shutdown-log.txt
mount -o remount,ro /
赋予执行权限chmod a+x /usr/lib/systemd/system-shutdown/debug.sh
reboot
查看/shutdown-log.txt,进行问题排查
关键信息:
- 内核命令行信息,从bootloader的配置文件(/boot/grub2/grub.cfg)查看或从/proc/cmdline查看
- 日志信息
journalctl -b > journal.txt的输出,最好在开机前在grub内核命令行中添加了systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M printk.devkmsg=on - systemd-analyze dump > systemd-dump.txt,记录各种服务状态的信息
- /usr/bin/systemd --test --system --log-level=debug > systemd-test.txt 2>&1