Bootstrap

linux 系统引导过程

目录

一、linux 系统引导过程
        1.1BIOS/UEFI 阶段
        1.2 MBR/GPT 阶段
        1.3引导加载程序阶段
        1.4内核阶段
        1.5init/Systemd 阶段
        1.6用户空间阶段
        1.7总结
二、系统初始化进程 (centos 6和7 的区别)
        2.1CentOS 6 初始化进程(SysVinit)
        2.2CentOS 7 初始化进程(systemd)
        2.3主要区别总结
三、运行级别所对应的Systemd目标
        3.1CentOS 6 运行级别和 CentOS 7 Systemd 目标对比
        3.2详细解释
        3.3设置默认目标
四、修复 MBR 扇区故障
        4.1设置和修复 MBR 扇区故障
        4.2设置和修复 GRUB 故障
        4.3设置和修复忘记 root 密码
五、系统服务控制
        5.1控制类型
        5.2示例
        5.3示例使用
六、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 磁盘)。

2. 内核初始化

  • 内核:内核加载完成后,开始硬件初始化并挂载根文件系统。

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

3. init 进程

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

    • init 是 SysVinit 的核心组件。

4. 运行级别和启动脚本

  • /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:用户自定义脚本,用户可以在此文件中添加自定义启动命令。

5. 启动服务

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

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

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

6. 登录提示

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

2.2CentOS 7 初始化进程(systemd)

1. 启动引导加载程序

  • GRUB2

    • 在 CentOS 7 中,GRUB2 引导加载程序加载内核和 initramfs。

2. 内核初始化

  • 内核:内核加载完成后,开始硬件初始化并挂载根文件系统。

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

3. systemd 进程

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

    • systemd 是 CentOS 7 的系统和服务管理器,替代了传统的 SysVinit。

4. systemd 单元和目标

  • 单元(Units)systemd 使用单元来表示系统资源和服务。单元类型包括服务(*.service)、挂载点(*.mount)、套接字(*.socket)等。

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

    • poweroff.target:关机

    • rescue.target:单用户模式

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

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

    • reboot.target:重启

5. 配置文件和目录

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

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

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

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

6. 启动和管理服务

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

    • 启动服务:systemctl start <service>

    • 停止服务:systemctl stop <service>

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

    • 禁用服务:systemctl disable <service>

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

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

7. 登录提示

  • 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

    systemctl isolate poweroff.target

运行级别 1:单用户模式

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

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

    systemctl isolate rescue.target

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

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

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

    systemctl isolate multi-user.target

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

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

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

    systemctl isolate multi-user.target

运行级别 4:未使用

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

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

    systemctl isolate multi-user.target

运行级别 5:图形界面

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

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

    systemctl isolate graphical.target

运行级别 6:重启

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

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

    systemctl isolate reboot.target

3.3设置默认目标

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

查看当前默认目标

systemctl get-default

设置默认目标

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

systemctl set-default multi-user.target

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

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 是引导硬盘)。
# 进入救援模式后,使用以下命令修复 MBR
dd if=/usr/share/syslinux/mbr.bin of=/dev/sda

4.2设置和修复 GRUB 故障

4.2.1设置 GRUB 故障

# 模拟损坏 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
# 挂载文件系统
chroot /mnt/sysimage

3.重新安装 GRUB

  • 重新安装 GRUB 到引导设备(假设是 /dev/sda)。
# 重新安装 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
linux16 /vmlinuz-<kernel_version> root=/dev/mapper/centos-root ro crashkernel=auto rhgb quiet rd.break

2.重新挂载根文件系统

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

3.切换到新根环境

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

4.重置 root 密码

  • 使用 passwd 命令重置 root 密码。

passwd root

5.更新 SELinux 文件上下文

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

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

  • 退出 chroot 环境并重启系统。
exit
reboot

五、系统服务控制

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

5.1控制类型

  • start:启动服务

  • stop:停止服务

  • restart:重新启动服务

  • reload:重新加载服务配置

  • status:查看服务状态

5.2示例

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

5.3示例使用

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

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

六、Linux 系统的运行级别

6.1.显示运行级别

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

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

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

# 查看当前模式
systemctl get-default

6.3设置永久运行级别

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

6.4切换为字符模式

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

6.5扩展

6.5.1永久修改主机名

# 设置新主机名
hostnamectl set-hostname newname
​
# 查看主机名的状态
hostnamectl status

6.5.2设置系统语言为中文

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

6.6总结

# 显示当前和之前的运行级别
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 服务为开机自动启动

    [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 服务的开机启动状态

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

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

    [root@localhost ~]# systemctl is-enabled httpd.service
    disabled

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

[root@localhost ~]# systemctl list-units --type=service

输出示例:

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查看所有开机自启动的服务

[root@localhost ~]# systemctl list-unit-files | grep enabled

输出示例:

abrt-ccpp.service                      enabled
abrt-oops.service                      enabled
abrt-xorg.service                      enabled
...

7.3总结

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

7.4示例使用

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

# 设置 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

     

;