ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux – 在最近的公司计算机上启动时崩溃

2019-08-08 14:51:06  阅读:233  来源: 互联网

标签:linux startup intel systemd crash


在最近的一些更新后,我的电脑不再开机!这是我可以确定的:

>这是最近由公司IT部门提供给我的计算机.它有一个最近的英特尔CPU(Skylake代).
>电脑运行Ubuntu 16.04.
>计算机上次在三月份正确启动了一段时间.问题可能是由于软件更新或硬件错误.
>我有另一台运行16.04的计算机,安装了几乎相同的软件(我使用了apt-clone),它运行得很好.它有不同的硬件(也是amd64,但不同的CPU,不同的GPU等).
>内核启动,initrd正常工作.当我在图形模式下使用启动画面启动时,系统会提示我输入dm-crypt卷的密码,我看到的最后一件事是它已成功挂载.
>挂起发生在我收到登录提示之前.当计算机挂起时,它很难挂起.甚至Alt SysRq也没有回应.由于风扇在全速爆炸时开启,因此CPU显然固定为100%.
>在重新启动之前,我仍然拥有运行的内核.当我在Grub菜单中选择这个内核时,我得到了相同的锁定.所以看起来这是一个预先存在的内核错误,它被其他东西触发 – 但是什么?
>如果我关闭启动屏幕(从Grub中的linux命令行中删除启动),我会看到许多服务启动,然后锁定.
>我可以通过将init = / bin / sh添加到Grub中的linux命令行来获得root shell.我甚至可以通过添加来进一步发展

systemd.unit=basic.target systemd.shell

这会启动许多服务并在tty9上运行root shell.
>如果我从该根shell运行systemctl start multi-user.target,则计算机会锁定.所以可能这个问题是由其中一个服务引发的.
>我运行了systemctl list-dependencies multi-user.target来查看哪些服务已启动.我一个接一个地手动启动列出的依赖项,一切都很好.

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

有用的调试技巧:

> Alt SysRq:magic SysRq key,可让您执行紧急重启等操作.它以非常低的级别访问内核,因此除了最糟糕的崩溃外,它可以工作.就我而言,Alt SysRq没有响应,这表明崩溃的深度.
>要修改启动参数,请在打开电源后按住Shift几秒钟.在BIOS初始化键盘之后,但在操作系统启动之前,您需要按下它.这使得Grub菜单出现.
>在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使其成为默认值.要恢复原始默认目标,请运行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 systemd tips,Arch Linux boot problem tips.

解决方法:

问题

事实证明,我的问题是最新的英特尔微代码(某些?)Skylake CPU和最近的Linux内核之间的已知问题,这主要是由sssd触发的.见Ubuntu bug #1759920 “intel-microcode 3.20180312.0 causes lockup at login screen(w/ linux-image-4.13.0-37-generic)”,以及其他一些其他错误,结果是同样的问题,例如Ubuntu bug #1746806 “sssd appears to crash AWS c5 and m5 instances, cause 100% CPU”Ubuntu bug #1746418 “System freezes when starting Xorg after installing linux-image-4.13.0-32-generic”.如果出现以下情况,您可能会遇到此错误:

>你有一个非常新的英特尔CPU.据我所知,这个bug只出现在Skylake CPU上.
>您已安装intel-microcode软件包.恢复到之前测试过的内核对我来说不起作用,因为我只使用早期的微代码运行该内核.
>您的计算机已连接到公司网络(通常是LDAP或Active Directory)以进行用户身份验证.虽然还有其他方法可以触发bug,但运行sssd似乎是最常见的罪魁祸首.还有报道Xorg crashing.

该错误是由于2018年1月发布的Spectre安全问题的缓解.某些内核代码与某些内容代码之间存在不兼容,导致某些情况下出现锁定.

怎么修

>如果无法正常启动,则需要在Grub提示符下编辑内核命令行.请参阅问题以获取解释以及获取root shell的可能方法.
>此特定错误的解决方法是将noibpb参数添加到内核命令行(1746418/14,1759920/56).这应该让你正常启动并执行一些修复.
这会禁用导致问题的漏洞缓解,这意味着您的计算机现在容易受到某些攻击.它们是本地攻击,即攻击者需要在您的计算机上运行代码,但这些攻击可能会被执行,例如通过Web浏览器中的JavaScript.
如果您没有任何其他方法,可以通过将noibpb添加到内核命令行来使其永久化,直到您可以获得固定内核.
>在Ubuntu中,修复程序预计在on the week of 23 April 2018,可能是内核4.4.0-117和4.13.0-39.与此同时,Tyler Hicks has published test kernels4.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并逐个手动启动列出的依赖项.这并没有引发崩溃.

并非所有服务都在systemd之前直接管理.一些服务作为Upstart服务管理,一些服务作为SysVinit scripts管理.下面的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 kernel hang”的网络搜索引导我进入https://bugs.launchpad.net/cloud-images/+bug/1746806以及诊断和解决方案.

标签:linux,startup,intel,systemd,crash
来源: https://codeday.me/bug/20190808/1621973.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有