Linux 操作系统的引导过程
系统引导是操作系统运行的开始,在用户能够正常登录到系统前,Linux操作系统的 引导过程将完成一系列的初始化任务,并加载必要的程序和命令终端,为用户登录做好准备。
引导过程总览
Linux 操作系统的引导过程一般包括以下几个阶段:开机自检、MBR引导、GRUB菜单、加载Linux内核、init进程初始化。
引导过程阶段介绍 | |
开机自检 | 服务器主机开机以后,将根据主板 BIOS 中的设置对 CPU、内存、显卡、键盘等设备进行初步检测,检测成功后根据预设的启动顺序移交系统控制权,大多时候会移交给本机硬盘。 |
MBR引导 | 当从本机硬盘中启动系统时,首先根据硬盘第一个扇区(零磁道的零扇区)中MBR(Master Boot Record, 主引导记录)的设置,将系统控制权传递给包含操作系统引导文件的分区;或者直接根据MBR 记录中的引导信息调用启动菜单(如GRUB )。 主要部分包括:BootLoader(主引导程序,占446字节)、DPT(磁盘分区表,占64字节)、结束标识(55aa,占2字节) |
GRUB菜单 | 对于Linux操作系统来说,GRUB(GRand Unified Bootloader, 统一启动加载器)是使用最为广泛的多系统引导器程序。系统控制权传递给GRUB以后,将会显示启动菜单给用户选择,并根据所选项(或采用默认值)加载Linux 内核文件,然后将系统控制权转交给内核。 |
加载Linux内核 | Linux 内核是一个预先编译好的特殊二进制文件,介于各种硬件资源与系统程序之间,负责资源分配与调度。内核接过系统控制权以后,将完全掌控整个Linux 操作系统的运行过程。 |
init进程初始化 | 为了完成进一步的系统引导过程,Linux 内核首先将系统中的“/sbin/init”程序加载到内存中运行(运行中的程序称为进程),init 进程(父进程)负责完成一系列的系统初始化过程,最后等待用户进行登录。 现在系统为systemd(守护进程) |
系统初始化进程
init进程 | 由Linux内核加载运行/sbin/init程序 init进程是系统中第一个进程 init进程的PID(进程标记)号永远为一 |
Systemd | Systemd是Linux操作系统的一种init软软件 CentOS7中采用全新的Systemd启动方式,取代传统的SysVint CentOS7中运行的第一个init进程是/lib/systemd/systemd |
systemd 守护进程负责Linux的系统和服务,systemctl用于控制Systemd管理的系统和服务状态。Systemd将其管理的资源组织成各种类型的单元(Unit)。
Systemd的单元类型 | ||
单元类型 | 扩展名 | 说明 |
Service | .service | 描述一个系统服务 |
Socket | .socket | 描述一个进程间通信的套接字 |
Device | .device | 描述一个内核识别的设备文件 |
Mount | .mount | 描述一个文件系统的挂载点 |
Automount | automount | 描述一个文件系统的自动挂载点 |
Swap | .swap | 描述一个内存交换设备或交换文件 |
Path | .Path | 描述一个文件系统中文件或目录 |
Timer | .timer | 描述一个定时器(用于实现类似cron的调度任务) |
Snapsho | snapshot | 用于保存一个systemd的状态 |
Scope | scope | 使用systemd的总线接口以编程的方式创建外部进程 |
Slice | .slice | 描述居于Cgroup的一组通过层次组织的管理系统进程 |
Target | .target | 描述一组systemd的单元 |
早期Linux操作系统中的 SysVinit 机制,默认包括七种不同的服务搭配方式,其中每一种搭配方式称为运行级别,类似于Windows系统中的正常启动、安 全模式、不带网络连接 的安全模式等。这些运行级别分别使用数字0,1,…,6来表示。为了向下兼容SysVinit 系统,Systemd 使用了相应的target (目标)模拟了SysVinit 的运行级别。
运行级别 | Systemd的targe | 说明 |
0 poweroff.target 关机状态,使用该级别时将会关闭主机 halt中断系统
1 rescue.target 单用户模式,不需要密码验证即可登录系统,多用于系统维护
2 multi-user.target 用户定义/域特定运行级别。默认等同于3
3 multi-user.target 字符界面的完整多用户模式,大多数服务器主机运行在此级别
4 multi-user.target 用户定义/域特定运行级别。默认等同于3
5 graphical.targe 图形界面的多用户模式,提供了图形桌面操作环境
6 reboot.target 重新启动,使用该级别时将会重启主机
切换运行级别或Systemd的target的方式:
init 0~6 systemctl get-default
修复MBR扇区故障
故障原因
病毒、木马等造成的破坏
不正确的分区操作、磁盘读写误操作
故障现象
找不到引导程序,启动中断
无法加载操作系统,开机后黑屏
解决思路
应提前做好备份文件
将磁盘中的MBR引导文件备份到别的独立磁盘中
[root@localhost~]# mkdir /backup
[root@localhost~]# mount /dev/sdb1 /backup
[root@localhost~]#dd if=/dev/sda of=/backup/sda.mbr.bak bs=512 count=1
//将sda的mbr引导文件被分到/bak/sda.mbr.bak中 bs是读取的文件大小默认Byte ,count是读取的文件块数
以安装光盘引导进入急救模式
在出现安装向导界面时,选择“Troubleshooting”选项进去,再选择“Rescue a CentOS Linux system”选项,进入救援模式,然后系统会自动查找
硬盘中的Linux 分区并尝试将其挂载到/mnt/sysimage 目录(选择“1”确认并按 Enter 键继续)。
以备份文件中恢复
sh-4.2#mkdir /aaa sh-4.2#mount /dev/sdb1 /aaa //挂载带有备份文件的分区
sh-4.2#dd if=/tmpdir/sda.mbr.bak of=/dev/sda//恢复备份数据
GRUB引导故障
首先备份/boot/grub2/中的grub.cfg文件
cd /boot/grub2 cp grub.cfg grub.cfg.bak
GRUB是大多数Linux 操作系统默认使用的引导程序,可以通过启动菜单的方式选择进入不同的操作系统(如果有)。当配置文件/boot/grub2/grub.cfg 丢失,或者关键配置出现错误,或者MBR中的引导程序遭到破坏时,Linux主机启动后可能只出现“grub>”的提示符,无法完成进一步的系统启动过程。
若在该提示符后可以进行编辑,则通过输入对应的引导命令(可参考其他相同版本 CentOS 中/boot/grub2/grub.cfg 文件的引导语句),然后执行“boot”命令即可正常引导 Linux操作系统,具体操作如下:
grub>insmod xfs
grub>llinux16
/vmlinuz-3.10.0-514.el7.x86_64 root=/dev/mapper/cl-root
crashkernel=auto rd.lvm.Iv=clroot rd.Ivm.Iv=cl/swap rhgb quiet LANG=en_US.UTF-8
grub>initrd16 /initramfs-3.10.0-514.el7.x86_64.img
grub>boot
正常进入系统后,去修复你的/boot/grub2/中的grub.cfg文件
或者可以使用Ctrl+Alt+Insert重启系统,在进度条页面按下Esc键后选择进入光盘引导界面,然后进入救援模式,切换硬盘为你的根目录
chroot /mnt/sysimage //切换硬盘为你的根目录
然后进入/boot/grub2中找到我们的备份文件,将其恢复
cd /boot/grub2 cp grub.cfg.bak grub.cfg
恢复完成后,输入exit退出救援模式,即可正常进入系统
遗忘root用户密码
使用Ctrl+Alt+Insert重启系统,在进度条页面按下Esc键后选择进入光盘引导界面,然后进入救援模式,切换硬盘为你的根目录
chroot /mnt/sysimage //切换硬盘为你的根目录
然后修改你的root用户密码
passwd root //修改root用户密码
服务控制及优化启动过程
系统服务控制
在 CentOS 系统中,各种系统服务的控制脚本默认放在/usr/lib/systemd 目录下。通过systemctl 命令工具可以实现对指定系统服务的控制,语法格式如下:
systemctl 控制类型 服务名称
对于大多数系统服务来说,常见的几种控制类型如下所述。
> start (启动):运行指定的系统服务程序,实现服务功能。
> stop (停止):终止指定的系统服务程序,关闭相应的功能。
> restart (重启):先退出,再重新运行指定的系统服务程序。
> reload (重载):不退出服务程序,只是刷新配置。在某些服务中与 restart 的操作相同。
> status (查看状态):查看指定的系统服务的运行状态及相关信息。
切换运行级别
不同的target 代表系统不同的运行状态,所启用的服务或程序也不一样。
1. 查看系统的 target
明确当前系统所在的 target 将有助于管理员排除一些应用故障。若未能确知当前所处 的目标,可以直接执行“runlevel ”命令进行查询,显示结果中的两个字符分别表示切换前的目标、当前的目标。若之前尚未切换过运行级别,则第1列将显示“N”
[root@localhost~]#runlevel
N 5
若用户想查看系统启动时默认运行的target, 可以执行“systemctl get-default”命令以显示系统默认的 target, 命令如下:
[root@localhost~]# systemctl get-default
2.切换系统的 target
当用户需要将系统转换为其他的target 时,可以通过传统的 init 程序进行,只要使用与 运行级别相对应的数字(0~6)作为命令参数即可,或者使用systemctl命令进行目标切换。
runlevel 3
systemctl isolate multi-user.target
优化开机自动加载的服务
Linux操作系统在每次开机后会进入默认的systemd 运行目标(如字符模式或图形模式), 并运行该目标中默认设为启动的各种系统服务。若要禁止某些系统服务自动运行,可以使用ntsysv 或者 systemctl 工具进行优化。
(1)使用 ntsysv 工具
ntsysv 工具可以在字符模式中运行,为用户提供一个仿图形的交互式操作界面,专门用于集中配置各种系统服务的启动状态。当需要同时设置多个服务的启动状态时,使用 ntsysv 工具会非常方便。
单独执行“ntsysv”命令时仅用于管理当前运行目标中的服务;通过“-level”选项可以对指 定运行目标(级别)中的服务进行管理。
( 2 ) 使 用 systemctl 工 具
systemctl 工具与 ntsysv 的功能类似,但是 systemctl 不提供交互式的操作界面,它用 于查询或设置系统服务的默认启动状态。当需要设置某一个服务在当前运行目标中的默认启 动状态时,使用systemctl工具会更有效率。使用systemctl工具控制服务开机启停的命令格式如下:
systemctl 控制选项 服务名称
常用的选项有三种:
> enable: 开机自动启动。
> disable: 开机自动关闭。
> is-enable: 查看开机启动状态。