linux 系统引导过程

目录

[一、linux 系统引导过程](#一、linux 系统引导过程)
[1.1BIOS/UEFI 阶段](#1.1BIOS/UEFI 阶段)
[1.2 MBR/GPT 阶段](#1.2 MBR/GPT 阶段)
1.3引导加载程序阶段
1.4内核阶段
[1.5init/Systemd 阶段](#1.5init/Systemd 阶段)
1.6用户空间阶段
1.7总结
[二、系统初始化进程 (centos 6和7 的区别)](#二、系统初始化进程 (centos 6和7 的区别))
[2.1CentOS 6 初始化进程(SysVinit)](#2.1CentOS 6 初始化进程(SysVinit))
[2.2CentOS 7 初始化进程(systemd)](#2.2CentOS 7 初始化进程(systemd))
2.3主要区别总结
三、运行级别所对应的Systemd目标
[3.1CentOS 6 运行级别和 CentOS 7 Systemd 目标对比](#3.1CentOS 6 运行级别和 CentOS 7 Systemd 目标对比)
3.2详细解释
3.3设置默认目标
[四、修复 MBR 扇区故障](#四、修复 MBR 扇区故障)
[4.1设置和修复 MBR 扇区故障](#4.1设置和修复 MBR 扇区故障)
[4.2设置和修复 GRUB 故障](#4.2设置和修复 GRUB 故障)
[4.3设置和修复忘记 root 密码](#4.3设置和修复忘记 root 密码)
五、系统服务控制
5.1控制类型
5.2示例
5.3示例使用
[六、Linux 系统的运行级别](#六、Linux 系统的运行级别)
6.1.显示运行级别
6.2查看系统默认的运行级别
6.3设置永久运行级别
6.4切换为字符模式
6.5扩展
6.6总结
七、优化启动过程
7.1常用控制选项
7.2示例
7.3总结
7.4示例使用


一、linux 系统引导过程

Linux 系统的引导过程是从计算机打开电源开始,到操作系统完全加载并准备好接受用户登录和使用的过程。这个过程包括多个步骤,每个步骤都有其特定的作用。以下是 Linux 系统引导过程的详细步骤:

1.1BIOS/UEFI 阶段

BIOS (基本输入输出系统)或 UEFI(统一可扩展固件接口)是计算机的固件接口,负责系统上电后的初始化工作。

  • POST(加电自检):BIOS/UEFI 执行一系列硬件自检,确保所有硬件正常工作。

  • 加载引导程序:BIOS/UEFI 从指定的启动设备(通常是硬盘、光盘或 USB 驱动器)加载引导程序的第一部分到内存中。

1.2 MBR/GPT 阶段

引导程序存储在磁盘的 MBR(主引导记录)或 GPT(GUID 分区表)的引导分区中。

  • MBR:位于磁盘的第一个扇区,大小为 512 字节。包含引导加载程序的第一阶段和分区表。

  • GPT:用于大容量硬盘,提供更多和更大的分区。引导加载程序位置在 EFI 分区中。

1.3引导加载程序阶段

引导加载程序负责将操作系统内核加载到内存中,并将控制权交给内核。

  • GRUB(GRand Unified Bootloader):常见的引导加载程序,支持多种操作系统和高级引导选项。

    • 第一阶段 :加载 GRUB 配置文件(/boot/grub/grub.cfg)。

    • 第二阶段:显示引导菜单,允许用户选择操作系统或内核选项。

    • 加载内核和 initrd :根据配置文件,将内核(例如 /boot/vmlinuz-4.15.0-45-generic)和初始内存盘(initrd 或 initramfs)加载到内存中。

1.4内核阶段

内核是操作系统的核心部分,负责硬件控制和系统资源管理。

  • 解压内核:内核映像解压到内存中并开始初始化。

  • 硬件检测和驱动加载:内核检测硬件并加载必要的驱动程序。

  • 挂载根文件系统 :内核通过初始内存盘(initrd 或 initramfs)挂载根文件系统(通常是 / 分区)。

1.5init/Systemd 阶段

在根文件系统挂载后,内核将控制权交给 init 程序或 systemd 系统管理守护进程。

  • init :传统的初始化程序,执行启动脚本(位于 /etc/init.d)以启动系统服务。

  • systemd :现代化的系统和服务管理器,取代传统 init,具有并行化启动服务和依赖关系管理等功能。

    • 启动服务 :根据配置文件(/etc/systemd/system/)启动系统服务。

    • 设置系统目标:进入指定的运行级别(例如,多用户模式或图形模式)。

1.6用户空间阶段

initsystemd 完成系统服务和设备初始化后,系统进入用户空间,准备接受用户登录。

  • 启动登录服务 :启动 getty 或显示管理器(例如 gdmlightdm),提供用户登录界面。

  • 用户登录:用户通过终端或图形界面登录系统。

  • 用户环境初始化 :加载用户配置文件(例如 .bashrc.profile)并启动用户会话。

1.7总结

Linux 系统的引导过程包括以下主要步骤:

  1. BIOS/UEFI:执行硬件初始化和引导程序加载。

  2. MBR/GPT:从磁盘引导分区加载引导加载程序。

  3. 引导加载程序(GRUB):加载内核和初始内存盘。

  4. 内核:初始化硬件和挂载根文件系统。

  5. init/Systemd:启动系统服务并设置系统运行级别。

  6. 用户空间:提供用户登录界面并初始化用户会话。

每个步骤都扮演着关键角色,确保系统能够顺利启动并进入可用状态。

二、系统初始化进程 (centos 6和7 的区别)

CentOS 6 和 CentOS 7 在系统初始化进程方面有显著的差异,主要体现在使用的初始化系统和服务管理器上。CentOS 6 使用传统的 SysVinit,而 CentOS 7 则采用了现代化的 systemd。以下是两者在系统初始化过程中的详细对比和解释。

2.1CentOS 6 初始化进程(SysVinit)

  1. 启动引导加载程序
  • GRUB(GRand Unified Bootloader)

    • 在 CentOS 6 中,GRUB 引导加载程序加载内核和 initrd(初始 RAM 磁盘)。
  1. 内核初始化
  • 内核:内核加载完成后,开始硬件初始化并挂载根文件系统。

  • initrd/initramfs:内核加载初始 RAM 磁盘,提供加载必要模块和驱动程序的环境。

  1. init 进程
  • /sbin/init :内核初始化完成后,启动第一个用户空间进程 init(PID 1)。

    • init 是 SysVinit 的核心组件。
  1. 运行级别和启动脚本
  • /etc/inittabinit 读取 /etc/inittab 文件,确定系统的默认运行级别。

    • 常见的运行级别包括:

      • 0:关机

      • 1:单用户模式

      • 3:多用户模式(无图形界面)

      • 5:多用户模式(有图形界面)

      • 6:重启

  • 启动脚本 :根据运行级别,init 执行对应的启动脚本:

    • /etc/rc.d/rc.sysinit:系统初始化脚本,执行系统级初始化任务。

    • /etc/rc.d/rc:负责调用相应运行级别的启动脚本(如 /etc/rc.d/rc3.d 目录下的脚本)。

    • /etc/rc.d/rc.local:用户自定义脚本,用户可以在此文件中添加自定义启动命令。

  1. 启动服务
  • 服务脚本 :在每个运行级别目录(如 /etc/rc.d/rc3.d)下,存放了按顺序启动或停止的服务脚本(以 SK 开头)。

    • S 表示启动服务,K 表示停止服务。

    • 每个脚本按数字顺序执行,如 S10networkS20sshd 等。

  1. 登录提示
  • gettyinit 启动 getty 进程,提供终端登录提示符,等待用户登录。

2.2CentOS 7 初始化进程(systemd)

  1. 启动引导加载程序
  • GRUB2

    • 在 CentOS 7 中,GRUB2 引导加载程序加载内核和 initramfs。
  1. 内核初始化
  • 内核:内核加载完成后,开始硬件初始化并挂载根文件系统。

  • initramfs:内核加载初始 RAM 文件系统,提供加载必要模块和驱动程序的环境。

  1. systemd 进程
  • /usr/lib/systemd/systemd :内核初始化完成后,启动第一个用户空间进程 systemd(PID 1)。

    • systemd 是 CentOS 7 的系统和服务管理器,替代了传统的 SysVinit。
  1. systemd 单元和目标
  • 单元(Units)systemd 使用单元来表示系统资源和服务。单元类型包括服务(*.service)、挂载点(*.mount)、套接字(*.socket)等。

  • 目标(Targets)systemd 使用目标来替代传统的运行级别。常见的目标包括:

    • poweroff.target:关机

    • rescue.target:单用户模式

    • multi-user.target:多用户模式(无图形界面)

    • graphical.target:多用户模式(有图形界面)

    • reboot.target:重启

  1. 配置文件和目录
  • 配置文件systemd 的配置文件位于 /usr/lib/systemd/system/etc/systemd/system 目录。

    • /usr/lib/systemd/system:存放系统单元文件。

    • /etc/systemd/system:存放用户自定义和覆盖的单元文件。

  • 默认目标 :系统的默认目标文件是 /etc/systemd/system/default.target,通常是一个符号链接,指向实际的目标文件(如 multi-user.targetgraphical.target)。

  1. 启动和管理服务
  • systemctlsystemd 使用 systemctl 命令管理和控制系统服务和目标。

    • 启动服务:systemctl start <service>

    • 停止服务:systemctl stop <service>

    • 启用服务(开机自动启动):systemctl enable <service>

    • 禁用服务:systemctl disable <service>

    • 查看服务状态:systemctl status <service>

    • 列出所有服务:systemctl list-units --type=service

  1. 登录提示
  • getty 和 loginsystemd 启动 getty 服务,提供终端登录提示符,并启动 login 服务等待用户登录。

2.3主要区别总结

  1. 初始化系统

    • CentOS 6 使用 SysVinit,依赖于 /sbin/init/etc/inittab 文件。

    • CentOS 7 使用 systemd,依赖于 /usr/lib/systemd/systemd 和单元文件。

  2. 服务管理

    • CentOS 6 使用基于脚本的服务管理,脚本存放在 /etc/rc.d/init.d 和相应的运行级别目录中。

    • CentOS 7 使用基于单元的服务管理,单元文件存放在 /usr/lib/systemd/system/etc/systemd/system 目录中。

  3. 运行级别和目标

    • CentOS 6 使用运行级别(0-6),配置在 /etc/inittab 文件中。

    • CentOS 7 使用目标(targets),配置在 /etc/systemd/system/default.target 中,目标文件名通常类似于 multi-user.targetgraphical.target

  4. 服务管理工具

    • CentOS 6 使用 service 命令管理服务,如 service sshd start

    • CentOS 7 使用 systemctl 命令管理服务,如 systemctl start sshd

三、运行级别所对应的Systemd目标

在 CentOS 7 中,传统的运行级别被 systemd 的目标(targets)所取代。以下是 CentOS 6 的传统运行级别和 CentOS 7 中对应的 systemd 目标的对比和详细解释:

3.1CentOS 6 运行级别和 CentOS 7 Systemd 目标对比

运行级别 描述 CentOS 7 对应的 Systemd 目标
0 关机 poweroff.target
1 单用户模式 rescue.target
2 多用户模式,无网络(未使用) multi-user.target
3 多用户模式,有网络 multi-user.target
4 未使用 multi-user.target
5 图形界面 graphical.target
6 重启 reboot.target

3.2详细解释

运行级别 0:关机

  • CentOS 6:运行级别 0 表示系统关机。

  • CentOS 7 :对应的 systemd 目标是 poweroff.target

    bash 复制代码
    systemctl isolate poweroff.target

运行级别 1:单用户模式

  • CentOS 6:运行级别 1 表示单用户模式,通常用于系统维护。

  • CentOS 7 :对应的 systemd 目标是 rescue.target

    bash 复制代码
    systemctl isolate rescue.target

运行级别 2:多用户模式,无网络(未使用)

  • CentOS 6:运行级别 2 表示多用户模式,但不启动网络服务,通常不使用。

  • CentOS 7 :与运行级别 3 和 4 一样,使用 multi-user.target

    bash 复制代码
    systemctl isolate multi-user.target

运行级别 3:多用户模式,有网络

  • CentOS 6:运行级别 3 表示多用户模式,启动网络服务。

  • CentOS 7 :对应的 systemd 目标是 multi-user.target

    bash 复制代码
    systemctl isolate multi-user.target

运行级别 4:未使用

  • CentOS 6:运行级别 4 通常未使用,可自定义。

  • CentOS 7 :与运行级别 3 和 2 一样,使用 multi-user.target

    bash 复制代码
    systemctl isolate multi-user.target

运行级别 5:图形界面

  • CentOS 6:运行级别 5 表示图形用户界面模式。

  • CentOS 7 :对应的 systemd 目标是 graphical.target

    bash 复制代码
    systemctl isolate graphical.target

运行级别 6:重启

  • CentOS 6:运行级别 6 表示系统重启。

  • CentOS 7 :对应的 systemd 目标是 reboot.target

    bash 复制代码
    systemctl isolate reboot.target

3.3设置默认目标

在 CentOS 7 中,可以设置系统启动时的默认目标。默认目标通常类似于 CentOS 6 中的默认运行级别。可以使用以下命令查看和设置默认目标:

查看当前默认目标

bash 复制代码
systemctl get-default

设置默认目标

例如,将默认目标设置为多用户模式(相当于运行级别 3):

bash 复制代码
systemctl set-default multi-user.target

将默认目标设置为图形界面模式(相当于运行级别 5):

bash 复制代码
systemctl set-default graphical.target

四、修复 MBR 扇区故障

4.1设置和修复 MBR 扇区故障

4.1.1设置 MBR 故障

复制代码
# 模拟损坏 MBR,注意:这是一个危险操作,仅供学习和演示使用
dd if=/dev/zero of=/dev/sda bs=446 count=1

4.1.2修复 MBR

1.启动到恢复模式

  • 使用 CentOS 安装光盘启动系统。
  • 选择 "Troubleshooting" > "Rescue a CentOS system"。

2.修复 MBR

  • 使用 dd 命令从 /dev/sda 修复 MBR(假设 /dev/sda 是引导硬盘)。
bash 复制代码
# 进入救援模式后,使用以下命令修复 MBR
dd if=/usr/share/syslinux/mbr.bin of=/dev/sda

4.2设置和修复 GRUB 故障

4.2.1设置 GRUB 故障

bash 复制代码
# 模拟损坏 GRUB,注意:这是一个危险操作,仅供学习和演示使用
dd if=/dev/zero of=/dev/sda bs=512 count=1

4.2.2修复 GRUB

1.启动到恢复模式

  • 使用 CentOS 安装光盘启动系统。
  • 选择 "Troubleshooting" > "Rescue a CentOS system"。

2.挂载文件系统

  • 挂载文件系统到 /mnt/sysimage
bash 复制代码
# 挂载文件系统
chroot /mnt/sysimage

3.重新安装 GRUB

  • 重新安装 GRUB 到引导设备(假设是 /dev/sda)。
bash 复制代码
# 重新安装 GRUB
grub-install /dev/sda
​
# 生成新的 GRUB 配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg

4.3设置和修复忘记 root 密码

4.3.1设置 root 密码问题

假设忘记了 root 密码,不需要进行实际操作来模拟这一故障。

4.3.2修复 root 密码

1.进入单用户模式

  • 在系统启动时,进入 GRUB 菜单。
  • 选择需要启动的内核行,按 e 进行编辑。
  • linux16 行末尾添加 rd.break
bash 复制代码
linux16 /vmlinuz-<kernel_version> root=/dev/mapper/centos-root ro crashkernel=auto rhgb quiet rd.break

2.重新挂载根文件系统

  • 重新挂载根文件系统为读写模式。
bash 复制代码
mount -o remount,rw /sysroot

3.切换到新根环境

  • 切换到新根环境,以便可以对系统进行更改。
bash 复制代码
chroot /sysroot

4.重置 root 密码

  • 使用 passwd 命令重置 root 密码。
bash 复制代码
passwd root

5.更新 SELinux 文件上下文

  • 创建一个文件,指示系统在下次启动时重新标记文件系统,更新 SELinux 文件上下文。
bash 复制代码
touch /.autorelabel

6.退出 chroot 环境并重启系统

  • 退出 chroot 环境并重启系统。
bash 复制代码
exit
reboot

五、系统服务控制

使用 systemctl 命令来管理和控制系统服务。以下是常见的控制类型及其使用方法:

5.1控制类型

  • start:启动服务

  • stop:停止服务

  • restart:重新启动服务

  • reload:重新加载服务配置

  • status:查看服务状态

5.2示例

bash 复制代码
# 启动服务
systemctl start <服务名称>
​
# 停止服务
systemctl stop <服务名称>
​
# 重新启动服务
systemctl restart <服务名称>
​
# 重新加载服务配置
systemctl reload <服务名称>
​
# 查看服务状态
systemctl status <服务名称>

5.3示例使用

假设服务名称为 httpd(Apache Web Server):

bash 复制代码
# 启动 httpd 服务
systemctl start httpd
​
# 停止 httpd 服务
systemctl stop httpd
​
# 重新启动 httpd 服务
systemctl restart httpd
​
# 重新加载 httpd 服务配置
systemctl reload httpd
​
# 查看 httpd 服务状态
systemctl status httpd

六、Linux 系统的运行级别

6.1.显示运行级别

显示当前和之前的运行级别:

bash 复制代码
# 显示结果中的两个字符分别表示切换前的目标和当前的目标。
# 若之前尚未切换过运行级别,则第 1 列将显示"N"
[root@localhost ~]# runlevel 
3 5

6.2查看系统默认的运行级别

bash 复制代码
# 查看当前模式
systemctl get-default

6.3设置永久运行级别

bash 复制代码
# 方法一
ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
​
# 方法二
systemctl set-default multi-user.target

6.4切换为字符模式

bash 复制代码
# 切换为字符模式
systemctl isolate multi-user.target  # 或 init 3
​
# 检查当前运行级别
[root@localhost ~]# runlevel 
5 3
​
# 切换回图形模式
systemctl isolate graphical.target  # 或 init 5

6.5扩展

6.5.1永久修改主机名

bash 复制代码
# 设置新主机名
hostnamectl set-hostname newname
​
# 查看主机名的状态
hostnamectl status

6.5.2设置系统语言为中文

bash 复制代码
# 设置系统语言为中文
localectl set-locale LANG=zh_CN.utf8
​
# 查看当前系统使用的语言
localectl status

6.6总结

bash 复制代码
# 显示当前和之前的运行级别
runlevel
​
# 查看系统默认的运行级别
systemctl get-default
​
# 设置永久运行级别
ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
systemctl set-default multi-user.target
​
# 切换为字符模式
systemctl isolate multi-user.target
init 3
​
# 切换回图形模式
systemctl isolate graphical.target
init 5
​
# 永久修改主机名
hostnamectl set-hostname newname
​
# 查看主机名的状态
hostnamectl status
​
# 设置系统语言为中文
localectl set-locale LANG=zh_CN.utf8
​
# 查看当前系统使用的语言
localectl status

七、优化启动过程

使用 systemctl 工具可以查询或设置系统服务的默认启动状态,这与 ntsysv 的功能类似,但 systemctl 不提供交互式的操作界面。使用 systemctl 工具控制服务开机启停的命令格式如下:

7.1常用控制选项

  • enable:设置服务为开机自动启动。

  • disable:设置服务为开机自动关闭。

  • is-enabled:查看服务的开机启动状态。

7.2示例

7.2.1配置 Apache 服务开机自动启动或关闭,并查看开机启动状态

  1. 设置 Apache 服务为开机自动启动

    bash 复制代码
    [root@localhost ~]# systemctl enable httpd.service
    Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
  2. 查看 Apache 服务的开机启动状态

    bash 复制代码
    [root@localhost ~]# systemctl is-enabled httpd.service
    enabled
  3. 设置 Apache 服务为开机自动关闭

    bash 复制代码
    [root@localhost ~]# systemctl disable httpd.service
    Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
  4. 再次查看 Apache 服务的开机启动状态

    bash 复制代码
    [root@localhost ~]# systemctl is-enabled httpd.service
    disabled

7.2.2查看当前系统中所有已激活的系统服务

bash 复制代码
[root@localhost ~]# systemctl list-units --type=service

输出示例:

bash 复制代码
UNIT                         LOAD   ACTIVE SUB     DESCRIPTION
abrt-ccpp.service            loaded active exited  Install ABRT coredump hook
abrt-oops.service            loaded active running ABRT kernel log watcher
abrt-xorg.service            loaded active running ABRT Xorg log watcher
...

7.2.3查看所有开机自启动的服务

bash 复制代码
[root@localhost ~]# systemctl list-unit-files | grep enabled

输出示例:

bash 复制代码
abrt-ccpp.service                      enabled
abrt-oops.service                      enabled
abrt-xorg.service                      enabled
...

7.3总结

bash 复制代码
# 设置服务为开机自动启动
systemctl enable <服务名称>
​
# 设置服务为开机自动关闭
systemctl disable <服务名称>
​
# 查看服务的开机启动状态
systemctl is-enabled <服务名称>
​
# 查看当前系统中所有已激活的系统服务
systemctl list-units --type=service
​
# 查看所有开机自启动的服务
systemctl list-unit-files | grep enabled

7.4示例使用

假设服务名称为 httpd(Apache Web Server):

bash 复制代码
# 设置 httpd 服务为开机自动启动
systemctl enable httpd.service
​
# 查看 httpd 服务的开机启动状态
systemctl is-enabled httpd.service
​
# 设置 httpd 服务为开机自动关闭
systemctl disable httpd.service
​
# 查看所有已激活的系统服务
systemctl list-units --type=service
​
# 查看所有开机自启动的服务
systemctl list-unit-files | grep enabled
相关推荐
成富8 分钟前
文本转SQL(Text-to-SQL),场景介绍与 Spring AI 实现
数据库·人工智能·sql·spring·oracle
songqq279 分钟前
SQL题:使用hive查询各类型专利top 10申请人,以及对应的专利申请数
数据库·sql
计算机学长felix13 分钟前
基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·毕业设计·交友
vip45129 分钟前
Linux 经典面试八股文
linux
大霞上仙32 分钟前
Ubuntu系统电脑没有WiFi适配器
linux·运维·电脑
小码的头发丝、1 小时前
Django中ListView 和 DetailView类的区别
数据库·python·django
Karoku0661 小时前
【企业级分布式系统】Zabbix监控系统与部署安装
运维·服务器·数据库·redis·mysql·zabbix
为什么这亚子1 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
布值倒区什么name1 小时前
bug日常记录responded with a status of 413 (Request Entity Too Large)
运维·服务器·bug
孤客网络科技工作室2 小时前
VMware 虚拟机使用教程及 Kali Linux 安装指南
linux·虚拟机·kali linux