目录
一、引导过程
引导过程共五步,如下图:
1、开机自检
开机自检:加电检测硬件是否有故障,如果没有故障,就去bios中设置的第一启动项找操作系统。
硬件启动POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘等硬件情况的检测
主板的ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等
2、MBR引导
MBR引导:第一个扇区的前446字节存放grub程序的第一阶段,引导硬件找到操作系统(完整的grub程序)。
当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中 MBR(Master Boot Record, 主引导记录)的设置,将系统控制权传递给包含操作系统引导文件的分区;或者直接根据 MBR 记录中的引导信息调用启动菜单(如 GRUB)。
总结:运行放在MBR扇区里的启动 GRUB引导程序
3、GRUB菜单
GRUB菜单:根据grub.cfg配置文件找到操作系统。
对于 Linux 操作系统来说,GRUB(GRand Unified Bootloader,统一启动加载器)是 使用最为广泛的多系统引导器程序。系统控制权传递给 GRUB 以后,将会显示启动菜单给 用户选择,并根据所选项(或采用默认值)准备加载 Linux 内核文件,然后将系统控制权转交给 内核。需要注意的是,CentOS 7 采用的是 GRUB2 启动引导器。
总结:GRUB引导程序通过读取GRUB配置文件/boot/grub2/grub.cfg,来获取内核和镜像文件系统的设置和路径位置
4、加载内核(kernel)
加载内核:找到操作系统后,激活操作系统。
kernel 实现进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能等功能
内核设计流派
-
宏内核(monolithic kernel):又称单内核和强内核,Unix,Linux把所有系统服务都放到内核里,所有功能集成于同一个程序,分层实现不同功能,系统庞大复杂,Linux其实在单内核内核实现了模块化,也就相当于吸收了微内核的优点。
-
微内核(micro kernel):Windows,Solaris,HarmonyOS简化内核功能,在内核之外的用户态尽可能多地实现系统服务,同时加入相互之间的安全保护,每种功能使用一个单独子系统实现,将内核功能移到用户空间,性能差。
5、init进程初始化
init进程初始化:启动程序。
祖宗进程:CentOS 7 systemctl;CentOS 6 init
为了完成进一步的系统引导过程,Linux内核首先将系统中的“/sbin/init”程序加载到内 存中运行(运行中的程序称为进程),init 进程负责完成一系列的系统初始化过程,最后等待用户进行登录
总结:加载硬件驱动程序,内核把init进程加载到内存中运行
传统init依赖于串行执行Shell 脚本启动服务,导致效率低下,系统启动速度较慢——排队; systemd能够将更多的服务进程并行启动,并且具有提供按需启动服务的能力,使得启动更少进程,从而提高系统启动速度许多进程一起上。
二、服务
1、systemd服务
Linux运行级别:0、1、2、3、4、5、6
运行级别 | Systemd的target | 说明 |
0 | target | 关机状态,使用该级别时将会关闭主机 |
1 | rescue.target | 单用户模式,不需要密码验证即可登录系统 |
2 | multi-user.target | 用户定义/域特定运行级别。相比较级别3,属于阉割版级别3 |
3 | multi-user.target | 字符界面的完整多用户模式,大多数服务器主机运行在此级别 |
4 | multi-user.target | 用户定义/域特定运行级别。保留,没用过,默认等同于3 |
5 | graphical.target | 图形化界面的多用户模式,提供了图形化桌面操作环境 |
6 | reboot.target | 重新启动,使用该级别将会重启主机 |
systemctl get-default
# 获得当前的运行级别
systemctl set-defaul multi-user.targetln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
# 设置默认的运行级别为multi-user
systemctl islate multi-user.target#在不重启的情况下,切换到运行级别multi-user下
systemctl isolate graphical.target
# 在不重启的情况下,切换到图形界面下
Systemd新特性
-
系统引导时实现服务并行启动
-
按需启动守护进程
-
自动化的服务依赖关系管理
-
同时采用socket式与D-Bus总线式激活服务
-
socket与服务程序分离
-
向后兼容sysv init脚本
-
使用systemctl 命令管理,systemctl命令固定不变,不可扩展,非由systemd启动的服务,
-
systemctl无法与之通信和控制
-
系统状态快照
systemd 核心概念:unit
unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息
2、系统服务类型
单元类型 | 扩展名 | 说明 |
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、系统服务控制
systemctl 控制类型 服务名称
控制类型:
start:启动
stop:停止
restart:重新启动
reload:重新加载
status:查看服务状态
在Linux系统中启动或关闭服务最方便的就是使用systemctl命令,当然编译安装的服务程序,需要手动写配置文件,才可以使用systemctl命令启动或关闭。
systemctl命令能够启动哪些服务,可以在/etc/systemd/system下看到,/etc/systemd/system下存放的都是各种服务的配置文件,借助systemctl命令进行对其管理,更加方便。
查看nginx服务的配置文件:
service unit file配置文件通常由三部分组成:
[Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等
[Service]:与特定类型相关的专用选项;此处为Service类型
[Install]:定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到的一些选项
Unit段的常用选项:
Description:描述信息
After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反
Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活
Wants:依赖到的其它units,弱依赖
Conflicts:定义units间的冲突关系
Service段的常用选项:
Type:定义影响ExecStart及相关参数的功能的unit进程启动类型
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/目录
Install段的常用选项:
Alias:别名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依赖,强依赖
WantedBy:被哪些units所依赖,弱依赖
Also:安装本服务的时候还要安装别的相关服务
三、修复MBR分区
修复mbr分区的方法有两种
1、将mbr分区内容第一个分区备份到另一块硬盘上,然后在mbr分区损坏之后,进入单用户模式,在单用户模式中,将备份拷贝到原mbr文件中,最后重启即可。
2、将mbr分区内容备份到其他主机中,通过网络进行恢复。
方法一
步骤:
本实验是人为损坏mbr分区后在恢复的所有步骤
1)首先加一块硬盘,格式化并挂载在某个文件中
2)备份mbr分区内容到新硬盘上
dd if=/dev/sda of=/mnt/mbr.bak count=1 bs=512
从哪复制 复制到哪去 复制几次 复制多少内容,不写单位默认是字节
3)损坏mbr分区的内容
dd if=/dev/zero of=/dev/sda count=1 bs=512
4)重启后进入单用户模式
5)创建文件夹,将硬盘挂载到新文件夹上
mkdir bak
mount /dev/sdb1 /bak
6)将硬盘中备份的mbr文件拷贝到/dev/sda中,然后重启即可修复
dd if=/bak/mbr.bak of=/dev/sda count=1 bs=512
方法二
步骤如下:
1)首先将mbr分区内拷贝到一个空文件中,再将拷贝的文件存储到另一台主机中
dd if=/dev/sda of=/data/mbr.bak coun=1 bs=512
scp /data/mbr.bak 另一台主机的IP地址:/mnt
2)损坏mbr分区内容并重启
dd if=/dev/zero of=/dev/sda count=1 bs=512
3)进入急救模式,并输入1
4)查看自己的网卡,并将网卡配ip地址(ip地址需要与另一台主机同一网段)
5)从另一台主机上将文件拷问回来
scp 另一台主机的IP地址:/mnt/mbr.bak .
将备份文件拷贝到当前目录下
6)将拷贝回来的文件写入到mbr分区中,然后重启即可
dd if=/mbr.bak of=/dev/sda count=1 bs=512
四、修复grub分区
步骤如下:
1)模拟grub分区损坏,删除grub.cfg文件
rm -rf /boot/grub2/grub.cfg
2)重启进入急救模式,输入1
在下面这个界面按“esc”键进入,否则进入不了急救模式,且模拟器上这个界面只有0.5秒
然后在下方界面选择CD-ROM Drive
3)进入急救模式后,更改环境
chroot /mnt/sysimage
4)重新建立和加载sda分区
grub2-install /dev/sda
5)重新构建grub菜单配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
6)重启
五、修改密码
修改密码的方式也有两种,一种借助光驱,另一种不借助光驱。
1、借助光驱
chroot /mnt/sysimage
#进入急救模式后,更改环境
passwd
#修改密码
2、不借助光驱
不借助光驱有两种做法
第一种做法
1)永久关闭selinux
vim /etc/selinux/config
2)启动时任意键暂停启动
3)按e键进入编辑模式
4)将光标移动linux 开始的行,添加内核参数 rd.break,然后按ctrl-x启动
5)输入命令修改密码
chroot /sysroot
passwd root
#如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行
touch /.autorelabel
exit
reboot
第二种做法
1)永久关闭selinux
vim /etc/selinux/config
2)启动时任意键暂停启动,按e键进入编辑模式
3)将光标移动linux 开始的行,将ro 及后面的改为 rw init=/sysroot/bin/sh
4)ctrl + x启动
5) 输入命令,修改密码,重启
chroot /sysroot
passwd root
#如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行
touch /.autorelabel
exit
reboot