Linux/Centos7系统管理之引导过程与服务控制
- Linux系统引导的过程
- 解决常见的启动类故障
- 控制Linux中的系统服务(核心)
- 优化Linux中的启动任务
一、引导过程总览(重要)——流程必要掌握
-
开机自检——BIOS(Basic Input/Output System),先加电,检查硬件(CPU、内存、显卡、键盘等设备)是否没有问题,没有问题加载驱动
-
MBR引导——微代码找启动盘
CPU首先读取位于CMOS中的BIOS程序,按照BIOS中设定的启动次序(Boot Sequence)逐一查找可启动设备,找到可启动的设备后,去该设备的第一个扇区中读取MBR(Master Boot Record,主引导记录)。
MBR存在于可启动磁盘的0磁道0扇区,占用512字节,它主要用来告诉计算机从选定的可启动设备的哪个分区来加载引导加载程序(Boot loader),MBR中存在如下内容:
(1) Boot Loader 占用446字节,存储有操作系统(OS)相关信息,如操作系统名称,操作系统内核位置等,它的主要功能是加载内核到内存中运行。
(2) Partition Table 分区表,占用64字节,每个主分区占用16字节(这就是为啥一块硬盘只能有4个主分区
(3)分区表有效性标记占用2字节,CPU将MBR读取至内存,运行GRUB(Boot Loader常用的有GRUB和LILO两种,现在常用的是GRUB),GRUB会把内核加载到内存去执行。
如上所示,我们可查看/boot/grub2/grub.cfg文件的第100行的内容,就能看到是在该配置文件中对内核文件进行操作了。
-
GRUB菜单——使用广泛的多系统引导器程序,系统控制权传递给GRUB以后,将会显示启动菜单提供给用户选择,根据选择或者默认项加载内核文件,然后将系统控制权转交给内核。
-
加载内核(kernel)——/boot目录下,Linux内核是预先编译好的特殊二进制文件,介于各种硬件资源和系统程序之间,负责资源分配与调度。
补充:下面的vmlinuz-3.10.0-693.el7.x86_64就是我们的内核文件了。在/boot目录下
[root@lokott ~]# ll /boot |grep "vmlinuz*" -rwxr-xr-x. 1 root root 5877760 10月 23 12:20 vmlinuz-0-rescue-f18b1b17cb2b477f8cb451fffad48550 -rwxr-xr-x. 1 root root 5877760 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
[root@lokott ~]# head -100 /boot/grub2/grub.cfg |tail -1 linux16 /vmlinuz-3.10.0-693.el7.x86_64 root=UUID=d0f8b702-0aa9-4857-9551-2e1283d2f5f9 ro crashkernel=auto rhgb quiet LANG=zh_CN.UTF-8
-
init进程初始化——原来的缓存全部清空,加载必要进程之后,加载外部的第三方进程(应用软件)(延时启动)
内核初始化作为PID1从initramfs执行/sbin/init。在Centos7中将其复制为systemd,systemd启动initrd.target中的 所有单元,并且挂载根文件系统/sysroot
1.1init进程
由Linux内核加载运行/sbin/init程序,是系统中的第一个进程,PID号永远为1
Systemd 单元类型
运行级别所对应的systemd目标
其中.service ——/lib/sysytemd/system
文件存储两个部分——元信息(状态的信息)和内容
===========================================================================================
1.2修复MBR扇区故障
1.故障原因
病毒、***等造成的破坏
不正确的分区操作、磁盘读写误操作
2.故障现象
找不到引导程序、启动中断
无法加载操作系统,开机后黑屏
3.解决思路
提前做好备份文件
以安装光盘引导进入急救模式
从部分文件中恢复
实验一——模拟修复MBR扇区故障实验
流程如下
-
备份MBR扇区数据——加一块硬盘做备份(一定需要先备份)
(1)分区,格式化,挂载
(2)备份mbr引导扇区到其它磁盘
备份=dd if=/dev/sda of=/abc/sda.mbr.bak bs=512 count=1 (/abc是另一块磁盘的挂载点)
-
模拟故障
dd if=/dev/sda of=/abc/sda.mbr.bak bs=512 count=1
重启:reboot——> 启用DHCP(找不到系统),从网上找有无可以加载的系统,但是是找不到的
修复之前需要光盘镜像需要连接使用
-
加载系统镜像文件中的急救模式
加载系统镜像文件中的内核界面
在读条时按下ESC键(手速快点)——选择CD-ROM Drive——选择Troubleshooting——选择Rescue a Centos system(补充:当然如果你的镜像文件一直是连接状态的话前面两个步骤是可以省略的)
4.把备份数据做恢复
具体实验步骤和结果如下:
第一步:
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 6G 0 part /boot
├─sda2 8:2 0 20G 0 part /
├─sda3 8:3 0 10G 0 part /home
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 4G 0 part [SWAP]
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 20G 0 part
sr0 11:0 1 4.2G 0 rom /run/media/root/CentOS 7 x86_64
[root@localhost ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=1310656 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5242624, 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@localhost ~]# mount /dev/sdb1 /mnt
[root@localhost ~]# df -hT | tail -1
/dev/sdb1 xfs 20G 33M 20G 1% /mnt
[root@localhost ~]# dd if=/dev/sda of=/mnt/sda.mbr.bak bs=512 count=1
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,0.000126274 秒,4.1 MB/秒
[root@localhost ~]# ls /mnt/
sda.mbr.bak
第二步:
[root@localhost ~]# dd if=/dev/zero of=/dev/sda bs=512 count=1//垃圾填充覆盖第一个扇区内容(模拟破坏)
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,0.000139415 秒,3.7 MB/秒
[root@localhost ~]# reboot //重启
第三步:
一直是连接着系统镜像文件的情况下啊,重启之后操作如下:
(1)选择Troubleshooting——回车
(2)选择Rescue a CentOS system——回车
(3)进入加载界面,稍等
(4)进入急救界面准备进行修复MBR,输入1,回车,弹出下面的对话后再次回车
(5)进行修复扇区的命令输入
===========================================================================================
1.3修复GRUB引导故障
1.故障原因
MBR中的GRUB弓|导程序遭到破坏
grub.conf文件丢失、引导配置有误
2.故障现象
系统引导停滞,显示"grub>” 提示符
3.解决思路
尝试手动输入引导命令
进入急救模式,重写或者从备份中恢复grub.conf
向MBR扇区中重建grub程序
实验二——模拟修复GRUB引导故障实验
流程如下:
-
使用系统急救模式进入命令字符界面
-
加载镜像中的系统进入bash环境
chroot /mnt/sysimage
-
重新构建GRUB菜单系统
grub2-install /dev/sda
grub2-mkconfig -o /boot/grub2/grub.cfg
exit
reboot
实验操作过程与结果如下:
[root@localhost ~]# ll /boot/
总用量 136460
-rw-r--r--. 1 root root 140894 8月 23 2017 config-3.10.0-693.el7.x86_64
drwxr-xr-x. 3 root root 17 11月 14 11:37 efi
drwxr-xr-x. 2 root root 27 11月 14 11:38 grub
drwx------. 5 root root 97 11月 14 11:42 grub2
-rw-------. 1 root root 69272056 11月 14 11:41 initramfs-0-rescue-a33ccb7775134b0e83e04555d56fedb7.img
-rw-------. 1 root root 28281283 11月 14 11:42 initramfs-3.10.0-693.el7.x86_64.img
-rw-------. 1 root root 16565979 11月 14 11:43 initramfs-3.10.0-693.el7.x86_64kdump.img
-rw-r--r--. 1 root root 10181954 11月 14 11:41 initrd-plymouth.img
-rw-r--r--. 1 root root 293027 8月 23 2017 symvers-3.10.0-693.el7.x86_64.gz
-rw-------. 1 root root 3228420 8月 23 2017 System.map-3.10.0-693.el7.x86_64
-rwxr-xr-x. 1 root root 5877760 11月 14 11:41 vmlinuz-0-rescue-a33ccb7775134b0e83e04555d56fedb7
-rwxr-xr-x. 1 root root 5877760 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
[root@localhost ~]# ll /boot/grub2
总用量 32
-rw-r--r--. 1 root root 84 11月 14 11:42 device.map
drwxr-xr-x. 2 root root 25 11月 14 11:42 fonts
-rw-r--r--. 1 root root 4235 11月 14 11:42 grub.cfg
-rw-r--r--. 1 root root 1024 11月 14 11:42 grubenv
drwxr-xr-x. 2 root root 8192 11月 14 11:42 i386-pc
drwxr-xr-x. 2 root root 4096 11月 14 11:42 locale
解释说明一下:如上所示其中/boot目录下的grub目录存放的是启动菜单的背景图片及样式,而grub2中存放的才是配置文件。
(1)先删除该配置文件来模拟整个过程
[root@localhost grub2]# cd /boot/grub2/
[root@localhost grub2]# ls
device.map fonts grub.cfg grubenv i386-pc locale
[root@localhost grub2]# rm -rf grub.cfg
[root@localhost grub2]# init 6
重启之后的界面如下:(此时无法正常登录)
(2)引导急救模式,加载系统镜像:在读条时(手速快点)按下ESC进入选择菜单——选择3.CD-ROM Drive——选择Troubleshooting——选择Rescue a Centos system,最终进入如下界面进行操作
之后就可以正常登录了。
===========================================================================================
1.4破解root密码
1.故障原因
遗忘root用户密码
2.故障现象
无法进行需要root权限的管理操作
没有其他可用账号,将无法登录系统
3.解决思路
进入急救模式,重新设置密码
实验三——遗忘root用户密码
流程如下:
- 加载镜像系统
- 直接改密码
实验操作过程与结果如下:
(1)先将镜像文件选择为已连接
(2)重启本地虚拟机
在读条时(手速快点)按下ESC进入选择菜单——选择3.CD-ROM Drive——选择Troubleshooting——选择Rescue a Centos system
(3)使用chroot命令和passwd root来设置root密码;之后exit、reboot就可以正常登录root用户了
二、系统服务控制
2.1系统服务控制命令systemctl
控制类型 (选项参数)
- start: 启动
- stop: 停止
- restart: 重新启动(会中断服务,相当于先stop,后start)
- reload: 重新加载(会重新加载配置文件,不会中断)
- status: 查看服务状态
- …
实例:
[root@localhost ~]# systemctl stop network //停止网络连接
[root@localhost ~]# ifconfig | head //查看ip信息
ens33: flags=4163 mtu 1500
ether 00:0c:29:56:d3:4a txqueuelen 1000 (Ethernet)
RX packets 374 bytes 28991 (28.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 50 bytes 6529 (6.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099 mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:71:37:09 txqueuelen 1000 (Ethernet)
[root@localhost ~]# systemctl start network //启动网络连接
[root@localhost ~]# ifconfig | head
ens33: flags=4163 mtu 1500
inet 192.168.68.130 netmask 255.255.255.0 broadcast 192.168.68.255
inet6 fe80::7eb1:2dde:8a54:6927 prefixlen 64 scopeid 0x20
ether 00:0c:29:56:d3:4a txqueuelen 1000 (Ethernet)
RX packets 379 bytes 29759 (29.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 75 bytes 10116 (9.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
2.2Linux系统的运行级别
查看运行级别
- runlevel命令
- systemctl工具
临时切换运行级别
- init命令
- systemctl工具
2.3优化启动过程
系统服务管理工具
-
ntsysv工具(伪图像化界面)
- 提供一个交互式、可视化窗口
- 可以在字符终端运行
- 便于集中管理多个服务
-
systemctl 工具
- 不提供交互式、可视化窗口
- 管理单个服务效率更高
结合下面的实例来进一步介绍systemctl命令
[root@localhost ~]# rpm -q httpd httpd-2.4.6-90.el7.centos.x86_64 [root@localhost ~]# netstat 显示网络连接,路由表,接口状态,伪装连接,网络链路信息和组播成员组。^C [root@localhost ~]# netstat -ntap | grep 80 [root@localhost ~]# systemctl start httpd [root@localhost ~]# netstat -ntap | grep 80 tcp6 0 0 :::80 :::* LISTEN 14793/httpd [root@localhost ~]# systemctl stop httpd [root@localhost ~]# netstat -ntap | grep 80 [root@localhost ~]# systemctl enable httpd Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service. [root@localhost ~]# systemctl is-enabled httpd enabled
systemctl enable httpd 是开机自启动,is-enabled是显示其状态,关闭自启动是disable 上面输入reboot后使用netstat查看80端口是否有httpd服务自启动。具体操作如下所示。
[root@localhost ~]# netstat -ntap | grep 80 tcp6 0 0 :::80 :::* LISTEN 953/httpd [root@localhost ~]# systemctl disable httpd Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service. [root@localhost ~]# systemctl is-enabled httpd disabled [root@localhost ~]#
三、总结
本文主要是对Linux系统管理中系统引导过程和服务控制及优化的讲解,涉及如下命令:
exit、reboot、chroot、grub2-install、grub2-mkconfig、passwd、runlevel、ntsysv、systemctl、netstat等。主要是对系统启动引导过程中的一些问题进行解决,强制破解root密码(实质上是强行更换),最后讲述的是服务控制命令操作和简单的一些优化操作。