> 文章列表 > 【linux】——引导过程与服务控制

【linux】——引导过程与服务控制

【linux】——引导过程与服务控制

文章目录

  • 1.linux操作系统引导过程
    • 1.1 引导过程总览
    • 1.2 linux操作系统的引导过程
    • 1.3 系统初始化进程
    • 1.4 Systemd单元类型
    • 1.5 运行级别所对应的systemd目标
  • 2.排除启动类故障
    • 2.1 修复MBR扇区故障
    • 2.2 实例:修复MBR扇区故障
    • 2.2 修复GRUB引导故障
    • 2.3 实例:恢复GRUB引导程序

1.linux操作系统引导过程

1.1 引导过程总览

【linux】——引导过程与服务控制

1.2 linux操作系统的引导过程

1.开机自检

服务器主机开机以后,将根据主板BIOS中的设置对CPU、内存、显卡、键盘等设备进行初步检测,检测成功后根据预设的启动顺序移交系统控制权,大多时候会移交给本机硬盘

总结:检查硬件设备,检测出第一个能够引导系统的设备,比如硬盘或者光驱.

2.MBR引导

当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中MBR(主引导记录)的设置,将系统控制权传递给包含操作系统引导文件的分区;或者直接根据MBR记录中的引导信息调用启动菜单(如GRUB)。

总结:运行放在MBR扇区里的引导信息,启动GRUB引导程序.

3.启动GRUB菜单

对于Linux操作系统来说,GRUB(统一启动加载器)是使用最为广泛的多系统引导器程序。系统控制权传递给GRUB以后,将会显示启动菜单给用户选择,并根据所选项(或采用默认值)加载Linux内核文件,
然后将系统控制权转交给内核。

centos 7采用的是GRUB2 启动引导器。

总结: GRUB引导程序通过读取GRUB配置文件/boot/grub2/grub.cfg,来获取内核和镜像文件系统的设置和路径位置,并屏幕显示grub菜单.

4.加载Linux内核

Linux内核是一个预先编译好的特殊二进制文件,介于各种硬件资源与系统程序之间,负责资源分配与调度。内核接过系统控制权以后,将完全掌控整个linux操作系统的运行过程。

Centos 7系统中,默认的内核文件位于"/boot/vmlinuz-3.10.0-514.el7.x86_64"。

总结:把内核和境像文件系统加载到内存中,获得操作系统的控制权.

5.init进程初始化

为了完成进一步的系统引导过程,Linux内核首先将系统中的"/sbin/init"程序加载到内存中运行(运行中的程序称为进程),init进程负责完成整个系统的初始化,最后等待用户进行登录

总结:加载硬件驱动程序,内核把init进程加载到内存中运行.

1.3 系统初始化进程

init进程

● 由Linux内核加载运行/sbin/init程序

init进程是系统中第一个进程,是所有进程的父进程

● init进程的PID(进程标记)号永远为1

Systemd

Systemd是Linux操作系统的一种init软件

● CentOS7中采用全新的Systemd启动方式,取代传统的sysVinit

CentOS7中运行的第一个init进程是/lib/systemd/systemd

[root@clr ~]# pstree  -p  #Systemd进程作为所有进程的父进程,并且进程号是1
systemd(1)─┬─ModemManager(615)─┬─{ModemManager}(639)│                   └─{ModemManager}(645)├─NetworkManager(729)─┬─dhclient(3504)│                     ├─{NetworkManager}(733)[root@clr ~]# ll /sbin/init  #/sbin/init是个软链接,指向../lib/systemd/systemd文件
lrwxrwxrwx. 1 root root 22 323 00:42 /sbin/init -> ../lib/systemd/systemd

注意:(centOS6及以前的系统)传统init对于进程的管理是串行执行shell脚本启动服务,容易出现阻塞情况,导致效率低下,系统启动速度较慢;

(centOS及之后的系统)systemd能够将更多的服务进程并行启动,并且具有提供按需启动服务的能力,使得启动更少进程,从而提高系统启动速度。

1.4 Systemd单元类型

【linux】——引导过程与服务控制

[root@clr ~]# ls /lib/systemd/system  #查看位于/lib/systemd/system目录下的配置文件
abrt-ccpp.service                        plymouth-quit-wait.service
abrtd.service                            plymouth-read-write.service
abrt-oops.service                        plymouth-reboot.service
abrt-pstoreoops.service                  plymouth-start.service
abrt-vmcore.service                      plymouth-switch-root.service
abrt-xorg.service                        polkit.service
accounts-daemon.service                  postfix.service
alsa-restore.service                     poweroff.target
alsa-state.service                       poweroff.target.wants
anaconda-direct.service                  printer.target
anaconda-nm-config.service               proc-fs-nfsd.mount
anaconda-noshell.service                 proc-sys-fs-binfmt_misc.automount
anaconda-pre.service                     proc-sys-fs-binfmt_misc.mount
anaconda.service                         psacct.service
anaconda-shell@.service                  qemu-guest-agent.service
[root@clr ~]# cd /lib/systemd/system  #进入/lib/systemd/system文件
[root@clr /lib/systemd/system]# ls ./httpd*
ls: 无法访问./httpd*: 没有那个文件或目录
[root@clr /lib/systemd/system]# df
文件系统          1K-块    已用     可用 已用% 挂载点
devtmpfs        1997348       0  1997348    0% /dev
tmpfs           2013076       0  2013076    0% /dev/shm
tmpfs           2013076   12852  2000224    1% /run
tmpfs           2013076       0  2013076    0% /sys/fs/cgroup
/dev/sda1      38817264 5578092 33239172   15% /
tmpfs            402616      36   402580    1% /run/user/0
/dev/sr0        4600876 4600876        0  100% /run/media/root/CentOS 7 x86_64
[root@clr /lib/systemd/system]# yum install -y httpd #下载httpd安装包
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile* base: mirrors.ustc.edu.cn* extras: mirrors.ustc.edu.cn* updates: mirrors.ustc.edu.cn
正在解决依赖关系
--> 正在检查事务
---> 软件包 httpd.x86_64.0.2.4.6-98.el7.centos.7 将被 安装
--> 正在处理依赖关系 httpd-tools = 2.4.6-98.el7.centos.7,它被软件包 httpd-2.4.6-98.el7.centos.7.x86_64 需要
--> 正在处理依赖关系 /etc/mime.types,它被软件包 httpd-2.4.6-98.el7.centos.7.x86_64 需要
--> 正在检查事务
---> 软件包 httpd-tools.x86_64.0.2.4.6-98.el7.centos.7 将被 安装
---> 软件包 mailcap.noarch.0.2.1.41-2.el7 将被 安装
--> 解决依赖关系完成依赖关系解决===============================================================================================================Package                  架构                版本                                  源                    大小
===============================================================================================================
正在安装:httpd                    x86_64              2.4.6-98.el7.centos.7                 updates              2.7 M
为依赖而安装:httpd-tools              x86_64              2.4.6-98.el7.centos.7                 updates               94 kmailcap                  noarch              2.1.41-2.el7                          base                  31 k事务概要
===============================================================================================================
安装  1 软件包 (+2 依赖软件包)总下载量:2.8 M
安装大小:9.6 M
Downloading packages:
(1/3): mailcap-2.1.41-2.el7.noarch.rpm                                                  |  31 kB  00:00:00     
(2/3): httpd-tools-2.4.6-98.el7.centos.7.x86_64.rpm                                     |  94 kB  00:00:00     
(3/3): httpd-2.4.6-98.el7.centos.7.x86_64.rpm                                           | 2.7 MB  00:00:02     
---------------------------------------------------------------------------------------------------------------
总计                                                                           1.0 MB/s | 2.8 MB  00:00:02     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction正在安装    : mailcap-2.1.41-2.el7.noarch                                                                1/3 正在安装    : httpd-tools-2.4.6-98.el7.centos.7.x86_64                                                   2/3 正在安装    : httpd-2.4.6-98.el7.centos.7.x86_64                                                         3/3 验证中      : httpd-tools-2.4.6-98.el7.centos.7.x86_64                                                   1/3 验证中      : mailcap-2.1.41-2.el7.noarch                                                                2/3 验证中      : httpd-2.4.6-98.el7.centos.7.x86_64                                                         3/3 已安装:httpd.x86_64 0:2.4.6-98.el7.centos.7                                                                         作为依赖被安装:httpd-tools.x86_64 0:2.4.6-98.el7.centos.7                   mailcap.noarch 0:2.1.41-2.el7                  完毕!
[root@clr /lib/systemd/system]# ls ./httpd*  #查看有关httpd服务的配置文件
./httpd.service

1.5 运行级别所对应的systemd目标

【linux】——引导过程与服务控制

[root@clr ~]# systemctl isolate reboot.target  #实现系统重启操作,效果等同于init6
Connection closing...Socket close.Connection closed by foreign host.Disconnected from remote host(CentOS 7-2) at 16:51:22.Type `help' to learn how to use Xshell prompt.

2.排除启动类故障

2.1 修复MBR扇区故障

故障原因

● 病毒、木马等造成的破坏

● 不正确的分区操作、磁盘读写误操作

故障现象

找不到引导程序,启动中断

● 无法加载操作系统,开机后黑屏

解决思路

应提前作好备份文件

● 以安装光盘引导进入急救模式

● 从备份文件中恢复

2.2 实例:修复MBR扇区故障

(1)新建一块硬盘sdb,并将该硬盘格式化,挂载到/backup目录中;

[root@clr ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   60G  0 disk 
├─sda1   8:1    0   37G  0 part /
├─sda2   8:2    0    1K  0 part 
└─sda5   8:5    0  3.9G  0 part [SWAP]
sdb      8:16   0   20G  0 disk 
sr0     11:0    1  4.4G  0 rom  /run/media/root/CentOS 7 x86_64
[root@clr ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。Device does not contain a recognized partition table
使用磁盘标识符 0x4e6c79b4 创建新的 DOS 磁盘标签。命令(输入 m 获取帮助):n
Partition type:p   primary (0 primary, 0 extended, 4 free)e   extended
Select (default p): 
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):+5G
Last 扇区, +扇区 or +size{K,M,G} (10485760-41943039,默认为 41943039):
将使用默认值 41943039
分区 1 已设置为 Linux 类型,大小设为 15 GiB命令(输入 m 获取帮助):q[root@clr ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。Device does not contain a recognized partition table
使用磁盘标识符 0x8973f29a 创建新的 DOS 磁盘标签。命令(输入 m 获取帮助):n
Partition type:p   primary (0 primary, 0 extended, 4 free)e   extended
Select (default p): 
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+5G
分区 1 已设置为 Linux 类型,大小设为 5 GiB命令(输入 m 获取帮助):w
The partition table has been altered!Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@clr ~]# mkfs -t xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=327680 blks=                       sectsz=512   attr=2, projid32bit=1=                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1310720, 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@clr ~]# mkdir /backup
[root@clr ~]# mount /dev/sdb1 /backup
[root@clr ~]# df -hT
文件系统       类型      容量  已用  可用 已用% 挂载点
devtmpfs       devtmpfs  2.0G     0  2.0G    0% /dev
tmpfs          tmpfs     2.0G     0  2.0G    0% /dev/shm
tmpfs          tmpfs     2.0G   13M  2.0G    1% /run
tmpfs          tmpfs     2.0G     0  2.0G    0% /sys/fs/cgroup
/dev/sda1      xfs        38G  5.4G   32G   15% /
tmpfs          tmpfs     394M   28K  394M    1% /run/user/0
/dev/sr0       iso9660   4.4G  4.4G     0  100% /run/media/root/CentOS 7 x86_64
/dev/sdb1      xfs       5.0G   33M  5.0G    1% /backup

(2)备份MBR扇区数据到其他磁盘(/dev/sdb1);

[root@clr ~]# dd if=/dev/sda of=/backup/mar.bak bs=512 count=1  #将MBR扇区文件中数据,备份到/backup/mar.bak目录中
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,0.000860577 秒,595 kB/秒
[root@clr ~]# ls /backup -l
总用量 4
-rw-r--r--. 1 root root 512 410 17:11 mar.bak  #从MBR扇区中备份出来的512字节大小的数据文件

(3)模拟破坏MBR引导扇区;

[root@clr ~]# dd if=/dev/zero of=/dev/sda bs=512 count=1  #将零设备文件复制到MBR扇区文件中
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,0.000443372 秒,1.2 MB/秒

(4)重新启动虚拟机;

【linux】——引导过程与服务控制

【linux】——引导过程与服务控制
【linux】——引导过程与服务控制
(5)引导界面进入急救模式,从备份文件中恢复MBR扇区数据;
【linux】——引导过程与服务控制

2.2 修复GRUB引导故障

故障原因

MBR中的GRUB引导程序遭到破坏

grub.cfg文件丢失、引导配置有误

故障现象

系统引导停滞,显示==“grub>”提示符==

解决思路

尝试手动输入引导命令

进入急救模式,重写或者从备份中恢复grub.conf

向MBR扇区中重建grub程序

[root@clr ~]# cd /boot  #进入/boot目录,查看GRUB配置文件
[root@clr /boot]# ls
config-3.10.0-1160.el7.x86_64                            initramfs-3.10.0-1160.el7.x86_64.img
efi                                                      symvers-3.10.0-1160.el7.x86_64.gz
grub                                                     System.map-3.10.0-1160.el7.x86_64
grub2                                                    vmlinuz-0-rescue-675c23e85f174b7ca25013149d0b69ad
initramfs-0-rescue-675c23e85f174b7ca25013149d0b69ad.img  vmlinuz-3.10.0-1160.el7.x86_64
[root@clr /boot]# cd grub2/
[root@clr /boot/grub2]# ls
device.map  fonts  grub.cfg  grubenv  i386-pc  locale
[root@clr /boot/grub2]# ll /etc/grub2.cfg  #/etc/grub2.cfg是一个软链接,指向原文件../boot/grub2/grub.cfg
lrwxrwxrwx. 1 root root 22 323 00:42 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
[root@clr /boot/grub2]# vim grub.cfg #进入grub.cfg 配置文件,查看内核和镜像文件的相关信息

【linux】——引导过程与服务控制

2.3 实例:恢复GRUB引导程序

方法一:急救模式中,手动输入引导命令(笨拙繁琐,不建议使用)

grub> insmod xfs					#加载指定的模块到内核
grub> linux16 /vmlinuz-3.10.0-693.el7.x86_64 root=UUID=8fd74986-ae66-4ffd-b7d8-a19f2eca7b6f ro rhgb quiet LANG=zh_CN.UTF-8										#内核的名字及位置等信息
grub> initrd16 /initramfs-3.10.0-693.el7.x86_64.img			#镜像系统文件
grub> boot							#引导boot

方法二:进入急救模式,恢复GRUB引导程序;

(1)备份GRUB配置文件到/bak/grub.bak文件中;

[root@clr ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   60G  0 disk 
├─sda1   8:1    0   37G  0 part /
├─sda2   8:2    0    1K  0 part 
└─sda5   8:5    0  3.9G  0 part [SWAP]
sdb      8:16   0   20G  0 disk 
├─sdb1   8:17   0    5G  0 part 
└─sdb2   8:18   0    5G  0 part 
sr0     11:0    1  4.4G  0 rom  /run/media/root/CentOS 7 x86_64
[root@clr ~]# mkfs -t xfs /dev/sdb2  #将分区/dev/sdb2格式化为xfs类型
meta-data=/dev/sdb2              isize=512    agcount=4, agsize=327680 blks=                       sectsz=512   attr=2, projid32bit=1=                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1310720, 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@clr ~]# mkdir /bak
[root@clr ~]# mount /dev/sdb2 /bak
[root@clr ~]# dd if=/dev/sda of=/bak/grub.bak bs=446 count=1  #将/dev/sda中的GRUB配置文件复制到/bak/grub.bak文件中
记录了1+0 的读入
记录了1+0 的写出
446字节(446 B)已复制,0.000513284 秒,869 kB/秒
[root@clr ~]# dd if=/dev/zero of=/bak/sda bs=446 count=1  #将/dev/sda中的GRUB配置文件清空
记录了1+0 的读入
记录了1+0 的写出
446字节(446 B)已复制,0.000486882 秒,916 kB/秒
[root@clr ~]# init 6 #重启系统

(2)引导界面进入急救模式,从备份文件中恢复GRUB引导数据;

【linux】——引导过程与服务控制

方法三:引导界面进入急救模式,重建GRUB菜单配置文件;

(1)手动删除/boot/grub2/grub2.cfg文件;

[root@clr ~]# cd /boot/grub2
[root@clr /boot/grub2]# ls
device.map  fonts  grub.cfg  grubenv  i386-pc  locale
[root@clr /boot/grub2]# rm -rf grub.cfg   #手动删除/boot/grub2/grub2.cfg文件
[root@clr /boot/grub2]# ls
device.map  fonts  grubenv  i386-pc  locale
[root@clr ~]# init 6 #重启系统

(2)进入急救模式,加载光盘镜像,切换到系统根环境;

【linux】——引导过程与服务控制

重新启动虚拟机,在系统刷新读取设备文件时,眼疾手快(按esc),进入CD-ROM Drive,通过光盘方式进行启动;

或者:关闭虚拟机,选择打开电源时进入固件,将CD-ROM Drive光盘启动方式放在启动顺序的第一位。
【linux】——引导过程与服务控制

【linux】——引导过程与服务控制