Appearance
引导过程与服务控制
开机引导过程
BIOS/UEFI 初始化阶段
- 硬件自检(POST):电源接通后,主板固件(BIOS/UEFI)执行硬件检测
- 固件初始化:初始化硬件设备,建立硬件列表
mbr引导加载程序阶段
根据第一个硬盘,第一个扇区的MBR中2字节校验,加载64字节分区列表,加载446字节主引导记录,找出操作系统所在的分区,直接把系统控制权移交给包含系统引导文件的分区。调用GRUB菜单。
三种启动模式:
- 本地硬盘启动
- 移动硬盘启动
- network网络启动
加载grub菜单
系统控制权交给GRUB之后,显示启动菜单供用户选择。
选择完系统之后,系统控制权会交给所选的操作系统的内核文件。
centos7使用grub2作为引导器/boot/grub2/grub.cfg
加载内核启动进程
进程分为父进程和子进程。id=1是整个系统的父进程,父进程可以杀死子进程,子进程无法杀死父进程。
Linux采用的是写时复制技术,多个进程需要访问相同资源时,内核不会立即为每个进程创建副本,而是让它们共享同一份资源,只有当某个进程尝试修改共享资源时,内核才会为该进程创建真正的独立副本。
系统初始化
准备其它进程的运行环境
读取开机模式(7种运行模式)
执行初始化脚本
查看当前启动服务
执行个人配置脚本(/etc/rc.d/rc.local)
正常开机
Linux 系统7种运行模式
Linux 系统有7种运行模式,init 通常通过 /etc/inittab 文件进行配置,并且它按照运行级别(runlevel)来启动系统服务和进
程, systemd 使用单元文件(unit files)进行配置:
- 0:关机状态,使用该级别时将会关闭主机
- 1:单用户模式,无需密码验证即可登录系统,用于系统维护
- 2:字符界面的多用户模式(不支持访问网络)【很少使用】
- 3:字符界面的完整多用户模式,大多数服务器运行在此级别
- 4:未分配使用(开发者模式/保留模式)
- 5:图形界面的多用户模式,提供了图形桌面操作环境
- 6:重新启动,使用该级别时将会重启主机
运行级别 (Runlevel) 与 Systemd 目标 (Target) 对照表
运行级别 (Runlevel) | Systemd 目标 (Target) | 用途 |
---|---|---|
0 (关机) | poweroff.target | 关闭系统 |
1 (单用户模式) | rescue.target | 紧急修复模式(仅 root shell) |
2 (多用户无网络) | multi-user.target (无网络) | 多用户模式,但不支持网络(较少使用) |
3 (多用户命令行) | multi-user.target | 完整的多用户模式(无图形界面) |
4 (未定义) | 无标准对应(可自定义) | 通常未使用,可自定义 |
5 (图形界面) | graphical.target | 带图形界面(X11/Wayland)的多用户模式 |
6 (重启) | reboot.target | 重启系统 |
修复 MBR 扇区故障
1、故障原因 :
- 病毒、木马等造成的破坏(如硬盘炸弹)
- 不正确的分区操作、磁盘读写误操作
2、故障现象 :
- 找不到引导程序,启动中断
- 无法加载操作系统,开机后黑屏
3、解决思路 :
- 应提前作好备份文件
- 以安装光盘引导进入急救模式
- 从备份文件中恢复
4、修复 MBR 扇区故障示例:
添加一块新的硬盘
/dev/sdb
格式化新硬盘
/dev/sdb
bashmkfs.ext4 /dev/sdb
挂载到
/backup
bashmkdir /backup && mount /dev/sdb /backup
将mbr备份文件拷贝到新硬盘
bashdd if=/dev/sda of=/mnt/mbr count=1 bs=512 # 将mbr备份文件拷贝到新硬盘
模拟破坏mbr
bashdd if=/dev/zero of=/dev/sda count=1 bs=512 # 向/dev/sda的前512字节写0覆盖原来内容 hexdump -C -n 512 /dev/sda # 查看前512字节
进入急救模式恢复mbr
reboot重启后,选择
Troubleshooting
,再选择Rescue a CentOS system
,最后选择Continue
后,进入急救模式,输入1
将备份文件拷贝到/dev/sda
bashmkdir bak # 新建文件夹 mount /dev/sdb1 bak # 将存有备份文件的硬盘挂载到新建文件夹下 dd if=bak/mbr of=/dev/sda # 将备份文件添加到原本的目录下 hexdump -C -n 512 /dev/sda # 查看到/dev/sda前512字节已恢复
重启即可正常使用系统
忘记root密码
CentOS7
进入系统时选择内核界面,选中第一个选项并按
e
键将光标移动到Linux开头行的最后,添加
rd.break
,然后ctrl+x
运行,进入单用户模式进入单用户模式后,重新挂载并添加读写权限,然后切换到系统的根修改密码
bashmount -o remount,rw /sysroot # 重新挂载并添加读写权限 chroot /sysroot # 从光盘的根切换到主机系统的根 passwd 用户名 # 修改密码 touch /.autorelabel # 如果开启selinux需重新打上标记 exit # 退出 reboot # 重启
openEuler
- 进入系统时选择内核界面,选中第一个选项并按
e
键 - 输入账号
root
- 输入初试密码
openEuler#12
- 在linux开头行的
root=/dev/Mapper/openeuler-root
后面追加rw
- 在linux开头行的行尾添加
init=/bin/bash
- 按
Ctrl + X
或F10
启动系统。 - 修改密码
echo "123456" | passwd --stdin root
- 如果开启selinux需重新打上标记
touch ./autorelabel
- 重启
exec /sbin/init
Ubuntu
- 在启动时,在GRUB菜单出现时按下Shift或Esc键来进入GRUB菜单
- 按
e
键进入 - 在linux开头的行尾添加
rw init=/bin/bash
,然后按Ctrl + X
或F10
来启动系统 - 重置密码
passwd username
- 重启服务器
exec /sbin/init
/etc/fstab 与 rc.local 详解
/etc/fstab 文件
1. 基本概念
/etc/fstab
(File System Table) 是 Linux 系统中用于定义磁盘分区、块设备或远程文件系统如何挂载到文件系统的配置文件。
2. 文件结构
每一行代表一个文件系统的挂载信息,包含6个字段,用空格或制表符分隔:
ini
<设备标识> <挂载点> <文件系统类型> <挂载选项> <dump备份标志> <fsck检查顺序>
ini
/dev/sda1 / ext4 defaults 0 1
UUID=1234-5678 /home xfs defaults,nofail 0 2
3. 各字段详解
- 设备标识:
- 可以是设备文件路径(如
/dev/sda1
) - UUID(如
UUID=xxxx-xxxx
) - 卷标(如
LABEL=ROOT
)
- 可以是设备文件路径(如
- 挂载点:文件系统中挂载位置的绝对路径
- 文件系统类型:
- ext4, xfs, btrfs 等本地文件系统
- nfs, cifs 等网络文件系统
- swap 用于交换分区
- auto 自动检测
- 挂载选项:
defaults
:默认选项(rw,suid,dev,exec,auto,nouser,async)ro
/rw
:只读/读写noexec
:禁止执行nofail
:启动时不报告错误- 多个选项用逗号分隔
- dump备份标志:
0
:不备份1
:需要备份
- fsck检查顺序:
0
:不检查1
:根文件系统(优先检查)2+
:其他文件系统
4. 常用命令
bash
mount -a # 挂载fstab中所有定义的文件系统
umount /mnt/data # 卸载文件系统
blkid # 查看设备的UUID
/etc/rc.local 文件
1. 基本概念
rc.local
是一个在系统启动时自动执行的脚本文件(在运行级别2、3、4、5的末尾执行)。
注意:在现代Linux发行版中,许多已转向systemd,rc.local可能默认不启用
2. 文件位置
/etc/rc.local
3. 典型用途
- 启动自定义服务
- 设置特殊环境变量
- 执行一次性启动任务
- 挂载非标准文件系统
4. 使用示例
bash
#!/bin/bash
# 这个脚本将在系统启动时执行
# 启用IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 启动自定义服务
/path/to/your/script.sh &
# 挂载额外文件系统
mount /dev/sdb1 /mnt/data
exit 0
5. 在现代systemd系统中的使用
对于使用systemd的系统:
确保服务已启用:
bashsystemctl enable rc-local.service
创建/etc/rc.local文件并添加可执行权限:
bashchmod +x /etc/rc.local
检查服务状态:
bashsystemctl status rc-local.service
主要区别
特性 | /etc/fstab | /etc/rc.local |
---|---|---|
主要用途 | 定义文件系统挂载信息 | 执行自定义启动脚本 |
执行时机 | 系统启动早期阶段 | 系统启动后期阶段 |
配置格式 | 结构化字段(6列) | Shell脚本格式 |
现代替代方案 | 仍然是标准配置方式 | 被systemd服务单元取代 |
必要性 | 系统关键文件 | 可选功能 |
最佳实践建议
- 对于fstab:
- 优先使用UUID而非设备路径(如/dev/sda1),因为设备路径可能变化
- 对非关键文件系统使用
nofail
选项,避免启动失败 - 测试新条目前先使用
mount -o remount
而非重启
- 对于rc.local:
- 在现代系统中,考虑使用systemd服务单元替代
- 确保脚本中的命令是幂等的(可重复执行而不产生副作用)
- 长时间运行的任务应使用
&
放入后台或使用nohup - 添加适当的日志记录
- 通用建议:
- 修改前备份原始文件
- 使用版本控制系统管理重要配置文件
- 测试更改前确保有恢复方法
systemd服务程序管理
systemd
是 Linux 系统的新型初始化系统和服务管理器,取代传统的 SysVinit。它提供:
- 并行启动服务
- 按需激活守护进程
- 快照和系统状态恢复
- 依赖关系管理
服务状态管理
命令 | 作用 |
---|---|
systemctl start <服务名> | 启动服务(立即生效) |
systemctl stop <服务名> | 停止服务 |
systemctl restart <服务名> | 重启服务 |
systemctl reload <服务名> | 重新加载配置(不重启服务) |
systemctl status <服务名> | 查看服务状态(运行/失败/日志) |
systemctl enable <服务名> | 开机自启 |
systemctl disable <服务名> | 开机不自启 |
systemctl is-active <服务名> | 检查服务是否正在运行 |
systemctl is-enabled <服务名> | 检查服务是否开机自启 |
systemctl enable --now <服务名> | 开机自启,并立即启动 |
systemctl disable --now <服务名> | 开机不自启,并立即关 |
systemctl status | 系统管理 |
journalctl -u <服务名> | 日志管理 |
journalctl | 查看系统日志 |
systemd 配置文件参数解析
在 systemd 中,服务、挂载点、定时任务等均由 单元文件(Unit File) 定义,通常以 .service
、.mount
、.timer
等后缀命名。以下是 systemd 配置文件的核心参数解析,涵盖 [Unit]
、[Service]
和 [Install]
三个主要区块的配置选项
配置文件位置
- 系统级服务:
/usr/lib/systemd/system/
:软件包安装的默认单元文件。/etc/systemd/system/
:管理员自定义或覆盖的单元文件(优先级更高)。
- 用户级服务:
~/.config/systemd/user/
:用户自定义服务。
配置文件结构
ini
[Unit]
Description=My Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/myapp
Restart=on-failure
[Install]
WantedBy=multi-user.target
[Unit] 区块参数
定义服务的元信息和依赖关系。
参数 | 说明 |
---|---|
Description | 服务描述信息(显示在 systemctl status 中)。 |
After | 指定在哪些服务之后启动(如 network.target 表示网络就绪后启动)。 |
Before | 指定在哪些服务之前启动。 |
Requires | 强依赖的其他服务(如果依赖服务失败,当前服务也会停止)。 |
Wants | 弱依赖的其他服务(即使依赖服务失败,当前服务仍会启动)。 |
Conflicts | 指定不能共存的单元(如 foo.service 和 bar.service 不能同时运行)。 |
ConditionPathExists=/path | 仅在指定路径存在时启动服务。 |
示例:
ini
[Unit]
Description=My Web Service
After=network.target mysql.service
Requires=mysql.service
[Service] 区块参数
定义服务的运行行为。
参数 | 说明 |
---|---|
Type | 服务类型: simple (默认,主进程立即启动) forking (主进程 fork 子进程后退出) oneshot (执行一次后退出) notify (通过 sd_notify 通知 systemd 启动完成) |
ExecStart | 启动服务的命令(必须是绝对路径)。 |
ExecStop | 停止服务的命令。 |
ExecReload | 重载配置的命令(如 nginx -s reload )。 |
Restart | 退出时是否重启: no (默认) on-failure (失败时重启) always (总是重启) |
RestartSec | 重启间隔时间(如 5s )。 |
User / Group | 以指定用户/组运行服务(如 User=nginx )。 |
WorkingDirectory | 服务的工作目录。 |
Environment | 设置环境变量(如 Environment="PORT=8080" )。 |
EnvironmentFile | 从文件加载环境变量(如 EnvironmentFile=/etc/myapp.conf )。 |
LimitNOFILE | 限制文件描述符数量(如 LimitNOFILE=65536 )。 |
StandardOutput / StandardError | 日志输出方式: journal (默认,写入 journald) file:/path/to/log (写入文件) |
示例:
ini
[Service]
Type=simple
ExecStart=/usr/bin/python3 /opt/myapp/app.py
User=myapp
Restart=on-failure
RestartSec=5s
Environment="DB_HOST=localhost"
[Install] 区块参数
定义服务的安装目标(开机自启)。
参数 | 说明 |
---|---|
WantedBy | 指定服务所属的 target(如 multi-user.target 表示多用户模式)。 |
RequiredBy | 类似 WantedBy ,但表示强依赖关系。 |
Alias | 为服务设置别名(如 alias-for-myapp.service )。 |
示例:
ini
[Install]
WantedBy=multi-user.target
重点说明
修改单元文件后,必须重新加载
bashsystemctl daemon-reload
进程管理
进程基本概念
- 程序:程序是存储在磁盘上的静态可执行文件(如二进制文件或脚本),包含完成特定任务的指令和数据。
- 进程:操作系统进行资源分配和调度的基本单位。每个进程拥有独立的内存空间(包括代码段、数据段、堆栈段等),相当于一个正在运行的程序实例。
- 线程:进程内的执行单元,属于CPU调度的最小单位。同一进程中的多个线程共享进程的资源(如内存、文件句柄),但每个线程有独立的程序计数器、栈空间和寄存器状态。每个进程最大有65535个新线程。
- 守护进程:守护进程是一种长期运行的后台进程,通常在系统启动时启动,独立于终端(不与用户直接交互),用于提供系统服务。比如web服务nginx,系统监听端口80,当有用户请求时,父进程会分配子进程处理,处理完后以服务形式持续运行。
- 僵尸进程:僵尸进程是已经终止但未被父进程回收资源的进程。(父进程停止,子进程未停止)
- PID (Process ID):每个进程的唯一标识号
- PPID (Parent Process ID):父进程的 ID
- UID/GID:进程所属用户和组
概念 | 状态 | 资源占用 | 生命周期 | 典型示例 |
---|---|---|---|---|
程序 | 静态文件 | 磁盘空间 | 永久存储 | /bin/ls |
进程 | 动态执行 | CPU/内存 | 启动到终止 | ls -l 运行时 |
线程 | 动态执行 | 共享资源 | 程序执行完毕 | ps -eLf |
守护进程 | 后台运行 | 常驻内存 | 系统启动到关闭 | sshd 、nginx |
僵尸进程 | 已终止但未回收资源 | 无 | 父进程调用 wait() 前 | 子进程未被父进程回收 |
查看进程
ps 命令
bash
ps aux # 查看所有运行中的进程
ps -ef # 另一种查看所有进程的方式
ps -u username # 查看特定用户的进程
ps -p PID # 查看特定PID的进程
输出字段解析
bash
%CPU # CPU使用率
%MEM # 内存使用率
args # 完整命令行
CMD # 简单命令名
COMMAND # 运行该进程的指令
etime # 进程运行时间
euser # 有效用户名
fgroup # 文件系统组名
START # 进程启动时间
LWP # 线程号
NLWP # 该进程中的线程数
NI # nice值,优先级修正值取值范围-20到20
pcpu # CPU百分比(同%cpu)
pgid # 进程组ID
PID # 进程ID
PPID # 父进程ID
PRI # 进程优先级,值越小进程的优先级越高(默认80)。优先级计算PRI(80)+NI(-20)=60
RSS # 占用物理内存大小
STAT # 进程状态
S # 休眠状态进程
R # 运行状态进程
D # 不可中断(正在等待系统分配资源)
+ # 运行在前台进程
Z # 僵尸进程(需要定期清理)
T # 已停止
TIME # 累计CPU时间(要注意观察,启动时长太长有问题)
TTY # 控制终端
? # 系统启动进程
tty # 本地登录终端
pts # 远程登录终端
USER # 用户名
VSZ # 虚拟内存大小(物理内存+交换分区)
top 命令
bash
top
常用交互命令:
q
:退出k
:终止进程M
:按内存排序P
:按CPU使用排序1
:显示所有CPU核心
输出字段解析
顶部信息解析
bash
top - 10:30:45 up 2 days, 3:45, 2 users, load average: 0.15, 0.10, 0.05
Tasks: 120 total, 2 running, 118 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.3 us, 1.2 sy, 0.0 ni, 93.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7856.4 total, 1024.2 free, 4096.0 used, 2736.2 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 3200.0 avail Mem
- 第1行:系统运行时间、用户数、平均负载(1/5/15 分钟)
- 第2行:进程状态
- total:运行进程总数
- running:正在运行数
- sleeping:睡眠数
- stopped:停止数
- zombie:僵尸数
- 第3行:CPU 使用情况
- us (user):
- 用户空间进程占用 CPU 的百分比(非内核进程)。
- 高值表示应用程序(如 Python、Java、Nginx 等)正在消耗大量 CPU。
- sy(system):内核态
- 内核空间进程占用 CPU 的百分比。
- 高值可能说明系统调用频繁(如 I/O 操作、进程调度),或内核处理任务繁重(如网络、驱动)。
- ni(nice):优先级
- 低优先级(nice 值 > 0)用户进程占用的百分比。
- 通常接近 0,除非手动调整过进程优先级(如
nice
或renice
命令)。
- id(idle):空闲
- CPU 空闲时间的百分比。
- 值越高说明系统负载越轻。如果长期低于 70%,可能需关注性能瓶颈。
- wa (iowait):IO等待
- CPU 等待 I/O 完成的百分比(如磁盘、网络)。
- 高值(>5%)可能表示存储设备慢或 I/O 过载(检查磁盘使用率:
iostat -x 1
)。
- hi(hardware interrupt):硬件中断占用
- 硬件中断占用的百分比(如键盘、网卡中断)。
- 通常很低,服务器上若突然增高可能硬件故障。
- si(software interrupt):软件中断占用
- 软件中断占用的百分比(如内核任务调度)。
- 高值可能因频繁的系统调用或网络包处理(如高流量场景)。
- st (steal):被 Hypervisor 偷走的 CPU 时间
- 虚拟化环境中被 Hypervisor 偷走的 CPU 时间。
- 高值(>10%)说明物理主机资源竞争激烈(常见于云服务器)。
- us (user):
- 第4行:物理内存使用情况
- total:总量
- free:空闲
- used:已用
- buff/cache:缓存
- 第5行:交换分区(Swap)使用情况
进程列表
bash
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 root 20 0 500000 80000 10000 R 10.5 1.0 5:30.01 firefox
5678 mysql 20 0 2000000 500000 20000 S 5.2 6.3 10:20.45 mysqld
- PID:进程 ID
- USER:进程所属用户
- PR:优先级
- NI:
nice
值(-20 最高,19 最低) - VIRT:虚拟内存使用量(KB)
- RES:物理内存使用量(KB)
- SHR:共享内存(KB)
- S:进程状态(R=运行, S=睡眠, Z=僵尸, D=不可中断)
- %CPU:CPU 占用率
- %MEM:内存占用率
- TIME+:累计 CPU 时间
- COMMAND:进程名(
c
键可切换完整命令)
关键分析结论
- 当前 CPU 负载极低:93.5% 空闲,系统非常轻松。
- 无 I/O 瓶颈:
wa=0.0
表示磁盘/网络无阻塞。 - 无虚拟化竞争:
st=0.0
说明虚拟机未受宿主资源限制。 - 主要消耗在用户进程:
us=5.3%
是主要活跃部分(如应用代码、服务)。
后续建议
- 如果
us
长期偏高:- 使用
top -c
或ps aux --sort=-%cpu
定位高 CPU 进程。 - 分析是否需优化代码或扩容。
- 使用
- 如果
sy
偏高:- 检查内核日志(
dmesg
)或使用perf
工具分析系统调用。
- 检查内核日志(
- 如果
wa
突然增高:- 排查磁盘性能(
iostat -x
)或数据库慢查询。
- 排查磁盘性能(
- 监控工具推荐:
- 实时监控:
glances
、htop
- 历史记录:
sar -u
(需安装sysstat
)
- 实时监控:
进程控制
启动进程
bash
command & # 后台运行
nohup command & # 退出终端后继续运行
nohup command > app.log 2>&1 & # 退出终端后继续运行并将输出日志重定向到日志文件中
nohup
- 全称 "no hang up"(不挂断)
- 作用:使进程忽略 SIGHUP 信号(终端关闭时发送的信号)
- 结果:即使你退出终端或 SSH 连接,进程也不会被终止
command -u
command
:执行命令-u
:无缓冲选项(unbuffered)- 强制标准输出和标准错误流不使用缓冲
- 立即将输出写入日志文件,而不是等待缓冲区满
- 对于需要实时查看日志的脚本特别有用
> app.log
- 标准输出重定向到 app.log 文件
>
会覆盖文件,如果要用追加模式应使用>>
2>&1
- 将标准错误(文件描述符2)重定向到标准输出(文件描述符1)
- 效果:错误信息也会写入 test.log 文件
- 注意:
&1
表示文件描述符1,不是数字1
&
- 将进程放入后台运行
- 立即返回终端控制权,可以继续输入其他命令
停止进程
bash
kill PID # 发送TERM信号(15)
kill -9 PID # 强制终止(KILL信号)
killall process_name # 终止所有同名进程
pkill pattern # 按模式终止进程
进程优先级
bash
nice -n 10 command # 以较低优先级启动
renice 10 -p PID # 修改运行中进程的优先级
Linux 平均负载
Linux 系统的平均负载(Load Average)是一个重要的性能指标,它反映了系统在一段时间内的负载情况。理解和管理负载均衡对于系统性能优化至关重要。
平均负载是指单位时间内,系统处于可运行状态(R)和不可中断状态(D)的平均进程数。它通常显示为三个数值,分别代表过去1分钟、5分钟和15分钟的平均负载。
平均负载解读
- 单核CPU:负载值1.00表示CPU完全利用
- 四核CPU:负载值4.00表示所有核心完全利用
- 负载高于CPU核心数可能表示系统过载
- 理想情况下,负载应略低于CPU核心数
平均负载指标
- 理想状态:负载值 ≤ CPU 核心数(每个核心处理一个进程)
- 警戒线:负载值 > CPU 核心数的 70% 时需关注,> 100% 表示过载
查看命令
bash
# 通过以下任一命令查看
uptime
top
cat /proc/loadavg
# 示例输出(1分钟 5分钟 15分钟):
10:30:01 up 20 days, 3:45, 1 user, load average: 0.82, 1.05, 0.98
负载值的含义
值 | 说明 |
---|---|
0.00 | 完全空闲 |
< CPU核心数 | 资源充足 |
= CPU核心数 | 资源饱和 |
> CPU核心数 | 过载(可能性能下降) |
计算CPU核心数
bash
nproc # 直接显示逻辑CPU数量
grep 'model name' /proc/cpuinfo | wc -l
负载组成解析
- 可运行状态:正在使用CPU或等待CPU的进程
- 不可中断状态:等待I/O(磁盘/网络)完成的进程
健康负载判断标准
bash
假设4核CPU的健康负载示例:
1分钟: 3.50 # 短期波动(需关注)
5分钟: 2.80 # 中期趋势
15分钟: 2.20 # 长期基线(<4为健康)
负载优化建议
bash
# 短期缓解
kill -9 $(ps -eo pid,%cpu --sort=-%cpu | awk 'NR==2{print $1}') # 杀最高CPU进程
# 长期优化
1. 增加CPU核心数
2. 优化磁盘I/O(SSD/RAID调整)
3. 减少进程fork(如PHP-FPM调优)
4. 限制并发连接(Nginx的worker_connections)
top 命令输出全解析
基础视图(按交互键 h
查看帮助)
bash
top - 10:11:34 up 2 days, 3:13, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 127 total, 1 running, 126 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7983.0 total, 2023.2 free, 2203.4 used, 3756.4 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 5309.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1084 root 20 0 230724 17228 9060 S 0.0 0.2 0:02.14 systemd-journal
1113 root 20 0 167764 9868 6404 S 0.0 0.1 0:00.66 systemd-udevd
1209 root 20 0 717084 24360 13352 S 0.0 0.3 0:00.34 lvmetad
1224 root 20 0 261888 11800 7488 S 0.0 0.1 0:00.73 auditd
1244 root 20 0 128728 5640 3688 S 0.0 0.1 0:00.16 crond
1. 头部信息区 - top
字段 | 含义 |
---|---|
14:30:45 | 当前系统时间 |
up 10 days | 系统运行时间 |
load average | 1/5/15分钟平均负载 |
2.任务状态区 - Tasks
字段 | 含义 |
---|---|
total | 总进程数 |
running | 正在运行的进程 |
sleeping | 等待资源的进程 |
zombie | 僵尸进程(需警惕) |
3.CPU 状态行 - %Cpu(s)
缩写 | 全称 | 说明 |
---|---|---|
us | user | 用户空间进程占用 |
sy | system | 内核空间进程占用 |
id | idle | CPU 空闲率 |
wa | iowait | I/O 等待占比(>5% 需检查磁盘) |
st | steal | 虚拟机被hypervisor偷取的时间 |
4.内存 - MiB Mem
字段 | 描述 |
---|---|
total = free + used + buff/cache | 总内存 |
free | 空闲内存大小 |
used | 已使用的内存大小 |
buff/cache | 用于缓冲和缓存的内存大小 |
5.交换分区 - MiB Swap
字段 | 描述 |
---|---|
total | 交换空间(虚拟内存)的总大小。 |
free | 空闲交换空间大小 |
used | 已使用的交换空间大小 |
avail Mem | 实际可用内存(含可回收缓存) |
6.进程列表(关键列)
字段 | 描述 |
---|---|
PID | 进程 ID |
USER | 进程所有者 |
PR | 进程优先级 |
NI | 进程的 nice 值(优先级调整值) |
VIRT | 进程使用的虚拟内存总量(KB) |
RES | 进程使用的物理内存总量(KB) |
SHR | 进程使用的共享内存总量(KB) |
S | 进程状态(R = 运行,S = 休眠,T = 停止,Z = 僵尸) |
%CPU | 进程占用的 CPU 百分比 |
%MEM | 进程占用的内存百分比 |
TIME+ | 进程使用的 CPU 时间总计 |
COMMAND | 进程的命令名 |
Linux 定时任务
一次性定时任务
一次性定时任务,定时任务执行完一次后就取消了,不会在重复执行,Linux执行的一次性定时任务叫at
操作命令 - at
安装
Debian/Ubuntu
bash
sudo apt-get -y install at
CentOS/RHEL
bash
yum -y install at
启动服务
bash
systemctl enable atd --now
使用方法
输入
at
命令及时间,然后在新的提示符下输入要执行的命令,按Ctrl + D
结束输入。例如,在明天下午 3 点执行/home/user/script.sh
脚本:bashat 3pm tomorrow at> /home/user/script.sh at> <EOT>
也可以将命令写入文件,然后使用
at -f
选项指定文件。例如,将命令写入job.txt
文件,在后天晚上 8 点执行:bashat -f job.txt 8pm day after tomorrow
保存:交互模式下
ctrl + d
保存
时间格式
bash
at 时间 # 设置一个一次性任务
at now +x min #设置一个几分钟后执行的定时任务
at 时间 tomorrow # 设置一个第二天的定时任务
查看任务
bash
atq
at -c x # 查看第x个定时任务的具体执行计划
删除任务
bash
atrm <job_number>
# 或
at -d x # 删除第x个一次性定时任务
周期性定时任务
周期性的定时任务,设定好一个定时任务执行的周期,每个一个周期执行一次指令(脚本)周期性定时任务的名称叫crond。
cron
是 Linux 系统中用于定期执行任务的守护进程,它会根据配置文件中的规则在指定时间执行任务。
配置文件
全局配置文件
位于/etc/crontab
,此文件可设置系统级的定时任务。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
- SHELL:定时任务使用的解析器是bash
- PATH:指定的是本系统的环境变量,由于这个变量内声明指令路径并不完整,所有在设置定时任务的时候,尽量采用指令的绝对路径来执行
- MAILTO:用户邮件服务
用户配置文件
每个用户都有自己的 cron 配置文件位置在/var/spool/cron/用户名
。
时间格式
bash
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
# 分 时 日 月 周 用户 command
- 分钟(0 - 59)
- 小时(0 - 23)
- 日期(1 - 31)
- 月份(1 - 12)
- 星期(0 - 7,0 和 7 都代表周日)
- user-name执行用户,默认root
command
是要执行的命令或脚本
时间表达式
*
:表示任意值,例如*
在分钟字段就意味着每分钟。,
:用于分隔多个值,像1,3,5
就表示 1、3、5 这几个值。-
:用于指定范围,例如1-5
代表从 1 到 5 的范围。/
:用于指定间隔,例如*/2
表示每 2 个单位执行一次。
操作命令
bash
crontab [-u user] [-l | -r | -e] [file]
crontab -e
:编辑当前用户的 cron 配置文件。crontab -l
:列出当前用户的所有定时任务。crontab -r
:清空当前用户的所有定时任务。crontab -u 用户名
:指定用户执行定时任务。crontab -r -u 用户名
:清空指定用户定时任务列表。
重点路径
- 定时任务配置文件
/etc/crontab
- 定时任务存放位置
/var/spool/cron
- 系统邮件的保存位置
/var/spool/mail
- 系统邮件产生的小文件保存位置
/var/spool/postfix/maildrop
邮件服务
postfix - 自动发送邮件
Postfix 是一款广泛应用于 Linux 及 Unix 系统的邮件传输代理(MTA)软件,它的设计初衷是替代传统的 Sendmail 软件,以提供更安全、高效且易于管理的邮件传输服务。
特点
- 安全性高:Postfix 采用多进程架构,每个进程权限最小化,降低了系统遭受攻击的风险。它还具备内置的安全机制,能够有效抵御邮件注入、拒绝服务等攻击。
- 性能卓越:Postfix 经过优化,在处理大量邮件时表现出色,能高效地完成邮件的接收、转发和投递任务。
- 易于配置:相比其他 MTA 软件,Postfix 的配置文件简洁易懂,配置过程相对简单,即使是新手也能快速上手。
- 兼容性良好:Postfix 可以与多种邮件客户端和其他邮件系统协同工作,确保邮件的正常收发。
重点关注
保存位置:linux下邮件的保存位置
/var/spool/mail/
有一个与指定收件名称相同的文件。小日志文件:如果关闭了定时任务,系统内有服务调用邮件不成功,就会产生一个小日志文件保存至:
/var/spool/postfix/maildrop
。设定好定时任务后要定时的清空此路径的文件rm -rf /var/spool/postfix/maildrop/*
系统安全及应用
账号安全控制
1. 非登录用户禁止登录
bash
# 查看所有非登录Shell用户(/sbin/nologin)
grep -E "/sbin/nologin|/bin/false" /etc/passwd
# 修改用户为不可登录状态
usermod -s /sbin/nologin username
chsh username # 交互
chsh -s /sbin/nologin username # 非交互
# 验证结果
grep username /etc/passwd
除了上述方法,也可以直接 vi 编辑/etc/passwd 文件进行修改
2. 锁定长期不登录账号
bash
# 查找30天未登录的活跃用户(需要lastlog命令)
lastlog -b 30 | awk 'NR>1 && $0 !~ /Never logged in/ {print $1}'
# 锁定账户(两种方式)
passwd -l username # 方法1:passwd锁定
usermod -L username # 方法2:usermod锁定
# 查看锁定状态
passwd -S username
除了上述方法,也可以直接 vi 编辑/etc/shadow 文件进行修改,密文前增加个”!”
3. 删除无用账号
bash
# 找出1年内未使用的账户(需安装acct包)
lastcomm --user --strict-mtime | awk '{print $1}' | sort -u > active_users.txt
comm -23 <(cut -d: -f1 /etc/passwd | sort) active_users.txt > candidates.txt
# 安全删除用户及主目录
userdel -r username
# 批量删除技巧(谨慎使用)
xargs -a inactive_users.txt -I {} sudo userdel -r {}
4. 为用户管理文件加锁
bash
# 设置不可变属性(需root权限)
chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow
# 验证属性
lsattr /etc/passwd
# 临时解除锁定(需要修改时)
chattr -i /etc/passwd
注意:锁定后即使是超户,也不能修改该文件,即不能创建、删除、修改用户信息。
5. 设置账号密码有效期
bash
# 全局策略设置(/etc/login.defs)
vim /etc/login.defs
ini
PASS_MAX_DAYS 90 # 密码最长有效期
PASS_MIN_DAYS 7 # 修改间隔最短天数
PASS_WARN_AGE 14 # 过期前提醒天数
bash
# 为现有用户设置策略
chage -M 90 -m 7 -W 14 username
passwd -x 90 username
# 查看有效期配置
chage -l username
# 强制下次登录修改密码
chage -d 0 username
限制历史操作记录
基础环境变量控制
bash
# 修改 ~/.bashrc 或 /etc/profile
export HISTSIZE=500 # 内存中保存的历史记录数量
export HISTFILESIZE=1000 # 历史文件最大记录数
export HISTCONTROL=ignorespace:ignoredups # 忽略空格开头命令和重复命令
export HISTIGNORE="pwd:ls:history" # 忽略指定命令记录
# 生效
source /etc/profile
增强审计配置
bash
# 记录完整命令时间戳
export HISTTIMEFORMAT="%F %T "
# 实时追加命令到历史文件
shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"
历史记录文件保护
bash
# 设置历史文件不可删除属性
chattr +a ~/.bash_history
# 修改历史文件权限(仅用户可读写)
chmod 600 ~/.bash_history
会话级控制方案
bash
# 当前会话禁用历史记录
unset HISTFILE
# 临时清空当前会话历史
history -c
Linux 终端自动注销配置指南
使用 TMOUT 环境变量
bash
# 全局设置(/etc/profile 或 /etc/bashrc)
export TMOUT=900 # 设置15分钟无操作超时(单位:秒)
readonly TMOUT # 防止用户修改
# 对当前用户设置(~/.bash_profile)
echo 'export TMOUT=300' >> ~/.bash_profile # 5分钟超时
SSH 服务端配置
bash
# 修改 /etc/ssh/sshd_config
ClientAliveInterval 600 # 10分钟检测一次
ClientAliveCountMax 0 # 不发送保持连接包
# 重启服务生效
sudo systemctl restart sshd
Linux 用户切换管理
基础切换 - su
bash
# 临时切换用户(不加载目标用户环境),不切换工作目录
su username
# 完全切换用户(加载完整环境)同时切换工作目录
su - username
su -l username # 等价写法
# 切换后返回原用户
exit
切换环境对比
命令 | 加载环境 | 继承变量 | 输入密码 | 家目录 | 适合场景 |
---|---|---|---|---|---|
su | ❌ | ✅ | 需要目标用户密码 | 不切换家目录 | 快速执行命令 |
su - | ✅ | ❌ | 需要目标用户密码 | 切换登录用户家目录 | 完整会话 |
sudo提权
bash
# 以root执行单条命令
sudo command
# 切换到root shell
sudo -i # 加载root环境
sudo -s # 保持当前环境
# 以其他用户执行
sudo -u username command
# 显示当前用户通过 sudo 可执行的命令列表
sudo -l
sudo提权配置
bash
visudo或者编辑/etc/sudoers
# 单用户权限:
username ALL=(ALL:ALL) /bin/ls, /bin/cat
# 组权限(需要将用户添加到组内)
%groupname ALL=(ALL) NOPASSWD: /sbin/reboot
visudo 用户与组权限字段深度解析
bash
用户/用户组 主机=(可切换的用户) NOPASSWD: 允许的命令
字段 | 示例值 | 必填 | 说明 |
---|---|---|---|
主体标识 | user1 或 %group | 是 | 用户直接写用户名,组需加% 前缀(如%developers ) |
主机限定 | ALL 或 host01 | 是 | 控制哪些服务器生效,ALL 表示所有主机 |
身份切换权限 | (target_user) | 否 | 括号内指定可切换的目标用户默认为 root ,冒号后可指定组(如(admin:admins) ) |
密码策略(可选) | NOPASSWD: | 否 | 加在命令前表示免密码,需注意冒号是必须的 |
命令路径 | /usr/bin/apt | 是 | 必须使用绝对路径,支持通配符(如/usr/bin/* ),ALL 表示所有命令。命令前加!表示排除此命令 |
用户级配置案例
bash
# 允许alice在所有主机以任何身份执行所有命令(需密码)
alice ALL=(ALL:ALL) ALL
# 允许bob在web01主机以www-data用户重启nginx(免密码)
bob web01=(www-data) NOPASSWD: /usr/bin/systemctl restart nginx
# 允许执行特定目录下脚本(排除危险命令)
charlie ALL=(root) /usr/local/scripts/*, !/usr/local/scripts/admin/*
# 允许使用apt但禁止删除操作
dave ALL=(root) /usr/bin/apt install *, !/usr/bin/apt remove *
组级配置
bash
# 允许sys组管理服务(需密码)
%sys ALL=(root) /usr/bin/systemctl *
# 允许dev组在开发机免密码部署
%dev dev-server=(deploy) NOPASSWD: /usr/bin/git pull, /usr/bin/make install
# 允许组内大部分命令但限制敏感操作
%team ALL=(ALL) ALL, !/usr/bin/passwd, !/bin/su
切换环境对比
命令 | 加载环境 | 继承变量 | 输入密码 | 家目录 | 适合场景 |
---|---|---|---|---|---|
su | ❌ | ✅ | 需要目标用户密码 | 不切换家目录 | 快速执行命令 |
su - | ✅ | ❌ | 需要目标用户密码 | 切换登录用户家目录 | 完整会话 |
sudo | ❌ | ✅ | 需要当前用户sudo密码 | 不切换家目录 | 临时提权 |
sudo su - | ✅ | ❌ | 需要当前用户sudo密码 | 切换root家目录 | 需要完整root环境时使用 |
sudo -i | ✅ | ❌ | 需要当前用户sudo密码 | 切换root家目录 | 管理员维护 |
sudo -u | ❌ | ✅ | 需要当前用户sudo密码 | 不切换家目录 | 以特定用户执行命令 |
重点说明
- 密码列:
su
系列需要知道目标用户密码sudo
系列需要当前用户在sudoers中且有sudo密码权限
- 家目录:
- 带
-
的命令会切换到家目录(如su -
、sudo -i
) - 不带
-
的保持当前目录
- 带
- 环境差异:
- 加载环境=✅:会读取目标用户的
.bashrc
等配置文件 - 继承变量=✅:会保留当前shell的环境变量
- 加载环境=✅:会读取目标用户的
sudo -u
场景:- 典型用法:
sudo -u www-data command
- 适合以服务账户身份执行命令
- 典型用法:
sudo su -
的特殊性:- 实际是先通过sudo提权,再执行su切换
- 比直接
su -
更安全(依赖sudo权限而非root密码)
总结
场景 | 配置示例 | 说明 |
---|---|---|
允许单个命令 | user ALL=(root) /usr/bin/apt update | 需密码 |
允许所有命令 | %admin ALL=(ALL) NOPASSWD: ALL | 免密码 |
限制用户身份 | user ALL=(mysql) /usr/bin/mysql | 必须 -u mysql |
禁止危险命令 | user ALL=(ALL) !/usr/bin/rm | 显式拒绝 |
超时免密码 | Defaults: user timestamp_timeout=30 | 30 分钟内免密码 |
终端登录安全控制
限制root登录多个终端
bash
vim /etc/securetty
# tty1
# tty2
# tty3
# tty4
# tty5
# tty6
# tty7
# tty8
# tty9
# tty10
# tty11
# ttyS0
禁止普通用户登录方法
bash
# 删除/etc/nologin 这个空文件即可恢复。
touch /etc/nologin
BIOS 引导设置
- 调整盘的启动顺序
- 禁止其他设备(光盘、U 盘、网络)引导系统
- 将安全级别设为 setup,并设置管理员密
禁用热键Ctrl+Alt+Del(重启)
bash
vi 编辑 vi /etc/inittab
在行首加#注解禁用
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
grub 菜单加密及密码清除
bash
# 设置密码
grub2-setpassword
Enter password:密码
Confirm password:确认密码
# 清除密码(不输入密码)
grub2-setpassword
Enter password:
Confirm password:
弱口令检测 JR
JR(Joth the Ripper)简介
- 一款密码分析工具,支持字典式的暴力破解
- 通过对 shadow 文件的口令分析,可以检测密码
- 官方网站:http://www.openwall.com/john/
常见的 John 密码碰撞提权方法
- 通过获取 /etc/shadow 文件:在 Linux 系统中,用户的密码哈希值通常保存在 /etc/shadow 文件中。如果攻击者能够读取到该文件,便可以使用 John the Ripper 等工具进行密码破解。
- 使用字典攻击:如果密码设置简单或基于常见的单词,John the Ripper 可以通过字典攻击快速猜解密码。字典攻击是基于预先构建的常见密码列表来进行尝试。
- 暴力破解:如果密码较为复杂,可以使用暴力破解法尝试所有可能的字符组合来解锁密码,尽管这个过程可能需要较长的时间。
安装 JR 工具
bash
# 下载安装包
wget https://www.openwall.com/john/k/john-1.9.0.tar.gz
# 安装依赖
dnf -y install gcc gcc-c++
# 解压
tar xf john-1.8.0.tar.gz
# 进入源码文件中
cd john-1.8.0/src/
# 安装
make clean linux-x86-64
基本破解流程
bash
# 进入执行文件
cd ../run
# 提取shadown文件
cp /etc/shadown ./shadown.txt
# 密码破解
./john hashes.txt
使用案例
bash
# 查看破解后的密码
./john --show shadow.txt
# 清空破解密码字典(适用于更新后的密码文件重新破解)
> john.pot
# 破解任务执行中可以查看状态
./john --status
资源文件
文件名 | 作用 |
---|---|
run/password.lst | 默认字典文件 |
run/john | 用户运行时生成的文件 |
run/password.lst | 破解模式文件 |
run/john.conf | 配置文件 |
run/password.lst | 密码库 |
run/john.log | 日志文件 |
典型工作流程
- 读取
john.conf
加载配置 - 从
john/
加载资源 - 在
~/.john/
生成会话文件 - 最终结果写入
john.pot
防御措施
- 使用强密码:复杂且长的密码,包含字母、数字和符号。
- 高盐值与多迭代:使用强加密算法(如 SHA-256),并增加盐值和迭代次数。
- 禁用弱哈希算法:不使用 MD5 或 SHA-1,改用 bcrypt 或 PBKDF2。
- 限制 sudo 权限:仅授予必要的权限。
- 启用多因素认证:增加登录安全层。
- 定期更换密码并审计日志:加强密码更新和行为监控。
端口检测 NMAP
NMAP 简介
- 一款强大的网络扫描、安全检测工具
- 官方网站:http://nmap.org/
- 可从yum中安装 nmap
概念解释
Nmap(Network Mapper)是Linux下最强大的网络扫描工具之一,主要用于:
- 主机发现(哪些设备在线)
- 端口扫描(哪些服务开放)
- 版本检测(服务/操作系统版本)
- 网络安全审计
工作流程
mermaid
sequenceDiagram
Nmap->>Target: ICMP Echo + TCP SYN/ACK
alt 目标响应
Target-->>Nmap: 主机在线确认
Nmap->>Target: 端口扫描
else 无响应
Nmap->>Log: 标记为离线
end
NMAP 语法
bash
nmap [扫描类型] [选项] <扫描目标>
选项
选项 | 描述 | 示例 |
---|---|---|
-sS | TCP SYN扫描(半开扫描) | nmap -sS 192.168.1.1 |
-sT | TCP连接扫描 | nmap -sT example.com |
-sU | UDP扫描 | nmap -sU 192.168.1.1 |
-O | 操作系统检测 | nmap -O 192.168.1.1 |
-sV | 服务版本检测 | nmap -sV 192.168.1.1 |
-p <端口范围> | 指定端口范围 | nmap -p 1-1000 192.168.1.1 |
-A | 激进模式(OS检测+版本检测+脚本扫描) | nmap -A 192.168.1.1 |
-T<0-5> | 设置时间模板(0最慢,5最快) | nmap -T4 192.168.1.1 |
--script <脚本> | 使用NSE脚本 | nmap --script vuln 192.168.1.1 |
-v | 增加详细程度 | nmap -v 192.168.1.1 |
基础操作演示
bash
nmap 192.168.1.1 # 扫描单个IP
nmap 192.168.1.1-100 # 扫描IP范围
nmap scanme.nmap.org # 扫描域名
nmap -sS 192.168.1.1 # SYN扫描(半开放扫描)
nmap -sV 192.168.1.1 # 服务版本检测
nmap -O 192.168.1.1 # 操作系统检测
nmap -A 192.168.1.1 # 全面扫描(包含以上所有)
# 快速扫描常用端口
nmap -F 192.168.1.1
# 完整扫描(包括OS和服务版本检测)
nmap -A -T4 192.168.1.1
# 扫描特定端口范围
nmap -p 20-80,443,8080 192.168.1.1
# 使用脚本扫描漏洞
nmap --script vuln 192.168.1.1
# 扫描整个子网
nmap 192.168.1.0/24
# 调整并行主机数
nmap --min-parallelism 10 192.168.1.0/24
防火墙
Firewalld
是许多现代 Linux 发行版(如 CentOS 7 及更高版本、Fedora 等)上的默认防火墙管理工具。它支持动态更新技术,可以在不影响现有连接的情况下更新防火墙规则,并提供了丰富的区域(zone)概念,可对不同区域内的网络流量应用不同的规则。
防火墙操作
bash
# 查看防火墙操状态
systemctl status firewalld
# 关闭防火墙
systemctl stop firewalld
# 关闭开机自启动
systemctl enable firewlld
SELinux
ELinux(Security-Enhanced Linux)是 Linux 系统中的一个安全子系统,提供了基于策略的强制访问控制(MAC)
SELinux 的工作模式
- Enforcing(强制模式) :这是 SELinux 的默认工作模式,在这种模式下,SELinux 会强制执行其安全策略,阻止不符合策略的访问请求,并记录相关事件到日志文件中。
- Permissive(宽容模式) :在该模式下,SELinux 不会强制执行安全策略,但会记录所有不符合策略的访问请求。这有助于系统管理员了解在强制模式下可能会被阻止的操作,而不会对系统实际运行产生影响。
- Disabled(禁用模式) :完全禁用 SELinux。在某些情况下,如果 SELinux 导致应用程序运行出现问题,可能会选择禁用它。但出于安全考虑,不建议在生产环境中禁用 SELinux。
配置 SELinux
bash
# 查看状态
sestatus
修改配置文件
SELinux 的主要配置文件通常位于/etc/selinux/config
。在这个文件中,可以设置 SELinux 的工作模式。修改配置文件后,需要重启系统才能使更改生效。
bash
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
使用命令行工具
可以使用setenforce
命令临时更改 SELinux 的工作模式。这种方法不会修改配置文件,系统重启后 SELinux 将恢复为配置文件中指定的模式。
bash
# 强制模式
setenforce 1
# 宽容模式
setenforce 0
# 显示当前模式
getenforce