目录
一.Linux操作系统的引导过程
1.开机自检(BIOS):
2.MBR引导:
3.启动GRUB菜单:
4.加载Linux内核
5.init进程初始化
二.系统初始化进程
1.init 进程
2.Systemd
2.1 systemd 概述
2.2 Systemd 与 传统 SysVinit 的比较
3.Systemd 单元类型
4.运行级别所对应的 Systemd 目标
三.排除启动类故障
1.修复MBR扇区故障
2.故障现象
3.解决思路
4.操作实验
5.遗忘 root 用户的密码,修改密码
第一种:
第二种:
三.系统服务控制
1.控制类型
2.Linux的运行级别
3.系统服务的启动和控制
一.Linux操作系统的引导过程
上图是操作系统引导的五个主要步骤
1.开机自检(BIOS):
服务器开机以后,会根据主板BIOS中的设置对CPU、内存、显卡、等设备进行检测,检测成功
后,可以找出可以引导系统的设备,大多是硬盘设备;然后移交控制权。
2.MBR引导:
从本地硬盘启动系统后,根据硬盘第一个扇区中MBR(主引导记录)的设置,会根据MBR 记录中
的引导信息调用启动GRUB菜单(CentOS-7采用的是grub2启动引导器)。
3.启动GRUB菜单:
GRUB引导程序通过读取GRUB配置文件(文件位置/boot/grub2/grub.cfg),来获取内核和镜像文件系统的设置和路径位置,并在屏幕显示GRUB菜单页面。
4.加载Linux内核
Linux内核是一个预先编译好的特殊二进制文件,介于各种硬件资源与系统程序之间,负责资源分配与调度。加载Linux内核后,内核接过系统控制权以后,将完全掌控整个Linux操作系统的运行过程(CentOS 7,默认的内核文件位于“/boot/vmlinuz-3.10.0-514.el7.x86_64”)。
5.init进程初始化
Linux内核会将 init 进程加载到内存中运行,并把 init 进程作为系统的第一个进程,负责完成整个系统的初始化;最后等待用户进行登录。
二.系统初始化进程
1.init 进程
(1)由Linux 内核加载运行 /sbin/init 程序
(2)init 进程是系统中的第一个进程,是所有进程的父进程
(3)init 进程的PID(进程标记)号永远为1
2.Systemd
2.1 systemd 概述
(1)Systemd 是Linux操作系统的一种 init 软件
(2)CentOS 7中采用全新的 Systemd 启动方式,取代传统的SysVinit
(3)CentOS 7中运行的第一进程是 /lib/systemd/systemd
拓展:pstree 是一个在 Unix 和类 Unix 系统(如 Linux)中常用的命令行工具,用于显示进程的树状结构。
pstree -p:显示每个进程的 PID(进程 ID)。
pstree -u:显示每个进程的所属用户
2.2 Systemd 与 传统 SysVinit 的比较
传统SysVinit(CentOS7以前的版本):对于进/程的管理是串行执行 Shell 脚本启动服务,容易出现阻塞情况,导致效率低下,系统启动速度较慢。
Systemd(CentOS7开始的版本):能够将更多的服务进程并行启动,并且具有提供按需启动服务的能力,使得启动更少进程,从而提高系统启动速度。
3.Systemd 单元类型
单元类型 | 扩展名 | 说明 |
Service | .service | 描述一个系统服务 |
Socket | .socket | 描述一个进程间通信的套接字 |
Device | .device | 描述一个内核识别的挂载点 |
Automount | .automount | 描述一个文件系统的自动挂载点 |
Swap | .swap | 描述一个内存交换设备或交换文件 |
Path | .path | 描述一个文件系统中的文件或目录 |
Timer | .timer | 描述一个定时器(用于实现类似cron的调度任务) |
Snapshot | .snapsho | 用于保存一个 systemd 的状态 |
Scope | .scope | 使用 systemd 的总线接口一编程的方式创建外部进程 |
Slice | .slice | 描述居于 Cgroup 的一组通过层次组织的管理系统进程 |
Target | .target | 描述一组 systemd 的单元 |
常用的是 .service 和 .target 两种单元类型
拓展:套接字:应用程序直接的数据连接文件;套接字格式:ip:port ftp IP地址:端口号
4.运行级别所对应的 Systemd 目标
运行级别 | Systemd的target | 说明 |
0 | poweroff.target | 关机状态,使用该级别时将会关闭主机 |
1 | rescue.target | 单用户模式,不需要密码验证即可登录系统,多用于系统维护 |
2 | multi-user.target | 用户定义/域特定运行级别。默认等同于3(无网络) |
3 | multi-user.target | 字符界面的完整多用户模式,大多数服务器主机运行在此级别 |
4 | multi-user.target | 用户定义/域特定运行级别。(保留的,没有任何作用的) |
5 | graphical.target | 图形界面的多用户模式,提供了图形桌面操作环境 |
6 | reboot.target | 重新启动,使用该级别时将会重启主机 |
拓展:
init 0 关机命令;init 6 重启命令;init 3 可以切换到字符界面
三.排除启动类故障
1.修复MBR扇区故障
(1)病毒、木马等造成的破坏
(2)不正确的分区操作、磁盘毒读写误操作
2.故障现象
(1)找不到引导程序,启动中断
(2)无法加载操作系统,开机后黑屏
3.解决思路
(1)应提前作好备份文件
(2)以安装光盘引导进入急救模式
(3)从备份文件中恢复
4.操作实验
(1)第一种:利用提前备份的文件进行复原系统
【1】先做备份,添加一块新硬盘
1.添加一块硬盘后重启主机,作为备份使用,先切换到/opt/目录中创建mbr-bak
[root@192 ~]# cd /opt/
[root@192 opt]# mkdir mbr-bak
[root@192 opt]# ls -l
总用量 0
drwxr-xr-x. 2 root root 21 4月 17 19:42 mbr-bak
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
2.对磁盘进行分区后,格式化磁盘后,创建 xfs 文件系统,在进行挂载/opt/mbr-bak/
磁盘分区直接全部默认,保存即可,不用创建分区类型ID
[root@192 ~]# mkfs -t xfs /dev/sdb1 #格式化并创建文件系统xfs
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@192 ~]# mount /dev/sdb1 /opt/mbr-bak/ #将 /opt/mbr-bak 挂载到磁盘上
[root@192 ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 13M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 36G 4.4G 32G 13% /
/dev/sda1 xfs 509M 181M 329M 36% /boot
tmpfs tmpfs 378M 20K 378M 1% /run/user/0
/dev/sr0 iso9660 4.5G 4.5G 0 100% /run/media/root/CentOS 7 x86_64
/dev/sdb1 xfs 20G 33M 20G 1% /opt/mbr-bak
3.对 /dev/ada 中的MBR主引导程序进行复制到 /opt/mbr-bak/mbr.bak 文件中(文件名自取)
[root@192 ~]# dd if=/dev/sda of=/opt/mbr-bak/mbr.bak bs=512 count=1
记录了1+0 的读入 #进行复制,大小512字节就即可
记录了1+0 的写出
512字节(512 B)已复制,0.000154789 秒,3.3 MB/秒
[root@192 ~]# cd /opt/mbr-bak/ #切换到指定目录上
[root@192 mbr-bak]# ll -h #查看文件是否已经复制上
总用量 4.0K
-rw-r--r--. 1 root root 512 4月 17 19:42 mbr.bak #512字节,复制成功
到此文件备份完成
【2】模拟破环文件中的数据
模拟破坏;输入内容到文件/dev/sda 中,将MBR主引导程序覆盖,造成文件丢失
[root@192 mbr-bak]# dd if=/dev/zero of=/dev/sda bs=512 count=1
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,0.000131934 秒,3.9 MB/秒
破环后,进行重启设备;进入下面界面;发现需要重新安装系统;重启后,进入不了系统。
有光盘和无光盘的界面如下显示:
【3】如果想要恢复系统的方法:操作如下
把光盘挂载到设备中,在界面中选择急救模式;
此后输入重启命令(reboot 或者 init 6)即可;等待一会后就可以进入系统
(2)第二种:利用grub2进行文件恢复
【1】模拟 grub.cfg 文件被误删;不重启没事,重启后进入不了系统
[root@192 ~]# cd /boot/ #进入boot目录
[root@192 boot]# ls #查看文件
config-3.10.0-1160.71.1.el7.x86_64 initramfs-3.10.0-1160.71.1.el7.x86_64kdump.img
efi symvers-3.10.0-1160.71.1.el7.x86_64.gz
grub System.map-3.10.0-1160.71.1.el7.x86_64
grub2 vmlinuz-0-rescue-206e0447c56247938052c02b1cdfaa71
initramfs-0-rescue-206e0447c56247938052c02b1cdfaa71.img vmlinuz-3.10.0-1160.71.1.el7.x86_64
initramfs-3.10.0-1160.71.1.el7.x86_64.img
[root@192 boot]# cd grub2/
[root@192 grub2]# ls
device.map fonts grub.cfg grubenv i386-pc locale
[root@192 grub2]# rm -rf /boot/grub2/grub.cfg #删除指定文件grub.cfg
[root@192 grub2]# ls
device.map fonts grubenv i386-pc locale
【2】有两种方法可以恢复系统
第一种:手动敲入配置文件里面的配置信息(一般不建议使用,进入后只能手打,无法TAB快速补充)
基本配置如下所示:
grub> insmod xfs #加载指定的模块到内核
grub> linux16 /vmlinuz-3.10.0-693.el7.x86_64 root=UUID=8fd74986-ae66-4ffd-b7d8-a19f2eca7b6f ro rhgb quiet LANG=zh_CN.UTF-8 #内核的名字及位置等信息
grub> initrd16 /initramfs-3.10.0-693.el7.x86_64.img #镜像系统文件
grub> boot #引导boot
第二种:进入急救模式,恢复GRUB引导程序
也有两种方法进入急救模式
第1种:关机选择进入固件
之后就可以进入到急救模式界面
第2种:重启之后快速按 esc 键
进入急救模式后准备修复grub配置文件
之后即可登录账户
5.遗忘 root 用户的密码,修改密码
第一种:
进入急救模式
重启后,正常进入系统,按修改后的密码进入账户
第二种:
在重启之后,进入以下这个界面
CTRL + X 之后进入这个界面,修改root密码即可
如果SELinux没有关闭,则还需要输入这两条命令
touch /.autorelabel
exec /sbin/init
这样子就可以修改root密码了
三.系统服务控制
systemctl 控制类型 服务名称
1.控制类型
start 启动
stop 停止
restart 重新启动
reload 重新加载
status 查看服务状态
要确保在 /usr/lib/systemd/system/ 目录中有相关服务的 XXX.service 文件才能查看器服务状态
(1)systemctl start 服务
[root@192 ~]# systemctl start firewalld #开启防火墙
[root@192 ~]# systemctl status firewalld #查看防火墙服务情况
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since 三 2024-04-17 23:03:48 CST; 2s ago
Docs: man:firewalld(1)
Main PID: 3608 (firewalld)
Tasks: 2
CGroup: /system.slice/firewalld.service
└─3608 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
4月 17 23:03:48 192.168.80.90 firewalld[3608]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...n?).
4月 17 23:03:48 192.168.80.90 firewalld[3608]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...n?).
4月 17 23:03:48 192.168.80.90 firewalld[3608]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...n?).
4月 17 23:03:48 192.168.80.90 firewalld[3608]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...ame.
4月 17 23:03:48 192.168.80.90 firewalld[3608]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...ame.
4月 17 23:03:48 192.168.80.90 firewalld[3608]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...n?).
4月 17 23:03:48 192.168.80.90 firewalld[3608]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...n?).
4月 17 23:03:48 192.168.80.90 firewalld[3608]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...n?).
4月 17 23:03:48 192.168.80.90 firewalld[3608]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...n?).
4月 17 23:03:48 192.168.80.90 firewalld[3608]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...n?).
Hint: Some lines were ellipsized, use -l to show in full.
(2)systemctl stop 服务
[root@192 ~]# systemctl stop firewalld #停止防火墙
[root@192 ~]# systemctl status firewalld #查看防火墙服务情况
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: inactive (dead) since 三 2024-04-17 23:03:11 CST; 18s ago
Docs: man:firewalld(1)
Process: 807 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
Main PID: 807 (code=exited, status=0/SUCCESS)
4月 17 20:42:13 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
4月 17 20:42:13 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
4月 17 20:42:13 localhost.localdomain firewalld[807]: WARNING: AllowZoneDrifting is enabled. This is cons...ow.
4月 17 23:03:11 192.168.80.90 systemd[1]: Stopping firewalld - dynamic firewall daemon...
4月 17 23:03:11 192.168.80.90 systemd[1]: Stopped firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.
(3)systemctl restart 服务
[root@192 ~]# systemctl restart firewalld #重启防火墙(无论开还是关着)
[root@192 ~]# systemctl status firewalld #查看防火墙服务状态
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since 三 2024-04-17 23:04:20 CST; 3s ago
Docs: man:firewalld(1)
Main PID: 3805 (firewalld)
Tasks: 2
CGroup: /system.slice/firewalld.service
└─3805 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
4月 17 23:04:20 192.168.80.90 firewalld[3805]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...n?).
4月 17 23:04:20 192.168.80.90 firewalld[3805]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...n?).
4月 17 23:04:20 192.168.80.90 firewalld[3805]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...n?).
4月 17 23:04:20 192.168.80.90 firewalld[3805]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...ame.
4月 17 23:04:20 192.168.80.90 firewalld[3805]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...ame.
4月 17 23:04:20 192.168.80.90 firewalld[3805]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...n?).
4月 17 23:04:20 192.168.80.90 firewalld[3805]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...n?).
4月 17 23:04:20 192.168.80.90 firewalld[3805]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...n?).
4月 17 23:04:20 192.168.80.90 firewalld[3805]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...n?).
4月 17 23:04:20 192.168.80.90 firewalld[3805]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -w --ta...n?).
Hint: Some lines were ellipsized, use -l to show in full.
(4)systemctl reload 服务(大部分服务都可以适用,少部分不支持)
(5)systemctl is -active 服务也可以查看服务的开启状态,不过便只能看见开启和关闭状态
[root@192 ~]# systemctl is-active firewalld.service
active
[root@192 ~]# systemctl stop firewalld
[root@192 ~]# systemctl is-active firewalld.service
inactive
拓展:
在CentOS-6 及以前的版本使用 servie 命令来查看服务开启和关闭状态
要确保在 /etc/init.d/ 目录中有相关服务的管理脚本文件才能管理服务
2.Linux的运行级别
(1)查看运行级别
runlevel命令 只能查看切换运行级别与当前运行级别
systemctl工具 只能查看默认的运行级别
[root@192 ~]# runlevel
N 5
[root@192 ~]# systemctl get-default
graphical.target
(2)设置运行级别
init 命令 命令参数是运行级别对应的数字
例如格式
init 3
init 5
systemctl 工具 命令参数是具体的target
[root@192 ~]# systemctl isolate multi-user.target
[root@192 ~]# systemctl set-default graphical.target #永久设置运行级别
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.
[root@192 ~]# systemctl get-default #查看运行级别
graphical.target
[root@192 ~]# 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@192 ~]# systemctl get-default
multi-user.target
和
ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
功能是一样的
3.系统服务的启动和控制
(1)ntsysv 系统服务管理工具:
ntsysv #图形化管理开机自启
ntsysv --level 级别列表
(2)服务开机自启管理
systemctl is-enabled 服务
systemctl disabled 服务
--now选项可实现立即开启|关闭服务
systemctl is-enabled 服务名[.service] #查看是否启动
[root@192 ~]# systemctl is-enabled firewalld.service
enabled
[root@192 ~]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@192 ~]# systemctl is-enabled firewalld.service
disabled
(3)chkconfig 工具
chkconfig --add 服务名 #服务名就是 /etc/init.d/ 目录下的脚本文件名
chkconfig --level 运行级别列表 服务名 on|off #开启|关闭服务在哪些运行级别下开机自启
chkconfig --list 服务名 #查看自启状态服务名要和 /etc/init.d 下的脚本名保持一致
(4)扩展知识
永久修改主机名
hostnamectl set-hostname newname
查看主机名的状态
hostnamectl status设置系统语言为中文
localectl set-locale LANG=zh_CN.utf8
查看当前系统使用的语言
localectl [status]字符集编码
ASCII 127个字符
GBK 中国字符集编码
UTF-8 万国字符集编码