对损坏的系统进行故障排除是每个系统管理员、SRE或DevOps工程师的基本技能。我们每个人都会时不时地遇到与操作系统相关的问题,当事情变得非常糟糕时,最好做好准备。
能够快速识别问题并对其采取行动,以防止任何重大损害,这尤其有益。为了在本文中帮助解决这一问题,我们将介绍一些您可能会遇到的常见问题,以及收集信息、故障排除和解决这些问题的方法。
注意:本文使用的是RHEL8/CentOS。但是,下面的示例/概念可以应用于任何Linux发行版。
如果您丢失了root密码,并且无法访问特权用户,该怎么办?如果您仍然可以使用机器,那么有一种方法可以解决这种不方便的情况。
首先,从重新启动机器开始。机器启动时,按任意键访问引导菜单:
在引导菜单中,按e编辑引导选项。使用箭头移动到以Linux开头的行,并附加rd.Break。这会提前中断引导过程。
您还可以选择附加Enforcing=0,以暂停SELinux实施。接下来,按CTRL+X让机器引导。
引导几秒钟后,您应该会得到外壳。此时,您可以以只读模式访问系统。
因此,要更改系统中的任何内容(如root密码),我们需要将文件系统设置为读写。我们可以通过运行mount-o remount,rw/sysroot来实现这一点。
我们需要做的下一件事是使用chroot/sysroot进入root监狱-这会将文件系统的根更改为/sysroot,而不是/。这是必需的,这样我们运行的任何其他命令都将与/sysroot目录相关。现在,我们可以使用passwd更改root密码。
如果在引导选项中添加了Enforcing=0,则现在可以按CTRL+D(或键入EXIT)并让系统完全引导。如果没有,请运行touch/.autorelabel以触发SELinux系统重新标记。
这是必需的,因为更改密码会导致/etc/password具有不正确的SELinux安全上下文。因此,我们需要在下次引导期间重新标记整个文件系统(这可能需要一些时间,具体取决于文件系统的大小)。
作为替代解决方案,您还可以访问Linux的debug-shell。同样,这可以通过在引导期间访问GRUB并附加systemd.debug-shell而不是rd.Break来实现。
当您使用此选项让系统引导时,您将结束在正常的shell会话中,这不是很有帮助。但是,如果您尝试使用CTRL+ALT+F9访问终端9,您将使用完全root权限打开debug-shell。
在这里,您可以正常更改密码。此时,您可以切换回普通shell(CTRL+ALT+F1)并登录。
不过,您不应该忘记停止调试shell,因为它是系统的一个巨大漏洞。您可以通过运行systemctl stop debug-shell.service(您仍然可以切换回debug-shell,但它将没有响应;取消)来完成此操作。
但是,即使这些都是基本任务,也很容易出错,导致系统无法引导。让我们看看如何解决与无法挂载的文件系统相关的问题。
与前面的解决方案一样,我们首先重新启动机器,访问引导菜单并对其进行编辑,这一次追加了systemd.unit=Emergency.target。这会告诉您的系统引导到紧急目标,而不是默认目标(多用户或图形)。
当系统引导并获得shell时,我们以root身份登录,并再次使用mount-o remount,rw/重新挂载文件系统。现在,我们可以通过运行mount-a来尝试挂载所有文件系统。
如果在挂载特定文件系统时出现问题,您可能会看到类似mount:/wrong-mount:mount point is not eXist的错误消息。或挂载/错误挂载:特殊设备/dev/sdb1不存在。这类问题需要在/etc/fstab内修复:
修复/etc/fstab中的问题后,运行systemctl daemon-reload,以便systemd获取更改。现在,再次运行mount-a。如果问题确实已修复,您应该不会看到错误(没有消息,就是好消息)。您现在可以使用CTRL+D退出,并让系统正常引导。
除了键入错误的设备或装载点名称外,您可能还会遇到VDO(虚拟数据优化器)或Stratis的问题,这需要额外的装载参数。
另一个常见且容易修复的错误可能是在使用UUID=";时缺少引号.。指定设备(使用/etc/fstab语法突出显示,可以省去很多问题)。
这不是一个生死攸关的情况,但它会导致很多问题,所以当它发生时,能够迅速识别它是有益的。
重要的是要认识到,在大多数情况下,SELinux都在正确地执行其工作。但是,您可能正试图实现SELinux没有预料到的事情。
您可能会遇到的一些问题可能包括错误文件的问题