一、系统引导过程
系统引导过程:
开机自检(BIOS) ----> MBR ----> GRUB ----> 加载内核 ----> 启动程序
1.1 开机自检
(1)开机自检:硬件启动POST(BIOS的一个主要功能)来加电检测硬件
(2)指引硬件:主板的ROM BIOS指引硬件去找操作系统(根据BIOS中设置的启动顺序去找操作系统)
顺序:硬盘、移动设备(u盘、光驱)、网卡
BIOS功能集成在主板上
1.2 MBR引导
MBR(跟硬盘有关) 512字节
存在于硬盘第一个扇区中(开机引导程序 446字节的GRUB引导文件,后64字节为分区表), 运行放在MBR扇区中的GRUB引导程序。
1.3 GRUB菜单
GRUB
主要作用:引导硬件去找到内核即操作系统(根据/boot/grub2/grub.cfg找到内核文件)
注意centos6和centos7的区别,centos6使用grub,centos7使用grub2
1.4 加载内核
内核是操作系统的核心
kernel 加载内核,把内核放入内存中运行
1.5 启动程序
centos7启动的第一个程序 systemd(守护进程)
centos6启动的第一个程序 init
init:启动其他程序时,是串行启动(一个一个启动)
systemd:启动其他程序时,是并行启动(同时启动)
二、 解决系统启动中的故障
2.1 多块磁盘处理MBR分区故障
MBR分区故障( Centos7系统演示)
方法:作好备份文件,进入急救模式,从备份文件中恢复。
1. 添加硬盘2.为新磁盘做分区
3. 格式化分区,并且挂载
4. 备份MBR文件
5. 模拟破坏原MBR
6. 重启虚拟机发现进入以下界面完成以上步骤 输入reboot重启即可
2.2 多台设备处理MBR分区故障
备份mbr引导扇区到其他磁盘,引导镜像急救模式进行mbr扇区恢复
1. 先备份一份MBR文件到opt下
2. 使用scp命令发送给第二台虚拟机
3. 模拟第一台虚拟机MBR故障
4. 重新开启虚拟机进入急救模式
5. 将IP地址临时修改为与第二台虚拟机为一个网段下
6. 使用scp命令传输备份文件MBR.bak
7. 将损坏的/dev/sda文件用备份文件MBR.bak恢复
8. 重启虚拟机即可
2.3 GRUB引导故障
GRUB引导故障 MBR中的GRUB程序被破坏
使备份grub.cfg文件丢失,进入急救模式后更改环境
1. 将/boot/grub2/grub.cfg转移至/mnt
2. 重启虚拟机,见到如下界面时,立马按下ESC按键
3. 重新配置grub.cfg文件
4. 重启虚拟机即可
2.4 遗忘密码
情景一:有光驱的情况下
进入急救模式后在光驱中修改密码
1. 进入急救模式
2. 输入修改密码的命令即可passwd *** #新密码exit #退出当前系统reboot #重启操作系统
情景二 :没有光驱的情况下
1. 开机时在如下界面按'e'键进入编辑模式
2. 将光标移至此处输入rd.break console=tty0 后,按' ctrl + x '启动
3. 重新挂载并修改权限
4. 切换根目录,修改密码
三、 服务
什么是服务程序?
1.本地服务程序,管理本机
2.网络服务程序
为其他设备提供服务的程序,服务程序启动后,会持续监听端口。
systemd:管家式的程序,管理系统中其他程序。
为了方便管理,将系统中的程序按照一定的规则进行分类。
3.1 运行级别所对应的Systemd目标
运行级别 | systemd的目标 | 说明 |
---|---|---|
init 0 | target | 关机 |
init 1 | rescue.target | 单用户模式,不需要密码,多用于系统维护 |
init 2 | Multi-user.target | 用户定义/域特定运行级别,默认等同于3 |
init 3 | Multi-user.target | 字符界面的完整多用户模式,大多服务器主机运行在此级别 |
init 4 | Multi-user.target | 用户定义/域特定运行级别,默认等同于3 |
init 5 | Graphical.target | 图形界面的多用户模式 |
init 6 | Reboot.target | 重新启动 |
3.2 systemd单元类型
单元类型 | 扩展名 | 说明 |
---|---|---|
Service | .service | 描述一个系统服务 |
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的单元 |
3.3 .service文件格式
service unit file文件通常由三部分组成:
- [Unit]:主要用来描述此软件的功能,man帮助,依赖关系等等
- [Service]:主要作用是,systemd程序怎么具体管理该程序,以及一些额外配置
- [Install]:在哪个运行级别启动
Unit段的常用选项:
-
Description:描述信息
-
After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反
-
Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活
-
Wants:依赖到的其它units,弱依赖
-
Conflicts:定义units间的冲突关系
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要运行的命令或脚本 $mainpid
- Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务
- RestartSec: 设置在重启服务( Restart= )前暂停多长时间。 默认值是100毫秒(100ms)。 如果未指定时间单位,那么将视为以秒为单位。 例如设为"20"等价于设为"20s"。
- PrivateTmp:设定为yes时,会在生成/tmp/systemd-private-UUID-NAME.service-XXXXX/tmp/目录
Install段的常用选项:
- Alias:别名,可使用systemctl command Alias.service
- RequiredBy:被哪些units所依赖,强依赖
- WantedBy:被哪些units所依赖,弱依赖
- Also:安装本服务的时候还要安装别的相关服务
3.4 管理服务的方式
1. 通过写脚本以及使用chkconfig工具 (一般不使用此方法)
chkconfig --list [服务名称]chkconfig --add 服务名称chkconfig --level 级别列表服务名on/offchkconfig --add httpdchkconfig --level 35 httpd on
脚本编写以及chkconfig工具使用如下:
vim /etc/init.d/nginx #写一个脚本#!/bin/bash
#chkconfig: - 99 20
#description:Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid" case "$1" in
start) $PROG
;;
stop)
kill -s QUIT $(cat $PIDF)
;;
restart)
$0 stop $0 start
;;
reload)
kill -s HUP $(cat $PIDF)
;;
*) echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0chmod +x /etc/init.d/nginx
#给脚本加上权限ss -ntap |grep nginx
#查看服务有没有启动chkconfig --add nginx
#将服务加入chkconfig --list nginx
#查看服务
chkconfig --level 35 nginx on
#开启3和5自动开启
2. 通过配置文件让systemd直接管理
a.系统必要的程序
b.yum rpm 安装的程序
c.编译安装的程序,自己编写.service文件且放在/usr/lib/systemd/system/文件夹下
编译安装程序编写.service文件过程如下:
cd /opt #切换目录至optwget http://nginx.org/download/nginx-1.18.0.tar.gz #下载nginx包tar xf nginx-1.18.0.tar.gz #解压tar包yum -y install pcre-devel zlib-devel gcc gcc-c++ make #下载编译环境cd nginx-1.18.0/ #切换至解压后的目录下./configure --prefix=/apps/nginx #编译检测安装环境make
make install #编译安装ln -s /apps/nginx/sbin/nginx /usr/local/bin #为编译后的可执行文件做软链接vim /lib/systemd/system/nginx.service #编写编译安装程序的配置文件[Unit]
Description=The nginx HTTP and reverse proxy server[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
ExecStart=/apps/nginx/sbin/nginx
ExecReload=/apps/nginx/sbin/nginx -s reload
ExecStop=/usr/bin/kill -s TERM ${MAINPID}[Install]
WantedBy=multi-user.targetsystemctl daemon-reload #重新加载systemd程序
systemd管理时,使用的是systemctl
命令,其中
systemctl start 服务名为开启服务systemctl stop 服务名为关闭服务systemctl status 服务名为查看服务状态systemctl restart 服务名为重启服务systemctl reload 服务名为重新热加载服务systemctl enable --now 服务名为开启时自动启动服务且立即启动systemctl disable --now 服务名为关闭开机自启且立即关闭systemctl daemon-reload 重新加载systemd程序
3. 通过init程序管理(centos6)
同样写脚本到/dev/init.d/下,因为已经不常用所以不过多赘述。