本文主要是介绍再生之术:Root 密码遗忘的 CentOS8 Stream 解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 参考
- 环境
- 大魔头 Root
- GRUB 引导界面
- BootLoader
- GRUB
- 主要功能
- 选择启动的操作系统
- 编辑内核启动参数
- 进入GRUB 引导界面
- 编辑内核启动参数
- 进入内核编辑界面
- initrd/initramfs
- 为什么需要 initrd/initramfs?
- initrd/initramfs 由谁启动?
- 临时文件系统
- 进入临时文件系统
- rd.break
- 添加内核启动参数
- /sysroot 文件
- 双刃剑
- 优点
- 风险
- Root 密码的重置
- Chrooting
- chroot 命令
- 两种解决方案
- 重新挂载
- remount
- mount 命令
- 重置 Root 用户密码
- passwd
- 重置
- 重启计算机
- Login Incorrect
- 一步之遥
- /.autorelabel
- 内核启动参数的另一种修改方式
- Read Only
- init
- init/systemd 与 initrd/initramfs
参考
| 项目 | 描述 |
|---|---|
| 搜索引擎 | Bing、Google |
| AI 大模型 | 文心一言、通义千问、讯飞星火认知大模型、ChatGPT |
| Linux 操作系统(微课版)(RHEL 8/CentOS 8)(第二版) | ISBN:9787302582922 |
| 老杨Linux | 从BIOS开始画图了解Linux启动过程 |
环境
| 项目 | 描述 |
|---|---|
| CentOS8 Stream | 4.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 复活吧。

注:
- 在接下来的操作中,我们将解决 Root 密码被遗忘的问题。请确保您使用的 Linux 操作系统是
CentOS8、CentOS8 Stream、Fedora8或RHEL8操作系统中的任意一种(版本可以不同,但不要差异过大)。如果您对 Linux 操作系统较为熟悉,那么也可以通过该篇文章触类旁通的解决其他大部分 Linux 操作系统中 Root 密码遗忘的问题。

- 如果您
不了解您所使用到的 Linux 操作系统的发行版信息,在大多数情况您都可以使用如下方式对此进行确认。
大多数 Linux 操作系统提供者都在/etc/os-release文件中保存了当前操作系统相关的发行信息。在 Linux 操作系统中你可以通过在命令行界面中输入如下命令来查看/etc/os-release文件中保存的内容。
我使用的操作系统是cat /etc/os-releaseCentOS8 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 文件系统可用之前进行必要的设置。尽管它们的目的相似,但它们的实现和构建方式存在差异。initramfs 是 initrd 的替代方案,现代 Linux 操作系统中多使用 initramfs。

为什么需要 initrd/initramfs?
考虑到 Linux 需要在各种各样的硬件上运行,有些硬件需要 特定的驱动才能进行访问。直接在内核映像中包含所有可能的驱动将使内核映像变得非常庞大。使用 initrd 或 initramfs 可以加载一个 小的、特定的、只包含必要驱动及相关工具的环境。
initrd/initramfs 由谁启动?
在 Linux 中的启动过程中,initrd/initramfs 与 内核 由 BootLoader 加载,在内核加载完毕后,BootLoader 将 CPU 控制权交由内核,由内核启动 initrd/initramfs。
临时文件系统
在由 initrd 或 initramfs 提供的临时文件系统中,存在一个名为 /sysroot 的文件,这个文件中包含着实际的 root 文件系统,也就是我们日常在使用 Linux 系统过程中离不开的根目录。
临时文件系统的大致样貌

/sysroot 文件的大致样貌

进入临时文件系统
rd.break
rd.break 是 Linux 内核的一个 启动参数,通常用于故障排查。当提供此参数时,initramfs 或 initrd 将在挂载 实际 root 文件系统之前中断,从而允许用户进入临时文件系统中进行相关的系统配置。
添加内核启动参数
如需进入临时文件系统,仅需要在内核编辑界面中,包含内核启动参数的那一行中正确的添加参数 rd.break。对此,请参考如下界面:

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

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

优点
- 故障恢复
当实际的 root 文件系统或其他项 存在异常时,这种设计允许管理员进入一个简化的环境进行故障的排查与修复。 - 灵活性
/sysroot允许管理员手动加载驱动程序、检查系统配置或进行其他任务,以确保系统能够在特殊情况下能够正常启动。
风险
/sysroot 的重要性与便利性为操作系统带来了一定的风险。幸运的是,在由 initrd 或 initramfs 提供临时文件系统时,系统中与 网络相关的服务 还未被启动,这意味着 只有能够触碰到存放操作系统的物理实体的人 才有可能利用 /sysroot 达成自己的目标。

但这并不意味着我们能够放松警惕,在机密、商用等服务器上尤其如此。通过对 BIOS/UEFI,引导程序(如 GRUB)等进行加密 或 限制可疑人员对服务器的物理访问 可以起到一定程度的防护作用,避免 /sysroot 被有心之人利用。
Root 密码的重置
Chrooting
chroot 命令
chroot(Change Root) 是 Linux 等类 Unix 操作系统 中的一个命令,用于改变根文件系统目录,将当前 SHELL 进程的根目录更改为一个新的目录。chroot 的这一功能可用于创建一个受限制的执行环境,使进程只能访问到指定目录及其子目录,而无法访问系统的其他部分。chroot 命令 通常用于增强系统的安全性,例如在 运行系统服务或执行故障排除时,限制进程的文件系统访问范围。
两种解决方案
进入由 initrd 或 initramfs 提供的临时文件系统后,许多命令行工具都将无法使用,这是由 initrd/initrmdfs 的 功能(用于加载一个 小的、特定的、只包含必要驱动及相关工具的环境) 所决定的。

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

-
通过
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
init 是 Linux 内核启动参数的一个选项,该选项用于 指定初始化进程(PID 为 1)所在的路径。初始化进程是在 Linux 内核启动后首先运行的进程,它负责启动所有其他的系统进程。
当你添加内核启动参数 init=/bin/bash 时,系统在将内核启动后会尝试启动 /bin/bash 作为其初始化进程,而不是常见的 init 或 systemd。
由于没有正常的 init 或 systemd 进程来启动其他服务和守护进程,所以你会被直接放入一个 Root SHELL(initrd/initramfs 提供的临时文件系统) 中。
init/systemd 与 initrd/initramfs
initrd 或 initramfs 在完成其任务后,会将控制权交给 init 或 systemd。当你使用 rd.break 作为内核启动参数时,initramfs 或 initrd 将在挂载 实际 root 文件系统之前中断。
rd.break 与 init=/bin/bash 都将能够 使得系统启动在临时文件系统环节中止,使用两者中的任一个都将达到相同效果。
这篇关于再生之术:Root 密码遗忘的 CentOS8 Stream 解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!