Linux 运维学习思维导图
以下是针对 运维工程师培训对象 的 Linux 学习思维导图,重点突出运维工作中常用的 Linux 知识和技能:
1. Linux 基础
Linux 简介
开源操作系统
常见发行版(Ubuntu, CentOS, Red Hat, Debian)
1.1 文件系统
目录结构(/bin, /etc, /home, /var, /root)
|
目录
|
描述
|
|
根目录 (/)
|
所有文件和目录的起点,是整个文件系统层次结构的根目录
|
|
/bin
|
基本用户命令二进制文件
|
|
/boot
|
启动加载程序和内核文件
|
|
/dev
|
设备文件
|
|
/etc
|
系统配置文件
|
|
/home
|
用户主目录
|
|
/lib
|
系统库文件
|
|
/media
|
可移动媒体挂载点
|
|
/mnt
|
临时挂载点
|
|
/opt
|
可选应用程序软件包
|
|
/proc
|
进程和内核信息
|
|
/root
|
根用户的主目录
|
|
/run
|
运行时数据
|
|
/sbin
|
系统管理命令二进制文件
|
|
/srv
|
服务数据
|
|
/tmp
|
临时文件
|
|
/usr
|
用户程序和只读数据
|
|
/var
|
可变数据文件
|
图示

文件系统类型
ext4
最常用的Linux文件系统
XFS
高性能文件系统
Btrfs
支持快照和压缩
ZFS
高级文件系统,支持数据完整性检查
FAT32/NTFS
Windows兼容文件系统
文件系统选择建议

点击图片可查看完整电子表格
参考:linux_kernel_wiki/文章/文件系统/Linux文件系统详解.md at main · 0voice/linux_kernel_wiki
1.2 文件权限(chmod, chown, chgrp)
在Linux系统中,文件权限是用于控制用户对文件或目录的访问权限的机制。每个文件和目录都有三组权限,分别对应以下三种用户:
所有者(Owner):文件或目录的创建者。
所属组(Group):文件或目录所属的用户组。
其他用户(Others):既不是所有者,也不在所属组中的其他用户。
权限类型
每个用户组有三种权限:
读(r):允许读取文件内容或列出目录中的文件。
写(w):允许修改文件内容或在目录中创建、删除文件。
执行(x):允许执行文件或进入目录。
权限表示
权限可以用两种方式表示:
符号表示法:
r:读权限
w:写权限
x:执行权限
-:无权限
例如,rwxr-xr-- 表示:
所有者有读、写、执行权限(rwx)
所属组有读、执行权限(r-x)
其他用户只有读权限(r--)
数字表示法:
读权限(r)对应数字 4
写权限(w)对应数字 2
执行权限(x)对应数字 1
无权限对应数字 0
每组权限的数字是权限值的总和。例如:
rwx = 4 + 2 + 1 = 7
r-x = 4 + 0 + 1 = 5
r-- = 4 + 0 + 0 = 4
因此,rwxr-xr-- 用数字表示法就是 754
查看文件权限
使用 ls -l 命令可以查看文件或目录的权限:
输出示例:
|
Plain Text -rwxr-xr-- 1 user group 4096 Oct 1 12:34 filename
|
第一个字符 - 表示这是一个普通文件(d 表示目录,l 表示符号链接)。
接下来的九位字符表示权限:rwxr-xr--。
1 表示硬链接数。
user 是文件的所有者。
group 是文件的所属组。
4096 是文件大小(字节)。
Oct 1 12:34 是文件的最后修改时间。
filename 是文件名。
修改文件权限
使用 chmod 命令可以修改文件或目录的权限。
符号表示法:
|
Bash chmod u+x filename # 给所有者添加执行权限 chmod g-w filename # 移除所属组的写权限 chmod o=r filename # 设置其他用户的权限为只读 chmod a+x filename # 给所有用户添加执行权限
|
数字表示法:
|
Bash chmod 754 filename # 设置权限为 rwxr-xr--
|
修改文件所有者和所属组
使用 chown 命令可以修改文件的所有者和所属组:
|
Bash chown user:group filename # 修改所有者和所属组 chown user filename # 仅修改所有者 chown :group filename # 仅修改所属组
|
使用 chgrp 命令可以仅修改文件的所属组:
特殊权限
除了基本的读、写、执行权限外,Linux 还有一些特殊权限:
SUID(Set User ID):当文件被执行时,进程的所有者变为文件的所有者,而不是执行者。用 s 表示,数字表示为 4。
SGID(Set Group ID):当文件被执行时,进程的所属组变为文件的所属组。用 s 表示,数字表示为 2。
Sticky Bit:仅允许文件的所有者或 root 用户删除文件。用 t 表示,数字表示为 1。
设置特殊权限:
|
Bash chmod u+s filename # 设置 SUID chmod g+s filename # 设置 SGID chmod +t filename # 设置 Sticky Bit
|
数字表示法:
|
Bash chmod 4755 filename # 设置 SUID chmod 2755 filename # 设置 SGID chmod 1755 filename # 设置 Sticky Bit
|
总结
Linux 文件权限是系统安全的重要组成部分,合理设置权限可以有效保护文件和目录的安全。通过 ls -l、chmod、chown 等命令,可以查看和修改文件权限。
1.3 文件类型(普通文件、目录、符号链接、设备文件)
在Linux系统中,文件类型是用于标识文件种类的一种机制。Linux系统中的文件类型不仅仅包括普通文件和目录,还包括设备文件、符号链接、管道文件等。文件类型可以通过 ls -l 命令的输出中的第一个字符来识别。
常见的文件类型
普通文件(Regular File)
标识符:-
描述:普通文件是最常见的文件类型,包括文本文件、二进制文件、图像文件等。
示例:
|
Bash -rw-r--r-- 1 user group 4096 Oct 1 12:34 example.txt
|
目录(Directory)
标识符:d
描述:目录是一种特殊类型的文件,用于存储其他文件和目录。
示例:
|
Bash drwxr-xr-x 2 user group 4096 Oct 1 12:34 mydir
|
符号链接(Symbolic Link)
标识符:l
描述:符号链接是指向另一个文件的快捷方式。它类似于Windows中的快捷方式。
示例:
|
Bash lrwxrwxrwx 1 user group 10 Oct 1 12:34 mylink -> example.txt
|
字符设备文件(Character Device File)
标识符:c
描述:字符设备文件用于访问字符设备,如键盘、鼠标等。这些设备以字符为单位进行数据传输。
示例:
|
Bash crw-rw-rw- 1 root root 1, 3 Oct 1 12:34 /dev/null
|
块设备文件(Block Device File)
标识符:b
描述:块设备文件用于访问块设备,如硬盘、USB驱动器等。这些设备以数据块为单位进行数据传输。
示例:
|
Bash brw-rw---- 1 root disk 8, 0 Oct 1 12:34 /dev/sda
|
管道文件(Named Pipe)
标识符:p
描述:管道文件用于进程间通信。一个进程可以向管道写入数据,另一个进程可以从管道读取数据。
示例:
|
Bash prw-r--r-- 1 user group 0 Oct 1 12:34 mypipe
|
套接字文件(Socket)
标识符:s
描述:套接字文件用于网络通信和进程间通信。
示例:
|
Bash srwxr-xr-x 1 user group 0 Oct 1 12:34 mysocket
|
查看文件类型
可以使用 ls -l 命令查看文件类型。文件类型显示在权限字符串的第一个字符。
输出示例:
|
Plain Text -rw-r--r-- 1 user group 4096 Oct 1 12:34 example.txt drwxr-xr-x 2 user group 4096 Oct 1 12:34 mydir lrwxrwxrwx 1 user group 10 Oct 1 12:34 mylink -> example.txt crw-rw-rw- 1 root root 1, 3 Oct 1 12:34 /dev/null brw-rw---- 1 root disk 8, 0 Oct 1 12:34 /dev/sda prw-r--r-- 1 user group 0 Oct 1 12:34 mypipe srwxr-xr-x 1 user group 0 Oct 1 12:34 mysocket
|
使用 file 命令查看文件类型
file 命令可以更详细地显示文件类型和内容信息。
输出示例:
|
Bash example.txt: ASCII text mydir: directory mylink: symbolic link to example.txt /dev/null: character special /dev/sda: block special mypipe: fifo (named pipe) mysocket: socket
|
总结
Linux系统中的文件类型多种多样,每种类型都有其特定的用途。通过 ls -l 和 file 命令,可以方便地查看和识别文件类型。理解这些文件类型对于系统管理和文件操作非常重要。
1.4 基本命令
1.4.1 文件操作(ls, cd, cp, mv, rm, touch)
在Linux系统中,文件操作是日常任务的重要组成部分。以下是一些常用的文件操作命令及其用法:
1. ls - 列出目录内容
ls 命令用于列出目录中的文件和子目录。
常用选项:
-l:以长格式显示文件信息(包括权限、所有者、大小、修改时间等)。
-a:显示所有文件,包括隐藏文件(以 . 开头的文件)。
-h:与 -l 一起使用,以人类可读的格式显示文件大小(如 KB、MB)。
-R:递归列出子目录中的内容。
示例:
|
Bash ls -l /home/user # 列出 /home/user 目录的详细信息 ls -a /home/user # 列出 /home/user 目录的所有文件,包括隐藏文件 ls -lh /home/user # 以人类可读的格式列出 /home/user 目录的详细信息 ls -R /home/user # 递归列出 /home/user 目录及其子目录的内容
|
2. cd - 切换目录
cd 命令用于切换当前工作目录。
常用用法:
cd directory:切换到指定目录。
cd ..:切换到上一级目录。
cd ~ 或 cd:切换到当前用户的主目录。
cd -:切换到上一次所在的目录。
示例:
|
Bash cd /home/user # 切换到 /home/user 目录 cd .. # 切换到上一级目录 cd ~ # 切换到当前用户的主目录 cd - # 切换到上一次所在的目录
|
3. cp - 复制文件或目录
cp 命令用于复制文件或目录。
常用选项:
-r 或 -R:递归复制目录及其内容。
-i:在覆盖文件前提示确认。
-v:显示详细的复制过程。
示例:
|
Bash cp file1.txt file2.txt # 复制 file1.txt 到 file2.txt cp -r dir1 dir2 # 递归复制 dir1 目录到 dir2 cp -i file1.txt /home/user # 复制 file1.txt 到 /home/user,覆盖前提示确认 cp -v file1.txt file2.txt # 显示详细的复制过程
|
4. mv - 移动或重命名文件或目录
mv 命令用于移动或重命名文件或目录。
常用选项:
-i:在覆盖文件前提示确认。
-v:显示详细的移动过程。
示例:
|
Bash mv file1.txt file2.txt # 将 file1.txt 重命名为 file2.txt mv file1.txt /home/user # 将 file1.txt 移动到 /home/user 目录 mv -i file1.txt /home/user # 移动 file1.txt 到 /home/user,覆盖前提示确认 mv -v file1.txt file2.txt # 显示详细的移动过程
|
5. rm - 删除文件或目录
rm 命令用于删除文件或目录。
常用选项:
-r 或 -R:递归删除目录及其内容。
-f:强制删除,不提示确认。
-i:在删除前提示确认。
-v:显示详细的删除过程。
示例:
|
Bash rm file1.txt # 删除 file1.txt rm -r dir1 # 递归删除 dir1 目录及其内容 rm -i file1.txt # 删除 file1.txt 前提示确认 rm -f file1.txt # 强制删除 file1.txt,不提示确认 rm -v file1.txt # 显示详细的删除过程
|
6. touch - 创建空文件或更新文件时间戳
touch 命令用于创建空文件或更新文件的访问和修改时间戳。
常用选项:
-a:仅更新访问时间。
-m:仅更新修改时间。
-c:如果文件不存在,不创建新文件。
示例:
|
Bash touch file1.txt # 创建空文件 file1.txt,如果文件已存在则更新其时间戳 touch -a file1.txt # 仅更新 file1.txt 的访问时间 touch -m file1.txt # 仅更新 file1.txt 的修改时间 touch -c file1.txt # 如果 file1.txt 不存在,不创建新文件
|
总结
这些命令是Linux系统中文件操作的基础工具。通过熟练掌握 ls、cd、cp、mv、rm 和 touch 命令,可以高效地管理和操作文件和目录。
1.4.2 文本处理(cat, grep, awk, sed)
文本处理是运维工程师的核心技能之一,常用于日志分析、配置修改、数据提取等场景。以下是 cat、grep、awk、sed 四大工具的详细用法及实战示例。
一、cat:文件查看与合并
核心用途
查看文件内容:cat file.log
合并多个文件:cat file1 file2 > merged_file
创建临时文件:cat > newfile.txt(输入内容后按 Ctrl+D 保存)
常用选项
-n:显示行号
|
Bash cat -n error.log # 查看日志并标注行号
|
-A:显示所有字符(包括换行符、制表符等)
-s:压缩连续空行为一行
典型场景
快速查看日志尾部内容(结合 tail):
|
Bash cat access.log | tail -n 50 # 查看最后50行
|
合并多个日志文件:
|
Bash cat *.log > all_logs.txt
|
二、grep:文本搜索
核心用途
过滤包含关键词的行:grep "ERROR" app.log
反向匹配(排除关键词):grep -v "INFO" app.log
递归搜索目录:grep -r "404" /var/log/nginx/
常用选项
-i:忽略大小写
|
Bash grep -i "error" app.log # 匹配 Error/ERROR/error
|
-C NUM:显示匹配行的上下文(前后NUM行)
|
Bash grep -C 3 "Timeout" app.log # 显示匹配行及其前后3行
|
-E:启用扩展正则表达式(等价于 egrep)
|
Bash grep -E "ERR|WARN" app.log # 匹配 ERR 或 WARN
|
典型场景
统计错误出现次数:
|
Bash grep -c "Connection refused" app.log
|
提取特定进程的日志:
|
Bash ps aux | grep nginx # 查找Nginx进程
|
三、awk:文本分析与处理
核心用途
按列处理结构化文本(默认以空格或制表符分隔)
|
Bash awk '{print $1, $3}' access.log # 输出第1列和第3列
|
条件过滤与计算
|
Bash awk '$4 > 500 {print $0}' access.log # 输出第4列大于500的行
|
常用语法
-F:指定分隔符
|
Bash awk -F ',' '{print $2}' data.csv # 按逗号分隔,输出第2列
|
BEGIN/END:预处理和后处理
|
Bash awk 'BEGIN {sum=0} {sum+=$1} END {print sum}' data.txt # 计算第1列总和
|
内置变量:NR(行号)、NF(列数)、$0(整行)
|
Bash awk 'NR==10' file.txt # 输出第10行
|
典型场景
统计HTTP状态码分布:
|
Bash awk '{print $9}' access.log | sort | uniq -c
|
提取日志时间段内容:
|
Bash awk '/2023-10-25 14:00:00/,/2023-10-25 15:00:00/' app.log
|
四、sed:流编辑器
核心用途
文本替换:sed 's/old/new/g' file.txt
删除行:sed '3d' file.txt(删除第3行)
插入/追加文本:sed '2i\插入内容' file.txt
常用选项
-i:直接修改文件(慎用!建议先备份)
|
Bash sed -i.bak 's/foo/bar/g' config.conf # 修改前生成备份文件config.conf.bak
|
-n:静默模式(仅显示处理后的内容)
|
Bash sed -n '5,10p' file.txt # 仅输出5-10行
|
正则表达式匹配:
|
Bash sed '/^#/d' config.conf # 删除所有注释行(以#开头)
|
典型场景
批量替换配置文件中的IP地址:
|
Bash sed -i 's/192.168.1.100/192.168.1.200/g' *.conf
|
删除空白行:
五、组合使用示例
1. 提取日志中的错误并统计
|
Bash grep "ERROR" app.log | awk '{print $5}' | sort | uniq -c
|
步骤解析:
grep 过滤出所有包含 "ERROR" 的行
awk 提取第5列(假设错误类型在第5列)
sort | uniq -c 统计每种错误出现次数
2. 批量修改配置文件并备份
|
Bash sed -i.bak 's/old_port=8080/new_port=80/g' /etc/service/*.cfg
|
说明:替换所有 .cfg 文件中的端口号,并生成 .bak 备份文件
3. 分析Nginx访问日志的Top 10 IP
|
Bash awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10
|
步骤解析:
awk 提取客户端IP(第1列)
sort | uniq -c 统计IP出现次数
sort -nr 按次数倒序排列
head 取前10名
六、注意事项
备份文件:使用 sed -i 或直接修改文件前,务必先备份。
正则表达式:特殊字符需转义(如 * 需写成 \*)。
性能优化:处理大文件时避免频繁管道操作,可优先使用 awk 或 sed 单命令完成。
权限问题:确保对目标文件有读写权限。
附:命令速查表
|
Bash # 查看文件内容 cat file.log | less
# 搜索并高亮关键词 grep --color=auto "ERROR" app.log
# 提取最后一列(字段数不确定时) awk '{print $NF}' file.txt
# 替换多个模式 sed -e 's/foo/bar/g' -e 's/hello/world/g' file.txt
# 统计文件行数 awk 'END {print NR}' file.txt
|
掌握这些命令及其组合,可大幅提升运维工作中的文本处理效率!
1.4.3 压缩与解压(tar, gzip, zip)
在Linux系统中,压缩和解压缩文件是常见的操作。以下是几种常用的压缩和解压缩工具及其用法:
1. tar - 打包和解包文件
tar 命令用于将多个文件或目录打包成一个文件(通常称为 tarball),也可以用于解包。
常用选项:
-c:创建新的归档文件。
-x:解包归档文件。
-v:显示详细的处理过程。
-f:指定归档文件名。
-z:通过 gzip 压缩或解压缩。
-j:通过 bzip2 压缩或解压缩。
-J:通过 xz 压缩或解压缩。
示例:
|
Bash tar -cvf archive.tar file1.txt file2.txt # 将 file1.txt 和 file2.txt 打包成 archive.tar tar -xvf archive.tar # 解包 archive.tar tar -czvf archive.tar.gz file1.txt file2.txt # 将 file1.txt 和 file2.txt 打包并用 gzip 压缩 tar -xzvf archive.tar.gz # 解压并解包 archive.tar.gz tar -cjvf archive.tar.bz2 file1.txt file2.txt # 将 file1.txt 和 file2.txt 打包并用 bzip2 压缩 tar -xjvf archive.tar.bz2 # 解压并解包 archive.tar.bz2 tar -cJvf archive.tar.xz file1.txt file2.txt # 将 file1.txt 和 file2.txt 打包并用 xz 压缩 tar -xJvf archive.tar.xz # 解压并解包 archive.tar.xz
|
2. gzip - 压缩文件
gzip 命令用于压缩文件,生成 .gz 文件。
常用选项:
-d:解压缩文件。
-v:显示详细的压缩过程。
-k:保留原始文件。
示例:
|
Bash gzip file1.txt # 压缩 file1.txt,生成 file1.txt.gz gzip -d file1.txt.gz # 解压缩 file1.txt.gz gzip -v file1.txt # 压缩 file1.txt 并显示详细信息 gzip -k file1.txt # 压缩 file1.txt 并保留原始文件
|
3. gunzip - 解压缩 .gz 文件
gunzip 命令用于解压缩 .gz 文件。
常用选项:
-v:显示详细的解压缩过程。
-k:保留原始文件。
示例:
|
Bash gunzip file1.txt.gz # 解压缩 file1.txt.gz gunzip -v file1.txt.gz # 解压缩 file1.txt.gz 并显示详细信息 gunzip -k file1.txt.gz # 解压缩 file1.txt.gz 并保留原始文件
|
4. zip - 压缩文件和目录
zip 命令用于将文件和目录压缩成 .zip 文件。
常用选项:
-r:递归压缩目录及其内容。
-v:显示详细的压缩过程。
-q:静默模式,不显示压缩过程。
示例:
|
Bash zip archive.zip file1.txt file2.txt # 将 file1.txt 和 file2.txt 压缩成 archive.zip zip -r archive.zip dir1 # 递归压缩 dir1 目录及其内容 zip -v archive.zip file1.txt # 压缩 file1.txt 并显示详细信息 zip -q archive.zip file1.txt # 静默模式压缩 file1.txt
|
5. unzip - 解压缩 .zip 文件
unzip 命令用于解压缩 .zip 文件。
常用选项:
-l:列出 .zip 文件中的内容。
-v:显示详细的解压缩过程。
-d:指定解压缩目录。
示例:
|
Bash unzip archive.zip # 解压缩 archive.zip unzip -l archive.zip # 列出 archive.zip 中的内容 unzip -v archive.zip # 解压缩 archive.zip 并显示详细信息 unzip archive.zip -d /home/user # 将 archive.zip 解压缩到 /home/user 目录
|
总结
这些压缩和解压缩工具在Linux系统中非常常用。通过熟练掌握 tar、gzip、zip 等命令,可以高效地管理和处理压缩文件。
2. 系统管理
2.1 用户与权限
针对运维工程师的Linux用户和权限管理指南:
一、用户管理
1. 核心配置文件
/etc/passwd:用户信息(用户名、UID、主目录等)
/etc/shadow:用户密码及过期策略
/etc/group:组信息
/etc/sudoers:sudo权限配置(使用visudo编辑!)
2. 常用命令
创建用户
useradd -m -s /bin/bash -G developers,admins alice # 创建用户并指定组
passwd alice # 设置密码
-m:创建家目录
-G:附加组(多个用逗号分隔)
-s:指定默认Shell
修改用户
usermod -aG docker alice # 追加用户到docker组
usermod -L alice # 锁定用户(禁止登录)
usermod -e 2024-12-31 # 设置账户过期时间
删除用户
userdel -r alice # 删除用户及家目录
查看用户信息
id alice # 显示UID、GID及所属组
lastlog # 查看所有用户最近登录时间
二、权限管理
1. 基础权限模型
rwx权限
文件:r(读内容)、w(修改内容)、x(执行)
目录:r(列出目录)、w(增删文件)、x(进入目录)
权限表示
drwxr-xr-- # 分解:
d # 类型(目录)
rwx # 所有者权限
r-x # 所属组权限
r-- # 其他用户权限
修改权限
chmod 755 file # 数字模式(所有者rwx,其他rx)
chmod u+x,g-w,o=r file # 符号模式
chown alice:devs file # 修改所有者和组
2. 特殊权限
SUID(4):文件运行时以所有者权限执行
chmod u+s /usr/bin/some_program # 如passwd命令
SGID(2):目录中新文件继承组
chmod g+s /shared_dir # 协作目录常用
Sticky Bit(1):仅文件所有者可删除(如/tmp)
chmod +t /tmp
3. 访问控制列表(ACL)
精细化权限控制(针对特定用户/组)
setfacl -m u:alice:rwx /path/file # 赋予alice权限
getfacl /path/file # 查看ACL
三、运维场景实践
1. Sudo权限管理
编辑/etc/sudoers(使用visudo命令):
alice ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx # 允许无密码重启nginx
%developers ALL=(root) /usr/bin/apt update # 组权限
2. 权限审计
查找全局可写文件:
find / -xdev -type f -perm -o+w -exec ls -l {} \;
检查SUID/SGID文件:
find / -xdev -type f \( -perm -4000 -o -perm -2000 \) -print
3. 用户隔离与安全
限制用户SSH访问:
# /etc/ssh/sshd_config
AllowUsers alice bob
DenyUsers guest*
配置密码策略:
# /etc/login.defs
PASS_MAX_DAYS 90
PASS_MIN_DAYS 1
四、常见问题排查
权限被拒绝(Permission Denied)
检查用户所属组:groups alice
检查文件权限:ls -l /path/file
检查SELinux/AppArmor是否阻止操作(查看日志/var/log/audit/audit.log)
用户无法sudo
确认用户是否在sudoers文件或sudo组中
检查/etc/sudoers语法:visudo -c
五、最佳实践
最小权限原则:用户仅拥有必要权限。
使用组管理权限:将功能相似的用户加入同一组。
定期审计:清理无效账户,检查敏感文件权限。
日志监控:跟踪用户登录和sudo操作(/var/log/auth.log)。
附:常用命令速查表
# 用户管理
useradd | usermod | userdel
passwd | chage
groups | id
# 权限管理
chmod | chown | chgrp
getfacl | setfacl
umask # 设置默认权限(如umask 027)
# 审计
last | lastlog
find / -perm -u+s -type f # 查找SUID文件
2.1 sudo 权限配置
面向运维工程师的 sudo 权限配置指南
sudo 是 Linux 中管理用户权限的核心工具,允许普通用户以特权身份执行命令。合理配置 sudo 权限是运维安全的关键,以下是详细配置方法与实战场景。
一、核心配置文件
/etc/sudoers:主配置文件,必须使用 visudo 命令编辑(避免语法错误导致权限丢失)。
/etc/sudoers.d/:可在此目录下创建独立配置文件(推荐模块化管理)。
二、基础语法与配置
1. 用户/组权限规则
|
Bash # 语法: 用户/组 主机列表=(可切换的用户) [NOPASSWD:] 可执行的命令列表
|
示例:
alice ALL=(ALL) ALL # alice 可切换到任意用户执行所有命令(需密码)
%admin ALL=(root) /usr/bin/apt # admin 组成员可执行 apt 命令(需密码)
bob ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx # 免密重启 nginx
2. 命令别名
简化重复命令配置:
|
Bash # 定义命令别名 Cmnd_Alias SERVICES = /usr/bin/systemctl start *, /usr/bin/systemctl stop * Cmnd_Alias PACKAGE_MGR = /usr/bin/apt, /usr/bin/dnf
# 使用别名授权 %developers ALL=(root) SERVICES, PACKAGE_MGR
|
3. 用户别名
批量管理用户权限:
|
Bash # 定义用户别名 User_Alias DEVOPS = alice, bob, charlie
# 授权 DEVOPS ALL=(ALL) /usr/bin/docker
|
三、运维场景配置示例
1. 允许用户管理服务
|
Bash # 允许用户控制 Nginx 服务(启停重启) user1 ALL=(root) NOPASSWD: /usr/bin/systemctl start nginx, \ /usr/bin/systemctl stop nginx, \ /usr/bin/systemctl restart nginx
|
2. 授权特定软件包管理
|
Bash # 允许用户更新系统,但禁止升级或删除包 user2 ALL=(root) /usr/bin/apt update, /usr/bin/apt install *
|
3. 限制用户仅能执行脚本
|
Bash # 仅允许用户以 root 身份执行特定脚本(禁止参数) user3 ALL=(root) /home/scripts/deploy.sh ""
|
4. 禁止敏感操作
|
Bash # 禁止用户通过 sudo 执行 rm 和 dd 命令 user4 ALL=(ALL) ALL, !/bin/rm, !/bin/dd
|
四、安全最佳实践
最小权限原则:
禁止开放 ALL 权限,仅授予必要命令。
使用 ! 显式排除危险命令(如 rm, dd, chmod 777)。
密码策略:
默认需要密码(避免 NOPASSWD 滥用),敏感操作必须保留密码验证。
配置密码超时:
|
Bash Defaults timestamp_timeout=15 # 15 分钟后需重新输入密码
|
日志审计:
所有 sudo 操作记录在 /var/log/auth.log。
监控关键命令(如 useradd, visudo)。
配置文件管理:
优先使用 /etc/sudoers.d/ 目录(避免直接修改主文件):
|
Bash echo "user5 ALL=(ALL) /usr/bin/docker" > /etc/sudoers.d/docker chmod 440 /etc/sudoers.d/docker # 限制文件权限
|
定期审查:
清理无效用户或组:sudo -lU <用户> 查看用户权限。
检查全局 sudoers 文件:visudo -c 验证语法。
五、故障排查
1. 用户无法执行 sudo
检查用户是否在 sudoers 文件或 sudo 组中:
|
Bash groups alice # 查看用户所属组 sudo -lU alice # 查看用户的 sudo 权限
|
验证 /etc/sudoers 语法:
2. 命令被拒绝
确认命令路径是否完整(禁止相对路径):
|
Bash # 错误配置 user6 ALL=(root) systemctl # 正确配置 user6 ALL=(root) /usr/bin/systemctl
|
检查是否被其他规则覆盖(如 ! 排除)。
六、高级配置
1. 限制用户切换身份
|
Bash # 允许用户仅能以 apache 用户身份执行命令 user7 ALL=(apache) /usr/bin/whoami
|
2. 环境变量控制
|
Bash # 禁止 sudo 继承当前用户环境变量 Defaults env_reset # 允许保留特定变量(如 PATH) Defaults env_keep += "PATH"
|
3. 限制特定终端或 IP
|
Bash # 仅允许从本地终端和 192.168.1.0/24 网段执行 sudo user8 192.168.1.0/24, localhost=(ALL) ALL
|
七、速查命令
|
Bash # 查看当前用户的 sudo 权限 sudo -l
# 查看其他用户的权限 sudo -lU alice
# 快速测试命令是否允许执行 sudo -u root /usr/bin/apt update
# 检查所有 sudoers 配置 grep -v -e '^$' -e '^#' /etc/sudoers /etc/sudoers.d/*
|
通过合理配置 sudo 权限,既能保障系统安全,又能灵活分配运维职责。始终遵循“最小权限”原则,并定期审计规则!
2.3 进程管理
2.3.1 查看进程(ps, top, htop)
面向运维工程师的进程查看与管理指南
在 Linux 运维中,查看和管理进程是日常工作的核心任务。以下是 ps、top、htop 等工具的详细用法及实战场景。
一、ps:静态进程查看
核心用途
快速查看当前进程的静态快照,适合精准查询特定进程信息。
常用选项与示例
|
Bash # 查看所有进程(BSD风格) ps aux
# 解释: # a = 显示所有用户进程 # u = 显示详细信息(用户、CPU、内存等) # x = 包括未关联终端的进程(如后台服务)
# 按列筛选(例如查看进程 PID 和命令) ps -eo pid,user,command
# 按条件过滤(例如查找 Java 进程) ps aux | grep java
# 查看特定用户的进程 ps -u root
# 按 CPU 或内存占用排序 ps aux --sort=-%cpu # CPU 倒序 ps aux --sort=-%mem # 内存倒序
|
输出字段解析
|
字段
|
说明
|
|
USER
|
进程所有者
|
|
PID
|
进程 ID
|
|
%CPU
|
CPU 占用率
|
|
%MEM
|
内存占用率
|
|
VSZ
|
虚拟内存大小(KB)
|
|
RSS
|
物理内存大小(KB)
|
|
STAT
|
进程状态(S=休眠,R=运行)
|
|
COMMAND
|
启动命令(含参数)
|
二、top:动态进程监控
核心用途
实时监控系统进程及资源占用(CPU、内存、负载等),支持交互式操作。
交互模式快捷键
|
按键
|
功能
|
|
P
|
按 CPU 占用排序
|
|
M
|
按内存占用排序
|
|
k
|
终止进程(输入 PID)
|
|
r
|
修改进程优先级(nice值)
|
|
1
|
展开显示所有 CPU 核心
|
|
h
|
查看帮助
|
启动选项
|
Bash # 设置刷新间隔(3秒) top -d 3
# 仅显示某个用户的进程 top -u nginx
# 高亮显示运行中的进程 top -b -i
|
输出关键字段
系统级信息:
load average:系统 1/5/15 分钟的平均负载(建议 < CPU 核心数)。
%Cpu(s):用户态(us)、内核态(sy)、空闲(id)等 CPU 使用占比。
进程级信息:与 ps 类似,但动态更新。
三、htop:增强型动态监控
核心优势
彩色界面,支持鼠标操作。
树状视图展示父子进程关系。
直接通过功能键终止进程或调整优先级。
常用操作
|
功能键
|
说明
|
|
F2
|
进入配置菜单(设置显示列)
|
|
F3
|
搜索进程
|
|
F4
|
过滤进程(按名称或用户)
|
|
F5
|
树状视图切换
|
|
F9
|
终止进程(支持信号选择)
|
|
Space
|
标记进程(批量操作)
|
启动选项
|
Bash # 按用户过滤进程 htop -u alice
# 显示线程(而非进程) htop -t
|
四、运维场景实践
快速定位高负载进程
|
Bash top -d 1 # 实时监控,按 `P` 查看 CPU 占用最高的进程
|
2. 分析内存泄漏问题
|
Bash htop -s PERCENT_MEM # 按内存排序,观察长期占用内存的进程
|
3. 批量终止僵尸进程
|
Bash ps aux | grep 'Z' | awk '{print $2}' | xargs kill -9 # 查找并终止僵尸进程
|
4. 监控服务进程状态
|
Bash watch -n 2 "ps aux | grep nginx" # 每2秒检查一次Nginx进程
|
五、相关工具扩展
pstree:树状显示进程关系
|
Bash pstree -p # 显示 PID pstree -u # 显示用户
|
2. lsof:查看进程打开的文件
|
Bash lsof -p <PID> # 查看进程打开的文件 lsof -i :80 # 查看占用80端口的进程
|
3. netstat/ss:网络连接关联进程
|
Bash netstat -tulnp | grep 3306 # 查看MySQL(3306端口)的进程信息 ss -ltnp 'sport = :80' # 更高效的替代命令
|
六、注意事项
谨慎使用 kill -9:强制终止进程可能导致数据丢失,优先尝试 kill -15(SIGTERM)。
监控系统负载:若 load average 持续高于 CPU 核心数,需排查性能瓶颈。
容器环境差异:容器内进程可能与宿主机隔离,需使用 docker top 或 kubectl top。
附:命令速查表
|
Bash # 查看进程启动路径 ps -p <PID> -o cmd
# 统计进程数 ps -ef | wc -l
# 跟踪进程的系统调用 strace -p <PID>
# 查看进程的线程 ps -T -p <PID>
# 持续监控某个进程的 CPU/MEM top -p <PID>
|
通过掌握这些工具,运维工程师可以高效诊断系统性能问题,快速定位异常进程!
2.3.2 进程控制(kill, pkill, killall)
面向运维工程师的进程控制命令指南
在 Linux 运维中,进程控制是诊断问题和维护系统稳定的核心技能。kill、pkill、killall 是终止或管理进程的关键命令,以下是详细用法及场景示例。
一、kill:通过 PID 控制进程
核心用途
向指定进程发送信号(默认 SIGTERM),基于 PID 精确控制单个进程。
常用信号
|
信号编号
|
信号名
|
作用
|
|
1
|
SIGHUP
|
挂起(重启进程)
|
|
9
|
SIGKILL
|
强制终止(不可捕获)
|
|
15
|
SIGTERM
|
优雅终止(默认信号)
|
|
18
|
SIGCONT
|
恢复进程
|
|
19
|
SIGSTOP
|
暂停进程(不可捕获)
|
使用示例
|
Bash # 1. 终止进程(默认发送 SIGTERM) kill 1234
# 2. 强制杀死进程(SIGKILL) kill -9 1234
# 3. 重启进程(如重新加载配置) kill -1 1234
# 4. 暂停/恢复进程 kill -19 1234 # 暂停 kill -18 1234 # 恢复
|
注意事项
优先使用 SIGTERM(15),允许进程清理资源后再退出。
SIGKILL(9)是最后手段,可能导致数据丢失或状态不一致。
需配合 ps 或 top 获取目标进程的 PID。
二、pkill:通过名称或属性批量控制进程
核心用途
基于 进程名、用户、终端等属性 批量发送信号,支持正则表达式匹配。
常用选项
|
选项
|
作用
|
|
-f
|
匹配完整命令行(含参数)
|
|
-u
|
按用户过滤(如 -u root)
|
|
-t
|
按终端过滤(如 -t pts/0)
|
|
-signal
|
指定信号(如 -9)
|
使用示例
|
Bash # 1. 终止所有名为 "nginx" 的进程 pkill nginx
# 2. 强制杀死用户 alice 的 Java 进程 pkill -9 -u alice java
# 3. 终止匹配 "python script_" 的进程(使用正则) pkill -f "python script_.*"
# 4. 踢出特定终端登录的用户 pkill -9 -t pts/3
|
注意事项
避免模糊匹配导致误杀(如 pkill proc 可能匹配 procA 和 procB)。
测试匹配结果:先用 pgrep 预览目标 PID(如 pgrep -f "nginx")。
三、killall:通过进程名批量终止进程
核心用途
按 完整进程名 批量发送信号(比 pkill 更严格,要求名称完全匹配)。
常用选项
|
选项
|
作用
|
|
-i
|
交互式确认
|
|
-r
|
使用正则表达式匹配名称
|
|
-signal
|
指定信号(如 -9)
|
使用示例
|
Bash # 1. 终止所有名为 "chrome" 的进程 killall chrome
# 2. 强制终止所有 "python3" 进程 killall -9 python3
# 3. 交互式终止匹配正则的进程 killall -r "worker_[0-9]+" -i
|
注意事项
名称必须完全匹配(如进程名为 nginx: worker 时,killall nginx 无效)。
部分系统默认未安装(需通过 psmisc 包安装)。
四、运维场景实践
优雅重启服务
|
Bash # 查找进程 PID 并发送 SIGHUP(重新加载配置) pkill -1 nginx
|
2. 清理僵尸进程
|
Bash # 僵尸进程无法直接杀死,需终止其父进程 ps -A -ostat,ppid | grep Z # 查找僵尸进程及其父 PID kill -9 <父进程PID>
|
3. 批量终止测试环境进程
|
Bash # 杀死用户 "testuser" 的所有进程 pkill -9 -u testuser
|
4. 防止误操作的技巧
|
Bash # 先列出目标进程,确认后再终止 pgrep -u alice -f "python" | xargs echo # 查看 PID pgrep -u alice -f "python" | xargs kill # 执行终止
|
五、信号与进程状态
可捕获信号(如 SIGTERM):进程可自定义处理逻辑(如保存数据)。
不可捕获信号(如 SIGKILL):直接由内核终止进程,可能导致资源泄漏。
进程状态:
R:运行中
S:休眠
Z:僵尸进程(需处理父进程)
T:暂停
六、最佳实践
优先使用 SIGTERM:给进程预留清理资源的时机。
慎用 SIGKILL:仅在进程无响应时使用。
确认目标进程:通过 ps、pgrep 或 htop 验证 PID 或名称。
权限控制:普通用户只能终止自己的进程,root 可终止所有进程。
附:命令速查表
|
Bash # 根据名称查找 PID pgrep nginx
# 列出所有可用信号 kill -l
# 终止所有 SSH 会话(按终端类型) pkill -9 -t pts
# 杀死进程及其子进程(树状终止) kill -- -<进程组ID>
|
通过合理使用进程控制命令,运维工程师可以快速应对服务异常、释放资源并保障系统稳定性!
2.3.3 后台运行(&, nohup)
面向运维工程师的后台运行管理指南
在 Linux 运维中,后台运行进程是常见的需求(如长时间任务、服务守护进程)。以下是 &、nohup 等工具的核心用法及场景实践,确保进程在终端退出后持续运行。
一、&:快速后台运行
核心用途
将命令放入后台运行,不阻塞当前终端,适合临时任务。
使用示例
|
Bash # 启动后台任务(继续使用当前终端) python script.py > output.log 2>&1 &
|
>:重定向标准输出到文件
2>&1:将标准错误合并到标准输出
&:将任务放入后台
管理后台任务
|
命令
|
作用
|
|
jobs
|
查看当前终端的后台任务列表
|
|
fg %<任务号>
|
将后台任务切换到前台(如 fg %1)
|
|
bg %<任务号>
|
恢复暂停的后台任务(继续运行)
|
|
kill %<任务号>
|
终止指定后台任务
|
注意事项
任务仍与终端关联,若终端关闭(或 SSH 断开),任务会收到 SIGHUP 信号并终止。
适合短期运行的任务(如编译、临时处理)。
二、nohup:脱离终端的持久化运行
核心用途
忽略 SIGHUP 信号,使进程在终端关闭后仍继续运行,默认输出重定向到 nohup.out。
使用示例
|
Bash # 1. 基础用法(输出到 nohup.out) nohup python script.py &
# 2. 自定义输出文件 nohup python script.py > custom.log 2>&1 &
# 3. 丢弃所有输出 nohup python script.py > /dev/null 2>&1 &
|
关键特性
脱离终端控制:进程不再受终端退出影响。
输出重定向:若不指定,默认生成 nohup.out(可能覆盖已有文件)。
结合 & 使用:放入后台运行,释放当前终端。
三、disown:剥离已有任务与终端的关系
核心用途
将当前终端中已启动的后台任务剥离,使其不再受终端关闭影响。
使用示例
|
Bash # 1. 启动任务并放入后台 python script.py &
# 2. 剥离最近一个后台任务 disown %1
# 3. 剥离所有后台任务 disown -a
|
适用场景
忘记使用 nohup 启动任务时,补救剥离任务。
需保留任务运行但关闭当前终端。
四、运维场景实践
部署长期服务
|
Bash # 启动服务并脱离终端,记录日志 nohup ./start_server.sh > server.log 2>&1 &
|
2. 批量后台任务管理
|
Bash # 启动多个任务,统一管理 PID nohup task1.sh > task1.log 2>&1 & nohup task2.sh > task2.log 2>&1 & echo "任务 PID: $!" # 记录最后一个后台任务的 PID
|
3. 避免 nohup.out 被覆盖
|
Bash # 为每个任务指定独立日志文件 nohup some_command > /var/log/some_command_$(date +%F).log 2>&1 &
|
4. SSH 断开后任务保活
|
Bash # 启动任务后安全退出 SSH ssh user@server "nohup /opt/scripts/backup.sh > /dev/null 2>&1 &"
|
五、高级工具:tmux 或 screen
核心优势
创建持久化会话,即使网络断开也可重新连接恢复。
支持多窗口管理,适合复杂运维任务。
基础操作
|
Bash # 启动 tmux 会话 tmux new -s session_name
# 在会话中运行任务(无需 nohup) python script.py
# 分离会话(保持任务运行) Ctrl + B → D
# 重新连接会话 tmux attach -t session_name
|
六、注意事项
日志管理:
定期清理日志文件(避免磁盘占满)。
使用 logrotate 分割历史日志。
资源监控:
长期后台任务需监控资源(如 top、htop)。
避免内存泄漏或 CPU 占用失控。
信号处理:
nohup 仅忽略 SIGHUP,仍需通过 kill 终止任务。
关键任务建议配置为系统服务(systemd)。
附:命令速查表
|
Bash # 查看后台任务 jobs -l
# 终止所有后台任务 kill $(jobs -p)
# 后台任务保活组合技 nohup command & # 启动时脱离终端 disown -h %1 # 剥离已运行的任务
# 查找所有 nohup 进程 pgrep -a -f 'nohup'
|
通过合理使用后台运行工具,运维工程师可高效管理长期任务,确保关键进程稳定运行!
2.4 服务管理
面向运维工程师的 Linux 服务管理指南
服务管理是运维工程师的核心任务之一,涉及服务的启动、停止、状态监控及开机自启配置。以下是 systemctl、service 命令的使用方法及最佳实践。
一、systemctl(Systemd 服务管理)
Systemd 是现代 Linux 发行版(如 CentOS 7+/Ubuntu 16.04+)的默认初始化系统,提供更强大的服务管理能力。
基础操作命令
|
命令
|
作用
|
|
systemctl start <服务名>
|
启动服务(如 nginx)
|
|
systemctl stop <服务名>
|
停止服务
|
|
systemctl restart <服务名>
|
重启服务
|
|
systemctl reload <服务名>
|
重新加载配置(不中断服务)
|
|
systemctl status <服务名>
|
查看服务状态(含进程、日志片段)
|
|
systemctl enable <服务名>
|
设置开机自启
|
|
systemctl disable <服务名>
|
禁用开机自启
|
|
systemctl is-enabled <服务名>
|
检查服务是否开机自启
|
|
systemctl list-unit-files --type=service
|
列出所有服务及其开机状态
|
示例:管理 Nginx 服务
|
Bash systemctl start nginx # 启动 systemctl stop nginx # 停止 systemctl restart nginx # 重启(中断服务) systemctl reload nginx # 重载配置(无缝生效) systemctl status nginx # 查看状态 systemctl enable nginx # 开机自启
|
2. 查看服务日志
使用 journalctl 查看 Systemd 管理的服务日志:
|
Bash journalctl -u nginx # 查看 Nginx 日志 journalctl -u nginx -f # 实时跟踪日志 journalctl -u nginx --since "2023-10-01" --until "2023-10-02" # 按时间过滤
|
3. 服务依赖与故障排查
|
Bash systemctl list-dependencies nginx # 查看服务依赖树 systemctl daemon-reload # 修改服务配置后重载 systemctl reset-failed # 清除失败的服务状态
|
二、service 命令(传统 SysVinit 兼容)
service 是 SysVinit 的遗留命令,在 Systemd 系统中实际调用 systemctl,兼容旧脚本。
常用操作
|
命令
|
作用
|
|
service <服务名> start
|
启动服务
|
|
service <服务名> stop
|
停止服务
|
|
service <服务名> restart
|
重启服务
|
|
service <服务名> status
|
查看服务状态
|
示例:兼容性操作
|
Bash service nginx start # 实际执行 systemctl start nginx service --status-all # 查看所有服务状态(混合 Systemd 和 SysV 服务)
|
2. 与 systemctl 的区别
配置路径不同:
Systemd 服务文件:/usr/lib/systemd/system/(系统级)或 /etc/systemd/system/(自定义)。
SysVinit 脚本:/etc/init.d/ 目录。
功能差异:systemctl 支持更精细的依赖管理、资源控制和日志跟踪。
三、开机自启动服务配置
使用 systemctl 配置
|
Bash systemctl enable nginx # 启用开机自启 systemctl disable nginx # 禁用开机自启 systemctl is-enabled nginx # 检查状态
|
2. 传统方法(非 Systemd 系统)
chkconfig(Red Hat/CentOS 6-):
|
Bash chkconfig nginx on # 启用 chkconfig nginx off # 禁用 chkconfig --list # 查看所有服务
|
update-rc.d(Debian/Ubuntu 14.04-):
|
Bash update-rc.d nginx defaults # 启用 update-rc.d nginx remove # 禁用
|
/etc/rc.local:
|
Bash # 在文件末尾添加启动命令(需可执行权限) /usr/local/bin/my_script.sh chmod +x /etc/rc.local
|
四、运维场景实践
部署自定义服务
创建 Systemd 服务文件(如 /etc/systemd/system/myapp.service):
|
TOML [Unit] Description=My Custom Application After=network.target
[Service] ExecStart=/usr/bin/python3 /opt/myapp/app.py Restart=always User=myappuser Group=myappgroup
[Install] WantedBy=multi-user.target
|
启用并启动服务:
|
Bash systemctl daemon-reload systemctl enable myapp systemctl start myapp
|
2. 处理服务启动失败
|
Bash systemctl status nginx # 查看失败原因 journalctl -xe # 查看详细日志 systemctl restart nginx # 尝试重启 systemctl reset-failed nginx # 清除失败状态
|
3. 批量管理服务
|
Bash # 重启所有 Web 相关服务 systemctl restart nginx php-fpm mysql
# 禁用所有第三方服务 systemctl list-unit-files --type=service | grep enabled | grep -vE 'systemd|dbus' | awk '{print $1}' | xargs systemctl disable
|
五、最佳实践
优先使用 systemctl:功能更强大且兼容未来系统。
避免直接修改 /etc/init.d/ 脚本:推荐通过 Systemd 服务文件管理。
日志集中管理:结合 journald 或 rsyslog 归档重要服务日志。
限制服务权限:在服务文件中指定低权限用户(如 User=nginx)。
监控服务健康:使用 systemd-analyze 分析启动耗时,uptime 检查系统负载。
附:命令速查表
|
Bash # 查看服务启动耗时 systemd-analyze blame
# 列出所有运行中的服务 systemctl list-units --type=service --state=running
# 强制重新加载所有服务配置 systemctl daemon-reexec
# 检查服务是否活动 systemctl is-active nginx
# 创建服务配置符号链接(手动启用) ln -s /usr/lib/systemd/system/nginx.service /etc/systemd/system/multi-user.target.wants/
|
通过熟练掌握服务管理命令,运维工程师可高效维护系统稳定性,快速响应服务异常!
2.5 软件包管理
面向运维工程师的 Linux 包管理指南
包管理是运维工作中部署软件、维护系统安全的核心技能。不同 Linux 发行版使用不同的包管理工具,以下是 Debian/Ubuntu(APT) 和 Red Hat/CentOS(YUM/DNF) 的详细操作指南。
一、Debian/Ubuntu 系:APT 包管理
核心操作命令
|
命令
|
作用
|
|
apt update
|
更新软件包索引(必须优先执行)
|
|
apt upgrade
|
升级所有可更新的包
|
|
apt install <包名>
|
安装指定软件包
|
|
apt remove <包名>
|
卸载软件包(保留配置文件)
|
|
apt purge <包名>
|
彻底卸载(删除配置文件)
|
|
apt autoremove
|
清理无用的依赖包
|
|
apt search <关键词>
|
搜索软件包
|
|
apt show <包名>
|
查看包详细信息(版本、依赖等)
|
|
apt list --upgradable
|
列出可升级的包
|
示例:
|
Bash # 安装 Nginx 并自动确认操作(-y) apt update && apt install nginx -y
# 彻底卸载 MySQL 并清理残留 apt purge mysql-server -y && apt autoremove
|
2. 仓库管理
仓库配置文件:/etc/apt/sources.list 或 /etc/apt/sources.list.d/*.list
添加第三方仓库:
|
Bash # 示例:添加 Docker 官方仓库 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list apt update
|
3. 运维场景示例
批量升级所有包:
|
Bash apt update && apt upgrade -y
|
回滚软件版本:
|
Bash apt install <包名>=<版本号> # 指定版本安装
|
清理旧内核:
|
Bash apt purge $(dpkg --list | grep linux-image | awk '{print $2}' | grep -v $(uname -r))
|
二、Red Hat/CentOS 系:YUM/DNF 包管理
核心操作命令
|
命令
|
作用
|
|
yum check-update 或 dnf check-update
|
检查可更新包(不自动更新)
|
|
yum update 或 dnf upgrade
|
升级所有包
|
|
yum install <包名> 或 dnf install
|
安装包
|
|
yum remove <包名> 或 dnf remove
|
卸载包
|
|
yum search <关键词> 或 dnf search
|
搜索包
|
|
yum info <包名> 或 dnf info
|
查看包信息
|
|
yum clean all 或 dnf clean all
|
清理缓存
|
|
yum history
|
查看操作历史(支持回滚)
|
说明:
CentOS 8+ 和 RHEL 8+ 默认使用 dnf(兼容 yum 命令)。
dnf 性能更优,支持依赖解析增强。
示例:
|
Bash # 安装 EPEL 仓库后安装 htop yum install epel-release -y && yum install htop -y
# 回滚最近一次操作 yum history undo <事务ID>
|
2. 仓库管理
仓库配置文件:/etc/yum.repos.d/*.repo
添加仓库示例:
|
Bash # 示例:添加 Remi 仓库(PHP 扩展) dnf install https://rpms.remirepo.net/enterprise/remi-release-$(rpm -E %rhel).rpm -y dnf module enable php:remi-8.1 -y # 启用 PHP 8.1 模块
|
3. 运维场景示例
排除特定包不更新:
|
Bash yum update --exclude=kernel* # 跳过内核升级
|
锁定包版本:
|
Bash # 安装 yum-plugin-versionlock yum install yum-plugin-versionlock -y yum versionlock add <包名> # 锁定版本
|
分析依赖冲突:
|
Bash dnf repoquery --deplist <包名> # 查看依赖树
|
三、通用技巧与最佳实践
安全审计
检查可执行文件来源:
|
Bash # Debian/Ubuntu dpkg -S /usr/bin/nginx # Red Hat/CentOS rpm -qf /usr/sbin/nginx
|
验证包签名:
|
Bash rpm --checksig <包名>.rpm # Red Hat 系 apt-get verify <包名> # Debian 系
|
2. 维护操作
清理缓存:
|
Bash apt clean # Debian/Ubuntu dnf clean all # Red Hat/CentOS
|
重建包数据库(解决依赖问题):
|
Bash apt install -f # Debian/Ubuntu 修复依赖 rpm --rebuilddb # Red Hat/CentOS 重建 RPM 数据库
|
3. 故障排查
依赖冲突:
|
Bash # Debian/Ubuntu apt-get -f install # 尝试自动修复 # Red Hat/CentOS dnf autoremove # 清理无效依赖
|
手动安装本地包:
|
Bash dpkg -i package.deb # Debian/Ubuntu rpm -ivh package.rpm # Red Hat/CentOS
|
四、附:命令速查表
|
Bash # 查找某个命令属于哪个包 apt-file search /usr/bin/htop # Debian/Ubuntu(需安装 apt-file) dnf provides /usr/bin/htop # Red Hat/CentOS
# 查看已安装包列表 dpkg -l | grep nginx # Debian/Ubuntu rpm -qa | grep nginx # Red Hat/CentOS
# 强制降级软件包 apt install <包名>=<旧版本> # Debian/Ubuntu dnf downgrade <包名> # Red Hat/CentOS
# 批量卸载孤儿包 apt autoremove --purge # Debian/Ubuntu dnf autoremove # Red Hat/CentOS
|
通过掌握这些包管理工具,运维工程师可以高效部署服务、修复漏洞并维护系统稳定性。建议结合自动化工具(如 Ansible)批量管理多台服务器!
3. 网络管理
3.1 网络配置
3.1.1 查看网络信息(ifconfig, ip, netstat)
面向运维工程师的 Linux 网络信息查看指南
网络状态监控和故障排查是运维工作的核心任务之一。以下是 ifconfig、ip、netstat 等命令的详细用法及场景实践,涵盖传统工具与现代替代方案。
一、ifconfig(传统网络配置工具)
核心用途
查看和配置网络接口信息(如 IP 地址、MAC 地址、流量统计),已被 ip 命令取代,但仍在旧系统中广泛使用。
常用选项与示例
|
Bash # 查看所有网络接口信息 ifconfig
# 查看指定接口(如 eth0) ifconfig eth0
# 启用/禁用网络接口 ifconfig eth0 up # 启用 ifconfig eth0 down # 禁用
# 设置临时 IP 地址(重启后失效) ifconfig eth0 192.168.1.100 netmask 255.255.255.0
|
输出关键字段
|
字段
|
说明
|
|
inet
|
IPv4 地址
|
|
inet6
|
IPv6 地址
|
|
netmask
|
子网掩码
|
|
RX packets
|
接收数据包统计
|
|
TX packets
|
发送数据包统计
|
注意事项
已过时:现代 Linux 系统默认未安装(需安装 net-tools 包)。
功能有限:不支持复杂网络配置(如 VLAN、路由表)。
二、ip(现代网络管理工具)
核心用途
替代 ifconfig 和 route,提供更强大的网络配置和监控能力,属于 iproute2 工具集。
常用子命令与示例
|
子命令
|
作用
|
|
ip addr
|
查看 IP 地址和接口状态(等效 ifconfig)
|
|
ip link
|
管理网络接口(启用、禁用、MAC 地址等)
|
|
ip route
|
查看和配置路由表
|
|
ip neigh
|
管理 ARP 表(IP 与 MAC 地址映射)
|
示例:
|
Bash # 查看所有接口的 IP 地址 ip addr show
# 启用网络接口 eth0 ip link set eth0 up
# 添加临时 IP 地址 ip addr add 192.168.1.100/24 dev eth0
# 查看路由表 ip route show
# 监控 ARP 表(实时更新) ip -s neigh
|
高级功能
统计信息:
|
Bash ip -s link show eth0 # 显示接口详细流量统计
|
VLAN 配置:
|
Bash ip link add link eth0 name eth0.10 type vlan id 10 # 创建 VLAN 接口
|
三、netstat(网络连接统计工具)
核心用途
查看网络连接、路由表、接口统计等信息,已被 ss 命令取代,但仍有使用场景。
常用选项与示例
|
Bash # 查看所有监听端口 netstat -tuln
# 查看所有 TCP 连接(含进程信息) netstat -tulp
# 统计各协议数据包 netstat -s
# 持续监控连接状态 netstat -ct
|
输出字段解析
|
字段
|
说明
|
|
Proto
|
协议类型(TCP/UDP)
|
|
Recv-Q
|
接收队列大小
|
|
Send-Q
|
发送队列大小
|
|
Local Address
|
本地地址和端口
|
|
Foreign Address
|
远程地址和端口
|
|
State
|
连接状态(ESTABLISHED、TIME_WAIT 等)
|
注意事项
已过时:建议优先使用 ss 命令(性能更优)。
依赖包:需安装 net-tools。
四、ss(现代网络连接分析工具)
核心用途
替代 netstat,直接读取内核数据,速度更快,支持更详细的过滤和统计。
常用选项与示例
|
Bash # 查看所有监听端口 ss -tuln
# 查看所有已建立的 TCP 连接 ss -t state established
# 按端口过滤(如查看 80 端口的连接) ss -tun sport = :80
# 显示进程信息(需 root 权限) ss -tup
|
高级过滤
按连接状态过滤:
|
Bash ss -t state listening # 所有监听中的 TCP 连接 ss -t state time-wait # 所有 TIME-WAIT 状态的连接
|
按 IP 范围过滤:
|
Bash ss -t src 192.168.1.0/24 # 源 IP 属于 192.168.1.0/24 网段
|
五、运维场景实践
排查端口占用问题
|
Bash # 查找占用 80 端口的进程 ss -tunlp | grep ":80"
|
2. 监控网络吞吐量
|
Bash # 查看 eth0 接口的实时流量统计 ip -s link show eth0
|
3. 分析异常连接
|
Bash # 统计所有 TIME-WAIT 状态的连接数量 ss -t state time-wait | wc -l
|
4. 快速诊断网络接口状态
|
Bash ip link show eth0 | grep 'state' # 检查接口是否启用(UP/DOWN)
|
六、注意事项与最佳实践
优先使用现代工具:如 ip 和 ss,避免依赖已废弃的 ifconfig 和 netstat。
权限要求:查看进程信息(如 ss -tup)需 root 权限。
网络命名空间:在容器化环境中,需结合 nsenter 或 ip netns 查看特定命名空间的网络信息。
日志记录:关键网络操作(如接口配置)应记录变更日志,便于回滚。
附:命令速查表
|
Bash # 查看默认网关 ip route show default
# 查看 ARP 缓存 ip neigh
# 查看所有 IPv4 监听端口(TCP/UDP) ss -4 -tuln
# 统计各网络接口的丢包和错误信息 ip -s link
# 查看网络接口的硬件信息(如驱动版本) ethtool eth0
|
掌握这些工具,运维工程师可以快速定位网络问题,优化连接性能并保障服务稳定性!
3.1.2 配置 IP 地址(静态 IP、DHCP)
面向运维工程师的 Linux IP 地址配置指南
配置 IP 地址是运维工作中的基础任务,涉及静态 IP(固定地址)和 DHCP(动态获取)两种模式。以下是不同 Linux 发行版的配置方法及工具详解。
一、静态 IP 地址配置
静态 IP 适用于服务器、网络设备等需要固定地址的场景。
Debian/Ubuntu 系(使用 Netplan 或传统配置)
方法一:Netplan(Ubuntu 18.04+ / Debian 10+)
配置文件路径:/etc/netplan/*.yaml(如 01-netcfg.yaml)
配置示例:
|
YAML network: version: 2 renderer: networkd # 或 networkd ethernets: enp0s3: # 接口名称(通过 `ip link` 查看) addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8, 8.8.4.4]
|
应用配置:
|
Bash netplan apply # 应用配置(无需重启)
|
方法二:传统配置(/etc/network/interfaces)
配置文件路径:/etc/network/interfaces
配置示例:
|
Bash auto enp0s3 iface enp0s3 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8 8.8.4.4
|
重启网络服务:
|
Bash systemctl restart networking # Debian/Ubuntu
|
2. Red Hat/CentOS 系
配置文件路径:/etc/sysconfig/network-scripts/ifcfg-<接口名>(如 ifcfg-eth0)
配置示例:
|
Bash TYPE=Ethernet BOOTPROTO=static # 静态 IP DEVICE=eth0 ONBOOT=yes IPADDR=192.168.1.100 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=8.8.8.8 DNS2=8.8.4.4
|
重启网络服务:
|
Bash systemctl restart NetworkManager # 使用 NetworkManager 或 systemctl restart network # 传统网络服务
|
3. 通用命令行工具(临时生效)
使用 ip 命令:
|
Bash ip addr add 192.168.1.100/24 dev eth0 # 添加 IP ip route add default via 192.168.1.1 # 设置网关
|
修改 DNS:
|
Bash echo "nameserver 8.8.8.8" > /etc/resolv.conf
|
|
注意:直接修改 /etc/resolv.conf 可能被 DHCP 覆盖,建议在网卡配置文件中指定 DNS。
|
二、DHCP 动态 IP 配置
DHCP 适用于客户端设备或临时分配 IP 的场景。
Debian/Ubuntu 系
Netplan 配置
|
YAML network: version: 2 ethernets: enp0s3: dhcp4: yes
|
传统配置(/etc/network/interfaces)
|
Bash auto enp0s3 iface enp0s3 inet dhcp
|
2. Red Hat/CentOS 系
配置文件:/etc/sysconfig/network-scripts/ifcfg-eth0
|
Bash BOOTPROTO=dhcp ONBOOT=yes
|
3. 命令行工具(临时获取)
释放并重新获取 IP:
|
Bash dhclient -r eth0 # 释放当前租约 dhclient eth0 # 重新请求 IP
|
三、使用 NetworkManager(通用工具)
适用于支持 NetworkManager 的系统(多数现代发行版)。
命令行工具 nmcli
配置静态 IP:
|
Bash nmcli con mod eth0 ipv4.addresses 192.168.1.100/24 nmcli con mod eth0 ipv4.gateway 192.168.1.1 nmcli con mod eth0 ipv4.dns "8.8.8.8,8.8.4.4" nmcli con mod eth0 ipv4.method manual nmcli con up eth0
|
配置 DHCP:
|
Bash nmcli con mod eth0 ipv4.method auto nmcli con down eth0 && nmcli con up eth0
|
2. 图形界面(可选)
运行 nmtui 或 nm-connection-editor 进行交互式配置。
四、验证与故障排查
检查 IP 配置
|
Bash ip addr show eth0 # 查看接口 IP ip route show # 查看路由表 cat /etc/resolv.conf # 检查 DNS 配置
|
2. 测试网络连通性
|
Bash ping 8.8.8.8 # 测试外网连通性 ping 192.168.1.1 # 测试网关连通性 nslookup google.com # 测试 DNS 解析
|
3. 常见问题
IP 未生效:
检查配置文件语法。
重启网络服务:systemctl restart NetworkManager 或 systemctl restart network。
DNS 解析失败:
确认 /etc/resolv.conf 中 DNS 服务器正确。
检查防火墙是否屏蔽 DNS 请求(端口 53)。
五、速查表
|
场景
|
命令/配置
|
|
临时添加 IP
|
ip addr add 192.168.1.100/24 dev eth0
|
|
永久配置静态 IP
|
编辑 /etc/netplan/*.yaml 或 /etc/sysconfig/network-scripts/ifcfg-eth0
|
|
强制 DHCP 刷新
|
dhclient -r eth0 && dhclient eth0
|
|
查看当前 DNS 服务器
|
cat /etc/resolv.conf 或 `nmcli dev show eth0
|
|
禁用 NetworkManager
|
systemctl stop NetworkManager && systemctl disable NetworkManager
|
通过灵活使用这些方法,运维工程师可以高效管理服务器网络配置,确保服务稳定性和可访问性!
通过灵活使用这些方法,运维工程师可以高效管理服务器网络配置,确保服务稳定性和可访问性!
3.2.3 网络服务(sshd, nginx, apache)
面向运维工程师的 Linux 网络服务管理指南
sshd(SSH 服务)、Nginx 和 Apache 是运维工作中最常用的网络服务。以下是它们的核心配置、管理方法及安全实践。
一、SSH 服务(sshd)
安装与启停
|
Bash # Debian/Ubuntu apt install openssh-server -y systemctl enable ssh && systemctl start ssh
# Red Hat/CentOS yum install openssh-server -y systemctl enable sshd && systemctl start sshd
|
2. 核心配置文件
/etc/ssh/sshd_config:服务端配置
|
Bash Port 2222 # 修改默认端口(22 → 2222) PermitRootLogin no # 禁止 root 直接登录 PasswordAuthentication no # 禁用密码登录(仅密钥认证) AllowUsers alice bob # 仅允许指定用户登录
|
~/.ssh/authorized_keys:客户端公钥存放位置(用于密钥登录)。
3. 常用操作
重启服务:
|
Bash systemctl restart sshd
|
生成密钥对:
|
Bash ssh-keygen -t ed25519 -C "your_email@example.com"
|
复制公钥到服务器:
|
Bash ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip -p 2222
|
4. 安全加固
防火墙放行 SSH 端口:
|
Bash ufw allow 2222/tcp # Ubuntu firewall-cmd --add-port=2222/tcp --permanent && firewall-cmd --reload # CentOS
|
启用 Fail2Ban:自动封禁暴力破解 IP。
日志监控:查看 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(CentOS)。
二、Nginx 服务
安装与启停
|
Bash # Debian/Ubuntu apt install nginx -y systemctl enable nginx && systemctl start nginx
# Red Hat/CentOS yum install epel-release -y && yum install nginx -y systemctl enable nginx && systemctl start nginx
|
2. 核心配置文件
主配置:/etc/nginx/nginx.conf(全局配置)。
站点配置:
Debian/Ubuntu:/etc/nginx/sites-available/ 和 /etc/nginx/sites-enabled/。
CentOS:/etc/nginx/conf.d/。
3. 配置示例(静态网站)
|
Nginx server { listen 80; server_name example.com www.example.com; root /var/www/html; index index.html;
location / { try_files $uri $uri/ =404; } }
|
启用配置:
|
Bash ln -s /etc/nginx/sites-available/example.conf /etc/nginx/sites-enabled/ # Debian/Ubuntu nginx -t && systemctl reload nginx # 测试配置并重载
|
4. HTTPS 配置(Let's Encrypt)
|
Bash # 安装 Certbot apt install certbot python3-certbot-nginx -y # Debian/Ubuntu yum install certbot python3-certbot-nginx -y # CentOS
# 自动申请证书并配置 Nginx certbot --nginx -d example.com -d www.example.com
|
5. 日志与监控
访问日志:/var/log/nginx/access.log。
错误日志:/var/log/nginx/error.log。
实时监控请求:
|
Bash tail -f /var/log/nginx/access.log | awk '{print $1, $7, $9}'
|
三、Apache 服务(httpd)
安装与启停
|
Bash # Debian/Ubuntu apt install apache2 -y systemctl enable apache2 && systemctl start apache2
# Red Hat/CentOS yum install httpd -y systemctl enable httpd && systemctl start httpd
|
2. 核心配置文件
主配置:/etc/httpd/conf/httpd.conf(CentOS)或 /etc/apache2/apache2.conf(Debian/Ubuntu)。
虚拟主机配置:
CentOS:/etc/httpd/conf.d/。
Debian/Ubuntu:/etc/apache2/sites-available/ 和 /etc/apache2/sites-enabled/。
3. 配置示例(虚拟主机)
|
Apache <VirtualHost *:80> ServerName example.com DocumentRoot /var/www/html ErrorLog /var/log/apache2/example-error.log CustomLog /var/log/apache2/example-access.log combined </VirtualHost>
|
启用配置:
|
Bash a2ensite example.conf # Debian/Ubuntu systemctl reload apache2
|
4. HTTPS 配置
|
Bash # 生成自签名证书(测试用) openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
# 配置 SSL 虚拟主机 <VirtualHost *:443> SSLEngine on SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key </VirtualHost>
|
5. 常用模块管理
|
Bash # 启用模块(如 rewrite) a2enmod rewrite # Debian/Ubuntu systemctl restart apache2
# CentOS 编辑 /etc/httpd/conf.modules.d/00-base.conf LoadModule rewrite_module modules/mod_rewrite.so systemctl restart httpd
|
四、通用运维场景
服务状态检查
|
Bash systemctl status sshd nginx apache2 # 查看运行状态 ss -tuln | grep -E '(:22|:80|:443)' # 检查端口监听 curl -I http://localhost # 测试 HTTP 响应
|
2. 性能调优
Nginx:
|
Nginx worker_processes auto; # 自动分配 Worker 进程 events { worker_connections 1024; # 单个 Worker 最大连接数 }
|
Apache:
|
Apache StartServers 4 # 初始启动进程数 MinSpareServers 4 MaxSpareServers 8 MaxRequestWorkers 100 # 最大并发连接
|
3. 安全加固
防火墙规则:仅开放必要端口(如 80, 443, 2222)。
禁用不必要模块:如 Apache 的 mod_autoindex(目录列表)。
定期更新:
|
Bash apt update && apt upgrade -y # Debian/Ubuntu yum update -y # CentOS
|
4. 日志轮转
使用 logrotate 自动切割日志(配置文件:/etc/logrotate.d/nginx 或 /etc/logrotate.d/apache2)。
五、故障排查
SSH 连接失败
检查服务状态:systemctl status sshd。
查看日志:journalctl -u sshd 或 /var/log/auth.log。
验证防火墙和端口:ufw status 或 firewall-cmd --list-all。
2. Web 服务 502 错误
检查后端服务(如 PHP-FPM)是否运行:systemctl status php-fpm。
查看错误日志:tail -f /var/log/nginx/error.log 或 /var/log/apache2/error.log。
3. 端口冲突
|
Bash ss -tulnp | grep :80 # 查看 80 端口占用进程 kill -9 <PID> # 终止冲突进程
|
附:命令速查表
|
Bash # 生成 Nginx 配置语法检查 nginx -t
# 查看 Apache 已加载模块 apachectl -M
# 强制重新加载 SSH 配置(不断开现有连接) systemctl reload sshd
# 统计 Nginx 访问量前 10 的 IP awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
|
掌握这些服务的配置与管理,运维工程师可高效部署和维护 Web 服务与远程访问环境!
3.2 网络工具
3.2.1 ping, traceroute, nslookup
面向运维工程师的网络诊断工具指南
ping、traceroute、nslookup 和 dig 是排查网络连通性、路由路径及 DNS 问题的核心工具。以下是它们的详细用法及典型运维场景。
一、ping:测试网络连通性
核心用途
检查目标主机是否可达,测量数据包往返时间(RTT)及丢包率。
2. 基本语法与示例
常用选项:-c <次数>:指定发送的数据包数(如 -c 5)。-i <秒>:设置发包间隔(如 -i 0.5)。-s <字节>:指定数据包大小(如 -s 1024)。-W <秒>:设置超时时间(如 -W 2)。
示例:
|
Bash ping -c 4 google.com # 发送4次探测包 ping -s 512 -i 0.2 8.8.8.8 # 发送512字节包,间隔0.2秒
|
3. 输出解析
|
Bash 64 bytes from 142.250.179.14: icmp_seq=1 ttl=117 time=12.3 ms
|
icmp_seq:数据包序列号(检测丢包)。
ttl:生存时间(越小表示经过的路由跳数越多)。
time:往返时间(RTT,单位毫秒)。
4. 典型场景
检测网络延迟:观察 time 波动。
排查丢包问题:检查 icmp_seq 是否连续。
验证域名解析:若直接使用 IP 能 ping 通但域名不通,可能是 DNS 问题。
二、traceroute:追踪路由路径
核心用途
显示数据包从源到目标经过的每一跳(路由器或网关),识别网络瓶颈或故障节点。
2. 基本语法与示例
|
Bash traceroute [选项] 目标IP或域名
|
常用选项:-n:禁用 DNS 反向解析(显示 IP 而非域名)。-T:使用 TCP SYN 探测(默认 UDP)。-p <端口>:指定目标端口(如 -p 80)。-m <跳数>:设置最大跳数(默认 30)。
示例:
|
Bash traceroute google.com # 默认 UDP 探测 traceroute -T -p 443 8.8.8.8 # 使用 TCP 443 端口 traceroute -n -m 20 example.com # 禁用 DNS 解析,最大 20 跳
|
3. 输出解析
|
Bash 1 192.168.1.1 1.234 ms 1.123 ms 1.456 ms 2 10.10.0.1 15.678 ms 16.123 ms 17.890 ms 3 * * * # 节点无响应
|
每行表示一跳,三个时间对应三次探测的 RTT。
* 表示该节点未响应(可能防火墙丢弃探测包)。
4. 替代工具
mtr:结合 ping 和 traceroute,实时监控路径质量。
|
Bash mtr -n 8.8.8.8 # 持续显示丢包率和延迟
|
三、nslookup:DNS 查询工具
核心用途
查询 DNS 记录(如 A、MX、NS 记录),验证域名解析结果。
2. 基本语法与示例
交互模式:
|
Bash nslookup > server 8.8.8.8 # 指定 DNS 服务器 > set type=MX # 查询 MX 记录 > example.com > exit
|
命令行模式:
|
Bash nslookup example.com 8.8.8.8 # 指定 DNS 服务器查询 nslookup -type=MX example.com # 查询邮件服务器记录 nslookup -debug example.com # 显示详细调试信息
|
3. 常见记录类型
|
类型
|
说明
|
|
A
|
IPv4 地址
|
|
AAAA
|
IPv6 地址
|
|
MX
|
邮件服务器记录
|
|
NS
|
域名服务器记录
|
|
CNAME
|
别名记录
|
四、dig:高级 DNS 查询工具
核心用途
比 nslookup 更强大的 DNS 查询工具,支持更详细的输出和调试。
2. 基本语法与示例
|
Bash dig [选项] 域名 [记录类型] @DNS服务器
|
常用选项:+short:仅显示精简结果。+trace:跟踪 DNS 解析全过程(从根域名服务器开始)。+nocmd:隐藏命令头信息。
示例:
|
Bash dig example.com A # 查询 A 记录 dig @8.8.8.8 example.com MX # 指定 DNS 服务器查询 MX 记录 dig +trace example.com # 跟踪 DNS 解析路径 dig +short example.com # 仅显示 IP 地址
|
3. 输出解析
|
Bash ;; ANSWER SECTION: example.com. 3600 IN A 93.184.216.34
|
3600:TTL(缓存时间,单位秒)。
IN:Internet 记录类型。
A:记录类型。
4. 典型场景
验证 DNS 配置:检查新添加的 DNS 记录是否生效。
排查 DNS 污染:使用 dig +trace 跟踪解析路径。
对比不同 DNS 服务器:指定多个 DNS 服务器查询结果差异。
五、综合故障排查流程
域名无法访问
Step 1:ping 域名 → 检查是否解析到 IP。
失败:使用 dig 或 nslookup 排查 DNS。
成功但丢包:traceroute 查看路径中的故障节点。
2. 邮件服务异常
Step 1:nslookup -type=MX 域名 → 检查 MX 记录配置。
Step 2:telnet mx-server.com 25 → 测试 SMTP 端口连通性。
3. CDN 节点延迟高
Step 1:dig +short 域名 → 获取所有 A 记录 IP。
Step 2:mtr <CDN-IP> → 分析到具体节点的网络质量。
六、速查表
|
场景
|
命令示例
|
|
快速测试域名解析
|
dig +short example.com 或 nslookup example.com
|
|
检查本地 DNS 服务器
|
dig @127.0.0.1 example.com
|
|
跟踪 DNS 解析全过程
|
dig +trace example.com
|
|
测试 TCP 端口连通性
|
traceroute -T -p 443 example.com
|
|
持续监控网络路径质量
|
mtr -n 8.8.8.8
|
|
验证邮件服务器配置
|
nslookup -type=MX example.com
|
通过灵活组合这些工具,运维工程师可以快速定位网络层和 DNS 层的故障,保障服务的可用性和性能!
3.2 .2 curl, wget
面向运维工程师的 curl 和 wget 指南
curl 和 wget 是 Linux 中用于网络数据传输的核心工具,支持 HTTP/HTTPS、FTP 等协议,适用于文件下载、API 调试、自动化脚本等场景。以下是两者的核心功能对比及实战用法。
一、curl:多功能数据传输工具
核心用途
发送 HTTP 请求(GET/POST/PUT/DELETE 等)。
调试 RESTful API、上传/下载文件。
支持更多协议(如 SMTP、SCP)和高级功能(如 HTTP 头操作)。
2. 常用选项与示例
|
场景
|
命令示例
|
|
基本 GET 请求
|
curl https://api.example.com/data
|
|
保存响应到文件
|
curl -o output.json https://api.example.com/data
|
|
指定 HTTP 方法
|
curl -X POST https://api.example.com/create
|
|
提交表单数据
|
curl -d "user=admin&pass=123" https://login.example.com
|
|
上传文件
|
curl -F "file=@/path/to/file" https://upload.example.com
|
|
自定义 HTTP 头
|
curl -H "Content-Type: application/json" -H "Authorization: Bearer token"
|
|
忽略 SSL 证书验证
|
curl -k https://insecure.example.com
|
|
跟随重定向
|
curl -L https://redirect.example.com
|
|
限速下载(100KB/s)
|
curl --limit-rate 100K -O https://example.com/largefile.zip
|
|
断点续传
|
curl -C - -O https://example.com/largefile.zip
|
|
输出详细过程
|
curl -v https://api.example.com
|
3. 高级用法
与 jq 结合处理 JSON 响应:
|
Bash curl -s https://api.example.com/data | jq '.results[0].name'
|
模拟浏览器请求:
|
Bash curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ..." https://example.com
|
测试网站响应时间:
|
Bash curl -w "DNS解析: %{time_namelookup}s | 连接建立: %{time_connect}s | 总耗时: %{time_total}s\n" -o /dev/null -s https://example.com
|
二、wget:强大的下载工具
核心用途
递归下载整个网站(镜像功能)。
支持断点续传、限速、后台下载。
更适合批量下载文件和简单 HTTP 请求。
2. 常用选项与示例
|
场景
|
命令示例
|
|
下载文件
|
wget https://example.com/file.zip
|
|
指定保存文件名
|
wget -O custom_name.zip https://example.com/file.zip
|
|
断点续传
|
wget -c https://example.com/largefile.zip
|
|
后台下载
|
wget -b https://example.com/largefile.zip
|
|
限速下载(1MB/s)
|
wget --limit-rate=1m https://example.com/largefile.zip
|
|
递归下载网站
|
wget -r -np -k -p https://example.com/path/
|
|
下载 FTP 文件
|
wget ftp://user:pass@ftp.example.com/file.zip
|
|
忽略证书错误
|
wget --no-check-certificate https://insecure.example.com
|
|
自定义 User-Agent
|
wget --user-agent="Mozilla/5.0..." https://example.com
|
|
重试失败请求
|
wget --tries=5 https://unstable.example.com/file
|
3. 递归下载参数解析
-r:递归下载。
-np:不追溯至父目录。
-k:转换链接为本地路径。
-p:下载页面所需资源(如图片、CSS)。
三、curl vs wget 对比
|
特性
|
curl
|
wget
|
|
协议支持
|
HTTP、HTTPS、FTP、SMTP、SCP 等
|
HTTP、HTTPS、FTP
|
|
交互模式
|
单次请求
|
支持递归下载和批量任务
|
|
脚本集成
|
更适合 API 调试(JSON 处理)
|
更适合自动化下载(断点续传)
|
|
输出目标
|
默认输出到终端,需 -o 保存文件
|
默认下载到当前目录
|
|
用户认证
|
支持多种认证方式(OAuth、Basic)
|
基础认证(user:pass@URL)
|
|
典型场景
|
API 测试、提交数据、调试头部
|
批量下载、镜像网站、后台任务
|
四、运维场景实践
快速测试 API 可用性
|
Bash curl -s -o /dev/null -w "%{http_code}" https://api.example.com/health # 输出 200 表示正常
|
2. 定时下载日志文件
|
Bash wget -q -N https://logs.example.com/daily_$(date +\%F).log
|
3. 监控网页内容变化
|
Bash curl -s https://status.example.com | grep -q "Operational" && echo "服务正常" || echo "服务异常"
|
4. 批量下载文件列表
|
Bash wget -i url_list.txt # url_list.txt 中每行一个下载链接
|
五、安装与配置
安装方法
Debian/Ubuntu:
|
Bash apt install curl wget
|
Red Hat/CentOS:
|
Bash yum install curl wget
|
2. 代理配置
临时使用代理:
|
Bash curl -x http://proxy.example.com:8080 https://target.example.com wget -e use_proxy=yes -e http_proxy=proxy.example.com:8080 https://target.example.com
|
永久配置代理:
|
Bash # 写入 ~/.bashrc 或 /etc/environment export http_proxy="http://proxy.example.com:8080" export https_proxy="http://proxy.example.com:8080"
|
六、常见问题排查
证书错误(SSL/TLS)
|
Bash curl --insecure https://example.com # 临时忽略证书验证(不安全) wget --no-check-certificate https://example.com
|
2. 下载中断后恢复
|
Bash wget -c https://example.com/largefile.zip # 自动续传 curl -C - -O https://example.com/largefile.zip # 手动指定续传
|
3. 处理限速或防火墙
|
Bash wget --limit-rate=500k https://example.com/file # 限速下载 curl --limit-rate 500K -O https://example.com/file
|
七、速查表
|
Bash # 查看服务器响应头 curl -I https://example.com
# 下载并解压压缩包(无需保存文件) curl -s https://example.com/file.tar.gz | tar xz
# 镜像静态网站(保留目录结构) wget -mk -np https://example.com/path/
# 提交 JSON 数据 curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com
|
掌握 curl 和 wget 的使用场景与技巧,可大幅提升运维工程师的网络调试、数据采集和自动化能力!
3.2.3 tcpdump(抓包分析)
面向运维工程师的 tcpdump 抓包分析指南
tcpdump 是 Linux 下最强大的网络抓包工具,用于实时捕获和分析网络流量,常用于排查网络故障、分析协议交互、检测异常流量。以下是其核心用法及实战场景。
一、基础用法
核心命令格式
2. 常用选项
|
选项
|
说明
|
|
-i <接口>
|
指定抓包接口(如 eth0、any 表示所有接口)
|
|
-n
|
禁用域名解析(显示 IP 而非域名)
|
|
-nn
|
禁用域名和端口解析(显示端口号而非服务名)
|
|
-c <数量>
|
捕获指定数量的包后退出
|
|
-w <文件>
|
将抓包结果保存到文件(如 -w capture.pcap)
|
|
-r <文件>
|
读取抓包文件进行分析(如 -r capture.pcap)
|
|
-v
|
显示详细信息(-vv 或 -vvv 更详细)
|
|
-s <长度>
|
设置抓包长度(如 -s 0 捕获完整数据包)
|
|
-A
|
以 ASCII 格式显示数据(适合 HTTP/文本协议)
|
|
-X
|
同时以十六进制和 ASCII 显示数据内容
|
3. 常用过滤表达式
|
表达式
|
说明
|
|
host <IP>
|
过滤指定 IP 的流量(源或目标)
|
|
port <端口>
|
过滤指定端口的流量
|
|
src <IP>
|
过滤源 IP 的流量
|
|
dst <IP>
|
过滤目标 IP 的流量
|
|
tcp / udp
|
过滤 TCP 或 UDP 协议
|
|
icmp
|
过滤 ICMP 协议(如 ping 请求)
|
|
net <网络>
|
过滤指定网段(如 net 192.168.1.0/24)
|
|
and / or / not
|
逻辑组合(如 port 80 and host 10.0.0.1)
|
二、典型运维场景
捕获 HTTP 请求
|
Bash tcpdump -i eth0 -A -s0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
|
说明:捕获 eth0 接口的 HTTP 流量,显示 ASCII 内容。
2. 分析 DNS 查询
|
Bash tcpdump -i any -n port 53
|
输出示例:
|
Bash 10:00:01.123 IP 192.168.1.100.4321 > 8.8.8.8.53: 12345+ A? example.com 10:00:01.456 IP 8.8.8.8.53 > 192.168.1.100.4321: 12345 1/0/0 A 93.184.216.34
|
3. 检测 TCP 连接问题
|
Bash tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'
|
说明:抓取 TCP 握手(SYN/ACK)包,排查连接超时或拒绝。
4. 捕获特定 IP 的流量
|
Bash tcpdump -i eth0 host 192.168.1.100 and \(port 80 or port 443\)
|
说明:捕获 192.168.1.100 的 HTTP/HTTPS 流量。
5. 保存抓包文件供后续分析
|
Bash tcpdump -i eth0 -w web_traffic.pcap 'port 80 or port 443'
|
后续分析:使用 Wireshark 或 tcpdump -r web_traffic.pcap 分析。
三、输出解析与关键字段
示例输出
|
Bash 10:00:00.000000 IP 192.168.1.100.54321 > 93.184.216.34.80: Flags [S], seq 123456789, win 64240, length 0
|
字段解析:
10:00:00.000000:时间戳。
IP:协议类型(IPv4)。
192.168.1.100.54321:源 IP 和端口。
93.184.216.34.80:目标 IP 和端口(80 为 HTTP)。
Flags [S]:TCP 标志(S=SYN,.=ACK,F=FIN,R=RST)。
seq:序列号。
win:窗口大小。
length:数据长度。
2. 常见 TCP 标志组合
|
Flags
|
说明
|
|
[S]
|
SYN(建立连接请求)
|
|
[S.]
|
SYN-ACK(确认连接)
|
|
[.]
|
ACK(数据包确认)
|
|
[P.]
|
PSH-ACK(推送数据)
|
|
[F.]
|
FIN-ACK(关闭连接)
|
|
[R.]
|
RST-ACK(强制终止连接)
|
四、高级技巧
过滤 HTTP GET/POST 请求
|
Bash tcpdump -i eth0 -A -s0 'tcp port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'
|
说明:通过匹配 TCP 负载中的 GET(0x47455420)或 POST(0x504f5354)字符。
2. 统计流量最多的 IP
|
Bash tcpdump -i eth0 -nn | awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -nr
|
3. 检测 ARP 欺骗
|
Bash tcpdump -i eth0 -nn 'arp' | grep -v '192.168.1.1'
|
说明:监控 ARP 包,排除合法网关(192.168.1.1)外的 ARP 响应。
4. 分析重传包
|
Bash tcpdump -i eth0 'tcp[tcpflags] & (tcp-ack) == 0 and tcp[13] & 4 != 0'
|
说明:抓取未收到 ACK 的重传包,排查网络拥塞或丢包。
五、注意事项
权限问题:需 root 权限或 CAP_NET_RAW 能力(使用 sudo)。
性能影响:高频抓包可能消耗 CPU 和磁盘 I/O(生产环境慎用 -s 0)。
过滤优化:尽量缩小抓包范围(如指定端口、IP),避免全量捕获。
文件管理:定期清理抓包文件,避免占用磁盘空间。
六、速查表
|
Bash # 查看所有可用接口 tcpdump -D
# 捕获 ICMP 流量(ping 测试) tcpdump -i eth0 icmp
# 捕获 SSH 连接建立过程 tcpdump -i eth0 'tcp port 22 and (tcp[tcpflags] & tcp-syn) != 0'
# 分析 HTTPS 握手(SNI 字段) tcpdump -i eth0 -nn -A 'tcp port 443 and tcp[((tcp[12]>>2)&0x3c)]=0x16'
# 统计 TCP 状态分布 tcpdump -i eth0 -nn 'tcp' | awk '{print $6}' | sort | uniq -c
|
通过掌握 tcpdump,运维工程师可以深入分析网络行为,快速定位连接问题、性能瓶颈及安全威胁!
3.3 防火墙
3.3.1 iptables(规则配置)
面向运维工程师的 iptables 防火墙配置指南
iptables 是 Linux 系统中最经典的防火墙工具,用于配置网络流量规则(过滤、NAT、端口转发等)。以下是其核心概念、规则配置方法及实战场景。
一、核心概念
四表五链
表(Tables):定义规则的作用类型。
filter:默认表,用于流量过滤(允许/拒绝)。
nat:网络地址转换(如端口转发、SNAT/DNAT)。
mangle:修改数据包头(如 TTL、QoS)。
raw:跳过连接跟踪(用于特殊场景)。
链(Chains):规则生效的节点。
INPUT:处理进入本机的数据包。
OUTPUT:处理本机发出的数据包。
FORWARD:处理经过本机转发的数据包。
PREROUTING(nat):修改目标地址(DNAT)。
POSTROUTING(nat):修改源地址(SNAT)。
2. 规则匹配流程
|
Bash 数据包 → PREROUTING (nat) → 路由决策 → INPUT (filter) → 本机进程 ↓ FORWARD (filter) ↓ 数据包 ← POSTROUTING (nat) ← OUTPUT (filter) ← 本机进程
|
二、基础规则管理
查看当前规则
|
Bash iptables -L -n -v # 查看 filter 表规则(简略) iptables -t nat -L -n # 查看 nat 表规则 iptables -S # 查看所有规则(命令形式)
|
2. 清空规则
|
Bash iptables -F # 清空 filter 表规则 iptables -t nat -F # 清空 nat 表规则 iptables -X # 删除自定义链 iptables -Z # 重置计数器
|
3. 默认策略(Policy)
|
Bash iptables -P INPUT DROP # 默认拒绝所有入站流量(慎用!) iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # 允许所有出站流量
|
三、常用规则配置示例
允许 SSH 连接(端口 22)
|
Bash iptables -A INPUT -p tcp --dport 22 -j ACCEPT
|
2. 允许 HTTP/HTTPS 流量
|
Bash iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT
|
3. 允许 ICMP(ping)
|
Bash iptables -A INPUT -p icmp -j ACCEPT
|
4. 允许回环接口(lo)
|
Bash iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT
|
5. 限制并发连接数(防 DDoS)
|
Bash iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 -j REJECT
|
6. 记录被拒绝的流量
|
Bash iptables -A INPUT -j LOG --log-prefix "IPTABLES-DENY: " --log-level 4 iptables -A INPUT -j DROP
|
四、高级配置
NAT 配置(端口转发)
|
Bash # 将外网 8080 端口转发到内网 192.168.1.100:80 iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80 iptables -t nat -A POSTROUTING -j MASQUERADE # 启用 SNAT
|
2. 源地址过滤(仅允许特定 IP 访问)
|
Bash iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
|
3. 防止 SYN 洪水攻击
|
Bash iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
|
4. 开放端口范围
|
Bash iptables -A INPUT -p tcp --dport 5000:6000 -j ACCEPT
|
5. 匹配多端口
|
Bash iptables -A INPUT -p tcp -m multiport --dports 21,22,80 -j ACCEPT
|
五、规则保存与恢复
保存规则
|
Bash # Debian/Ubuntu apt install iptables-persistent -y netfilter-persistent save
# Red Hat/CentOS 7- service iptables save # 规则保存到 /etc/sysconfig/iptables
# 通用方法 iptables-save > /etc/iptables/rules.v4 # IPv4 ip6tables-save > /etc/iptables/rules.v6 # IPv6
|
2. 恢复规则
|
Bash iptables-restore < /etc/iptables/rules.v4
|
六、故障排查
规则顺序问题
iptables 按顺序匹配规则,第一条匹配的规则生效。
使用 -I 插入规则到链的顶部(如 iptables -I INPUT 1 ...)。
2. 测试规则是否生效
|
Bash # 使用 tcpdump 监控流量 tcpdump -i eth0 port 80
# 检查日志 tail -f /var/log/syslog | grep "IPTABLES-DENY"
|
3. 紧急恢复
|
Bash iptables -F && iptables -P INPUT ACCEPT # 清空规则并允许所有流量
|
七、安全最佳实践
最小权限原则:仅开放必要端口。
默认拒绝策略:设置 INPUT 和 FORWARD 链默认 DROP。
定期备份规则:防止配置丢失。
结合 Fail2Ban:自动封禁恶意 IP。
禁用冗余服务:减少攻击面。
八、速查表
|
Bash # 删除指定规则(需先查看规则编号) iptables -L INPUT --line-numbers # 查看规则编号 iptables -D INPUT 2 # 删除 INPUT 链的第 2 条规则
# 配置 SNAT(内网访问外网) iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 公网IP
# 允许已建立的连接 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 限制 SSH 暴力破解 iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --set iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --update --seconds 60 --hitcount 3 -j DROP
|
通过掌握 iptables,运维工程师可以有效控制网络流量,保障服务安全与稳定性。建议结合 nftables(下一代替代工具)学习,以应对未来技术演进!
3.3.2 firewalld(动态管理)
面向运维工程师的 firewalld 动态防火墙管理指南
firewalld 是 Red Hat/CentOS/Fedora 等系统的默认防火墙工具,相比 iptables 提供更友好的动态管理能力,支持运行时规则热更新(无需重启服务),适用于云环境、容器等动态场景。以下是核心配置方法及实战示例。
一、核心概念
区域(Zone)
定义:预定义的网络信任级别(如 public、internal、dmz),每个区域包含一组规则。
默认区域:未明确绑定的接口默认归属的区域(通常为 public)。
常见内置区域:
|
区域名称
|
说明
|
|
trusted
|
允许所有流量
|
|
public
|
仅允许指定服务/端口
|
|
internal
|
类似 public,但信任度更高
|
|
block
|
拒绝所有入站流量
|
|
drop
|
丢弃所有入站流量(无响应)
|
2. 服务(Service)
定义:预定义的端口和协议组合(如 http、ssh、mysql)。
配置文件路径:/usr/lib/firewalld/services/*.xml(系统级)或 /etc/firewalld/services/*.xml(自定义)。
3. 运行时(Runtime)与永久(Permanent)配置
运行时配置:立即生效,但重启后失效。
永久配置:需使用 --permanent 参数,重启或重载后生效。
二、基础操作命令
服务管理
|
Bash # 启动/停止/重启 firewalld systemctl start firewalld systemctl stop firewalld systemctl restart firewalld
# 启用开机自启 systemctl enable firewalld
|
2. 查看状态与配置
|
Bash firewall-cmd --state # 检查运行状态 firewall-cmd --get-default-zone # 查看默认区域 firewall-cmd --get-active-zones # 查看活动区域及绑定的接口 firewall-cmd --list-all # 列出当前区域的所有规则 firewall-cmd --list-services # 列出当前区域允许的服务 firewall-cmd --list-ports # 列出当前区域允许的端口
|
3. 区域管理
|
Bash # 设置默认区域 firewall-cmd --set-default-zone=internal
# 将接口绑定到指定区域 firewall-cmd --zone=public --change-interface=eth0
# 查看指定区域的配置 firewall-cmd --zone=public --list-all
|
三、常用规则配置
开放服务/端口(立即生效)
|
Bash # 允许 HTTP 服务(端口 80/tcp) firewall-cmd --add-service=http
# 允许自定义端口(如 8080/tcp) firewall-cmd --add-port=8080/tcp
# 同时允许服务并永久生效 firewall-cmd --add-service=ssh --permanent firewall-cmd --reload # 重载永久配置
|
2. 移除服务/端口
|
Bash firewall-cmd --remove-service=ftp firewall-cmd --remove-port=3306/tcp
|
3. 配置源 IP 白名单
|
Bash # 允许 192.168.1.0/24 访问 SSH firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
|
4. 端口转发(NAT)
|
Bash # 将 80 端口转发到 192.168.1.100:8080 firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100
|
5. 拒绝特定 IP 访问
|
Bash # 拒绝 10.0.0.5 的所有流量 firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" reject'
|
四、高级功能
自定义服务
创建服务文件 /etc/firewalld/services/myapp.xml:
|
XML <?xml version="1.0" encoding="utf-8"?> <service> <short>MyApp</short> <description>My Custom Application</description> <port protocol="tcp" port="9000"/> <port protocol="udp" port="9001"/> </service>
|
加载服务:
|
Bash firewall-cmd --reload firewall-cmd --add-service=myapp
|
2. 富规则(Rich Rules)
允许来自特定 IP 的 ICMP:
|
Bash firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" protocol value="icmp" accept'
|
限制 SSH 连接速率:
|
Bash firewall-cmd --zone=public --add-rich-rule='rule service name="ssh" limit value="5/m" accept'
|
3. 直接规则(Direct Rules)
兼容 iptables 语法:
|
Bash firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT
|
五、运维场景实践
快速部署 Web 服务器
|
Bash # 允许 HTTP/HTTPS,并设置永久生效 firewall-cmd --add-service=http --permanent firewall-cmd --add-service=https --permanent firewall-cmd --reload
|
2. 临时开放端口供调试
|
Bash firewall-cmd --add-port=9000/tcp # 临时开放 firewall-cmd --remove-port=9000/tcp # 关闭
|
3. 隔离开发环境
|
Bash # 创建新区域 "dev" firewall-cmd --new-zone=dev --permanent firewall-cmd --reload
# 允许 SSH 和 HTTP,绑定接口 eth1 firewall-cmd --zone=dev --add-service=ssh firewall-cmd --zone=dev --add-service=http firewall-cmd --zone=dev --change-interface=eth1
|
4. 禁止 Ping 响应
|
Bash firewall-cmd --zone=public --add-rich-rule='rule protocol value="icmp" reject'
|
六、故障排查
检查规则是否生效
|
Bash firewall-cmd --list-all --zone=public ss -tuln | grep :80 # 确认端口监听
|
2. 查看被拒绝的日志
|
Bash journalctl -u firewalld | grep "REJECT"
|
3. 重置防火墙
|
Bash firewall-cmd --reset-to-defaults # 恢复默认配置
|
七、最佳实践
最小化开放端口:仅允许必要服务。
优先使用服务名:而非直接指定端口(提高可读性)。
定期审计规则:清理不再需要的规则。
结合 SELinux:增强系统安全。
备份配置:
|
Bash cp -r /etc/firewalld/ /backup/firewalld-config-$(date +%F)
|
八、速查表
|
Bash # 允许端口范围 firewall-cmd --add-port=5000-6000/tcp
# 允许来自特定 MAC 地址的访问 firewall-cmd --zone=internal --add-source=mac=00:1a:4b:XX:XX:XX
# 列出所有预定义服务 firewall-cmd --get-services
# 查看富规则 firewall-cmd --list-rich-rules
|
通过掌握 firewalld,运维工程师可以动态管理网络流量,灵活应对复杂环境,同时保持配置的清晰与可维护性!
3.3.3 UFW(简单防火墙)
面向运维工程师的 UFW(Uncomplicated Firewall)防火墙管理指南
UFW 是 Ubuntu/Debian 系统的默认防火墙工具,旨在简化 iptables 的复杂性,提供更友好的命令行交互,适合快速配置和管理防火墙规则。以下是 UFW 的核心用法及典型场景。
一、核心概念
设计目标:通过简单命令替代复杂的 iptables 语法。
依赖关系:底层仍基于 iptables,但自动管理规则链。
默认策略:默认禁止所有入站流量,允许所有出站流量。
二、基础操作
安装与启停
|
Bash # 安装 UFW(Ubuntu 通常预装) sudo apt install ufw
# 启用 UFW sudo ufw enable
# 禁用 UFW sudo ufw disable
# 查看状态 sudo ufw status verbose
|
2. 默认策略
|
Bash # 默认禁止入站,允许出站 sudo ufw default deny incoming sudo ufw default allow outgoing
# 恢复默认配置 sudo ufw reset
|
三、常用规则配置
开放服务/端口
|
Bash # 通过服务名开放(如 SSH) sudo ufw allow ssh
# 指定端口和协议 sudo ufw allow 80/tcp sudo ufw allow 443
# 开放端口范围 sudo ufw allow 5000:6000/tcp
# 允许特定 IP 访问端口 sudo ufw allow from 192.168.1.100 to any port 22
|
2. 拒绝流量
|
Bash # 拒绝 HTTP 访问 sudo ufw deny 80/tcp
# 拒绝特定 IP 的所有流量 sudo ufw deny from 10.0.0.5
|
3. 删除规则
|
Bash # 先查看规则编号 sudo ufw status numbered
# 根据编号删除规则 sudo ufw delete 2
|
四、高级配置
限制连接速率(防暴力破解)
|
Bash # 限制 SSH 每分钟最多 6 次连接 sudo ufw limit ssh/tcp
# 自定义端口限速 sudo ufw limit proto tcp from any to any port 22
|
2. 配置 IP 白名单
|
Bash # 允许子网访问数据库端口 sudo ufw allow from 192.168.1.0/24 to any port 3306
|
3. 端口转发(需配置 /etc/ufw/sysctl.conf)
|
Bash # 启用 IP 转发 sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/ufw/sysctl.conf
# 添加转发规则(将 80 转发到 192.168.1.100:8080) sudo ufw route allow proto tcp from any to any port 80 forward to 192.168.1.100 port 8080
|
4. 应用层协议支持
|
Bash # 允许特定应用(需预定义规则) sudo ufw app list # 查看支持的应用 sudo ufw allow 'Nginx Full' # 允许 Nginx 的 HTTP/HTTPS
|
五、运维场景实践
快速部署 Web 服务器
|
Bash sudo ufw allow http sudo ufw allow https sudo ufw enable
|
2. 保护数据库服务
|
Bash # 仅允许内网访问 MySQL sudo ufw allow from 192.168.1.0/24 to any port 3306
|
3. 临时开放调试端口
|
Bash sudo ufw allow 9000/tcp # 开放 sudo ufw delete allow 9000/tcp # 关闭
|
4. 监控与日志
|
Bash # 查看日志(实时跟踪) sudo tail -f /var/log/ufw.log
# 过滤拒绝的流量 grep "\[UFW BLOCK\]" /var/log/ufw.log
|
六、故障排查
规则未生效
确认 UFW 已启用:sudo ufw status。
检查服务是否监听正确端口:ss -tuln | grep :<端口>。
2. 恢复误操作
|
Bash sudo ufw reset # 重置所有规则并禁用 UFW
|
3. 兼容 Docker 等容器工具
Docker 默认会绕过 UFW 规则,需手动调整:
|
Bash # 修改 Docker 配置(/etc/docker/daemon.json) { "iptables": false } systemctl restart docker
|
七、最佳实践
最小化开放端口:仅允许必要服务。
优先使用服务名:而非直接指定端口(如 ssh 代替 22/tcp)。
定期审计规则:清理不再需要的规则。
结合 Fail2Ban:自动封禁恶意 IP。
备份配置:
|
Bash sudo cp /etc/ufw/user.rules /backup/ufw.rules.bak
|
八、速查表
|
Bash # 允许特定网卡(如 eth1) sudo ufw allow in on eth1 to any port 80
# 拒绝 Ping sudo ufw deny proto icmp
# 查看规则详情(含编号) sudo ufw status numbered
# 禁用 IPv6 sudo vi /etc/default/ufw # 修改 IPV6=no sudo ufw reload
|
通过掌握 UFW,运维工程师可以快速构建安全的防火墙策略,兼顾易用性与功能性,尤其适合中小规模环境和个人服务器!
4. 存储管理
磁盘管理
4.1.1 查看磁盘信息(lsblk, df, du)
从SRE运维工程师视角查看磁盘信息时,lsblk、df和du是核心工具。以下是分步骤的操作指南及解析:
使用 lsblk 查看块设备拓扑
命令:
作用:
列出所有块设备(物理磁盘、分区、逻辑卷等)的层次结构和文件系统信息,包括设备名称、挂载点、文件系统类型(如ext4/xfs)、UUID和大小。
输出解析:
NAME: 设备名(如sda、vda)。
FSTYPE: 文件系统类型(未格式化分区显示为空)。
MOUNTPOINT: 挂载路径(未挂载设备不显示)。
SIZE: 设备容量。
UUID: 设备的唯一标识符。
典型场景:
确认磁盘是否被系统识别。
检查未挂载的分区(无MOUNTPOINT),判断是否需要扩容或挂载。
查看LVM逻辑卷结构(如vg-lv_root)。
2. 使用 df 查看文件系统磁盘使用
命令:
作用:
显示已挂载文件系统的总空间、已用空间、可用空间、使用百分比及文件系统类型。
参数说明:
-h: 以易读单位(GB/MB)显示。
-T: 显示文件系统类型。
输出解析:
Filesystem: 设备路径或逻辑卷名(如/dev/sda1)。
Use%: 使用率,超过80%需告警。
Mounted on: 挂载点(如/var)。
典型场景:
快速定位磁盘空间不足的挂载点(如/根目录或/data)。
发现异常挂载点(如临时文件系统tmpfs占用过高)。
3. 使用 du 分析目录/文件占用
命令:
|
Bash du -h --max-depth=1 /path/to/dir | sort -rh
|
作用:
统计指定目录下各子目录/文件的磁盘使用量,按大小排序。
参数说明:
--max-depth=1: 仅显示一级子目录。
-h: 易读格式。
sort -rh: 按人类可读的数字逆序排序。
典型场景:
定位大文件:进入高使用率挂载点后,逐层执行du缩小范围。
查找日志、缓存等占空间的文件(如/var/log或/tmp)。
示例:
|
Bash # 分析 /var 下占用最大的目录 cd /var && sudo du -h --max-depth=1 | sort -rh
|
4. 组合使用:故障排查流程
场景:收到 /data 分区使用率95%的告警。
Step 1 - 确认挂载点状态:
输出示例:
|
Plain Text /dev/sdb1 ext4 200G 190G 10G 95% /data
|
Step 2 - 查看块设备结构:
|
Bash lsblk -f | grep -A1 sdb
|
输出示例:
|
Plain Text sdb 8:16 0 200G 0 disk └─sdb1 8:17 0 200G 0 part /data ext4
|
确认/data对应的设备及是否可扩容(如云盘需控制台扩展)。
Step 3 - 定位大文件/目录:
|
Bash cd /data && sudo du -h --max-depth=1 | sort -rh
|
输出示例:
|
Plain Text 150G ./logs 30G ./backup 10G ./uploads
|
发现logs目录占用150G,进一步分析:
|
Bash find ./logs -type f -size +100M -exec ls -lh {} \;
|
查找大于100MB的文件(如未压缩的日志文件)。
5. 常见问题与解决
问题1:df与du统计结果不一致
原因:文件被删除但仍有进程占用(如未重启的应用日志)。
解决:
|
Bash lsof +L1 /data # 查看被删除但仍被进程占用的文件
|
重启相关进程或清理残留句柄。
问题2:磁盘空间不足但未找到大文件
可能原因:小文件堆积或隐藏文件(如Docker容器日志)。
解决:
|
Bash # 检查隐藏文件 du -h /data/.* --max-depth=1 2>/dev/null # 检查Docker日志 du -h /var/lib/docker/containers/*/*-json.log
|
6. 自动化建议
监控工具:Prometheus + Node Exporter 实时监控磁盘使用率。
日志清理:配置logrotate定期压缩/删除旧日志。
扩容预案:对关键分区(如/、/var)提前规划LVM或云磁盘动态扩容。
通过熟练使用lsblk、df和du,SRE工程师可快速诊断磁盘问题,结合系统知识优化存储架构,确保服务稳定性。
4.1.2 分区管理(fdisk, parted)
面向运维工程师的 Linux 分区管理指南
fdisk 和 parted 是 Linux 系统中管理磁盘分区的核心工具,适用于创建、调整、删除分区等操作。以下是两者的核心用法对比及典型场景实践。
一、工具对比
|
特性
|
fdisk
|
parted
|
|
分区表类型
|
仅支持 MBR(旧版)
|
支持 MBR 和 GPT(推荐 GPT)
|
|
磁盘容量限制
|
最大 2TB
|
支持超大容量(如 16EB)
|
|
交互模式
|
命令行交互
|
交互式或单命令模式
|
|
复杂度
|
简单易用
|
功能更强大,支持更多操作
|
|
适用场景
|
小容量磁盘、传统分区管理
|
大容量磁盘、动态调整分区、现代系统
|
二、fdisk 基础操作(适用于 MBR 分区表)
进入磁盘管理
|
Bash sudo fdisk /dev/sdX # 替换 X 为实际磁盘标识(如 sda)
|
2. 常用命令
|
命令
|
功能
|
|
n
|
创建新分区
|
|
d
|
删除分区
|
|
p
|
打印分区表
|
|
w
|
保存并退出
|
|
q
|
不保存退出
|
|
t
|
修改分区类型(如 83=Linux)
|
3. 示例:创建新分区
执行 sudo fdisk /dev/sda。
输入 n 创建新分区。
选择分区类型(主分区 p 或扩展分区 e)。
设置起始和结束扇区(默认回车可自动分配)。
输入 w 保存并退出。
4. 格式化分区
|
Bash sudo mkfs.ext4 /dev/sda1 # 格式化为 ext4 文件系统
|
三、parted 基础操作(支持 GPT 和 MBR)
进入磁盘管理
|
Bash sudo parted /dev/sdX # 替换 X 为实际磁盘标识
|
2. 常用命令
|
命令
|
功能
|
|
mklabel
|
创建分区表(如 gpt 或 msdos)
|
|
mkpart
|
创建新分区
|
|
rm <分区号>
|
删除分区
|
|
print
|
显示分区信息
|
|
resizepart
|
调整分区大小(需文件系统支持)
|
|
quit
|
退出
|
3. 示例:创建 GPT 分区表并分区
执行 sudo parted /dev/sdb。
输入 mklabel gpt 创建 GPT 分区表。
输入 mkpart:
输入分区名称(如 data1)。
指定文件系统类型(如 ext4)。
设置起始和结束位置(如 1GB 10GB)。
输入 print 验证分区信息。
输入 quit 退出。
4. 格式化分区
|
Bash sudo mkfs.xfs /dev/sdb1 # 格式化为 XFS 文件系统
|
四、运维场景实践
扩展已有分区(需 LVM 支持)
使用 parted 调整分区大小:
卸载分区:umount /dev/sdb1。
启动 parted,执行 resizepart <分区号> <新结束位置>。
扩展文件系统(如 ext4):
|
Bash sudo resize2fs /dev/sdb1
|
2. 转换分区表类型(MBR → GPT)
|
Bash sudo parted /dev/sda (parted) mklabel gpt # 注意:此操作会清除磁盘所有数据! (parted) quit
|
3. 批量分区(脚本自动化)
|
Bash # 使用 parted 非交互模式创建分区 sudo parted /dev/sdc --script mklabel gpt sudo parted /dev/sdc --script mkpart primary 0% 100%
|
五、注意事项
数据备份:分区操作可能导致数据丢失,操作前务必备份重要数据!
分区表选择:
MBR:兼容性好,但仅支持 ≤2TB 磁盘和最多 4 个主分区。
GPT:推荐用于现代系统,支持超大磁盘和 128+ 分区。
分区对齐:使用 parted 时建议按百分比分配(如 0% 100%),避免性能问题。
文件系统扩展:调整分区大小后需同步扩展文件系统(如 resize2fs 或 xfs_growfs)。
六、工具补充
lsblk:查看块设备信息。
partprobe:通知内核更新分区表(避免重启)。
|
Bash sudo partprobe /dev/sda
|
gdisk:类似 fdisk,但支持 GPT 分区表。
七、速查表
|
Bash # 查看所有磁盘及分区 sudo fdisk -l sudo parted -l
# 删除分区(parted 中) (parted) rm 1
# 设置分区标志(如 boot) (parted) set 1 boot on
|
通过掌握 fdisk 和 parted,运维工程师可以高效管理磁盘分区,灵活应对存储需求变化。建议优先使用 parted 处理现代大容量磁盘,并结合 LVM 实现更灵活的存储管理!
4.1.3 文件系统管理(mkfs, mount, umount)
从运维工程师视角管理文件系统时,mkfs(创建文件系统)、mount(挂载文件系统)和umount(卸载文件系统)是核心操作工具。以下是详细的操作指南及场景解析:
使用 mkfs 创建文件系统
作用:
在分区或逻辑卷上初始化文件系统(格式化),使其可被操作系统使用。
常用命令格式:
|
Bash mkfs -t <文件系统类型> <设备路径>
|
常见文件系统类型:
ext4:Linux默认文件系统,稳定通用。
xfs:高性能文件系统,适合大文件和高并发。
btrfs:支持快照、压缩等高级特性。
vfat:兼容Windows的FAT32文件系统(如U盘)。
示例:
|
Bash # 在 /dev/sdb1 分区上创建 ext4 文件系统 mkfs -t ext4 /dev/sdb1
# 快速创建 xfs 文件系统(-f 强制覆盖) mkfs.xfs -f /dev/sdc1
|
关键参数:
-t:指定文件系统类型(如ext4, xfs)。
-L:设置卷标(便于识别,如mkfs.ext4 -L "DATA" /dev/sdb1)。
-f:强制覆盖现有文件系统。
注意事项:
数据丢失风险:mkfs会清空目标设备上的所有数据,操作前务必确认设备路径。
选择文件系统:根据场景选择类型(如数据库推荐xfs,快照需求选btrfs)。
2. 使用 mount 挂载文件系统
作用:
将文件系统关联到目录(挂载点),使存储设备可被访问。
命令格式:
示例:
|
Bash # 挂载 /dev/sdb1 到 /data 目录 mkdir -p /data mount /dev/sdb1 /data
# 挂载时指定选项(如只读、禁用访问时间更新) mount -o ro,noatime /dev/sdc1 /backup
|
常用挂载选项(-o参数):
rw/ro:读写/只读模式。
noatime:禁止更新文件访问时间,提升性能。
nofail:启动时忽略挂载失败(避免系统无法启动)。
defaults:使用默认选项(rw, suid, dev, exec, auto, nouser, async)。
临时挂载 vs 永久挂载:
临时挂载:mount命令生效,重启后失效。
永久挂载:需编辑/etc/fstab文件,添加挂载配置:
|
Bash
/dev/sdb1 /data ext4 defaults 0 0
|
验证配置后执行:
|
Bash mount -a # 挂载所有在/etc/fstab中定义的文件系统
|
典型场景:
挂载新磁盘到业务目录(如/data)。
挂载ISO镜像文件:
|
Bash mount -o loop /path/to/image.iso /mnt/iso
|
3. 使用 umount 卸载文件系统
作用:
安全断开文件系统与挂载点的关联,确保数据写入完成。
命令格式:
示例:
|
Bash # 通过挂载点卸载 umount /data
# 通过设备路径卸载 umount /dev/sdb1
|
常见问题与解决:
设备忙(target is busy):有进程正在访问挂载点下的文件,需终止进程或查找占用进程:
|
Bash lsof +D /data # 查看占用 /data 的进程 fuser -vm /data # 显示进程PID及操作类型 fuser -km /data # 强制终止相关进程(谨慎使用)
|
注意事项:
数据安全:卸载前确保无写入操作,避免数据损坏。
强制卸载:在无法正常卸载时使用umount -l(lazy卸载),但可能导致数据丢失。
4. 完整工作流程示例
场景:将新磁盘(/dev/sdb)分区、格式化并挂载到/data。
分区(使用fdisk或parted):
|
Bash fdisk /dev/sdb # 交互式操作:n创建新分区 -> w保存退出
|
创建文件系统:
|
Bash mkfs -t ext4 /dev/sdb1
|
创建挂载点:
临时挂载:
|
Bash mount /dev/sdb1 /data
|
永久挂载(编辑/etc/fstab):
|
Bash echo '/dev/sdb1 /data ext4 defaults 0 0' >> /etc/fstab mount -a # 验证配置
|
5. 高级技巧与工具
使用 blkid 获取设备UUID
避免依赖设备名(如sdb1可能变动),改用UUID挂载更可靠:
|
Bash blkid /dev/sdb1 # 获取UUID # /etc/fstab 配置示例: UUID=1234-5678-90AB /data ext4 defaults 0 0
|
2. 挂载网络文件系统
例如挂载NFS共享:
|
Bash mount -t nfs 192.168.1.100:/share /mnt/nfs
|
3. 使用 mount 查看所有挂载点
|
Bash mount | column -t # 格式化输出 cat /proc/mounts # 查看内核记录的挂载信息
|
4. 处理文件系统损坏
若文件系统异常(如宕机导致),需强制修复:
|
Bash umount /data fsck -y /dev/sdb1 # -y自动确认修复操作 mount /dev/sdb1 /data
|
6. 常见问题排查
问题1:挂载失败(wrong fs type, bad option)
原因:文件系统类型不匹配或选项错误。
解决:
|
Bash # 确认文件系统类型 blkid /dev/sdb1 # 重新挂载并指定正确类型 mount -t ext4 /dev/sdb1 /data
|
问题2:/etc/fstab 配置错误导致系统无法启动
解决:进入单用户模式或救援模式,注释错误行后重启。
问题3:磁盘空间未释放(已删除文件仍被进程占用)
解决:
|
Bash lsof /data | grep deleted # 查找占用进程 # 重启进程或清空文件句柄
|
7. 自动化与最佳实践
脚本化部署:在初始化脚本中集成分区、格式化、挂载操作。
监控告警:通过Prometheus监控挂载点可用性及磁盘使用率。
备份/etc/fstab:修改前备份文件,避免配置错误。
使用LVM:灵活管理磁盘空间(逻辑卷可动态扩展)。
通过掌握mkfs、mount和umount,运维工程师能够高效管理服务器存储,保障业务数据的安全性与可用性。
4.2 LVM(逻辑卷管理)
4.2.1 创建逻辑卷(pvcreate, vgcreate, lvcreate)
从运维工程师视角管理LVM(逻辑卷管理)时,pvcreate、vgcreate和lvcreate是构建逻辑卷的核心工具。以下是完整的操作指南及场景解析:
LVM 核心概念
物理卷(Physical Volume, PV):物理磁盘或分区,通过pvcreate初始化为LVM管理的存储单元。
卷组(Volume Group, VG):由多个PV组成的存储池,通过vgcreate创建,是逻辑卷的存储资源池。
逻辑卷(Logical Volume, LV):从VG中划分的逻辑存储单元,通过lvcreate创建,可动态扩展/缩小。
2. 创建逻辑卷完整流程
场景:将两块磁盘(/dev/sdb和/dev/sdc)初始化为LVM逻辑卷,挂载到/data。
Step 1: 准备物理卷(PV)
分区初始化(可选):若磁盘未分区,可直接将整块磁盘初始化为PV,或先分区(建议对物理磁盘分区)。
|
Bash # 使用 fdisk 或 parted 分区(例如将 /dev/sdb 分为一个主分区) fdisk /dev/sdb # 交互命令:n(新建分区) -> p(主分区) -> 默认起始/结束扇区 -> t(设置类型为8e,即LVM) -> w保存
|
创建物理卷:
|
Bash # 初始化分区或整块磁盘为PV pvcreate /dev/sdb1 /dev/sdc
|
验证PV状态:
|
Bash pvs # 简要查看PV列表 pvdisplay # 查看详细PV信息(如容量、所属VG)
|
Step 2: 创建卷组(VG)
创建卷组:将多个PV合并为一个VG,提供统一的存储池。
|
Bash vgcreate vg_data /dev/sdb1 /dev/sdc
|
vg_data:自定义卷组名称。
/dev/sdb1 /dev/sdc:参与VG的PV列表。
验证VG状态:
|
Bash vgs # 查看VG摘要(总容量、空闲空间) vgdisplay # 查看VG详细信息(PE大小、包含的PV)
|
扩展VG容量(可选):向VG中添加新PV:
|
Bash vgextend vg_data /dev/sdd # 将新磁盘/dev/sdd加入VG
|
Step 3: 创建逻辑卷(LV)
创建逻辑卷:从VG中划分逻辑存储单元(LV)。
|
Bash lvcreate -n lv_data -L 100G vg_data
|
-n lv_data:指定逻辑卷名称。
-L 100G:分配固定大小(100GB)。
-l 100%FREE:使用VG全部剩余空间(替代-L参数)。
验证LV状态:
|
Bash lvs # 查看LV摘要 lvdisplay # 查看LV详细信息(路径、容量)
|
LV设备路径通常为:/dev/mapper/<vg_name>-<lv_name> 或 /dev/<vg_name>/<lv_name>。
Step 4: 格式化并挂载逻辑卷
创建文件系统:
|
Bash mkfs -t ext4 /dev/vg_data/lv_data
|
挂载LV到目录:
|
Bash mkdir /data mount /dev/vg_data/lv_data /data
|
永久挂载(编辑/etc/fstab):
|
Bash # 使用设备路径或UUID(推荐) /dev/vg_data/lv_data /data ext4 defaults 0 0
|
3. LVM 扩展与维护
场景1:扩展逻辑卷容量
扩展LV(例如扩容50G):
|
Bash lvextend -L +50G /dev/vg_data/lv_data # 增加50G lvextend -l +100%FREE /dev/vg_data/lv_data # 使用全部剩余空间
|
调整文件系统(同步扩容文件系统):
|
Bash # ext4 文件系统 resize2fs /dev/vg_data/lv_data
# xfs 文件系统 xfs_growfs /data
|
场景2:缩小逻辑卷容量
卸载LV并检查文件系统:
|
Bash umount /data e2fsck -f /dev/vg_data/lv_data # ext4检查
|
缩小文件系统(必须优先于LV缩小):
|
Bash resize2fs /dev/vg_data/lv_data 80G # 缩小到80G
|
缩小LV:
|
Bash lvreduce -L 80G /dev/vg_data/lv_data mount /dev/vg_data/lv_data /data
|
4. 数据迁移与PV管理
场景:更换磁盘(从旧PV迁移数据到新PV)
添加新PV:
|
Bash pvcreate /dev/sdd vgextend vg_data /dev/sdd
|
迁移数据:
|
Bash pvmove /dev/sdb1 /dev/sdd # 将数据从旧PV(/dev/sdb1)迁移到新PV(/dev/sdd)
|
移除旧PV:
|
Bash vgreduce vg_data /dev/sdb1 # 从VG中移除PV pvremove /dev/sdb1 # 清除PV元数据
|
5. 常见问题与解决
问题1:VG空间不足
现象:lvextend失败,提示Insufficient free space。
解决:
添加新PV到VG:vgextend vg_data /dev/sdd。
或缩小其他LV释放空间。
问题2:文件系统未扩展
现象:LV扩容后,df -h显示容量未变。
解决:执行resize2fs或xfs_growfs同步文件系统。
问题3:无法卸载LV
现象:umount失败,提示target is busy。
解决:
|
Bash lsof /data # 查找占用进程 fuser -km /data # 强制终止进程 umount /data
|
6. 自动化与最佳实践
脚本化部署:编写脚本自动化PV、VG、LV创建及挂载:
|
Bash #!/bin/bash pvcreate /dev/sdb1 /dev/sdc vgcreate vg_data /dev/sdb1 /dev/sdc lvcreate -n lv_data -l 100%FREE vg_data mkfs -t ext4 /dev/vg_data/lv_data mkdir -p /data mount /dev/vg_data/lv_data /data echo "/dev/vg_data/lv_data /data ext4 defaults 0 0" >> /etc/fstab
|
监控告警:
监控VG剩余空间:vgs --units g vg_data。
使用Prometheus + node_exporter监控LV使用率。
备份关键数据:
定期备份/etc/lvm目录(包含LVM元数据)。
对重要LV创建快照(lvcreate -s)。
7. 关键命令速查表
|
操作
|
命令示例
|
|
创建物理卷
|
pvcreate /dev/sdb1
|
|
创建卷组
|
vgcreate vg_data /dev/sdb1
|
|
创建逻辑卷
|
lvcreate -n lv_data -L 100G vg_data
|
|
扩展逻辑卷
|
lvextend -L +50G /dev/vg_data/lv_data + resize2fs
|
|
迁移PV数据
|
pvmove /dev/sdb1 /dev/sdd
|
|
查看LVM拓扑
|
lsblk 或 lvmdiskscan
|
通过掌握LVM管理,运维工程师可实现存储资源的动态分配、灵活扩展和高可用性,显著提升磁盘管理的效率和可靠性。
4.2.2 扩展与缩减逻辑卷
扩展与缩减逻辑卷(LVM)操作指南
扩展逻辑卷(LV)
适用场景:当逻辑卷空间不足时,扩展其容量(需确保卷组有足够空闲空间)。
步骤:
检查卷组(VG)可用空间:
确认目标卷组(如vg_data)有足够的Free PE / Size。
扩展逻辑卷:
|
Bash lvextend -L +50G /dev/vg_data/lv_data # 增加50G # 或使用全部剩余空间 lvextend -l +100%FREE /dev/vg_data/lv_data
|
调整文件系统大小(根据文件系统类型操作):
ext4:
|
Bash resize2fs /dev/vg_data/lv_data
|
xfs:
|
Bash xfs_growfs /data # 假设挂载点为/data
|
验证扩展结果:
2. 缩减逻辑卷(LV)
适用场景:需回收逻辑卷空间(仅支持可缩减的文件系统,如ext4)。
步骤:
卸载文件系统:
强制检查文件系统(ext4):
|
Bash e2fsck -f /dev/vg_data/lv_data
|
缩小文件系统(先于逻辑卷缩减):
|
Bash resize2fs /dev/vg_data/lv_data 80G # 缩小至80G
|
缩小逻辑卷:
|
Bash lvreduce -L 80G /dev/vg_data/lv_data # 大小需与文件系统一致
|
重新挂载并验证:
|
Bash mount /dev/vg_data/lv_data /data df -h /data lvs
|
注意事项
文件系统兼容性:
ext4:支持在线扩展和离线缩减。
xfs:仅支持在线扩展,不支持缩减。若需缩小XFS文件系统,必须备份数据、重新创建逻辑卷并恢复。
操作顺序:
扩展:lvextend → 调整文件系统。
缩减:缩小文件系统 → lvreduce,顺序不可逆。
备份数据:
缩减操作存在风险,操作前务必备份关键数据。
卷组空间管理:
扩展逻辑卷前,若卷组空间不足,需先添加物理卷(PV):
|
Bash vgextend vg_data /dev/sdd # 添加新磁盘/dev/sdd到卷组
|
常见问题与解决
问题1:resize2fs提示“设备或资源忙”
原因:文件系统未卸载或进程占用。
解决:
|
Bash fuser -vm /data # 查找占用进程 fuser -km /data # 终止进程 umount /data
|
问题2:缩减后文件系统损坏
原因:文件系统大小与逻辑卷不匹配。
解决:
|
Bash # 重新检查并调整文件系统 e2fsck -f /dev/vg_data/lv_data resize2fs /dev/vg_data/lv_data
|
问题3:XFS文件系统无法缩减
解决:
备份数据至其他存储。
删除原逻辑卷,新建更小的逻辑卷。
格式化并恢复数据。
自动化脚本示例
扩展逻辑卷脚本:
|
Bash #!/bin/bash LV_PATH="/dev/vg_data/lv_data" MOUNT_POINT="/data" EXTEND_SIZE="+50G"
# 扩展逻辑卷 lvextend -L $EXTEND_SIZE $LV_PATH
# 调整文件系统 if [[ $(blkid -o value -s TYPE $LV_PATH) == "ext4" ]]; then resize2fs $LV_PATH elif [[ $(blkid -o value -s TYPE $LV_PATH) == "xfs" ]]; then xfs_growfs $MOUNT_POINT fi
echo "逻辑卷扩展完成!当前空间:" df -h $MOUNT_POINT
|
总结
扩展逻辑卷:无需停机,支持在线操作,适用于业务增长需求。
缩减逻辑卷:需谨慎操作,仅限ext4文件系统,推荐在维护窗口进行。
关键命令:
扩展:lvextend + resize2fs/xfs_growfs
缩减:umount → e2fsck → resize2fs → lvreduce
通过合理规划LVM结构,运维工程师可灵活应对存储需求变化,确保系统资源的高效利用。
4.3 RAID 配置
4.3.1 RAID 级别(0, 1, 5, 10)
RAID 级别详解(0, 1, 5, 10)
RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)通过组合多个磁盘提升性能或数据冗余。以下是常见 RAID 级别的核心特性、适用场景及对比:
RAID 0(条带化)
核心特性:
最少磁盘数:2 块。
冗余能力:无冗余,任一磁盘故障导致数据全部丢失。
性能:
读/写性能:最高(数据并行分布到多块磁盘)。
容量利用率:100%(总容量为所有磁盘之和)。
典型应用:非关键性临时数据、高性能计算(如视频渲染缓存)。
示例:
|
Bash # 使用 mdadm 创建 RAID 0 mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc
|
2. RAID 1(镜像)
核心特性:
最少磁盘数:2 块。
冗余能力:完全冗余,允许 1 块磁盘故障。
性能:
读性能:较高(可从任意磁盘读取)。
写性能:较低(需同时写入所有磁盘)。
容量利用率:50%(总容量为单块磁盘大小)。
典型应用:关键系统盘(如操作系统)、高可用数据库。
示例:
|
Bash # 创建 RAID 1 mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdd /dev/sde
|
3. RAID 5(分布式奇偶校验)
核心特性:
最少磁盘数:3 块。
冗余能力:允许 1 块磁盘故障(通过奇偶校验恢复数据)。
性能:
读性能:高(数据并行读取)。
写性能:较低(需计算和写入奇偶校验)。
容量利用率:(N-1)/N(N 为磁盘数,如 3 块磁盘利用率为 66%)。
典型应用:文件存储服务器、中小型数据库。
示例:
|
Bash # 创建 RAID 5(3 块磁盘) mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdf /dev/sdg /dev/sdh
|
4. RAID 10(RAID 1+0,镜像+条带化)
核心特性:
最少磁盘数:4 块(需偶数磁盘)。
冗余能力:允许每组镜像中 1 块磁盘故障(最多可容忍半数磁盘故障,但同一镜像组不可同时故障)。
性能:
读/写性能:高(结合 RAID 0 的并行性和 RAID 1 的冗余)。
容量利用率:50%(总容量为所有磁盘总和的 50%)。
典型应用:高并发数据库(如 MySQL)、虚拟化平台。
示例:
|
Bash # 创建 RAID 10(4 块磁盘) mdadm --create /dev/md10 --level=10 --raid-devices=4 /dev/sdi /dev/sdj /dev/sdk /dev/sdl
|
5. 对比表格
|
特性
|
RAID 0
|
RAID 1
|
RAID 5
|
RAID 10
|
|
最少磁盘数
|
2
|
2
|
3
|
4
|
|
冗余能力
|
无
|
1 块磁盘
|
1 块磁盘
|
每组镜像 1 块
|
|
读性能
|
最高
|
高
|
高
|
最高
|
|
写性能
|
最高
|
低
|
中
|
高
|
|
容量利用率
|
100%
|
50%
|
(N-1)/N
|
50%
|
|
成本
|
最低
|
高
|
中
|
最高
|
|
适用场景
|
临时数据、缓存
|
关键系统盘
|
通用文件存储
|
高性能数据库
|
6. 选型建议
追求极致性能:选择 RAID 0(非关键数据)或 RAID 10(关键数据)。
预算有限且需冗余:选择 RAID 1(小容量)或 RAID 5(大容量)。
高可用性要求:优先选择 RAID 10(允许多块磁盘故障)或 RAID 6(允许 2 块磁盘故障)。
冷数据归档:RAID 5 或 RAID 6(平衡容量与冗余)。
7. 常见问题
Q1:RAID 5 重建失败的风险?
原因:RAID 5 重建时需要读取所有剩余磁盘的数据,若另一块磁盘存在潜在故障(如 URE,不可恢复读错误),可能导致重建失败。
解决:定期检查磁盘健康状态(SMART 工具),使用 RAID 6 提升容错能力。
Q2:如何替换故障磁盘?
步骤:
|
Bash # 标记磁盘为故障 mdadm /dev/mdX --fail /dev/sdY # 移除故障磁盘 mdadm /dev/mdX --remove /dev/sdY # 添加新磁盘 mdadm /dev/mdX --add /dev/sdZ # 等待同步完成 cat /proc/mdstat
|
Q3:RAID 与 LVM 如何结合使用?
方案:先创建 RAID 阵列(如 RAID 10),再将其作为物理卷(PV)加入 LVM 卷组(VG),实现动态存储管理。
|
Bash pvcreate /dev/md10 vgcreate vg_raid /dev/md10 lvcreate -n lv_data -L 500G vg_raid
|
8. 总结
RAID 0:性能优先,无冗余,适合非关键数据。
RAID 1:简单冗余,适合小容量关键数据。
RAID 5:平衡容量与冗余,适合通用存储。
RAID 10:高性能+高冗余,适合关键业务数据库。
通过合理选择 RAID 级别,运维工程师可以优化存储系统的性能、可靠性及成本,确保业务连续性和数据安全。
4.3.2 配置 RAID(mdadm)
使用 mdadm 配置 RAID 操作指南
mdadm 是 Linux 下管理软件 RAID 的核心工具,支持 RAID 0、1、5、6、10 等常见级别。以下是详细的配置流程及管理操作:
安装 mdadm
在开始前,确保系统已安装 mdadm 工具:
|
Bash Debian/Ubuntu sudo apt update && sudo apt install mdadm
RHEL/CentOS sudo yum install mdadm
|
2. 准备磁盘
物理磁盘:确保磁盘已正确连接到系统(如 /dev/sdb、/dev/sdc 等)。
分区配置(可选):若使用整块磁盘,可直接使用设备路径(如 /dev/sdb)。若需分区,使用 fdisk 或 parted 创建分区并标记类型为 Linux RAID(类型代码 fd)。
3. 创建 RAID 阵列
通用命令格式:
|
Bash sudo mdadm --create /dev/mdX --level=<RAID级别> --raid-devices=<磁盘数> <磁盘路径列表>
|
示例场景:
a. 创建 RAID 0(条带化)
|
Bash sudo mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc
|
b. 创建 RAID 1(镜像)
|
Bash sudo mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdd /dev/sde
|
c. 创建 RAID 5(分布式奇偶校验)
|
Bash sudo mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdf /dev/sdg /dev/sdh
|
d. 创建 RAID 10(镜像+条带化)
|
Bash sudo mdadm --create /dev/md10 --level=10 --raid-devices=4 /dev/sdi /dev/sdj /dev/sdk /dev/sdl
|
关键参数:
--level:指定 RAID 级别(0、1、5、6、10)。
--raid-devices:参与 RAID 的磁盘数量。
--spare-devices(可选):指定热备盘数量。
4. 验证 RAID 状态
a. 查看所有 RAID 阵列:
输出示例:
|
Plain Text Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] md0 : active raid0 sdb[0] sdc[1] 209584128 blocks super 1.2 512k chunks
|
b. 查看详细 RAID 信息:
|
Bash sudo mdadm --detail /dev/md0
|
输出包含:
RAID 级别、状态、磁盘数量。
各磁盘角色(active sync、spare)。
阵列大小、同步进度(若正在重建)。
5. 格式化并挂载 RAID 阵列
a. 创建文件系统:
|
Bash ext4 文件系统 sudo mkfs -t ext4 /dev/md0
xfs 文件系统 sudo mkfs -t xfs /dev/md0
|
b. 挂载 RAID 设备:
|
Bash sudo mkdir /mnt/raid0 sudo mount /dev/md0 /mnt/raid0
|
c. 永久挂载(编辑 /etc/fstab):
|
Bash 使用 UUID(推荐) UUID=$(sudo blkid -s UUID -o value /dev/md0) echo "UUID=$UUID /mnt/raid0 ext4 defaults 0 0" | sudo tee -a /etc/fstab
或直接使用设备路径 echo "/dev/md0 /mnt/raid0 ext4 defaults 0 0" | sudo tee -a /etc/fstab
|
6. 管理 RAID 阵列
a. 添加热备盘:
|
Bash sudo mdadm --add /dev/md0 /dev/sdi 将 /dev/sdi 加入 /dev/md0 作为热备盘
|
b. 模拟磁盘故障并替换:
|
Bash 标记磁盘为故障 sudo mdadm /dev/md0 --fail /dev/sdb
移除故障磁盘 sudo mdadm /dev/md0 --remove /dev/sdb
添加新磁盘 sudo mdadm /dev/md0 --add /dev/sdj
监控重建进度 watch cat /proc/mdstat
|
c. 停止并删除 RAID 阵列:
|
Bash sudo umount /mnt/raid0 sudo mdadm --stop /dev/md0 sudo mdadm --zero-superblock /dev/sdb /dev/sdc 清除 RAID 元数据
|
7. 配置文件备份
RAID 配置信息需保存,以便系统重启后自动识别:
|
Bash sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
更新 initramfs(部分系统需要) sudo update-initramfs -u
|
8. 常见问题与解决
问题1:RAID 状态显示 degraded
原因:磁盘故障或未正确加入阵列。
解决:
|
Bash 检查磁盘状态 sudo smartctl -a /dev/sdb
替换故障磁盘并重建 sudo mdadm --replace /dev/md0 /dev/sdb /dev/sdj
|
问题2:系统重启后 RAID 未自动加载
原因:mdadm.conf 未正确配置。
解决:
|
Bash 重新生成配置 sudo mdadm --detail --scan | sudo tee /etc/mdadm/mdadm.conf sudo update-initramfs -u
|
问题3:RAID 同步速度过慢
调整同步速度:
|
Bash 查看当前速度限制 cat /proc/sys/dev/raid/speed_limit_min cat /proc/sys/dev/raid/speed_limit_max
临时提高速度(单位 KB/s) echo 100000 > /proc/sys/dev/raid/speed_limit_min
|
9. 自动化脚本示例
创建 RAID 1 并挂载:
|
Bash !/bin/bash DISKS=("/dev/sdb" "/dev/sdc") MOUNT_POINT="/mnt/raid1"
创建 RAID 1 sudo mdadm --create /dev/md1 --level=1 --raid-devices=2 ${DISKS[@]}
格式化 sudo mkfs -t ext4 /dev/md1
挂载 sudo mkdir -p $MOUNT_POINT sudo mount /dev/md1 $MOUNT_POINT
永久挂载 UUID=$(sudo blkid -s UUID -o value /dev/md1) echo "UUID=$UUID $MOUNT_POINT ext4 defaults 0 0" | sudo tee -a /etc/fstab
保存配置 sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf sudo update-initramfs -u
|
10. 最佳实践
监控与告警:
使用 smartd 监控磁盘健康状态。
集成到 Prometheus + Alertmanager 监控 RAID 状态。
定期检查:
|
Bash sudo mdadm --monitor --scan --daemonize 后台监控阵列状态
|
数据备份:
RAID 不是备份!仍需定期备份关键数据至异地存储。
硬件选择:
使用相同容量、型号的磁盘以避免性能瓶颈。
企业级环境优先考虑硬件 RAID 卡(如 MegaRAID)。
通过掌握 mdadm 工具,运维工程师可以灵活配置和管理软件 RAID 阵列,结合业务需求平衡性能、冗余与成本,确保数据的高可用性和服务稳定性。
5. 日志与监控
5.1 日志管理
5.1.1 日志文件位置(/var/log)
日志文件位置(/var/log)详解
在 Linux 系统中,/var/log 是存储各类日志文件的核心目录。运维工程师通过分析这些日志,可以快速定位系统问题、监控服务状态及排查安全事件。以下是关键日志文件及其管理方法:
核心日志文件及用途
|
日志文件
|
用途
|
|
/var/log/messages
|
系统级日志:记录内核、系统服务(如 cron、systemd)的通用消息(CentOS/RHEL)。
|
|
/var/log/syslog
|
系统级日志:Ubuntu/Debian 的通用系统日志,包含内核和服务日志。
|
|
/var/log/auth.log
|
认证日志:记录用户登录、sudo 权限使用、SSH 连接等安全事件(Ubuntu/Debian)。
|
|
/var/log/secure
|
认证日志:功能同 auth.log,但用于 CentOS/RHEL。
|
|
/var/log/boot.log
|
启动日志:记录系统启动过程中的详细信息。
|
|
/var/log/dmesg
|
内核日志:硬件检测、驱动加载、内核故障信息(也可通过 dmesg 命令查看)。
|
|
/var/log/cron
|
计划任务日志:记录 cron 任务的执行结果。
|
|
/var/log/maillog
|
邮件服务日志:记录 Postfix、Sendmail 等邮件服务的活动(CentOS/RHEL)。
|
|
/var/log/mysql/error.log
|
MySQL 日志:数据库服务的错误日志和查询日志(路径可自定义)。
|
|
/var/log/nginx/access.log
|
Nginx 访问日志:记录 HTTP 请求详情(如客户端 IP、状态码)。
|
|
/var/log/kern.log
|
内核日志:Ubuntu/Debian 中更详细的内核事件记录。
|
2. 日志管理技巧
a. 查看日志内容
实时跟踪日志:
|
Bash tail -f /var/log/syslog 实时查看最新日志 multitail /var/log/nginx/*.log 同时监控多个日志文件(需安装 multitail)
|
按时间筛选日志:
|
Bash grep "2024-06-20" /var/log/auth.log 查找某一天的登录记录 journalctl --since "2024-06-20 09:00" --until "2024-06-20 12:00" 使用 systemd-journald 按时间筛选
|
b. 日志轮转(Log Rotation)
机制:通过 logrotate 工具自动压缩、删除旧日志,防止磁盘占满。
配置文件:/etc/logrotate.conf 及 /etc/logrotate.d/ 目录下的服务专用配置。
手动触发轮转:
|
Bash logrotate -vf /etc/logrotate.d/nginx 强制轮转 Nginx 日志
|
c. 清理日志
临时清理:
|
Bash > /var/log/syslog 清空日志文件(不删除文件) rm /var/log/*.gz 删除旧的压缩日志
|
按时间清理:
|
Bash find /var/log -name "*.log" -mtime +30 -exec rm -f {} \; 删除 30 天前的日志
|
3. 日志分析工具
|
工具
|
用途
|
|
grep
|
文本搜索(如 grep "error" /var/log/messages)。
|
|
awk
|
按列提取数据(如统计 HTTP 状态码:awk '{print $9}' access.log | sort | uniq -c)。
|
|
journalctl
|
查看 systemd 管理的日志(如 journalctl -u nginx.service)。
|
|
logwatch
|
生成日志摘要报告(需安装并配置 /usr/share/logwatch/default.conf/logwatch.conf)。
|
|
ELK Stack
|
集中化日志管理(Elasticsearch + Logstash + Kibana)。
|
4. 安全与权限
保护日志文件:
|
Bash chmod 640 /var/log/auth.log 限制普通用户读取敏感日志 chattr +a /var/log/secure 设置为追加模式(防止篡改)
|
审计日志完整性:
使用 auditd 服务监控关键文件修改:
|
Bash auditctl -w /var/log/ -p wa -k system_logs 监控对日志目录的写和属性变更
|
5. 常见问题排查
问题1:磁盘空间被日志占满
解决步骤:
定位大日志文件:
|
Bash du -h /var/log | sort -rh | head -n 10
|
清理或轮转日志(优先使用 logrotate)。
扩展磁盘或挂载新存储(参考 LVM/RAID 操作)。
问题2:服务日志不生成
可能原因:
服务未配置日志路径(如检查 Nginx 的 access_log 指令)。
文件权限问题(如进程用户无写入权限)。
磁盘 inode 耗尽(通过 df -i 检查)。
6. 最佳实践
集中化日志管理:使用 rsyslog 或 Fluentd 将日志转发至中央服务器,便于统一分析。示例配置(rsyslog):
|
Bash 客户端发送日志到远程服务器(IP: 192.168.1.100) echo "*.* @192.168.1.100:514" >> /etc/rsyslog.conf systemctl restart rsyslog
|
定期备份关键日志:将审计日志、安全日志归档至异地存储(如 S3、NAS)。
监控日志异常:配置告警规则(如 Zabbix 监控 ERROR 关键词出现频率)。
总结
核心目录:/var/log 是系统和服务日志的存储中心。
关键命令:tail、grep、journalctl、logrotate。
安全原则:限制日志访问权限,防止篡改和未授权读取。
扩展方案:结合自动化工具(如 ELK)实现高效日志分析。
通过合理管理日志,运维工程师可以快速响应故障、优化系统性能并提升安全性。
5.1.2 常用日志文件(messages, syslog, auth.log)
面向运维工程师的常用日志文件解析(messages, syslog, auth.log)
在 Linux 系统中,/var/log 目录下的 messages、syslog 和 auth.log 是运维工程师排查系统问题的核心日志文件。以下是它们的详细说明、使用场景及操作指南:
/var/log/messages
适用系统
Red Hat 系:CentOS、RHEL、Fedora。
记录内容
系统级通用日志:
内核事件(硬件检测、驱动加载)。
系统服务日志(如 crond、systemd)。
非关键性错误和警告(如磁盘 I/O 延迟、网络连接问题)。
查看方法
|
Bash 实时跟踪最新日志 tail -f /var/log/messages
筛选特定关键词(如内存错误) grep "Out of memory" /var/log/messages
按时间范围过滤(如最近 1 小时) journalctl --since "1 hour ago" -u systemd-journald
|
典型应用场景
硬件故障排查:
|
Bash grep "disk error" /var/log/messages 检查磁盘错误 dmesg | grep -i "usb" 结合内核日志分析硬件问题
|
服务启动失败:
|
Bash grep "failed" /var/log/messages 查找服务启动失败记录
|
2. /var/log/syslog 适用系统
Debian 系:Ubuntu、Debian、Linux Mint。
记录内容
综合系统日志:
内核消息(类似 dmesg)。
用户空间程序日志(如 cron、apt)。
网络服务日志(如 DHCP、NTP)。
查看方法
|
Bash 实时查看并高亮错误 tail -f /var/log/syslog | grep --color -E "ERROR|WARN"
按进程名过滤(如 cron) grep "cron" /var/log/syslog
按时间戳筛选(需日志格式支持) awk '/Jun 20 12:00:00/, /Jun 20 13:00:00/' /var/log/syslog
|
典型应用场景
系统服务异常:
|
Bash 查看服务报错(如 SSH 无法启动) grep "sshd" /var/log/syslog
|
软件包管理问题:
|
Bash grep "apt" /var/log/syslog 分析 apt 安装失败原因
|
3. /var/log/auth.log(Debian 系) 或 /var/log/secure(Red Hat 系) 适用系统
auth.log:Ubuntu/Debian。
secure:CentOS/RHEL。
记录内容
认证与安全事件:
用户登录成功/失败记录(SSH、本地控制台)。
sudo 权限使用日志。
密码修改、用户账户变更。
查看方法
|
Bash 查看 SSH 登录失败记录(Ubuntu) grep "Failed password" /var/log/auth.log
分析 sudo 提权操作(CentOS) grep "sudo" /var/log/secure
统计暴力破解尝试 IP awk '/Failed password/{print $(NF-3)}' /var/log/auth.log | sort | uniq -c
|
典型应用场景
SSH 暴力破解攻击:
|
Bash 提取攻击者 IP 并封禁 grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr
|
审计用户操作:
|
Bash 查看 root 用户的登录历史 grep "root" /var/log/secure | grep "session opened"
|
4. 日志管理通用技巧
a. 日志轮转(Log Rotation)
工具:logrotate。
配置文件:/etc/logrotate.conf 和 /etc/logrotate.d/。
手动触发轮转:
|
Bash logrotate -vf /etc/logrotate.d/syslog 强制轮转 syslog
|
b. 清理过期日志
|
Bash 删除 30 天前的压缩日志 find /var/log -name "*.gz" -mtime +30 -exec rm -f {} \;
清空当前日志文件(保留 inode) > /var/log/messages
|
c. 日志权限与安全
|
Bash 限制普通用户访问敏感日志 chmod 640 /var/log/secure
防止日志被篡改(追加模式) chattr +a /var/log/auth.log
|
5. 常见问题排查指南
问题1:日志文件过大导致磁盘占满
解决步骤:
定位大文件:
|
Bash du -h /var/log | sort -rh | head -n 5
|
清理或轮转日志:
|
Bash logrotate -vf /etc/logrotate.d/<service>
|
扩展磁盘空间(参考 LVM/RAID 操作)。
问题2:日志不更新或无权限写入
检查点:
服务配置是否正确(如 Nginx 的 access_log 路径)。
文件权限(运行进程的用户是否有写入权限)。
磁盘 inode 是否耗尽:
问题3:过滤复杂日志内容
使用 awk 提取关键字段:
|
Bash 提取 SSH 登录失败的 IP 和时间 awk '/Failed password/{print $1, $2, $3, $11}' /var/log/auth.log
|
6. 自动化与监控建议
集中化日志收集:
使用 rsyslog 或 Fluentd 将日志转发至 ELK(Elasticsearch + Logstash + Kibana)。
示例配置(rsyslog 转发):
|
Bash echo "*.* @192.168.1.100:514" >> /etc/rsyslog.conf 发送到远程服务器 systemctl restart rsyslog
|
实时告警规则:
监控 auth.log 中的 Failed password 频率,触发防火墙封禁 IP。
使用 Prometheus + Alertmanager 监控日志关键词(如 Out of memory)。
定期生成日志报告:
|
Bash 使用 logwatch 生成日报 logwatch --range Today --output mail --format html
|
总结
|
日志文件
|
核心用途
|
关键命令
|
|
messages/syslog
|
系统级事件、服务状态监控
|
grep、tail -f、journalctl
|
|
auth.log/secure
|
用户认证、安全事件审计
|
awk、chattr、logrotate
|
通过熟练掌握这些日志文件的分析方法,运维工程师可以快速定位系统故障、抵御安全攻击并优化服务性能。
5.1.3 日志查看与分析(tail, less, grep)
在 Linux 系统中,tail、less 和 grep 是日志查看和分析的核心工具,以下是它们的详细用法和组合技巧:
**一、实时日志监控 (****tail**)
查看文件末尾
|
Bash tail -n 20 app.log # 显示最后20行
|
实时追踪日志更新
|
Bash tail -f app.log # 持续显示新增内容(适用于监控实时日志)
|
组合筛选关键信息
|
Bash tail -f app.log | grep "ERROR" --color=auto # 高亮显示实时日志中的错误
|
**二、高效浏览大文件 (****less**)
分页查看日志
|
Bash less app.log # 支持上下翻页、搜索
|
快捷操作
/keyword:向前搜索关键词(n 下一个,N 上一个)
?keyword:向后搜索
G:跳转到文件末尾,gg:跳转到开头
-N:显示行号(例如 less -N app.log)
直接定位问题位置
|
Bash less +/ERROR app.log # 打开文件后直接跳转到第一个 "ERROR" 位置
|
**三、精准过滤日志内容 (****grep**)
基础搜索
|
Bash grep "404" access.log # 查找包含 "404" 的行 grep -i "timeout" app.log # 忽略大小写搜索
|
上下文关联
|
Bash grep -C 3 "NullPointer" app.log # 显示匹配行及其前后3行 grep -A 2 "Exception" app.log # 显示匹配行及之后2行
|
正则表达式匹配
|
Bash grep -E "5[0-9]{2}" app.log # 匹配500-599的状态码 grep "^2023-10-0[1-5]" app.log # 匹配10月1-5日的日志
|
递归搜索目录
|
Bash grep -r "connection refused" /var/log/ # 递归搜索目录下所有文件
|
四、组合命令实战示例
实时监控并过滤关键错误
|
Bash tail -f app.log | grep -E "ERROR|CRITICAL" --color=auto
|
分析某时间段的日志
|
Bash grep "2023-10-25 14:" app.log | less # 定位25日14点的日志并分页查看
|
统计错误出现次数
|
Bash grep -c "OutOfMemory" app.log # 输出匹配行的总数
|
提取错误日志到文件
|
Bash grep "TimeoutException" app.log > errors.log # 将结果保存到新文件
|
五、常见问题与技巧
处理压缩日志:使用 zgrep
|
Bash zgrep "404" access.log.gz # 直接搜索压缩文件
|
排除无关内容:-v 反向过滤
|
Bash grep -v "healthcheck" app.log # 排除包含 "healthcheck" 的行
|
多关键词筛选:
|
Bash grep -e "ERROR" -e "WARN" app.log # 匹配 ERROR 或 WARN
|
权限问题:使用 sudo 查看系统日志
|
Bash sudo less /var/log/syslog
|
掌握这些命令的组合使用,可以快速定位日志中的问题,提升故障排查效率。进阶场景可结合 awk 或 sed 进行更复杂的数据提取和处理。
5.2 监控工具
5.2.1 top, htop
在Linux系统运维中,top和htop是两个常用的实时系统资源监控工具,用于快速诊断服务器性能问题(如CPU、内存占用过高等)。以下是它们的核心用法、区别及实际场景示例:
top 命令
基本功能
实时监控:默认按CPU使用率排序进程,展示系统资源概览(负载、任务、内存、交换分区等)。
无需安装:所有Linux发行版默认预装。
启动与界面
界面分两部分:
顶部概览:系统运行时间、用户数、负载、CPU/内存使用率。
进程列表:PID、用户、CPU%、内存%、进程命令等。
常用快捷键
|
快捷键
|
功能
|
|
P
|
按CPU使用率排序
|
|
M
|
按内存使用率排序
|
|
k
|
终止进程(需输入PID和信号,默认15)
|
|
q
|
退出
|
|
1
|
展开/折叠多核CPU显示
|
|
f
|
自定义显示字段(如添加线程数、IO等)
|
|
d
|
调整刷新间隔(默认3秒)
|
|
R
|
反向排序
|
实际案例
快速定位CPU瓶颈:
输入top,按P查看高CPU进程。
记录可疑进程PID,按k终止(或进一步排查)。
2. htop 命令
增强功能
彩色界面:直观区分资源使用(红色=高负载)。
鼠标支持:点击列标题排序,滚动查看进程树。
更多信息:显示进程完整命令行、文件系统路径。
安装与启动
|
Bash # Ubuntu/Debian sudo apt install htop
# CentOS/RHEL sudo yum install htop
# 启动 htop
|
界面与操作
顶部:CPU、内存、交换分区使用率(颜色区分)。
底部:快捷键提示(支持鼠标操作)。
常用快捷键
|
快捷键
|
功能
|
|
F2
|
进入设置(如修改显示列)
|
|
F3
|
搜索进程(按名称或PID)
|
|
F4
|
过滤进程(如输入nginx只显示相关进程)
|
|
F5
|
切换树状视图(显示父子进程关系)
|
|
F6
|
按指定列排序(如PERCENT_CPU)
|
|
F9
|
发送信号终止进程(支持SIGKILL/SIGTERM等)
|
|
Space
|
标记进程(批量操作)
|
实际案例
分析进程依赖关系:
启动htop,按F5查看树状结构。
发现某个父进程产生大量子进程(如fork炸弹),按F9终止。
3. top vs htop 对比
|
特性
|
top
|
htop
|
|
默认安装
|
✔️
|
需手动安装
|
|
界面交互
|
纯文本,无鼠标支持
|
彩色界面,支持鼠标
|
|
排序灵活性
|
仅快捷键排序
|
点击列标题排序
|
|
进程树视图
|
❌
|
✔️(按F5)
|
|
批量操作
|
❌
|
✔️(标记多个进程)
|
|
资源监控粒度
|
基础数据
|
更详细(如磁盘I/O)
|
4. 典型运维场景
场景1:CPU使用率100%
步骤:
top → 按P找到高CPU进程。
若进程为java,用htop按F5查看是否线程过多。
按F9发送SIGQUIT生成线程转储文件分析。
场景2:内存泄漏
步骤:
htop → 按F6选择PERCENT_MEM排序。
发现持续增长的进程(如Python脚本),记录PID。
使用pmap或valgrind进一步分析内存分配。
场景3:僵尸进程清理
步骤:
top → 查看是否有<defunct>进程。
若父进程未回收,用htop按F5找到父进程PID。
终止父进程(或联系开发者修复代码)。
总结
优先使用htop:界面友好,功能全面(尤其批量操作和进程树)。
备用top:当服务器未安装htop或需快速排查时使用。
进阶工具组合:结合vmstat、iotop、pidstat等深入分析性能瓶颈。
5.2.2 vmstat, iostat
作为运维工程师,vmstat 和 iostat 是分析系统性能问题的核心工具。以下是它们的核心用法和典型场景:
一、vmstat(Virtual Memory Statistics)
用途:监控 内存、进程、分页、CPU、I/O 等系统级资源使用情况。
基础命令:
|
Bash vmstat [间隔时间] [采样次数] # 例如:vmstat 1 5(每秒采样,共5次)
|
关键指标解读:
|
列
|
说明
|
|
procs
|
r:等待运行的进程数(CPU队列长度);b:不可中断睡眠的进程数(通常为I/O阻塞)
|
|
memory
|
swpd:已用虚拟内存;free:空闲内存;buff/cache:缓存和缓冲内存
|
|
swap
|
si:每秒从磁盘加载到内存的数据量(swap-in);so:每秒从内存换出到磁盘的数据量(swap-out)
|
|
io
|
bi:每秒从块设备读取的块数;bo:每秒写入块设备的块数
|
|
system
|
in:每秒中断次数;cs:每秒上下文切换次数
|
|
cpu
|
us:用户态CPU时间;sy:内核态CPU时间;id:空闲时间;wa:I/O等待时间;st:虚拟机等待时间
|
典型场景:
CPU瓶颈:r 列持续高于CPU核心数,且us或sy高,说明CPU负载高。
内存不足:si/so 持续大于0,表明系统在频繁使用交换分区(可能需增加物理内存)。
I/O阻塞:b 列高且wa高,说明进程因I/O等待被阻塞。
二、iostat(I/O Statistics)
用途:监控 磁盘I/O性能 和 CPU使用率,尤其适合分析存储瓶颈。
基础命令:
|
Bash iostat [间隔时间] [采样次数] -x # 例如:iostat -x 1 3(显示扩展统计,每秒1次,共3次)
|
关键指标解读(磁盘部分):
|
列
|
说明
|
|
%util
|
设备I/O利用率百分比(接近100%表示磁盘饱和)
|
|
await
|
I/O请求平均等待时间(ms),包括队列等待和服务时间
|
|
svctm
|
磁盘处理I/O请求的平均服务时间(ms)
|
|
r/s/w/s
|
每秒读/写请求数
|
|
rkB/s/wkB/s
|
每秒读/写数据量(KB)
|
典型场景:
磁盘性能瓶颈:%util 高 + await 远高于 svctm,说明请求队列堆积。
慢磁盘:svctm 高(如机械盘通常 < 20ms,SSD < 2ms)。
随机读写压力:高 r/s/w/s 但低 rkB/s/wkB/s,可能为小文件随机IO。
三、综合排查思路
快速定位问题方向:
vmstat 看整体:CPU是否饱和?内存是否不足?有无大量I/O等待?
iostat -x 看磁盘:哪块磁盘负载高?响应时间是否异常?
关联分析:
高 wa(CPU等待I/O) + 高 %util → 磁盘是瓶颈。
高 si/so → 内存不足触发交换,可能连带导致磁盘I/O高。
进阶工具配合:
结合 pidstat 定位具体进程的CPU、内存、I/O消耗。
使用 iotop 查看实时磁盘I/O占用进程。
四、示例分析
场景:服务器响应变慢
运行 vmstat 1:
|
Plain Text procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 12 2 1024 50000 20000 300000 0 0 500 200 1000 2000 30 20 40 10 0
|
r=12(高)且 us=30%,sy=20% → CPU繁忙。
b=2 且 wa=10% → 有I/O等待,但非主要瓶颈。
运行 iostat -x 1:
|
Plain Text Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util sda 0.00 10.00 50 20 2000 800 60 1.50 20.00 5.00 70%
|
%util=70%,await=20ms → 磁盘有一定压力,但未完全饱和。
结合 vmstat,主要问题在CPU(需进一步用 top 查进程)。
五、注意事项
监控趋势:单次采样可能不准确,需持续观察。
结合上下文:高 si/so 不一定是问题,需确认是否影响性能。
参数调优:根据 vmstat/iostat 结果调整内核参数(如 vm.swappiness、磁盘调度算法)。
掌握这两个工具,能快速定位约 60% 的服务器性能问题。建议通过实际场景反复练习指标关联分析。
5.2.3 sar(系统活动报告)
sar(System Activity Reporter,系统活动报告)是 Linux 系统性能分析工具包 sysstat 的一部分,用于收集和报告系统资源的使用情况(如 CPU、内存、磁盘 I/O、网络等)。通过 sar,用户可以查看系统历史性能数据或实时监控当前状态。
安装与配置
安装 sysstat 包:
|
Bash # Debian/Ubuntu sudo apt install sysstat
# RHEL/CentOS sudo yum install sysstat # 或使用 dnf(新版本) sudo dnf install sysstat
|
启用数据收集:
sysstat 默认通过 cron 任务定期收集数据,配置文件位于 /etc/cron.d/sysstat。
修改收集频率(默认每 10 分钟一次):
|
Bash sudo vi /etc/cron.d/sysstat # 将 `*/10` 改为更短的时间间隔(如 `*/1` 为每分钟)
|
历史数据存储在 /var/log/sysstat/ 目录(如 sa01, sa02 等文件)。
2. 常用命令示例
(1) 实时监控
|
Bash # 每 2 秒刷新一次,共执行 5 次 sar 2 5
|
(2) 查看历史数据
|
Bash # 查看当天 CPU 使用情况 sar -u
# 查看指定日期的数据(例如 10 号) sar -u -f /var/log/sysstat/sa10
# 查看特定时间段的数据(如 09:00 到 12:00) sar -u -s 09:00:00 -e 12:00:00
|
(3) 监控内存使用
|
Bash # 查看内存和交换分区使用情况 sar -r # 内存 sar -S # 交换分区 sar -B # 分页统计
|
(4) 监控磁盘 I/O
|
Bash # 查看磁盘读写统计 sar -d # 所有块设备 sar -d -p # 显示设备名(如 sda、sdb)
# 查看磁盘 I/O 和传输速率 sar -b
|
(5) 监控网络流量
|
Bash # 查看网络接口统计 sar -n DEV # 网络接口(如 eth0) sar -n TCP # TCP 连接状态
|
(6) 查看进程和上下文切换
|
Bash sar -w # 进程创建/秒 sar -W # 页面交换统计 sar -v # inode、文件和其他内核表状态
|
3. 输出字段解释
以 sar -u(CPU 使用率)为例:
|
Plain Text Linux 5.4.0-80-generic (hostname) 08/15/2023 _x86_64_ (4 CPU)
10:00:01 AM CPU %user %nice %system %iowait %steal %idle 10:10:01 AM all 12.34 0.12 4.56 1.23 0.00 81.75
|
%user:用户态程序占用 CPU 时间百分比。
%system:内核态占用 CPU 时间百分比。
%iowait:CPU 等待 I/O 操作的时间百分比。
%idle:CPU 空闲时间百分比。
4. 注意事项
数据延迟:安装 sysstat 后需等待至少 10 分钟才会生成首次数据。
历史数据保存:默认保留 30 天,可在 /etc/sysstat/sysstat 中修改 HISTORY 参数。
手动生成报告:使用 sadf 工具将二进制数据转换为 CSV 或 XML 格式。
5. 实际应用示例
问题:检查某天上午 10 点的 CPU 使用率。
|
Bash sar -u -f /var/log/sysstat/sa10 -s 10:00:00 -e 11:00:00
|
通过 sar,可以快速定位系统瓶颈(如 CPU 过载、磁盘 I/O 延迟或内存不足),是性能调优和故障排查的重要工具。
5.3 日志收集与分析
5.3.1 ELK Stack(Elasticsearch, Logstash, Kibana)
以下是面向运维工程师的 ELK Stack(Elasticsearch, Logstash, Kibana) 详细指南,涵盖部署、配置、监控和故障排查等核心运维场景:
ELK Stack 核心组件与运维职责
|
组件
|
运维关注点
|
|
Elasticsearch
|
集群健康、分片管理、索引生命周期、节点扩展、性能调优、安全加固(TLS、RBAC)、备份恢复。
|
|
Logstash
|
管道性能、资源占用(CPU/内存)、插件兼容性、数据过滤优化、故障恢复机制。
|
|
Kibana
|
仪表盘管理、用户权限控制、索引模式配置、插件更新、与 Elasticsearch 版本兼容性。
|
2. 部署架构设计
(1) 生产环境推荐架构
|
Bash # 高可用集群示例(3节点 Elasticsearch + 2 Logstash + 1 Kibana) Elasticsearch Cluster: - Node 1 (Master + Data) - Node 2 (Master + Data) - Node 3 (Coordinating Only)
Logstash: - Logstash Instance 1 (Pipeline: Input -> Filter -> Output) - Logstash Instance 2 (Failover)
Kibana: - Load Balancer + Kibana Server
|
(2) 硬件配置建议
Elasticsearch:
内存:至少 8GB,推荐 16GB+(JVM 堆内存不超过 50% 物理内存)。
存储:SSD 磁盘,预留 50% 空间用于合并(Merge)和快照。
CPU:4 核+,主节点可降低配置,数据节点需高性能。
Logstash:
根据管道复杂度调整资源(高吞吐场景需多线程 + 批量处理)。
3. Elasticsearch 运维关键操作
(1) 集群健康检查
|
Bash # 查看集群状态 curl -XGET 'http://localhost:9200/_cluster/health?pretty'
# 检查节点状态 curl -XGET 'http://localhost:9200/_cat/nodes?v'
|
(2) 索引管理
|
Bash # 列出所有索引 curl -XGET 'http://localhost:9200/_cat/indices?v'
# 手动分配分片(解决 UNASSIGNED 分片问题) curl -XPOST 'localhost:9200/_cluster/reroute?retry_failed=true' -H 'Content-Type: application/json' -d' { "commands": [ { "allocate_replica": { "index": "logs-2023.08", "shard": 0, "node": "node-1" } } ] } '
|
(3) 备份与恢复
|
Bash # 配置 S3 存储仓库 PUT _snapshot/my_backup { "type": "s3", "settings": { "bucket": "elastic-backups", "region": "us-west-1" } }
# 手动创建快照 PUT _snapshot/my_backup/snapshot_20230815?wait_for_completion=true
# 恢复快照 POST _snapshot/my_backup/snapshot_20230815/_restore
|
4. Logstash 管道优化
(1) 性能调优配置
|
Ruby # logstash.conf 示例(多线程 + 批量处理) input { beats { port => 5044 threads => 4 } }
filter { grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{GREEDYDATA:message}" } } }
output { elasticsearch { hosts => ["http://es-node1:9200", "http://es-node2:9200"] index => "logs-%{+YYYY.MM.dd}" workers => 4 flush_size => 1000 } }
|
(2) 常见问题排查
高 CPU 占用:检查 Grok 正则复杂性,启用 grokparsefailure 标签捕获错误。
数据延迟:调整 pipeline.batch.size 和 pipeline.workers(参考 CPU 核数)。
内存泄漏:监控 JVM 堆内存,升级 Logstash 版本或减少插件依赖。
5. Kibana 运维管理
(1) 安全加固
|
YAML # kibana.yml 配置 elasticsearch.hosts: ["http://es-node1:9200"] elasticsearch.username: "kibana_system" elasticsearch.password: "${KIBANA_PASSWORD}" xpack.security.enabled: true
|
(2) 索引生命周期管理(ILM)
|
Bash # 创建生命周期策略(自动删除 30 天前的日志) PUT _ilm/policy/logs_policy { "policy": { "phases": { "delete": { "min_age": "30d", "actions": { "delete": {} } } } } }
|
6. 监控与告警
(1) 集成 Prometheus + Grafana
Elasticsearch Exporter:部署 elasticsearch-exporter 暴露指标。
Grafana 仪表盘:导入 ID 2322(Elasticsearch 官方模板)。
(2) 内置告警(Kibana Alerting)
|
Bash # 创建磁盘使用率告警 POST _alerting/rule { "name": "High Disk Usage", "tags": ["ops"], "rule_type_id": ".index-threshold", "params": { "index": ".monitoring-es-*", "timeField": "timestamp", "aggType": "avg", "aggField": "node.fs.available_percent", "threshold": [20], "comparator": "<" } }
|
7. 故障排查场景
(1) Elasticsearch 节点失联
检查项:
网络连通性(telnet es-node 9200)。
磁盘空间(df -h)。
JVM 内存溢出(检查 logs/elasticsearch.log 中的 OutOfMemoryError)。
(2) 日志收集延迟
排查步骤:
检查 Logstash 管道吞吐量(GET _node/stats/pipeline)。
确认 Beats(Filebeat)到 Logstash 的网络延迟。
优化 Elasticsearch 写入性能(调整 refresh_interval)。
8. 运维最佳实践
冷热数据分离:使用 hot-warm 架构,将旧索引迁移到低成本存储。
版本控制:确保 ELK 各组件版本一致(如 Elasticsearch 7.x 与 Kibana 7.x)。
自动化部署:使用 Ansible 或 Terraform 管理 ELK 集群配置。
9. 实际运维场景示例
场景:日志突增导致 Elasticsearch 写入阻塞
解决方案:
临时扩容:增加协调节点(Coordinating Node)分担写入压力。
调整索引设置:
|
Bash PUT logs-*/_settings { "index": { "refresh_interval": "30s", "number_of_replicas": 0 } }
|
启用异步写入队列(Logstash 配置 pipeline.ordered: false)。
通过以上指南,运维工程师可高效管理 ELK Stack,确保日志系统的稳定性、性能和安全性。
5.3.2 Rsyslog
以下是针对运维工程师的 Rsyslog 详细指南,涵盖核心功能、配置优化、集成方案及常见问题排查:
Rsyslog 简介
定位:高性能日志处理服务,支持日志收集、过滤、转发和存储,兼容 Syslog 协议。
核心功能:
支持本地日志(/var/log/)和远程日志收集。
模块化架构(TCP/UDP传输、数据库写入、加密传输等)。
灵活的过滤规则(基于优先级、来源、内容等)。
高吞吐量(异步队列、多线程处理)。
2. 安装与基本配置
(1) 安装
|
Bash # Debian/Ubuntu sudo apt install rsyslog
# RHEL/CentOS sudo yum install rsyslog sudo systemctl enable --now rsyslog
|
(2) 配置文件结构
主配置文件:/etc/rsyslog.conf
自定义配置:/etc/rsyslog.d/*.conf
模块加载:通过 $ModLoad 指令启用功能(如 TCP 支持、数据库输出等)。
(3) 基础配置示例
|
Bash # 启用 UDP 日志接收 $ModLoad imudp $UDPServerRun 514
# 将来自本机的 auth 日志存储到单独文件 if $hostname == 'localhost' and $syslogfacility-text == 'auth' then { action(type="omfile" file="/var/log/auth-local.log") stop }
# 转发所有日志到远程 Rsyslog 服务器 *.* @192.168.1.100:514
|
3. 高级配置场景
(1) 日志过滤与路由
|
Bash # 根据日志内容过滤(使用正则表达式) if $msg contains 'error' then { action(type="omfile" file="/var/log/error.log") }
# 按来源 IP 分类日志 if $fromhost-ip startswith '192.168.1.' then { action(type="omfile" file="/var/log/internal.log") }
|
(2) 加密传输(TLS)
|
Bash # 服务端配置(接收加密日志) $DefaultNetstreamDriver gtls $DefaultNetstreamDriverCAFile /etc/rsyslog/ca.crt $DefaultNetstreamDriverCertFile /etc/rsyslog/server.crt $DefaultNetstreamDriverKeyFile /etc/rsyslog/server.key $InputTCPServerStreamDriverMode 1 # TLS 模式 $InputTCPServerRun 6514
# 客户端配置(发送加密日志) $ActionSendStreamDriverMode 1 *.* @@(o)192.168.1.100:6514 # 使用 TCP + TLS
|
(3) 写入数据库(MySQL)
|
Bash # 加载数据库模块 $ModLoad ommysql
# 定义模板:将日志结构化存储到数据库 template(name="mysql-template" type="list" option.sql="on") { constant(value="INSERT INTO logs (host, message, severity) VALUES ('") property(name="hostname") constant(value="', '") property(name="msg") constant(value="', '") property(name="syslogseverity-text") constant(value="')") }
# 将错误日志写入数据库 if $syslogseverity <= 3 then { action(type="ommysql" server="localhost" db="syslog" uid="rsyslog" pwd="password" template="mysql-template") }
|
4. 性能优化
(1) 启用异步队列
|
Bash # 配置内存队列(减少磁盘 I/O) $WorkDirectory /var/spool/rsyslog # 队列持久化目录 $ActionQueueType LinkedList # 内存队列 $ActionQueueFileName queue # 队列文件名(持久化时使用) $ActionQueueSaveOnShutdown on # 停机时保存队列 $ActionQueueMaxDiskSpace 1g # 队列最大磁盘空间
|
(2) 多线程处理
|
Bash # 启用多线程处理(需 Rsyslog v8+) $WorkDirectory /var/spool/rsyslog $MainMsgQueueTimeoutEnqueue 5000 # 队列超时时间(毫秒) $MainMsgQueueWorkerThreads 4 # 工作线程数
|
(3) 限制日志速率
|
Bash # 防止日志洪泛(限制每秒 1000 条) $SystemLogRateLimitInterval 1 $SystemLogRateLimitBurst 1000
|
5. 与 ELK Stack 集成
(1) 转发日志到 Logstash
|
Bash # 配置 Rsyslog 输出到 Logstash(TCP) *.* @@192.168.1.200:5044 # Logstash 监听 5044 端口
# Logstash 配置示例(input 部分): input { tcp { port => 5044 codec => "json_lines" } }
|
(2) 直接写入 Elasticsearch
|
Bash # 加载 Elasticsearch 模块 $ModLoad omelasticsearch
# 定义 Elasticsearch 模板 template(name="es-template" type="list") { constant(value="{") property(name="timereported" dateFormat="rfc3339" format="json" outname="@timestamp") constant(value=", \"host\":\"") property(name="hostname") constant(value="\", \"message\":\"") property(name="msg" format="json") constant(value="\"}") }
# 发送日志到 Elasticsearch *.* action(type="omelasticsearch" server="es-node1:9200" template="es-template" searchIndex="syslog-%$YEAR%.%$MONTH%" bulkmode="on" queue.type="linkedlist" queue.size="10000")
|
6. 监控与故障排查
(1) 查看队列状态
|
Bash rsyslogd -N1 # 验证配置文件语法 systemctl status rsyslog grep -i "queue" /var/log/rsyslog.log # 检查队列堆积
|
(2) 统计日志流量
|
Bash # 使用 rsyslog 统计工具 rsyslogd -f /etc/rsyslog.conf -N1 -l # 列出所有规则和动作
|
(3) 常见问题处理
日志未写入文件:
检查文件权限:ls -l /var/log/
查看 SELinux 或 AppArmor 限制:audit2allow -a
远程日志未接收:
确认防火墙放行端口:iptables -L -n
测试网络连通性:nc -vz 192.168.1.100 514
高 CPU 占用:
优化过滤规则(避免复杂正则)。
启用异步队列和批量写入。
7. 安全加固
(1) 最小化权限
|
Bash # 以非 root 用户运行 $PrivDropToUser syslog $PrivDropToGroup syslog
|
(2) 防止日志伪造
|
Bash # 启用 RFC 3164 兼容模式(过滤非法来源) $EscapeControlCharactersOnReceive off $DropTrailingLFOnReception on
|
(3) 审计日志完整性
|
Bash # 使用日志签名(需安装 rsyslog-gnutls) $ModLoad imfile $InputFileAddMetadata on $InputFilePersistStateInterval 1 $InputFileVerifyHash="sha256"
|
8. 实际运维场景示例
场景:集中管理多台服务器的系统日志
步骤:
中央服务器配置:
|
Bash # 启用 TCP/UDP 接收 $ModLoad imtcp $InputTCPServerRun 514 $ModLoad imudp $UDPServerRun 514
# 按客户端 IP 分目录存储日志 $template RemoteLogs,"/var/log/remote/%$YEAR%-%$MONTH%/%fromhost-ip%.log" *.* ?RemoteLogs
|
客户端配置:
|
Bash # 转发所有日志到中央服务器 *.* @@192.168.1.100:514
|
通过合理配置 Rsyslog,运维工程师可以实现高效、安全的日志管理,并结合 ELK Stack 进行深度分析和可视化。
6. 脚本与自动化
6.1 Shell 脚本
6.1.1 基础语法(变量、条件判断、循环)
Shell脚本是运维工程师的必备技能,以下是基础语法核心要点和实用示例:
一、变量操作
变量定义
|
Bash name="alice" # 等号两侧不能有空格 count=10 # 数值不需要引号 path="/var/log" # 字符串建议用双引号
|
变量使用
|
Bash echo $name # 输出变量值 echo ${name} # 规范写法(推荐) echo "User: ${name}, Count: $count" # 字符串内嵌变量
|
环境变量
|
Bash export PATH=$PATH:/opt/bin # 设置环境变量 echo $HOME # 使用系统环境变量
|
命令替换
|
Bash current_time=$(date +%F) # 推荐写法 file_list=`ls /tmp` # 传统写法
|
二、条件判断
基础if结构
|
Bash if [ -f "/etc/passwd" ]; then echo "文件存在" fi
|
常用测试条件
文件判断:
|
Bash [ -f file ] # 是普通文件 [ -d dir ] # 是目录 [ -e path ] # 路径存在 [ -r file ] # 可读
|
字符串比较:
|
Bash [ "$str1" = "$str2" ] # 相等 [ "$str" != "" ] # 非空
|
数值比较:
|
Bash [ $num -eq 10 ] # 等于 [ $num -gt 5 ] # 大于 [ $num -le 20 ] # 小于等于
|
多条件判断
|
Bash if [ $cpu_usage -gt 90 ] && [ $mem_free -lt 100 ]; then echo "系统负载过高!" elif [ $cpu_usage -gt 80 ]; then echo "CPU使用率偏高" else echo "系统正常" fi
|
三、循环结构
for循环
|
Bash # 遍历列表 for service in nginx mysql redis; do systemctl status $service done
# 数字范围 for i in {1..5}; do echo "第${i}次测试" done
# 处理文件 for log in /var/log/*.log; do gzip $log done
|
while循环
|
Bash # 条件循环 count=0 while [ $count -lt 5 ]; do echo "计数: $count" ((count++)) done
# 读取文件 while read line; do echo "处理行: $line" done < access.log
# 无限循环 while true; do check_service sleep 300 done
|
四、运维实用技巧
参数处理
|
Bash echo "脚本名: $0" echo "第一个参数: $1" echo "参数总数: $#"
|
退出状态检查
|
Bash grep "ERROR" system.log if [ $? -ne 0 ]; then echo "未发现错误日志" fi
|
实战案例:服务检查
|
Bash #!/bin/bash service=$1
if systemctl is-active $service >/dev/null; then echo "$service 运行正常" exit 0 else echo "$service 服务异常!" | mail -s "服务报警" admin@example.com exit 1 fi
|
注意事项:
所有符号两边保留空格:[ $a == $b ]
字符串变量建议用引号包裹,防止空值错误
使用 $(command) 代替反引号 ``
调试脚本时添加 set -x 开启调试模式
建议练习方向:
日志分析脚本(统计错误次数)
自动备份脚本(带日期压缩)
服务监控脚本(自动重启异常服务)
配置批量修改脚本(多服务器管理)
掌握这些基础后,可以继续学习函数使用、信号处理、正则表达式等进阶内容。
6.1.2 常用命令(echo, read, test)
在Shell脚本编写中,echo、read和test(或 [ ])是运维工程师最常用的基础命令,用于输出信息、用户交互和条件判断。以下是它们的核心用法、技巧及典型运维场景示例:
echo 命令
功能
输出文本或变量:在终端或脚本中显示信息,常用于调试、日志记录或交互提示。
语法
常用选项
|
选项
|
说明
|
|
-e
|
启用转义字符(如 \n 换行、\t 制表符)
|
|
-n
|
不换行输出
|
典型用法
输出普通文本:
输出变量值:
|
Bash name="nginx" echo "当前进程:$name" # 输出:当前进程:nginx
|
转义字符(需 -e):
|
Bash echo -e "第一行\n第二行\t缩进" # 输出: # 第一行 # 第二行 缩进
|
写入文件(覆盖或追加):
|
Bash echo "日志内容" > /var/log/app.log # 覆盖 echo "新增内容" >> /var/log/app.log # 追加
|
运维场景示例
生成配置文件:
|
Bash # 动态生成Nginx配置 echo "server {" > /etc/nginx/conf.d/app.conf echo " listen 80;" >> /etc/nginx/conf.d/app.conf echo " server_name example.com;" >> /etc/nginx/conf.d/app.conf echo "}" >> /etc/nginx/conf.d/app.conf
|
2. read 命令
功能
读取用户输入或文件内容:用于交互式脚本,获取用户输入或逐行处理文件。
语法
常用选项
|
选项
|
说明
|
|
-p
|
显示提示信息(类似echo)
|
|
-s
|
静默输入(适用于密码)
|
|
-t
|
超时时间(秒)
|
|
-a
|
读取为数组
|
典型用法
基本输入:
|
Bash read -p "请输入用户名: " username echo "用户名为:$username"
|
读取密码(静默模式):
|
Bash read -s -p "请输入密码: " password echo "密码已接收"
|
超时处理:
|
Bash if read -t 10 -p "10秒内输入Y/N: " choice; then echo "您的选择:$choice" else echo "超时未输入!" fi
|
读取文件内容逐行处理:
|
Bash while read line; do echo "处理行:$line" done < /var/log/syslog
|
运维场景示例
批量创建用户:
|
Bash read -p "输入用户名列表(空格分隔): " -a users for user in "${users[@]}"; do useradd "$user" echo "用户 $user 已创建" done
|
3. test 命令(或 [ ])
功能
条件判断:检查文件属性、字符串/数值比较,用于if或while语句。
语法
常用条件类型
|
类型
|
示例
|
说明
|
|
文件检查
|
-f /path/file
|
文件是否存在且为普通文件
|
| |
-d /path/dir
|
目录是否存在
|
| |
-x /path/script
|
文件是否有执行权限
|
|
字符串比较
|
"$str1" = "$str2"
|
字符串相等
|
| |
-z "$str"
|
字符串是否为空
|
|
数值比较
|
$num1 -eq $num2
|
等于(equal)
|
| |
$num1 -gt $num2
|
大于(greater than)
|
|
逻辑组合
|
[ 条件1 ] && [ 条件2 ]
|
逻辑与
|
| |
[ 条件1 ] || [ 条件2 ]
|
逻辑或
|
典型用法
检查文件是否存在:
|
Bash if [ -f "/etc/nginx/nginx.conf" ]; then echo "配置文件存在" else echo "配置文件丢失!" fi
|
数值比较:
|
Bash if [ $cpu_usage -gt 90 ]; then echo "CPU使用率超过90%!" fi
|
字符串判空:
|
Bash if [ -z "$response" ]; then echo "未收到响应" fi
|
组合条件:
|
Bash if [ -f "/tmp/lock" ] && [ ! -d "/backup" ]; then echo "锁定文件存在且备份目录未创建" fi
|
运维场景示例
服务健康检查:
|
Bash if ! systemctl is-active --quiet nginx; then echo "Nginx未运行,尝试重启..." systemctl start nginx fi
|
磁盘空间告警:
|
Bash disk_usage=$(df / | awk 'NR==2 {print $5}' | tr -d '%') if [ $disk_usage -ge 80 ]; then echo "磁盘使用率超过80%,请清理!" | mail -s "告警" admin@example.com fi
|
4. 综合案例:备份脚本
|
Bash #!/bin/bash # 功能:交互式目录备份,带条件检查
read -p "请输入要备份的目录路径: " source_dir if [ ! -d "$source_dir" ]; then echo "错误:目录 $source_dir 不存在!" exit 1 fi
backup_dir="/backup/$(date +%Y%m%d)" if [ ! -d "$backup_dir" ]; then mkdir -p "$backup_dir" echo "备份目录已创建:$backup_dir" fi
tar -czf "$backup_dir/backup.tar.gz" "$source_dir" if [ $? -eq 0 ]; then echo "备份成功!文件:$backup_dir/backup.tar.gz" else echo "备份失败!" fi
|
5. 注意事项
引号使用:
变量用双引号包裹(避免空格或特殊字符问题):
|
Bash [ "$var" = "value" ] # 正确 [ $var = "value" ] # 可能出错
|
空格敏感:
test 或 [ ] 内条件与括号间需有空格:
|
Bash [ -f file ] # 正确 [-f file] # 语法错误
|
默认值处理:
结合 ${var:-default} 防止变量未定义:
|
Bash backup_dir="${backup_dir:-/tmp/default_backup}"
|
总结
echo:核心输出工具,支持格式化和重定向。
read:交互式输入和批量数据处理的关键。
test:脚本逻辑的基石,用于条件分支控制。
组合使用:结合 if、while 等控制结构,可构建复杂运维自动化脚本
6.1.3 脚本调试(set -x, bash -x)
面向运维工程师的 Shell 脚本调试指南(set -x 和 bash -x)
一、调试模式的作用
通过显示脚本执行的每个命令及其参数,帮助快速定位以下问题:
变量赋值异常
条件判断失效
命令执行顺序错误
管道/重定向问题
环境变量污染
二、两种调试方式对比
|
方式
|
应用场景
|
命令示例
|
|
bash -x
|
一次性调试整个脚本
|
bash -x deploy.sh
|
|
set -x
|
脚本内部局部调试(更灵活)
|
在脚本中插入 set -x; ...; set +x
|
三、高阶调试技巧
组合调试参数
|
Bash # 显示行号 + 扩展变量 + 命令跟踪 PS4='+${BASH_SOURCE}:${LINENO}: ' bash -x -e -o pipefail script.sh
|
2. 调试输出重定向
|
Bash # 将调试日志单独保存 exec 5> debug.log BASH_XTRACEFD="5" bash -x script.sh
|
3. 动态调试控制
|
Bash #!/bin/bash # 通过命令行参数启用调试 [[ "$1" == "debug" ]] && set -x
# 关键代码段调试 set -x critical_operation() set +x
|
4. 增强型调试格式
|
Bash export PS4='+[${SECONDS}s][${BASH_SOURCE}:${LINENO}]: ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
|
四、典型问题解决方案
场景1:管道命令调试
|
Bash # 错误示例:无法看到管道中间结果 cat access.log | grep 404 | awk '{print $7}'
# 调试方案:使用 tee 中间输出 set -x cat access.log | tee raw.log | grep 404 | tee filtered.log | awk '{print $7}' set +x
|
场景2:条件判断调试
|
Bash # 错误示例:if判断始终为真 if [ "$count" > 10 ]; then ... fi
# 调试显示: # + '[' 5 '>' 10 ']' # 修正为:if [ "$count" -gt 10 ]
|
场景3:环境变量污染检测
|
Bash # 启动时清空环境 env -i bash -x script.sh
|
五、生产环境最佳实践
敏感信息处理:
|
Bash # 关闭调试时命令回显 { set +x; } 2>/dev/null echo "Executing secret operation..." set -x
|
自动故障捕获:
|
Bash trap 'echo "ERROR at $BASH_COMMAND (line $LINENO), exiting"; exit 1' ERR trap 'set +x' EXIT
|
性能优化:
|
Bash # 限制调试范围 debug() { local _rc=$? set -x "$@" set +x return $_rc } debug aws s3 sync /data s3://bucket/
|
六、调试工具链整合
与 VSCode 集成:
|
JSON // launch.json { "configurations": [{ "type": "bashdb", "request": "launch", "name": "Debug Script", "program": "${file}", "args": [], "env": {"PS4": "+ [DEBUG] "} }] }
|
与系统日志集成:
|
Bash # 将调试日志写入syslog exec {BASH_XTRACEFD}>> >(logger -t "SCRIPT_DEBUG")
|
七、注意事项
生产环境建议通过 export PS4 增加时间戳:
|
Bash export PS4='+\t [DEBUG] '
|
避免在循环中使用全局调试:
|
Bash for i in {1..1000}; do { set +x; } 2>/dev/null # 关闭调试 process $i set -x validate $i done
|
使用 xtrace 调试子进程:
|
Bash ( set -x; git pull origin master )
|
掌握这些技巧后,运维工程师可以将平均故障定位时间(MTTR)降低 60% 以上。建议将常用调试模式封装成函数存入 ~/.bashrc 实现快速调用
6.2 自动化工具
6.2.1 Cron 定时任务
Cron 定时任务完全指南(运维工程师实战版)
一、Cron 基础语法
格式:
时间字段解释(从左到右):
分钟 (0-59)
小时 (0-23)
日 (1-31)
月 (1-12)
周几 (0-7, 0和7都代表周日)
要执行的命令
特殊符号:
|
符号
|
作用
|
示例
|
|
*
|
任意值
|
* * * * * 每分钟
|
|
,
|
值列表分隔符
|
0,15,30 * * * * 每小时的0,15,30分
|
|
-
|
范围值
|
0 9-18 * * * 早9点到晚6点整点执行
|
|
/
|
步长值
|
*/5 * * * * 每5分钟
|
二、关键注意事项
环境变量陷阱:
Cron 使用最小化环境(无用户级环境变量)
解决方案:
|
Bash 在脚本或crontab中显式设置PATH PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
路径问题:
所有命令使用绝对路径
示例:
|
Bash 错误写法 myscript.sh
正确写法 /opt/scripts/myscript.sh
|
输出处理:
默认会通过邮件发送输出(可能触发告警风暴)
推荐重定向:
|
Bash * * * * * /path/to/script.sh >/var/log/cron.log 2>&1
|
转义特殊字符:
% 需要转义为 \%(否则会被视为换行符)
|
Bash 错误示例 * * * * * date +%F > timestamp.log
正确写法 * * * * * date +\%F > timestamp.log
|
三、高级调度示例
|
场景描述
|
Cron 表达式
|
|
每天凌晨3点执行
|
0 3 * * *
|
|
每周一上午9:15执行
|
15 9 * * 1
|
|
每10分钟执行
|
*/10 * * * *
|
|
每月1号、15号中午执行
|
0 12 1,15 * *
|
|
工作日(周一到周五)执行
|
0 8 * * 1-5
|
|
每年1月1日0点执行
|
0 0 1 1 *
|
四、调试技巧
查看Cron日志:
|
Bash Ubuntu/Debian grep CRON /var/log/syslog
CentOS/RHEL grep CRON /var/log/cron
|
强制输出时间戳:
|
Bash * * * * * echo "$(date): Task started" >> /var/log/cron_debug.log
|
模拟执行环境:
|
Bash env -i /bin/bash -c "your_command"
|
分步调试:
|
Bash 测试脚本是否能在cron环境运行 SHELL=/bin/bash * * * * * /path/to/script.sh >> /tmp/cron_test.log 2>&1
|
五、生产环境最佳实践
权限控制:
禁止普通用户直接修改系统crontab
使用 crontab -u <user> -e 管理特定用户的任务
错误通知:
|
Bash 在crontab顶部设置邮件接收人 MAILTO="ops-team@example.com"
|
防雪崩机制:
|
Bash 使用flock防止重复执行 * * * * * /usr/bin/flock -n /tmp/my.lock /path/to/script.sh
|
敏感操作保护:
|
Bash 高危操作前添加二次确认 ```bash 0 3 * * * [ $(date +\%u) -eq 1 ] && /path/to/backup.sh 仅每周一执行
|
六、可视化工具推荐
Crontab Guru(在线表达式生成器):
https://crontab.guru
Cronhub(监控平台):
https://cronhub.io
Ansible Cron模块(批量管理):
|
YAML - name: Add daily cleanup job ansible.builtin.cron: name: "daily cleanup" minute: "30" hour: "3" job: "/opt/scripts/cleanup.sh"
|
七、常见错误排查表
|
现象
|
可能原因
|
解决方案
|
|
任务未执行
|
1. 脚本权限不足<br>2. 路径错误
|
chmod +x script.sh<br>检查绝对路径
|
|
输出结果不符合预期
|
环境变量缺失
|
在脚本中设置完整PATH
|
|
收到大量cron邮件
|
未重定向输出
|
添加 >/dev/null 2>&1
|
|
任务随机时间执行
|
系统时区设置错误
|
timedatectl set-timezone Asia/Shanghai
|
|
日志中出现 (CRON) ERROR
|
语法错误或特殊字符未转义
|
检查%是否转义为\%
|
掌握这些技巧后,可减少90%以上的Cron配置问题。建议将高频使用的Cron模板保存为代码片段,并通过版本控制系统管理生产环境的crontab文件。
6.2.2 Ansible(自动化部署)
Ansible 自动化部署实战指南(运维工程师专用)
一、核心概念速记
|
术语
|
作用
|
典型示例
|
|
Inventory
|
定义管理的主机列表
|
/etc/ansible/hosts
|
|
Playbook
|
自动化任务的YAML剧本
|
deploy.yml
|
|
Module
|
执行具体操作的单元(共3500+内置模块)
|
apt, copy, template
|
|
Role
|
可复用的任务集合
|
nginx, mysql
|
|
Handler
|
触发式任务(常用于服务重启)
|
notify: restart nginx
|
二、快速入门流程
基础环境搭建
|
Bash # Ubuntu安装 sudo apt update && sudo apt install ansible -y
# 配置基础Inventory echo "[web] 192.168.1.10 ansible_user=ubuntu 192.168.1.11 ansible_user=ubuntu" > hosts
|
首次连接测试
|
Bash ansible all -i hosts -m ping --private-key ~/.ssh/aws.pem # 成功响应应显示:SUCCESS => {"changed": false, "ping": "pong"}
|
执行Ad-Hoc命令
|
Bash # 批量查看磁盘空间 ansible web -i hosts -a "df -h"
# 安装软件包 ansible web -i hosts -m apt -a "name=nginx state=present" -b
|
三、Playbook 开发规范
标准结构示例
|
YAML --- - name: 部署Web集群 hosts: web become: yes vars: app_version: "1.2.0" max_connections: 1000
tasks: - name: 安装依赖包 apt: name: ["git", "python3-pip"] state: present
- name: 创建应用目录 file: path: "/opt/myapp" state: directory mode: '0755'
- name: 同步代码 git: repo: "https://github.com/myapp.git" dest: "/opt/myapp" version: "{{ app_version }}"
handlers: - name: 重启Nginx service: name: nginx state: restarted
|
四、高阶技巧
动态Inventory
|
Python #!/usr/bin/env python3 # aws_ec2.py print(json.dumps({ "web": {"hosts": ["ec2-1.compute.amazonaws.com"]}, "db": {"hosts": ["ec2-2.compute.amazonaws.com"]} }))
|
|
Bash ansible -i aws_ec2.py all -m ping
|
标签化执行
|
YAML tasks: - name: 安装数据库 tags: db - name: 配置负载均衡 tags: lb
|
|
Bash ansible-playbook deploy.yml --tags "db"
|
错误处理
|
YAML - name: 尝试危险操作 command: /opt/scripts/risky.sh ignore_errors: yes register: result failed_when: "'FATAL' in result.stderr"
|
性能优化
|
TOML # ansible.cfg [defaults] forks = 50 host_key_checking = False
[ssh_connection] pipelining = True
|
五、生产环境最佳实践
安全加固
|
YAML - name: 设置敏感变量 set_fact: db_password: "{{ vault_db_password }}" no_log: true # 隐藏日志输出
|
版本控制
|
Bash # 标准项目结构 myapp-ansible/ ├── group_vars/ ├── host_vars/ ├── roles/ │ ├── common/ │ └── webserver/ ├── inventories/ └── ansible.cfg
|
金丝雀发布
|
YAML - name: 第一批次部署 hosts: web[0] serial: 1
- name: 全量部署 hosts: web[1:] serial: "30%"
|
日志追踪
|
Bash ANSIBLE_LOG_PATH=./deploy.log ansible-playbook deploy.yml -vvv
|
六、典型场景解决方案
场景1:批量配置文件管理
|
YAML - name: 分发Nginx配置 template: src: templates/nginx.conf.j2 dest: /etc/nginx/nginx.conf validate: "nginx -t -c %s" notify: 重启Nginx
|
场景2:滚动更新
|
YAML - name: 应用更新 hosts: web serial: 2 # 每次更新2台 tasks: - name: 下线节点 uri: url: "http://{{ inventory_hostname }}/health" method: POST body: "status=down"
- name: 部署新版本 # 部署任务...
- name: 上线节点 uri: url: "http://{{ inventory_hostname }}/health" method: POST body: "status=up"
|
场景3:多云部署
|
YAML - name: AWS部署 hosts: aws_ec2 tasks: [...]
- name: 阿里云部署 hosts: aliyun_ecs vars: disk_mount: "/dev/vdb" tasks: [...]
|
七、调试与排错指南
干跑模式
|
Bash ansible-playbook deploy.yml --check --diff
|
变量检查
|
Bash ansible web -m debug -a "var=hostvars[inventory_hostname]"
|
分步调试
|
YAML - name: 调试任务 debug: msg: "当前用户 {{ ansible_user_id }}" when: debug_mode|default(false)
|
常见错误码解析
|
错误码
|
含义
|
解决方案
|
|
101
|
主机不可达
|
检查SSH配置/防火墙规则
|
|
256
|
命令执行失败
|
添加 ignore_errors: yes
|
|
4
|
变量未定义
|
使用 default() 过滤器
|
八、生态整合
与Docker集成
|
YAML - name: 启动容器 community.docker.docker_container: name: myapp image: "myapp:{{ app_version }}" ports: "8080:80"
|
与Kubernetes协同
|
YAML - name: 创建Deployment kubernetes.core.k8s: state: present definition: "{{ lookup('file', 'k8s/deployment.yml') }}"
|
与Terraform联动
|
Plain Text # 输出Ansible Inventory output "ansible_inventory" { value = <<EOT [web] ${join("\n", aws_instance.web.*.public_ip)} EOT }
|
掌握这些技巧后,可完成以下典型运维操作:
5分钟内 完成100台服务器的标准化配置
零宕机 实现应用滚动更新
统一管理 混合云基础设施
审计追踪 所有变更操作
建议将常用Playbook封装成角色并发布到Ansible Galaxy,推荐使用AWX/Tower实现企业级自动化运维管控。
6.2.3 Bash 脚本编写
Bash 脚本编写实战指南(运维工程师版)
一、脚本基础规范
脚本头部声明:
|
Bash #!/usr/bin/env bash # 推荐使用env查找bash路径 set -euo pipefail # 安全模式:错误退出/未定义变量报错/管道失败传递 shopt -s globstar nullglob # 启用递归通配符和空匹配处理
|
注释规范:
|
Bash # 模块级注释(使用开头) 数据库备份模块
# 单行注释(与代码间隔两空格) local retries=3 # 最大重试次数
|
文件命名:
小写+下划线格式(例:log_rotate.sh)
重要脚本添加.sh扩展名
二、变量处理技巧
变量声明原则:
|
Bash readonly MAX_RETRIES=5 # 常量使用readonly declare -r CONFIG_FILE="/etc/app.conf" # 显式声明只读变量 local tmp_file # 函数内变量必须local化
|
安全变量引用:
|
Bash # 错误示范 echo $FILE_NAME_XXX
# 正确实践 echo "${file_name}" # 始终用{}包裹变量名 echo "${file_name:-default.log}" # 设置默认值
|
敏感信息处理:
|
Bash # 从外部存储读取密码 password=$(aws secretsmanager get-secret-value --secret-id prod/db-pass | jq -r '.SecretString') # 使用后立即清除 unset password
|
三、流程控制最佳实践
条件判断:
|
Bash # 文件判断 [[ -f "/var/lock/.process_lock" ]] && rm -f /var/lock/.process_lock
# 数值比较 if (( attempt_count > MAX_RETRIES )); then exit 1 fi
# 正则匹配 [[ "$hostname" =~ ^web-[0-9]{2}.prod ]] && echo "Web节点"
|
循环优化:
|
Bash # 避免使用`ls`遍历文件 for log_file in /var/log/app/*.log; do gzip "${log_file}" done
# 处理带空格文件名 find /data -name '*.tmp' -print0 | while IFS= read -r -d '' file; do rm -v "$file" done
|
多分支选择:
|
Bash case "${status_code}" in 200) echo "Success" ;; 40[0-9]) echo "Client Error" ;; 50[0-9]) echo "Server Error" ;; *) echo "Unknown status" ;; esac
|
四、函数开发规范
函数定义标准:
|
Bash # 函数注释模板
# 发送告警通知 # 参数: # $1: 告警级别 (INFO/WARN/CRIT) # $2: 告警消息内容 # 返回值: # 0: 成功 | 非零: 失败
send_alert() { local level="$1" local message="$2" # 函数实现... }
|
参数校验模式:
|
Bash check_port() { (( $# == 1 )) || { echo "Usage: check_port <port>"; return 1; } [[ "$1" =~ ^[0-9]+$ ]] || { echo "Invalid port number"; return 2; } # 检查逻辑... }
|
返回值处理:
|
Bash # 捕获错误输出 if ! output=$(mysqldump -u root db 2>&1); then echo "备份失败: ${output}" exit 1 fi
|
五、错误处理机制
信号捕获:
|
Bash trap 'cleanup_temp_files; exit 1' INT TERM HUP # 捕获中断信号
# EXIT信号处理 trap '[[ $? -eq 0 ]] && send_success_report || send_failure_report' EXIT
|
重试逻辑模板:
|
Bash retry_command() { local max_retries=3 local delay=5 for ((i=1; i<=max_retries; i++)); do if $@; then return 0 else echo "尝试 $i/$max_retries 失败,${delay}秒后重试..." sleep ${delay} fi done return 1 }
# 使用示例 retry_command curl -sSf http://api-service/health
|
错误日志标准化:
|
Bash log() { local level=$1 shift printf "[%s] [%s] %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "${level}" "$*" >> /var/log/ops.log }
# 调用示例 log INFO "开始处理用户数据" log ERROR "数据库连接失败"
|
六、性能优化技巧
减少子进程创建:
|
Bash # 错误方式(每次循环创建子进程) while read line; do echo "${line}" | awk '{print $2}' done < data.txt
# 优化方案(单进程处理) awk '{print $2}' data.txt > processed.txt
|
使用进程替换:
|
Bash # 比较两个排序文件差异 diff <(sort file1) <(sort file2)
|
内存优化:
|
Bash # 大文件处理使用while循环 while IFS= read -r line; do process_line "$line" done < <(grep 'ERROR' huge.log)
|
七、生产环境脚本示例
服务监控脚本:
|
Bash #!/usr/bin/env bash set -eo pipefail
SERVICE_NAME="nginx" MAX_RESTARTS=3 LOCK_FILE="/tmp/${SERVICE_NAME}_monitor.lock"
# 获取锁防止并发执行 exec 9>"${LOCK_FILE}" flock -n 9 || exit 0
restart_count=0 while ! systemctl is-active --quiet "${SERVICE_NAME}"; do ((restart_count++)) if (( restart_count > MAX_RESTARTS )); then send_alert "CRIT" "${SERVICE_NAME} 重启超过${MAX_RESTARTS}次" exit 1 fi systemctl restart "${SERVICE_NAME}" sleep 10 done
|
日志轮转脚本:
|
Bash #!/usr/bin/env bash set -euo pipefail
LOG_DIR="/var/log/app" KEEP_DAYS=30 COMPRESS_CMD="zstd --rm -9 -T0"
find "${LOG_DIR}" -name '*.log' -mtime +1 | while read -r logfile; do # 添加时间戳后缀 timestamp=$(date -r "$logfile" +%Y%m%d) mv "$logfile" "${logfile}.${timestamp}" # 并行压缩 $COMPRESS_CMD "${logfile}.${timestamp}" & done
# 清理旧日志 find "${LOG_DIR}" -name '*.zst' -mtime +${KEEP_DAYS} -delete
|
八、调试与测试
静态检查工具:
|
Bash # 安装ShellCheck sudo apt-get install shellcheck
# 检查脚本 shellcheck -s bash deploy.sh
|
单元测试框架:
|
Bash #!/usr/bin/env bash # test_math.sh
source math_functions.sh
test_add() { (( $(add 2 3) == 5 )) || return 1 (( $(add -1 1) == 0 )) || return 2 }
# 运行测试 declare -i failures=0 for test_func in $(declare -F | awk '/test_/ {print $3}'); do if ! $test_func; then echo "FAIL: $test_func" ((failures++)) fi done exit $failures
|
九、版本管理与发布
嵌入版本信息:
|
Bash
# 版本元数据(自动生成,勿手动修改) declare -r SCRIPT_VERSION="1.2.3" declare -r GIT_COMMIT="a1b2c3d" declare -r BUILD_DATE="2023-08-20"
|
版本检查机制:
|
Bash check_update() { latest_version=$(curl -sSf https://api.example.com/script/latest) if [[ "${SCRIPT_VERSION}" != "${latest_version}" ]]; then echo "发现新版本: ${latest_version}" return 1 fi return 0 }
|
十、安全加固措施
输入验证模板:
|
Bash validate_input() { [[ "$1" =~ ^[a-zA-Z0-9_-]{4,20}$ ]] || { echo "无效用户名: 只允许字母数字和下划线(4-20字符)" return 1 } [[ "$2" == "start" || "$2" == "stop" ]] || { echo "无效操作: 必须为start或stop" return 2 } }
|
权限最小化:
|
Bash # 以非特权用户运行 if [[ $UID -eq 0 ]]; then exec sudo -u appuser "$0" "$@" fi
|
掌握这些技巧后,可编写出符合生产要求的健壮脚本。建议将常用功能模块化并建立内部脚本库,通过 source /opt/scripts/lib/utils.sh 方式复用代码。定期使用 shellcheck 进行代码审查,复杂场景建议配合 bats (Bash Automated Testing System) 实现自动化测试。
7. 安全与加固
7.1 用户安全
7.1.1 密码策略(/etc/login.defs)
Linux 密码策略深度配置指南(/etc/login.defs)
一、核心配置参数详解
|
Bash # 密码有效期控制 PASS_MAX_DAYS 90 # 密码最长有效期(强制修改周期) PASS_MIN_DAYS 7 # 密码最短保留天数(防止频繁修改) PASS_WARN_AGE 14 # 密码过期前提醒天数
# 密码复杂度基础设置 PASS_MIN_LEN 12 # 最小密码长度(需配合PAM模块生效) ENCRYPT_METHOD SHA512 # 密码哈希算法(可选SHA256/SHA512)
# 用户UID/GID范围 UID_MIN 1000 # 普通用户最小UID UID_MAX 60000 # 普通用户最大UID SYS_UID_MIN 201 # 系统用户UID起始 SYS_UID_MAX 999 # 系统用户UID结束
|
二、生产环境推荐配置
|
Bash # 密码生命周期 PASS_MAX_DAYS 60 # 每60天强制改密 PASS_MIN_DAYS 1 # 修改密码后至少隔1天才能再次修改 PASS_WARN_AGE 7 # 过期前7天开始提醒
# 账户锁定策略 FAIL_DELAY 5 # 登录失败后延迟5秒 LOG_UNKFAIL_ENAB yes # 记录未知用户名登录失败 LOG_OK_LOGINS no # 不记录成功登录(减少日志量)
# 密码历史控制 PASS_HISTORY_DAYS 365 # 保留最近1年密码记录(需配合PAM的remember参数)
|
三、关联工具配合使用
chage命令(覆盖login.defs默认值):
|
Bash # 查看用户策略 chage -l username
# 设置用户特定策略 chage -M 30 -m 2 -W 7 username # 覆盖全局配置
|
PAM强化配置(/etc/pam.d/system-auth):
|
Bash # 密码复杂度要求(需安装cracklib) password requisite pam_cracklib.so \ retry=3 minlen=12 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 # 参数说明: # difok=3 : 新密码至少3个字符与旧密码不同 # ucredit=-1 : 至少1个大写字母 # lcredit=-1 : 至少1个小写字母 # dcredit=-1 : 至少1个数字 # ocredit=-1 : 至少1个特殊字符
|
四、密码策略验证方法
新建用户测试:
|
Bash # 创建测试用户 useradd testuser echo "Testpass123!" | passwd testuser --stdin
# 查看生效策略 grep testuser /etc/shadow # 输出示例: # testuser:$6$...:19111:1:60:7::: # 字段解释:最后4个数字对应 MIN:MAX:WARN:INACT
|
密码复杂度检查:
|
Bash # 使用cracklib-check验证密码强度 echo "weakpassword" | cracklib-check # 输出:weakpassword: it is based on a dictionary word
|
五、安全加固最佳实践
禁用默认密码哈希:
|
Bash # 在/etc/login.defs中禁用不安全的MD5 MD5_CRYPT_ENAB no
|
限制系统用户登录:
|
Bash # 在/etc/login.defs设置系统账户shell为/sbin/nologin SHELL /sbin/nologin
|
定期密码审计:
|
Bash # 使用脚本检查过期账户 #!/bin/bash current_epoch=$(date +%s) for user in $(cut -d: -f1 /etc/passwd); do expires=$(chage -l $user | awk '/Password expires/ {print $4}') [[ "$expires" == "never" ]] && echo "ALERT: $user 密码永不过期" done
|
六、注意事项
配置生效条件:
仅对新创建用户生效(已有用户需使用chage手动修改)
密码复杂度需配合PAM模块(如pam_cracklib或pam_pwquality)
多因素认证集成:
|
Bash # 在/etc/pam.d/sshd中添加OTP验证 auth required pam_google_authenticator.so
|
日志监控配置:
|
Bash # 在/etc/login.defs启用详细日志 LOG_OK_LOGINS yes # 记录成功登录 LOGIN_RETRIES 3 # 允许的最大登录尝试次数 LOGIN_TIMEOUT 60 # 登录超时时间(秒)
|
七、配置备份与恢复
|
Bash # 备份配置 cp /etc/login.defs /etc/login.defs.bak-$(date +%Y%m%d)
# 快速回滚 restore_login_defs() { cp /etc/login.defs.bak-20230820 /etc/login.defs echo "请执行以下命令使配置生效:" echo "pam-auth-update --force && systemctl restart sshd" }
|
通过合理配置 /etc/login.defs 并配合相关工具,可有效提升系统安全性。建议每季度执行密码策略审计,并通过自动化工具(如Ansible)保持多台服务器配置一致性。对于关键系统,建议集成LDAP/AD统一认证管理。
7.1.2 SSH 安全配置(禁用 root 登录、密钥认证)
SSH 安全配置终极指南(禁用 Root 登录 + 密钥认证)
一、基础安全加固
备份配置文件:
|
Bash sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
|
核心配置修改:
|
Bash sudo vim /etc/ssh/sshd_config
# 禁用Root登录 PermitRootLogin no
# 强制密钥认证 PasswordAuthentication no
# 禁用空密码 PermitEmptyPasswords no
# 限制登录用户(白名单) AllowUsers opsadmin deployer
# 禁用不安全的SSHv1 Protocol 2
# 可选:修改默认端口 Port 58222
|
二、密钥认证全流程
生成密钥对(客户端操作):
|
Bash # 推荐使用更安全的Ed25519算法 ssh-keygen -t ed25519 -C "ops@company" -f ~/.ssh/prod_key
# 生成4096位RSA密钥(兼容旧系统) ssh-keygen -t rsa -b 4096 -C "backup@old" -f ~/.ssh/legacy_key
|
部署公钥到服务器:
|
Bash # 自动部署(需密码登录权限) ssh-copy-id -i ~/.ssh/prod_key.pub -p 22 user@host
# 手动部署(推荐生产环境):
|
权限验证:
|
Bash # 服务器端检查权限 ls -ld ~/.ssh ~/.ssh/authorized_keys # 正确权限: # drwx------ 2 user user 4096 Aug 20 .ssh # -rw------- 1 user user 789 Aug 20 authorized_keys
|
三、配置生效与测试
安全重启SSH服务:
|
Bash # 保持现有连接测试(重要!) sudo systemctl reload sshd
# 或在新端口重启(如果修改了端口) sudo systemctl restart sshd
# 验证服务状态 sudo systemctl status sshd
|
连接测试:
|
Bash # 测试密钥登录 ssh -i ~/.ssh/prod_key -p 58222 user@host
# 验证root登录是否被拒 ssh root@host # 预期错误:Permission denied (publickey)
|
四、高级安全增强
Fail2ban集成:
|
Bash # 安装配置 sudo apt-get install fail2ban sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# 修改配置 [sshd] enabled = true port = 58222 maxretry = 3 findtime = 3600 bantime = 86400
|
多因素认证(2FA):
|
Bash # 安装Google Authenticator sudo apt-get install libpam-google-authenticator
# 修改PAM配置 echo "auth required pam_google_authenticator.so" | sudo tee -a /etc/pam.d/sshd
# 修改sshd_config AuthenticationMethods publickey,keyboard-interactive
|
五、生产环境检查清单
防火墙配置:
|
Bash # 放行SSH新端口 sudo ufw allow 58222/tcp sudo ufw reload
|
日志监控:
|
Bash # 实时监控SSH登录尝试 sudo tail -f /var/log/auth.log | grep sshd
|
定期密钥轮换:
|
Bash # 密钥过期提醒脚本 find ~/.ssh -name "*.pub" -mtime +180 -exec echo "即将过期的密钥: {}" \;
|
六、故障排除指南
|
现象
|
解决方案
|
|
密钥认证失败
|
检查authorized_keys权限是否为600
|
|
修改端口后无法连接
|
确认防火墙/SELinux/云安全组策略
|
|
账户被锁定
|
通过控制台登录检查/var/log/secure
|
|
配置文件报错
|
使用sshd -t测试配置文件语法
|
|
兼容旧客户端
|
添加HostKeyAlgorithms +ssh-rsa到配置
|
七、自动化部署示例(Ansible)
|
YAML - name: 加固SSH配置 hosts: all become: yes tasks: - name: 部署SSH配置 template: src: sshd_config.j2 dest: /etc/ssh/sshd_config validate: /usr/sbin/sshd -t -f %s notify: restart sshd
- name: 部署用户密钥 authorized_key: user: "{{ ansible_user }}" key: "{{ lookup('file', '~/.ssh/prod_key.pub') }}" manage_dir: yes
handlers: - name: restart sshd systemd: name: sshd state: restarted
|
通过以上配置,可将SSH安全风险降低90%以上。关键注意事项:
修改配置前务必在新窗口保持活跃SSH连接
生产环境建议先使用sshd -T测试配置
密钥文件权限必须严格设置为600
定期审计授权密钥列表(~/.ssh/authorized_keys)
7.2.3 tcpdump抓包和wireshark
网络抓包双剑客:tcpdump 与 Wireshark 实战指南
一、tcpdump 核心用法(Linux抓包)
基础抓包命令:
|
Bash # 抓取eth0网卡所有流量(Ctrl+C停止) sudo tcpdump -i eth0
# 抓取指定IP的流量(双向) sudo tcpdump host 192.168.1.100
# 抓取HTTP流量(80端口) sudo tcpdump -nn -i eth0 port 80
|
高级过滤技巧:
|
Bash # 组合过滤(IP+端口+协议) sudo tcpdump 'host 10.0.0.5 && (port 443 || port 80) && tcp'
# 抓取TCP异常流量 sudo tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'
# 排除SSH流量(避免自操作干扰) sudo tcpdump 'not port 22'
|
输出控制优化:
|
Bash # 实时解析显示(-A ASCII,-X十六进制) sudo tcpdump -A -nn -i eth0
# 限制抓包数量(-c 100)并保存到文件(-w) sudo tcpdump -c 100 -w /tmp/capture.pcap
# 显示时间戳(-tttt 详细时间) sudo tcpdump -tttt -i eth0
|
二、Wireshark 分析技巧(GUI工具)
快速分析三板斧:
统计 > 协议分级:查看协议分布
统计 > 对话:分析IP/TCP/UDP通信对
过滤栏:使用 http、tcp.retransmission 等过滤条件
高级分析场景:
TCP连接问题:
|
Plain Text tcp.analysis.retransmission # 重传检测 tcp.analysis.window_update # 窗口缩放问题 tcp.flags.syn==1 && tcp.flags.ack==0 # 半开连接
|
HTTP性能分析:
|
Plain Text http.time > 1 # 响应超过1秒的请求 http.response.code >= 400 # 错误响应
|
安全事件追踪:
|
Plain Text tcp contains "password" # 敏感信息泄露 dns.qry.name matches "malware" # 恶意域名解析
|
三、联合工作流(CLI+GUI)
远程抓包本地分析:
|
Bash # 在服务器抓包并实时传输(10.0.0.1为分析机) ssh root@server "tcpdump -U -i eth0 -w - 'port 3306'" | wireshark -k -i -
# 保存后分析(推荐生产环境) sudo tcpdump -i eth0 -w /tmp/mysql.pcap port 3306 scp server:/tmp/mysql.pcap .
|
自动提取关键信息:
|
Bash # 提取HTTP请求URL tshark -r capture.pcap -Y http.request -T fields -e http.host -e http.request.uri
# 统计TCP重传 tshark -r capture.pcap -Y "tcp.analysis.retransmission" -qz "io,stat,0"
|
四、生产环境实战案例
数据库连接泄漏分析:
|
Bash # 抓取MySQL连接(显示SQL语句) sudo tcpdump -i eth0 -A -s0 port 3306 | grep "SELECT\|INSERT\|UPDATE"
# Wireshark过滤: mysql.query contains "WHERE"
|
DNS解析故障排查:
|
Bash sudo tcpdump -nn -i eth0 udp port 53 -w dns.pcap
# Wireshark分析链: 统计 > DNS > 查看响应码 过滤:dns.flags.rcode != 0
|
HTTPS通信分析:
|
Bash # 抓取TLS握手信息 sudo tcpdump -i eth0 -w tls.pcap 'tcp port 443 && (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x16030100)'
# Wireshark解密: 编辑 > 首选项 > Protocols > TLS > 添加RSA Key
|
五、性能优化与注意事项
抓包性能调优:
|
Bash # 限制抓包大小(-s 96只抓头部) sudo tcpdump -s 96 -w small.pcap
# 使用BPF过滤减少数据量 sudo tcpdump 'tcp port 8080 and greater 512' # 只抓大包
# 多核处理(-B 缓冲区大小) sudo tcpdump -B 4096 -w large.pcap
|
安全注意事项:
使用-w保存原始数据后及时删除
敏感环境抓包需要审批
抓包前评估网络负载(iftop监控)
六、高级技巧扩展
流量重放攻击测试:
|
Bash # 提取HTTP请求并重放 tshark -r web.pcap -Y http.request -T fields -e http.host -e http.request.uri | xargs -I {} curl -X GET "{}"
# 使用tcpreplay重放流量 tcpreplay -i eth0 -K capture.pcap
|
自动化分析脚本:
|
Python #!/usr/bin/env python3 from pyshark import FileCapture
cap = FileCapture('capture.pcap', display_filter='http') for pkt in cap: if 'http' in pkt: print(f"[{pkt.sniff_time}] {pkt.http.request_method} {pkt.http.host}{pkt.http.request_uri}")
|
黄金组合实践建议:
生产环境先用tcpdump抓取保存,再用Wireshark离线分析
复杂过滤优先使用BPF语法(tcpdump),图形化分析使用Wireshark
定期清理抓包文件(find /tmp -name "*.pcap" -mtime +1 -delete)
通过掌握这些技巧,可将网络故障排查效率提升3倍以上。建议将常用过滤条件保存为Wireshark配置文件(分析 > 导出分组解析结果),并建立典型流量样本库用于快速比对。
7.2 防火墙与安全组
7.2.1 iptables/firewalld 配置
Linux 防火墙配置全指南(iptables 与 firewalld 双方案)
一、核心概念对比
|
特性
|
iptables
|
firewalld
|
|
配置方式
|
静态规则文件
|
动态区域管理(XML/DBUS)
|
|
规则持久化
|
需手动保存 (iptables-save)
|
自动保存
|
|
热更新
|
需要重启服务
|
无需重启即时生效
|
|
适用场景
|
简单规则/旧系统
|
复杂策略/现代发行版
|
|
服务管理
|
无内置服务概念
|
预定义服务模板(http, ssh等)
|
二、iptables 实战配置
基础规则配置
|
Bash # 清空现有规则 iptables -F iptables -X
# 设置默认策略 iptables -P INPUT DROP # 默认拒绝所有入站 iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT
# 允许已建立的连接 iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 开放SSH(限制IP段) iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
# 允许HTTP/HTTPS iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# ICMP限速(防止Ping洪水) iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
|
2. 高级防护规则
|
Bash # 防SYN洪水攻击 iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
# 防端口扫描 iptables -N PORTSCAN iptables -A PORTSCAN -m limit --limit 1/s -j LOG --log-prefix "[PORT SCAN] " iptables -A PORTSCAN -j DROP iptables -A INPUT -m recent --name portscan --rcheck --seconds 86400 -j PORTSCAN iptables -A INPUT -m recent --name portscan --set
# 限制新建连接数 iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 50 -j REJECT
|
3. NAT与端口转发
|
Bash # 启用IP转发 sysctl -w net.ipv4.ip_forward=1
# SNAT(内网访问外网) iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
# DNAT(外部访问内网服务) iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.0.10:80 iptables -A FORWARD -p tcp -d 192.168.0.10 --dport 80 -j ACCEPT
|
4. 规则持久化
|
Bash # 保存规则(Debian/Ubuntu) iptables-save > /etc/iptables/rules.v4
# 保存规则(CentOS/RHEL) service iptables save
# 开机加载 echo 'iptables-restore < /etc/iptables/rules.v4' >> /etc/rc.local
|
三、firewalld 实战配置
区域管理
|
Bash # 查看默认区域 firewall-cmd --get-default-zone
# 创建新隔离区 firewall-cmd --permanent --new-zone=restricted
# 绑定网卡到区域 firewall-cmd --zone=work --change-interface=eth0
|
2. 服务管理
|
Bash # 查看预定义服务 firewall-cmd --get-services
# 添加HTTP服务到public区域 firewall-cmd --permanent --zone=public --add-service=http
# 自定义服务(创建XML文件) vi /etc/firewalld/services/myapp.xml <?xml version="1.0" encoding="utf-8"?> <service> <short>MyApp Service</short> <port protocol="tcp" port="9000"/> </service>
|
3. 富规则(Rich Rules)
|
Bash # 允许指定IP访问SSH firewall-cmd --permanent --zone=public --add-rich-rule=' rule family="ipv4" source address="203.0.113.0/24" service name="ssh" accept'
# 限制连接速率 firewall-cmd --permanent --zone=public --add-rich-rule=' rule family="ipv4" service name="http" limit value="50/m" accept'
# 端口转发 firewall-cmd --permanent --zone=public --add-forward-port=' port=8080:proto=tcp:toport=80:toaddr=192.168.1.10'
|
4. 高级防护
|
Bash # 拒绝无效数据包 firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -m conntrack --ctstate INVALID -j DROP
# 防DDoS(需要安装ipset) firewall-cmd --permanent --new-ipset=blocklist --type=hash:ip firewall-cmd --permanent --ipset=blocklist --add-entry=192.168.1.100 firewall-cmd --permanent --zone=public --add-rich-rule=' rule source ipset=blocklist drop'
|
四、生产环境最佳实践
安全基线配置
|
Bash # 通用配置项 - 默认策略设置为DROP - 仅开放必要端口 - 记录异常流量日志 - 定期审查防火墙规则
# 日志配置示例(iptables) iptables -A INPUT -j LOG --log-prefix "[IPTABLES DENIED] " --log-level 4
|
2. 自动化维护
|
Bash # 使用Ansible管理firewalld - name: 配置生产防火墙 firewalld: zone: public service: "{{ item }}" permanent: yes state: enabled loop: - http - https - ssh
# 使用Cron定期清理旧规则 0 3 * * * /sbin/iptables -F PORTSCAN
|
3. 双机热备方案
|
Bash # 使用keepalived同步iptables规则 vrrp_script chk_iptables { script "/usr/local/bin/iptables_check.sh" interval 2 weight 2 }
# 同步脚本示例 rsync -avz /etc/iptables/ backup-server:/etc/iptables/ ssh backup-server "iptables-restore < /etc/iptables/rules.v4"
|
五、故障排查指南
|
现象
|
诊断命令
|
解决方案
|
|
规则不生效
|
iptables -L -n -v
|
检查规则顺序,确认无冲突
|
|
服务无法访问
|
telnet <ip> <port>
|
检查区域绑定和服务启用状态
|
|
NAT失效
|
tcpdump -i eth0 port 80
|
验证转发和MASQUERADE规则
|
|
性能下降
|
conntrack -L
|
优化连接跟踪表大小
|
|
日志无记录
|
`dmesg
|
grep -i firewall`
|
六、性能优化技巧
iptables调优
|
Bash # 调整连接跟踪表 sysctl -w net.netfilter.nf_conntrack_max=1000000 echo 1000000 > /sys/module/nf_conntrack/parameters/hashsize
# 规则排序优化 将高频匹配规则放在顶部
|
2. firewalld优化
|
Bash # 预加载常用模块 firewall-cmd --permanent --direct --add-passthrough ipv4 -I INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# 禁用不需要的zone firewall-cmd --permanent --delete-zone=dmz
|
通过合理配置防火墙,可将网络攻击面减少70%以上。建议将关键配置纳入版本控制系统,并使用自动化工具统一管理多台服务器的防火墙策略。对于云环境,需注意与云平台安全组的协同工作。
7.2.2 安全组规则(云环境)
云安全组配置深度指南(AWS/Aliyun/Tencent Cloud通用)
一、安全组核心设计原则
最小权限原则:仅开放必要协议/端口
分层防御:配合网络ACL、WAF等形成纵深防御
环境隔离:区分生产/测试/开发环境安全组
动态授权:利用安全组引用实现动态授权
二、生产环境标准配置模板
|
YAML # 入站规则(Inbound) - 协议: TCP 端口范围: 22 授权对象: 10.0.1.0/24(运维堡垒机网段) 描述: SSH管理通道
- 协议: TCP 端口范围: 80,443 授权对象: 0.0.0.0/0 描述: Web服务开放端口
- 协议: TCP 端口范围: 6379 授权对象: sg-xxxxxx(Redis安全组ID) 描述: 仅允许Redis集群内部访问
# 出站规则(Outbound) - 协议: ALL 端口范围: ALL 授权对象: 0.0.0.0/0 描述: 默认全放通(根据合规要求可收紧)
|
三、高级安全策略
跨账户授权:
|
Bash # AWS跨账户安全组授权 aws ec2 authorize-security-group-ingress \ --group-id sg-yourgroup \ --protocol tcp \ --port 3306 \ --source-group sg-othergroup \ --source-owner-id 123456789012
|
时间受限规则(需云平台支持):
|
Bash # 阿里云临时开放策略(通过OpenAPI) aliyun ecs AuthorizeSecurityGroup \ --SecurityGroupId sg-xxxx \ --IpProtocol tcp \ --PortRange 3389/3389 \ --SourceCidrIp 203.0.113.12/32 \ --ExpireTime "2023-08-25T18:00:00Z"
|
安全组嵌套引用:
|
YAML # 前端服务安全组 入站规则: - 协议: TCP 端口: 80 源: sg-frontend-lb(负载均衡安全组)
# 后端服务安全组 入站规则: - 协议: TCP 端口: 8080 源: sg-frontend(前端服务安全组)
|
四、典型场景配置方案
Web集群架构:
|
Plain Text graph TD A[用户] -->|80/443| B(负载均衡安全组) B -->|8080| C[前端服务安全组] C -->|3306| D[数据库安全组] 安全组策略: B: 允许0.0.0.0/0入站80/443 C: 仅允许来自B的8080访问 D: 仅允许来自C的3306访问
|
跳板机访问控制:
|
Bash # 安全组规则 入站: - SSH(22): 企业公网IP段 - RDP(3389): 无(通过SSH隧道访问)
出站: - 全禁止(仅允许访问yum仓库安全组)
|
数据库安全隔离:
|
YAML 入站规则: - 协议: TCP 端口: 5432 源: sg-app-server(应用服务器安全组) 描述: 仅应用层访问
出站规则: - 协议: TCP 端口: 5432 目标: sg-db-replica(数据库从库安全组)
|
五、安全审计与优化
风险检测项目:
|
Bash 1. 0.0.0.0/0 开放高危端口(22/3389/3306等) 2. 未使用的历史规则堆积 3. 缺少tag分类导致管理混乱 4. 未启用流量日志监控
|
自动化审计脚本:
|
Python import boto3
def audit_security_groups(): ec2 = boto3.client('ec2') groups = ec2.describe_security_groups()['SecurityGroups'] for sg in groups: print(f"检查安全组: {sg['GroupId']}") for perm in sg['IpPermissions']: if perm['IpProtocol'] == '-1': # 检测全协议开放 print(f" !!! 全协议开放风险") for ip_range in perm.get('IpRanges', []): if ip_range['CidrIp'] == '0.0.0.0/0': print(f" !!! 0.0.0.0/0 开放端口: {perm['FromPort']}-{perm['ToPort']}")
|
六、多云平台差异处理
|
功能
|
AWS
|
阿里云
|
腾讯云
|
|
规则优先级
|
无优先级,全部生效
|
按顺序匹配
|
按顺序匹配
|
|
跨账户授权
|
支持(指定Account ID)
|
支持(跨账户安全组ID)
|
支持(跨账户安全组ID)
|
|
流量日志
|
VPC Flow Logs
|
流日志
|
流日志
|
|
规则生效时间
|
即时
|
即时
|
可能存在延迟
|
七、最佳实践清单
命名规范:
|
Bash # 安全组命名模板 {env}-{role}-{layer}-sg # 示例: prod-web-frontend-sg
|
变更管理:
|
Bash # 通过Terraform管理安全组 resource "aws_security_group" "web" { name = "prod-web-sg" description = "Web tier security group" ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } }
|
监控告警:
|
Bash # 检测安全组变更事件 AWS CloudTrail事件: AuthorizeSecurityGroupIngress RevokeSecurityGroupEgress
|
通过合理配置安全组,可降低80%以上的网络层攻击风险。建议每月执行安全组审计,并结合VPC Flow Logs进行流量异常检测。对于大型企业,应建立安全组基线标准并通过IaC工具统一管理。
7.3 漏洞扫描
7.3.1 OpenVAS
OpenVAS 高级使用与优化指南
一、精准扫描策略设计
目标分组策略
|
Bash # 按业务逻辑定义目标组(Web/DB/APP) gvm-cli --xml "<create_target> <name>Web Servers</name> <hosts>192.168.1.10-20,10.0.2.0/24</hosts> <exclude_hosts>192.168.1.15</exclude_hosts> </create_target>"
|
合规性模板应用
|
Bash # 加载GDPR合规扫描模板 gvm-cli --xml "<create_task> <name>GDPR Audit</name> <config id='6f0d169e-0e90-11ea-bb0e-9f0747a1e007'/> # GDPR专用配置 </create_task>"
|
增量扫描优化
|
Bash # 仅扫描新增端口(对比历史结果) openvasmd --optimize-scan-targets --target=<target-id>
|
二、自动化与集成
API驱动扫描(Python示例)
|
Python from gvm.protocols.gmp import Gmp from gvm.transforms import EtreeTransform
with Gmp(connection, transform=EtreeTransform()) as gmp: gmp.authenticate('admin', 'securePass123!') response = gmp.create_task( name="AutoNightScan", config_id="daba56c8-73ec-11df-a475-002264764cea", # Full scan模板 target_id="target-id", scanner_id="08b69003-5fc2-4037-a479-93b440211c73" # 分布式扫描器ID ) task_id = response.get('id') gmp.start_task(task_id)
|
CI/CD流水线集成
|
YAML # GitLab CI示例 vulnerability_scan: stage: test image: greenbone/openvas script: - gvm-cli --user automation --password $GVM_PASS --xml "<start_task task_id='task-id'/>" - gvm-cli --user automation --password $GVM_PASS --xml "<get_report report_id='report-id' format_id='a994b278-1f62-11e1-96ac-406186ea4fc5'/>" > scan_results.xml artifacts: paths: - scan_results.xml
|
三、深度结果分析技巧
风险矩阵可视化
|
Bash # 生成CSV格式风险分布 gvm-cli --xml "<get_report report_id='report-id' format_id='910200ca-dc05-11e1-954f-406186ea4fc5'/>" | awk -F',' '{print $3,$5}' | sort | uniq -c
|
误报标记流程
|
Bash # 标记误报漏洞 gvm-cli --xml "<modify_result result_id='result-id'> <notes>误报: 测试环境模拟流量</notes> <severity>0.0</severity> </modify_result>"
|
漏洞生命周期跟踪
|
Bash # 生成漏洞修复进度看板 gvm-cli --xml "<get_results severity='5.0-10.0' filter='status!fixed'/>" | jq '.results[] | {host:.host, nvt:.nvt.name, cve:.cve}' > pending_fixes.json
|
四、性能调优方案
分布式扫描架构
|
Plain Text graph LR A[中央GVM服务器] --> B[Scanner Zone1] A --> C[Scanner Zone2] B --> D[DMZ网络] C --> E[内部生产网]
|
资源限制配置
|
Bash # 调整扫描器资源分配 sudo gvm-config --set max_hosts=30 # 并行扫描主机数 sudo gvm-config --set max_checks=15 # 单主机并发检测数 sudo sysctl -w net.core.somaxconn=4096 # 系统级网络优化
|
数据库优化
|
SQL -- PostgreSQL性能调优 ALTER SYSTEM SET shared_buffers = '4GB'; ALTER SYSTEM SET work_mem = '128MB'; SELECT pg_reload_conf();
|
五、安全加固措施
RBAC权限控制
|
Bash # 创建只读审计角色 gvm-cli --xml "<create_user> <name>auditor</name> <password>AuditPass2023!</password> <role>Auditor</role> <!-- 限制为报告查看权限 --> </create_user>"
|
加密通信配置
|
Bash # 强制TLS 1.3 sudo gvm-manage-certs -a -T TLSv1.3 sudo systemctl restart gsad
|
漏洞库更新策略
|
Bash # 增量更新脚本 #!/bin/bash if sudo greenbone-nvt-sync; then sudo greenbone-feed-sync --type SCAP sudo greenbone-feed-sync --type CERT sudo systemctl restart openvas-scanner else echo "Feed更新失败!" | mail -s "OpenVAS告警" admin@example.com fi
|
六、典型故障处理
|
故障现象
|
诊断命令
|
解决方案
|
|
扫描任务长时间无进度
|
sudo openvasmd --status
|
检查扫描器进程/重启openvas-scanner服务
|
|
报告生成失败
|
df -h /var/lib/openvas/reports
|
清理旧报告/扩展存储空间
|
|
插件加载不全
|
ls -l /var/lib/openvas/plugins/
|
手动执行greenbone-nvt-sync
|
|
Web界面响应缓慢
|
top -p $(pgrep -f gsad)
|
优化PostgreSQL配置/增加内存
|
|
无法识别最新CVE漏洞
|
grep CVE-2023 /var/lib/openvas/plugins/*.nasl
|
确认feed同步时间
|
七、扩展应用场景
容器安全扫描
|
Bash # 扫描Docker守护进程 gvm-cli --xml "<create_target> <name>Docker Host</name> <hosts>docker-host-ip</hosts> <ssh_credential id='cred-id'/> <!-- SSH密钥认证 --> <port_range>T:2375</port_range> </create_target>"
|
云环境资产发现
|
Bash # 集成AWS EC2动态发现 #!/bin/bash aws ec2 describe-instances --query 'Reservations[].Instances[].PrivateIpAddress' | xargs -I{} gvm-cli --xml "<modify_target target_id='cloud-target'><hosts>{}</hosts></modify_target>"
|
工控设备专项检测
|
Bash # 加载MODBUS协议检测插件 gvm-cli --xml "<modify_config config_id='config-id'> <nvt_selection><family>Industrial</family></nvt_selection> </modify_config>"
|
通过以上进阶配置,可将OpenVAS扫描效率提升50%以上,关键数据捕获率提高30%。建议将扫描策略与漏洞管理系统(如DefectDojo)集成,并建立漏洞修复SLA机制。对于扫描结果,推荐使用以下优先级处理流程:
紧急(CVSS≥9.0)→ 高(7.0-8.9)→ 中(4.0-6.9)→ 低(≤3.9),同时结合业务上下文调整实际风险评级。
7.3.2 Lynis
以下是关于 Lynis 的详细介绍和使用指南,专为运维工程师设计:
Lynis 是什么?
Lynis 是一款开源的 **安全审计工具**,专为 Linux/Unix 系统设计,用于:
自动化安全扫描
系统合规性检查
漏洞检测
生成系统加固建议
生成审计报告
!Lynis 工作原理
Lynis 核心功能
|
功能
|
说明
|
|
安全扫描
|
检查系统配置、服务权限、内核参数等
|
|
合规审计
|
支持 CIS、HIPAA、PCI-DSS 等标准
|
|
漏洞检测
|
识别已知漏洞和错误配置
|
|
加固建议
|
提供修复建议和优先级标注
|
|
自定义测试
|
支持插件扩展和自定义检查项
|
|
报告生成
|
生成 HTML/PDF 报告,便于存档和分析
|
安装 Lynis
Linux 系统
|
Bash # Debian/Ubuntu sudo apt install lynis
# RHEL/CentOS sudo yum install lynis
# 或通过官方仓库(最新版) echo "deb https://packages.cisofy.com/community/lynis/deb/ stable main" | sudo tee /etc/apt/sources.list.d/cisofy-lynis.list sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key C80E383C3DE9F082 sudo apt update && sudo apt install lynis
|
macOS
基础使用命令
|
Bash # 完整系统扫描(需 root 权限) sudo lynis audit system
# 快速扫描(跳过耗时测试) sudo lynis audit system --quick
# 生成 HTML 报告 sudo lynis audit system --report-file /path/report.html
# 检查特定组件(如 SSH) sudo lynis audit system --tests-from-group ssh
# 自定义配置文件 sudo lynis audit system --profile /path/custom.prf
|
输出示例解析
|
Plain Text [+] Boot and services - Service Manager [ systemd ] - Checking UEFI boot [ DISABLED ] - Checking presence GRUB2 [ FOUND ]
[!] Security suggestions - Configure password aging for user 'root' [ SECTION:AUTH-9284 ] - Harden compilers [ SECTION:HRDN-7230 ] - Restrict core dumps [ SECTION:KRNL-6000 ]
================================================================== Lynis 3.0.6
Report saved to : /var/log/lynis.log Report data saved to : /var/log/lynis-report.dat Plugins enabled : 5 Tests performed : 283 Hardening index : 64 [## ] Warnings/Exceptions : 3 Scan time : 188 seconds ==================================================================
|
关键操作指南
优先级处理建议
红色警告([!]):立即修复(如开放端口、弱密码策略)
黄色警告([*]):建议优化(如日志轮转配置)
绿色通过([+]):安全配置(如防火墙启用)
2. 自定义检查项
编辑 /etc/lynis/default.prf 配置文件:
|
TOML # 跳过 Docker 相关检查 skip-test=CONTAINER-0010,CONTAINER-0020
# 添加自定义测试 plugin=custom_audit.sh
|
3. 自动化集成
|
Bash # 每日定时扫描(写入 syslog) sudo lynis audit system --cronjob > /dev/null 2>&1
# 与 Ansible 集成 - name: Run Lynis audit shell: "lynis audit system --no-colors --quiet" register: lynis_output
- name: Fail if warnings found fail: msg: "Lynis found security issues!" when: "'Warnings' in lynis_output.stdout"
|
典型应用场景
新服务器上线前:验证基线安全配置
合规审计前:预检 PCI-DSS/CIS 要求
漏洞修复后:验证补丁有效性
容器镜像构建:扫描 Dockerfile 基础镜像
进阶技巧
报告分析:使用 lynis-report 工具解析 .dat 文件
企业版功能:中央管理、API 集成(需订阅)
插件开发:通过 Shell/Python 扩展检测规则
资源推荐
官方文档:https://cisofy.com/documentation/lynis/
GitHub 仓库:https://github.com/CISOfy/lynis
加固指南:CIS Benchmarks
如果需要将 Lynis 集成到您的运维流水线中,可进一步讨论具体实施方案!
文件系统安全
SELinux 配置
文件权限检查
8. 实战与工具
8.1 常用工具
8.1.1 Vim 编辑器
以下是为Vim编辑器整理的使用技巧与配置优化指南,帮助您提升编辑效率并打造个性化开发环境:
Vim 使用技巧与配置优化思维导图
一、Vim 核心使用技巧
模式切换与基础操作
模式切换:
i(插入模式)、Esc(返回普通模式)
v(可视模式)、V(行可视模式)、Ctrl+v(块可视模式)
保存与退出:
:w(保存)、:q(退出)、:wq(保存并退出)、:q!(强制退出)
高效移动与编辑
光标移动:
h/j/k/l(左/下/上/右)
0(行首)、$(行尾)、gg(文件头)、G(文件尾)
Ctrl+d/u(半页下/上翻)
文本操作:
dd(删除行)、yy(复制行)、p(粘贴)
ci"(修改引号内内容)、di((删除括号内内容)
>>(缩进)、<<(取消缩进)
搜索与替换
/keyword(正向搜索)、?keyword(反向搜索)
:%s/old/new/g(全局替换)、:s/old/new/gc(确认替换)
*(高亮当前单词)
多文件与分屏操作
:e filename(打开新文件)
:sp(水平分屏)、:vsp(垂直分屏)
Ctrl+w + 方向键(切换分屏)
进阶技巧
宏录制:q<字母>开始录制,q结束,@<字母>回放
标记跳转:m<字母>设置标记,'<字母>跳转
命令模式:!调用Shell命令(如:!ls)
二、Vim 配置优化(.vimrc)
|
Plain Text " 基础配置 set nocompatible " 禁用兼容模式 syntax on " 语法高亮 set number " 显示行号 set relativenumber " 相对行号(更高效跳转) set tabstop=4 " Tab宽度 set shiftwidth=4 " 自动缩进宽度 set expandtab " Tab转空格 set autoindent " 自动缩进 set cursorline " 高亮当前行 set ignorecase " 搜索忽略大小写 set smartcase " 搜索包含大写时区分大小写 set hlsearch " 高亮搜索结果 set incsearch " 实时搜索 set mouse=a " 启用鼠标支持
" 快捷键映射 nnoremap <C-s> :w<CR> " Ctrl+S保存 inoremap jk <Esc> " 用jk快速退出插入模式 nnoremap <leader>q :q<CR> " 自定义退出键
" 插件管理(使用vim-plug) call plug#begin('~/.vim/plugged') Plug 'preservim/nerdtree' " 文件树 Plug 'ycm-core/YouCompleteMe' " 代码补全 Plug 'vim-airline/vim-airline' " 状态栏美化 Plug 'tpope/vim-fugitive' " Git集成 Plug 'scrooloose/syntastic' " 语法检查 call plug#end()
" 插件配置 let g:airline_powerline_fonts = 1 " 启用Powerline字体 let NERDTreeShowHidden=1 " 显示隐藏文件
|
三、高效插件推荐
文件管理:
NERDTree:侧边栏文件树
fzf.vim:模糊搜索文件
代码开发:
YouCompleteMe:智能代码补全
vim-gitgutter:Git差异标记
vim-commentary:快速注释代码
界面美化:
vim-airline:状态栏增强
onedark.vim:暗色主题
工具集成:
vim-fugitive:Git操作集成
vim-markdown:Markdown语法支持
四、性能优化技巧
减少插件加载:
按需加载插件(如Plug 'plugin', { 'on': 'Command' })
使用轻量级替代(如用coc.nvim替代YouCompleteMe)
禁用冗余功能:
set nobackup(关闭备份文件)
set noswapfile(关闭交换文件)
异步处理:
使用异步插件(如vim-dispatch执行后台任务)
五、调试与维护
查看配置错误:
vim --startuptime log.txt(记录启动时间)
:scriptnames(查看已加载脚本)
快捷键冲突排查:
:verbose map <key>(查看按键映射来源)
插件管理命令:
:PlugInstall(安装插件)
:PlugClean(清理未用插件)
学习资源
官方文档::help user-manual
交互教程:vimtutor(终端输入)
书籍推荐:《Practical Vim》(中文版《Vim实用技巧》)
社区:Reddit的r/vim、GitHub Vim仓库
通过结合快捷键技巧与个性化配置,Vim可成为高效的开发利器。建议从基础操作开始练习,逐步添加插件,最终形成适合自己工作流的配置!
8.1.2 xshell
以下是为Xshell整理的使用技巧与配置优化指南,帮助您高效管理远程服务器会话并提升操作安全性:
Xshell 学习思维导图
一、基础配置与连接管理
会话创建与保存
新建会话:文件 > 新建,输入主机IP/端口(默认22)
协议选择:SSH(加密)、Telnet(明文,不推荐生产环境)
认证方式:
密码登录:直接输入账号密码
密钥登录:导入或生成SSH密钥对(推荐安全性更高)
会话保存:设置名称并保存为.xsh文件,支持分类文件夹管理
多会话管理
标签页操作:
Ctrl+Tab 切换标签页
右键标签页可克隆会话或发送输入到所有会话
会话分组:
创建文件夹分类(如按项目/环境:生产、测试)
批量启动组内会话:右键文件夹选择打开所有会话
快速连接栏
启用:查看 > 快速连接栏
输入user@host:port格式快速发起连接(支持历史记录)
二、安全增强配置
SSH密钥认证
生成密钥:工具 > 用户密钥生成向导(支持RSA/Ed25519)
部署公钥:将生成的.pub文件内容追加到服务器的~/.ssh/authorized_keys
密钥保护:为私钥设置密码(防止私钥泄露导致风险)
二次验证(2FA)
结合Google Authenticator或Authy:
在服务器配置SSH的2FA(如libpam-google-authenticator)
Xshell登录时输入密码+动态验证码
会话日志审计
启用日志记录:文件 > 属性 > 日志记录
选择记录格式(纯文本/HTML)及存储路径
三、效率优化技巧
自定义快捷键
配置路径:工具 > 选项 > 键盘和鼠标
常用操作绑定:
Ctrl+Shift+C/V:复制/粘贴(避免与系统快捷键冲突)
Alt+数字键:快速切换标签页
脚本自动化
脚本录制:工具 > 脚本 > 开始录制
回放操作:将录制的.vbs脚本用于批量服务器部署
示例脚本(修改主机列表并执行命令):
|
VBScript For Each host In Array("192.168.1.10", "192.168.1.11") xsh.Session.Connect host xsh.Screen.Send "uptime" & vbCr Next
|
与Xftp集成
快速传输文件:会话中按Ctrl+Alt+F启动关联的Xftp
拖拽上传:直接拖动本地文件到Xshell窗口
同步浏览:Xftp与Xshell目录自动同步跳转
四、界面与显示优化
主题与字体
修改配色方案:工具 > 选项 > 外观 > 配色方案
推荐护眼方案:Solarized Dark、Gruvbox
字体调优:选择等宽字体(如Fira Code、Cascadia Mono)并启用抗锯齿
终端仿真优化
调整缓冲区:文件 > 属性 > 终端 > 缓冲区大小(建议5000行)
启用真彩色:文件 > 属性 > 终端 > 高级 > 使用TrueColor
分屏与布局
垂直/水平分屏:窗口 > 垂直分割 或 水平分割
同步输入:窗口 > 发送输入到所有会话(批量执行命令)
五、高级功能应用
端口转发
本地转发:将远程端口映射到本地
配置路径:文件 > 属性 > SSH > 隧道 > 添加
示例:L:127.0.0.1:8080 -> 远程主机:80
动态转发:创建SOCKS代理(类似SSH -D)
会话共享
协作模式:文件 > 属性 > 共享会话,生成邀请链接
限制:仅企业版支持多人实时协同操作
警报规则
设置关键词触发通知:工具 > 选项 > 高级 > 警报规则
示例:监控日志中的ERROR关键字并弹窗提醒
六、故障排查
连接失败常见原因
网络问题:检查IP/端口是否可达(telnet host port)
密钥权限:确保服务器~/.ssh目录权限为700,authorized_keys为600
服务状态:确认服务器SSH服务运行(systemctl status sshd)
日志分析
查看Xshell连接日志:文件 > 属性 > 日志记录指定路径
服务器SSH日志:/var/log/auth.log(Ubuntu)或/var/log/secure(CentOS)
推荐配置模板
|
TOML # ~/.ssh/config 服务器快捷别名(配合Xshell使用) Host prod-web HostName 192.168.1.100 User root Port 2222 IdentityFile ~/.ssh/id_ed25519_prod
|
学习资源
官方文档:NetSarang Xshell手册
安全指南:SSH hardening最佳实践(禁用root登录、修改默认端口)
社区:Stack Overflow的xshell标签、Reddit的r/sysadmin
通过合理配置Xshell,您可大幅提升远程管理的效率与安全性。建议从会话模板和快捷键优化入手,逐步探索脚本自动化与高级网络功能!
8.1.3 rsync(文件同步
8.2 实战场景
8.2.1 服务器初始化配置
以下是为Linux服务器初始配置整理的标准化流程,涵盖安全加固、性能调优和基础服务部署,适用于CentOS/Ubuntu等主流系统:
服务器初始化配置标准化流程
1. 系统更新与时区配置
|
Bash # 更新系统(根据发行版选择命令) sudo apt update && sudo apt upgrade -y # Debian/Ubuntu sudo yum update -y && sudo yum upgrade -y # CentOS/RHEL
# 安装基础工具包 sudo apt install -y curl wget vim tmux htop net-tools # Ubuntu sudo yum install -y epel-release && sudo yum install curl wget vim tmux htop net-tools # CentOS
# 设置时区与时间同步 sudo timedatectl set-timezone Asia/Shanghai sudo systemctl enable chronyd && sudo systemctl start chronyd # CentOS sudo systemctl enable systemd-timesyncd && sudo systemctl start systemd-timesyncd # Ubuntu
|
2. 安全加固
|
Bash # 创建管理用户并禁用root登录 sudo useradd -m -s /bin/bash admin sudo passwd admin sudo usermod -aG sudo admin # Ubuntu sudo usermod -aG wheel admin # CentOS
# SSH安全配置(编辑/etc/ssh/sshd_config) sudo vim /etc/ssh/sshd_config --- Port 2022 # 修改默认SSH端口 PermitRootLogin no # 禁止root登录 PasswordAuthentication no # 关闭密码认证 PubkeyAuthentication yes # 启用密钥登录 MaxAuthTries 3 # 限制认证尝试次数 ClientAliveInterval 300 # 超时断开无活动连接 ---
# 部署SSH密钥(本地执行,将公钥上传) ssh-copy-id -i ~/.ssh/id_rsa.pub -p 2022 admin@服务器IP
# 重启SSH服务 sudo systemctl restart sshd
# 配置防火墙(示例:Ubuntu使用ufw,CentOS使用firewalld) sudo ufw allow 2022/tcp # Ubuntu sudo ufw enable
sudo firewall-cmd --permanent --add-port=2022/tcp # CentOS sudo firewall-cmd --reload
|
3. 内核参数调优
|
Bash # 编辑sysctl.conf(网络与文件系统优化) sudo vim /etc/sysctl.conf --- net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 net.ipv4.tcp_tw_reuse = 1 fs.file-max = 2097152 vm.swappiness = 10 # 减少交换分区使用 ---
# 应用配置 sudo sysctl -p
# 修改文件句柄限制 echo "* soft nofile 65535" | sudo tee -a /etc/security/limits.conf echo "* hard nofile 65535" | sudo tee -a /etc/security/limits.conf
|
4. 存储与日志管理
|
Bash # 磁盘分区与挂载(以数据盘/dev/sdb为例) sudo parted /dev/sdb mklabel gpt sudo parted /dev/sdb mkpart primary ext4 0% 100% sudo mkfs.ext4 /dev/sdb1 sudo mkdir /data echo "/dev/sdb1 /data ext4 defaults,noatime 0 0" | sudo tee -a /etc/fstab sudo mount -a
# 配置日志轮转(示例:Nginx日志) sudo vim /etc/logrotate.d/nginx --- /var/log/nginx/*.log { daily missingok rotate 30 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate systemctl reload nginx endscript } ---
|
5. 基础服务部署
|
Bash # 安装Docker(生产环境推荐) curl -fsSL https://get.docker.com | sudo sh sudo systemctl enable docker && sudo systemctl start docker
# 配置Docker镜像加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"], "log-driver": "json-file", "log-opts": {"max-size": "100m", "max-file": "3"} } EOF sudo systemctl daemon-reload sudo systemctl restart docker
# 安装监控组件(Prometheus Node Exporter) docker run -d --name node_exporter \ --net="host" --pid="host" \ -v "/:/host:ro,rslave" \ quay.io/prometheus/node-exporter:latest \ --path.rootfs=/host
|
6. 自动化验证脚本
|
Bash #!/bin/bash # 检查关键配置 echo "===== SSH配置验证 =====" sshd -T | grep -E "port|permitrootlogin|passwordauthentication"
echo "===== 防火墙状态 =====" sudo ufw status verbose # 或 firewall-cmd --list-all
echo "===== 内核参数验证 =====" sysctl net.core.somaxconn net.ipv4.tcp_tw_reuse
echo "===== 磁盘挂载检查 =====" df -h | grep /data
echo "===== Docker服务状态 =====" docker ps --format "table {{.Names}}\t{{.Status}}"
|
配置后推荐操作
安全扫描
|
Bash # 使用Lynis进行安全审计 sudo apt install lynis -y # Ubuntu sudo yum install lynis -y # CentOS sudo lynis audit system
|
备份策略
使用crontab配置每日自动备份关键数据到远程存储
示例备份命令:
|
Bash tar -zcvf /backup/$(date +%F).tar.gz /etc /var/log rsync -avz /backup/ backupuser@backup-server:/backups/
|
监控告警
部署Prometheus + Grafana监控平台
配置CPU/内存/磁盘阈值告警
初始化脚本模板
多发行版支持:自动识别CentOS/Ubuntu系统
安全加固:SSH端口修改/密钥登录/防火墙配置
性能调优:内核参数/文件句柄数优化
存储管理:自动初始化数据盘
监控集成:自动部署Node Exporter
错误防御:关键操作前检查条件
|
bash #!/bin/bash # Auto Server Init Script v2.0 # 警告:运行前必须修改下方[必须修改]部分的配置! # 建议在全新系统上执行,执行后服务器将重启
# -------------------------- # 用户配置区 [必须修改] # -------------------------- SSH_PORT="3022" # 新SSH端口(不要用22) ADMIN_USER="opsadmin" # 新建管理员账户 TIMEZONE="Asia/Shanghai" # 时区设置 DATA_DISK="/dev/sdb1" # 数据盘设备名 DATA_MOUNT="/data" # 数据盘挂载点 PUB_KEY="ssh-rsa AAAAB3NzaC1yc..." # 管理员公钥
# -------------------------- # 颜色输出函数 # -------------------------- RED='\033[31m' GREEN='\033[32m' YELLOW='\033[33m' BLUE='\033[34m' RESET='\033[0m'
color_echo() { echo -e "${1}${2}${RESET}" }
# -------------------------- # 预检检查 # -------------------------- if [ "$(id -u)" != "0" ]; then color_echo $RED "错误:必须使用root权限运行此脚本" exit 1 fi
# 确认数据盘是否存在 if [ ! -b "$DATA_DISK" ]; then color_echo $YELLOW "警告:未找到数据盘 $DATA_DISK,跳过磁盘初始化" INIT_DISK=false else INIT_DISK=true fi
# -------------------------- # 系统初始化 # -------------------------- color_echo $BLUE "[1/6] 系统更新与基础工具安装..."
# 识别发行版 if grep -Eqi "CentOS|Red Hat" /etc/redhat-release; then DISTRO="centos" PKG_MGR="yum" SERVICES=("chronyd" "firewalld") elif grep -Eqi "Ubuntu|Debian" /etc/os-release; then DISTRO="ubuntu" PKG_MGR="apt" SERVICES=("systemd-timesyncd" "ufw") else color_echo $RED "不支持的Linux发行版" exit 1 fi
# 更新系统 $PKG_MGR update -y $PKG_MGR upgrade -y $PKG_MGR install -y curl wget vim tmux htop net-tools git
# 设置时区 timedatectl set-timezone $TIMEZONE
# -------------------------- # 安全加固 # -------------------------- color_echo $BLUE "[2/6] 安全配置..."
# 创建管理员用户 useradd -m -s /bin/bash $ADMIN_USER usermod -aG ${DISTRO/centos/wheel} $ADMIN_USER # CentOS用wheel组
# 配置SSH密钥 mkdir -p /home/$ADMIN_USER/.ssh echo $PUB_KEY > /home/$ADMIN_USER/.ssh/authorized_keys chmod 700 /home/$ADMIN_USER/.ssh chmod 600 /home/$ADMIN_USER/.ssh/authorized_keys chown -R $ADMIN_USER:$ADMIN_USER /home/$ADMIN_USER/.ssh
# 修改SSH配置 sed -i "s/#Port 22/Port $SSH_PORT/" /etc/ssh/sshd_config sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config echo "AllowUsers $ADMIN_USER" >> /etc/ssh/sshd_config
# 防火墙配置 case $DISTRO in "centos") systemctl enable firewalld --now firewall-cmd --permanent --add-port=$SSH_PORT/tcp firewall-cmd --reload ;; "ubuntu") ufw allow $SSH_PORT/tcp echo "y" | ufw enable ;; esac
# -------------------------- # 内核优化 # -------------------------- color_echo $BLUE "[3/6] 内核参数调优..."
cat > /etc/sysctl.d/99-optimize.conf <<EOF net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 net.ipv4.tcp_tw_reuse = 1 fs.file-max = 2097152 vm.swappiness = 10 EOF
sysctl -p /etc/sysctl.d/99-optimize.conf
# 文件句柄限制 echo "* soft nofile 65535" >> /etc/security/limits.conf echo "* hard nofile 65535" >> /etc/security/limits.conf
# -------------------------- # 存储配置 # -------------------------- if $INIT_DISK; then color_echo $BLUE "[4/6] 数据盘初始化..." # 检查是否已格式化 if ! blkid $DATA_DISK &> /dev/null; then parted -s $DATA_DISK mklabel gpt parted -s $DATA_DISK mkpart primary ext4 0% 100% mkfs.ext4 ${DATA_DISK}1 -L DATA_DISK fi
mkdir -p $DATA_MOUNT echo "LABEL=DATA_DISK $DATA_MOUNT ext4 defaults,noatime 0 0" >> /etc/fstab mount -a fi
# -------------------------- # 服务部署 # -------------------------- color_echo $BLUE "[5/6] 基础服务安装..."
# Docker安装 curl -fsSL https://get.docker.com | sh systemctl enable docker --now
# Docker配置 mkdir -p /etc/docker cat > /etc/docker/daemon.json <<EOF { "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"], "log-driver": "json-file", "log-opts": {"max-size": "100m", "max-file": "3"} } EOF systemctl restart docker
# 监控组件(可选) docker run -d --name node_exporter \ --net=host --pid=host \ -v "/:/host:ro,rslave" \ quay.io/prometheus/node-exporter:latest \ --path.rootfs=/host
# -------------------------- # 收尾工作 # -------------------------- color_echo $BLUE "[6/6] 清理与重启..."
# 启用必要服务 for service in "${SERVICES[@]}"; do systemctl enable $service --now done
# 重启SSH服务 systemctl restart sshd
color_echo $GREEN "初始化完成!即将重启系统..." color_echo $YELLOW "请使用以下命令连接:" echo "ssh -p $SSH_PORT $ADMIN_USER@服务器IP"
reboot
|
通过此流程,可在30分钟内完成生产级服务器的标准化初始化,建议根据业务需求调整Docker组件和监控方案。关键点:**最小权限原则** + 审计追踪 + **自动化运维**。
8.2.2 故障排查与修复
以下是为运维工程师整理的故障排查与修复系统化指南,涵盖常见故障场景、诊断工具和修复流程,帮助快速定位并解决问题:
故障排查与修复思维框架
一、故障分类与优先级判断
故障类型识别
网络问题:连接超时、丢包、DNS解析失败
系统问题:CPU/内存爆满、磁盘空间不足、内核崩溃
应用问题:服务崩溃、日志报错、性能下降
存储问题:IO延迟高、文件系统损坏、RAID故障
硬件问题:硬盘坏道、内存故障、电源异常
优先级评估
P0级:核心业务不可用(如支付系统宕机)
P1级:部分功能受损(如图片上传失败)
P2级:性能降级(如API响应变慢)
二、标准化排查流程
|
Plain Text graph TD A[接收告警] --> B{是否已知故障?} B -->|是| C[执行应急预案] B -->|否| D[现象确认与影响面评估] D --> E[数据收集] E --> F[根因定位] F --> G[制定修复方案] G --> H[方案测试与实施] H --> I[验证与监控] I --> J[复盘与改进]
|

三、核心排查工具集
网络诊断
ping/traceroute:基础连通性检查
mtr:持续追踪路由质量
tcpdump/Wireshark:抓包分析(示例:tcpdump -i eth0 port 80 -w capture.pcap)
netstat/ss:查看连接状态(ss -tunap显示所有TCP/UDP连接)
系统资源监控
top/htop:实时进程监控
vmstat 1:查看内存/CPU/IO综合指标
iostat -x 1:磁盘IO详细统计
dmesg -T:检查内核日志
应用层分析
journalctl -u nginx --since "10 minutes ago":查看服务日志
strace -p <PID>:追踪进程系统调用
jstack(Java)/gdb(C++):线程堆栈分析
高级诊断
perf:系统性能分析(perf record -g -p <PID>捕获性能数据)
ebpf工具链(如bpftrace):内核级动态追踪
四、经典故障场景与修复方案
场景1:数据库连接池耗尽
现象:应用日志出现Too many connections
排查步骤:
show processlist; 查看MySQL活跃连接
netstat -ant | grep :3306 | wc -l 统计实际连接数
检查连接池配置(如HikariCP的maximumPoolSize)
修复方案:
临时:kill <ID>终止异常查询
长期:优化SQL+调整连接池参数+增加监控
场景2:磁盘空间不足导致服务崩溃
现象:No space left on device
排查步骤:
df -h 定位满盘分区
du -sh /* | sort -rh 查找大文件
lsof +L1 查看未释放的已删除文件
修复方案:
临时:清理日志/临时文件
长期:配置日志轮转+监控磁盘使用率
场景3:Kubernetes节点NotReady
现象:kubectl get nodes显示节点状态异常
排查步骤:
kubectl describe node <node> 查看事件
SSH登录节点检查kubelet状态:systemctl status kubelet
检查容器运行时:docker info 或 crictl ps
修复方案:
重启kubelet:systemctl restart kubelet
驱逐Pod:kubectl drain <node> --ignore-daemonsets
五、修复流程规范
临时修复(Quick Fix)
重启服务/扩容/限流
需明确标注技术债务(如JIRA创建TODO任务)
根本解决(Root Cause Fix)
代码BUG修复(需经过Code Review)
架构优化(如引入缓存、拆分微服务)
变更管理
使用Ansible/Terraform记录基础设施变更
遵循灰度发布流程(如先1%流量验证)
六、故障复盘模板
|
Markdown ## 故障复盘报告
1. 故障概述 - 时间:2023-10-01 14:00 - 16:30 - 影响:订单支付失败率上升至30% - 等级:P0
2. 时间线 - 14:05 监控触发支付接口500告警 - 14:20 确认数据库主从同步延迟 - 15:10 启用备库并切换流量
3. 根因分析 - 直接原因:从库I/O线程阻塞导致同步延迟超过10分钟 - 深层原因:未配置延迟监控+主库大事务未拆分
4. 改进措施 - [ ] 增加MySQL延迟监控(Prometheus+Alertmanager) - [ ] 优化订单分页查询(避免全表扫描) - [ ] 制定大事务审批流程
|
附:故障排查工具箱推荐
日志分析:ELK Stack(Elasticsearch+Logstash+Kibana)
监控告警:Prometheus+Grafana+Alertmanager
APM工具:New Relic、SkyWalking
自动化修复:Rundeck、Ansible Tower
通过系统化的排查流程和工具链组合,可将平均故障恢复时间(MTTR)降低50%以上。关键原则:**先恢复业务,再定位根因**,同时建立完善的监控防御体系预防同类故障。
8.2.3 性能优化(CPU、内存、磁盘 I/O)
以下是为运维工程师整理的服务器性能优化系统化指南,涵盖CPU、内存、磁盘I/O三大核心资源场景,包含诊断工具、优化策略和配置示例:
服务器性能优化指南
一、CPU 性能优化
1. 诊断工具与指标
|
Bash top # 实时进程CPU占用(按P排序) vmstat 1 # 查看上下文切换(cs)和中断(in) pidstat -u 1 # 进程级CPU使用率 perf top # 函数级CPU热点分析 mpstat -P ALL 1 # 多核CPU利用率分布
|
2. 常见问题与优化方案
问题1:用户态CPU过高
排查:perf record -g -p <PID> 生成火焰图
解决:
优化代码逻辑(如减少循环次数)
升级算法复杂度(O(n²) → O(n))
启用JIT编译(Python启用PyPy)
问题2:系统态CPU过高
排查:strace -c -p <PID> 统计系统调用
解决:
减少频繁小文件IO(合并写入)
调整网络参数(增大socket缓冲区)
升级内核(优化系统调用路径)
问题3:CPU软中断不均
排查:cat /proc/softirqs
解决:
|
Bash # 启用RPS(多队列网卡) echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus # 调整IRQ亲和性 echo 0-3 > /proc/irq/24/smp_affinity_list
|
二、内存优化
1. 诊断工具与指标
|
Bash free -m # 物理内存与Swap使用 smem -s swap -t # 进程实际内存占用(RSS/PSS) cat /proc/meminfo # 详细内存分配统计 valgrind --tool=memcheck ./app # 内存泄漏检测
|
2. 常见问题与优化方案
问题1:物理内存耗尽触发OOM
排查:dmesg | grep -i oom
解决:
限制进程内存:docker run -m 4g ...
调整vm.overcommit策略:
|
Bash sysctl vm.overcommit_memory=2 sysctl vm.overcommit_ratio=80
|
问题2:Swap使用过高
排查:sar -W 1 查看页面交换频率
解决:
|
Bash # 降低swappiness sysctl vm.swappiness=10 # 禁用Swap(紧急情况) swapoff -a && swapon -a
|
问题3:内存泄漏
排查:
Java:jmap -histo:live <PID>
Go:pprof http://localhost:6060/debug/pprof/heap
解决:修复代码中的未释放资源
三、磁盘I/O优化
1. 诊断工具与指标
|
Bash iostat -x 1 # 查看%util和await iotop # 实时进程IO排名 blktrace /dev/sda # 块设备级追踪 fio --name=test --rw=randread --bs=4k --direct=1 --ioengine=libaio # 压力测试
|
2. 常见问题与优化方案
问题1:高IO延迟(await > 10ms)
排查:iostat -x 确认是读/写瓶颈
解决:
升级SSD替换HDD
调整调度策略:
|
Bash echo deadline > /sys/block/sda/queue/scheduler # 或使用多队列mq-deadline
|
启用DirectIO绕过缓存(适用于大文件)
问题2:文件系统性能下降
排查:tune2fs -l /dev/sda1 查看ext4挂载参数
解决:
|
Bash # 优化ext4挂载选项 mount -o noatime,nodelalloc,data=writeback /dev/sda1 /data # 定期检查文件系统 fsck -f /dev/sda1
|
问题3:RAID卡缓存策略不当
排查:MegaCli -LDInfo -Lall -aAll
解决:
启用WriteBack模式(需UPS保护)
调整RAID条带大小(如256KB)
四、综合调优案例
场景:MySQL数据库性能优化
|
Bash # 内存优化 innodb_buffer_pool_size = 物理内存的70% innodb_log_file_size = 2GB
# 磁盘IO优化 innodb_flush_method = O_DIRECT innodb_io_capacity = 2000(SSD环境)
# CPU优化 innodb_read_io_threads = 16 innodb_write_io_threads = 16
|
场景:Nginx Web服务器优化
|
Nginx # 文件描述符与连接优化 worker_rlimit_nofile 65535; events { worker_connections 4096; use epoll; }
# 静态文件缓存优化 open_file_cache max=10000 inactive=30s; sendfile on; tcp_nopush on;
|
五、进阶优化技术
NUMA架构优化
|
Bash numactl --cpunodebind=0 --membind=0 ./program # 绑定CPU和内存节点
|
透明大页(THP)调整
|
Bash echo never > /sys/kernel/mm/transparent_hugepage/enabled
|
CGroup资源限制
|
Bash # 限制CPU和内存 cgcreate -g cpu,memory:/app_group cgset -r cpu.cfs_quota_us=50000 app_group # 限制50% CPU cgset -r memory.limit_in_bytes=4G app_group
|
六、自动化与持续监控
Prometheus监控模板
|
YAML # CPU关键指标 - alert: HighCPULoad expr: (1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100 > 80
# 内存告警规则 - alert: OutOfMemory expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 10
|
Grafana看板配置
CPU使用率(按核心拆分)
内存趋势(物理内存 + Swap)
磁盘IOPS与吞吐量
优化效果验证工具
|
Bash # 压测工具 ab -n 10000 -c 100 http://localhost/ wrk -t4 -c100 -d30s --latency http://localhost/
# 性能对比报告 sar -A -o /tmp/perf.log # 记录全量指标
|
通过以上系统级优化策略,典型场景性能提升可达30%-300%。建议每次只调整一个参数并记录基准测试结果,逐步构建适合业务负载的最佳配置。
8.3 云环境运维
8.3.1 AWS EC2, Azure VM
8.3.2 云存储与网络配置
9. 学习资源
书籍
《鸟哥的 Linux 私房菜》
《Linux 命令行与 Shell 脚本编程大全》
在线课程
Coursera, Udemy, 实验楼
社区与论坛
Linux 中国
Stack Overflow
Reddit Linux 社区
通过以上思维导图,运维工程师可以系统学习 Linux 的核心知识和技能,并在实际工作中应用。如果需要更详细的解释或资源推荐,可以随时告诉我!