[Linux服务器] Linux运维与开发学习笔记

127 0
Honkers 2026-7-13 13:25:11 | 显示全部楼层 |阅读模式

Linux 运维与开发学习笔记(从入门到精通)

本笔记从零基础出发,覆盖 Linux 系统管理、Shell 脚本、网络管理、服务部署、性能调优、自动化运维,适合长期参考的自学笔记。



第一部分:系统入门

1.1 Linux 简介

🎯 生活类比:如果 Windows 是"傻瓜相机"(图形界面,简单易用),那 Linux 就是"单反相机"(命令行,功能强大,需要学习)。


1.1.1 Linux 是什么

  1. Linux 是什么?
  2. - 一个开源的类 Unix 操作系统内核
  3. - 由 Linus Torvalds 在 1991 年开发
  4. - 基于 GNU 通用公共许可证(GPL)
  5. - 全球最流行的服务器操作系统
  6. Linux 的特点:
  7. 1. 开源免费:源代码公开,任何人都可以使用和修改
  8. 2. 稳定可靠:服务器可以连续运行数年不重启
  9. 3. 安全性高:权限管理严格,病毒极少
  10. 4. 多用户多任务:支持多个用户同时登录
  11. 5. 一切皆文件:硬件、进程、网络都用文件表示
  12. Linux 的应用场景:
  13. - 服务器:90% 以上的服务器运行 Linux
  14. - 嵌入式:路由器、智能家居、车载系统
  15. - 超级计算机:全球 Top 500 超算全部运行 Linux
  16. - 开发环境:程序员的首选开发环境
  17. - Android:基于 Linux 内核
复制代码

1.1.2 Linux 发行版

  1. 什么是发行版?
  2. - Linux 内核 + 各种软件 + 包管理器 = 发行版
  3. - 不同发行版适合不同场景
  4. 主流发行版:
  5. Red Hat 家族:
  6. - RHEL(Red Hat Enterprise Linux):企业版,收费,有技术支持
  7. - CentOS:免费版 RHEL(已停止维护)
  8. - CentOS Stream:CentOS 的替代品,滚动更新
  9. - Rocky Linux:CentOS 的社区替代品
  10. - Fedora:新技术试验田
  11. Debian 家族:
  12. - Debian:最稳定的发行版,适合服务器
  13. - Ubuntu:最流行的桌面发行版,也适合服务器
  14. - Linux Mint:基于 Ubuntu,更易用
  15. 其他:
  16. - Arch Linux:滚动更新,适合高级用户
  17. - Alpine:超轻量,适合容器
  18. - SUSE:欧洲流行的商业发行版
  19. 如何选择?
  20. - 学习/开发:Ubuntu(资料多、社区活跃)
  21. - 生产服务器:CentOS Stream / Rocky Linux / Ubuntu Server
  22. - 容器:Alpine(镜像小)
  23. - 企业:RHEL(有技术支持)
复制代码

1.1.3 Linux vs Windows

对比项LinuxWindows
界面命令行为主,图形界面可选图形界面为主
开源开源免费闭源收费
安全性高(权限管理严格)一般(病毒较多)
稳定性高(服务器可运行数年)一般(需要重启)
软件包管理器安装安装包安装
适用场景服务器、开发桌面、办公
学习曲线较陡较平缓

1.1 本节小结

知识点核心要点
Linux开源、稳定、安全、多用户
发行版Ubuntu(入门)、CentOS/Rocky(服务器)
应用场景服务器、嵌入式、开发环境

1.2 系统安装

🎯 生活类比:安装 Linux 就像"搭积木"——先搭好底座(虚拟机),再放上积木(操作系统)。


1.2.1 虚拟机安装

  1. 什么是虚拟机?
  2. - 在一台电脑上模拟出多台"虚拟电脑"
  3. - 每台虚拟电脑可以运行不同的操作系统
  4. - 适合学习和测试
  5. 常用虚拟机软件:
  6. - VMware Workstation(推荐,功能强大)
  7. - VirtualBox(免费,轻量)
  8. - Hyper-V(Windows 自带)
  9. 安装步骤:
  10. 1. 下载 VMware:https://www.vmware.com/
  11. 2. 下载 Linux 镜像:https://mirrors.aliyun.com/centos/
  12. 3. 创建虚拟机:
  13. - 选择"典型"安装
  14. - 选择 Linux 镜像
  15. - 设置虚拟机名称和位置
  16. - 设置磁盘大小(建议 20GB 以上)
  17. - 设置内存(建议 2GB 以上)
  18. 4. 启动虚拟机,按照向导安装
复制代码

1.2.2 最小化安装

  1. 最小化安装 vs 图形界面安装:
  2. 最小化安装:
  3. - 只安装最基本的系统
  4. - 没有图形界面
  5. - 占用资源少(约 1GB 磁盘,256MB 内存)
  6. - 适合服务器(推荐)
  7. 图形界面安装:
  8. - 安装 GNOME 或 KDE 桌面
  9. - 有图形界面
  10. - 占用资源多(约 5GB 磁盘,1GB 内存)
  11. - 适合桌面使用
  12. 服务器推荐最小化安装:
  13. - 减少攻击面
  14. - 节省资源
  15. - 更稳定
复制代码

1.2.3 远程连接

  1. # 远程连接工具
  2. # Windows:Xshell、PuTTY、Windows Terminal
  3. # Mac:Terminal、iTerm2
  4. # 使用 SSH 连接
  5. ssh root@192.168.1.100
  6. # 输入密码后即可登录
  7. # 首次连接会提示确认指纹
  8. # Are you sure you want to continue connecting (yes/no)? yes
  9. # 修改 SSH 端口(安全)
  10. vi /etc/ssh/sshd_config
  11. # Port 2222
  12. # PermitRootLogin no
  13. # 重启 SSH 服务
  14. systemctl restart sshd
复制代码

1.2 本节小结

知识点核心要点
虚拟机VMware、VirtualBox
最小化安装推荐服务器使用
远程连接SSH 连接

1.3 文件系统

🎯 生活类比:Linux 文件系统就像"一棵大树"——根目录 / 是树根,其他目录是树枝。


1.3.1 FHS 目录结构

  1. FHS(Filesystem Hierarchy Standard):文件系统层次标准
  2. / ← 根目录(树根)
  3. ├── bin/ ← 基础命令(ls、cp、mv)
  4. ├── sbin/ ← 系统管理命令(fdisk、reboot)
  5. ├── boot/ ← 启动文件(内核、引导程序)
  6. ├── dev/ ← 设备文件(硬盘、终端)
  7. ├── etc/ ← 配置文件(重要!)
  8. ├── home/ ← 普通用户家目录
  9. │ ├── user1/
  10. │ └── user2/
  11. ├── lib/ ← 共享库
  12. ├── lib64/ ← 64位共享库
  13. ├── media/ ← 可移动设备挂载点
  14. ├── mnt/ ← 临时挂载点
  15. ├── opt/ ← 第三方软件
  16. ├── proc/ ← 进程信息(虚拟文件系统)
  17. ├── root/ ← root 用户家目录
  18. ├── run/ ← 运行时数据
  19. ├── srv/ ← 服务数据
  20. ├── sys/ ← 系统信息(虚拟文件系统)
  21. ├── tmp/ ← 临时文件
  22. ├── usr/ ← 用户程序
  23. │ ├── bin/ ← 用户命令
  24. │ ├── sbin/ ← 系统管理命令
  25. │ ├── lib/ ← 库文件
  26. │ ├── local/ ← 本地安装的软件
  27. │ └── share/ ← 共享数据
  28. └── var/ ← 可变数据
  29. ├── log/ ← 日志文件(重要!)
  30. ├── cache/ ← 缓存
  31. ├── spool/ ← 队列数据
  32. └── tmp/ ← 临时文件
复制代码

1.3.2 一切皆文件

  1. Linux 的核心思想:一切皆文件
  2. - 普通文件:文本、图片、程序
  3. - 目录文件:文件夹
  4. - 设备文件:硬盘、终端、打印机
  5. - 链接文件:快捷方式
  6. - 管道文件:进程间通信
  7. - 套接字文件:网络通信
  8. 示例:
  9. /dev/sda ← 硬盘设备
  10. /dev/tty ← 终端
  11. /proc/cpuinfo ← CPU 信息
  12. /proc/meminfo ← 内存信息
  13. /etc/passwd ← 用户信息
  14. /var/log/messages ← 系统日志
复制代码

1.3.3 路径概念

  1. # 绝对路径:从根目录 / 开始的完整路径
  2. /home/user1/test.txt
  3. /etc/passwd
  4. # 相对路径:从当前目录开始的路径
  5. ./test.txt ← 当前目录下的 test.txt
  6. ../test.txt ← 上级目录下的 test.txt
  7. test.txt ← 当前目录下的 test.txt
  8. # 特殊目录
  9. . ← 当前目录
  10. .. ← 上级目录
  11. ~ ← 当前用户家目录
  12. - ← 上一次所在的目录
  13. # 示例
  14. cd /home ← 切换到 /home 目录(绝对路径)
  15. cd user1 ← 切换到当前目录下的 user1(相对路径)
  16. cd .. ← 返回上级目录
  17. cd ~ ← 回到家目录
  18. cd - ← 回到上一次所在的目录
复制代码

1.3 本节小结

知识点核心要点
FHS标准目录结构,每个目录有特定用途
一切皆文件硬件、进程、网络都是文件
路径绝对路径(从 / 开始)、相对路径(从当前开始)

1.4 Shell 基础

🎯 生活类比:Shell 就像"翻译官"——把你输入的命令翻译成内核能理解的语言。


1.4.1 什么是 Shell

  1. Shell 是什么?
  2. - 用户和内核之间的"翻译官"
  3. - 接收用户输入的命令
  4. - 解析命令并传递给内核执行
  5. - 返回执行结果
  6. 常见的 Shell:
  7. - bash:最常用的 Shell(默认)
  8. - sh:Bourne Shell,最古老的 Shell
  9. - zsh:功能更强大,macOS 默认
  10. - fish:用户友好,自动补全
  11. 查看当前 Shell:
  12. echo $SHELL # 输出 /bin/bash
  13. 切换 Shell:
  14. /bin/zsh # 临时切换到 zsh
  15. chsh -s /bin/zsh # 永久切换
复制代码

1.4.2 命令格式

  1. # 命令格式:命令 [选项] [参数]
  2. # 示例
  3. ls -l /home # ls 是命令,-l 是选项,/home 是参数
  4. cat file.txt # cat 是命令,file.txt 是参数
  5. rm -rf /tmp/test # rm 是命令,-rf 是选项,/tmp/test 是参数
  6. # 选项的两种格式:
  7. ls -l # 短选项(单个 -)
  8. ls --all # 长选项(双 --)
  9. ls -lh # 多个短选项可以合并
  10. # 命令帮助:
  11. ls --help # 查看命令帮助
  12. man ls # 查看命令手册(更详细)
  13. info ls # 查看命令信息
复制代码

1.4.3 常用快捷键

  1. # 终端快捷键
  2. Ctrl + C # 终止当前命令
  3. Ctrl + D # 退出当前终端/发送 EOF
  4. Ctrl + L # 清屏(等同于 clear)
  5. Ctrl + A # 光标移到行首
  6. Ctrl + E # 光标移到行尾
  7. Ctrl + U # 删除光标前的内容
  8. Ctrl + K # 删除光标后的内容
  9. Ctrl + W # 删除光标前的一个单词
  10. Ctrl + R # 搜索历史命令
  11. Ctrl + Z # 暂停当前命令(放到后台)
  12. # 历史命令
  13. history # 查看历史命令
  14. !n # 执行第 n 条历史命令
  15. !! # 执行上一条命令
  16. !string # 执行最近以 string 开头的命令
  17. # Tab 补全
  18. Tab # 自动补全命令或文件名
  19. Tab Tab # 显示所有可能的补全
复制代码

1.4.4 环境变量

  1. # 查看环境变量
  2. echo $PATH # 查看 PATH 环境变量
  3. echo $HOME # 查看用户家目录
  4. echo $USER # 查看当前用户名
  5. echo $SHELL # 查看当前 Shell
  6. env # 查看所有环境变量
  7. set # 查看所有变量(包括局部变量)
  8. # 设置环境变量(临时,只在当前终端有效)
  9. export MY_VAR="hello"
  10. echo $MY_VAR # hello
  11. # 设置环境变量(永久)
  12. # 编辑 ~/.bashrc 或 ~/.bash_profile
  13. vi ~/.bashrc
  14. # 添加:export MY_VAR="hello"
  15. source ~/.bashrc # 使配置生效
  16. # PATH 环境变量
  17. # PATH 是命令搜索路径,用 : 分隔
  18. echo $PATH
  19. # /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
  20. # 添加自定义路径到 PATH
  21. export PATH=$PATH:/opt/myapp/bin
复制代码

1.4 本节小结

知识点核心要点
Shell用户和内核之间的翻译官
命令格式命令 [选项] [参数]
快捷键Ctrl+C(终止)、Tab(补全)、Ctrl+R(搜索)
环境变量PATH、HOME、USER,export 设置

第二部分:基础必备命令

🎯 学习建议:Linux 命令不需要死记硬背,用多了自然就记住了。建议边学边练,在虚拟机中实际操作。


2.1 文件与目录操作

2.1.1 ls —— 列出目录内容

  1. # 基本用法
  2. ls # 列出当前目录内容
  3. ls /home # 列出指定目录内容
  4. # 常用选项
  5. ls -l # 长格式显示(详细信息)
  6. ls -a # 显示隐藏文件(以 . 开头的文件)
  7. ls -h # 人性化显示文件大小(KB、MB)
  8. ls -lh # 组合使用
  9. ls -lah # 显示所有文件的详细信息
  10. ls -lt # 按修改时间排序
  11. ls -ltr # 按修改时间倒序排列
  12. # 输出示例
  13. ls -lh /etc/passwd
  14. # -rw-r--r--. 1 root root 1.5K Jan 1 00:00 /etc/passwd
  15. # -rw-r--r--:文件类型和权限
  16. # 1:硬链接数
  17. # root:所有者
  18. # root:所属组
  19. # 1.5K:文件大小
  20. # Jan 1 00:00:修改时间
  21. # /etc/passwd:文件名
复制代码

2.1.2 cd —— 切换目录

  1. cd /home # 切换到 /home 目录
  2. cd user1 # 切换到当前目录下的 user1
  3. cd .. # 返回上级目录
  4. cd ~ # 回到家目录
  5. cd - # 回到上一次所在的目录
  6. cd / # 切换到根目录
  7. pwd # 显示当前目录路径
复制代码

2.1.3 mkdir —— 创建目录

  1. mkdir test # 创建目录
  2. mkdir -p a/b/c # 递归创建多级目录
  3. mkdir -m 755 mydir # 创建目录并设置权限
  4. mkdir dir1 dir2 dir3 # 同时创建多个目录
复制代码

2.1.4 touch —— 创建文件

  1. touch file.txt # 创建空文件(如果已存在则更新时间戳)
  2. touch -t 202401010000 file # 设置文件时间戳
  3. touch file{1..10}.txt # 批量创建文件
复制代码

2.1.5 cp —— 复制

  1. cp file1 file2 # 复制文件
  2. cp file1 /tmp/ # 复制文件到目录
  3. cp -r dir1 dir2 # 递归复制目录
  4. cp -p file1 file2 # 保留文件属性
  5. cp -a dir1 dir2 # 等同于 cp -rp,保留所有属性
  6. cp -i file1 file2 # 覆盖前提示
  7. cp -v file1 file2 # 显示复制过程
复制代码

2.1.6 mv —— 移动/重命名

  1. mv file1 file2 # 重命名文件
  2. mv file1 /tmp/ # 移动文件到目录
  3. mv dir1 dir2 # 移动/重命名目录
  4. mv -i file1 /tmp/ # 覆盖前提示
  5. mv -v file1 /tmp/ # 显示移动过程
复制代码

2.1.7 rm —— 删除

  1. rm file.txt # 删除文件
  2. rm -r dir # 递归删除目录
  3. rm -f file # 强制删除(不提示)
  4. rm -rf dir # 强制递归删除(危险!)
  5. rm -i file # 删除前提示
  6. # ⚠️ 危险命令,永远不要执行:
  7. # rm -rf / # 删除根目录(会毁掉系统)
  8. # rm -rf /* # 同上
  9. # 安全做法:使用别名
  10. alias rm='rm -i' # 让 rm 默认提示确认
复制代码

2.1.8 tree —— 树形显示目录

  1. # 安装
  2. yum install tree -y # CentOS
  3. apt install tree -y # Ubuntu
  4. # 使用
  5. tree # 树形显示当前目录
  6. tree -L 2 # 只显示 2 层
  7. tree -d # 只显示目录
  8. tree -a # 显示隐藏文件
复制代码

2.2 文件查看与搜索

2.2.1 cat —— 查看文件内容

  1. cat file.txt # 查看文件内容
  2. cat -n file.txt # 显示行号
  3. cat -b file.txt # 只对非空行显示行号
  4. cat -s file.txt # 压缩空行
  5. # 合并文件
  6. cat file1 file2 > file3 # 合并 file1 和 file2 到 file3
复制代码

2.2.2 more / less —— 分页查看

  1. more file.txt # 分页查看(空格翻页,q 退出)
  2. less file.txt # 分页查看(更强大,支持搜索)
  3. # less 快捷键
  4. # 空格:下一页
  5. # b:上一页
  6. # /pattern:搜索
  7. # n:下一个匹配
  8. # N:上一个匹配
  9. # q:退出
  10. # G:跳到文件末尾
  11. # gg:跳到文件开头
复制代码

2.2.3 head / tail —— 查看文件头尾

  1. head file.txt # 查看前 10 行
  2. head -n 20 file.txt # 查看前 20 行
  3. head -20 file.txt # 同上
  4. tail file.txt # 查看后 10 行
  5. tail -n 20 file.txt # 查看后 20 行
  6. tail -f file.txt # 实时查看文件末尾(常用于查看日志)
  7. tail -F file.txt # 同上,但会跟踪文件名变化
复制代码

2.2.4 find —— 查找文件

  1. # 按名称查找
  2. find / -name "file.txt" # 在根目录下查找 file.txt
  3. find . -name "*.log" # 查找当前目录下所有 .log 文件
  4. find . -iname "File.TXT" # 忽略大小写查找
  5. # 按类型查找
  6. find . -type f # 查找文件
  7. find . -type d # 查找目录
  8. find . -type l # 查找链接
  9. # 按大小查找
  10. find . -size +100M # 查找大于 100MB 的文件
  11. find . -size -1M # 查找小于 1MB 的文件
  12. # 按时间查找
  13. find . -mtime -7 # 查找 7 天内修改的文件
  14. find . -mtime +30 # 查找 30 天前修改的文件
  15. find . -mmin -30 # 查找 30 分钟内修改的文件
  16. # 按权限查找
  17. find . -perm 755 # 查找权限为 755 的文件
  18. find . -perm -u+s # 查找有 SUID 的文件
  19. # 执行操作
  20. find . -name "*.log" -delete # 删除找到的文件
  21. find . -name "*.log" -exec rm -f {} \; # 同上
  22. find . -name "*.log" -exec ls -lh {} \; # 对找到的文件执行 ls
  23. find . -name "*.bak" -exec mv {} {}.old \; # 重命名
复制代码

2.2.5 which / whereis / locate

  1. which ls # 查找命令的路径
  2. which java # 查找 java 命令的路径
  3. whereis ls # 查找命令的路径、源码、手册
  4. whereis nginx # 查找 nginx 相关文件
  5. locate file.txt # 快速查找文件(基于数据库)
  6. updatedb # 更新 locate 数据库
复制代码

2.3 链接文件

  1. # 软链接(符号链接,类似快捷方式)
  2. ln -s /path/to/file link_name
  3. ln -s /etc/passwd ~/passwd_link
  4. # 硬链接(指向同一个 inode)
  5. ln /path/to/file link_name
  6. ln /etc/passwd ~/passwd_hard
  7. # 软链接 vs 硬链接
  8. # 软链接:
  9. # - 可以跨文件系统
  10. # - 可以链接目录
  11. # - 删除原文件,链接失效
  12. # - 文件类型显示为 l
  13. # 硬链接:
  14. # - 不能跨文件系统
  15. # - 不能链接目录
  16. # - 删除原文件,链接仍有效
  17. # - 共享同一个 inode
复制代码

2.4 压缩与解压缩

  1. # tar 打包
  2. tar -cvf archive.tar dir/ # 打包目录
  3. tar -xvf archive.tar # 解包
  4. tar -tvf archive.tar # 查看包内容
  5. # tar + gzip 压缩
  6. tar -czvf archive.tar.gz dir/ # 打包并 gzip 压缩
  7. tar -xzvf archive.tar.gz # 解压
  8. tar -xzvf archive.tar.gz -C /tmp/ # 解压到指定目录
  9. # tar + bzip2 压缩
  10. tar -cjvf archive.tar.bz2 dir/ # 打包并 bzip2 压缩
  11. tar -xjvf archive.tar.bz2 # 解压
  12. # zip/unzip
  13. zip -r archive.zip dir/ # 压缩目录
  14. unzip archive.zip # 解压
  15. unzip archive.zip -d /tmp/ # 解压到指定目录
  16. # gzip/gunzip
  17. gzip file.txt # 压缩文件(替换原文件)
  18. gunzip file.txt.gz # 解压
  19. # 查看压缩包内容
  20. zcat file.txt.gz # 查看 gz 文件内容
  21. zless file.txt.gz # 分页查看
复制代码

2.5 重定向与管道

  1. # 输出重定向
  2. echo "hello" > file.txt # 覆盖写入
  3. echo "world" >> file.txt # 追加写入
  4. ls -l > list.txt 2>&1 # 标准输出和错误都重定向
  5. ls -l > list.txt 2>error.txt # 标准输出和错误分别重定向
  6. # 输入重定向
  7. wc -l < file.txt # 统计文件行数
  8. cat << EOF > file.txt # Here Document
  9. line1
  10. line2
  11. EOF
  12. # 管道
  13. ls -l | grep ".txt" # 列出文件,过滤 .txt 文件
  14. cat file.txt | wc -l # 统计行数
  15. ps aux | grep nginx # 查找 nginx 进程
  16. history | grep ssh # 搜索历史命令
  17. # tee(同时输出到屏幕和文件)
  18. ls -l | tee list.txt # 输出到屏幕和文件
  19. ls -l | tee -a list.txt # 追加到文件
  20. # xargs(将输入转换为命令参数)
  21. find . -name "*.txt" | rm -f # ❌ 错误用法
  22. find . -name "*.txt" | xargs rm -f # ✅ 正确用法
  23. find . -name "*.txt" | xargs -I {} mv {} {}.bak # 重命名
复制代码

第二部分总结

章节核心内容
文件操作ls、cd、mkdir、touch、cp、mv、rm、tree
文件查看cat、more/less、head/tail、find
链接软链接(快捷方式)、硬链接(共享 inode)
压缩tar、gzip、zip
重定向与管道>、>>、|、tee、xargs

第三部分:用户与权限管理

🎯 生活类比:Linux 的权限管理就像"酒店门禁系统"——

  • 每个房间有门卡(权限)
  • 不同级别的门卡能开不同的门(读、写、执行)
  • 管理员有万能钥匙(root 用户)
  • 门禁系统记录谁进出了(审计日志)

为什么权限管理重要?

  • 安全性:防止未授权访问
  • 数据保护:防止误操作删除重要文件
  • 多用户协作:不同用户有不同的权限
  • 合规要求:企业需要权限管理满足审计要求

3.1 用户与用户组

3.1.1 用户的概念

  1. Linux 用户类型:
  2. 1. root 用户(超级管理员)
  3. - UID = 0
  4. - 拥有系统最高权限
  5. - 可以做任何操作
  6. - ⚠️ 危险!误操作可能毁掉系统
  7. 2. 系统用户
  8. - UID = 1-999
  9. - 用于运行系统服务
  10. - 不能登录系统
  11. - 例如:nginx、mysql、redis
  12. 3. 普通用户
  13. - UID = 1000+
  14. - 可以登录系统
  15. - 权限受限
  16. - 只能操作自己的文件
  17. 用户相关文件:
  18. /etc/passwd # 用户信息(所有人都能读)
  19. /etc/shadow # 密码信息(只有 root 能读)
  20. /etc/group # 用户组信息
复制代码
  1. # /etc/passwd 文件格式
  2. # 用户名:密码占位:UID:GID:注释:家目录:Shell
  3. root:x:0:0:root:/root:/bin/bash
  4. user1:x:1000:1000::/home/user1:/bin/bash
  5. # /etc/shadow 文件格式
  6. # 用户名:加密密码:最后修改日期:最小修改间隔:最大修改间隔:警告天数:宽限天数:过期日期:保留
  7. root:$6$xxx:19000:0:99999:7:::
  8. # /etc/group 文件格式
  9. # 组名:密码:GID:组成员
  10. root:x:0:
  11. user1:x:1000:
复制代码

3.1.2 用户操作详解

  1. # ====== 创建用户 ======
  2. useradd username # 最简单的创建
  3. useradd -m -s /bin/bash username # 推荐:自动创建家目录,指定 Shell
  4. useradd -u 1001 -g developers -G docker,wheel username # 指定 UID、主组、附加组
  5. useradd -e 2024-12-31 username # 设置用户过期日期
  6. useradd -c "管理员账号" username # 添加注释
  7. # ====== 设置密码 ======
  8. passwd username # 交互式设置密码
  9. echo "username:password" | chpasswd # 批量设置密码
  10. passwd -l username # 锁定用户(无法登录)
  11. passwd -u username # 解锁用户
  12. passwd -e username # 强制用户下次登录修改密码
  13. passwd -n 7 username # 设置密码最小修改间隔(天)
  14. passwd -x 90 username # 设置密码最大有效期(天)
  15. passwd -w 7 username # 设置密码过期警告天数
  16. # ====== 修改用户 ======
  17. usermod -l newname oldname # 修改用户名
  18. usermod -d /new/home -m username # 修改家目录(-m 迁移文件)
  19. usermod -s /bin/zsh username # 修改 Shell
  20. usermod -aG docker username # 添加用户到附加组(-a 表示追加,不加会覆盖)
  21. usermod -L username # 锁定用户(等同于 passwd -l)
  22. usermod -U username # 解锁用户
  23. usermod -e 2024-12-31 username # 设置用户过期日期
  24. # ====== 删除用户 ======
  25. userdel username # 删除用户(保留家目录)
  26. userdel -r username # 删除用户并删除家目录
  27. userdel -f username # 强制删除(即使用户在线)
  28. # ====== 查看用户信息 ======
  29. id username # 查看用户 UID、GID、所属组
  30. id -u username # 只显示 UID
  31. id -g username # 只显示主组 GID
  32. id -G username # 显示所有组 GID
  33. whoami # 查看当前用户名
  34. who # 查看当前登录用户
  35. w # 查看当前登录用户及活动
  36. last # 查看登录历史
  37. lastlog # 查看所有用户最后登录时间
  38. finger username # 查看用户详细信息(需要安装)
复制代码

3.1.3 用户组操作详解

  1. # ====== 创建用户组 ======
  2. groupadd groupname # 创建用户组
  3. groupadd -g 1001 groupname # 指定 GID
  4. groupadd -r groupname # 创建系统组(GID < 1000)
  5. # ====== 修改用户组 ======
  6. groupmod -n newname oldname # 重命名组
  7. groupmod -g 2001 groupname # 修改 GID
  8. # ====== 删除用户组 ======
  9. groupdel groupname # 删除组(不能删除用户的主组)
  10. # ====== 组成员管理 ======
  11. gpasswd -a user1 groupname # 添加用户到组
  12. gpasswd -d user1 groupname # 从组中删除用户
  13. gpasswd -A user1 groupname # 设置组管理员
  14. gpasswd -M user1,user2 groupname # 设置组成员列表
  15. # ====== 查看组信息 ======
  16. groups username # 查看用户所属的组
  17. getent group groupname # 查看组信息
  18. cat /etc/group # 查看所有组
复制代码

3.2 文件权限深入理解

3.2.1 权限位详解

  1. ls -l 输出解析:
  2. -rw-r--r--. 1 root root 1500 Jan 1 00:00 /etc/passwd
  3. │╰─╯╰─╯╰─╯
  4. │ │ │ └── 其他人权限
  5. │ │ └─────── 所属组权限
  6. │ └──────────── 所有者权限
  7. └─────────────── 文件类型
  8. 文件类型(第1位):
  9. - 普通文件
  10. d 目录
  11. l 符号链接(软链接)
  12. b 块设备(硬盘、U盘)
  13. c 字符设备(终端、鼠标)
  14. p 命名管道
  15. s 套接字
  16. 权限位(第2-10位):
  17. r(读)= 4 w(写)= 2 x(执行)= 1
  18. 数字法计算:
  19. rwx = 4+2+1 = 7
  20. rw- = 4+2+0 = 6
  21. r-x = 4+0+1 = 5
  22. r-- = 4+0+0 = 4
  23. -wx = 0+2+1 = 3
  24. -w- = 0+2+0 = 2
  25. --x = 0+0+1 = 1
  26. --- = 0+0+0 = 0
复制代码

3.2.2 权限对文件的含义

  1. 权限 文件 目录
  2. ────────────────────────────────────────
  3. r(读) 查看文件内容 列出目录内容(ls)
  4. w(写) 修改文件内容 在目录中创建、删除、重命名文件
  5. x(执行)执行文件(程序/脚本) 进入目录(cd)
  6. 重要理解:
  7. 1. 对目录的 r 权限:只能列出文件名,不能查看文件内容
  8. 2. 对目录的 w 权限:可以创建删除文件,但不能修改文件内容
  9. 3. 对目录的 x 权限:可以进入目录,但不能列出文件名
  10. 4. 要正常访问目录,通常需要 r+x(列出并进入)
  11. 5. 要在目录中创建文件,需要 w+x(创建并进入)
  12. 常见权限组合:
  13. 755:所有者 rwx,组 rx,其他 rx(程序、脚本)
  14. 644:所有者 rw,组 r,其他 r(普通文件)
  15. 700:所有者 rwx,组无,其他无(私有目录)
  16. 600:所有者 rw,组无,其他无(私有文件)
  17. 777:所有人 rwx(危险!不要用)
复制代码

3.2.3 chmod 详解

  1. # ====== 数字法 ======
  2. chmod 755 file # rwxr-xr-x(程序、脚本)
  3. chmod 644 file # rw-r--r--(普通文件)
  4. chmod 700 dir # rwx------(私有目录)
  5. chmod 600 file # rw-------(私有文件)
  6. chmod 777 file # rwxrwxrwx(危险!)
  7. # 递归修改
  8. chmod -R 755 dir/ # 递归修改目录及所有子文件
  9. # ====== 符号法 ======
  10. # u=所有者 g=所属组 o=其他人 a=所有人
  11. # +添加 -删除 =设置
  12. chmod u+x file # 给所有者添加执行权限
  13. chmod g-w file # 去掉所属组的写权限
  14. chmod o=r file # 设置其他人只有读权限
  15. chmod a+x file # 给所有人添加执行权限
  16. chmod u+x,g+rx file # 同时设置多个权限
  17. chmod ug+rw file # 给所有者和所属组添加读写权限
  18. # 参考其他文件的权限
  19. chmod --reference=ref_file target_file
  20. # ====== 常见场景 ======
  21. # 场景 1:Web 网站文件
  22. chmod -R 755 /var/www/html/ # 目录
  23. chmod 644 /var/www/html/index.html # 文件
  24. # 场景 2:脚本文件
  25. chmod +x script.sh # 添加执行权限
  26. # 场景 3:配置文件
  27. chmod 600 /etc/shadow # 只有 root 能读写
  28. chmod 644 /etc/passwd # 所有人能读,只有 root 能写
  29. # 场景 4:私钥文件
  30. chmod 600 ~/.ssh/id_rsa # 只有所有者能读写
复制代码

3.2.4 chown 详解

  1. # 修改所有者
  2. chown user1 file # 修改所有者
  3. chown user1:group1 file # 修改所有者和所属组
  4. chown user1: file # 修改所有者,组设为 user1 的主组
  5. chown :group1 file # 只修改所属组
  6. # 递归修改
  7. chown -R user1:group1 dir/ # 递归修改目录
  8. # 参考其他文件
  9. chown --reference=ref_file target_file
  10. # 常见场景
  11. chown -R nginx:nginx /var/www/html # Web 目录
  12. chown -R mysql:mysql /var/lib/mysql # MySQL 数据目录
  13. chown -R redis:redis /var/lib/redis # Redis 数据目录
复制代码

3.2.5 权限判断流程

  1. 当用户访问文件时,Linux 的权限判断流程:
  2. 1. 判断是否是 root 用户
  3. - 是 → 直接允许(root 有所有权限)
  4. - 否 → 继续判断
  5. 2. 判断是否是文件所有者
  6. - 是 → 使用所有者权限(第2-4位)
  7. - 否 → 继续判断
  8. 3. 判断是否是文件所属组成员
  9. - 是 → 使用所属组权限(第5-7位)
  10. - 否 → 使用其他人权限(第8-10位)
  11. 4. 如果有 ACL,ACL 优先于普通权限
  12. 示例:
  13. 文件权限:rw-r--r--(644)
  14. 所有者:user1
  15. 所属组:group1
  16. user1 访问 → 使用所有者权限 → rw-(可读写)
  17. user2(group1 成员)→ 使用组权限 → r--(只读)
  18. user3(其他用户)→ 使用其他权限 → r--(只读)
  19. root → 直接允许(忽略权限)
复制代码

3.3 特殊权限

3.3.1 SUID(Set User ID)

  1. SUID 的作用:
  2. - 执行文件时,临时获得文件所有者的权限
  3. - 只对可执行文件有效
  4. - 典型例子:passwd 命令
  5. 为什么需要 SUID?
  6. - 普通用户需要修改自己的密码
  7. - 密码文件 /etc/shadow 只有 root 能读写
  8. - passwd 命令有 SUID,执行时临时获得 root 权限
  9. - 这样普通用户就能修改自己的密码了
复制代码
  1. # 查看 SUID
  2. ls -l /usr/bin/passwd
  3. # -rwsr-xr-x. 1 root root 27856 Apr 1 2020 /usr/bin/passwd
  4. # 注意所有者的 x 变成了 s(表示 SUID)
  5. # 设置 SUID
  6. chmod u+s file # 符号法
  7. chmod 4755 file # 数字法(4 表示 SUID)
  8. chmod u-s file # 去除 SUID
  9. # 查找有 SUID 的文件(安全审计)
  10. find / -perm -4000 -type f 2>/dev/null
  11. # ⚠️ SUID 的安全风险
  12. # - 如果一个程序有 SUID 且有漏洞,攻击者可能获得 root 权限
  13. # - 只给必要的程序设置 SUID
  14. # - 定期审计 SUID 文件
复制代码

3.3.2 SGID(Set Group ID)

  1. SGID 的作用:
  2. - 对文件:执行时临时获得文件所属组的权限
  3. - 对目录:在目录中创建的文件自动继承目录的组
  4. 为什么需要 SGID?
  5. - 团队协作:多个用户需要共享一个目录
  6. - 新建文件自动继承目录的组,不需要手动修改
复制代码
  1. # 查看 SGID
  2. ls -ld /var/tmp
  3. # drwxrwxrwt. 2 root root 4096 Jan 1 00:00 /var/tmp
  4. # 设置 SGID
  5. chmod g+s dir # 符号法
  6. chmod 2755 dir # 数字法(2 表示 SGID)
  7. chmod g-s dir # 去除 SGID
  8. # 示例:团队共享目录
  9. mkdir /project
  10. groupadd developers
  11. chown :developers /project
  12. chmod 2775 /project # 设置 SGID + 组可写
  13. # 现在 developers 组的用户在 /project 中创建的文件
  14. # 自动属于 developers 组,不需要手动修改
复制代码

3.3.3 Sticky Bit

  1. Sticky Bit 的作用:
  2. - 对目录设置后,只有文件所有者和 root 能删除文件
  3. - 典型例子:/tmp 目录
  4. 为什么需要 Sticky Bit?
  5. - /tmp 是所有用户都能写入的目录
  6. - 如果没有 Sticky Bit,用户 A 可以删除用户 B 的文件
  7. - 设置 Sticky Bit 后,用户只能删除自己的文件
复制代码
  1. # 查看 Sticky Bit
  2. ls -ld /tmp
  3. # drwxrwxrwt. 4 root root 4096 Jan 1 00:00 /tmp
  4. # 注意其他人的 x 变成了 t(表示 Sticky Bit)
  5. # 设置 Sticky Bit
  6. chmod +t dir # 符号法
  7. chmod 1755 dir # 数字法(1 表示 Sticky Bit)
  8. chmod -t dir # 去除 Sticky Bit
  9. # 示例:创建公共目录
  10. mkdir /shared
  11. chmod 1777 /shared # 所有人可读写,但只能删除自己的文件
复制代码

3.3.4 特殊权限总结

  1. 权限 数字 符号 作用
  2. ──────────────────────────────────────────────────
  3. SUID 4 u+s 执行时获得所有者权限
  4. SGID 2 g+s 执行时获得组权限 / 目录文件继承组
  5. Sticky Bit 1 +t 只有所有者能删除文件
  6. 组合使用:
  7. chmod 6755 file # SUID + SGID + rwxr-xr-x
  8. chmod 2775 dir # SGID + rwxrwxr-x
  9. chmod 1777 dir # Sticky Bit + rwxrwxrwx
  10. 查看特殊权限:
  11. ls -l # s/S 表示 SUID/SGID,t/T 表示 Sticky Bit
复制代码

3.4 ACL 访问控制

3.4.1 ACL 简介

  1. ACL(Access Control List):访问控制列表
  2. 为什么需要 ACL?
  3. - 传统权限只能设置所有者、所属组、其他人
  4. - 无法给"特定用户"或"特定组"设置不同权限
  5. - ACL 解决了这个问题
  6. ACL 的作用:
  7. - 可以给任意用户设置文件权限
  8. - 可以给任意组设置文件权限
  9. - 权限粒度更细
复制代码
  1. # 查看 ACL
  2. getfacl file
  3. # file: file
  4. # owner: root
  5. # group: root
  6. # user::rw-
  7. # user:user1:rw- # ACL:user1 有读写权限
  8. # group::r--
  9. # group:group1:r-x # ACL:group1 有读和执行权限
  10. # mask::rw-
  11. # other::r--
  12. # 设置 ACL
  13. setfacl -m u:user1:rw file # 给 user1 设置读写权限
  14. setfacl -m u:user2:r file # 给 user2 设置只读权限
  15. setfacl -m g:group1:rx file # 给 group1 设置读和执行权限
  16. setfacl -m o::--- file # 设置其他人无权限
  17. # 删除 ACL
  18. setfacl -x u:user1 file # 删除 user1 的 ACL
  19. setfacl -x g:group1 file # 删除 group1 的 ACL
  20. setfacl -b file # 删除所有 ACL
  21. # 递归设置
  22. setfacl -R -m u:user1:rw dir/
  23. # 设置默认 ACL(新建文件自动继承)
  24. setfacl -d -m u:user1:rw dir/ # 目录中新创建的文件自动给 user1 读写权限
  25. # 备份和恢复 ACL
  26. getfacl -R dir/ > acl_backup.txt # 备份
  27. setfacl --restore=acl_backup.txt # 恢复
复制代码

3.4.2 ACL 实战场景

  1. # 场景 1:给特定用户授权
  2. # 需求:user1 需要读写 /data/project,但不是所有者也不是组成员
  3. setfacl -m u:user1:rw /data/project
  4. # 场景 2:团队共享目录
  5. # 需求:developers 组可读写,testers 组只读
  6. mkdir /shared
  7. setfacl -m g:developers:rwx /shared
  8. setfacl -m g:testers:r-x /shared
  9. chmod 770 /shared # 其他人无权限
  10. # 场景 3:Web 服务器
  11. # 需求:nginx 用户需要读取网站文件,但不能修改
  12. setfacl -R -m u:nginx:r-x /var/www/html
  13. # 场景 4:日志查看
  14. # 需求:dev 用户需要查看日志,但不能修改
  15. setfacl -m u:dev:r /var/log/app.log
复制代码

3.5 umask 默认权限

  1. umask 是什么?
  2. - 创建文件或目录时的默认权限掩码
  3. - umask 值会从最大权限中"减去"
  4. 最大权限:
  5. - 文件:666(rw-rw-rw-)
  6. - 目录:777(rwxrwxrwx)
  7. 默认 umask:022
  8. 计算公式:
  9. - 文件权限 = 666 - umask = 666 - 022 = 644(rw-r--r--)
  10. - 目录权限 = 777 - umask = 777 - 022 = 755(rwxr-xr-x)
复制代码
  1. # 查看 umask
  2. umask # 输出 0022
  3. umask -S # 符号法显示 u=rwx,g=rx,o=rx
  4. # 设置 umask(临时)
  5. umask 027 # 文件 640,目录 750
  6. # 永久设置 umask
  7. # 编辑 /etc/profile 或 ~/.bashrc
  8. echo "umask 027" >> /etc/profile
  9. source /etc/profile
  10. # 常见 umask 值
  11. # umask 022:默认,文件 644,目录 755
  12. # umask 027:更安全,文件 640,目录 750
  13. # umask 077:最安全,文件 600,目录 700
复制代码

3.6 sudo 配置详解

3.6.1 sudo 简介

  1. sudo 是什么?
  2. - 以其他用户(通常是 root)的身份执行命令
  3. - 比直接使用 root 更安全
  4. - 可以记录谁执行了什么命令
  5. sudo vs su:
  6. - su:切换用户,需要目标用户密码
  7. - sudo:以其他用户执行命令,需要当前用户密码(或不需要密码)
  8. - sudo 更安全,因为不需要共享 root 密码
复制代码

3.6.2 sudoers 配置

  1. # 编辑 sudoers 文件(必须使用 visudo,有语法检查)
  2. visudo
  3. # 或编辑 /etc/sudoers.d/ 目录下的文件(推荐)
  4. visudo -f /etc/sudoers.d/user1
  5. # 配置格式
  6. # 用户名 主机=(身份) 命令选项
  7. # 示例配置
  8. user1 ALL=(ALL) ALL # user1 可以执行所有命令
  9. user1 ALL=(ALL) NOPASSWD: ALL # user1 执行 sudo 不需要密码
  10. %group1 ALL=(ALL) ALL # group1 组的所有成员可以执行所有命令
  11. user1 ALL=(ALL) /usr/bin/systemctl # user1 只能执行 systemctl 命令
  12. user1 ALL=(ALL) /usr/bin/systemctl, /usr/bin/journalctl # 多个命令用逗号分隔
  13. user1 ALL=(ALL) !/usr/bin/passwd, !/usr/bin/passwd root # 禁止执行某些命令
  14. # 命令别名
  15. Cmnd_Alias SERVICES = /usr/bin/systemctl, /usr/bin/journalctl
  16. Cmnd_Alias NETWORK = /usr/bin/ip, /usr/bin/ss
  17. user1 ALL=(ALL) SERVICES, NETWORK
  18. # 用户别名
  19. User_Alias ADMINS = user1, user2, user3
  20. ADMINS ALL=(ALL) ALL
复制代码

3.6.3 sudo 使用技巧

  1. # 基本使用
  2. sudo command # 以 root 权限执行命令
  3. sudo -u user1 command # 以 user1 身份执行命令
  4. sudo -i # 切换到 root 用户(加载 root 环境)
  5. sudo su # 切换到 root 用户(保留当前环境)
  6. # sudo 日志
  7. # 默认记录在 /var/log/secure 或 /var/log/auth.log
  8. tail -f /var/log/secure # CentOS
  9. tail -f /var/log/auth.log # Ubuntu
  10. # sudo 缓存
  11. # 默认 sudo 会缓存 5 分钟,不需要每次都输入密码
  12. sudo -k # 清除 sudo 缓存
  13. sudo -v # 更新 sudo 缓存
  14. # 常见配置示例
  15. # 1. 允许用户重启服务
  16. user1 ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
  17. user1 ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart mysql
  18. # 2. 允许用户查看日志
  19. user1 ALL=(ALL) NOPASSWD: /usr/bin/journalctl
  20. user1 ALL=(ALL) NOPASSWD: /usr/bin/tail /var/log/*
  21. # 3. 允许用户执行部署脚本
  22. user1 ALL=(ALL) NOPASSWD: /opt/deploy.sh
复制代码

3.7 权限实战场景

3.7.1 Web 服务器权限

  1. # 场景:Nginx + PHP 网站
  2. # 需求:nginx 能读取网站文件,php-fpm 能写入上传目录
  3. # 创建用户和组
  4. groupadd www
  5. useradd -g www -s /sbin/nologin nginx
  6. useradd -g www -s /sbin/nologin php-fpm
  7. # 设置网站目录
  8. chown -R www:www /var/www/html
  9. chmod -R 755 /var/www/html
  10. # 上传目录需要写权限
  11. chmod 775 /var/www/html/uploads
  12. # Nginx 配置
  13. # user www;
  14. # 或者使用 ACL
  15. setfacl -R -m u:nginx:r-x /var/www/html
  16. setfacl -R -m u:php-fpm:rwx /var/www/html/uploads
复制代码

3.7.2 数据库权限

  1. # 场景:MySQL 数据库
  2. # 需求:mysql 用户拥有数据目录的完全权限
  3. # 创建用户(安装时自动创建)
  4. useradd -r -s /sbin/nologin mysql
  5. # 设置数据目录
  6. chown -R mysql:mysql /var/lib/mysql
  7. chmod 750 /var/lib/mysql
  8. # 配置文件
  9. chown root:mysql /etc/my.cnf
  10. chmod 640 /etc/my.cnf
  11. # 日志目录
  12. chown mysql:mysql /var/log/mysql
  13. chmod 750 /var/log/mysql
复制代码

3.7.3 SSH 安全配置

  1. # 场景:SSH 密钥认证
  2. # 需求:禁用密码登录,只允许密钥登录
  3. # 生成密钥对
  4. ssh-keygen -t rsa -b 4096
  5. # 设置权限(重要!)
  6. chmod 700 ~/.ssh
  7. chmod 600 ~/.ssh/id_rsa # 私钥必须 600
  8. chmod 644 ~/.ssh/id_rsa.pub # 公钥可以 644
  9. chmod 644 ~/.ssh/authorized_keys
  10. # SSH 配置
  11. vi /etc/ssh/sshd_config
  12. # PermitRootLogin no
  13. # PasswordAuthentication no
  14. # PubkeyAuthentication yes
  15. # 重启 SSH
  16. systemctl restart sshd
复制代码

3.7.4 共享目录权限

  1. # 场景:团队共享目录
  2. # 需求:developers 组可读写,其他人无权限
  3. # 创建目录和组
  4. mkdir /data/project
  5. groupadd developers
  6. # 设置权限
  7. chown :developers /data/project
  8. chmod 2775 /data/project # SGID,新文件继承组
  9. # 添加用户到组
  10. usermod -aG developers user1
  11. usermod -aG developers user2
  12. # 或者使用 ACL
  13. setfacl -d -m g:developers:rwx /data/project # 默认 ACL
复制代码

3.7.5 日志文件权限

  1. # 场景:应用日志
  2. # 需求:应用可以写入日志,运维可以查看,其他人无权限
  3. # 创建日志目录
  4. mkdir /var/log/myapp
  5. chown appuser:appgroup /var/log/myapp
  6. chmod 750 /var/log/myapp
  7. # 日志文件
  8. chown appuser:appgroup /var/log/myapp/app.log
  9. chmod 640 /var/log/myapp/app.log
  10. # 使用 ACL 给运维查看权限
  11. setfacl -m u:opsuser:r /var/log/myapp/app.log
复制代码

3.8 权限安全最佳实践

  1. 1. 最小权限原则
  2. - 只给必要的权限
  3. - 不要用 777
  4. - 定期审计权限
  5. 2. 文件权限建议
  6. - 配置文件:644(rw-r--r--)
  7. - 脚本文件:755(rwxr-xr-x)
  8. - 私钥文件:600(rw-------)
  9. - 日志文件:644(rw-r--r--)
  10. - 数据目录:750(rwxr-x---)
  11. 3. 目录权限建议
  12. - 网站目录:755(rwxr-xr-x)
  13. - 上传目录:775(rwxrwxr-x)
  14. - 配置目录:750(rwxr-x---)
  15. - 日志目录:750(rwxr-x---)
  16. 4. 用户权限建议
  17. - 不要用 root 登录系统
  18. - 使用 sudo 执行特权命令
  19. - 定期修改密码
  20. - 使用密钥认证
  21. 5. 安全审计
  22. - 定期检查 SUID/SGID 文件
  23. - 定期检查 ACL 配置
  24. - 定期检查用户权限
  25. - 监控 sudo 日志
复制代码

3.9 常见问题与解决

  1. # 问题 1:Permission denied
  2. # 原因:没有文件的访问权限
  3. # 解决:
  4. ls -l file # 查看权限
  5. chmod +r file # 添加读权限
  6. # 或者
  7. sudo chown user:group file # 修改所有者
  8. # 问题 2:无法删除文件
  9. # 原因:没有目录的写权限(不是文件的写权限)
  10. # 解决:
  11. ls -ld dir/ # 查看目录权限
  12. chmod +w dir/ # 添加目录写权限
  13. # 问题 3:无法进入目录
  14. # 原因:没有目录的执行权限
  15. # 解决:
  16. chmod +x dir/ # 添加目录执行权限
  17. # 问题 4:脚本无法执行
  18. # 原因:没有执行权限
  19. # 解决:
  20. chmod +x script.sh # 添加执行权限
  21. # 问题 5:SSH 无法登录
  22. # 原因:.ssh 目录或 authorized_keys 权限不对
  23. # 解决:
  24. chmod 700 ~/.ssh
  25. chmod 600 ~/.ssh/authorized_keys
  26. # 问题 6:sudo 配置错误
  27. # 原因:sudoers 文件语法错误
  28. # 解决:
  29. pkexec visudo # 使用 pkexec 修复
复制代码

第三部分总结

章节核心内容
用户管理useradd、usermod、userdel、passwd、/etc/passwd
文件权限rwx 数字法/符号法、chmod、chown、权限判断流程
特殊权限SUID(执行获得所有者权限)、SGID(目录继承组)、Sticky Bit(只能删自己的文件)
ACLsetfacl、getfacl,给特定用户/组设置权限
umask默认权限掩码,666-umask=文件权限,777-umask=目录权限
sudo以其他用户执行命令,visudo 配置
实战场景Web 服务器、数据库、SSH、共享目录、日志文件
安全实践最小权限原则、定期审计、不用 root

第四部分:文本处理三剑客

🎯 生活类比:grep、sed、awk 就像"三把瑞士军刀"——grep 负责搜索,sed 负责编辑,awk 负责分析。


4.1 grep —— 文本搜索

  1. # 基本用法
  2. grep "pattern" file # 搜索包含 pattern 的行
  3. grep -i "pattern" file # 忽略大小写
  4. grep -n "pattern" file # 显示行号
  5. grep -v "pattern" file # 显示不匹配的行
  6. grep -c "pattern" file # 统计匹配行数
  7. grep -l "pattern" *.txt # 只显示包含匹配的文件名
  8. grep -r "pattern" /path/ # 递归搜索目录
  9. grep -w "word" file # 匹配整个单词
  10. grep -A 3 "pattern" file # 显示匹配行及后 3 行
  11. grep -B 3 "pattern" file # 显示匹配行及前 3 行
  12. grep -C 3 "pattern" file # 显示匹配行及前后 3 行
  13. # 正则表达式
  14. grep "^root" /etc/passwd # 以 root 开头的行
  15. grep "bash$" /etc/passwd # 以 bash 结尾的行
  16. grep "r..t" /etc/passwd # r 和 t 之间有两个字符
  17. grep "ro*t" /etc/passwd # r 和 t 之间有 0 或多个 o
  18. grep "ro\+t" /etc/passwd # r 和 t 之间有 1 或多个 o(扩展正则用 -E)
  19. grep -E "root|nologin" /etc/passwd # 匹配 root 或 nologin
  20. grep -P "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" file # 匹配 IP 地址
复制代码

4.2 sed —— 流编辑器

  1. # 基本用法
  2. sed 's/old/new/' file # 替换第一个匹配
  3. sed 's/old/new/g' file # 替换所有匹配
  4. sed 's/old/new/gi' file # 替换所有匹配(忽略大小写)
  5. sed -i 's/old/new/g' file # 直接修改文件(危险!)
  6. sed -i.bak 's/old/new/g' file # 修改文件并备份原文件
  7. # 删除行
  8. sed '3d' file # 删除第 3 行
  9. sed '2,5d' file # 删除第 2-5 行
  10. sed '/pattern/d' file # 删除包含 pattern 的行
  11. sed '/^$/d' file # 删除空行
  12. # 插入行
  13. sed '3i\new line' file # 在第 3 行前插入
  14. sed '3a\new line' file # 在第 3 行后追加
  15. sed '1i\# Header' file # 在文件开头插入
  16. # 打印行
  17. sed -n '3p' file # 打印第 3 行
  18. sed -n '2,5p' file # 打印第 2-5 行
  19. sed -n '/pattern/p' file # 打印包含 pattern 的行
  20. # 多个操作
  21. sed -e 's/old1/new1/g' -e 's/old2/new2/g' file
  22. sed 's/old1/new1/g; s/old2/new2/g' file
复制代码

4.3 awk —— 文本分析

  1. # 基本用法
  2. awk '{print}' file # 打印所有行
  3. awk '{print $1}' file # 打印第 1 列
  4. awk '{print $1, $3}' file # 打印第 1 和第 3 列
  5. awk -F: '{print $1}' /etc/passwd # 指定分隔符为 :
  6. awk '{print NR, $0}' file # 打印行号和内容
  7. # 条件判断
  8. awk '$3 > 100' file # 第 3 列大于 100 的行
  9. awk '/pattern/' file # 包含 pattern 的行
  10. awk '$1 == "root"' /etc/passwd # 第 1 列等于 root
  11. # 内置变量
  12. # $0:整行
  13. # $1, $2, ...:第 1, 2, ... 列
  14. # NR:行号
  15. # NF:列数
  16. # FS:输入分隔符
  17. # OFS:输出分隔符
  18. # BEGIN 和 END
  19. awk 'BEGIN {print "Start"} {print} END {print "End"}' file
  20. awk -F: 'BEGIN {print "User List"} {print $1} END {print "Total: " NR " users"}' /etc/passwd
  21. # 统计
  22. awk '{sum += $3} END {print "Sum:", sum}' file # 求和
  23. awk '{sum += $3; count++} END {print "Avg:", sum/count}' file # 求平均
  24. # 格式化输出
  25. awk '{printf "%-20s %10d\n", $1, $3}' file
复制代码

第四部分总结

章节核心内容
grep文本搜索、正则表达式
sed流编辑、替换、删除、插入
awk列处理、条件判断、统计

第五部分:Vim 编辑器

🎯 生活类比:Vim 就像"瑞士军刀"——功能强大但需要学习。一旦学会,效率极高。


5.1 Vim 基础

  1. # 打开文件
  2. vim file.txt # 打开文件
  3. vim +10 file.txt # 打开文件并跳到第 10 行
  4. vim +/pattern file.txt # 打开文件并跳到第一个匹配
  5. # 三种模式
  6. # 1. 普通模式(默认):移动光标、复制粘贴
  7. # 2. 插入模式(i/a/o):输入文本
  8. # 3. 命令模式(:):保存、退出、查找替换
  9. # 进入插入模式
  10. i # 光标前插入
  11. a # 光标后插入
  12. o # 下一行插入
  13. I # 行首插入
  14. A # 行尾插入
  15. O # 上一行插入
  16. Esc # 返回普通模式
  17. # 保存退出
  18. :w # 保存
  19. :q # 退出
  20. :wq # 保存退出
  21. :q! # 强制退出不保存
  22. :wq! # 强制保存退出
  23. :w newfile # 另存为
  24. # 移动光标
  25. h j k l # 左下上右
  26. w # 下一个单词
  27. b # 上一个单词
  28. 0 # 行首
  29. $ # 行尾
  30. gg # 文件开头
  31. G # 文件末尾
  32. :n # 跳到第 n 行
  33. # 复制粘贴
  34. yy # 复制当前行
  35. 3yy # 复制 3 行
  36. yw # 复制一个单词
  37. y$ # 复制到行尾
  38. p # 粘贴到光标后
  39. P # 粘贴到光标前
  40. # 删除
  41. dd # 删除当前行
  42. 3dd # 删除 3 行
  43. dw # 删除一个单词
  44. d$ # 删除到行尾
  45. x # 删除光标下的字符
  46. u # 撤销
  47. Ctrl + r # 重做
  48. # 查找
  49. /pattern # 向下查找
  50. ?pattern # 向上查找
  51. n # 下一个匹配
  52. N # 上一个匹配
  53. * # 查找光标下的单词
复制代码

5.2 Vim 进阶

  1. # 查找替换
  2. :s/old/new/ # 替换当前行第一个匹配
  3. :s/old/new/g # 替换当前行所有匹配
  4. :%s/old/new/g # 替换全文所有匹配
  5. :%s/old/new/gc # 替换全文(每次确认)
  6. :10,20s/old/new/g # 替换第 10-20 行
  7. # 分屏
  8. :sp file # 水平分屏
  9. :vsp file # 垂直分屏
  10. Ctrl + w + w # 切换窗口
  11. Ctrl + w + h/j/k/l # 移动到指定窗口
  12. Ctrl + w + = # 等分窗口
  13. # 多文件编辑
  14. vim file1 file2 # 打开多个文件
  15. :n # 下一个文件
  16. :N # 上一个文件
  17. :files # 列出所有文件
  18. # 配置文件 ~/.vimrc
  19. set number # 显示行号
  20. set tabstop=4 # Tab 宽度
  21. set shiftwidth=4 # 缩进宽度
  22. set expandtab # Tab 转空格
  23. set autoindent # 自动缩进
  24. set syntax on # 语法高亮
  25. set hlsearch # 搜索高亮
  26. set incsearch # 增量搜索
  27. set ignorecase # 搜索忽略大小写
  28. set encoding=utf-8 # 编码
复制代码

第五部分总结

章节核心内容
Vim 基础三种模式、移动、复制粘贴、删除
Vim 进阶查找替换、分屏、配置文件

第六部分:Shell 脚本编程

🎯 生活类比:Shell 脚本就像"菜谱"——把一系列命令写在一起,按顺序执行。


6.1 脚本基础

  1. #!/bin/bash
  2. # 第一行是 Shebang,指定解释器
  3. # 变量
  4. name="hello" # 赋值(等号两边不能有空格!)
  5. echo $name # 使用变量
  6. echo ${name} # 同上,推荐加花括号
  7. # 只读变量
  8. readonly PI=3.14
  9. # PI=3.15 # ❌ 不能修改
  10. # 删除变量
  11. unset name
  12. # 特殊变量
  13. $0 # 脚本名称
  14. $1, $2, ... # 第 1, 2, ... 个参数
  15. $# # 参数个数
  16. $@ # 所有参数(作为独立字符串)
  17. $* # 所有参数(作为单个字符串)
  18. $? # 上一个命令的退出状态
  19. $$ # 当前进程 ID
  20. # 字符串
  21. str="hello world"
  22. echo ${#str} # 字符串长度
  23. echo ${str:0:5} # 截取前 5 个字符
  24. echo ${str/hello/hi} # 替换
  25. # 数组
  26. arr=(1 2 3 4 5)
  27. echo ${arr[0]} # 第 1 个元素
  28. echo ${arr[@]} # 所有元素
  29. echo ${#arr[@]} # 数组长度
  30. # 运算
  31. a=10
  32. b=20
  33. echo $((a + b)) # 加法
  34. echo $((a - b)) # 减法
  35. echo $((a * b)) # 乘法
  36. echo $((a / b)) # 除法
  37. echo $((a % b)) # 取余
复制代码

6.2 流程控制

  1. # if 语句
  2. if [ $a -gt $b ]; then
  3. echo "a > b"
  4. elif [ $a -eq $b ]; then
  5. echo "a == b"
  6. else
  7. echo "a < b"
  8. fi
  9. # 条件判断
  10. # 数值比较:-eq(等于)、-ne(不等于)、-gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于)
  11. # 字符串:=(等于)、!=(不等于)、-z(为空)、-n(不为空)
  12. # 文件:-f(是文件)、-d(是目录)、-e(存在)、-r(可读)、-w(可写)、-x(可执行)
  13. # for 循环
  14. for i in 1 2 3 4 5; do
  15. echo $i
  16. done
  17. for i in {1..5}; do
  18. echo $i
  19. done
  20. for ((i=1; i<=5; i++)); do
  21. echo $i
  22. done
  23. # while 循环
  24. count=1
  25. while [ $count -le 5 ]; do
  26. echo $count
  27. count=$((count + 1))
  28. done
  29. # case 语句
  30. case $1 in
  31. start)
  32. echo "Starting..."
  33. ;;
  34. stop)
  35. echo "Stopping..."
  36. ;;
  37. restart)
  38. echo "Restarting..."
  39. ;;
  40. *)
  41. echo "Usage: $0 {start|stop|restart}"
  42. ;;
  43. esac
复制代码

6.3 函数

  1. # 定义函数
  2. function greet() {
  3. echo "Hello, $1!"
  4. }
  5. # 调用函数
  6. greet "World"
  7. # 带返回值的函数
  8. add() {
  9. return $(( $1 + $2 ))
  10. }
  11. add 10 20
  12. echo "Sum: $?"
  13. # 局部变量
  14. myfunc() {
  15. local local_var="I'm local"
  16. echo $local_var
  17. }
复制代码

6.4 计划任务

  1. # crontab 定时任务
  2. crontab -e # 编辑定时任务
  3. crontab -l # 列出定时任务
  4. crontab -r # 删除所有定时任务
  5. # crontab 格式
  6. # 分 时 日 月 周 命令
  7. # * * * * * command
  8. # 示例
  9. 0 2 * * * /backup.sh # 每天凌晨 2 点执行
  10. */5 * * * * /check.sh # 每 5 分钟执行
  11. 0 9 * * 1 /report.sh # 每周一 9 点执行
  12. 0 0 1 * * /cleanup.sh # 每月 1 号执行
  13. # at 一次性任务
  14. at now + 5 minutes # 5 分钟后执行
  15. at 10:00 # 10 点执行
  16. at> /script.sh
  17. at> Ctrl+D # 结束输入
复制代码

第六部分总结

章节核心内容
脚本基础变量、特殊变量、字符串、数组
流程控制if/for/while/case
函数函数定义、参数、返回值
计划任务crontab、at

第七部分:进程与服务管理

🎯 生活类比:进程就像"正在运行的程序"——

  • 程序是静态的(硬盘上的文件)
  • 进程是动态的(内存中运行的实例)
  • 一个程序可以启动多个进程
  • 每个进程有唯一的 PID(进程 ID)

7.1 进程管理

7.1.1 进程的概念

  1. 进程的状态:
  2. - R(Running):运行中
  3. - S(Sleeping):睡眠中(等待事件)
  4. - D(Disk Sleep):磁盘睡眠(不可中断)
  5. - T(Stopped):停止
  6. - Z(Zombie):僵尸进程(已终止但父进程未回收)
  7. 进程的类型:
  8. - 交互进程:用户交互启动(bash、vim)
  9. - 批处理进程:自动执行(cron 任务)
  10. - 守护进程:后台运行(nginx、mysql)
  11. 父子关系:
  12. - 每个进程都有父进程(PPID)
  13. - 父进程创建子进程
  14. - 子进程终止后,父进程需要回收资源
  15. - 如果父进程先终止,子进程会被 init/systemd 收养
复制代码

7.1.2 ps 命令详解

  1. # ps 常用选项
  2. ps aux # 查看所有进程(BSD 风格)
  3. ps -ef # 查看所有进程(System V 风格)
  4. ps aux | grep nginx # 查找特定进程
  5. ps -ef | grep java # 查找 Java 进程
  6. ps -u username # 查看指定用户的进程
  7. ps -p 1234 # 查看指定 PID 的进程
  8. ps -eo pid,ppid,user,%cpu,%mem,cmd # 自定义输出列
  9. # ps aux 输出解析
  10. # USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
  11. # root 1 0.0 0.1 1684 576 ? Ss Jan01 0:01 /sbin/init
  12. # USER:进程所有者
  13. # PID:进程 ID
  14. # %CPU:CPU 使用率
  15. # %MEM:内存使用率
  16. # VSZ:虚拟内存大小(KB)
  17. # RSS:物理内存大小(KB)
  18. # TTY:终端
  19. # STAT:进程状态
  20. # START:启动时间
  21. # TIME:累计 CPU 时间
  22. # COMMAND:命令
  23. # 进程状态说明
  24. # Ss:睡眠中,s 表示会话领导者
  25. # S+:前台进程
  26. # R+:运行中
  27. # Z:僵尸进程
  28. # T:停止
  29. # <:高优先级
  30. # N:低优先级
  31. # l:多线程
复制代码

7.1.3 top 命令详解

  1. # top 实时监控
  2. top
  3. # top 输出解析
  4. # top - 14:30:00 up 10 days, 3:20, 2 users, load average: 0.50, 0.40, 0.35
  5. # Tasks: 120 total, 2 running, 118 sleeping, 0 stopped, 0 zombie
  6. # %Cpu(s): 5.0 us, 2.0 sy, 0.0 ni, 92.0 id, 0.5 wa, 0.0 hi, 0.5 si, 0.0 st
  7. # MiB Mem : 16000.0 total, 8000.0 free, 4000.0 used, 4000.0 buff/cache
  8. # MiB Swap: 2000.0 total, 2000.0 free, 0.0 used. 11000.0 avail Mem
  9. # load average:系统负载(1分钟、5分钟、15分钟的平均值)
  10. # - 等于 CPU 核心数:满载
  11. # - 大于 CPU 核心数:超载
  12. # - 小于 CPU 核心数:正常
  13. # %Cpu(s):CPU 使用情况
  14. # - us:用户空间
  15. # - sy:内核空间
  16. # - ni:调整过优先级的进程
  17. # - id:空闲
  18. # - wa:等待 IO
  19. # - hi:硬件中断
  20. # - si:软件中断
  21. # - st:虚拟机偷取的时间
  22. # top 快捷键
  23. # 1:显示每个 CPU 核心
  24. # P:按 CPU 排序
  25. # M:按内存排序
  26. # k:终止进程
  27. # r:调整进程优先级
  28. # q:退出
  29. # h:帮助
复制代码

7.1.4 进程信号

  1. # Linux 信号(Signal)
  2. # 信号是进程间通信的一种方式
  3. # 常用信号
  4. kill -l # 列出所有信号
  5. # 1 SIGHUP - 重新加载配置
  6. # 2 SIGINT - 中断(Ctrl+C)
  7. # 3 SIGQUIT - 退出(Ctrl+\)
  8. # 9 SIGKILL - 强制终止(不能被捕获)
  9. # 15 SIGTERM - 优雅终止(默认信号)
  10. # 18 SIGCONT - 继续执行
  11. # 19 SIGSTOP - 暂停执行(不能被捕获)
  12. # 20 SIGTSTP - 暂停执行(Ctrl+Z)
  13. # 发送信号
  14. kill PID # 发送 SIGTERM(优雅终止)
  15. kill -9 PID # 发送 SIGKILL(强制终止)
  16. kill -HUP PID # 发送 SIGHUP(重新加载配置)
  17. kill -STOP PID # 暂停进程
  18. kill -CONT PID # 继续进程
  19. # 按名称终止
  20. killall nginx # 终止所有 nginx 进程
  21. killall -9 nginx # 强制终止所有 nginx 进程
  22. # 按模式终止
  23. pkill -f "pattern" # 终止命令行包含 pattern 的进程
  24. pkill -u username # 终止指定用户的所有进程
  25. pgrep nginx # 查找 nginx 进程的 PID
复制代码

7.1.5 前后台作业

  1. # 前后台作业管理
  2. # 将命令放到后台执行
  3. command & # 后台执行
  4. sleep 100 & # 后台执行 sleep
  5. # 查看后台作业
  6. jobs # 列出后台作业
  7. jobs -l # 列出后台作业(包含 PID)
  8. # 前后台切换
  9. Ctrl + Z # 暂停当前前台进程
  10. fg # 将最近的后台作业移到前台
  11. fg %1 # 将作业 1 移到前台
  12. bg # 将最近暂停的作业放到后台继续执行
  13. bg %1 # 将作业 1 放到后台继续执行
  14. # nohup(忽略挂断信号)
  15. nohup command & # 即使退出终端,进程也会继续运行
  16. nohup ./script.sh > output.log 2>&1 &
  17. # screen(终端复用器)
  18. screen -S mysession # 创建命名会话
  19. screen -ls # 列出会话
  20. screen -r mysession # 恢复会话
  21. screen -d mysession # 分离会话
  22. # 在 screen 中:
  23. # Ctrl+A, D:分离会话
  24. # Ctrl+A, C:创建新窗口
  25. # Ctrl+A, N:下一个窗口
  26. # tmux(更好的终端复用器)
  27. tmux new -s mysession # 创建命名会话
  28. tmux ls # 列出会话
  29. tmux attach -t mysession # 恢复会话
  30. tmux kill-session -t mysession # 删除会话
  31. # 在 tmux 中:
  32. # Ctrl+B, D:分离会话
  33. # Ctrl+B, C:创建新窗口
  34. # Ctrl+B, N:下一个窗口
  35. # Ctrl+B, %:水平分屏
  36. # Ctrl+B, ":垂直分屏
复制代码

7.1.6 僵尸进程处理

  1. # 什么是僵尸进程?
  2. # - 进程已终止,但父进程未回收其资源
  3. # - 占用进程表条目,不占用 CPU 和内存
  4. # - 大量僵尸进程会导致无法创建新进程
  5. # 查找僵尸进程
  6. ps aux | grep 'Z'
  7. # 或
  8. ps -eo pid,ppid,stat,cmd | grep 'Z'
  9. # 处理僵尸进程
  10. # 方法 1:终止父进程(僵尸进程会被 init 收养并回收)
  11. kill -9 PPID
  12. # 方法 2:发送 SIGCHLD 给父进程(通知回收子进程)
  13. kill -17 PPID
  14. # 预防僵尸进程
  15. # - 父进程调用 wait() 或 waitpid() 回收子进程
  16. # - 使用 double fork 技术
  17. # - 使用信号处理函数处理 SIGCHLD
复制代码

7.2 systemd 服务管理

7.2.1 systemd 简介

  1. systemd 是什么?
  2. - Linux 系统和服务管理器
  3. - 替代传统的 SysV init
  4. - CentOS 7+、Ubuntu 16.04+ 默认使用
  5. - 提供更快的启动速度、并行启动、依赖管理
  6. systemd 的核心概念:
  7. - Unit(单元):系统资源的抽象
  8. - Service(服务):后台运行的程序
  9. - Target(目标):一组 Unit 的集合
  10. - Timer(定时器):定时执行任务
复制代码

7.2.2 systemctl 详解

  1. # ====== 服务操作 ======
  2. systemctl start nginx # 启动服务
  3. systemctl stop nginx # 停止服务
  4. systemctl restart nginx # 重启服务
  5. systemctl reload nginx # 重新加载配置(不中断服务)
  6. systemctl status nginx # 查看服务状态
  7. # ====== 开机启动 ======
  8. systemctl enable nginx # 设置开机启动
  9. systemctl disable nginx # 取消开机启动
  10. systemctl is-enabled nginx # 查看是否开机启动
  11. # ====== 服务状态 ======
  12. systemctl is-active nginx # 查看是否运行中
  13. systemctl is-failed nginx # 查看是否失败
  14. # ====== 查看服务 ======
  15. systemctl list-units # 列出所有 Unit
  16. systemctl list-units --type=service # 列出所有服务
  17. systemctl list-units --state=running # 列出运行中的服务
  18. systemctl list-units --state=failed # 列出失败的服务
  19. systemctl list-unit-files --type=service # 列出所有服务文件
  20. # ====== 服务依赖 ======
  21. systemctl list-dependencies nginx # 列出服务依赖
  22. systemctl list-dependencies --reverse nginx # 列出依赖此服务的其他服务
  23. # ====== 服务日志 ======
  24. journalctl -u nginx # 查看服务日志
  25. journalctl -u nginx -f # 实时查看服务日志
  26. journalctl -u nginx --since "1 hour ago" # 查看最近 1 小时的日志
  27. journalctl -u nginx --since "2024-01-01" --until "2024-01-02" # 指定时间范围
复制代码

7.2.3 编写 Service 文件

  1. # /etc/systemd/system/myapp.service
  2. [Unit]
  3. # 服务描述
  4. Description=My Application
  5. # 服务文档
  6. Documentation=https://example.com/docs
  7. # 依赖关系
  8. After=network.target mysql.service
  9. Requires=network.target
  10. # 冲突服务
  11. Conflicts=shutdown.target
  12. [Service]
  13. # 服务类型
  14. # simple:主进程就是服务进程(默认)
  15. # forking:主进程 fork 出子进程,然后退出
  16. # oneshot:执行一次就退出
  17. # notify:类似 simple,但会通知 systemd 启动完成
  18. Type=simple
  19. # 运行用户和组
  20. User=app
  21. Group=app
  22. # 工作目录
  23. WorkingDirectory=/opt/myapp
  24. # 环境变量
  25. Environment=JAVA_HOME=/usr/lib/jvm/java-17
  26. EnvironmentFile=/opt/myapp/.env
  27. # 启动命令
  28. ExecStart=/usr/bin/java -jar /opt/myapp/app.jar
  29. # 停止命令
  30. ExecStop=/bin/kill -TERM $MAINPID
  31. # 重新加载命令
  32. ExecReload=/bin/kill -HUP $MAINPID
  33. # 重启策略
  34. # no:不重启
  35. # on-success:正常退出时重启
  36. # on-failure:异常退出时重启
  37. # always:总是重启
  38. Restart=on-failure
  39. # 重启间隔
  40. RestartSec=10
  41. # 启动超时时间
  42. TimeoutStartSec=300
  43. # 停止超时时间
  44. TimeoutStopSec=30
  45. # 最大文件描述符
  46. LimitNOFILE=65536
  47. # 最大进程数
  48. LimitNPROC=4096
  49. [Install]
  50. # 多用户模式启动
  51. WantedBy=multi-user.target
复制代码

7.2.4 常见服务配置示例

  1. # ====== Nginx 服务 ======
  2. [Unit]
  3. Description=nginx - high performance web server
  4. After=network.target
  5. [Service]
  6. Type=forking
  7. PIDFile=/run/nginx.pid
  8. ExecStartPre=/usr/sbin/nginx -t
  9. ExecStart=/usr/sbin/nginx
  10. ExecReload=/bin/kill -s HUP $MAINPID
  11. ExecStop=/bin/kill -s QUIT $MAINPID
  12. PrivateTmp=true
  13. [Install]
  14. WantedBy=multi-user.target
  15. # ====== MySQL 服务 ======
  16. [Unit]
  17. Description=MySQL Server
  18. After=network.target
  19. [Service]
  20. Type=notify
  21. User=mysql
  22. Group=mysql
  23. ExecStart=/usr/sbin/mysqld
  24. LimitNOFILE=65536
  25. Restart=on-failure
  26. [Install]
  27. WantedBy=multi-user.target
  28. # ====== Java 应用服务 ======
  29. [Unit]
  30. Description=My Java Application
  31. After=network.target
  32. [Service]
  33. Type=simple
  34. User=app
  35. Group=app
  36. WorkingDirectory=/opt/myapp
  37. ExecStart=/usr/bin/java -Xms512m -Xmx1024m -jar app.jar
  38. ExecStop=/bin/kill -TERM $MAINPID
  39. Restart=on-failure
  40. RestartSec=10
  41. Environment=SPRING_PROFILES_ACTIVE=prod
  42. [Install]
  43. WantedBy=multi-user.target
复制代码

7.2.5 Timer 定时器

  1. # systemd Timer 替代 crontab
  2. # /etc/systemd/system/backup.timer
  3. [Unit]
  4. Description=Daily backup timer
  5. [Timer]
  6. OnCalendar=*-*-* 02:00:00 # 每天凌晨 2 点
  7. Persistent=true # 错过的任务会补执行
  8. RandomizedDelaySec=300 # 随机延迟 0-300 秒
  9. [Install]
  10. WantedBy=timers.target
  11. # /etc/systemd/system/backup.service
  12. [Unit]
  13. Description=Daily backup
  14. [Service]
  15. Type=oneshot
  16. ExecStart=/opt/scripts/backup.sh
  17. User=root
  18. # 启用定时器
  19. systemctl enable backup.timer
  20. systemctl start backup.timer
  21. # 查看定时器状态
  22. systemctl list-timers
  23. systemctl status backup.timer
复制代码

7.2.6 Target 目标

  1. # Target 是一组 Unit 的集合
  2. # 常用 Target
  3. # multi-user.target:多用户模式(命令行)
  4. # graphical.target:图形界面模式
  5. # rescue.target:救援模式
  6. # emergency.target:紧急模式
  7. # 查看当前 Target
  8. systemctl get-default
  9. # 设置默认 Target
  10. systemctl set-default multi-user.target
  11. systemctl set-default graphical.target
  12. # 切换 Target
  13. systemctl isolate multi-user.target
  14. systemctl isolate graphical.target
  15. # 进入救援模式
  16. systemctl rescue
复制代码

7.3 进程监控实战

  1. # 场景 1:查找占用 CPU 最高的进程
  2. ps aux --sort=-%cpu | head -10
  3. # 场景 2:查找占用内存最高的进程
  4. ps aux --sort=-%mem | head -10
  5. # 场景 3:查找指定端口的进程
  6. ss -tlnp | grep :80
  7. lsof -i :80
  8. # 场景 4:查看进程打开的文件
  9. lsof -p PID
  10. lsof -p PID | wc -l # 统计打开的文件数
  11. # 场景 5:查看进程的网络连接
  12. ss -antp | grep PID
  13. netstat -antp | grep PID
  14. # 场景 6:跟踪进程系统调用
  15. strace -p PID # 跟踪系统调用
  16. strace -p PID -e trace=file # 只跟踪文件相关调用
  17. strace -p PID -e trace=network # 只跟踪网络相关调用
  18. # 场景 7:查看进程的内存映射
  19. pmap PID
  20. cat /proc/PID/maps
  21. # 场景 8:查看进程的环境变量
  22. cat /proc/PID/environ | tr '\0' '\n'
复制代码

第七部分总结

章节核心内容
进程概念进程状态、父子关系、僵尸进程
ps 命令aux、-ef、自定义输出、状态解析
top 命令实时监控、负载、CPU/内存使用
进程信号SIGTERM、SIGKILL、SIGHUP、信号发送
前后台作业jobs、fg、bg、nohup、screen/tmux
systemdsystemctl 操作、Service 文件、Timer、Target

第八部分:网络管理

🎯 生活类比:Linux 网络就像"高速公路系统"——

  • IP 地址是"门牌号"
  • 端口是"房间号"
  • 防火墙是"门卫"
  • 路由是"导航系统"

8.1 网络基础

8.1.1 网络概念

  1. IP 地址:
  2. - IPv4:192.168.1.100(32位,4组数字)
  3. - IPv6:2001:db8::1(128位)
  4. - 公网 IP:全球唯一
  5. - 私网 IP:局域网内使用(10.x.x.x、172.16-31.x.x、192.168.x.x)
  6. 端口:
  7. - 范围:0-65535
  8. - 0-1023:系统端口(需要 root 权限)
  9. - 1024-49151:注册端口
  10. - 49152-65535:动态端口
  11. 常用端口:
  12. - 22:SSH
  13. - 80:HTTP
  14. - 443:HTTPS
  15. - 3306:MySQL
  16. - 6379:Redis
  17. - 8080:Tomcat
  18. 子网掩码:
  19. - 255.255.255.0(/24):254 个可用 IP
  20. - 255.255.0.0(/16):65534 个可用 IP
  21. - 255.0.0.0(/8):16777214 个可用 IP
  22. 默认网关:
  23. - 路由器的 IP 地址
  24. - 用于访问其他网络
复制代码

8.1.2 网络配置文件

  1. # CentOS/RHEL 网卡配置
  2. /etc/sysconfig/network-scripts/ifcfg-eth0
  3. # 配置示例
  4. TYPE=Ethernet
  5. BOOTPROTO=static # static=静态IP,dhcp=动态IP
  6. NAME=eth0
  7. DEVICE=eth0
  8. ONBOOT=yes # 开机启动
  9. IPADDR=192.168.1.100 # IP 地址
  10. NETMASK=255.255.255.0 # 子网掩码
  11. GATEWAY=192.168.1.1 # 网关
  12. DNS1=8.8.8.8 # DNS 服务器
  13. DNS2=8.8.4.4
  14. # Ubuntu 网卡配置(netplan)
  15. /etc/netplan/00-installer-config.yaml
  16. # 配置示例
  17. network:
  18. version: 2
  19. ethernets:
  20. eth0:
  21. dhcp4: no
  22. addresses:
  23. - 192.168.1.100/24
  24. gateway4: 192.168.1.1
  25. nameservers:
  26. addresses: [8.8.8.8, 8.8.4.4]
  27. # DNS 配置
  28. /etc/resolv.conf
  29. nameserver 8.8.8.8
  30. nameserver 8.8.4.4
  31. # 主机名配置
  32. /etc/hostname
  33. hostnamectl set-hostname myserver
  34. # hosts 文件
  35. /etc/hosts
  36. 192.168.1.100 myserver
复制代码

8.2 网络命令详解

8.2.1 ip 命令

  1. # ip 命令(替代 ifconfig)
  2. # 查看 IP 地址
  3. ip addr # 查看所有网卡
  4. ip addr show # 同上
  5. ip addr show eth0 # 查看指定网卡
  6. ip -4 addr # 只显示 IPv4
  7. ip -6 addr # 只显示 IPv6
  8. # 查看路由
  9. ip route # 查看路由表
  10. ip route show # 同上
  11. ip route get 8.8.8.8 # 查看到达指定 IP 的路由
  12. # 网卡操作
  13. ip link show # 查看网卡状态
  14. ip link set eth0 up # 启用网卡
  15. ip link set eth0 down # 禁用网卡
  16. # 临时添加 IP
  17. ip addr add 192.168.1.200/24 dev eth0
  18. ip addr del 192.168.1.200/24 dev eth0
  19. # 添加路由
  20. ip route add 10.0.0.0/8 via 192.168.1.1
  21. ip route del 10.0.0.0/8
  22. # 邻居表(ARP)
  23. ip neigh # 查看 ARP 表
复制代码

8.2.2 ss 命令

  1. # ss 命令(替代 netstat)
  2. # 查看监听端口
  3. ss -tlnp # TCP 监听端口
  4. ss -ulnp # UDP 监听端口
  5. ss -tlnp | grep :80 # 查看 80 端口
  6. # 查看所有连接
  7. ss -antp # 所有 TCP 连接
  8. ss -s # 连接统计
  9. # 查看指定状态的连接
  10. ss -t state established # 已建立的连接
  11. ss -t state time-wait # TIME_WAIT 状态
  12. ss -t state close-wait # CLOSE_WAIT 状态
  13. # 查看指定进程的连接
  14. ss -antp | grep PID
  15. ss -antp | grep nginx
  16. # 输出解析
  17. # State Recv-Q Send-Q Local Address:Port Peer Address:Port
  18. # LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
  19. # State:连接状态
  20. # Recv-Q:接收队列
  21. # Send-Q:发送队列
  22. # Local Address:Port:本地地址和端口
  23. # Peer Address:Port:远程地址和端口
复制代码

8.2.3 ping 和 traceroute

  1. # ping 测试连通性
  2. ping 8.8.8.8 # 持续 ping
  3. ping -c 4 8.8.8.8 # 只 ping 4 次
  4. ping -i 0.5 8.8.8.8 # 每 0.5 秒 ping 一次
  5. ping -s 1024 8.8.8.8 # 指定包大小
  6. ping -W 2 8.8.8.8 # 超时 2 秒
  7. # traceroute 追踪路由
  8. traceroute 8.8.8.8 # 追踪到目标的路由
  9. traceroute -n 8.8.8.8 # 不解析主机名(更快)
  10. traceroute -I 8.8.8.8 # 使用 ICMP
  11. traceroute -T 8.8.8.8 # 使用 TCP
  12. # mtr(更好的追踪工具)
  13. mtr 8.8.8.8 # 实时追踪路由
  14. mtr -n 8.8.8.8 # 不解析主机名
复制代码

8.2.4 DNS 查询

  1. # nslookup
  2. nslookup example.com # 查询 A 记录
  3. nslookup -type=MX example.com # 查询 MX 记录
  4. nslookup example.com 8.8.8.8 # 指定 DNS 服务器
  5. # dig(更详细)
  6. dig example.com # 查询 A 记录
  7. dig example.com MX # 查询 MX 记录
  8. dig example.com @8.8.8.8 # 指定 DNS 服务器
  9. dig +short example.com # 只显示 IP
  10. dig -x 8.8.8.8 # 反向查询
  11. # host
  12. host example.com # 查询 A 记录
  13. host -t MX example.com # 查询 MX 记录
复制代码

8.2.5 curl 和 wget

  1. # curl(HTTP 请求工具)
  2. # GET 请求
  3. curl https://example.com
  4. curl -o file.html https://example.com # 保存到文件
  5. curl -O https://example.com/file.zip # 保存文件(使用原文件名)
  6. # POST 请求
  7. curl -X POST -d "name=value" https://api.example.com
  8. curl -X POST -H "Content-Type: application/json" -d '{"name":"value"}' https://api.example.com
  9. # 常用选项
  10. curl -v https://example.com # 显示详细信息
  11. curl -k https://example.com # 忽略 SSL 证书
  12. curl -L https://example.com # 跟随重定向
  13. curl -u user:pass https://example.com # 基本认证
  14. curl -H "Header: value" https://example.com # 自定义请求头
  15. # wget(下载工具)
  16. # 下载文件
  17. wget https://example.com/file.zip
  18. wget -O newname.zip https://example.com/file.zip # 指定文件名
  19. # 断点续传
  20. wget -c https://example.com/largefile.zip
  21. # 后台下载
  22. wget -b https://example.com/largefile.zip
  23. # 下载整个网站
  24. wget -r -np -k https://example.com
复制代码

8.3 防火墙

8.3.1 firewalld

  1. # firewalld(CentOS 7+ 默认)
  2. # 基本操作
  3. systemctl status firewalld # 查看状态
  4. systemctl start firewalld # 启动
  5. systemctl stop firewalld # 停止
  6. systemctl enable firewalld # 开机启动
  7. # 区域(Zone)
  8. firewall-cmd --get-zones # 列出所有区域
  9. firewall-cmd --get-default-zone # 查看默认区域
  10. firewall-cmd --set-default-zone=public # 设置默认区域
  11. # 常用区域
  12. # trusted:允许所有
  13. # home:允许大部分
  14. # public:默认,只允许选定的服务
  15. # block:拒绝所有
  16. # drop:丢弃所有
  17. # 服务管理
  18. firewall-cmd --list-services # 列出允许的服务
  19. firewall-cmd --add-service=http # 允许 HTTP(临时)
  20. firewall-cmd --permanent --add-service=http # 允许 HTTP(永久)
  21. firewall-cmd --remove-service=http # 移除 HTTP
  22. # 端口管理
  23. firewall-cmd --list-ports # 列出允许的端口
  24. firewall-cmd --add-port=8080/tcp # 开放端口(临时)
  25. firewall-cmd --permanent --add-port=8080/tcp # 开放端口(永久)
  26. firewall-cmd --remove-port=8080/tcp # 关闭端口
  27. # 重新加载配置
  28. firewall-cmd --reload
  29. # 端口转发
  30. firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
  31. firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
  32. # 查看规则
  33. firewall-cmd --list-all # 列出所有规则
  34. firewall-cmd --list-all --zone=public # 列出指定区域的规则
复制代码

8.3.2 iptables

  1. # iptables(底层防火墙工具)
  2. # 查看规则
  3. iptables -L # 列出规则
  4. iptables -L -n # 不解析主机名
  5. iptables -L -v # 显示详细信息
  6. iptables -L --line-numbers # 显示行号
  7. # 链(Chain)
  8. # INPUT:入站流量
  9. # OUTPUT:出站流量
  10. # FORWARD:转发流量
  11. # 规则操作
  12. # ACCEPT:允许
  13. # DROP:丢弃
  14. # REJECT:拒绝
  15. # 添加规则
  16. iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许 80 端口
  17. iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT # 允许指定网段
  18. iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许已建立的连接
  19. # 插入规则
  20. iptables -I INPUT 1 -p tcp --dport 443 -j ACCEPT # 在第 1 行插入
  21. # 删除规则
  22. iptables -D INPUT -p tcp --dport 80 -j ACCEPT # 删除规则
  23. iptables -D INPUT 1 # 删除第 1 行规则
  24. # 清空规则
  25. iptables -F # 清空所有规则
  26. # 保存规则
  27. service iptables save # CentOS 6
  28. iptables-save > /etc/iptables/rules.v4 # 保存到文件
  29. # 恢复规则
  30. iptables-restore < /etc/iptables/rules.v4
  31. # 常见配置示例
  32. # 允许 SSH
  33. iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  34. # 允许 HTTP/HTTPS
  35. iptables -A INPUT -p tcp --dport 80 -j ACCEPT
  36. iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  37. # 允许本地回环
  38. iptables -A INPUT -i lo -j ACCEPT
  39. # 允许已建立的连接
  40. iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  41. # 拒绝其他所有入站
  42. iptables -P INPUT DROP
  43. # 允许所有出站
  44. iptables -P OUTPUT ACCEPT
复制代码

8.4 SSH 配置详解

8.4.1 SSH 基础配置

  1. # SSH 配置文件
  2. /etc/ssh/sshd_config
  3. # 常用配置项
  4. Port 2222 # 修改端口(安全)
  5. PermitRootLogin no # 禁止 root 登录
  6. PasswordAuthentication no # 禁止密码登录(只允许密钥)
  7. PubkeyAuthentication yes # 允许密钥登录
  8. MaxAuthTries 3 # 最大尝试次数
  9. ClientAliveInterval 60 # 心跳间隔(秒)
  10. ClientAliveCountMax 3 # 最大心跳次数
  11. AllowUsers user1 user2 # 只允许指定用户登录
  12. DenyUsers user3 # 禁止指定用户登录
  13. # 重启 SSH 服务
  14. systemctl restart sshd
  15. # 测试配置
  16. sshd -t # 测试配置文件语法
复制代码

8.4.2 SSH 免密登录

  1. # 1. 生成密钥对(在客户端执行)
  2. ssh-keygen -t rsa -b 4096
  3. # 或
  4. ssh-keygen -t ed25519 # 推荐,更安全
  5. # 2. 复制公钥到服务器
  6. ssh-copy-id user@server
  7. # 或手动复制
  8. cat ~/.ssh/id_rsa.pub | ssh user@server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
  9. # 3. 设置权限(重要!)
  10. chmod 700 ~/.ssh
  11. chmod 600 ~/.ssh/authorized_keys
  12. # 4. 测试免密登录
  13. ssh user@server
  14. # SSH 配置文件(客户端)
  15. ~/.ssh/config
  16. Host myserver
  17. HostName 192.168.1.100
  18. User user1
  19. Port 2222
  20. IdentityFile ~/.ssh/id_rsa
  21. # 使用
  22. ssh myserver # 等同于 ssh -p 2222 user1@192.168.1.100
复制代码

8.4.3 文件传输

  1. # scp(安全复制)
  2. scp file user@host:/path/ # 上传文件
  3. scp user@host:/path/file . # 下载文件
  4. scp -r dir user@host:/path/ # 上传目录
  5. scp -P 2222 file user@host:/path/ # 指定端口
  6. # rsync(增量同步)
  7. rsync -avz file user@host:/path/ # 同步文件
  8. rsync -avz dir/ user@host:/path/ # 同步目录(注意尾部 /)
  9. rsync -avz --delete dir/ user@host:/path/ # 同步并删除目标多余文件
  10. rsync -avz -e "ssh -p 2222" dir/ user@host:/path/ # 指定端口
  11. # sftp(安全 FTP)
  12. sftp user@host
  13. # sftp 命令:
  14. # ls:列出远程文件
  15. # lls:列出本地文件
  16. # cd:切换远程目录
  17. # lcd:切换本地目录
  18. # put file:上传文件
  19. # get file:下载文件
  20. # mkdir:创建远程目录
  21. # quit:退出
复制代码

8.5 网络故障排查

  1. # 排查流程:
  2. # 1. 检查本机网络
  3. # 2. 检查网关
  4. # 3. 检查 DNS
  5. # 4. 检查远程服务
  6. # 1. 检查本机网络
  7. ip addr show # 查看 IP 是否配置
  8. ip link show eth0 # 查看网卡是否启用
  9. ping 127.0.0.1 # 测试本地回环
  10. # 2. 检查网关
  11. ip route show # 查看路由表
  12. ping 192.168.1.1 # ping 网关
  13. # 3. 检查 DNS
  14. cat /etc/resolv.conf # 查看 DNS 配置
  15. nslookup example.com # 测试 DNS 解析
  16. ping 8.8.8.8 # 测试外网连通性
  17. # 4. 检查远程服务
  18. telnet 192.168.1.100 80 # 测试端口连通
  19. curl -v http://192.168.1.100 # 测试 HTTP 服务
  20. traceroute 8.8.8.8 # 追踪路由
  21. # 5. 检查防火墙
  22. iptables -L -n # 查看 iptables 规则
  23. firewall-cmd --list-all # 查看 firewalld 规则
  24. # 6. 检查网络连接
  25. ss -antp # 查看所有连接
  26. ss -s # 连接统计
  27. # 7. 抓包分析
  28. tcpdump -i eth0 port 80 # 抓取 80 端口的包
  29. tcpdump -i eth0 host 192.168.1.100 # 抓取指定主机的包
  30. tcpdump -i eth0 -w capture.pcap # 保存到文件
复制代码

第八部分总结

章节核心内容
网络基础IP、端口、子网掩码、网关、DNS
网络配置CentOS ifcfg、Ubuntu netplan、DNS、hosts
ip 命令查看 IP、路由、网卡状态
ss 命令查看端口、连接、状态
ping/traceroute连通性测试、路由追踪
DNS 查询nslookup、dig、host
curl/wgetHTTP 请求、文件下载
firewalld区域、服务、端口管理
iptables规则、链、操作
SSH配置、免密登录、scp/rsync
故障排查7 步排查流程

第九部分:软件包管理

🎯 生活类比:软件包管理就像"手机应用商店"——

  • RPM/APK 是"安装包"(单个应用)
  • YUM/APT 是"应用商店"(自动解决依赖)
  • 源(Repository)是"应用商店的服务器"

9.1 RPM 包管理

  1. # RPM(Red Hat Package Manager):底层包管理工具
  2. # 安装
  3. rpm -ivh package.rpm # 安装(i=install, v=verbose, h=hash)
  4. rpm -Uvh package.rpm # 升级(如果未安装则安装)
  5. rpm -Fvh package.rpm # 升级(如果未安装则不安装)
  6. # 卸载
  7. rpm -e package # 卸载
  8. rpm -e --nodeps package # 卸载(忽略依赖,危险!)
  9. # 查询
  10. rpm -qa # 列出所有已安装的包
  11. rpm -qa | grep nginx # 查找特定包
  12. rpm -qi nginx # 查看包信息
  13. rpm -ql nginx # 列出包安装的文件
  14. rpm -qc nginx # 列出包的配置文件
  15. rpm -qf /usr/sbin/nginx # 查看文件属于哪个包
  16. rpm -qf $(which nginx) # 查看命令属于哪个包
  17. # 验证
  18. rpm -V nginx # 验证包是否被修改
复制代码

9.2 YUM/DNF 包管理

  1. # YUM(Yellowdog Updater Modified):高层包管理工具,自动解决依赖
  2. # 安装
  3. yum install nginx # 安装
  4. yum install -y nginx # 安装(不询问确认)
  5. yum install nginx-1.20.1 # 安装指定版本
  6. # 卸载
  7. yum remove nginx # 卸载
  8. yum erase nginx # 同上
  9. # 更新
  10. yum update nginx # 更新指定包
  11. yum update # 更新所有包
  12. yum check-update # 检查可更新的包
  13. # 搜索
  14. yum search nginx # 搜索包
  15. yum info nginx # 查看包信息
  16. yum list available # 列出可用的包
  17. yum list installed # 列出已安装的包
  18. yum list updates # 列出可更新的包
  19. # 缓存
  20. yum clean all # 清理所有缓存
  21. yum makecache # 生成缓存
  22. # 历史
  23. yum history # 查看操作历史
  24. yum history undo 1 # 撤销第 1 次操作
  25. # 仓库
  26. yum repolist # 列出仓库
  27. yum repolist all # 列出所有仓库(包括禁用的)
  28. # 组
  29. yum grouplist # 列出软件包组
  30. yum groupinstall "Development Tools" # 安装软件包组
复制代码

9.3 配置 YUM 源

  1. # 备份原配置
  2. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
  3. # 下载阿里云源(CentOS 7)
  4. wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
  5. # 下载阿里云源(CentOS 8/Rocky)
  6. wget -O /etc/yum.repos.d/Rocky-Base.repo https://mirrors.aliyun.com/repo/Rocky-Base.repo
  7. # 生成缓存
  8. yum clean all
  9. yum makecache
  10. # 添加 EPEL 源(Extra Packages for Enterprise Linux)
  11. yum install -y epel-release
  12. # 添加第三方仓库
  13. yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
复制代码

9.4 APT 包管理(Debian/Ubuntu)

  1. # APT(Advanced Package Tool):Debian/Ubuntu 的包管理工具
  2. # 更新索引
  3. apt update # 更新包索引(必须先执行)
  4. # 安装
  5. apt install nginx # 安装
  6. apt install -y nginx # 安装(不询问确认)
  7. apt install nginx=1.18.0 # 安装指定版本
  8. # 卸载
  9. apt remove nginx # 卸载(保留配置)
  10. apt purge nginx # 卸载并删除配置
  11. apt autoremove # 清理不需要的依赖
  12. # 更新
  13. apt upgrade # 更新所有包
  14. apt full-upgrade # 更新所有包(可能删除旧包)
  15. # 搜索
  16. apt search nginx # 搜索包
  17. apt show nginx # 查看包信息
  18. apt list --installed # 列出已安装的包
  19. apt list --upgradable # 列出可更新的包
  20. # 清理
  21. apt clean # 清理下载的包
  22. apt autoclean # 清理旧版本的包
  23. # 配置源
  24. /etc/apt/sources.list
  25. # 添加 PPA(个人包归档)
  26. add-apt-repository ppa:ondrej/php
  27. apt update
复制代码

9.5 源码编译安装

  1. # 源码编译三部曲:configure → make → make install
  2. # 1. 安装编译工具
  3. yum groupinstall "Development Tools" -y # CentOS
  4. apt install build-essential -y # Ubuntu
  5. # 2. 下载源码
  6. wget https://example.com/software-1.0.tar.gz
  7. # 3. 解压
  8. tar -xzvf software-1.0.tar.gz
  9. cd software-1.0
  10. # 4. 配置(检查依赖、设置安装路径)
  11. ./configure --prefix=/usr/local/software
  12. # 5. 编译
  13. make -j4 # 使用 4 个核心编译
  14. # 6. 安装
  15. make install
  16. # 7. 配置环境变量
  17. echo 'export PATH=/usr/local/software/bin:$PATH' >> /etc/profile
  18. source /etc/profile
复制代码

第九部分总结

章节核心内容
RPM底层包管理,安装/卸载/查询
YUM/DNF高层包管理,自动解决依赖
YUM 源配置阿里云源、EPEL 源
APTDebian/Ubuntu 包管理
源码编译configure → make → make install

第十部分:常见服务搭建

🎯 实战目标:掌握 Nginx、MySQL、Redis、Docker 的安装和配置


10.1 Nginx

10.1.1 安装

  1. # CentOS
  2. yum install -y epel-release
  3. yum install -y nginx
  4. # Ubuntu
  5. apt update
  6. apt install -y nginx
  7. # 启动
  8. systemctl start nginx
  9. systemctl enable nginx
  10. # 验证
  11. curl http://localhost
复制代码

10.1.2 配置文件

  1. # /etc/nginx/nginx.conf
  2. user nginx; # 运行用户
  3. worker_processes auto; # 工作进程数(auto = CPU 核心数)
  4. error_log /var/log/nginx/error.log; # 错误日志
  5. pid /run/nginx.pid; # PID 文件
  6. events {
  7. worker_connections 1024; # 每个进程的最大连接数
  8. }
  9. http {
  10. include /etc/nginx/mime.types;
  11. default_type application/octet-stream;
  12. # 日志格式
  13. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  14. '$status $body_bytes_sent "$http_referer" '
  15. '"$http_user_agent"';
  16. access_log /var/log/nginx/access.log main;
  17. sendfile on;
  18. keepalive_timeout 65;
  19. # 包含其他配置文件
  20. include /etc/nginx/conf.d/*.conf;
  21. }
复制代码

10.1.3 虚拟主机

  1. # /etc/nginx/conf.d/example.conf
  2. server {
  3. listen 80;
  4. server_name example.com www.example.com;
  5. root /var/www/example;
  6. index index.html index.htm;
  7. # 日志
  8. access_log /var/log/nginx/example.access.log;
  9. error_log /var/log/nginx/example.error.log;
  10. # 静态文件
  11. location / {
  12. try_files $uri $uri/ /index.html;
  13. }
  14. # 缓存静态资源
  15. location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
  16. expires 1y;
  17. add_header Cache-Control "public, immutable";
  18. }
  19. }
复制代码

10.1.4 反向代理

  1. # API 反向代理
  2. server {
  3. listen 80;
  4. server_name api.example.com;
  5. location / {
  6. proxy_pass http://127.0.0.1:8080;
  7. proxy_set_header Host $host;
  8. proxy_set_header X-Real-IP $remote_addr;
  9. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  10. proxy_set_header X-Forwarded-Proto $scheme;
  11. }
  12. }
  13. # WebSocket 代理
  14. server {
  15. listen 80;
  16. server_name ws.example.com;
  17. location /ws {
  18. proxy_pass http://127.0.0.1:8080;
  19. proxy_http_version 1.1;
  20. proxy_set_header Upgrade $http_upgrade;
  21. proxy_set_header Connection "upgrade";
  22. }
  23. }
  24. # 负载均衡
  25. upstream backend {
  26. server 192.168.1.101:8080 weight=3;
  27. server 192.168.1.102:8080 weight=2;
  28. server 192.168.1.103:8080 weight=1;
  29. }
  30. server {
  31. listen 80;
  32. server_name api.example.com;
  33. location / {
  34. proxy_pass http://backend;
  35. }
  36. }
复制代码

10.1.5 HTTPS 配置

  1. server {
  2. listen 443 ssl;
  3. server_name example.com;
  4. ssl_certificate /etc/nginx/ssl/cert.pem;
  5. ssl_certificate_key /etc/nginx/ssl/key.pem;
  6. ssl_protocols TLSv1.2 TLSv1.3;
  7. ssl_ciphers HIGH:!aNULL:!MD5;
  8. # HTTP 跳转 HTTPS
  9. # 在 80 端口的 server 中添加:
  10. # return 301 https://$server_name$request_uri;
  11. }
  12. # 使用 Let's Encrypt 免费证书
  13. # 安装 certbot
  14. yum install -y certbot python3-certbot-nginx # CentOS
  15. apt install -y certbot python3-certbot-nginx # Ubuntu
  16. # 获取证书
  17. certbot --nginx -d example.com -d www.example.com
  18. # 自动续期
  19. certbot renew --dry-run
复制代码

10.2 MySQL

10.2.1 安装

  1. # CentOS 7
  2. yum install -y mysql-server
  3. systemctl start mysqld
  4. systemctl enable mysqld
  5. # CentOS 8 / Rocky Linux
  6. dnf install -y mysql-server
  7. systemctl start mysqld
  8. systemctl enable mysqld
  9. # Ubuntu
  10. apt install -y mysql-server
  11. systemctl start mysql
  12. systemctl enable mysql
  13. # 获取临时密码(CentOS 7)
  14. grep 'temporary password' /var/log/mysqld.log
  15. # 安全初始化
  16. mysql_secure_installation
  17. # - 设置 root 密码
  18. # - 删除匿名用户
  19. # - 禁止 root 远程登录
  20. # - 删除测试数据库
复制代码

10.2.2 用户管理

  1. -- 创建用户
  2. CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password';
  3. CREATE USER 'user1'@'%' IDENTIFIED BY 'password'; -- 允许远程连接
  4. -- 授权
  5. GRANT ALL PRIVILEGES ON mydb.* TO 'user1'@'%';
  6. GRANT SELECT, INSERT ON mydb.* TO 'user1'@'%';
  7. GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
  8. -- 刷新权限
  9. FLUSH PRIVILEGES;
  10. -- 查看权限
  11. SHOW GRANTS FOR 'user1'@'%';
  12. -- 撤销权限
  13. REVOKE ALL PRIVILEGES ON mydb.* FROM 'user1'@'%';
  14. -- 删除用户
  15. DROP USER 'user1'@'%';
  16. -- 修改密码
  17. ALTER USER 'user1'@'%' IDENTIFIED BY 'new_password';
复制代码

10.2.3 备份恢复

  1. # 备份
  2. mysqldump -u root -p mydb > backup.sql
  3. mysqldump -u root -p --all-databases > all_backup.sql
  4. mysqldump -u root -p mydb table1 table2 > tables_backup.sql
  5. # 恢复
  6. mysql -u root -p mydb < backup.sql
  7. # 定时备份
  8. # /etc/cron.d/mysql-backup
  9. 0 2 * * * root mysqldump -u root -p'password' mydb | gzip > /backup/mydb_$(date +\%Y\%m\%d).sql.gz
复制代码

10.3 Redis

10.3.1 安装

  1. # CentOS
  2. yum install -y epel-release
  3. yum install -y redis
  4. systemctl start redis
  5. systemctl enable redis
  6. # Ubuntu
  7. apt install -y redis-server
  8. systemctl start redis
  9. systemctl enable redis
  10. # 源码安装
  11. wget https://download.redis.io/redis-stable.tar.gz
  12. tar -xzvf redis-stable.tar.gz
  13. cd redis-stable
  14. make
  15. make install
复制代码

10.3.2 配置

  1. # /etc/redis/redis.conf
  2. # 绑定地址
  3. bind 127.0.0.1 # 只允许本地连接
  4. # bind 0.0.0.0 # 允许所有连接
  5. # 端口
  6. port 6379
  7. # 密码
  8. requirepass your_password
  9. # 持久化
  10. save 900 1 # 900 秒内有 1 个 key 变化,就快照
  11. save 300 10 # 300 秒内有 10 个 key 变化,就快照
  12. save 60 10000 # 60 秒内有 10000 个 key 变化,就快照
  13. # AOF 持久化
  14. appendonly yes
  15. appendfsync everysec
  16. # 内存
  17. maxmemory 256mb
  18. maxmemory-policy allkeys-lru
复制代码

10.4 Docker

10.4.1 安装

  1. # CentOS
  2. yum install -y yum-utils
  3. yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  4. yum install -y docker-ce docker-ce-cli containerd.io
  5. # Ubuntu
  6. apt install -y apt-transport-https ca-certificates curl software-properties-common
  7. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
  8. add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  9. apt update
  10. apt install -y docker-ce
  11. # 启动
  12. systemctl start docker
  13. systemctl enable docker
  14. # 配置镜像加速
  15. cat > /etc/docker/daemon.json <<EOF
  16. {
  17. "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
  18. }
  19. EOF
  20. systemctl daemon-reload
  21. systemctl restart docker
复制代码

10.4.2 镜像操作

  1. docker pull nginx # 拉取镜像
  2. docker images # 列出镜像
  3. docker rmi nginx # 删除镜像
  4. docker image prune # 清理无用镜像
  5. docker save nginx > nginx.tar # 导出镜像
  6. docker load < nginx.tar # 导入镜像
  7. docker tag nginx mynginx:v1 # 打标签
复制代码

10.4.3 容器操作

  1. # 运行容器
  2. docker run -d --name mynginx -p 80:80 nginx
  3. # 参数说明
  4. # -d:后台运行
  5. # --name:容器名称
  6. # -p 80:80:端口映射(宿主机:容器)
  7. # -v /data:/data:目录挂载
  8. # -e MYSQL_ROOT_PASSWORD=123456:环境变量
  9. # --restart=always:自动重启
  10. # 容器管理
  11. docker ps # 查看运行中的容器
  12. docker ps -a # 查看所有容器
  13. docker stop mynginx # 停止容器
  14. docker start mynginx # 启动容器
  15. docker restart mynginx # 重启容器
  16. docker rm mynginx # 删除容器
  17. docker rm -f mynginx # 强制删除
  18. # 查看日志
  19. docker logs mynginx
  20. docker logs -f mynginx # 实时查看
  21. docker logs --tail 100 mynginx # 查看最后 100 行
  22. # 进入容器
  23. docker exec -it mynginx bash
  24. docker exec -it mynginx sh
  25. # 查看容器信息
  26. docker inspect mynginx
  27. docker stats # 实时查看资源使用
复制代码

10.4.4 Docker Compose

  1. # docker-compose.yml
  2. version: '3.8'
  3. services:
  4. nginx:
  5. image: nginx
  6. ports:
  7. - "80:80"
  8. volumes:
  9. - ./html:/usr/share/nginx/html
  10. depends_on:
  11. - app
  12. app:
  13. image: myapp:v1
  14. ports:
  15. - "8080:8080"
  16. environment:
  17. - SPRING_PROFILES_ACTIVE=prod
  18. depends_on:
  19. - db
  20. db:
  21. image: mysql:8.0
  22. environment:
  23. MYSQL_ROOT_PASSWORD: 123456
  24. MYSQL_DATABASE: mydb
  25. volumes:
  26. - mysql-data:/var/lib/mysql
  27. ports:
  28. - "3306:3306"
  29. redis:
  30. image: redis:7-alpine
  31. ports:
  32. - "6379:6379"
  33. volumes:
  34. mysql-data:
复制代码
  1. # 常用命令
  2. docker-compose up -d # 启动所有服务
  3. docker-compose down # 停止所有服务
  4. docker-compose ps # 查看服务状态
  5. docker-compose logs -f # 查看日志
  6. docker-compose restart # 重启所有服务
  7. docker-compose build # 重新构建镜像
复制代码

第十部分总结

章节核心内容
Nginx虚拟主机、反向代理、负载均衡、HTTPS
MySQL安装、用户管理、备份恢复
Redis安装配置、持久化、内存管理
Docker镜像操作、容器管理、Compose 编排

第十一部分:性能监控与调优

🎯 生活类比:性能监控就像"汽车仪表盘"——

  • 速度表(CPU 使用率)
  • 油表(内存使用率)
  • 转速表(磁盘 IO)
  • 里程表(网络流量)

11.1 监控命令详解

11.1.1 系统负载

  1. # uptime:查看系统负载
  2. uptime
  3. # 14:30:00 up 10 days, 3:20, 2 users, load average: 0.50, 0.40, 0.35
  4. # load average 解读:
  5. # 1 分钟、5 分钟、15 分钟的平均负载
  6. # - 等于 CPU 核心数:满载
  7. # - 大于 CPU 核心数:超载
  8. # - 小于 CPU 核心数:正常
  9. # 查看 CPU 核心数
  10. nproc
  11. # 或
  12. lscpu | grep "^CPU(s):"
复制代码

11.1.2 内存监控

  1. # free:查看内存使用
  2. free -h
  3. # total used free shared buff/cache available
  4. # Mem: 15Gi 4.0Gi 8.0Gi 256Mi 3.0Gi 10Gi
  5. # Swap: 2.0Gi 0B 2.0Gi
  6. # 解读:
  7. # total:总内存
  8. # used:已使用(不包括 buff/cache)
  9. # free:空闲内存
  10. # shared:共享内存
  11. # buff/cache:缓冲/缓存
  12. # available:可用内存(free + buff/cache 中可回收的部分)
  13. # 关键指标:
  14. # - available 低 → 内存不足
  15. # - Swap 使用高 → 内存不足,正在使用交换分区
复制代码

11.1.3 CPU 监控

  1. # top:实时查看 CPU 使用
  2. # %Cpu(s): 5.0 us, 2.0 sy, 0.0 ni, 92.0 id, 0.5 wa, 0.0 hi, 0.5 si, 0.0 st
  3. # 解读:
  4. # us:用户空间(应用程序)
  5. # sy:内核空间(系统调用)
  6. # ni:调整过优先级的进程
  7. # id:空闲
  8. # wa:等待 IO
  9. # hi:硬件中断
  10. # si:软件中断
  11. # st:虚拟机偷取的时间
  12. # vmstat:系统状态监控
  13. vmstat 1 10 # 每秒采样 10 次
  14. # procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
  15. # r b swpd free buff cache si so bi bo in cs us sy id wa st
  16. # 1 0 0 8000000 200000 3000000 0 0 0 0 100 200 5 2 92 0 0
  17. # 关键指标:
  18. # r:运行队列长度(大于 CPU 核心数表示 CPU 不足)
  19. # b:等待 IO 的进程数
  20. # si/so:交换分区换入/换出(大于 0 表示内存不足)
  21. # bi/bo:磁盘读写(大表示 IO 繁忙)
复制代码

11.1.4 磁盘监控

  1. # df:查看磁盘使用
  2. df -h
  3. # Filesystem Size Used Avail Use% Mounted on
  4. # /dev/sda1 50G 20G 28G 42% /
  5. # du:查看目录大小
  6. du -sh /var/log # 查看目录总大小
  7. du -sh /var/log/* # 查看子目录大小
  8. du -sh /var/log/* | sort -rh # 按大小排序
  9. # iostat:磁盘 IO 监控
  10. iostat -x 1 10
  11. # Device r/s w/s rkB/s wkB/s await %util
  12. # sda 10.00 20.00 400 800 5.00 30.00
  13. # 解读:
  14. # r/s:每秒读次数
  15. # w/s:每秒写次数
  16. # rkB/s:每秒读取 KB
  17. # wkB/s:每秒写入 KB
  18. # await:平均 IO 等待时间(毫秒)
  19. # %util:磁盘使用率(接近 100% 表示磁盘瓶颈)
复制代码

11.1.5 网络监控

  1. # sar:系统活动报告
  2. sar -n DEV 1 10 # 查看网络流量
  3. # IFACE rxpck/s txpck/s rxkB/s txkB/s
  4. # eth0 100.00 80.00 50.00 40.00
  5. # iftop:实时网络流量
  6. iftop -i eth0
  7. # nethogs:按进程查看网络使用
  8. nethogs eth0
复制代码

11.2 瓶颈排查

  1. CPU 瓶颈排查:
  2. 1. 现象:load average 高,us 或 sy 高
  3. 2. 排查:
  4. - top 查看哪个进程占用 CPU 高
  5. - ps aux --sort=-%cpu | head -10
  6. - strace -p PID 跟踪系统调用
  7. 3. 解决:
  8. - 优化代码(减少计算)
  9. - 增加 CPU
  10. - 使用缓存
  11. 内存瓶颈排查:
  12. 1. 现象:available 低,Swap 使用高
  13. 2. 排查:
  14. - free -h 查看内存使用
  15. - ps aux --sort=-%mem | head -10
  16. - pmap PID 查看进程内存映射
  17. 3. 解决:
  18. - 优化代码(减少内存使用)
  19. - 增加内存
  20. - 调整 JVM 参数
  21. IO 瓶颈排查:
  22. 1. 现象:%util 高,await 高
  23. 2. 排查:
  24. - iostat -x 1 查看磁盘 IO
  25. - iotop 查看哪个进程 IO 高
  26. - lsof -p PID 查看进程打开的文件
  27. 3. 解决:
  28. - 优化 SQL(减少查询)
  29. - 使用 SSD
  30. - 增加缓存
  31. 网络瓶颈排查:
  32. 1. 现象:带宽打满,丢包
  33. 2. 排查:
  34. - sar -n DEV 1 查看网络流量
  35. - iftop 查看实时流量
  36. - tcpdump 抓包分析
  37. 3. 解决:
  38. - 增加带宽
  39. - 优化应用(减少请求)
  40. - 使用 CDN
复制代码

11.3 内核参数调优

  1. # sysctl:查看和修改内核参数
  2. # 查看所有参数
  3. sysctl -a
  4. # 查看指定参数
  5. sysctl net.ipv4.ip_forward
  6. # 修改参数(临时)
  7. sysctl -w net.ipv4.ip_forward=1
  8. # 永久修改
  9. echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
  10. sysctl -p
  11. # 常用调优参数
  12. # 网络参数
  13. net.ipv4.tcp_max_syn_backlog = 65535 # SYN 队列长度
  14. net.core.somaxconn = 65535 # 最大连接数
  15. net.ipv4.tcp_tw_reuse = 1 # 复用 TIME_WAIT
  16. net.ipv4.tcp_fin_timeout = 30 # FIN 超时时间
  17. # 内存参数
  18. vm.swappiness = 10 # 减少 Swap 使用
  19. vm.overcommit_memory = 1 # 允许内存超分配
  20. # 文件描述符
  21. fs.file-max = 65535 # 最大文件描述符数
  22. fs.nr_open = 65535 # 最大打开文件数
复制代码

第十一部分总结

章节核心内容
系统负载uptime、load average
内存监控free、vmstat
CPU 监控top、vmstat
磁盘监控df、du、iostat
网络监控sar、iftop、nethogs
瓶颈排查CPU、内存、IO、网络
内核调优sysctl 参数调整

第十二部分:自动化运维

🎯 生活类比:自动化运维就像"工厂流水线"——

  • 手动操作:工人一个个拧螺丝(效率低、容易出错)
  • 自动化:机器人自动拧螺丝(效率高、质量稳定)

12.1 Ansible

12.1.1 Ansible 简介

  1. Ansible 是什么?
  2. - 开源的自动化运维工具
  3. - 基于 Python 开发
  4. - 无需在目标主机安装客户端(SSH 连接)
  5. - 使用 YAML 编写 Playbook
  6. 核心概念:
  7. - 控制节点:运行 Ansible 的机器
  8. - 被管理节点:被 Ansible 管理的机器
  9. - Inventory:主机清单
  10. - Playbook:剧本(定义任务)
  11. - Module:模块(执行具体操作)
  12. - Role:角色(可复用的任务集合)
复制代码

12.1.2 安装配置

  1. # 安装
  2. pip install ansible # Python 安装
  3. yum install -y ansible # CentOS
  4. apt install -y ansible # Ubuntu
  5. # 配置文件
  6. /etc/ansible/ansible.cfg # 全局配置
  7. ~/.ansible.cfg # 用户配置
  8. ./ansible.cfg # 项目配置
  9. # 主机清单
  10. /etc/ansible/hosts
  11. # 配置示例
  12. [webservers]
  13. web1 ansible_host=192.168.1.101 ansible_user=root
  14. web2 ansible_host=192.168.1.102 ansible_user=root
  15. [dbservers]
  16. db1 ansible_host=192.168.1.201 ansible_user=root ansible_port=2222
  17. [all:vars]
  18. ansible_python_interpreter=/usr/bin/python3
复制代码

12.1.3 常用命令

  1. # 测试连接
  2. ansible all -m ping
  3. # 执行命令
  4. ansible all -m shell -a "uptime"
  5. ansible webservers -m shell -a "df -h"
  6. # 复制文件
  7. ansible all -m copy -a "src=./file dest=/tmp/"
  8. # 安装软件
  9. ansible all -m yum -a "name=nginx state=present"
  10. # 管理服务
  11. ansible all -m service -a "name=nginx state=started"
  12. # 查看主机信息
  13. ansible all -m setup
复制代码

12.1.4 Playbook

  1. # deploy.yml
  2. ---
  3. - hosts: webservers
  4. become: yes
  5. vars:
  6. app_port: 8080
  7. tasks:
  8. - name: Install Nginx
  9. yum:
  10. name: nginx
  11. state: present
  12. - name: Copy Nginx config
  13. template:
  14. src: nginx.conf.j2
  15. dest: /etc/nginx/nginx.conf
  16. notify: Restart Nginx
  17. - name: Start Nginx
  18. service:
  19. name: nginx
  20. state: started
  21. enabled: yes
  22. - name: Create app directory
  23. file:
  24. path: /opt/myapp
  25. state: directory
  26. owner: app
  27. group: app
  28. - name: Deploy application
  29. copy:
  30. src: ./app.jar
  31. dest: /opt/myapp/app.jar
  32. owner: app
  33. group: app
  34. notify: Restart App
  35. handlers:
  36. - name: Restart Nginx
  37. service:
  38. name: nginx
  39. state: restarted
  40. - name: Restart App
  41. service:
  42. name: myapp
  43. state: restarted
复制代码
  1. # 执行 Playbook
  2. ansible-playbook deploy.yml
  3. # 检查语法
  4. ansible-playbook deploy.yml --syntax-check
  5. # 模拟执行
  6. ansible-playbook deploy.yml --check
  7. # 指定主机
  8. ansible-playbook deploy.yml --limit webservers
复制代码

12.1.5 Role

  1. Role 目录结构:
  2. roles/
  3. └── nginx/
  4. ├── tasks/
  5. │ └── main.yml
  6. ├── handlers/
  7. │ └── main.yml
  8. ├── templates/
  9. │ └── nginx.conf.j2
  10. ├── files/
  11. │ └── index.html
  12. ├── vars/
  13. │ └── main.yml
  14. └── defaults/
  15. └── main.yml
  16. # 使用 Role
  17. ---
  18. - hosts: webservers
  19. roles:
  20. - nginx
  21. - myapp
复制代码

12.2 Shell 运维脚本

  1. #!/bin/bash
  2. # 系统巡检脚本
  3. echo "========== 系统巡检报告 =========="
  4. echo "时间:$(date)"
  5. echo ""
  6. # 系统信息
  7. echo "【系统信息】"
  8. echo "主机名:$(hostname)"
  9. echo "系统:$(cat /etc/redhat-release)"
  10. echo "内核:$(uname -r)"
  11. echo ""
  12. # CPU 信息
  13. echo "【CPU 信息】"
  14. echo "核心数:$(nproc)"
  15. echo "负载:$(uptime | awk -F'load average:' '{print $2}')"
  16. echo ""
  17. # 内存信息
  18. echo "【内存信息】"
  19. free -h | grep -v +1
  20. echo ""
  21. # 磁盘信息
  22. echo "【磁盘信息】"
  23. df -h | grep -v tmpfs
  24. echo ""
  25. # 网络信息
  26. echo "【网络信息】"
  27. ip -4 addr show | grep inet
  28. echo ""
  29. # 服务状态
  30. echo "【服务状态】"
  31. for service in nginx mysql redis; do
  32. status=$(systemctl is-active $service 2>/dev/null)
  33. echo "$service: $status"
  34. done
复制代码

第十二部分总结

章节核心内容
Ansible安装配置、Inventory、常用命令
PlaybookYAML 语法、任务、变量、Handlers
Role目录结构、可复用任务
Shell 脚本系统巡检脚本

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行