当前位置: 首页 > news >正文

【运维基础】Linux 系统启动原理

Linux 系统启动原理

系统 target

系统 target 一般可理解为系统目标,指一个系统在设计、运行或优化过程中期望达成的具体结果、指标或目的。它是系统存在和运作的核心导向,为系统的开发、维护和评估提供明确的方向。

而systemd使用类型为target的单元来分组不同单元,例如multi-user.target包涵chronyd.service、crond.service、firewalld.service等服务。

target还可以包涵其他target,例如graphical.target包涵multi-user.target,multi-user.target包涵basic.target,basic.target包涵sysinit.target。

使用以下命令查看target之间依赖关系:

[root@server ~ 21:26:47]# systemctl list-dependencies graphical.target
graphical.target
● ├─display-manager.service
● ├─network.service
● ├─systemd-update-utmp-runlevel.service
● └─multi-user.target
●   ├─auditd.service
●   ├─chronyd.service
●   ├─crond.service
●   ├─dbus.service
●   ├─irqbalance.service
●   ├─mdmonitor.service
●   ├─network.service
●   ├─NetworkManager.service
●   ├─plymouth-quit-wait.service
●   ├─plymouth-quit.service
●   ├─postfix.service
.........# 查看反向依赖
[root@server ~ 21:27:15]# systemctl list-dependencies sshd.service --reverse
sshd.service
● └─multi-user.target
●   └─graphical.target

系统启动级别

CentOS 6 之前使用启动级别控制系统开机激活哪些服务。CentOS 7 使用target控制系统开机激活哪些服务。

runleveltarget作用
0关机,init 0 同 poweroff 和systemctl poweroff
1emergency.target rescue.target单用户模式、救援模式和紧急模式用于修复系统
2多用户文本界面,不具备NFS功能
3multi-user.target多用户文本界面
4未使用
5graphical.target多用户图形界面
6重启,init 6 同 reboot 和systemctl reboot

设置系统运行目标

/etc/inittab文件是CentOS 6之前版本初始化系统使用的配置文件。

# 部分内容如下
# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
# 设置运行级别为5,也就是图形化方式启动。
id:5:initdefault:

设置系统当前运行 target

# 设置系统当前运行target为multi-user.target
[root@server ~ 21:29:38]# systemctl isolate multi-user.target# 设置系统当前运行target为graphical.target
[root@server ~ 21:29:55]# systemctl isolate graphical.target

设置系统开机默认运行 target

# 查看系统开机默认运行target
[[root@server ~ 21:30:35]# systemctl get-default 
graphical.target# 设置系统开机默认运行target
[root@server ~ 21:30:48]# systemctl set-default multi-user.target
# 重启验证
[root@server ~ 21:31:04]# reboot

在系统启动时选择其它目标

要在启动时选择其他目标,将 systemd.unit=target.target 参数附加到内核命令行。该配置是临时生效的,经常用于系统启动过程中故障排除。

要使用这种选择其他目标的方法,请执行以下步骤:

  1. 启动或重新启动系统。
  2. 按任意键中断启动加载器菜单倒计时(Enter除外,它用于执行正常启动)。
  3. 将光标移至第一个内核条目,按e编辑当前条目。

在这里插入图片描述

  1. 将光标移至以linux16开头的行,末尾附加systemd.unit=target.target。例如,systemd.unit=multi-user.target。按 Ctrl+x 使用这些更改进行启动。

在这里插入图片描述

重置 ROOT 密码

以下几种方法可用于设置新的root密码。例如:

  • 系统管理员可以使用Live CD启动系统,挂载根文件系统,然后编辑/etc/shadow:
    • 删除root账户密码字段
    • 使用已知密码字段替换root密码字段
  • 在CentOS 7之后版本中,可以让initramfs运行的脚本在某些点暂停,以提供root身份的shell,然后在该shell中重置root密码。

方法1:rd.break

  1. 重新启动系统。

  2. 按任意键(Enter除外)中断启动加载器倒计时。

  3. 将光标移至第一个内核条目,按e编辑当前条目。

在这里插入图片描述

  1. 将光标移至以 linux16 开头的行,末尾附加 rd.break。利用该选项,在系统从initramfs向实际系统移交控制权前,系统将会中断。按Ctrl+x进行启动。

在这里插入图片描述

  1. 此时,系统会显示root shell,且磁盘上的实际根文件系统以只读方式挂载在/sysroot。

​ 以读/写形式重新挂载/sysroot。

switch_root:/# mount -o remount,rw /sysroot
  1. 切换root位置,把/sysroot做为文件系统树的根。
switch_root:/# chroot /sysroot
  1. 设置新root密码。
sh-4.2# echo password | passwd --stdin root

提示:password 是用户自定义密码。

  1. 如果系统开启了 SELinux 功能,则需要确保所有未标记的文件(包括此时的/etc/shadow)在启动过程中都会重新获得标记。
sh-4.2# touch /.autorelabel     
  1. 执行以下命令,系统将继续启动。如果系统开启了SELinux功能,还需要执行完整的 SELinux 重新标记,然后再次重新启动。
sh-4.2# exit
switch_root:/# exit
  1. 登录验证。

/etc/fstab 引起的系统启动问题

环境准备
# 设置磁盘分区管理方案
[root@server ~ 09:48:40]# parted /dev/sdb mklabel msdos
信息: You may need to update /etc/fstab.# 创建分区
[root@server ~ 09:58:00]# parted /dev/sdb unit MiB mkpart primary 1 10241
信息: You may need to update /etc/fstab.# 格式化为xfs文件系统
[root@server ~ 09:58:35]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=655360 blks=                       sectsz=512   attr=2, projid32bit=1=                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=2621440, imaxpct=25=                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2=                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0# 创建挂载点
[root@server ~ 09:58:59]# mkdir /data01# 设置持久化挂载
[root@server ~ 09:59:07]# echo '/dev/sdb1 /data01 xfs defaults 0 0' >> /etc/fstab # 挂载并验证
[root@server ~ 10:00:05]# mount -a
[root@server ~ 10:00:11]# df -h /data01
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb1        10G   33M   10G    1% /data01
故障1:挂载点不存在

环境准备

[root@server ~ 10:00:22]# umount /data01
[root@server ~ 10:11:11]# rmdir /data01

重启系统验证

# 可以正常进入系统,挂载点会被自动创建
[root@server ~ 10:12:17]# df -h /data01
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb1        10G   33M   10G    1% /data01
故障2:设备名称写错或者找不到设备

环境准备

[root@server ~ 10:12:19]# vim /etc/fstab 
# 将原先的sdb1修改为sdb2
/dev/sdb2 /data01 xfs defaults 0 0

重启系统验证

  1. 启动过程中找不到该设备。

  2. 1分30秒超时后,进入emergency模式,进行修复。(或用rd.break来处理)

    修改为正确的值或者注释该条目,确保系统正常启动。

  3. 然后输入exit,继续启动。

演示:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

故障3:破坏文件系统

环境准备

[root@server ~ 13:36:13]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=1
记录了1+0 的读入
记录了1+0 的写出
1048576字节(1.0 MB)已复制,0.00152174 秒,689 MB/秒
[root@server ~ 13:36:27]# reboot

重启系统验证

  1. 系统启动过程中尝试修复文件系统,修复失败后提示进入 emergency 模式修复。

  2. 进入emergency 模式修复。

# 执行以下命令修复
[root@centos7 ~]# xfs_repair /dev/sdb1

修复完成后,输入exit继续启动系统,并可以正常启动系统。

演示:

在这里插入图片描述

grub2 配置

grub2 配置文件

grub2 的主要配置文件如下:

  • /boot/grub2,grub2的主要配置文件所在目录,例如grub.cfg、grubenv、user.cfg。

  • /etc/grub2.cfg

    • /etc/grub2.cfg 是指向 /boot/grub2/grub.cfg的软连接。

    • 不要直接修改/etc/grub2.cfg文件,该文件由系统自动生成。如果需要自定义这个文件,可以通过修改/etc/grub.d/中脚本和/etc/default/grub文件,然后通过grub2-mkconfig命令生成。

    使用efi启动方式的grub2配置文件是/etc/grub2-efi.cfg。

  • /etc/grub.d/,该目录下存放多个数字开头的脚本,按照从小到大的顺序执行。例如00_header会调用/etc/default/grub配置文件来实现最基本的开机界面配置。

  • /etc/default/grub,定义grub启动部分变量信息,例如grub启动菜单选择条目的超时时间,内核参数等。

  • /boot/grub2/grubenv,设定默认启动条目。

grub 菜单超时时间

[root@server ~ 19:31:24]# vim /etc/default/grub
# 修改GRUB_TIMEOUT为10
GRUB_TIMEOUT=10# 生效grub2.cfg配置文件
[root@server ~ 19:34:45]# grub2-mkconfig -o /etc/grub2.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-1160.71.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.71.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-1299648f359e4a80b5d4d319d510ea97
Found initrd image: /boot/initramfs-0-rescue-1299648f359e4a80b5d4d319d510ea97.img
done# 重启
[root@server ~ 19:36:00]# reboot

kernel 启动参数

[root@server ~ 19:40:23]# vim /etc/default/grub
# 修改GRUB_CMDLINE_LINUX,例如在最后添加参数console=ttyS0,导致不显示启动过程
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet console=ttyS0"# 生成grub2.cfg配置文件,重启验证
[root@server ~ 19:42:08]# grub2-mkconfig -o /etc/grub2.cfg
[root@server ~ 19:42:21]# reboot

效果如下:

在这里插入图片描述

grub 菜单加密

# 查看/etc/grub.d/01_users脚本
[root@server ~ 19:44:21]# cat /etc/grub.d/01_users
#!/bin/sh -e
cat << EOF
if [ -f \${prefix}/user.cfg ]; thensource \${prefix}/user.cfgif [ -n "\${GRUB2_PASSWORD}" ]; thenset superusers="root"export superuserspassword_pbkdf2 root \${GRUB2_PASSWORD}fi
fi
EOF# 生成grub2密码
[root@server ~ 19:44:23]# grub2-mkpasswd-pbkdf2 
输入口令:123
Reenter password: 123
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.3066B665D88E8C3DFEF0765D89CA7C67E3E81080207CA682812C68C152F467564A625EDF1B91A100B6C11A3E29BE0938DC6F382C206DCF9AA869F4149D311B65.F76B641F962A9B7E1B1D6841E010F8BE3D736EED9BDA20F464C3467D8083E260FA0787AC9498969257DEEC9AE96448969BF64DAE2C1ECA9BCBF04520AEA25A6B# 创建文件
[root@server ~ 19:45:33]# vim /boot/grub2/user.cfg
GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.3066B665D88E8C3DFEF0765D89CA7C67E3E81080207CA682812C68C152F467564A625EDF1B91A100B6C11A3E29BE0938DC6F382C206DCF9AA869F4149D311B65.F76B641F962A9B7E1B1D6841E010F8BE3D736EED9BDA20F464C3467D8083E260FA0787AC9498969257DEEC9AE96448969BF64DAE2C1ECA9BCBF04520AEA25A6B# 生成grub2.cfg配置文件,重启验证
[root@server ~ 19:49:16]# reboot

效果如下:

  1. 启动菜单界面,按e编辑。

  2. 输入用户名root,密码redhat。

在这里插入图片描述

  1. 弹出如下菜单,可以编辑了。

grub2 故障处理

MBR 组成回顾

主引导扇区由三个部分组成:

在这里插入图片描述

  • 引导程序(占446个字节),硬盘启动时将系统控制权转给分区表中的某个操作系统。
  • 磁盘分区表项(DPT,Disk Partition Table),由四个分区表项构成(每个16个字节)。
  • 结束标志(占2个字节),其值为AA55(十六进制)。

故障:grub 引导程序故障

环境准备

[root@server ~ 21:14:38]# dd if=/dev/zero of=/dev/sda bs=1 count=446
记录了446+0 的读入
记录了446+0 的写出
446字节(446 B)已复制,0.00121374 秒,367 kB/秒

**效果如下:**系统无法从硬盘启动,则会尝试使用其他设备启动。

**解决思路:**使用光盘启动,并重新安装引导程序。

解决过程:

  1. 开机从光盘启动,并选择Troubleshooting

在这里插入图片描述

  1. 选择Rescue a CentOS system

在这里插入图片描述

  1. 稍等片刻,进入选择界面,选择 1。搜索到系统后,提示系统已经挂载在/mnt/sysimage,按回车继续。

在这里插入图片描述

  1. 切换root目录,并确保root文件系统是读写挂载。
sh-4.2# chroot /mnt/sysimage
bash-4.2# mount | grep root
/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota )
  1. 确认系统启动分区所在磁盘。

在这里插入图片描述

  1. 安装引导程序。
bash-4.2# grub2-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported. 
  1. 输入 exit 两次重启系统:第一次exit,退出chroot环境;第二次exit,退出系统。
bash-4.2# exit
sh-4.2# exit

文件系统是读写挂载。

sh-4.2# chroot /mnt/sysimage
bash-4.2# mount | grep root
/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota )
  1. 确认系统启动分区所在磁盘。

[外链图片转存中…(img-YlgPNk0y-1754401071484)]

  1. 安装引导程序。
bash-4.2# grub2-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported. 
  1. 输入 exit 两次重启系统:第一次exit,退出chroot环境;第二次exit,退出系统。
bash-4.2# exit
sh-4.2# exit
http://www.dtcms.com/a/315672.html

相关文章:

  • 增量:增量处理
  • 游戏行业DDoS攻防实战指南
  • ApplicationContext的实现类有哪些?
  • 「PromptPilot 大模型智能提示词平台」—— PromptPilot × 豆包大模型 1.6:客户投诉邮件高效回复智能提示词解决方案
  • 芯祥科技:工业/车规级BMS芯片厂商 规格选型对比
  • Python import 详解
  • linux_https,udp,tcp协议(更新中)
  • C++ ---》string类的模拟实现
  • CRT调试堆检测:从原理到实战的资源泄漏排查指南
  • HBM Basic(VCU128)
  • nflsoi 7.29 题解
  • Python-深度学习--2信息熵,条件熵(ID3决策树),KL散度
  • 飞算JavaAI—AI编程助手 | 引领开发新时代,智能化编程的完美助手
  • python学智能算法(三十三)|SVM-构建软边界拉格朗日方程
  • 分布式微服务--Nacos持久化
  • Modstart 请求出现 Access to XMLHttpRequest at ‘xx‘
  • 用 Python 构建高质量的中文 Wikipedia 语料库:从原始 XML 到干净段落
  • rabbitMq内容整理
  • PromptPilot搭配Doubao-seed-1.6:定制你需要的AI提示prompt
  • 云计算一阶段Ⅱ——11. Linux 防火墙管理
  • LeetCood算法题~水果成篮
  • [element-plus] ClickOutside点击其他地方
  • 【IDEA】IntelliJ IDEA 中文官方文档全面介绍与总结
  • Docker 部署工程基本命令记录
  • uniapp renderjs 逻辑层,视图层互相传递数据封装
  • 星图云开发者平台赋能商储油安全管控数字化转型
  • 漏洞分析:90分钟安全革命
  • NLP自然语言处理 03 Transformer架构
  • 基于 FFmpeg 与 V4L2 的多路摄像头视频采集,图像处理处理与 RTMP 推流项目(开源)
  • GPU 基础矩阵精规组织教程:从基础作用到实战应用