如何诊断关机时挂起的问题?

如何诊断关机时挂起的问题?

从一两个月前开始,我的装有 ubuntu 12.10x64 的笔记本电脑就挂了关机期间。屏幕一片漆黑,没有硬盘活动,它只是坐在那里. 从时间流逝来判断,我感觉它发生在正常关机周期即将结束时。

唯一的解决办法是硬关机(按住电源键几秒钟) - Ctrl-Alt-Backspace(通常有效,我在“设置”中已打开它)和 Ctrl-Alt-Del 都不起作用,我也无法使用 Ctrl-Alt-F1 进入文本控制台。

我该如何诊断? 它不会在每次关机时发生,但经常发生,令人烦恼(当然,因为它会在重启时强制进行磁盘检查)。

哪些日志文件能告诉我哪里出了问题吗?在系统日志查看器中盲目搜索就像大海捞针。

我想我可以通过日志时间戳精确地确定它发生的时间,但是我如何读取时间戳例如kern.log[36169.146130]?如何才能让其变得可读?

最后,顺便说一句,我从来没有设法执行 Alt-Sysrq-REISUB 来强制彻底关机,但这可能是因为我使用的是笔记本电脑,PrintScr 只能通过按键访问Fn,而且我不确定我需要的确切按键顺序。有没有“无害”但用户可见的魔法命令我可以练习一下(在正常操作期间),这样我下次就能找到如何进行 REISUB 了?

答案1

您需要关闭没有启动画面的程序,然后从命令行查看发生了什么。首先,您需要通过 GRUB 禁用启动画面(请参阅详细关闭

启动并按住 SHIFT 进入 grub。在 linux 条目上按下 进行编辑。然后转到内核行(按 END 转到行末)并删除“quiet”和“splash”参数。事实上,对于这个测试,跳过 GUI 并添加参数“text”。(如果没有这个,您可以使用 CTRL+ALT+F1 进入命令行)

登录,然后输入:

sudo shutdown -v -h now

(-v 表示详细,-h 表示停止。)

/var/log/kern.log 中的内核日志文件应包含人类可读的时间戳。使用日志文件查看器打开它们

gnome-system-log

(文件>打开)你应该在左侧看到人类可读的时间戳。如果你仍然看不到人类可读的,这个家伙制作了一些 python/perl 脚本来解析它们。

答案2

我将按照难度/细节逐渐增加的顺序回答您的问题。

哪些日志文件可以告诉我出了什么问题?

抱歉,我有点含糊其辞,但这确实取决于具体情况。各种类型的挂起可能有很多根本原因。例如:GPU 驱动程序错误、内存不足、磁盘或交换空间不足、fork 炸弹和 CPU 占用、内核错误、关机进程挂起等...

您可以通过了解更多有关症状和特定问题(例如关机特定挂起)的信息,以及哪些子系统、进程和日志与该特定问题区域有关,来缩小要查看的事项列表。例如,对于关机特定挂起,请查看:

  • 内核日志(dmesg、、/var/log/kern.logjournalctl --dmesg --boot[=[ID][±offset]|all]
  • 普利茅斯对数 ( /var/boot/log)
  • SystemD(具体来说:systemd-shutdown) ( journalctl --boot[=[ID][±offset]|all]_PID=1journalctl --list-boots用于 ID,有时也用于/var/log/syslog)
  • 最终(也应该输出到内核的环形缓冲区dmesg

我如何读取时间戳,例如 kern.log: [36169.146130]?我如何才能让这个时间戳变得可读?

要查看具有人类可读时间戳的内核日志(用于当前启动):

sudo dmesg -H
sudo journalctl -b 0 -xn10000 --dmesg

查看上次启动内核日志(当前启动0减去1):

sudo journalctl -b -1 -xn10000 --dmesg

内核日志中的时间戳以自上次启动以来的秒数表示。您会在纯文本sudo dmesg输出中注意到,时间戳始终[ 0.000000]从第 行开始Linux version x.x.x-x,然后从那里开始增加。默认情况下以这种方式设置时间戳的原因是,在 Linux 内核启动期间,许多事情会非常快速地连续发生。CPU 的速度能够在微秒内执行许多命令。在这种时间粒度级别,打印完整的日期/时间戳是毫无意义的。

您可以随时使用/标志要求dmesg以人类可读的输出进行打印,它是、和 的别名。-H--human--color--reltime--pager

我该如何诊断?

有几种方法可以调试关机、冻结和挂起问题。要查看的日志文件取决于问题的根本原因:

  1. 内核问题(GPU 或其他驱动程序、内核错误)
    • 检查dmesg挂在靴子末端附近的输出
    • 通过删除启动参数来关闭启动画面quiet splash,或者切换基于文本的启动按向右箭头Escape
      • 如果你正在plymouth运行启动画面(默认情况quiet splash/etc/default/grub
      • 运行:sudo update-grub更改此文件后,将更改应用到生成的/boot/grub配置中。
    • 如果使用 SystemD,您可以在此处放置一个在关机时执行的脚本:/usr/lib/systemd/system-shutdown/debug.sh
      • 此技巧列在 FreeDesktop.org 页面中:SystemD 调试

      • 设置并启动调试选项:

        systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M printk.devkmsg=on enforcing=0
        
      • 推荐使用的调试内核关闭问题的示例脚本是:

        #!/bin/sh
        mount -o remount,rw /
        dmesg > /shutdown-log.txt
        mount -o remount,ro /
        
      • 您可能希望将dmesg其替换dmesg --human --nopager为人类可读的时间戳。

      • 笔记:时间戳将每隔几秒显示一次,并且每个完整时间戳下方的其余快速启动消息仍然将具有纳秒分辨率,例如+0.002567

    • 重新启动,并查找结果文件中记录的超时信息:/shutdown-log.txt

最后,FreeDesktop.org HangDiagnosis 页面包含一些有关您可能遇到的不同程度的挂起的有用信息。它还列出了一些其他提取 Linux 内核消息的方法,这些方法更为高级,因为它们可能需要两台计算机(netconsole、SSH)或 IEEE1394 Firewire 连接(firescope),或者 RS-232 或其他串行控制台。SSH 也是我没有列出的稍微简单的选项,因为 SSH 在关机期间会被终止,根据挂起程度,它并不总是可用,并且它还需要两台计算机(在目标上设置 OpenSSH 服务器,使用另一台计算机作为客户端远程 SSH 进入它)。

  1. SystemD 调试 Shell

    • 请参阅 Fedora 关于 SystemD debug-shell 的文档

    • 按照说明启用调试 shell,然后按Ctrl+Alt+F9切换到它。

    • 请注意,如果您在关机期间执行此操作,则可能会影响根或/oldroot枢轴根挂载点上正在使用的文件。请注意,您可能会导致出现原本不会出现的消息,并且它们可能是转移注意力的手段(或海森堡...因为你作为观察者在关机期间打开一个外壳并戳东西而导致了它们)。

    • 完成后请务必禁用此功能! 启用后,它会留下安全风险,因为任何有物理访问权限的人都不需要 root 密码:

      systemctl disable debug-shell
      
  2. Finalrd 钩子脚本

    • 请参阅:(man finalrdUbuntu 的文档在这里
    • 要使用此方法,请将脚本放入/etc/finalrd/任意名称中,只要它以.finalrd后缀结尾即可。
    • 您可以将此方法与/shutdown-log.txt上面 #1 中的“ ”方法结合使用,以便稍后查看输出。(如果在关机期间未启用回滚缓冲区,则这可能会有所帮助……但Shift+PgUp并不总是有效)。
    • 笔记:您必须以某种方式编写脚本,以便在setup阶段挂钩期间“引导”您希望在脚本中运行的任何二进制文件。
      • 这意味着由于在关机期间/根挂载点被重新挂载为/oldroot

      • 换句话说:SystemD init 改变到新的位置,并将旧的根挂载文件系统移动到另一个位置(又名“枢根“)

      • 因此,您期望在 shell 脚本中存在的任何二进制文件都PATH不再存在。

      • 例如::要引导一些工具,显示哪些进程正在使用/根目录中的文件,并显示挂载点,请编写如下脚本:

        #!/bin/sh
        # SPDX-License-Identifier: GPL-3.0-only
        # Copy executables during finalrd setup phase
        if [ "$1" = "setup" ]
        then
            . /usr/share/initramfs-tools/hook-functions
            copy_exec /usr/bin/lsof
            copy_exec /usr/bin/mount
            copy_exec /usr/bin/grep
        
            exit 0
        fi
        
        echo '------------ WHAT ELSE IS USING OLDROOT? ------------'
        echo ''
        # List everything except filter out kworker tasks
        lsof . | grep -v kworker
        
        echo '------------ WHAT IS MOUNTED? ------------'
        mount
        
        exit 0
        

我从来没有设法执行 Alt-Sysrq-REISUB 来强制彻底关机,但这可能是因为我使用的是笔记本电脑。

是的,你可能是对的。许多现代键盘不再有这个SysRq键……这让 Linux 用户和内核开发人员非常不高兴。

答案3

我有这个问题。在 Bios 中禁用 3D 加速似乎来修复这个问题。

在启动时按 F1 或 F2(或在 grub 中的系统设置中)并禁用 3D 加速。如果此方法能解决问题,请告诉我。我尝试过三四次关机,没有问题,但问题可能会再次出现。

相关内容