再生之术:Root 密码遗忘的 CentOS8 Stream 解决方案

参考

项目描述
搜索引擎BingGoogle
AI 大模型文心一言通义千问讯飞星火认知大模型ChatGPT
Linux 操作系统(微课版)(RHEL 8/CentOS 8)(第二版)ISBN:9787302582922
老杨Linux从BIOS开始画图了解Linux启动过程

环境

项目描述
CentOS8 Stream4.18.0-513.el8.x86_64

大魔头 Root

哈哈,你好!今天,让我们来聊聊 Linux 系统中的 root 用户以及当你忘记 root 用户密码时会发生的可怕后果吧!😄

首先,让我向你介绍一下 Linux 中的 root 用户,这可是 Linux 系统中的大魔头😈!root 用户就像是 Linux 世界的皇帝,拥有无尽的权力。他可以为所欲为,删除一切,毁天灭地💥!所以,当你忘记了 root 用户密码时,这可不是闹着玩的。

后果? 哦,我的朋友,当你不幸地忘记了 root 用户密码,你会发现自己陷入了一场深不见底的迷宫冒险!首先,你再也 无法以 root 用户身份登录系统,这意味着你将失去对系统的完全控制权。你的 Linux 世界会变得像个没有规则的疯狂游乐园!🎢

接下来,你可能会查找各种奇怪的命令和黑魔法🎃,试图重新获得对系统的控制。但事实上,这通常需要花费大量的时间和精力,并且经常会把事情搞得更糟糕。

或者,你可以尝试 以普通用户身份登录系统,但这时候你会发现自己像一个被限制在小房间里的小丑🤡一样,无法执行需要 root 权限的任何操作。你会发现自己 沦为了系统的奴隶,只能眼睁睁地看着它做自己不喜欢的事情。

所以,朋友们,千万不要忘记 root 用户密码!要记得妥善保管它🧙‍♂️,因为一旦失去了它,你可能会陷入一场滑稽而痛苦的冒险,无法自拔!不要让你的 Linux 世界变成一个混乱的马戏团,记住 root 用户密码,保持控制,然后你将能够愉快地畅游在 Linux 的广袤世界中!🎪

如果你已经将 root 密码遗忘在某个角落了。我的朋友😘,你很幸运,我恰巧掌握了起死回生之术,让我们试着用这魔法🎆让大魔头 Root 复活吧。

注:

  1. 在接下来的操作中,我们将解决 Root 密码被遗忘的问题。请确保您使用的 Linux 操作系统是 CentOS8CentOS8 StreamFedora8RHEL8 操作系统中的任意一种(版本可以不同,但不要差异过大)。如果您对 Linux 操作系统较为熟悉,那么也可以通过该篇文章 触类旁通 的解决其他 大部分 Linux 操作系统 中 Root 密码遗忘的问题。
  2. 如果您 不了解您所使用到的 Linux 操作系统的发行版信息,在大多数情况您都可以使用如下方式对此进行确认。
    大多数 Linux 操作系统提供者都在 /etc/os-release 文件中保存了当前操作系统相关的发行信息。在 Linux 操作系统中你可以通过在命令行界面中输入如下命令来查看 /etc/os-release 文件中保存的内容。
    cat /etc/os-release
    
    我使用的操作系统是 CentOS8 Stream,故 /etc/release 文件中的内容为:
    NAME="CentOS Stream"
    VERSION="8"
    ID="centos"
    ID_LIKE="rhel fedora"
    VERSION_ID="8"
    PLATFORM_ID="platform:el8"
    PRETTY_NAME="CentOS Stream 8"
    ANSI_COLOR="0;31"
    CPE_NAME="cpe:/o:centos:centos:8"
    HOME_URL="https://centos.org/"
    BUG_REPORT_URL="https://bugzilla.redhat.com/"
    REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux 8"
    REDHAT_SUPPORT_PRODUCT_VERSION="CentOS Stream"
    

GRUB 引导界面

BootLoader

GRUB 是一个用于加载和管理系统启动的 引导程序(BootLoader)GRUB 是 Linux 发行版中 最常见的引导程序。引导程序是计算机启动过程中运行的第 个软件,它加载 操作系统的内核,然后 再由内核对系统的其他部分(Shell、显示管理器、桌面环境 等)执行初始化操作

GRUB

GNU GRUB 简称为 GRUB(GRand Unified Bootloader),是一个 多启动规范的实现。GRUB 来自于 GNU 项目,是 Linux 及其他 类 Unix 操作系统默认使用的 引导管理器,不仅如此,GRUB 还用于 Windows 等主流操作系统。

主要功能
选择启动的操作系统

GRUB 允许你在启动过程中 选择要启动的操作系统和内核。这在多重引导系统上非常有用,因为你可能在 同一计算机上 安装了 多种不同的操作系统同一操作系统的不同内核版本。GRUB 的引导菜单列出了这些选项,你可以使用 方向键 来选择要启动的操作系统和内核版本。

编辑内核启动参数

GRUB 允许你编辑内核的启动参数,这些启动参数可以 影响系统的行为例如,你可以通过 GRUB 向内核传递参数来控制内核的日志输出级别、启用或禁用硬件驱动程序、设置网络配置等。通过编辑 GRUB 引导菜单中的 特定内核条目,你可以添加或修改这些参数,以满足特定需求或解决问题。

进入GRUB 引导界面

CentOS8 Stream 的在启动过程中将 自动进入 GRUB 引导界面。在进入 GRUB 引导界面后,若 五秒 内没有敲击按键或鼠标,则 GRUB 将自动选择操作系统。

通过敲击键盘的方向键选择需要的操作系统及内核版本。在此处存在两个选项(您的界面可能与我不同,只需通过方向键选择需要操作的那个选项即可)。
在选项的提示内容中,中括号 所包裹的内容为操作系统所使用的 内核版本,第一个是操作系统实际使用的内核版本号,而第二个则像是 0-rescue一段随机文本 的组合。经验证,两者所关联的操作系统及内核版本均是相同的(简单来说,这两个选项指向同一个操作系统)。

在这里插入图片描述

编辑内核启动参数

进入内核编辑界面

在选择目标选项后,敲击 E 键进入内核编辑界面。通过敲击方向键查找到以 linux 开头的行,该行包含了内核启动参数。其他 Linux 操作系统中,包含内核启动参数的行的行首可能不为 linux(但大多是以 linux 开头的),在 CentOS7 中,包含启动参数的行的行首为 linux16。如果你在内核编辑界面中找不到以 linux 开头的行,请考虑考虑类似的行👌。

注:

在编辑内核启动参数的过程中,由于显示界面较小(一行内容显示为多行),需要 额外注意行与行的区分

initrd/initramfs

initrd (Initialization Ram Disk)initramfs(Initialization Ram FileSystem) 都用于提供一个 临时的初始化环境(临时文件系统),以在真正的 root 文件系统可用之前进行必要的设置。尽管它们的目的相似,但它们的实现和构建方式存在差异。initramfsinitrd 的替代方案,现代 Linux 操作系统中多使用 initramfs

为什么需要 initrd/initramfs?

考虑到 Linux 需要在各种各样的硬件上运行,有些硬件需要 特定的驱动才能进行访问直接在内核映像中包含所有可能的驱动将使内核映像变得非常庞大。使用 initrdinitramfs 可以加载一个 小的、特定的、只包含必要驱动及相关工具的环境

initrd/initramfs 由谁启动?

在 Linux 中的启动过程中,initrd/initramfs内核BootLoader 加载,在内核加载完毕后,BootLoader 将 CPU 控制权交由内核,由内核启动 initrd/initramfs

临时文件系统

在由 initrd 或 initramfs 提供的临时文件系统中,存在一个名为 /sysroot 的文件,这个文件中包含着实际的 root 文件系统,也就是我们日常在使用 Linux 系统过程中离不开的根目录。

临时文件系统的大致样貌

/sysroot 文件的大致样貌

进入临时文件系统

rd.break

rd.break 是 Linux 内核的一个 启动参数,通常用于故障排查。当提供此参数时,initramfsinitrd 将在挂载 实际 root 文件系统之前中断,从而允许用户进入临时文件系统中进行相关的系统配置。

添加内核启动参数

如需进入临时文件系统,仅需要在内核编辑界面中,包含内核启动参数的那一行中正确的添加参数 rd.break。对此,请参考如下界面:

在修改完成后,敲击 Ctrl-x 以启动内核。稍等片刻,即进入由 initrd 或 initramfs 提供的临时文件系统中。

/sysroot 文件

临时文件系统中的 /sysroot 文件包含了实际的 root 文件系统进入该文件系统不需要经过任何验证。通过 /sysroot 文件,我们将能够 在不使用 root 密码的情况下拥有 root 用户的权限

双刃剑

优点
  1. 故障恢复
    实际的 root 文件系统或其他项 存在异常 时,这种设计允许管理员 进入一个简化的环境进行故障的排查与修复
  2. 灵活性
    /sysroot 允许管理员 手动加载驱动程序检查系统配置或进行其他任务,以确保系统 能够在特殊情况下能够正常启动
风险

/sysroot 的重要性与便利性为操作系统带来了一定的风险。幸运的是,在由 initrd 或 initramfs 提供临时文件系统时,系统中与 网络相关的服务 还未被启动,这意味着 只有能够触碰到存放操作系统的物理实体的人 才有可能利用 /sysroot 达成自己的目标。

但这并不意味着我们能够放松警惕,在机密、商用等服务器上尤其如此。通过对 BIOS/UEFI引导程序(如 GRUB)等进行加密限制可疑人员对服务器的物理访问 可以起到一定程度的防护作用,避免 /sysroot 被有心之人利用。

Root 密码的重置

Chrooting

chroot 命令

chroot(Change Root)Linux 等类 Unix 操作系统 中的一个命令,用于改变根文件系统目录,将当前 SHELL 进程的根目录更改为一个新的目录chroot 的这一功能可用于创建一个受限制的执行环境,使进程只能访问到指定目录及其子目录,而无法访问系统的其他部分。chroot 命令 通常用于增强系统的安全性例如在 运行系统服务或执行故障排除时,限制进程的文件系统访问范围。

两种解决方案

进入由 initrd 或 initramfs 提供的临时文件系统后,许多命令行工具都将无法使用,这是由 initrd/initrmdfs功能(用于加载一个 小的、特定的、只包含必要驱动及相关工具的环境) 所决定的。


对于该问题,存在两种解决方案(就我所知)。

  1. 通过一个包含 /sysroot 的文件路径访问我们所需要的 文件(Linux 中一切皆文件),该方案需要你对各种文件存放的路径有一定的了解。例如:

  2. 通过 chroot 命令 将 /sysroot 设置为当前 SHELL 进程的根目录,各种命令的访问将依据 /sysroot 中包含的环境配置文件进行查找。

为了简便起见,我们将通过如下命令将 /sysroot 设置为当前 SHELL 进程的根目录:

chroot /sysroot

重新挂载

remount

在操作系统的启动过程中,文件系统通常以 只读 的方式进行挂载。在操作系统的启动过程中,操作系统还没有完全初始化,文件系统可能处于不稳定的状态。将文件系统以只读方式挂载 有助于防止启动过程中的有意或无意的写入,从而提高系统的稳定性。一旦系统引导完成,通常会 在后续阶段重新挂载根文件系统为读写模式,以便用户和应用程序能够正常操作文件系统。
我们需要修改 Root 用户的密码,势必要对文件系统进行一定的修改,因此我们需要将 /sysroot 重新挂载为 可读写文件。若你刚刚通过 chroot 命令将 /sysroot 设置为当前 SHELL 进程的根目录,请你通过 exit 命令取消 chroot 的操作。否则,将挂载失败,对此,请参考如下界面:


由于我们将 /sysroot 设置为当前 SHELL 进程的根目录,故在执行 mount 命令时,系统将找不到 /sysroot 文件,导致挂载失败。

mount 命令

mount 命令是 Linux 等类 Unix 操作系统中的一个重要命令,用于将文件系统挂载到指定的目录,使文件系统的内容可以被访问

在重新挂载 /sysroot 的过程中,我们使用了如下命令:

mount -o remount,rw /sysroot

其中:

项目描述
-o该选项用于 指定挂载选项列表,列表中的元素将以 英文逗号 分隔。
remount该选项用于告知 mount 将目标文件系统进行 重新挂载
rw该选项用于告知 mount 将目标文件系统 以可读写的方式进行挂载
/sysroot需要进行挂载的文件系统,此处是 /sysroot

重置 Root 用户密码

passwd

passwd 命令是 Linux 等类 Unix 操作系统中的一个重要命令,常用于更改用户的密码passwd 允许 已授权用户 修改当前用户的密码,Root 用户 使用该命令则可以修改其他用户的密码。

重置

在完成 将 /sysroot 设置为当前 SHELL 进程的根目录将 /sysroot 重新挂载为可读写文件系统 后,我们将能够直接使用 passwd 修改 Root 用户的密码。对此,请参考如下界面:

由于在使用 passwd 重置密码的过程中,我使用了少于 8 位的密码,因此 CentOS8 Stream 给出了提示信息 BAD PASSWORD,但密码的重置过程仍旧顺利进行。

当然,在密码重置过程中,你看到的也许是如下界面:


不必担心,这(Linux 系统尝试给出中文提示,但由于该终端不支持相关编码,导致了乱码现象)也表明命令执行成功了🤡。

重启计算机

在使用 passwd 命令修改命令后,我们需要重启计算机来验证 Root 用户 密码是否已经成功更改。遗憾的是,在将 /sysroot 设置为当前 SHELL 进程的根目录后,在该环境中直接使用 reboot 命令重启计算机将得到如下 异常信息(原因暂不明确)

System has not been booted with systend asinit system (PID 1). Can't operate.
Fai led to comnect to bus: Host is down
Fai led to talkto init daemon .

我们需要先通过 exit 命令退出该环境再使用 reboot 命令重启计算机。对此,请参考如下界面:


当然,你也可以通过 重新开启电源 来达成相同目的。通过 reboot 命令重置计算机并不是成功 重置 Root 密码 的必经之路。

Login Incorrect

一步之遥

如果你的 Linux 系统使用了 SELinux(Security-Enhanced Linux) 安全模块,那么我们的 Root 密码的重置之路还缺少一步😁。在你将这一步走完前,尝试登录任何账号都将被拒绝,即使您输入了正确的账号密码。对此,请参考如下界面:

现在,请关机重启,再次进入 /sysroot 文件中去(记得执行 重新挂载 /sysroot通过 chroot 命令将 /sysroot 设置为进程的根目录)😈。

/.autorelabel

在执行相关操作并进入 /sysroot 目录中后,请执行如下命令以在 /sysroot 目录中创建隐藏的空文件 /.autorelabel

touch /.autorelabel

当你通过 /sysroot 重置 root 密码 后,执行 touch /.autorelabel 命令是为了处理 SELinux(Security Enhanced Linux) 的安全上下文。

简单来说,Linux 系统中 可能 会有一个名为 SELinux 的安全机制,该机制将为文件和进程附加额外的安全标签,以决定相关的访问权限。当你修改了 root 密码,SELinux 的相关标签可能与实际系统状态不符

root 根目录下的 /.autorelabel 文件 能够指示操作系统:在下次启动时,重新检查并修复所有文件的 SELinux 标签,确保它们都是正确的。这样可以确保系统在你修改密码后仍然安全且可用。

在添加文件 /.autorelabel 后,再次重新启动计算机可能需要更长的时间才能完成。

在操作系统重启后,你便能够使用修改过的 Root 密码去登录 Root 账户了。

内核启动参数的另一种修改方式

Read Only

在内核启动参数中的 ro 的含义即 Read Only,用于指定文件系统以 只读 的方式进行挂载。
你若将该选项修改为 rw,则文件系统将以 可读写 的方式进行挂载。在后续的 Root 密码重置过程中,使用命令 mount -o remount, rw /sysroot/sysroot 重新挂载的步骤便可以省去了。

init

initLinux 内核启动参数的一个选项,该选项用于 指定初始化进程(PID 为 1)所在的路径初始化进程是在 Linux 内核启动后首先运行的进程,它负责启动所有其他的系统进程

当你添加内核启动参数 init=/bin/bash 时,系统在将内核启动后会尝试启动 /bin/bash 作为其初始化进程,而不是常见的 initsystemd
由于没有正常的 initsystemd 进程来启动其他服务和守护进程,所以你会被直接放入一个 Root SHELL(initrd/initramfs 提供的临时文件系统) 中。

init/systemd 与 initrd/initramfs

initrdinitramfs 在完成其任务后,会将控制权交给 initsystemd。当你使用 rd.break 作为内核启动参数时,initramfsinitrd 将在挂载 实际 root 文件系统之前中断。

rd.breakinit=/bin/bash 都将能够 使得系统启动在临时文件系统环节中止,使用两者中的任一个都将达到相同效果。

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BinaryMoon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值