23、Linux 实战:系统初始化流程

系统初始化

启动流程

1)读取BIOS,根据BIOS加载硬件信息和硬件系统自检;

2)根据BIOS读取第一个可启动设备中MBR的启动引导程序(Boot Loader);

3)根据启动引导程序,将指定内核(Kernel)文件加载至内存中解压和执行;

4)待内核检测硬件和加载驱动程序完毕,系统即可运行。

//内核文件一般为压缩文件,使用前需解压缩,才能加载到内存中

在驱动程序加载完成后,Kernel会主动调用Systemd程序进行default.target流程:

1)Systemd执行sysinit.target初始化系统;

2)Systemd执行basic.target设计运行环境;

3)Systemd启动multi-user.target下的本机/服务器的服务;

4)Systemd执行multi-user.target的/etc/rc.d/rc.local、getty.target和登录服务

//若是图形界面,Systemd还需执行graphical.target所需的服务

BIOS(基础输入输出系统):提供系统最底层和最直接的硬件设置和控制

1)不论BIOS还是UEFI BIOS都统称为BIOS(固化在主板上)

MBR(主引导记录):磁盘中的Boot Loader区块

1)系统的MBR一般指的是第一个启动设备中的MBR

2)只要BIOS可检测到磁盘(不论任何格式),都可通过硬件的INT 13中断功读取磁盘内的第一个扇区内的MBR

Boot Loader

Boot Loader(启动引导程序):识别内核文件格式并加载至内核中执行

1)Boot Loader程序安装在MBR中(磁盘的第一个扇区)

//不同的操作系统的Boot Loader不同,且内核需对应的Boot Loader才可加载,所以每个文件系统都会保留一块启动扇区(Boot Loader)用于安装Boot Loader

如:系统中有多个文件系统时的boot loader
 

//Windows安装时,默认将在MBR和boot sector上都装上boot loader

//Linux可选择是否安装选择在MBR,若不选择在MBR上安装boot loader,则boot loader仅在boot sector上安装(反之亦然)

boot loader功能:

1)提供多重引导启动功能(加载指定的内核文件);

//实现一台电脑安装多个操作系统

2)直接加载内核文件;

//默认会加载至boot sector内的启动引导程序(如:grub2)

3)将启动管理功能转交至其他boot loader

//Windows的boot loader默认不具有控制权转交功能,所以不能实现在启动Windows后的boot loader后再加载Linux的boot loader(这也是系统安装多重引导时,需先装Windows再装Linux)

如:Windows、Linux和直接加载内核
 
1)MBR(grub2)Linux Kernelbooting

2)MBR(grub2)boot sectore(Windows Loader)Windows Kernelbooting

3)MBR(grub2)boot sectore(grub2)Linux Kernelbooting

内核文件存储在:/boot/vmlinuz-版本号

//不同版本系统的内核版本和版本号不同,所以没有具体路径

如:查看/boot目录下的文件
 

Linux内核是通过动态加载内核模块实现多个功能加载

1)Linux发行版都将非必要且可编译的内核功能编译成模块
//如:USB、SATA和SCSI等磁盘设备的驱动程序都是以模块方式加载内核模块都存储在:/lib/modules

//因为动态加载,所以“/”和“/lib”必须放在同一个硬盘分区

如:查看/lib/module目录下存放的内核模块
 

//若含有多个内核,则以内核版本号命名的目录存储其内核模块

//虽然设备的驱动程序在/lib/modules目录下,但内核并不能挂载该目录(也读取不到该目录下的驱动程序),且内核不能识别具体设备,只能通过加载具体设备的驱动程序将其挂载至根目录

初始化文件系统

初始化文件系统(Initial Ram Filesystem) :内存中模拟文件系统以提供执行程序

1)虚拟文件系统通过boot loader加载至内存中,并被解压缩(压缩文件)在内存中模拟成一个根目录使用;

2)通过虚拟文件系统提供的程序加载启动程序中需要的内核模块,模块通常为文件系统设备的驱动程序;

3)加载完成后,再帮助内核重新调用Systemd完成后续的启动流程;

//初始化文件系统也可称为虚拟文件系统

如:BIOS、boot loade和内核加载流程
 

//boot loader加载Kernel和initramfs(Initial RAM Filesystem),在内存中将initramfs解压缩成根目录,由此加载所需的驱动程序,加载完成后释放initramfs并挂载实际的根目录文件系统

如:查看系统的虚拟文件系统(initramfs)
 
//initramfs就是一个小型的根目录,且由Systemd管理initramfs通过initrd.target启动

initramfs存在原因:内核模块都存储在/lib/modules/$(uname-r)/kernel目录下,则内核想读取这些模块就需先将其在根目录挂载,而内核本身不具备磁盘的驱动程序,所以不能挂载到根目录,进而不能读取到模块

initramfs具体操作:

1)将/lib/modules目录下内核启动过程所需的模块打包成一个文件(initramfs);

2)在启动过程中就通过INT 13硬件中断的功能将文件解压缩;

3)initramfs在内存中模拟成根目录,且包含磁盘驱动程序和文件系统的模块;

4)内核通过initramfs就可识别实际的磁盘,进而将实际的根目录挂载;

dracut命令:建立/重置initramfs文件

指令格式1:dracut 选项 initramfs文件名

选项 含义
-f 强制编译initramfs 若initramfs文件已存在,则覆盖
-v 显示dracut运行过程

//各个发行版的内核都默认提供initramfs文件

指令格式2:dracut 选项 initramfs文件名

选项 含义
--add-drivers 添加指定内核模块到initramfs文件中 指定的内核需在/lib/modules/$(uname -r)/kernel存在
--filesystems 添加指定额外的文件系统到initramfs文件中
--gzip --bzip2 --xz 指定initramfs文件压缩方式 默认为gzip

第一个程序

待内核加载完成、硬件检测和驱动程序加载都完成后,内核会自动调用第一个程序“Systemd”(所以Systemd的PID是1)

1)Systemd功能:通过default.target设计软件运行的环境

2)Systemd的默认启动服务集合:/etc/systemd/system/default.target

//如:系统的主机名、网络设置、文件系统格式和其他服务的启动等

如:查看/etc/systemd/system/default.target
 

当内核完成/etc/systemd/systemd/default.target的默认启动服务集合后,就会链接到/usr/lib/systemd/system目录下加载multi-user.target或graphical.target

//加载graphical.target相当于也加载了multi-user.target(graphical.target在multi-user.target加载完成后通过加载其他服务而完成)

如:继续加载multi-user.target(graphical.target同理)流程
1)查看multi-user.target配置文件
 

//multi-user.target需在basic.target加载完毕后再加载很多服务

2)查看multi-user.target加载的其他服务
 

//其中/usr/lib/systemd/multi-user.target.wants代表系统设置加载的服务,/etc/systemd/system/multi-user.target.wants代表用户设置加载的服务

Systemd启动流程:

1)local-fs.target:挂载系统/etc/fstab规范的文件系统;

2)swap.target:配置内存交换分区;

3)sysinit.target:检测硬件和加载内核所需模块等;

4)basic.target:加载主要设备的驱动程序和防火墙等;

5)multi-user.target:加载普通系统服务和网络服务

//若系统为图形界面,还需执行graphical.target完成界面化服务

sysinit.target:提供系统基本的内核功能、文件系统和设备驱动等(初始化系统)

sysinit.target主要实现功能如下:

sysinit.target主要实现功能
特殊文件系统设备的挂载 如:dev-hugepages.mount和dev-mqueue.mount等挂载服务;
特殊文件系统的启用 如:磁盘阵列(RAID)、网络驱动器(iscsi)和文件系统对照服务等;
系统启动过程中信息传递和画面展示 如:plymouthd服务和plymouth命令来传递动画和信息;
日志文件服务的启动 如:systemd-journald服务的启用;
加载额外的内核模块 如:通过/etc/modules-load.d/模块名.conf文件实现加载内核额外功能;
加载额外的内核参数设置 如:读取/etc/sysctl.conf和/etc/sysctl.d/模块名.conf
启动系统的随机数生成器 如:帮助系统进行密码加密演算功能;
设置终端字体 如:配置终端显示的字体形式
启动动态设备管理器 如:通过udevd程序,动态对应实际设备读写和设备文件名

//不论任何运行级别,sysinit.target都是必须工作的

basic.target:完善初始化后系统的其他服务(操作系统)

basic.target主要实现功
加载alsa音效驱动程序 如:alsa是音效相关的驱动程序,使系统有音效效果
加载firewalld防火墙 CentOS7后用firewalld替代iptables(依然是iptables框架),设置有差异
加载root指定的模块 如:模块存储在/etc/sysconfig/modules/模块名.modules和/etc/rc.modules
启动/配置SELinux安全上下文 如:root可强制重新设置SELinux的安全上下文
加载CPU微指令功能
加载Systemd支持的timer功能
将启动过程所产生的数据写入到/var/log/dmesg

/etc/systemd/system/multi-user.target.wants:通过链接文件控制服务开机自启

//系统在启动时,会自动启动该目录下的所有文件,若让一个服务开机自启,只需将在该目录下做个链接文件

如:取消cups服务的开机自启,再设置其为开机自启
 

//通过systemctl建立/删除链接文件实现是否开机自启

/etc/systemd/system目录:存储系统启动需执行的程序/脚本文件

//实现效果同/etc/rc.d/rc.local文件一致,两者不同处在于:前者属于Systemd,后者属于System V

rc-local.service:为兼容System V的rc.local

//该服务是否启动成功,与/etc/rc.d/rc.local是否具有可执行权限有关;若rc.local具有可执行权限,systemctl重读配置文件后则可启动该服务;若rc.local不具有可执行权限,则rc-local.service无法启动

如:启动rc-local.service服务

1)查看/etc/rc.d/rc.local权限,并启动rc-local.service服务;
 

2)使/etc/rc.d/rc.local具有可执行权限,并启动rc-local.service服务
 

/etc/modules-load.d/模块名.conf:存储内核需加载的模块

1)内容格式:一行即代表一个需加载的内核模块

2)sysinit.target加载模块时默认调用该目录下的文件

/etc/modprobe.d/模块名.conf:存储内核模块的配置参数

1)内核模块的参数配置文件一般与该内核模块同名

/etc/sysconfig目录:存储系统服务的脚本文件

//虽然Systemd已拥有其他的配置文件处理方式,但为了兼容System V,系统启动时还是会读取/etc/sysconfig目录下的文件

如:/etc/sysconfig目录下常用的脚本文件

1)authconfig:规范用户的身份认证功能、/etc/passwd、/etc/shadow使用权限和/etc/shadwon的密码加密算法(Centos7默认使用SHA-512加密算法);

2)cpupower:规范Linux内核操作CPU的原则和启动cpupower.service;

//cpupower.service可让系统以CPU最大性能的方式来运行

3)firewalld:与防火墙相关的配置;

//与防火墙相关的还有:iptables-config、ip6tables-config和ebtables-config

4)network-scripts:网卡配置参数相关

内核模块

内核相关配置文件
/boot/vmlinuz-内核版本号:存储内核文件
/boot/initramfs-内核版本号:存储内核运行时所需的RAM Disk
/usr/src/kernels:存储内核源代码(默认不安装)
/proc/version:存储内核加载至内存后,内核版本相关信息
/proc/sys/kernel:存储内核加载至内存后,内核功能相关文件
/lib/modules/内核版本号/kernel:存储内核模块

如:查看/lib/modules/$(uname-r)/kernel目录
 

7)/lib/modules/内核版本号/modules.dep:记录内核模块依赖性

//内核模块的启动/运行类似服务一样具有依赖性

depmod命令:分析当前内核模块依赖性并写入默认文件中

//默认文件:/lib/modules/内核版本号/modules.dep

指令格式:depmod 选项

//不加选项时,默认分析当前内核模块依赖性,并重新写入默认文件中

选项 含义
-a 检查所有模块依赖性,并写入默认文件中
-A 检查是否有模块比默认文件中的模块新 若存在,则更新默认文件(反之,不更新)
-e 显示当前已加载却不可执行的模块
-n 将分析结果输出到终端(不写入默认文件)

lsmod命令:查看当前内核加载模块数量

指令格式:lsmod

如:查看当前内核加载了多少模块
 

内容格式:模块名称(Module) 模块大小(Size) 模块是否被引用(Used by)

modinfo命令:显示指定内核模块的信息

//modinfo不仅可查看内核模块,还可查看具体模块文件

指令格式:modinfo 选项 模块名

选项 含义
-n 仅显示指定模块的绝对路径
-d 仅显示指定模块的说明
-p 仅显示指定模块的参数说明
-a 仅显示指定模块的开发人员

如:查看ip_tables模块的信息
 

rmmod命令:从内核中删除指定模块

指令格式:rmmod 选项 模块名

选项 含义
-f 强制删除
-w 等待模块能被删除时再删除该模块

insmod命令:添加指定模块到内核中

//insomd可添加模块到内核中,但不能解决模块依赖性问题

指令格式:insmod 选项 内核模块的绝对路径

选项 含义
-v 显示执行过程
-p 测试模块是否能添加Kernel中
-f 强制添加 不检查当前Kernel版本和模块编译时的Kernel版本是否一致

modprobe命令:根据modules.dep文件添加/删除内核中的模块

//modprobe可添加一个/一组相依的模块,modprobe根据modules.dep文件中的依赖关系,决定添加哪些模块,且不需指定模块的绝对路径,因为modules.dep已记录该模块的绝对路径,若添加过程中发生错误,modprobe会删除整组模块

指令格式:modprobe 选项 模块名

选项 含义
-c 列出当前系统中所有的模块
-f 强制添加模块
-r 删除指定模块

Grub2

Grub2:Centos7使用的一种boot loader

grub2的优点如下:

1)识别和支持较多的文件系统,且grub2可直接在文件系统中查找内核文件;

2)系统启动时,可自行编译和修改启动设置选项(类似bash命令行模式);

3)动态查找配置文件

//只需修改/boot/grub2/grub.cfg的设置参数后,下次重启自动生效

grub2-install命令:将grub2安装到指定设备下

指令格式:grub2-install 选项 安装设备

选项 含义
--force 强制安装
--recheck 若安装设备上已存在,则删除后再安装
--skip-fs-probe 忽略该设备上的文件系统影响
--boot-directory=目录路径 安装到指定设备的目录上

//grub2-install默认将grub2所有的文件都安装到/boot/grub2目录下

//grub2-install仅能安装grub2主程序和相关配置文件到/boot/gurb2目录下

//若将grub2安装到磁盘分区下时,需添加许多选项才能安装,且不能用grub2-install将主程序写入到启动扇区(导致无法启动)

配置Grub2

Linux将grub2分为两个阶段(stage)进行保存和运行:

//由于MBR是硬盘的第一个扇区的一个区块,容量仅446B,故不能存储下类似grub2这种复杂功能的grub2(GPT也不能)

1)Stage1:运行grub2主程序,主程序被安装在启动区(MBR或boot sector),并不安装其相关的配置文件;

2)Stage2:主程序加载配置文件,通过grub2加载所有配置文件和相关的环境参数文件(文件系统定义和主要配置文件grub.cfg)

/boot/grub2目录:存储grub2相关配置文件

如:查看/boot/grub2
 

grub2的磁盘命名格式:

//grub2通过对磁盘命名,识别不同磁盘和磁盘分区

1)磁盘名以小括号括起来;

2)磁盘以“hdN”表示,N代表该磁盘的被查找到的顺序;

//第一个查找的磁盘为0,第二个为1,以此类推;

//由于BIOS可动态调整磁盘的启动顺序,则磁盘被查找的顺序不固定,所以N是可能会变动的

3)每个磁盘的第一个分区为1,以此类推

如:系统中含有三块磁盘,其在grub2的中命名如下

磁盘被查找到的顺序 在grub2中的命名
第一块(MBR) (hd0)、(hd0,msdos1)、(hd0,msdos2)……
第二块(GPT) (hd1)、(hd1,gpt1)、(hd1,gpt2)……
第三块 (hd2)、(hd2,1)、(hd2,2)……

//第一块磁盘的第一个逻辑分区的启动扇区命名应为:(hd0,msdos5)

//在命名格式中,msdos和gpt可省略

/boot/grub2/grub.cfg文件:grub2的主要配置文件

//由于该文件内容太过复杂,数据量过多,所以不建议修改该文件,而是通过grub2-mkconfig命令产生新的grub.cfg文件

如:查看/boot/grub2/grub.cfg内容
 

//grub.cfg内容可分为两部分,第一部分为:其他脚本文件的执行和基础运行环境的设计;第二部分(menuentry)为:设计针对具体Linux内核文件运行的环境

//配置文件中有几个menuentry配置,启动时就有几个选项

/boot/grub2/grub.cfg中特殊设置:

1)set root:指定在Linux文件系统中,根目录在那个磁盘上

2)linux16 /vmlinuz-内核版本号:指定Linux内核文件和内核执行时的参数设置

//由于系统在启动过程中,内核文件需挂载根目录并从根目录中读取配置文件,所以需搭配“set root”在配置中内核文件后一定要指定根目录所在的磁盘

3)initrd16 /initramfs-内核版本号:指定虚拟文件系统

//与linux 16同理,需搭配“set root”在配置中指定具体设备,才能读取到正确的虚拟文件系统

/etc/default/grub文件:提供用户修改grub2默认环境配置文件

如:查看/etc/default/grub内容
 

设置项 含义
GRUB_TIMEOUT 指定默认倒数读秒的秒数 若取消等待,则设置为0(直接为默认项) 若强制用户选择,则设置为-1
GRUB_TIMEOUT_STYLE 指定默认是否显示启动选项 menu:显示(默认项) countdown:取消显示,但显示等待秒数 hidden:取消所有显示(包括秒数)
GRUB_TERMINAL_OUTPUT 指定默认信息输出终端 可设置为:console(默认项)、serial、gfxterm和vag_text
GRUB_DEFAULT 指定默认启动选项 指定哪一个menuentry作为默认启动项 默认第一个启动选项为默认启动项
GRUB_CMDLINE_LINUX 指定内核运行的额外参数 实现类似linux16后的内核参数设置

//可通过menuentry的saved、数字、title名和ID名指定默认启动项

如:当系统含有3个menuentry时,指定默认启动项
1)查看3menuentry的title名和ID名;
 

2)指定编号是1的menuentry为默认启动项;
 

3)指定ID名是“3rd-win-system”为默认启动项;
 

4)指定saved为默认启动项;
 

仅修改/etc/default/grub并不能更改grub2的配置,配置/etc/default/grub文件后还需通过grub2-mkconfig命令使/boot/grub2/grub.cfg文件建立/更新

如:使启动选项时等待10秒;默认选用第一个选项;且选项是显示的;内核外带“elevator=deadline”参数
1)配置/etc/default/grub文件;
 

2)更新grub.cfg文件;
 

3)检验是否配置成功
 

grub2-mkconfig命令:通过多个脚本文件辅助建立/更新grub.cfg文件

指令格式:grub2-mkconfig -o /boot/grub2/grub.cfg

//grub2-mkconfig本质是分析/etc/grub.d目录下的文件和/etc/default/grub文件,再通过执行这些文件来建立/更新grub.cfg文件

/etc/grub.d目录:存储辅助建立/更新grub.cfg的脚本文件

如:查看/etc/grub.d
 

文件名 作用
00_header 初始化grub2配置 (分析需加载的模块和屏幕终端的格式等) 通过调用/etc/default/grub来建立/更新grub.cfg文件
01_users 管理gurb2在线编辑
10_linux 分析/boot目录的所有文件,找到正确的Linux内核、读取该内核需要的文件系统模块和参数等; 并将以上这些设置到grub.cfg文件中
30_os-prober 分析并找到其他分区含有的操作系统, 并将这些操作系统写入到grub.cfg中 以作为启动选项处理
40_custom Shell文件 root通过配置该文件实现其他选项/需求

//若有其他需配置的选项,都应该通过配置40_custom文件实现,通过配置/etc/grub.d/40_custom可实现功能如下:

//在配置/etc/grub.d/40_custom后都需通过grub2-mkconfig命令使其生效

1)自定义内核:若直接启动普通内核,可通过grub2-mkconfig获取10_linux脚本文件而制作;但要带自定义的内核,就需使用grub2-mkconfig获取40_custom脚本文件而制作
制作步骤:
(1)从grub.cfg当中复制指定内核选项(menuentry)到40_custom;
(2)在40_custom中配置带有自定义的内核

2)转交控制权:通过chainloader实现boot loader控制权的转交

chainloader(启动引导程序的链接):将控制权转交给其他boot loader

//所以grub2就不需要识别每个内核的文件名,只将控制权转交给下一个boot loader或MBR中的boot loader即可

(也不需要识别下一个boot loader的文件系统)

制作步骤:
(1)加载chainloader模块;

(2)指定转交至的文件系统;

(3)指定转交至的硬盘分区;

(4)设置系统去启动扇区读取boot loader软件

如:设置两个启动选项,取得Windows 7启动选项和回到MBR默认环境的选项
1)查看当前MBR设备分区信息
 

2)配置/etc/grub.d/40_custom文件
 

启动管理

配置grub2完成各个配置文件后,其启动效果如下:
1)系统启动时,当进行到该界面时就是已经由grub2管理
 

//设置默认显示选项,所以可在5个选项中选择其中一个内核运行

//在该界面按“e”进入对应选项内核的grub2在线编辑,按“c”进入grub提供的shell模式

2)按“e”进入grub2在线编辑后,显示该界面;上方;grub.cfg文件的内容,可通过方向键查看/编辑;下方;编辑说明/帮助
 
//取消当前操作并回到前一个画面:ESC或Ctrl和C,直接启动:Ctrl和X

如:在启动过程以图形过程显示,且显示中文
1)编辑/etc/default/grub文件,并grub2-mkconfig
 
2)再在grub2配置文件的中文,启动时可显示如图
 

grub2用户:grub2有同Linux的用户管理架构,其用户身份分为两种

//grub2默认允许任何人修改和选择的,且没有设置任何用户身份

//通过grub2用户管理可实现内核使用和修改的权限配置

1)superusers(管理员用户):在grub2下具有修改和选择所有内核的权限

//设置superusers后,所有的命令修改都会成受限制的

2)users(普通用户):在grub2下仅能选择指定选项,不能修改任何内核

通过配置/etc/grub.d/40_custom文件实现grub2用户的管理

//配置/etc/grub2/grub.cfg也可实现grub2用户的管理(不建议)

如:当前系统配置三个操作系统,分别安装在(hd0,1)、(hd0,2)和(hd0,3),其中
(hd0,1)是所有人都可使用的系统;
(hd0,2)是仅系统管理员可使用的系统;
(hd0,3)是仅系统管理员和指定用户可使用的系统

1)配置/etc/grub.d/40_custom文件,并grub2-mkconfig更新grub.cfg文件;
 
//password也可替换为password_pbkdf2(密文密码)

//若内核配置中加入“--unrestricted”参数代表该内核启动时不需要grub2的用户验证,但进入内核在线编辑时,需grub2的用户验证

2)启动时,多出三个选项
 

grub2-mkpasswd-pbkdf2命令:根据输入的密码,生成密文密码

指令格式:grub2-mkpasswd-pbkdf2

如:将密码“123456789”加密成密文密码
 

grub2在线编辑能够实现修改root密码和修改系统等对系统影响巨大的功能,所以需要通过设置grub2进入在线编辑验证登陆,提高系统安全性

//优先级:grub2管理员用户验证 > grub2验证登录,若/etc/grub.d/40_custom和/etc/grub.d/01_users同时存在验证登录,则以/etc/grub.d/40_custom的管理员用户验证登录为准

通过配置/etc/grub.d/01_users文件实现grub2在线编译的验证登录

//也可配置/etc/grub.d/00_header实现,但该文件较为重要(不建议配置)

//由于/etc/grub.d目录下的文件都是被其他脚本所执行的文件,所以不能直接写入用户名和密码,而是通过cat和echo等命令将用户名和密码写入到文件中

如:配置grub2在线编辑验证登录用户名为“mwl3”,密码为“123456789”
1)配置/etc/grub.d/01_users文件;
 
2)重启再次进入grub2在线编辑模式时
 

修改root密码

通过grub2在线编辑功能实现root密码的修改,步骤:

1)在grub2选项界面时,按“e”进入在线编辑;

//若grub2设置密码,输入密码进入

2)在内核参数设置中添加“rd.break”内核参数;
 

3)按下“Ctrl和X”,等待系统进入rd.break系统状态(紧急救援模式);
 

4)输入以下指令:

挂载/sysroot目录:mount -o remount,rw /sysroot

切换到实际系统的根目录:chroot /sysroot

修改root密码:echo “root密码” | passwd --stdin root

恢复SELinux上下文:touch /.autorelabel

退出系统实际目录:exit

重启:reboot

 

//由于autorelabel使系统重新写入每个文件的SELinux类型,所以启动时间较长

chroot命令:切换系统根目录为指定目录

指令格式:chroot 挂载目录

修改root密码的步骤原理:

1)rd.break内核参数可使系统进入RAM Disk操作系统状态(拥有root权限);此时,所有的目录都属于RAM Disk(原系统根目录挂载在/sysroot目录下);

2)需要将/sysroot目录挂载,并具有可读写权限;用chroot命令切换到/sysroot目录下,并修改root密码;

//切换到原系统根目录下,就可处理原系统的文件系统和用户管理等

3)由于在rd.break系统状态下,系统不具有SELinux功能,而修改root密码导致/etc/shadow文件的SELinux安全上下文被取消,就需通过/.autorelabe使系统在启动时使用默认的SELinux类型重新配置每个文件的SELinux安全上下文

//若不恢复该文件的SELinux安全上下文会导致启动无法正常启动

另一种恢复SELinux安全上下文步骤:

1)在rd.break系统状态下,修改root密码后,修改SELinux的运行模式为“permissive;

2)重启,以root身份登录系统并输入“restorecon -Rv /etc”恢复/etc目录下所有文件的SELinux安全上下文

3)再将SELinux的运行模式改为Enforcing

另一种修改root密码的步骤:

1)在grub2选项界面时,按“e”进入在线编辑;

2)在内核参数设置中添加“init=/bin/bash”内核参数;

//系统提供一个bash,同时不需输入root密码也具有root权限

由于是默认bash环境,其PATH仅有/bin(也没有Syetemd或init),所以在执行各种命令时,需输入绝对路径

3)输入以下指令:

挂载/目录:mount -o remount,rw /

修改root密码:echo “root密码” | passwd --stdin root

恢复SELinux上下文:touch /.autorelabel

重启:硬件强制重启(断电)

//Linux不能随意关机,容易导致文件系统错乱或某些服务无法启动