引导过程和服务控制
一、Linux操作系统的开机过程
1.1 开机自检
开机后,根据BIOS 中的设置对 CPU、内存、显卡、键盘等设备进行初步检测,检测成功后根据预设的启动顺序移交系统控制权给本机硬盘
检测出第一个能够引导系统的设备,比如硬盘或者光驱
1.2 MBR引导
当本机硬盘启动系统时,从硬盘的第一个扇区中的MBR (主引导记录)的设置,将系统控制权交给包含操作系统引导文件的分区或者直接根据MBR记录中的引导信息调用启动菜单(grub)
运行放在MBR (主引导记录)扇区里的启动grub的引导程序
1.3 grub菜单
多系统引导器程序,将启动的菜单显示给用户选择,根据所选项(或采用默认值)加载Linux内核文件,然后将系统控制权转交给内核
注意:
- Centos 7采用的是 grub2 引导程序
- grub引导程序通过读取grub配置文件 /boot/grub2/grub.cfg ,来获取内核和镜像文件系统的设置和路径位置
1.4 加载内核
Linux内核是一个预先编译好的特殊二进制文件,介于各种硬件资源与系统程序之间,负责资源的分配与调度
Centos 7系统中,默认的内核文件位于 “/boot/vmlinuz-3.10.0-693.e17.x86_64”
此时系统控制权转交给进程初始化
总结:把内核和相关的系统镜像文件加载到内存中
1.5 进程初始化
Linux内核将系统中的 /sbin/init 程序加载到内存中,完成整个系统的初始化
加载硬件驱动,检测进入操作系统的必须要有的程序,加载到内存中运行
注意:CentOS 6系统的第一个进程是init进程,CentOS 7的第一个进程是systemd进程
二、系统初始化进程
2.1 init
- 有Linux内核加载运行 /sbin/init 程序
- init进程是系统中第一个进程,是所有进程的父进程
- init进程的PID(进程标记)号永远为1
2.2 systemd
- Systemd是Linux操作系统中的一种init软件;
- CentOS7中采用全新的Systemd启动方式,取代传统的SysVinit;
- CentOS7中运行的第一个init进程是/lib/systemd/systemd
2.3 init与systemd的区别
init是串行启动shell脚本
systemd是并行启动,而且可以按需启动
2.4 systemd的单元类型
三、服务控制
3.1 systemctl
[root@localhost ~]# Systemctl 控制类型 服务名称
控制类型:
start 启动
stop 停止
restart 重新启动
reload 重新加载
status 查看服务状态
enable 服务开机自启
disable 关闭服务开机自启
例:
[root@localhost ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) since 三 2023-05-10 16:25:41 CST; 22s ago Docs: man:firewalld(1) Main PID: 63435 (firewalld) CGroup: /system.slice/firewalld.service └─63435 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...name. 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...name. 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). Hint: Some lines were ellipsized, use -l to show in full. [root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: inactive (dead) since 三 2023-05-10 16:26:16 CST; 1s ago Docs: man:firewalld(1) Process: 63435 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS) Main PID: 63435 (code=exited, status=0/SUCCESS) 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...name. 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...name. 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:25:41 localhost.localdomain firewalld[63435]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:26:15 localhost.localdomain systemd[1]: Stopping firewalld - dynamic firewall daemon... 5月 10 16:26:16 localhost.localdomain systemd[1]: Stopped firewalld - dynamic firewall daemon. Hint: Some lines were ellipsized, use -l to show in full. [root@localhost ~]# systemctl start firewalld.service [root@localhost ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) since 三 2023-05-10 16:26:24 CST; 2s ago Docs: man:firewalld(1) Main PID: 63633 (firewalld) CGroup: /system.slice/firewalld.service └─63633 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid 5月 10 16:26:25 localhost.localdomain firewalld[63633]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:26:25 localhost.localdomain firewalld[63633]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:26:25 localhost.localdomain firewalld[63633]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:26:25 localhost.localdomain firewalld[63633]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...name. 5月 10 16:26:25 localhost.localdomain firewalld[63633]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...name. 5月 10 16:26:25 localhost.localdomain firewalld[63633]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:26:25 localhost.localdomain firewalld[63633]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:26:25 localhost.localdomain firewalld[63633]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:26:25 localhost.localdomain firewalld[63633]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). 5月 10 16:26:25 localhost.localdomain firewalld[63633]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -w --table filte...in?). Hint: Some lines were ellipsized, use -l to show in full.
3.2 运行级别
3.2.1 运行级别所对应的systemd目标
3.2.2 查看运行级别
[root@localhost ~]# runlevel N 5 ## N:表示到目前为止没有切换过运行级别 ## 5:表示现在的运行级别
3.2.4 查询系统默认的运行级别
[root@localhost ~]# systemctl get-default graphical.target
3.2.5 更改系统默认的运行级别
[root@localhost ~]# systemctl set-default multi-user.target Removed symlink /etc/systemd/system/default.target. Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target. [root@localhost ~]# systemctl get-default multi-user.target
也可用 init + 级别的数字 如:init 0 //关机
四、实验
4.1 修复MBR扇区故障
4.1.1 创建分区
[root@localhost /]# lsblk //查看分区情况 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 60G 0 disk ├─sda1 8:1 0 953M 0 part /boot └─sda2 8:2 0 51.2G 0 part ├─centos-root 253:0 0 46.6G 0 lvm / └─centos-swap 253:1 0 4.7G 0 lvm [SWAP] sdb 8:16 0 30G 0 disk sdc 8:32 0 20G 0 disk sdd 8:48 0 20G 0 disk sde 8:64 0 20G 0 disk sdf 8:80 0 20G 0 disk sdg 8:96 0 20G 0 disk sr0 11:0 1 4.2G 0 rom /run/media/root/CentOS 7 x86_64 [root@localhost /]# fdisk /dev/sdb //创建分区 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 Device does not contain a recognized partition table 使用磁盘标识符 0xb50ac281 创建新的 DOS 磁盘标签。 命令(输入 m 获取帮助):n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p 分区号 (1-4,默认 1): 起始 扇区 (2048-62914559,默认为 2048): 将使用默认值 2048 Last 扇区, +扇区 or +size{K,M,G} (2048-62914559,默认为 62914559):+10G 分区 1 已设置为 Linux 类型,大小设为 10 GiB 命令(输入 m 获取帮助):w The partition table has been altered! Calling ioctl() to re-read partition table. 正在同步磁盘。 [root@localhost /]# lsblk //查看分区是否创建成功 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 60G 0 disk ├─sda1 8:1 0 953M 0 part /boot └─sda2 8:2 0 51.2G 0 part ├─centos-root 253:0 0 46.6G 0 lvm / └─centos-swap 253:1 0 4.7G 0 lvm [SWAP] sdb 8:16 0 30G 0 disk └─sdb1 8:17 0 10G 0 part //创建成功 sdc 8:32 0 20G 0 disk sdd 8:48 0 20G 0 disk sde 8:64 0 20G 0 disk sdf 8:80 0 20G 0 disk sdg 8:96 0 20G 0 disk sr0 11:0 1 4.2G 0 rom /run/media/root/CentOS 7 x86_64
4.1.2 格式化
[root@localhost /]# mkfs.xfs /dev/sdb1 meta-data=/dev/sdb1 isize=512 agcount=4, agsize=655360 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=2621440, 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
4.1.3 挂载
目的:把sda中第一个扇区的MBR文件备份到sdb1中
[root@localhost /]# mkdir /data //创建挂载的目录 [root@localhost /]# mount /dev/sdb1 /data/ //将sdb1挂载到/data/ [root@localhost /]# df -h //查看是否挂载成功 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 47G 4.9G 42G 11% / devtmpfs 969M 0 969M 0% /dev tmpfs 984M 0 984M 0% /dev/shm tmpfs 984M 9.1M 975M 1% /run tmpfs 984M 0 984M 0% /sys/fs/cgroup /dev/sda1 950M 179M 772M 19% /boot tmpfs 197M 32K 197M 1% /run/user/0 /dev/sr0 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64 /dev/sdb1 10G 33M 10G 1% /data
4.1.4 将主引导分区记录的文件复制到data下
[root@localhost /]# dd if=/dev/sda of=/data/mbr.bak bs=512 count=1 记录了1+0 的读入 记录了1+0 的写出 512字节(512 B)已复制,0.000508755 秒,1.0 MB/秒 [root@localhost /]# cd /data/ [root@localhost data]# ls //查看是否复制成功 mbr.bak
4.1.5 用零文件吧第一个扇区破坏掉
[root@localhost data]# dd if=/dev/zero of=/dev/sda bs=512 count=1 记录了1+0 的读入 记录了1+0 的写出 512字节(512 B)已复制,0.000292731 秒,1.7 MB/秒 [root@localhost data]# init 6 //重启
4.1.6 回到虚拟机,开始修复故障
选择Troubleshooting
选择Rescue a CentOS system
再回车
挂载带有备份文件的分区
恢复备份数据
dd if=/backupdir/mbr.bak of=/dev/sda
之后 reboot 重启就可以了
4.2 修复grub引导故障
4.2.1 删除grub.cfg
[root@localhost ~]# rm -rf /boot/grub2/grub.cfg [root@localhost ~]# reboot
4.2.2 修复
重启虚拟机的过程中立刻按下Esc键,进入以下界面
选择CD-ROM Drive,回车
进入以下界面,选择Troubleshooting
选择Rescue a CentOS system
输入1,回车,回车
进入急救模式,加载光盘镜像,切换到系统根环境
chroot /mnt/sysimage
重新将grub引导程序安装到第一块硬盘 ( /dev/sda)的MRB扇区
grub2-install /dev/sda
重新构建grub菜单的配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
退出系统根目录环境,重启
4.3 修改root密码
4.3.1 进入急救模式
重启虚拟机时快速按下Esc