目录
一.引导过程
在Linux系统中,开机需要经历几个过程
1.开机自检(bios)
在主机开机后,主板中的bios会进行初步硬件检查,检测设备运行是否正常。在检测成功后,会根据操作系统安排好的运行顺序移交系统的控制权,一般情况下会移交给本机硬盘。
2.MBR引导
当系统需要从硬盘中启动时,系统会根据硬盘分区信息表(MBR分区表)查找硬盘的位置。Linux根据硬盘上的第一个分区信息找到系统文件所在的硬盘。
3.grub菜单
对于 Linux 操作系统来说,grub是使用最为广泛的多系统引导器程序。系统控制权传递给 grub以后,将会显示启动菜单给用户选择,并根据所选项(或采用默认值)准备加载 Linux 内核文件,然后将系统控制权转交给内核。
4.加载内核
Linux内核是一个预先编译好的特殊二进制文件,介于各种硬件资源与系统程序之间。内核会分配好系统程序和一些第三方开机自启动程序,启动所需要的资源,并加载到内存当中。
5.systemd初始化
为了完成进一步的系统引导过程,Linux内核首先将系统中的“/sbin/init”程序加载到内存中运行(运行中的程序称为进程),init 进程负责完成整个系统的初始化,最后等待用户进行登录。
二.服务
服务:特殊的应用程序,一般在后台一直执行。
系统服务:给系统提供服务功能。
应用服务:给人提供服务功能。
1.systemd与init概念
Centos6:init
Centos7:systemd
init:①.由Linux内核加载运行 /sbin/init 程序
②.init进程是系统中第一个进程
③.init进程的PID(进程标记)号永远为1
systemd:①.systemd是Linux操作系统的一种init软件
②.Centos7中采用全新的systemd启动方式,代替传统的sysvinit
③.Centos7中运行的第一个init程序是/lib/systemd/systemd
2.systemd与init区别
init:启动程序时,是按照顺序一个一个的启动,速度慢
systemd:启动程序时,可以并行启动,速度快
3.systemd特性
-
系统引导时实现服务并行启动
-
按需启动守护进程
-
自动化的服务依赖关系管理
-
同时采用socket式与D-Bus总线式激活服务
-
socket与服务程序分离
-
向后兼容sysv init脚本
-
使用systemctl 命令管理,systemctl命令固定不变,不可扩展,非由systemd启动的服务,
-
systemctl无法与之通信和控制
-
系统状态快照
systemd是给一部分软件提供托管(叫醒)服务。
4.unit概念
unit:systemd的作用是管理程序,为了方便管理,把功能相似的程序分成一个单元组,即unit。
unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息
5.systemd单元类型
单元类型 | 扩展名 | 说明 |
Servise | .servise | 描述一个系统服务软件 |
Socket | .socket | 描述一个进程间通信的套接字 |
Device | .device | 描述一个内核识别的设备文件 |
Mount | .mount | 描述一个文件系统的挂载点 |
Automount | .automount | 描述一个文件系统的自动挂载点 |
Swap | .swap | 描述一个内存交换设备或交换文件 |
Path | .path | 描述一个文件系统中文件或目录 |
Timer | .timer | 描述一个定时器(用于实现类似cron的调度任务) |
Snapshot | .snapshot | 用于保存一个systemd的状态 |
Scope | .scope | 使用systemd的总线接口以编程的方式创建外部进程 |
Slice | .slice | 描述居于Cgroup的一组通过层次组织的管理系统进程 |
Target | .target | 描述一组systemd的单元 |
6.运行级别对应的systemd目标
运行级别 | systemd的target | 说明 |
0 | target | 关机状态,使用该级别时将会关闭主机 |
1 | rescue.target | 单用户模式,不需要密码验证即可登录系统,多用于系统维护 |
2 | multi-user.target | 用户定义/域特定运行级别。默认等同于3 |
3 | multi-user.target | 字符界面的完整多用户模式,大多数服务器主机运行在此级别 |
4 | multi-user.target | 用户定义/域特定运行级别。默认等同于3 |
5 | graphical.target | 图形界面的多用户模式,提供了图形桌面操作系统 |
6 | reboot.target | 重新启动,使用该级别时将会重启主机 |
7.service unit 文件格式
service unit文件通常由三部分组成:
-
[Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等
-
[Service]:与特定类型相关的专用选项;此处为Service类型
-
[Install]:定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到的一些选项
8.Unit段常用选项
-
Description:描述信息
-
After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反
-
Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活
-
Wants:依赖到的其它units,弱依赖
-
Conflicts:定义units间的冲突关系
9.Service段常用选项
①.Type:定义影响ExecStart及相关参数的功能的unit进程启动类型
-
simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中
-
forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务。原生父程序在启动结束后就会终止
-
oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中
-
dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作.因此通常也要同时设定BusNname= 才行
-
notify:在启动完成后会发送一个通知消息。还需要配合 NotifyAccess 来让 Systemd 接收消息
-
idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通常是开机到最后才执行即可的服务
②.EnvironmentFile:环境配置文件
③.ExecStart:指明启动unit要运行命令或脚本的绝对路径
④.ExecStartPre: ExecStart前运行
⑤.ExecStartPost: ExecStart后运行
⑥.ExecStop:指明停止unit要运行的命令或脚本
⑦.Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务
⑧.RestartSec: 设置在重启服务( Restart= )前暂停多长时间。 默认值是100毫秒(100ms)。 如果未指定时间单位,那么将视为以秒为单位。 例如设为"20"等价于设为"20s"。
⑨.PrivateTmp:设定为yes时,会在生成/tmp/systemd-private-UUID-NAME.service-XXXXX/tmp/目录
10.Install段常用选项
Alias:别名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依赖,强依赖
WantedBy:被哪些units所依赖,弱依赖
Also:安装本服务的时候还要安装别的相关服务
三.systemd命令
1.systemctl命令格式
systemctl [选项...] {程序名} ...
选项 | 说明 |
start | 开启 |
stop | 关闭 |
status | 查看目前服务状态 |
restart | 重启 |
reload | 重新加载配置文件 |
enable | 开机自启动 |
disable | 开机不自启 |
#查看服务是否活跃
[root@localhost ~]#systemctl is-active
#列出所有可用单元
[root@localhost ~]#systemctl list-unit-files
#列出所有已加载单元
[root@localhost ~]#systemctl list-units
#查看可用systemctl管理的所有服务
[root@localhost ~]#systemctl list-units --type=service
#注销服务
#服务被注销后该服务就无法通过systemctl进行启停管理
[root@localhost ~]#systemctl mask
#取消注销服务
[root@localhost ~]#systemctl unmask
#查看机器信息
[root@localhost ~]#systemctl list-machines
#查看系统环境变量
[root@localhost ~]#systemctl show-environment
#重新加载unit文件
[root@localhost ~]#systemctl daemon-reload
#创建一个系统快照
[root@localhost ~]#systemctl snapshot xxx
#删除指定快照
[root@localhost ~]#systemctl delete xxx
#查看服务是否开机自启动
[root@localhost ~]#systemctl is-enabled
#杀死服务
[root@localhost ~]#systemctl kill
#进入救援模式
[root@localhost ~]#systemctl rescue
#关闭系统
[root@localhost ~]#systemctl poweroff
#重启机器
[root@localhost ~]#systemctl reboot
#查看系统启动模式
[root@localhost ~]#systemctl get-default
2.实验
以nginx为例,如果使用yum安装,会自动被systemd管理,因此使用编译安装,手动加入systemd管理。
过程:
第一步:
进行编译安装
第二步:
为systemd管理nginx写配置文件
第三步:
重新加载配置文件
使用systemd管理启动
#编译安装nginx
[root@localhost ~]#cd /opt
[root@localhost opt]#wget http://nginx.org/download/nginx-1.18.0.tar.gz
[root@localhost opt]#tar xf nginx-1.18.0.tar.gz
[root@localhost opt]#cd nginx-1.18.0
[root@localhost nginx-1.18.0]#yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
[root@localhost nginx-1.18.0]#mkdir /apps/nginx -p
[root@localhost nginx-1.18.0]#./configure --prefix=/apps/nginx
[root@localhost nginx-1.18.0]#make
[root@localhost nginx-1.18.0]#make install
[root@localhost nginx-1.18.0]#ln -s /apps/nginx/sbin/nginx /usr/sbin/nginx
#为systemd管理nginx写配置文件
[root@localhost nginx-1.18.0]#vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
#描述软件的功能
[Service]
PIDFile=/apps/nginx/logs/nginx.pid
#方便使用pid号进行操作,指明进程的pid号
ExecStart=/apps/nginx/sbin/nginx
#使用绝对路径启动
ExecStop=/usr/bin/kill -s TERM $MAINPID
#杀死进程
ExecReload=/apps/nginx/sbin/nginx -s reload
#重新加载
[Install]
WantedBy=multi-user.target
#安装子字符界面
#重新加载配置文件
[root@localhost nginx-1.18.0]#systemctl daemon-reload
#开启服务
[root@localhost nginx-1.18.0]#systemctl start nginx
#查看服务状态
[root@localhost nginx-1.18.0]#systemctl status nginx
四.修复实验
1.修复MBR分区
实验步骤:
①.备份mbr引导扇区到其他磁盘
②.模拟破坏mbr引导扇区
③.引导镜像急救模式进行mbr扇区恢复
1.1方法一
模拟把分区表备份在其他硬盘上
第一步:
创建一个新分区sdb1并挂载
然后把mbr分区表备份至sdb1中
第二步:
模拟破坏mbr分区表并重启
第三步:
依次选择故障排除、急救模式、继续
第四步:
创建一个新目录作为sdb1的挂载点
并把sdb1中备份的mbr分区表复制到sda中
第五步:
检查mbr分区表并重启
#创建新分区sdb1并挂载
[root@localhost ~]#dfisk /dev/sdb
[root@localhost ~]#mkfs.xfs /dev/sdb1
[root@localhost ~]#mount /dev/sdb1 /opt/
#备份mbr分区表到sdb1中
[root@localhost ~]#dd if=/dev/sda of=/opt/aaa bs=512 count=1
#模拟破坏mbr分区表并重启
[root@localhost ~]#dd if=/dev/zero of=/dev/sda count=1 bs=512
[root@localhost ~]#hexdump -C -n 512 /dev/sda
[root@localhost ~]#reboot
#依次选择故障排除、急救模式、继续
#创建一个新目录作为sdb1的挂载点
#并把sdb1中备份的mbr分区表复制到sda中
#检查mbr分区表是否修复完成并重启
1.2方法二
模拟把分区表备份在其他主机上
第一步:
备份mbr分区表
并把备份的mbr分区表传给第二个主机
第二步:
模拟破坏mbr分区表并重启
第三步:
依次选择故障排除、急救模式、跳转到shell
第四步:
暂时修改本机IP地址
把备份的mbr分区表复制回来
第五步:
把备份的mbr分区表恢复到sda中
并重启检查
#备份mbr分区表
[root@localhost ~]#dd if=/dev/sda of=/mnt/aaa bs=512 count=1
#把备份的mbr分区表传给第二台主机
[root@localhost mnt]#scp /mnt/aaa 172.16.233.90:/mnt/
#模拟破坏mbr分区表
[root@localhost mnt]#dd if=/dev/zero of=/dev/sda bs=512 count=1
#重启
[root@localhost mnt]#reboot
#依次选择故障排除、急救模式、跳转到shell
#暂时修改IP地址
#把备份的mbr分区表从第二台主机复制回来
#用备份的mbr分区表修复sda
#重启验证
2.修复grup分区
模拟grup配置文件丢失
第一步:
找到grub.cfg配置文件模拟删除并重启
第二步:
依次选择光驱模式、故障排除、急救模式、继续
第三步:
更改环境进入bash
重新加载sda分区并构建grub配置文件
退出到光驱模式并重启验证
#找到grub.cfg配置文件模拟删除并重启
[root@localhost ~]#rm -rf /boot/grub2/grub.cfg
[root@localhost ~]#reboot
#依次选择光驱模式、故障排除、急救模式、继续
#进入急救模式后,更改环境
chroot /mnt/sysimage
#重新建立加载sda分区
grub2-install /dev/sda
#重新构建grub菜单配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
#退出到光驱模式并重启验证
3.修改密码
chroot /mnt/sysimage
#进入急救模式后,更改环境
passwd
#修改密码
启动时任意键暂停启动
按e键进入编辑模式
将光标移动linux 开始的行,添加内核参数 rd.break
按ctrl-x启动
mount –o remount,rw /sysroot
chroot /sysroot
passwd root
#如果SELinux是启用的,才需要执行下面操作,如没有启动,不需要执行
touch /.autorelabel
exit
reboot
启动时任意键暂停启动
按e键进入编辑模式
将光标移动linux 开始的行,改为 rw init=/sysroot/bin/sh
按ctrl-x启动
chroot /sysroot
passwd root
#如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行
touch /.autorelabel
exit
reboot