【linux】——引导过程与服务控制
文章目录
1.linux操作系统引导过程
1.1 引导过程总览
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 3月 23 00:42 /sbin/init -> ../lib/systemd/systemd
注意:
(centOS6及以前的系统)传统init对于进程的管理是串行执行shell脚本启动服务,容易出现阻塞情况,导致效率低下,系统启动速度较慢;
(centOS及之后的系统)systemd能够将更多的服务进程并行启动,并且具有提供按需启动服务的能力,使得启动更少进程,从而提高系统启动速度。
1.4 Systemd单元类型
[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目标
[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 4月 10 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)重新启动虚拟机;
(5)引导界面进入急救模式,从备份文件中恢复MBR扇区数据;
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 3月 23 00:42 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
[root@clr /boot/grub2]# vim grub.cfg #进入grub.cfg 配置文件,查看内核和镜像文件的相关信息
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引导数据;
方法三:引导界面进入急救模式,重建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)进入急救模式,加载光盘镜像,切换到系统根环境;
重新启动虚拟机,在系统刷新读取设备文件时,眼疾手快(按esc),进入CD-ROM Drive,通过光盘方式进行启动;
或者:
关闭虚拟机,选择打开电源时进入固件,将CD-ROM Drive光盘启动方式放在启动顺序的第一位。