Skip to content

引导过程与服务控制

开机引导过程

  1. BIOS/UEFI 初始化阶段

    • 硬件自检(POST):电源接通后,主板固件(BIOS/UEFI)执行硬件检测
    • 固件初始化:初始化硬件设备,建立硬件列表
  2. mbr引导加载程序阶段

    根据第一个硬盘,第一个扇区的MBR中2字节校验,加载64字节分区列表,加载446字节主引导记录,找出操作系统所在的分区,直接把系统控制权移交给包含系统引导文件的分区。调用GRUB菜单。

    三种启动模式

    • 本地硬盘启动
    • 移动硬盘启动
    • network网络启动
  3. 加载grub菜单

    系统控制权交给GRUB之后,显示启动菜单供用户选择。

    选择完系统之后,系统控制权会交给所选的操作系统的内核文件。

    centos7使用grub2作为引导器/boot/grub2/grub.cfg

  4. 加载内核启动进程

    进程分为父进程和子进程。id=1是整个系统的父进程,父进程可以杀死子进程,子进程无法杀死父进程。

    Linux采用的是写时复制技术,多个进程需要访问相同资源时,内核不会立即为每个进程创建副本,而是让它们共享同一份资源,只有当某个进程尝试修改共享资源时,内核才会为该进程创建真正的独立副本。

  5. 系统初始化

    准备其它进程的运行环境

  6. 读取开机模式(7种运行模式)

  7. 执行初始化脚本

  8. 查看当前启动服务

  9. 执行个人配置脚本(/etc/rc.d/rc.local)

  10. 正常开机

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 扇区故障示例:

  1. 添加一块新的硬盘/dev/sdb

  2. 格式化新硬盘/dev/sdb

    bash
    mkfs.ext4 /dev/sdb
  3. 挂载到/backup

    bash
    mkdir /backup && mount /dev/sdb /backup
  4. 将mbr备份文件拷贝到新硬盘

    bash
    dd if=/dev/sda of=/mnt/mbr count=1 bs=512 	# 将mbr备份文件拷贝到新硬盘
  5. 模拟破坏mbr

    bash
    dd if=/dev/zero of=/dev/sda count=1 bs=512		# 向/dev/sda的前512字节写0覆盖原来内容
    hexdump -C -n 512 /dev/sda 						# 查看前512字节
  6. 进入急救模式恢复mbr

    • reboot重启后,选择Troubleshooting,再选择Rescue a CentOS system,最后选择Continue后,进入急救模式,输入1

    • 将备份文件拷贝到/dev/sda

      bash
      mkdir bak 						# 新建文件夹
      mount /dev/sdb1 bak 			# 将存有备份文件的硬盘挂载到新建文件夹下
      dd if=bak/mbr of=/dev/sda 		# 将备份文件添加到原本的目录下
      hexdump -C -n 512 /dev/sda 		# 查看到/dev/sda前512字节已恢复

      重启即可正常使用系统

忘记root密码

CentOS7

  1. 进入系统时选择内核界面,选中第一个选项并按e

  2. 将光标移动到Linux开头行的最后,添加rd.break,然后ctrl+x运行,进入单用户模式

  3. 进入单用户模式后,重新挂载并添加读写权限,然后切换到系统的根修改密码

    bash
    mount -o remount,rw /sysroot 	# 重新挂载并添加读写权限
    chroot /sysroot 				# 从光盘的根切换到主机系统的根
    passwd 用户名					  # 修改密码
    touch /.autorelabel				# 如果开启selinux需重新打上标记
    exit 							# 退出
    reboot							# 重启

openEuler

  1. 进入系统时选择内核界面,选中第一个选项并按e
  2. 输入账号root
  3. 输入初试密码openEuler#12
  4. 在linux开头行的root=/dev/Mapper/openeuler-root后面追加rw
  5. 在linux开头行的行尾添加init=/bin/bash
  6. Ctrl + XF10 启动系统。
  7. 修改密码echo "123456" | passwd --stdin root
  8. 如果开启selinux需重新打上标记touch ./autorelabel
  9. 重启exec /sbin/init

Ubuntu

  1. 在启动时,在GRUB菜单出现时按下Shift或Esc键来进入GRUB菜单
  2. e键进入
  3. 在linux开头的行尾添加 rw init=/bin/bash,然后按Ctrl + XF10来启动系统
  4. 重置密码passwd username
  5. 重启服务器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. 各字段详解

  1. 设备标识
    • 可以是设备文件路径(如 /dev/sda1
    • UUID(如 UUID=xxxx-xxxx
    • 卷标(如 LABEL=ROOT
  2. 挂载点:文件系统中挂载位置的绝对路径
  3. 文件系统类型
    • ext4, xfs, btrfs 等本地文件系统
    • nfs, cifs 等网络文件系统
    • swap 用于交换分区
    • auto 自动检测
  4. 挂载选项
    • defaults:默认选项(rw,suid,dev,exec,auto,nouser,async)
    • ro/rw:只读/读写
    • noexec:禁止执行
    • nofail:启动时不报告错误
    • 多个选项用逗号分隔
  5. dump备份标志
    • 0:不备份
    • 1:需要备份
  6. 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的系统:

  1. 确保服务已启用:

    bash
    systemctl enable rc-local.service
  2. 创建/etc/rc.local文件并添加可执行权限:

    bash
    chmod +x /etc/rc.local
  3. 检查服务状态:

    bash
    systemctl status rc-local.service

主要区别

特性/etc/fstab/etc/rc.local
主要用途定义文件系统挂载信息执行自定义启动脚本
执行时机系统启动早期阶段系统启动后期阶段
配置格式结构化字段(6列)Shell脚本格式
现代替代方案仍然是标准配置方式被systemd服务单元取代
必要性系统关键文件可选功能

最佳实践建议

  1. 对于fstab
    • 优先使用UUID而非设备路径(如/dev/sda1),因为设备路径可能变化
    • 对非关键文件系统使用nofail选项,避免启动失败
    • 测试新条目前先使用mount -o remount而非重启
  2. 对于rc.local
    • 在现代系统中,考虑使用systemd服务单元替代
    • 确保脚本中的命令是幂等的(可重复执行而不产生副作用)
    • 长时间运行的任务应使用&放入后台或使用nohup
    • 添加适当的日志记录
  3. 通用建议
    • 修改前备份原始文件
    • 使用版本控制系统管理重要配置文件
    • 测试更改前确保有恢复方法

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.servicebar.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

重点说明

  • 修改单元文件后,必须重新加载

    bash
    systemctl daemon-reload

进程管理

进程基本概念

  • 程序:程序是存储在磁盘上的静态可执行文件(如二进制文件或脚本),包含完成特定任务的指令和数据。
  • 进程:操作系统进行资源分配和调度的基本单位。每个进程拥有独立的内存空间(包括代码段、数据段、堆栈段等),相当于一个正在运行的程序实例。
  • 线程:进程内的执行单元,属于CPU调度的最小单位。同一进程中的多个线程共享进程的资源(如内存、文件句柄),但每个线程有独立的程序计数器、栈空间和寄存器状态。每个进程最大有65535个新线程。
  • 守护进程:守护进程是一种长期运行的后台进程,通常在系统启动时启动,独立于终端(不与用户直接交互),用于提供系统服务。比如web服务nginx,系统监听端口80,当有用户请求时,父进程会分配子进程处理,处理完后以服务形式持续运行。
  • 僵尸进程:僵尸进程是已经终止但未被父进程回收资源的进程。(父进程停止,子进程未停止)
  • PID (Process ID):每个进程的唯一标识号
  • PPID (Parent Process ID):父进程的 ID
  • UID/GID:进程所属用户和组
概念状态资源占用生命周期典型示例
程序静态文件磁盘空间永久存储/bin/ls
进程动态执行CPU/内存启动到终止ls -l 运行时
线程动态执行共享资源程序执行完毕ps -eLf
守护进程后台运行常驻内存系统启动到关闭sshdnginx
僵尸进程已终止但未回收资源父进程调用 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,除非手动调整过进程优先级(如 nicerenice 命令)。
    • 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%)说明物理主机资源竞争激烈(常见于云服务器)。
  • 第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:优先级
  • NInice 值(-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% 是主要活跃部分(如应用代码、服务)。

后续建议

  1. 如果 us 长期偏高
    • 使用 top -cps aux --sort=-%cpu 定位高 CPU 进程。
    • 分析是否需优化代码或扩容。
  2. 如果 sy 偏高
    • 检查内核日志(dmesg)或使用 perf 工具分析系统调用。
  3. 如果 wa 突然增高
    • 排查磁盘性能(iostat -x)或数据库慢查询。
  4. 监控工具推荐
    • 实时监控:glanceshtop
    • 历史记录: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 average1/5/15分钟平均负载

2.任务状态区 - Tasks

字段含义
total总进程数
running正在运行的进程
sleeping等待资源的进程
zombie僵尸进程(需警惕)

3.CPU 状态行 - %Cpu(s)

缩写全称说明
ususer用户空间进程占用
sysystem内核空间进程占用
ididleCPU 空闲率
waiowaitI/O 等待占比(>5% 需检查磁盘)
ststeal虚拟机被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脚本:

    bash
    at 3pm tomorrow
    at> /home/user/script.sh
    at> <EOT>
  • 也可以将命令写入文件,然后使用at -f选项指定文件。例如,将命令写入job.txt文件,在后天晚上 8 点执行:

    bash
    at -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
主机限定ALLhost01控制哪些服务器生效,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密码不切换家目录以特定用户执行命令

重点说明

  1. 密码列
    • su系列需要知道目标用户密码
    • sudo系列需要当前用户在sudoers中且有sudo密码权限
  2. 家目录
    • -的命令会切换到家目录(如su -sudo -i
    • 不带-的保持当前目录
  3. 环境差异
    • 加载环境=✅:会读取目标用户的.bashrc等配置文件
    • 继承变量=✅:会保留当前shell的环境变量
  4. sudo -u场景
    • 典型用法:sudo -u www-data command
    • 适合以服务账户身份执行命令
  5. 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=3030 分钟内免密码

终端登录安全控制

限制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日志文件

典型工作流程

  1. 读取john.conf加载配置
  2. john/加载资源
  3. ~/.john/生成会话文件
  4. 最终结果写入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 [扫描类型] [选项] <扫描目标>

选项

选项描述示例
-sSTCP SYN扫描(半开扫描)nmap -sS 192.168.1.1
-sTTCP连接扫描nmap -sT example.com
-sUUDP扫描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