目录
[一、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用户空间阶段
在 init
或 systemd
完成系统服务和设备初始化后,系统进入用户空间,准备接受用户登录。
-
启动登录服务 :启动
getty
或显示管理器(例如gdm
、lightdm
),提供用户登录界面。 -
用户登录:用户通过终端或图形界面登录系统。
-
用户环境初始化 :加载用户配置文件(例如
.bashrc
、.profile
)并启动用户会话。
1.7总结
Linux 系统的引导过程包括以下主要步骤:
-
BIOS/UEFI:执行硬件初始化和引导程序加载。
-
MBR/GPT:从磁盘引导分区加载引导加载程序。
-
引导加载程序(GRUB):加载内核和初始内存盘。
-
内核:初始化硬件和挂载根文件系统。
-
init/Systemd:启动系统服务并设置系统运行级别。
-
用户空间:提供用户登录界面并初始化用户会话。
每个步骤都扮演着关键角色,确保系统能够顺利启动并进入可用状态。
二、系统初始化进程 (centos 6和7 的区别)
CentOS 6 和 CentOS 7 在系统初始化进程方面有显著的差异,主要体现在使用的初始化系统和服务管理器上。CentOS 6 使用传统的 SysVinit,而 CentOS 7 则采用了现代化的 systemd。以下是两者在系统初始化过程中的详细对比和解释。
2.1CentOS 6 初始化进程(SysVinit)
- 启动引导加载程序
-
GRUB(GRand Unified Bootloader):
- 在 CentOS 6 中,GRUB 引导加载程序加载内核和 initrd(初始 RAM 磁盘)。
- 内核初始化
-
内核:内核加载完成后,开始硬件初始化并挂载根文件系统。
-
initrd/initramfs:内核加载初始 RAM 磁盘,提供加载必要模块和驱动程序的环境。
- init 进程
-
/sbin/init :内核初始化完成后,启动第一个用户空间进程
init
(PID 1)。init
是 SysVinit 的核心组件。
- 运行级别和启动脚本
-
/etc/inittab :
init
读取/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
:用户自定义脚本,用户可以在此文件中添加自定义启动命令。
-
- 启动服务
-
服务脚本 :在每个运行级别目录(如
/etc/rc.d/rc3.d
)下,存放了按顺序启动或停止的服务脚本(以S
或K
开头)。-
S
表示启动服务,K
表示停止服务。 -
每个脚本按数字顺序执行,如
S10network
、S20sshd
等。
-
- 登录提示
- getty :
init
启动getty
进程,提供终端登录提示符,等待用户登录。
2.2CentOS 7 初始化进程(systemd)
- 启动引导加载程序
-
GRUB2:
- 在 CentOS 7 中,GRUB2 引导加载程序加载内核和 initramfs。
- 内核初始化
-
内核:内核加载完成后,开始硬件初始化并挂载根文件系统。
-
initramfs:内核加载初始 RAM 文件系统,提供加载必要模块和驱动程序的环境。
- systemd 进程
-
/usr/lib/systemd/systemd :内核初始化完成后,启动第一个用户空间进程
systemd
(PID 1)。systemd
是 CentOS 7 的系统和服务管理器,替代了传统的 SysVinit。
- systemd 单元和目标
-
单元(Units) :
systemd
使用单元来表示系统资源和服务。单元类型包括服务(*.service
)、挂载点(*.mount
)、套接字(*.socket
)等。 -
目标(Targets) :
systemd
使用目标来替代传统的运行级别。常见的目标包括:-
poweroff.target
:关机 -
rescue.target
:单用户模式 -
multi-user.target
:多用户模式(无图形界面) -
graphical.target
:多用户模式(有图形界面) -
reboot.target
:重启
-
- 配置文件和目录
-
配置文件 :
systemd
的配置文件位于/usr/lib/systemd/system
和/etc/systemd/system
目录。-
/usr/lib/systemd/system
:存放系统单元文件。 -
/etc/systemd/system
:存放用户自定义和覆盖的单元文件。
-
-
默认目标 :系统的默认目标文件是
/etc/systemd/system/default.target
,通常是一个符号链接,指向实际的目标文件(如multi-user.target
或graphical.target
)。
- 启动和管理服务
-
systemctl :
systemd
使用systemctl
命令管理和控制系统服务和目标。-
启动服务:
systemctl start <service>
-
停止服务:
systemctl stop <service>
-
启用服务(开机自动启动):
systemctl enable <service>
-
禁用服务:
systemctl disable <service>
-
查看服务状态:
systemctl status <service>
-
列出所有服务:
systemctl list-units --type=service
-
- 登录提示
- getty 和 login :
systemd
启动getty
服务,提供终端登录提示符,并启动login
服务等待用户登录。
2.3主要区别总结
-
初始化系统:
-
CentOS 6 使用 SysVinit,依赖于
/sbin/init
和/etc/inittab
文件。 -
CentOS 7 使用 systemd,依赖于
/usr/lib/systemd/systemd
和单元文件。
-
-
服务管理:
-
CentOS 6 使用基于脚本的服务管理,脚本存放在
/etc/rc.d/init.d
和相应的运行级别目录中。 -
CentOS 7 使用基于单元的服务管理,单元文件存放在
/usr/lib/systemd/system
和/etc/systemd/system
目录中。
-
-
运行级别和目标:
-
CentOS 6 使用运行级别(0-6),配置在
/etc/inittab
文件中。 -
CentOS 7 使用目标(targets),配置在
/etc/systemd/system/default.target
中,目标文件名通常类似于multi-user.target
和graphical.target
。
-
-
服务管理工具:
-
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
。bashsystemctl isolate poweroff.target
运行级别 1:单用户模式
-
CentOS 6:运行级别 1 表示单用户模式,通常用于系统维护。
-
CentOS 7 :对应的
systemd
目标是rescue.target
。bashsystemctl isolate rescue.target
运行级别 2:多用户模式,无网络(未使用)
-
CentOS 6:运行级别 2 表示多用户模式,但不启动网络服务,通常不使用。
-
CentOS 7 :与运行级别 3 和 4 一样,使用
multi-user.target
。bashsystemctl isolate multi-user.target
运行级别 3:多用户模式,有网络
-
CentOS 6:运行级别 3 表示多用户模式,启动网络服务。
-
CentOS 7 :对应的
systemd
目标是multi-user.target
。bashsystemctl isolate multi-user.target
运行级别 4:未使用
-
CentOS 6:运行级别 4 通常未使用,可自定义。
-
CentOS 7 :与运行级别 3 和 2 一样,使用
multi-user.target
。bashsystemctl isolate multi-user.target
运行级别 5:图形界面
-
CentOS 6:运行级别 5 表示图形用户界面模式。
-
CentOS 7 :对应的
systemd
目标是graphical.target
。bashsystemctl isolate graphical.target
运行级别 6:重启
-
CentOS 6:运行级别 6 表示系统重启。
-
CentOS 7 :对应的
systemd
目标是reboot.target
。bashsystemctl 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 服务开机自动启动或关闭,并查看开机启动状态
-
设置 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.
-
查看 Apache 服务的开机启动状态:
bash[root@localhost ~]# systemctl is-enabled httpd.service enabled
-
设置 Apache 服务为开机自动关闭:
bash[root@localhost ~]# systemctl disable httpd.service Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
-
再次查看 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