最近使用的公司计算机启动时崩溃

最近使用的公司计算机启动时崩溃

经过最近的一些更新后,我的计算机不再启动!这是我可以确定的:

  • 这是公司 IT 部门向我提供的一台最新计算机。它具有最新的 Intel CPU(Skylake 一代)。
  • 计算机运行 Ubuntu 16.04。
  • 计算机上次正确启动是在三月份的某个时间。该问题可能是由于软件更新或硬件错误造成的。
  • 我有另一台运行 16.04 的计算机,安装了几乎相同的软件(我使用过apt-clone),并且运行得很好。它有不同的硬件(也是amd64,但不同的CPU,不同的GPU等)。
  • 内核确实启动,initrd 工作正常。当我在图形模式下以启动画面启动时,系统会提示我输入 dm-crypt 卷的密码,最后我看到的是它已成功安装。
  • 在我收到登录提示之前发生挂起。当计算机挂起时,这是一个硬挂起。连Alt+SysRq都没反应。由于风扇全速运转,CPU 显然处于 100%。
  • 我仍然保留着重启前运行的内核。当我在 Grub 菜单中选择此内核时,我遇到了相同的锁定。所以看起来这是一个预先存在的内核错误,它是由其他东西触发的——但是什么?
  • 如果我关闭启动屏幕(splashlinuxGrub 中的命令行中删除),我会看到许多服务正在启动,然后它会锁定。
  • init=/bin/sh我可以通过添加到Grub 的命令行来获得 root shell linux。我什至可以通过添加进一步

    systemd.unit=basic.target systemd.shell
    

    这将启动许多服务并在 tty9 上运行 root shell。

  • 如果我systemctl start multi-user.target从 root shell 运行,计算机就会锁定。因此,该问题可能是由其中一项服务触发的。
  • 我跑去systemctl list-dependencies multi-user.target看启动了哪些服务。我一一手动启动了列出的依赖项,一切都开始得很好。

因此,这看起来像是由某些软件触发的硬件错误(因为它发生在一台计算机上,但不在另一台计算机上)。但是什么软件呢?由于计算机死机太严重,我无法获取任何日志。我什至无法获得任何有用的控制台输出。


有用的调试技术:

  • Alt+ SysRq:SysRq 魔法键,它可以让您执行紧急重启等操作。它以非常低的级别访问内核,因此除了最严重的崩溃之外,它都能正常工作。就我而言,Alt+SysRq没有响应,这表明崩溃的严重程度。
  • Shift要修改启动参数,请在打开电源后按住几秒钟。您需要在 BIOS 初始化键盘之后、操作系统启动之前按下它。这使得蛴螬菜单出现。
  • 在 Grub 菜单中,按e可编辑菜单项的命令行。要更改 Linux 引导参数,请导航到以 开头的行linux。在现代 Ubuntu 上,您将在“Ubuntu 的高级选项”下找到旧内核。对命令行进行所需的更改后,按Ctrl+x启动。您在此处所做的任何更改仅适用于本次启动,它们不会保存到磁盘。
  • 命令行上的一些有用选项linux
    • quiet nosplash隐藏几乎所有的启动消息。删除它们以在启动期间在控制台上获取消息,这是诊断问题所必需的。
    • recovery给你一个几乎没有服务的root shell。您需要知道 root 密码。 “恢复模式”菜单项使用此功能。
    • init=/bin/sh为您提供一个根本没有任何服务的 root shell。要恢复正常启动,请运行exec init.此时您可以传递 systemd 选项,例如exec init --unit=basic.target启动 init 和一些服务(请注意,这不会启动任何登录方式,因此您最好在另一个控制台上运行 shell)。请注意,根文件系统是以只读方式挂载的;运行mount -o remount,rw /以便能够对其进行写入。
    • systemd.unit=basic.target启动一组非常基本的服务。请注意,这不包括任何登录方式!您可以通过systemctl set-default basic.target在 root 提示符下运行来将其设置为默认值。要恢复原始默认目标,请运行systemctl set-default graphical.target(或systemctl set-default multi-user.target对于没有 GUI 的服务器)。
    • systemd.debug-shell在 tty9 上启动 root shell。您可以通过systemctl enable debug-shell在根提示符下运行来为每次启动启用此功能。解决问题后,不要忘记禁用此功能systemctl disable debug-shell。按Alt+F9切换到 tty9。
    • 也可以看看Fedora 系统提示,Arch Linux 启动问题提示

答案1

问题

事实证明,我的问题是(某些?)Skylake CPU 上的最新 Intel 微码与最新 Linux 内核之间的一个已知问题,这主要是由固态硬盘。看Ubuntu bug #1759920“intel-microcode 3.20180312.0 导致登录屏幕锁定(w/linux-image-4.13.0-37-generic)”,以及许多其他与同一问题有关的错误,例如Ubuntu bug #1746806“sssd 似乎使 AWS c5 和 m5 实例崩溃,导致 CPU 100%”Ubuntu bug #1746418 “安装 linux-image-4.13.0-32-generic 后启动 Xorg 时系统冻结”。如果出现以下情况,您可能会遇到此错误:

  • 您有一个最新的 Intel CPU。据我所知,这个错误只出现在天湖CPU。
  • 你有英特尔微码软件包已安装。恢复到较早的、经过测试的内核对我来说不起作用,因为我只能使用较早的微代码运行该内核。
  • 您的计算机已连接到公司网络(通常是 LDAP 或 Active Directory)以进行用户身份验证。尽管还有其他方法可以触发该错误,但运行固态硬盘似乎是最常见的罪魁祸首。还有报道称Xorg 崩溃

该错误是由于缓解措施造成的幽灵2018 年 1 月发布的安全问题。某些内核代码与某些内核代码之间存在不兼容问题处理器微码在某些情况下会导致锁定。

如何修复

  1. 如果无法正常启动,则需要在 Grub 提示符下编辑内核命令行。请参阅问题以获取解释和获取 root shell 的可能方法。
  2. 此特定错误的解决方法是将参数添加noibpb到内核命令行1746418/14,1759920/56)。这应该可以让您正常启动并执行一些修复。
    这会禁用导致问题的漏洞缓解措施,这意味着您的计算机现在容易受到某些攻击。它们是本地攻击,即攻击者需要在您的计算机上运行代码,但这些攻击可能是通过 Web 浏览器中的 JavaScript 等进行的。
    如果您没有任何其他方法,您可以通过添加noibpb到内核命令行来使其永久化,直到您可以获得固定的内核。
  3. 在 Ubuntu 中,预计会修复2018 年 4 月 23 日当周,大概是内核 4.4.0-117 和 4.13.0-39。同时,Tyler Hicks 发布了测试内核为了4.44.13

我如何诊断这个问题

我尝试了几件事(请参阅问题)并确定该错误是在达到basic.target和达到之间的某个位置触发的multi-user.target。因此,我将默认的 systemd 目标设置为basic.target( systemctl set-default basic.target) 并启用debug-shell服务 ( systemctl enable debug-shell) 来获取 root shell。

我运行systemctl list-dependencies multi-user.target并手动启动了列出的依赖项一一。这并没有引发崩溃。

并非所有服务都直接由系统。有些被管理为暴发户服务,有些被管理为SysVinit 脚本。下面的 shell 脚本运行所有这些。注意:我只测试了一次,它按设计崩溃了。

#!/bin/sh
wants=$(systemctl show -p Wants multi-user.target | sed 's/^Wants=//' | tr ' ' '\n' | sort)
log=/var/tmp/multi-user-steps-$(date +%Y%m%d-%H%M%S)

log () {
  echo "$* ..." | tee -a "$log"
  sync
  "$@"
  ret=$?
  echo "$* -> $ret" | tee -a "$log"
  sync
  return $ret
}

# systemd services
for service in $wants; do
  log systemctl start $service
  sleep 2
done

# upstart services
for conf in /etc/init/*.conf; do
  service=${conf##*/}; service=${service%.conf}
  log service ${service} start
  sleep 2
done

# sysvinit services
for service in /etc/rc3.d/S*; do
  log ${service} start
  sleep 2
done

我的电脑启动后就死机了sssd。从那里,对“sssd linux kernelhang”的网络搜索引导我https://bugs.launchpad.net/cloud-images/+bug/1746806以及诊断和解决方案。

相关内容