本文主要是介绍再生之术: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-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 文件系统可用之前进行必要的设置
。尽管它们的目的相似,但它们的实现和构建方式存在差异。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 解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!