Linux 运维与开发学习笔记(从入门到精通)
本笔记从零基础出发,覆盖 Linux 系统管理、Shell 脚本、网络管理、服务部署、性能调优、自动化运维,适合长期参考的自学笔记。
第一部分:系统入门
1.1 Linux 简介
🎯 生活类比:如果 Windows 是"傻瓜相机"(图形界面,简单易用),那 Linux 就是"单反相机"(命令行,功能强大,需要学习)。
1.1.1 Linux 是什么- Linux 是什么?
- - 一个开源的类 Unix 操作系统内核
- - 由 Linus Torvalds 在 1991 年开发
- - 基于 GNU 通用公共许可证(GPL)
- - 全球最流行的服务器操作系统
- Linux 的特点:
- 1. 开源免费:源代码公开,任何人都可以使用和修改
- 2. 稳定可靠:服务器可以连续运行数年不重启
- 3. 安全性高:权限管理严格,病毒极少
- 4. 多用户多任务:支持多个用户同时登录
- 5. 一切皆文件:硬件、进程、网络都用文件表示
- Linux 的应用场景:
- - 服务器:90% 以上的服务器运行 Linux
- - 嵌入式:路由器、智能家居、车载系统
- - 超级计算机:全球 Top 500 超算全部运行 Linux
- - 开发环境:程序员的首选开发环境
- - Android:基于 Linux 内核
复制代码
1.1.2 Linux 发行版- 什么是发行版?
- - Linux 内核 + 各种软件 + 包管理器 = 发行版
- - 不同发行版适合不同场景
- 主流发行版:
- Red Hat 家族:
- - RHEL(Red Hat Enterprise Linux):企业版,收费,有技术支持
- - CentOS:免费版 RHEL(已停止维护)
- - CentOS Stream:CentOS 的替代品,滚动更新
- - Rocky Linux:CentOS 的社区替代品
- - Fedora:新技术试验田
- Debian 家族:
- - Debian:最稳定的发行版,适合服务器
- - Ubuntu:最流行的桌面发行版,也适合服务器
- - Linux Mint:基于 Ubuntu,更易用
- 其他:
- - Arch Linux:滚动更新,适合高级用户
- - Alpine:超轻量,适合容器
- - SUSE:欧洲流行的商业发行版
- 如何选择?
- - 学习/开发:Ubuntu(资料多、社区活跃)
- - 生产服务器:CentOS Stream / Rocky Linux / Ubuntu Server
- - 容器:Alpine(镜像小)
- - 企业:RHEL(有技术支持)
复制代码
1.1.3 Linux vs Windows
| 对比项 | Linux | Windows |
|---|
| 界面 | 命令行为主,图形界面可选 | 图形界面为主 | | 开源 | 开源免费 | 闭源收费 | | 安全性 | 高(权限管理严格) | 一般(病毒较多) | | 稳定性 | 高(服务器可运行数年) | 一般(需要重启) | | 软件 | 包管理器安装 | 安装包安装 | | 适用场景 | 服务器、开发 | 桌面、办公 | | 学习曲线 | 较陡 | 较平缓 |
1.1 本节小结
| 知识点 | 核心要点 |
|---|
| Linux | 开源、稳定、安全、多用户 | | 发行版 | Ubuntu(入门)、CentOS/Rocky(服务器) | | 应用场景 | 服务器、嵌入式、开发环境 |
1.2 系统安装
🎯 生活类比:安装 Linux 就像"搭积木"——先搭好底座(虚拟机),再放上积木(操作系统)。
1.2.1 虚拟机安装- 什么是虚拟机?
- - 在一台电脑上模拟出多台"虚拟电脑"
- - 每台虚拟电脑可以运行不同的操作系统
- - 适合学习和测试
- 常用虚拟机软件:
- - VMware Workstation(推荐,功能强大)
- - VirtualBox(免费,轻量)
- - Hyper-V(Windows 自带)
- 安装步骤:
- 1. 下载 VMware:https://www.vmware.com/
- 2. 下载 Linux 镜像:https://mirrors.aliyun.com/centos/
- 3. 创建虚拟机:
- - 选择"典型"安装
- - 选择 Linux 镜像
- - 设置虚拟机名称和位置
- - 设置磁盘大小(建议 20GB 以上)
- - 设置内存(建议 2GB 以上)
- 4. 启动虚拟机,按照向导安装
复制代码
1.2.2 最小化安装- 最小化安装 vs 图形界面安装:
- 最小化安装:
- - 只安装最基本的系统
- - 没有图形界面
- - 占用资源少(约 1GB 磁盘,256MB 内存)
- - 适合服务器(推荐)
- 图形界面安装:
- - 安装 GNOME 或 KDE 桌面
- - 有图形界面
- - 占用资源多(约 5GB 磁盘,1GB 内存)
- - 适合桌面使用
- 服务器推荐最小化安装:
- - 减少攻击面
- - 节省资源
- - 更稳定
复制代码
1.2.3 远程连接- # 远程连接工具
- # Windows:Xshell、PuTTY、Windows Terminal
- # Mac:Terminal、iTerm2
- # 使用 SSH 连接
- ssh root@192.168.1.100
- # 输入密码后即可登录
- # 首次连接会提示确认指纹
- # Are you sure you want to continue connecting (yes/no)? yes
- # 修改 SSH 端口(安全)
- vi /etc/ssh/sshd_config
- # Port 2222
- # PermitRootLogin no
- # 重启 SSH 服务
- systemctl restart sshd
复制代码
1.2 本节小结
| 知识点 | 核心要点 |
|---|
| 虚拟机 | VMware、VirtualBox | | 最小化安装 | 推荐服务器使用 | | 远程连接 | SSH 连接 |
1.3 文件系统
🎯 生活类比:Linux 文件系统就像"一棵大树"——根目录 / 是树根,其他目录是树枝。
1.3.1 FHS 目录结构- FHS(Filesystem Hierarchy Standard):文件系统层次标准
- / ← 根目录(树根)
- ├── bin/ ← 基础命令(ls、cp、mv)
- ├── sbin/ ← 系统管理命令(fdisk、reboot)
- ├── boot/ ← 启动文件(内核、引导程序)
- ├── dev/ ← 设备文件(硬盘、终端)
- ├── etc/ ← 配置文件(重要!)
- ├── home/ ← 普通用户家目录
- │ ├── user1/
- │ └── user2/
- ├── lib/ ← 共享库
- ├── lib64/ ← 64位共享库
- ├── media/ ← 可移动设备挂载点
- ├── mnt/ ← 临时挂载点
- ├── opt/ ← 第三方软件
- ├── proc/ ← 进程信息(虚拟文件系统)
- ├── root/ ← root 用户家目录
- ├── run/ ← 运行时数据
- ├── srv/ ← 服务数据
- ├── sys/ ← 系统信息(虚拟文件系统)
- ├── tmp/ ← 临时文件
- ├── usr/ ← 用户程序
- │ ├── bin/ ← 用户命令
- │ ├── sbin/ ← 系统管理命令
- │ ├── lib/ ← 库文件
- │ ├── local/ ← 本地安装的软件
- │ └── share/ ← 共享数据
- └── var/ ← 可变数据
- ├── log/ ← 日志文件(重要!)
- ├── cache/ ← 缓存
- ├── spool/ ← 队列数据
- └── tmp/ ← 临时文件
复制代码
1.3.2 一切皆文件- Linux 的核心思想:一切皆文件
- - 普通文件:文本、图片、程序
- - 目录文件:文件夹
- - 设备文件:硬盘、终端、打印机
- - 链接文件:快捷方式
- - 管道文件:进程间通信
- - 套接字文件:网络通信
- 示例:
- /dev/sda ← 硬盘设备
- /dev/tty ← 终端
- /proc/cpuinfo ← CPU 信息
- /proc/meminfo ← 内存信息
- /etc/passwd ← 用户信息
- /var/log/messages ← 系统日志
复制代码
1.3.3 路径概念- # 绝对路径:从根目录 / 开始的完整路径
- /home/user1/test.txt
- /etc/passwd
- # 相对路径:从当前目录开始的路径
- ./test.txt ← 当前目录下的 test.txt
- ../test.txt ← 上级目录下的 test.txt
- test.txt ← 当前目录下的 test.txt
- # 特殊目录
- . ← 当前目录
- .. ← 上级目录
- ~ ← 当前用户家目录
- - ← 上一次所在的目录
- # 示例
- cd /home ← 切换到 /home 目录(绝对路径)
- cd user1 ← 切换到当前目录下的 user1(相对路径)
- cd .. ← 返回上级目录
- cd ~ ← 回到家目录
- cd - ← 回到上一次所在的目录
复制代码
1.3 本节小结
| 知识点 | 核心要点 |
|---|
| FHS | 标准目录结构,每个目录有特定用途 | | 一切皆文件 | 硬件、进程、网络都是文件 | | 路径 | 绝对路径(从 / 开始)、相对路径(从当前开始) |
1.4 Shell 基础
🎯 生活类比:Shell 就像"翻译官"——把你输入的命令翻译成内核能理解的语言。
1.4.1 什么是 Shell- Shell 是什么?
- - 用户和内核之间的"翻译官"
- - 接收用户输入的命令
- - 解析命令并传递给内核执行
- - 返回执行结果
- 常见的 Shell:
- - bash:最常用的 Shell(默认)
- - sh:Bourne Shell,最古老的 Shell
- - zsh:功能更强大,macOS 默认
- - fish:用户友好,自动补全
- 查看当前 Shell:
- echo $SHELL # 输出 /bin/bash
- 切换 Shell:
- /bin/zsh # 临时切换到 zsh
- chsh -s /bin/zsh # 永久切换
复制代码
1.4.2 命令格式- # 命令格式:命令 [选项] [参数]
- # 示例
- ls -l /home # ls 是命令,-l 是选项,/home 是参数
- cat file.txt # cat 是命令,file.txt 是参数
- rm -rf /tmp/test # rm 是命令,-rf 是选项,/tmp/test 是参数
- # 选项的两种格式:
- ls -l # 短选项(单个 -)
- ls --all # 长选项(双 --)
- ls -lh # 多个短选项可以合并
- # 命令帮助:
- ls --help # 查看命令帮助
- man ls # 查看命令手册(更详细)
- info ls # 查看命令信息
复制代码
1.4.3 常用快捷键- # 终端快捷键
- Ctrl + C # 终止当前命令
- Ctrl + D # 退出当前终端/发送 EOF
- Ctrl + L # 清屏(等同于 clear)
- Ctrl + A # 光标移到行首
- Ctrl + E # 光标移到行尾
- Ctrl + U # 删除光标前的内容
- Ctrl + K # 删除光标后的内容
- Ctrl + W # 删除光标前的一个单词
- Ctrl + R # 搜索历史命令
- Ctrl + Z # 暂停当前命令(放到后台)
- # 历史命令
- history # 查看历史命令
- !n # 执行第 n 条历史命令
- !! # 执行上一条命令
- !string # 执行最近以 string 开头的命令
- # Tab 补全
- Tab # 自动补全命令或文件名
- Tab Tab # 显示所有可能的补全
复制代码
1.4.4 环境变量- # 查看环境变量
- echo $PATH # 查看 PATH 环境变量
- echo $HOME # 查看用户家目录
- echo $USER # 查看当前用户名
- echo $SHELL # 查看当前 Shell
- env # 查看所有环境变量
- set # 查看所有变量(包括局部变量)
- # 设置环境变量(临时,只在当前终端有效)
- export MY_VAR="hello"
- echo $MY_VAR # hello
- # 设置环境变量(永久)
- # 编辑 ~/.bashrc 或 ~/.bash_profile
- vi ~/.bashrc
- # 添加:export MY_VAR="hello"
- source ~/.bashrc # 使配置生效
- # PATH 环境变量
- # PATH 是命令搜索路径,用 : 分隔
- echo $PATH
- # /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
- # 添加自定义路径到 PATH
- 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 —— 列出目录内容- # 基本用法
- ls # 列出当前目录内容
- ls /home # 列出指定目录内容
- # 常用选项
- ls -l # 长格式显示(详细信息)
- ls -a # 显示隐藏文件(以 . 开头的文件)
- ls -h # 人性化显示文件大小(KB、MB)
- ls -lh # 组合使用
- ls -lah # 显示所有文件的详细信息
- ls -lt # 按修改时间排序
- ls -ltr # 按修改时间倒序排列
- # 输出示例
- ls -lh /etc/passwd
- # -rw-r--r--. 1 root root 1.5K Jan 1 00:00 /etc/passwd
- # -rw-r--r--:文件类型和权限
- # 1:硬链接数
- # root:所有者
- # root:所属组
- # 1.5K:文件大小
- # Jan 1 00:00:修改时间
- # /etc/passwd:文件名
复制代码
2.1.2 cd —— 切换目录- cd /home # 切换到 /home 目录
- cd user1 # 切换到当前目录下的 user1
- cd .. # 返回上级目录
- cd ~ # 回到家目录
- cd - # 回到上一次所在的目录
- cd / # 切换到根目录
- pwd # 显示当前目录路径
复制代码
2.1.3 mkdir —— 创建目录- mkdir test # 创建目录
- mkdir -p a/b/c # 递归创建多级目录
- mkdir -m 755 mydir # 创建目录并设置权限
- mkdir dir1 dir2 dir3 # 同时创建多个目录
复制代码
2.1.4 touch —— 创建文件- touch file.txt # 创建空文件(如果已存在则更新时间戳)
- touch -t 202401010000 file # 设置文件时间戳
- touch file{1..10}.txt # 批量创建文件
复制代码
2.1.5 cp —— 复制- cp file1 file2 # 复制文件
- cp file1 /tmp/ # 复制文件到目录
- cp -r dir1 dir2 # 递归复制目录
- cp -p file1 file2 # 保留文件属性
- cp -a dir1 dir2 # 等同于 cp -rp,保留所有属性
- cp -i file1 file2 # 覆盖前提示
- cp -v file1 file2 # 显示复制过程
复制代码
2.1.6 mv —— 移动/重命名- mv file1 file2 # 重命名文件
- mv file1 /tmp/ # 移动文件到目录
- mv dir1 dir2 # 移动/重命名目录
- mv -i file1 /tmp/ # 覆盖前提示
- mv -v file1 /tmp/ # 显示移动过程
复制代码
2.1.7 rm —— 删除- rm file.txt # 删除文件
- rm -r dir # 递归删除目录
- rm -f file # 强制删除(不提示)
- rm -rf dir # 强制递归删除(危险!)
- rm -i file # 删除前提示
- # ⚠️ 危险命令,永远不要执行:
- # rm -rf / # 删除根目录(会毁掉系统)
- # rm -rf /* # 同上
- # 安全做法:使用别名
- alias rm='rm -i' # 让 rm 默认提示确认
复制代码
2.1.8 tree —— 树形显示目录- # 安装
- yum install tree -y # CentOS
- apt install tree -y # Ubuntu
- # 使用
- tree # 树形显示当前目录
- tree -L 2 # 只显示 2 层
- tree -d # 只显示目录
- tree -a # 显示隐藏文件
复制代码
2.2 文件查看与搜索
2.2.1 cat —— 查看文件内容- cat file.txt # 查看文件内容
- cat -n file.txt # 显示行号
- cat -b file.txt # 只对非空行显示行号
- cat -s file.txt # 压缩空行
- # 合并文件
- cat file1 file2 > file3 # 合并 file1 和 file2 到 file3
复制代码
2.2.2 more / less —— 分页查看- more file.txt # 分页查看(空格翻页,q 退出)
- less file.txt # 分页查看(更强大,支持搜索)
- # less 快捷键
- # 空格:下一页
- # b:上一页
- # /pattern:搜索
- # n:下一个匹配
- # N:上一个匹配
- # q:退出
- # G:跳到文件末尾
- # gg:跳到文件开头
复制代码
2.2.3 head / tail —— 查看文件头尾- head file.txt # 查看前 10 行
- head -n 20 file.txt # 查看前 20 行
- head -20 file.txt # 同上
- tail file.txt # 查看后 10 行
- tail -n 20 file.txt # 查看后 20 行
- tail -f file.txt # 实时查看文件末尾(常用于查看日志)
- tail -F file.txt # 同上,但会跟踪文件名变化
复制代码
2.2.4 find —— 查找文件- # 按名称查找
- find / -name "file.txt" # 在根目录下查找 file.txt
- find . -name "*.log" # 查找当前目录下所有 .log 文件
- find . -iname "File.TXT" # 忽略大小写查找
- # 按类型查找
- find . -type f # 查找文件
- find . -type d # 查找目录
- find . -type l # 查找链接
- # 按大小查找
- find . -size +100M # 查找大于 100MB 的文件
- find . -size -1M # 查找小于 1MB 的文件
- # 按时间查找
- find . -mtime -7 # 查找 7 天内修改的文件
- find . -mtime +30 # 查找 30 天前修改的文件
- find . -mmin -30 # 查找 30 分钟内修改的文件
- # 按权限查找
- find . -perm 755 # 查找权限为 755 的文件
- find . -perm -u+s # 查找有 SUID 的文件
- # 执行操作
- find . -name "*.log" -delete # 删除找到的文件
- find . -name "*.log" -exec rm -f {} \; # 同上
- find . -name "*.log" -exec ls -lh {} \; # 对找到的文件执行 ls
- find . -name "*.bak" -exec mv {} {}.old \; # 重命名
复制代码
2.2.5 which / whereis / locate- which ls # 查找命令的路径
- which java # 查找 java 命令的路径
- whereis ls # 查找命令的路径、源码、手册
- whereis nginx # 查找 nginx 相关文件
- locate file.txt # 快速查找文件(基于数据库)
- updatedb # 更新 locate 数据库
复制代码
2.3 链接文件- # 软链接(符号链接,类似快捷方式)
- ln -s /path/to/file link_name
- ln -s /etc/passwd ~/passwd_link
- # 硬链接(指向同一个 inode)
- ln /path/to/file link_name
- ln /etc/passwd ~/passwd_hard
- # 软链接 vs 硬链接
- # 软链接:
- # - 可以跨文件系统
- # - 可以链接目录
- # - 删除原文件,链接失效
- # - 文件类型显示为 l
- # 硬链接:
- # - 不能跨文件系统
- # - 不能链接目录
- # - 删除原文件,链接仍有效
- # - 共享同一个 inode
复制代码
2.4 压缩与解压缩- # tar 打包
- tar -cvf archive.tar dir/ # 打包目录
- tar -xvf archive.tar # 解包
- tar -tvf archive.tar # 查看包内容
- # tar + gzip 压缩
- tar -czvf archive.tar.gz dir/ # 打包并 gzip 压缩
- tar -xzvf archive.tar.gz # 解压
- tar -xzvf archive.tar.gz -C /tmp/ # 解压到指定目录
- # tar + bzip2 压缩
- tar -cjvf archive.tar.bz2 dir/ # 打包并 bzip2 压缩
- tar -xjvf archive.tar.bz2 # 解压
- # zip/unzip
- zip -r archive.zip dir/ # 压缩目录
- unzip archive.zip # 解压
- unzip archive.zip -d /tmp/ # 解压到指定目录
- # gzip/gunzip
- gzip file.txt # 压缩文件(替换原文件)
- gunzip file.txt.gz # 解压
- # 查看压缩包内容
- zcat file.txt.gz # 查看 gz 文件内容
- zless file.txt.gz # 分页查看
复制代码
2.5 重定向与管道- # 输出重定向
- echo "hello" > file.txt # 覆盖写入
- echo "world" >> file.txt # 追加写入
- ls -l > list.txt 2>&1 # 标准输出和错误都重定向
- ls -l > list.txt 2>error.txt # 标准输出和错误分别重定向
- # 输入重定向
- wc -l < file.txt # 统计文件行数
- cat << EOF > file.txt # Here Document
- line1
- line2
- EOF
- # 管道
- ls -l | grep ".txt" # 列出文件,过滤 .txt 文件
- cat file.txt | wc -l # 统计行数
- ps aux | grep nginx # 查找 nginx 进程
- history | grep ssh # 搜索历史命令
- # tee(同时输出到屏幕和文件)
- ls -l | tee list.txt # 输出到屏幕和文件
- ls -l | tee -a list.txt # 追加到文件
- # xargs(将输入转换为命令参数)
- find . -name "*.txt" | rm -f # ❌ 错误用法
- find . -name "*.txt" | xargs rm -f # ✅ 正确用法
- 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 用户的概念- Linux 用户类型:
- 1. root 用户(超级管理员)
- - UID = 0
- - 拥有系统最高权限
- - 可以做任何操作
- - ⚠️ 危险!误操作可能毁掉系统
- 2. 系统用户
- - UID = 1-999
- - 用于运行系统服务
- - 不能登录系统
- - 例如:nginx、mysql、redis
- 3. 普通用户
- - UID = 1000+
- - 可以登录系统
- - 权限受限
- - 只能操作自己的文件
- 用户相关文件:
- /etc/passwd # 用户信息(所有人都能读)
- /etc/shadow # 密码信息(只有 root 能读)
- /etc/group # 用户组信息
复制代码- # /etc/passwd 文件格式
- # 用户名:密码占位:UID:GID:注释:家目录:Shell
- root:x:0:0:root:/root:/bin/bash
- user1:x:1000:1000::/home/user1:/bin/bash
- # /etc/shadow 文件格式
- # 用户名:加密密码:最后修改日期:最小修改间隔:最大修改间隔:警告天数:宽限天数:过期日期:保留
- root:$6$xxx:19000:0:99999:7:::
- # /etc/group 文件格式
- # 组名:密码:GID:组成员
- root:x:0:
- user1:x:1000:
复制代码
3.1.2 用户操作详解- # ====== 创建用户 ======
- useradd username # 最简单的创建
- useradd -m -s /bin/bash username # 推荐:自动创建家目录,指定 Shell
- useradd -u 1001 -g developers -G docker,wheel username # 指定 UID、主组、附加组
- useradd -e 2024-12-31 username # 设置用户过期日期
- useradd -c "管理员账号" username # 添加注释
- # ====== 设置密码 ======
- passwd username # 交互式设置密码
- echo "username:password" | chpasswd # 批量设置密码
- passwd -l username # 锁定用户(无法登录)
- passwd -u username # 解锁用户
- passwd -e username # 强制用户下次登录修改密码
- passwd -n 7 username # 设置密码最小修改间隔(天)
- passwd -x 90 username # 设置密码最大有效期(天)
- passwd -w 7 username # 设置密码过期警告天数
- # ====== 修改用户 ======
- usermod -l newname oldname # 修改用户名
- usermod -d /new/home -m username # 修改家目录(-m 迁移文件)
- usermod -s /bin/zsh username # 修改 Shell
- usermod -aG docker username # 添加用户到附加组(-a 表示追加,不加会覆盖)
- usermod -L username # 锁定用户(等同于 passwd -l)
- usermod -U username # 解锁用户
- usermod -e 2024-12-31 username # 设置用户过期日期
- # ====== 删除用户 ======
- userdel username # 删除用户(保留家目录)
- userdel -r username # 删除用户并删除家目录
- userdel -f username # 强制删除(即使用户在线)
- # ====== 查看用户信息 ======
- id username # 查看用户 UID、GID、所属组
- id -u username # 只显示 UID
- id -g username # 只显示主组 GID
- id -G username # 显示所有组 GID
- whoami # 查看当前用户名
- who # 查看当前登录用户
- w # 查看当前登录用户及活动
- last # 查看登录历史
- lastlog # 查看所有用户最后登录时间
- finger username # 查看用户详细信息(需要安装)
复制代码
3.1.3 用户组操作详解- # ====== 创建用户组 ======
- groupadd groupname # 创建用户组
- groupadd -g 1001 groupname # 指定 GID
- groupadd -r groupname # 创建系统组(GID < 1000)
- # ====== 修改用户组 ======
- groupmod -n newname oldname # 重命名组
- groupmod -g 2001 groupname # 修改 GID
- # ====== 删除用户组 ======
- groupdel groupname # 删除组(不能删除用户的主组)
- # ====== 组成员管理 ======
- gpasswd -a user1 groupname # 添加用户到组
- gpasswd -d user1 groupname # 从组中删除用户
- gpasswd -A user1 groupname # 设置组管理员
- gpasswd -M user1,user2 groupname # 设置组成员列表
- # ====== 查看组信息 ======
- groups username # 查看用户所属的组
- getent group groupname # 查看组信息
- cat /etc/group # 查看所有组
复制代码
3.2 文件权限深入理解
3.2.1 权限位详解- ls -l 输出解析:
- -rw-r--r--. 1 root root 1500 Jan 1 00:00 /etc/passwd
- │╰─╯╰─╯╰─╯
- │ │ │ └── 其他人权限
- │ │ └─────── 所属组权限
- │ └──────────── 所有者权限
- └─────────────── 文件类型
- 文件类型(第1位):
- - 普通文件
- d 目录
- l 符号链接(软链接)
- b 块设备(硬盘、U盘)
- c 字符设备(终端、鼠标)
- p 命名管道
- s 套接字
- 权限位(第2-10位):
- r(读)= 4 w(写)= 2 x(执行)= 1
- 数字法计算:
- rwx = 4+2+1 = 7
- rw- = 4+2+0 = 6
- r-x = 4+0+1 = 5
- r-- = 4+0+0 = 4
- -wx = 0+2+1 = 3
- -w- = 0+2+0 = 2
- --x = 0+0+1 = 1
- --- = 0+0+0 = 0
复制代码
3.2.2 权限对文件的含义- 权限 文件 目录
- ────────────────────────────────────────
- r(读) 查看文件内容 列出目录内容(ls)
- w(写) 修改文件内容 在目录中创建、删除、重命名文件
- x(执行)执行文件(程序/脚本) 进入目录(cd)
- 重要理解:
- 1. 对目录的 r 权限:只能列出文件名,不能查看文件内容
- 2. 对目录的 w 权限:可以创建删除文件,但不能修改文件内容
- 3. 对目录的 x 权限:可以进入目录,但不能列出文件名
- 4. 要正常访问目录,通常需要 r+x(列出并进入)
- 5. 要在目录中创建文件,需要 w+x(创建并进入)
- 常见权限组合:
- 755:所有者 rwx,组 rx,其他 rx(程序、脚本)
- 644:所有者 rw,组 r,其他 r(普通文件)
- 700:所有者 rwx,组无,其他无(私有目录)
- 600:所有者 rw,组无,其他无(私有文件)
- 777:所有人 rwx(危险!不要用)
复制代码
3.2.3 chmod 详解- # ====== 数字法 ======
- chmod 755 file # rwxr-xr-x(程序、脚本)
- chmod 644 file # rw-r--r--(普通文件)
- chmod 700 dir # rwx------(私有目录)
- chmod 600 file # rw-------(私有文件)
- chmod 777 file # rwxrwxrwx(危险!)
- # 递归修改
- chmod -R 755 dir/ # 递归修改目录及所有子文件
- # ====== 符号法 ======
- # u=所有者 g=所属组 o=其他人 a=所有人
- # +添加 -删除 =设置
- chmod u+x file # 给所有者添加执行权限
- chmod g-w file # 去掉所属组的写权限
- chmod o=r file # 设置其他人只有读权限
- chmod a+x file # 给所有人添加执行权限
- chmod u+x,g+rx file # 同时设置多个权限
- chmod ug+rw file # 给所有者和所属组添加读写权限
- # 参考其他文件的权限
- chmod --reference=ref_file target_file
- # ====== 常见场景 ======
- # 场景 1:Web 网站文件
- chmod -R 755 /var/www/html/ # 目录
- chmod 644 /var/www/html/index.html # 文件
- # 场景 2:脚本文件
- chmod +x script.sh # 添加执行权限
- # 场景 3:配置文件
- chmod 600 /etc/shadow # 只有 root 能读写
- chmod 644 /etc/passwd # 所有人能读,只有 root 能写
- # 场景 4:私钥文件
- chmod 600 ~/.ssh/id_rsa # 只有所有者能读写
复制代码
3.2.4 chown 详解- # 修改所有者
- chown user1 file # 修改所有者
- chown user1:group1 file # 修改所有者和所属组
- chown user1: file # 修改所有者,组设为 user1 的主组
- chown :group1 file # 只修改所属组
- # 递归修改
- chown -R user1:group1 dir/ # 递归修改目录
- # 参考其他文件
- chown --reference=ref_file target_file
- # 常见场景
- chown -R nginx:nginx /var/www/html # Web 目录
- chown -R mysql:mysql /var/lib/mysql # MySQL 数据目录
- chown -R redis:redis /var/lib/redis # Redis 数据目录
复制代码
3.2.5 权限判断流程- 当用户访问文件时,Linux 的权限判断流程:
- 1. 判断是否是 root 用户
- - 是 → 直接允许(root 有所有权限)
- - 否 → 继续判断
- 2. 判断是否是文件所有者
- - 是 → 使用所有者权限(第2-4位)
- - 否 → 继续判断
- 3. 判断是否是文件所属组成员
- - 是 → 使用所属组权限(第5-7位)
- - 否 → 使用其他人权限(第8-10位)
- 4. 如果有 ACL,ACL 优先于普通权限
- 示例:
- 文件权限:rw-r--r--(644)
- 所有者:user1
- 所属组:group1
- user1 访问 → 使用所有者权限 → rw-(可读写)
- user2(group1 成员)→ 使用组权限 → r--(只读)
- user3(其他用户)→ 使用其他权限 → r--(只读)
- root → 直接允许(忽略权限)
复制代码
3.3 特殊权限
3.3.1 SUID(Set User ID)- SUID 的作用:
- - 执行文件时,临时获得文件所有者的权限
- - 只对可执行文件有效
- - 典型例子:passwd 命令
- 为什么需要 SUID?
- - 普通用户需要修改自己的密码
- - 密码文件 /etc/shadow 只有 root 能读写
- - passwd 命令有 SUID,执行时临时获得 root 权限
- - 这样普通用户就能修改自己的密码了
复制代码- # 查看 SUID
- ls -l /usr/bin/passwd
- # -rwsr-xr-x. 1 root root 27856 Apr 1 2020 /usr/bin/passwd
- # 注意所有者的 x 变成了 s(表示 SUID)
- # 设置 SUID
- chmod u+s file # 符号法
- chmod 4755 file # 数字法(4 表示 SUID)
- chmod u-s file # 去除 SUID
- # 查找有 SUID 的文件(安全审计)
- find / -perm -4000 -type f 2>/dev/null
- # ⚠️ SUID 的安全风险
- # - 如果一个程序有 SUID 且有漏洞,攻击者可能获得 root 权限
- # - 只给必要的程序设置 SUID
- # - 定期审计 SUID 文件
复制代码
3.3.2 SGID(Set Group ID)- SGID 的作用:
- - 对文件:执行时临时获得文件所属组的权限
- - 对目录:在目录中创建的文件自动继承目录的组
- 为什么需要 SGID?
- - 团队协作:多个用户需要共享一个目录
- - 新建文件自动继承目录的组,不需要手动修改
复制代码- # 查看 SGID
- ls -ld /var/tmp
- # drwxrwxrwt. 2 root root 4096 Jan 1 00:00 /var/tmp
- # 设置 SGID
- chmod g+s dir # 符号法
- chmod 2755 dir # 数字法(2 表示 SGID)
- chmod g-s dir # 去除 SGID
- # 示例:团队共享目录
- mkdir /project
- groupadd developers
- chown :developers /project
- chmod 2775 /project # 设置 SGID + 组可写
- # 现在 developers 组的用户在 /project 中创建的文件
- # 自动属于 developers 组,不需要手动修改
复制代码
3.3.3 Sticky Bit- Sticky Bit 的作用:
- - 对目录设置后,只有文件所有者和 root 能删除文件
- - 典型例子:/tmp 目录
- 为什么需要 Sticky Bit?
- - /tmp 是所有用户都能写入的目录
- - 如果没有 Sticky Bit,用户 A 可以删除用户 B 的文件
- - 设置 Sticky Bit 后,用户只能删除自己的文件
复制代码- # 查看 Sticky Bit
- ls -ld /tmp
- # drwxrwxrwt. 4 root root 4096 Jan 1 00:00 /tmp
- # 注意其他人的 x 变成了 t(表示 Sticky Bit)
- # 设置 Sticky Bit
- chmod +t dir # 符号法
- chmod 1755 dir # 数字法(1 表示 Sticky Bit)
- chmod -t dir # 去除 Sticky Bit
- # 示例:创建公共目录
- mkdir /shared
- chmod 1777 /shared # 所有人可读写,但只能删除自己的文件
复制代码
3.3.4 特殊权限总结- 权限 数字 符号 作用
- ──────────────────────────────────────────────────
- SUID 4 u+s 执行时获得所有者权限
- SGID 2 g+s 执行时获得组权限 / 目录文件继承组
- Sticky Bit 1 +t 只有所有者能删除文件
- 组合使用:
- chmod 6755 file # SUID + SGID + rwxr-xr-x
- chmod 2775 dir # SGID + rwxrwxr-x
- chmod 1777 dir # Sticky Bit + rwxrwxrwx
- 查看特殊权限:
- ls -l # s/S 表示 SUID/SGID,t/T 表示 Sticky Bit
复制代码
3.4 ACL 访问控制
3.4.1 ACL 简介- ACL(Access Control List):访问控制列表
- 为什么需要 ACL?
- - 传统权限只能设置所有者、所属组、其他人
- - 无法给"特定用户"或"特定组"设置不同权限
- - ACL 解决了这个问题
- ACL 的作用:
- - 可以给任意用户设置文件权限
- - 可以给任意组设置文件权限
- - 权限粒度更细
复制代码- # 查看 ACL
- getfacl file
- # file: file
- # owner: root
- # group: root
- # user::rw-
- # user:user1:rw- # ACL:user1 有读写权限
- # group::r--
- # group:group1:r-x # ACL:group1 有读和执行权限
- # mask::rw-
- # other::r--
- # 设置 ACL
- setfacl -m u:user1:rw file # 给 user1 设置读写权限
- setfacl -m u:user2:r file # 给 user2 设置只读权限
- setfacl -m g:group1:rx file # 给 group1 设置读和执行权限
- setfacl -m o::--- file # 设置其他人无权限
- # 删除 ACL
- setfacl -x u:user1 file # 删除 user1 的 ACL
- setfacl -x g:group1 file # 删除 group1 的 ACL
- setfacl -b file # 删除所有 ACL
- # 递归设置
- setfacl -R -m u:user1:rw dir/
- # 设置默认 ACL(新建文件自动继承)
- setfacl -d -m u:user1:rw dir/ # 目录中新创建的文件自动给 user1 读写权限
- # 备份和恢复 ACL
- getfacl -R dir/ > acl_backup.txt # 备份
- setfacl --restore=acl_backup.txt # 恢复
复制代码
3.4.2 ACL 实战场景- # 场景 1:给特定用户授权
- # 需求:user1 需要读写 /data/project,但不是所有者也不是组成员
- setfacl -m u:user1:rw /data/project
- # 场景 2:团队共享目录
- # 需求:developers 组可读写,testers 组只读
- mkdir /shared
- setfacl -m g:developers:rwx /shared
- setfacl -m g:testers:r-x /shared
- chmod 770 /shared # 其他人无权限
- # 场景 3:Web 服务器
- # 需求:nginx 用户需要读取网站文件,但不能修改
- setfacl -R -m u:nginx:r-x /var/www/html
- # 场景 4:日志查看
- # 需求:dev 用户需要查看日志,但不能修改
- setfacl -m u:dev:r /var/log/app.log
复制代码
3.5 umask 默认权限- umask 是什么?
- - 创建文件或目录时的默认权限掩码
- - umask 值会从最大权限中"减去"
- 最大权限:
- - 文件:666(rw-rw-rw-)
- - 目录:777(rwxrwxrwx)
- 默认 umask:022
- 计算公式:
- - 文件权限 = 666 - umask = 666 - 022 = 644(rw-r--r--)
- - 目录权限 = 777 - umask = 777 - 022 = 755(rwxr-xr-x)
复制代码- # 查看 umask
- umask # 输出 0022
- umask -S # 符号法显示 u=rwx,g=rx,o=rx
- # 设置 umask(临时)
- umask 027 # 文件 640,目录 750
- # 永久设置 umask
- # 编辑 /etc/profile 或 ~/.bashrc
- echo "umask 027" >> /etc/profile
- source /etc/profile
- # 常见 umask 值
- # umask 022:默认,文件 644,目录 755
- # umask 027:更安全,文件 640,目录 750
- # umask 077:最安全,文件 600,目录 700
复制代码
3.6 sudo 配置详解
3.6.1 sudo 简介- sudo 是什么?
- - 以其他用户(通常是 root)的身份执行命令
- - 比直接使用 root 更安全
- - 可以记录谁执行了什么命令
- sudo vs su:
- - su:切换用户,需要目标用户密码
- - sudo:以其他用户执行命令,需要当前用户密码(或不需要密码)
- - sudo 更安全,因为不需要共享 root 密码
复制代码
3.6.2 sudoers 配置- # 编辑 sudoers 文件(必须使用 visudo,有语法检查)
- visudo
- # 或编辑 /etc/sudoers.d/ 目录下的文件(推荐)
- visudo -f /etc/sudoers.d/user1
- # 配置格式
- # 用户名 主机=(身份) 命令选项
- # 示例配置
- user1 ALL=(ALL) ALL # user1 可以执行所有命令
- user1 ALL=(ALL) NOPASSWD: ALL # user1 执行 sudo 不需要密码
- %group1 ALL=(ALL) ALL # group1 组的所有成员可以执行所有命令
- user1 ALL=(ALL) /usr/bin/systemctl # user1 只能执行 systemctl 命令
- user1 ALL=(ALL) /usr/bin/systemctl, /usr/bin/journalctl # 多个命令用逗号分隔
- user1 ALL=(ALL) !/usr/bin/passwd, !/usr/bin/passwd root # 禁止执行某些命令
- # 命令别名
- Cmnd_Alias SERVICES = /usr/bin/systemctl, /usr/bin/journalctl
- Cmnd_Alias NETWORK = /usr/bin/ip, /usr/bin/ss
- user1 ALL=(ALL) SERVICES, NETWORK
- # 用户别名
- User_Alias ADMINS = user1, user2, user3
- ADMINS ALL=(ALL) ALL
复制代码
3.6.3 sudo 使用技巧- # 基本使用
- sudo command # 以 root 权限执行命令
- sudo -u user1 command # 以 user1 身份执行命令
- sudo -i # 切换到 root 用户(加载 root 环境)
- sudo su # 切换到 root 用户(保留当前环境)
- # sudo 日志
- # 默认记录在 /var/log/secure 或 /var/log/auth.log
- tail -f /var/log/secure # CentOS
- tail -f /var/log/auth.log # Ubuntu
- # sudo 缓存
- # 默认 sudo 会缓存 5 分钟,不需要每次都输入密码
- sudo -k # 清除 sudo 缓存
- sudo -v # 更新 sudo 缓存
- # 常见配置示例
- # 1. 允许用户重启服务
- user1 ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
- user1 ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart mysql
- # 2. 允许用户查看日志
- user1 ALL=(ALL) NOPASSWD: /usr/bin/journalctl
- user1 ALL=(ALL) NOPASSWD: /usr/bin/tail /var/log/*
- # 3. 允许用户执行部署脚本
- user1 ALL=(ALL) NOPASSWD: /opt/deploy.sh
复制代码
3.7 权限实战场景
3.7.1 Web 服务器权限- # 场景:Nginx + PHP 网站
- # 需求:nginx 能读取网站文件,php-fpm 能写入上传目录
- # 创建用户和组
- groupadd www
- useradd -g www -s /sbin/nologin nginx
- useradd -g www -s /sbin/nologin php-fpm
- # 设置网站目录
- chown -R www:www /var/www/html
- chmod -R 755 /var/www/html
- # 上传目录需要写权限
- chmod 775 /var/www/html/uploads
- # Nginx 配置
- # user www;
- # 或者使用 ACL
- setfacl -R -m u:nginx:r-x /var/www/html
- setfacl -R -m u:php-fpm:rwx /var/www/html/uploads
复制代码
3.7.2 数据库权限- # 场景:MySQL 数据库
- # 需求:mysql 用户拥有数据目录的完全权限
- # 创建用户(安装时自动创建)
- useradd -r -s /sbin/nologin mysql
- # 设置数据目录
- chown -R mysql:mysql /var/lib/mysql
- chmod 750 /var/lib/mysql
- # 配置文件
- chown root:mysql /etc/my.cnf
- chmod 640 /etc/my.cnf
- # 日志目录
- chown mysql:mysql /var/log/mysql
- chmod 750 /var/log/mysql
复制代码
3.7.3 SSH 安全配置- # 场景:SSH 密钥认证
- # 需求:禁用密码登录,只允许密钥登录
- # 生成密钥对
- ssh-keygen -t rsa -b 4096
- # 设置权限(重要!)
- chmod 700 ~/.ssh
- chmod 600 ~/.ssh/id_rsa # 私钥必须 600
- chmod 644 ~/.ssh/id_rsa.pub # 公钥可以 644
- chmod 644 ~/.ssh/authorized_keys
- # SSH 配置
- vi /etc/ssh/sshd_config
- # PermitRootLogin no
- # PasswordAuthentication no
- # PubkeyAuthentication yes
- # 重启 SSH
- systemctl restart sshd
复制代码
3.7.4 共享目录权限- # 场景:团队共享目录
- # 需求:developers 组可读写,其他人无权限
- # 创建目录和组
- mkdir /data/project
- groupadd developers
- # 设置权限
- chown :developers /data/project
- chmod 2775 /data/project # SGID,新文件继承组
- # 添加用户到组
- usermod -aG developers user1
- usermod -aG developers user2
- # 或者使用 ACL
- setfacl -d -m g:developers:rwx /data/project # 默认 ACL
复制代码
3.7.5 日志文件权限- # 场景:应用日志
- # 需求:应用可以写入日志,运维可以查看,其他人无权限
- # 创建日志目录
- mkdir /var/log/myapp
- chown appuser:appgroup /var/log/myapp
- chmod 750 /var/log/myapp
- # 日志文件
- chown appuser:appgroup /var/log/myapp/app.log
- chmod 640 /var/log/myapp/app.log
- # 使用 ACL 给运维查看权限
- setfacl -m u:opsuser:r /var/log/myapp/app.log
复制代码
3.8 权限安全最佳实践- 1. 最小权限原则
- - 只给必要的权限
- - 不要用 777
- - 定期审计权限
- 2. 文件权限建议
- - 配置文件:644(rw-r--r--)
- - 脚本文件:755(rwxr-xr-x)
- - 私钥文件:600(rw-------)
- - 日志文件:644(rw-r--r--)
- - 数据目录:750(rwxr-x---)
- 3. 目录权限建议
- - 网站目录:755(rwxr-xr-x)
- - 上传目录:775(rwxrwxr-x)
- - 配置目录:750(rwxr-x---)
- - 日志目录:750(rwxr-x---)
- 4. 用户权限建议
- - 不要用 root 登录系统
- - 使用 sudo 执行特权命令
- - 定期修改密码
- - 使用密钥认证
- 5. 安全审计
- - 定期检查 SUID/SGID 文件
- - 定期检查 ACL 配置
- - 定期检查用户权限
- - 监控 sudo 日志
复制代码
3.9 常见问题与解决- # 问题 1:Permission denied
- # 原因:没有文件的访问权限
- # 解决:
- ls -l file # 查看权限
- chmod +r file # 添加读权限
- # 或者
- sudo chown user:group file # 修改所有者
- # 问题 2:无法删除文件
- # 原因:没有目录的写权限(不是文件的写权限)
- # 解决:
- ls -ld dir/ # 查看目录权限
- chmod +w dir/ # 添加目录写权限
- # 问题 3:无法进入目录
- # 原因:没有目录的执行权限
- # 解决:
- chmod +x dir/ # 添加目录执行权限
- # 问题 4:脚本无法执行
- # 原因:没有执行权限
- # 解决:
- chmod +x script.sh # 添加执行权限
- # 问题 5:SSH 无法登录
- # 原因:.ssh 目录或 authorized_keys 权限不对
- # 解决:
- chmod 700 ~/.ssh
- chmod 600 ~/.ssh/authorized_keys
- # 问题 6:sudo 配置错误
- # 原因:sudoers 文件语法错误
- # 解决:
- pkexec visudo # 使用 pkexec 修复
复制代码
第三部分总结
| 章节 | 核心内容 |
|---|
| 用户管理 | useradd、usermod、userdel、passwd、/etc/passwd | | 文件权限 | rwx 数字法/符号法、chmod、chown、权限判断流程 | | 特殊权限 | SUID(执行获得所有者权限)、SGID(目录继承组)、Sticky Bit(只能删自己的文件) | | ACL | setfacl、getfacl,给特定用户/组设置权限 | | umask | 默认权限掩码,666-umask=文件权限,777-umask=目录权限 | | sudo | 以其他用户执行命令,visudo 配置 | | 实战场景 | Web 服务器、数据库、SSH、共享目录、日志文件 | | 安全实践 | 最小权限原则、定期审计、不用 root |
第四部分:文本处理三剑客
🎯 生活类比:grep、sed、awk 就像"三把瑞士军刀"——grep 负责搜索,sed 负责编辑,awk 负责分析。
4.1 grep —— 文本搜索- # 基本用法
- grep "pattern" file # 搜索包含 pattern 的行
- grep -i "pattern" file # 忽略大小写
- grep -n "pattern" file # 显示行号
- grep -v "pattern" file # 显示不匹配的行
- grep -c "pattern" file # 统计匹配行数
- grep -l "pattern" *.txt # 只显示包含匹配的文件名
- grep -r "pattern" /path/ # 递归搜索目录
- grep -w "word" file # 匹配整个单词
- grep -A 3 "pattern" file # 显示匹配行及后 3 行
- grep -B 3 "pattern" file # 显示匹配行及前 3 行
- grep -C 3 "pattern" file # 显示匹配行及前后 3 行
- # 正则表达式
- grep "^root" /etc/passwd # 以 root 开头的行
- grep "bash$" /etc/passwd # 以 bash 结尾的行
- grep "r..t" /etc/passwd # r 和 t 之间有两个字符
- grep "ro*t" /etc/passwd # r 和 t 之间有 0 或多个 o
- grep "ro\+t" /etc/passwd # r 和 t 之间有 1 或多个 o(扩展正则用 -E)
- grep -E "root|nologin" /etc/passwd # 匹配 root 或 nologin
- grep -P "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" file # 匹配 IP 地址
复制代码
4.2 sed —— 流编辑器- # 基本用法
- sed 's/old/new/' file # 替换第一个匹配
- sed 's/old/new/g' file # 替换所有匹配
- sed 's/old/new/gi' file # 替换所有匹配(忽略大小写)
- sed -i 's/old/new/g' file # 直接修改文件(危险!)
- sed -i.bak 's/old/new/g' file # 修改文件并备份原文件
- # 删除行
- sed '3d' file # 删除第 3 行
- sed '2,5d' file # 删除第 2-5 行
- sed '/pattern/d' file # 删除包含 pattern 的行
- sed '/^$/d' file # 删除空行
- # 插入行
- sed '3i\new line' file # 在第 3 行前插入
- sed '3a\new line' file # 在第 3 行后追加
- sed '1i\# Header' file # 在文件开头插入
- # 打印行
- sed -n '3p' file # 打印第 3 行
- sed -n '2,5p' file # 打印第 2-5 行
- sed -n '/pattern/p' file # 打印包含 pattern 的行
- # 多个操作
- sed -e 's/old1/new1/g' -e 's/old2/new2/g' file
- sed 's/old1/new1/g; s/old2/new2/g' file
复制代码
4.3 awk —— 文本分析- # 基本用法
- awk '{print}' file # 打印所有行
- awk '{print $1}' file # 打印第 1 列
- awk '{print $1, $3}' file # 打印第 1 和第 3 列
- awk -F: '{print $1}' /etc/passwd # 指定分隔符为 :
- awk '{print NR, $0}' file # 打印行号和内容
- # 条件判断
- awk '$3 > 100' file # 第 3 列大于 100 的行
- awk '/pattern/' file # 包含 pattern 的行
- awk '$1 == "root"' /etc/passwd # 第 1 列等于 root
- # 内置变量
- # $0:整行
- # $1, $2, ...:第 1, 2, ... 列
- # NR:行号
- # NF:列数
- # FS:输入分隔符
- # OFS:输出分隔符
- # BEGIN 和 END
- awk 'BEGIN {print "Start"} {print} END {print "End"}' file
- awk -F: 'BEGIN {print "User List"} {print $1} END {print "Total: " NR " users"}' /etc/passwd
- # 统计
- awk '{sum += $3} END {print "Sum:", sum}' file # 求和
- awk '{sum += $3; count++} END {print "Avg:", sum/count}' file # 求平均
- # 格式化输出
- awk '{printf "%-20s %10d\n", $1, $3}' file
复制代码
第四部分总结
| 章节 | 核心内容 |
|---|
| grep | 文本搜索、正则表达式 | | sed | 流编辑、替换、删除、插入 | | awk | 列处理、条件判断、统计 |
第五部分:Vim 编辑器
🎯 生活类比:Vim 就像"瑞士军刀"——功能强大但需要学习。一旦学会,效率极高。
5.1 Vim 基础- # 打开文件
- vim file.txt # 打开文件
- vim +10 file.txt # 打开文件并跳到第 10 行
- vim +/pattern file.txt # 打开文件并跳到第一个匹配
- # 三种模式
- # 1. 普通模式(默认):移动光标、复制粘贴
- # 2. 插入模式(i/a/o):输入文本
- # 3. 命令模式(:):保存、退出、查找替换
- # 进入插入模式
- i # 光标前插入
- a # 光标后插入
- o # 下一行插入
- I # 行首插入
- A # 行尾插入
- O # 上一行插入
- Esc # 返回普通模式
- # 保存退出
- :w # 保存
- :q # 退出
- :wq # 保存退出
- :q! # 强制退出不保存
- :wq! # 强制保存退出
- :w newfile # 另存为
- # 移动光标
- h j k l # 左下上右
- w # 下一个单词
- b # 上一个单词
- 0 # 行首
- $ # 行尾
- gg # 文件开头
- G # 文件末尾
- :n # 跳到第 n 行
- # 复制粘贴
- yy # 复制当前行
- 3yy # 复制 3 行
- yw # 复制一个单词
- y$ # 复制到行尾
- p # 粘贴到光标后
- P # 粘贴到光标前
- # 删除
- dd # 删除当前行
- 3dd # 删除 3 行
- dw # 删除一个单词
- d$ # 删除到行尾
- x # 删除光标下的字符
- u # 撤销
- Ctrl + r # 重做
- # 查找
- /pattern # 向下查找
- ?pattern # 向上查找
- n # 下一个匹配
- N # 上一个匹配
- * # 查找光标下的单词
复制代码
5.2 Vim 进阶- # 查找替换
- :s/old/new/ # 替换当前行第一个匹配
- :s/old/new/g # 替换当前行所有匹配
- :%s/old/new/g # 替换全文所有匹配
- :%s/old/new/gc # 替换全文(每次确认)
- :10,20s/old/new/g # 替换第 10-20 行
- # 分屏
- :sp file # 水平分屏
- :vsp file # 垂直分屏
- Ctrl + w + w # 切换窗口
- Ctrl + w + h/j/k/l # 移动到指定窗口
- Ctrl + w + = # 等分窗口
- # 多文件编辑
- vim file1 file2 # 打开多个文件
- :n # 下一个文件
- :N # 上一个文件
- :files # 列出所有文件
- # 配置文件 ~/.vimrc
- set number # 显示行号
- set tabstop=4 # Tab 宽度
- set shiftwidth=4 # 缩进宽度
- set expandtab # Tab 转空格
- set autoindent # 自动缩进
- set syntax on # 语法高亮
- set hlsearch # 搜索高亮
- set incsearch # 增量搜索
- set ignorecase # 搜索忽略大小写
- set encoding=utf-8 # 编码
复制代码
第五部分总结
| 章节 | 核心内容 |
|---|
| Vim 基础 | 三种模式、移动、复制粘贴、删除 | | Vim 进阶 | 查找替换、分屏、配置文件 |
第六部分:Shell 脚本编程
🎯 生活类比:Shell 脚本就像"菜谱"——把一系列命令写在一起,按顺序执行。
6.1 脚本基础- #!/bin/bash
- # 第一行是 Shebang,指定解释器
- # 变量
- name="hello" # 赋值(等号两边不能有空格!)
- echo $name # 使用变量
- echo ${name} # 同上,推荐加花括号
- # 只读变量
- readonly PI=3.14
- # PI=3.15 # ❌ 不能修改
- # 删除变量
- unset name
- # 特殊变量
- $0 # 脚本名称
- $1, $2, ... # 第 1, 2, ... 个参数
- $# # 参数个数
- $@ # 所有参数(作为独立字符串)
- $* # 所有参数(作为单个字符串)
- $? # 上一个命令的退出状态
- $$ # 当前进程 ID
- # 字符串
- str="hello world"
- echo ${#str} # 字符串长度
- echo ${str:0:5} # 截取前 5 个字符
- echo ${str/hello/hi} # 替换
- # 数组
- arr=(1 2 3 4 5)
- echo ${arr[0]} # 第 1 个元素
- echo ${arr[@]} # 所有元素
- echo ${#arr[@]} # 数组长度
- # 运算
- a=10
- b=20
- echo $((a + b)) # 加法
- echo $((a - b)) # 减法
- echo $((a * b)) # 乘法
- echo $((a / b)) # 除法
- echo $((a % b)) # 取余
复制代码
6.2 流程控制- # if 语句
- if [ $a -gt $b ]; then
- echo "a > b"
- elif [ $a -eq $b ]; then
- echo "a == b"
- else
- echo "a < b"
- fi
- # 条件判断
- # 数值比较:-eq(等于)、-ne(不等于)、-gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于)
- # 字符串:=(等于)、!=(不等于)、-z(为空)、-n(不为空)
- # 文件:-f(是文件)、-d(是目录)、-e(存在)、-r(可读)、-w(可写)、-x(可执行)
- # for 循环
- for i in 1 2 3 4 5; do
- echo $i
- done
- for i in {1..5}; do
- echo $i
- done
- for ((i=1; i<=5; i++)); do
- echo $i
- done
- # while 循环
- count=1
- while [ $count -le 5 ]; do
- echo $count
- count=$((count + 1))
- done
- # case 语句
- case $1 in
- start)
- echo "Starting..."
- ;;
- stop)
- echo "Stopping..."
- ;;
- restart)
- echo "Restarting..."
- ;;
- *)
- echo "Usage: $0 {start|stop|restart}"
- ;;
- esac
复制代码
6.3 函数- # 定义函数
- function greet() {
- echo "Hello, $1!"
- }
- # 调用函数
- greet "World"
- # 带返回值的函数
- add() {
- return $(( $1 + $2 ))
- }
- add 10 20
- echo "Sum: $?"
- # 局部变量
- myfunc() {
- local local_var="I'm local"
- echo $local_var
- }
复制代码
6.4 计划任务- # crontab 定时任务
- crontab -e # 编辑定时任务
- crontab -l # 列出定时任务
- crontab -r # 删除所有定时任务
- # crontab 格式
- # 分 时 日 月 周 命令
- # * * * * * command
- # 示例
- 0 2 * * * /backup.sh # 每天凌晨 2 点执行
- */5 * * * * /check.sh # 每 5 分钟执行
- 0 9 * * 1 /report.sh # 每周一 9 点执行
- 0 0 1 * * /cleanup.sh # 每月 1 号执行
- # at 一次性任务
- at now + 5 minutes # 5 分钟后执行
- at 10:00 # 10 点执行
- at> /script.sh
- at> Ctrl+D # 结束输入
复制代码
第六部分总结
| 章节 | 核心内容 |
|---|
| 脚本基础 | 变量、特殊变量、字符串、数组 | | 流程控制 | if/for/while/case | | 函数 | 函数定义、参数、返回值 | | 计划任务 | crontab、at |
第七部分:进程与服务管理
🎯 生活类比:进程就像"正在运行的程序"——
- 程序是静态的(硬盘上的文件)
- 进程是动态的(内存中运行的实例)
- 一个程序可以启动多个进程
- 每个进程有唯一的 PID(进程 ID)
7.1 进程管理
7.1.1 进程的概念- 进程的状态:
- - R(Running):运行中
- - S(Sleeping):睡眠中(等待事件)
- - D(Disk Sleep):磁盘睡眠(不可中断)
- - T(Stopped):停止
- - Z(Zombie):僵尸进程(已终止但父进程未回收)
- 进程的类型:
- - 交互进程:用户交互启动(bash、vim)
- - 批处理进程:自动执行(cron 任务)
- - 守护进程:后台运行(nginx、mysql)
- 父子关系:
- - 每个进程都有父进程(PPID)
- - 父进程创建子进程
- - 子进程终止后,父进程需要回收资源
- - 如果父进程先终止,子进程会被 init/systemd 收养
复制代码
7.1.2 ps 命令详解- # ps 常用选项
- ps aux # 查看所有进程(BSD 风格)
- ps -ef # 查看所有进程(System V 风格)
- ps aux | grep nginx # 查找特定进程
- ps -ef | grep java # 查找 Java 进程
- ps -u username # 查看指定用户的进程
- ps -p 1234 # 查看指定 PID 的进程
- ps -eo pid,ppid,user,%cpu,%mem,cmd # 自定义输出列
- # ps aux 输出解析
- # USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
- # root 1 0.0 0.1 1684 576 ? Ss Jan01 0:01 /sbin/init
- # USER:进程所有者
- # PID:进程 ID
- # %CPU:CPU 使用率
- # %MEM:内存使用率
- # VSZ:虚拟内存大小(KB)
- # RSS:物理内存大小(KB)
- # TTY:终端
- # STAT:进程状态
- # START:启动时间
- # TIME:累计 CPU 时间
- # COMMAND:命令
- # 进程状态说明
- # Ss:睡眠中,s 表示会话领导者
- # S+:前台进程
- # R+:运行中
- # Z:僵尸进程
- # T:停止
- # <:高优先级
- # N:低优先级
- # l:多线程
复制代码
7.1.3 top 命令详解- # top 实时监控
- top
- # top 输出解析
- # top - 14:30:00 up 10 days, 3:20, 2 users, load average: 0.50, 0.40, 0.35
- # Tasks: 120 total, 2 running, 118 sleeping, 0 stopped, 0 zombie
- # %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
- # MiB Mem : 16000.0 total, 8000.0 free, 4000.0 used, 4000.0 buff/cache
- # MiB Swap: 2000.0 total, 2000.0 free, 0.0 used. 11000.0 avail Mem
- # load average:系统负载(1分钟、5分钟、15分钟的平均值)
- # - 等于 CPU 核心数:满载
- # - 大于 CPU 核心数:超载
- # - 小于 CPU 核心数:正常
- # %Cpu(s):CPU 使用情况
- # - us:用户空间
- # - sy:内核空间
- # - ni:调整过优先级的进程
- # - id:空闲
- # - wa:等待 IO
- # - hi:硬件中断
- # - si:软件中断
- # - st:虚拟机偷取的时间
- # top 快捷键
- # 1:显示每个 CPU 核心
- # P:按 CPU 排序
- # M:按内存排序
- # k:终止进程
- # r:调整进程优先级
- # q:退出
- # h:帮助
复制代码
7.1.4 进程信号- # Linux 信号(Signal)
- # 信号是进程间通信的一种方式
- # 常用信号
- kill -l # 列出所有信号
- # 1 SIGHUP - 重新加载配置
- # 2 SIGINT - 中断(Ctrl+C)
- # 3 SIGQUIT - 退出(Ctrl+\)
- # 9 SIGKILL - 强制终止(不能被捕获)
- # 15 SIGTERM - 优雅终止(默认信号)
- # 18 SIGCONT - 继续执行
- # 19 SIGSTOP - 暂停执行(不能被捕获)
- # 20 SIGTSTP - 暂停执行(Ctrl+Z)
- # 发送信号
- kill PID # 发送 SIGTERM(优雅终止)
- kill -9 PID # 发送 SIGKILL(强制终止)
- kill -HUP PID # 发送 SIGHUP(重新加载配置)
- kill -STOP PID # 暂停进程
- kill -CONT PID # 继续进程
- # 按名称终止
- killall nginx # 终止所有 nginx 进程
- killall -9 nginx # 强制终止所有 nginx 进程
- # 按模式终止
- pkill -f "pattern" # 终止命令行包含 pattern 的进程
- pkill -u username # 终止指定用户的所有进程
- pgrep nginx # 查找 nginx 进程的 PID
复制代码
7.1.5 前后台作业- # 前后台作业管理
- # 将命令放到后台执行
- command & # 后台执行
- sleep 100 & # 后台执行 sleep
- # 查看后台作业
- jobs # 列出后台作业
- jobs -l # 列出后台作业(包含 PID)
- # 前后台切换
- Ctrl + Z # 暂停当前前台进程
- fg # 将最近的后台作业移到前台
- fg %1 # 将作业 1 移到前台
- bg # 将最近暂停的作业放到后台继续执行
- bg %1 # 将作业 1 放到后台继续执行
- # nohup(忽略挂断信号)
- nohup command & # 即使退出终端,进程也会继续运行
- nohup ./script.sh > output.log 2>&1 &
- # screen(终端复用器)
- screen -S mysession # 创建命名会话
- screen -ls # 列出会话
- screen -r mysession # 恢复会话
- screen -d mysession # 分离会话
- # 在 screen 中:
- # Ctrl+A, D:分离会话
- # Ctrl+A, C:创建新窗口
- # Ctrl+A, N:下一个窗口
- # tmux(更好的终端复用器)
- tmux new -s mysession # 创建命名会话
- tmux ls # 列出会话
- tmux attach -t mysession # 恢复会话
- tmux kill-session -t mysession # 删除会话
- # 在 tmux 中:
- # Ctrl+B, D:分离会话
- # Ctrl+B, C:创建新窗口
- # Ctrl+B, N:下一个窗口
- # Ctrl+B, %:水平分屏
- # Ctrl+B, ":垂直分屏
复制代码
7.1.6 僵尸进程处理- # 什么是僵尸进程?
- # - 进程已终止,但父进程未回收其资源
- # - 占用进程表条目,不占用 CPU 和内存
- # - 大量僵尸进程会导致无法创建新进程
- # 查找僵尸进程
- ps aux | grep 'Z'
- # 或
- ps -eo pid,ppid,stat,cmd | grep 'Z'
- # 处理僵尸进程
- # 方法 1:终止父进程(僵尸进程会被 init 收养并回收)
- kill -9 PPID
- # 方法 2:发送 SIGCHLD 给父进程(通知回收子进程)
- kill -17 PPID
- # 预防僵尸进程
- # - 父进程调用 wait() 或 waitpid() 回收子进程
- # - 使用 double fork 技术
- # - 使用信号处理函数处理 SIGCHLD
复制代码
7.2 systemd 服务管理
7.2.1 systemd 简介- systemd 是什么?
- - Linux 系统和服务管理器
- - 替代传统的 SysV init
- - CentOS 7+、Ubuntu 16.04+ 默认使用
- - 提供更快的启动速度、并行启动、依赖管理
- systemd 的核心概念:
- - Unit(单元):系统资源的抽象
- - Service(服务):后台运行的程序
- - Target(目标):一组 Unit 的集合
- - Timer(定时器):定时执行任务
复制代码
7.2.2 systemctl 详解- # ====== 服务操作 ======
- systemctl start nginx # 启动服务
- systemctl stop nginx # 停止服务
- systemctl restart nginx # 重启服务
- systemctl reload nginx # 重新加载配置(不中断服务)
- systemctl status nginx # 查看服务状态
- # ====== 开机启动 ======
- systemctl enable nginx # 设置开机启动
- systemctl disable nginx # 取消开机启动
- systemctl is-enabled nginx # 查看是否开机启动
- # ====== 服务状态 ======
- systemctl is-active nginx # 查看是否运行中
- systemctl is-failed nginx # 查看是否失败
- # ====== 查看服务 ======
- systemctl list-units # 列出所有 Unit
- systemctl list-units --type=service # 列出所有服务
- systemctl list-units --state=running # 列出运行中的服务
- systemctl list-units --state=failed # 列出失败的服务
- systemctl list-unit-files --type=service # 列出所有服务文件
- # ====== 服务依赖 ======
- systemctl list-dependencies nginx # 列出服务依赖
- systemctl list-dependencies --reverse nginx # 列出依赖此服务的其他服务
- # ====== 服务日志 ======
- journalctl -u nginx # 查看服务日志
- journalctl -u nginx -f # 实时查看服务日志
- journalctl -u nginx --since "1 hour ago" # 查看最近 1 小时的日志
- journalctl -u nginx --since "2024-01-01" --until "2024-01-02" # 指定时间范围
复制代码
7.2.3 编写 Service 文件- # /etc/systemd/system/myapp.service
- [Unit]
- # 服务描述
- Description=My Application
- # 服务文档
- Documentation=https://example.com/docs
- # 依赖关系
- After=network.target mysql.service
- Requires=network.target
- # 冲突服务
- Conflicts=shutdown.target
- [Service]
- # 服务类型
- # simple:主进程就是服务进程(默认)
- # forking:主进程 fork 出子进程,然后退出
- # oneshot:执行一次就退出
- # notify:类似 simple,但会通知 systemd 启动完成
- Type=simple
- # 运行用户和组
- User=app
- Group=app
- # 工作目录
- WorkingDirectory=/opt/myapp
- # 环境变量
- Environment=JAVA_HOME=/usr/lib/jvm/java-17
- EnvironmentFile=/opt/myapp/.env
- # 启动命令
- ExecStart=/usr/bin/java -jar /opt/myapp/app.jar
- # 停止命令
- ExecStop=/bin/kill -TERM $MAINPID
- # 重新加载命令
- ExecReload=/bin/kill -HUP $MAINPID
- # 重启策略
- # no:不重启
- # on-success:正常退出时重启
- # on-failure:异常退出时重启
- # always:总是重启
- Restart=on-failure
- # 重启间隔
- RestartSec=10
- # 启动超时时间
- TimeoutStartSec=300
- # 停止超时时间
- TimeoutStopSec=30
- # 最大文件描述符
- LimitNOFILE=65536
- # 最大进程数
- LimitNPROC=4096
- [Install]
- # 多用户模式启动
- WantedBy=multi-user.target
复制代码
7.2.4 常见服务配置示例- # ====== Nginx 服务 ======
- [Unit]
- Description=nginx - high performance web server
- After=network.target
- [Service]
- Type=forking
- PIDFile=/run/nginx.pid
- ExecStartPre=/usr/sbin/nginx -t
- ExecStart=/usr/sbin/nginx
- ExecReload=/bin/kill -s HUP $MAINPID
- ExecStop=/bin/kill -s QUIT $MAINPID
- PrivateTmp=true
- [Install]
- WantedBy=multi-user.target
- # ====== MySQL 服务 ======
- [Unit]
- Description=MySQL Server
- After=network.target
- [Service]
- Type=notify
- User=mysql
- Group=mysql
- ExecStart=/usr/sbin/mysqld
- LimitNOFILE=65536
- Restart=on-failure
- [Install]
- WantedBy=multi-user.target
- # ====== Java 应用服务 ======
- [Unit]
- Description=My Java Application
- After=network.target
- [Service]
- Type=simple
- User=app
- Group=app
- WorkingDirectory=/opt/myapp
- ExecStart=/usr/bin/java -Xms512m -Xmx1024m -jar app.jar
- ExecStop=/bin/kill -TERM $MAINPID
- Restart=on-failure
- RestartSec=10
- Environment=SPRING_PROFILES_ACTIVE=prod
- [Install]
- WantedBy=multi-user.target
复制代码
7.2.5 Timer 定时器- # systemd Timer 替代 crontab
- # /etc/systemd/system/backup.timer
- [Unit]
- Description=Daily backup timer
- [Timer]
- OnCalendar=*-*-* 02:00:00 # 每天凌晨 2 点
- Persistent=true # 错过的任务会补执行
- RandomizedDelaySec=300 # 随机延迟 0-300 秒
- [Install]
- WantedBy=timers.target
- # /etc/systemd/system/backup.service
- [Unit]
- Description=Daily backup
- [Service]
- Type=oneshot
- ExecStart=/opt/scripts/backup.sh
- User=root
- # 启用定时器
- systemctl enable backup.timer
- systemctl start backup.timer
- # 查看定时器状态
- systemctl list-timers
- systemctl status backup.timer
复制代码
7.2.6 Target 目标- # Target 是一组 Unit 的集合
- # 常用 Target
- # multi-user.target:多用户模式(命令行)
- # graphical.target:图形界面模式
- # rescue.target:救援模式
- # emergency.target:紧急模式
- # 查看当前 Target
- systemctl get-default
- # 设置默认 Target
- systemctl set-default multi-user.target
- systemctl set-default graphical.target
- # 切换 Target
- systemctl isolate multi-user.target
- systemctl isolate graphical.target
- # 进入救援模式
- systemctl rescue
复制代码
7.3 进程监控实战- # 场景 1:查找占用 CPU 最高的进程
- ps aux --sort=-%cpu | head -10
- # 场景 2:查找占用内存最高的进程
- ps aux --sort=-%mem | head -10
- # 场景 3:查找指定端口的进程
- ss -tlnp | grep :80
- lsof -i :80
- # 场景 4:查看进程打开的文件
- lsof -p PID
- lsof -p PID | wc -l # 统计打开的文件数
- # 场景 5:查看进程的网络连接
- ss -antp | grep PID
- netstat -antp | grep PID
- # 场景 6:跟踪进程系统调用
- strace -p PID # 跟踪系统调用
- strace -p PID -e trace=file # 只跟踪文件相关调用
- strace -p PID -e trace=network # 只跟踪网络相关调用
- # 场景 7:查看进程的内存映射
- pmap PID
- cat /proc/PID/maps
- # 场景 8:查看进程的环境变量
- cat /proc/PID/environ | tr '\0' '\n'
复制代码
第七部分总结
| 章节 | 核心内容 |
|---|
| 进程概念 | 进程状态、父子关系、僵尸进程 | | ps 命令 | aux、-ef、自定义输出、状态解析 | | top 命令 | 实时监控、负载、CPU/内存使用 | | 进程信号 | SIGTERM、SIGKILL、SIGHUP、信号发送 | | 前后台作业 | jobs、fg、bg、nohup、screen/tmux | | systemd | systemctl 操作、Service 文件、Timer、Target |
第八部分:网络管理
🎯 生活类比:Linux 网络就像"高速公路系统"——
- IP 地址是"门牌号"
- 端口是"房间号"
- 防火墙是"门卫"
- 路由是"导航系统"
8.1 网络基础
8.1.1 网络概念- IP 地址:
- - IPv4:192.168.1.100(32位,4组数字)
- - IPv6:2001:db8::1(128位)
- - 公网 IP:全球唯一
- - 私网 IP:局域网内使用(10.x.x.x、172.16-31.x.x、192.168.x.x)
- 端口:
- - 范围:0-65535
- - 0-1023:系统端口(需要 root 权限)
- - 1024-49151:注册端口
- - 49152-65535:动态端口
- 常用端口:
- - 22:SSH
- - 80:HTTP
- - 443:HTTPS
- - 3306:MySQL
- - 6379:Redis
- - 8080:Tomcat
- 子网掩码:
- - 255.255.255.0(/24):254 个可用 IP
- - 255.255.0.0(/16):65534 个可用 IP
- - 255.0.0.0(/8):16777214 个可用 IP
- 默认网关:
- - 路由器的 IP 地址
- - 用于访问其他网络
复制代码
8.1.2 网络配置文件- # CentOS/RHEL 网卡配置
- /etc/sysconfig/network-scripts/ifcfg-eth0
- # 配置示例
- TYPE=Ethernet
- BOOTPROTO=static # static=静态IP,dhcp=动态IP
- NAME=eth0
- DEVICE=eth0
- ONBOOT=yes # 开机启动
- IPADDR=192.168.1.100 # IP 地址
- NETMASK=255.255.255.0 # 子网掩码
- GATEWAY=192.168.1.1 # 网关
- DNS1=8.8.8.8 # DNS 服务器
- DNS2=8.8.4.4
- # Ubuntu 网卡配置(netplan)
- /etc/netplan/00-installer-config.yaml
- # 配置示例
- network:
- version: 2
- ethernets:
- eth0:
- dhcp4: no
- addresses:
- - 192.168.1.100/24
- gateway4: 192.168.1.1
- nameservers:
- addresses: [8.8.8.8, 8.8.4.4]
- # DNS 配置
- /etc/resolv.conf
- nameserver 8.8.8.8
- nameserver 8.8.4.4
- # 主机名配置
- /etc/hostname
- hostnamectl set-hostname myserver
- # hosts 文件
- /etc/hosts
- 192.168.1.100 myserver
复制代码
8.2 网络命令详解
8.2.1 ip 命令- # ip 命令(替代 ifconfig)
- # 查看 IP 地址
- ip addr # 查看所有网卡
- ip addr show # 同上
- ip addr show eth0 # 查看指定网卡
- ip -4 addr # 只显示 IPv4
- ip -6 addr # 只显示 IPv6
- # 查看路由
- ip route # 查看路由表
- ip route show # 同上
- ip route get 8.8.8.8 # 查看到达指定 IP 的路由
- # 网卡操作
- ip link show # 查看网卡状态
- ip link set eth0 up # 启用网卡
- ip link set eth0 down # 禁用网卡
- # 临时添加 IP
- ip addr add 192.168.1.200/24 dev eth0
- ip addr del 192.168.1.200/24 dev eth0
- # 添加路由
- ip route add 10.0.0.0/8 via 192.168.1.1
- ip route del 10.0.0.0/8
- # 邻居表(ARP)
- ip neigh # 查看 ARP 表
复制代码
8.2.2 ss 命令- # ss 命令(替代 netstat)
- # 查看监听端口
- ss -tlnp # TCP 监听端口
- ss -ulnp # UDP 监听端口
- ss -tlnp | grep :80 # 查看 80 端口
- # 查看所有连接
- ss -antp # 所有 TCP 连接
- ss -s # 连接统计
- # 查看指定状态的连接
- ss -t state established # 已建立的连接
- ss -t state time-wait # TIME_WAIT 状态
- ss -t state close-wait # CLOSE_WAIT 状态
- # 查看指定进程的连接
- ss -antp | grep PID
- ss -antp | grep nginx
- # 输出解析
- # State Recv-Q Send-Q Local Address:Port Peer Address:Port
- # LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
- # State:连接状态
- # Recv-Q:接收队列
- # Send-Q:发送队列
- # Local Address:Port:本地地址和端口
- # Peer Address:Port:远程地址和端口
复制代码
8.2.3 ping 和 traceroute- # ping 测试连通性
- ping 8.8.8.8 # 持续 ping
- ping -c 4 8.8.8.8 # 只 ping 4 次
- ping -i 0.5 8.8.8.8 # 每 0.5 秒 ping 一次
- ping -s 1024 8.8.8.8 # 指定包大小
- ping -W 2 8.8.8.8 # 超时 2 秒
- # traceroute 追踪路由
- traceroute 8.8.8.8 # 追踪到目标的路由
- traceroute -n 8.8.8.8 # 不解析主机名(更快)
- traceroute -I 8.8.8.8 # 使用 ICMP
- traceroute -T 8.8.8.8 # 使用 TCP
- # mtr(更好的追踪工具)
- mtr 8.8.8.8 # 实时追踪路由
- mtr -n 8.8.8.8 # 不解析主机名
复制代码
8.2.4 DNS 查询- # nslookup
- nslookup example.com # 查询 A 记录
- nslookup -type=MX example.com # 查询 MX 记录
- nslookup example.com 8.8.8.8 # 指定 DNS 服务器
- # dig(更详细)
- dig example.com # 查询 A 记录
- dig example.com MX # 查询 MX 记录
- dig example.com @8.8.8.8 # 指定 DNS 服务器
- dig +short example.com # 只显示 IP
- dig -x 8.8.8.8 # 反向查询
- # host
- host example.com # 查询 A 记录
- host -t MX example.com # 查询 MX 记录
复制代码
8.2.5 curl 和 wget- # curl(HTTP 请求工具)
- # GET 请求
- curl https://example.com
- curl -o file.html https://example.com # 保存到文件
- curl -O https://example.com/file.zip # 保存文件(使用原文件名)
- # POST 请求
- curl -X POST -d "name=value" https://api.example.com
- curl -X POST -H "Content-Type: application/json" -d '{"name":"value"}' https://api.example.com
- # 常用选项
- curl -v https://example.com # 显示详细信息
- curl -k https://example.com # 忽略 SSL 证书
- curl -L https://example.com # 跟随重定向
- curl -u user:pass https://example.com # 基本认证
- curl -H "Header: value" https://example.com # 自定义请求头
- # wget(下载工具)
- # 下载文件
- wget https://example.com/file.zip
- wget -O newname.zip https://example.com/file.zip # 指定文件名
- # 断点续传
- wget -c https://example.com/largefile.zip
- # 后台下载
- wget -b https://example.com/largefile.zip
- # 下载整个网站
- wget -r -np -k https://example.com
复制代码
8.3 防火墙
8.3.1 firewalld- # firewalld(CentOS 7+ 默认)
- # 基本操作
- systemctl status firewalld # 查看状态
- systemctl start firewalld # 启动
- systemctl stop firewalld # 停止
- systemctl enable firewalld # 开机启动
- # 区域(Zone)
- firewall-cmd --get-zones # 列出所有区域
- firewall-cmd --get-default-zone # 查看默认区域
- firewall-cmd --set-default-zone=public # 设置默认区域
- # 常用区域
- # trusted:允许所有
- # home:允许大部分
- # public:默认,只允许选定的服务
- # block:拒绝所有
- # drop:丢弃所有
- # 服务管理
- firewall-cmd --list-services # 列出允许的服务
- firewall-cmd --add-service=http # 允许 HTTP(临时)
- firewall-cmd --permanent --add-service=http # 允许 HTTP(永久)
- firewall-cmd --remove-service=http # 移除 HTTP
- # 端口管理
- firewall-cmd --list-ports # 列出允许的端口
- firewall-cmd --add-port=8080/tcp # 开放端口(临时)
- firewall-cmd --permanent --add-port=8080/tcp # 开放端口(永久)
- firewall-cmd --remove-port=8080/tcp # 关闭端口
- # 重新加载配置
- firewall-cmd --reload
- # 端口转发
- firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
- firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
- # 查看规则
- firewall-cmd --list-all # 列出所有规则
- firewall-cmd --list-all --zone=public # 列出指定区域的规则
复制代码
8.3.2 iptables- # iptables(底层防火墙工具)
- # 查看规则
- iptables -L # 列出规则
- iptables -L -n # 不解析主机名
- iptables -L -v # 显示详细信息
- iptables -L --line-numbers # 显示行号
- # 链(Chain)
- # INPUT:入站流量
- # OUTPUT:出站流量
- # FORWARD:转发流量
- # 规则操作
- # ACCEPT:允许
- # DROP:丢弃
- # REJECT:拒绝
- # 添加规则
- iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许 80 端口
- iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT # 允许指定网段
- iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许已建立的连接
- # 插入规则
- iptables -I INPUT 1 -p tcp --dport 443 -j ACCEPT # 在第 1 行插入
- # 删除规则
- iptables -D INPUT -p tcp --dport 80 -j ACCEPT # 删除规则
- iptables -D INPUT 1 # 删除第 1 行规则
- # 清空规则
- iptables -F # 清空所有规则
- # 保存规则
- service iptables save # CentOS 6
- iptables-save > /etc/iptables/rules.v4 # 保存到文件
- # 恢复规则
- iptables-restore < /etc/iptables/rules.v4
- # 常见配置示例
- # 允许 SSH
- iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- # 允许 HTTP/HTTPS
- iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- iptables -A INPUT -p tcp --dport 443 -j ACCEPT
- # 允许本地回环
- iptables -A INPUT -i lo -j ACCEPT
- # 允许已建立的连接
- iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- # 拒绝其他所有入站
- iptables -P INPUT DROP
- # 允许所有出站
- iptables -P OUTPUT ACCEPT
复制代码
8.4 SSH 配置详解
8.4.1 SSH 基础配置- # SSH 配置文件
- /etc/ssh/sshd_config
- # 常用配置项
- Port 2222 # 修改端口(安全)
- PermitRootLogin no # 禁止 root 登录
- PasswordAuthentication no # 禁止密码登录(只允许密钥)
- PubkeyAuthentication yes # 允许密钥登录
- MaxAuthTries 3 # 最大尝试次数
- ClientAliveInterval 60 # 心跳间隔(秒)
- ClientAliveCountMax 3 # 最大心跳次数
- AllowUsers user1 user2 # 只允许指定用户登录
- DenyUsers user3 # 禁止指定用户登录
- # 重启 SSH 服务
- systemctl restart sshd
- # 测试配置
- sshd -t # 测试配置文件语法
复制代码
8.4.2 SSH 免密登录- # 1. 生成密钥对(在客户端执行)
- ssh-keygen -t rsa -b 4096
- # 或
- ssh-keygen -t ed25519 # 推荐,更安全
- # 2. 复制公钥到服务器
- ssh-copy-id user@server
- # 或手动复制
- cat ~/.ssh/id_rsa.pub | ssh user@server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
- # 3. 设置权限(重要!)
- chmod 700 ~/.ssh
- chmod 600 ~/.ssh/authorized_keys
- # 4. 测试免密登录
- ssh user@server
- # SSH 配置文件(客户端)
- ~/.ssh/config
- Host myserver
- HostName 192.168.1.100
- User user1
- Port 2222
- IdentityFile ~/.ssh/id_rsa
- # 使用
- ssh myserver # 等同于 ssh -p 2222 user1@192.168.1.100
复制代码
8.4.3 文件传输- # scp(安全复制)
- scp file user@host:/path/ # 上传文件
- scp user@host:/path/file . # 下载文件
- scp -r dir user@host:/path/ # 上传目录
- scp -P 2222 file user@host:/path/ # 指定端口
- # rsync(增量同步)
- rsync -avz file user@host:/path/ # 同步文件
- rsync -avz dir/ user@host:/path/ # 同步目录(注意尾部 /)
- rsync -avz --delete dir/ user@host:/path/ # 同步并删除目标多余文件
- rsync -avz -e "ssh -p 2222" dir/ user@host:/path/ # 指定端口
- # sftp(安全 FTP)
- sftp user@host
- # sftp 命令:
- # ls:列出远程文件
- # lls:列出本地文件
- # cd:切换远程目录
- # lcd:切换本地目录
- # put file:上传文件
- # get file:下载文件
- # mkdir:创建远程目录
- # quit:退出
复制代码
8.5 网络故障排查- # 排查流程:
- # 1. 检查本机网络
- # 2. 检查网关
- # 3. 检查 DNS
- # 4. 检查远程服务
- # 1. 检查本机网络
- ip addr show # 查看 IP 是否配置
- ip link show eth0 # 查看网卡是否启用
- ping 127.0.0.1 # 测试本地回环
- # 2. 检查网关
- ip route show # 查看路由表
- ping 192.168.1.1 # ping 网关
- # 3. 检查 DNS
- cat /etc/resolv.conf # 查看 DNS 配置
- nslookup example.com # 测试 DNS 解析
- ping 8.8.8.8 # 测试外网连通性
- # 4. 检查远程服务
- telnet 192.168.1.100 80 # 测试端口连通
- curl -v http://192.168.1.100 # 测试 HTTP 服务
- traceroute 8.8.8.8 # 追踪路由
- # 5. 检查防火墙
- iptables -L -n # 查看 iptables 规则
- firewall-cmd --list-all # 查看 firewalld 规则
- # 6. 检查网络连接
- ss -antp # 查看所有连接
- ss -s # 连接统计
- # 7. 抓包分析
- tcpdump -i eth0 port 80 # 抓取 80 端口的包
- tcpdump -i eth0 host 192.168.1.100 # 抓取指定主机的包
- tcpdump -i eth0 -w capture.pcap # 保存到文件
复制代码
第八部分总结
| 章节 | 核心内容 |
|---|
| 网络基础 | IP、端口、子网掩码、网关、DNS | | 网络配置 | CentOS ifcfg、Ubuntu netplan、DNS、hosts | | ip 命令 | 查看 IP、路由、网卡状态 | | ss 命令 | 查看端口、连接、状态 | | ping/traceroute | 连通性测试、路由追踪 | | DNS 查询 | nslookup、dig、host | | curl/wget | HTTP 请求、文件下载 | | firewalld | 区域、服务、端口管理 | | iptables | 规则、链、操作 | | SSH | 配置、免密登录、scp/rsync | | 故障排查 | 7 步排查流程 |
第九部分:软件包管理
🎯 生活类比:软件包管理就像"手机应用商店"——
- RPM/APK 是"安装包"(单个应用)
- YUM/APT 是"应用商店"(自动解决依赖)
- 源(Repository)是"应用商店的服务器"
9.1 RPM 包管理- # RPM(Red Hat Package Manager):底层包管理工具
- # 安装
- rpm -ivh package.rpm # 安装(i=install, v=verbose, h=hash)
- rpm -Uvh package.rpm # 升级(如果未安装则安装)
- rpm -Fvh package.rpm # 升级(如果未安装则不安装)
- # 卸载
- rpm -e package # 卸载
- rpm -e --nodeps package # 卸载(忽略依赖,危险!)
- # 查询
- rpm -qa # 列出所有已安装的包
- rpm -qa | grep nginx # 查找特定包
- rpm -qi nginx # 查看包信息
- rpm -ql nginx # 列出包安装的文件
- rpm -qc nginx # 列出包的配置文件
- rpm -qf /usr/sbin/nginx # 查看文件属于哪个包
- rpm -qf $(which nginx) # 查看命令属于哪个包
- # 验证
- rpm -V nginx # 验证包是否被修改
复制代码
9.2 YUM/DNF 包管理- # YUM(Yellowdog Updater Modified):高层包管理工具,自动解决依赖
- # 安装
- yum install nginx # 安装
- yum install -y nginx # 安装(不询问确认)
- yum install nginx-1.20.1 # 安装指定版本
- # 卸载
- yum remove nginx # 卸载
- yum erase nginx # 同上
- # 更新
- yum update nginx # 更新指定包
- yum update # 更新所有包
- yum check-update # 检查可更新的包
- # 搜索
- yum search nginx # 搜索包
- yum info nginx # 查看包信息
- yum list available # 列出可用的包
- yum list installed # 列出已安装的包
- yum list updates # 列出可更新的包
- # 缓存
- yum clean all # 清理所有缓存
- yum makecache # 生成缓存
- # 历史
- yum history # 查看操作历史
- yum history undo 1 # 撤销第 1 次操作
- # 仓库
- yum repolist # 列出仓库
- yum repolist all # 列出所有仓库(包括禁用的)
- # 组
- yum grouplist # 列出软件包组
- yum groupinstall "Development Tools" # 安装软件包组
复制代码
9.3 配置 YUM 源- # 备份原配置
- mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
- # 下载阿里云源(CentOS 7)
- wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
- # 下载阿里云源(CentOS 8/Rocky)
- wget -O /etc/yum.repos.d/Rocky-Base.repo https://mirrors.aliyun.com/repo/Rocky-Base.repo
- # 生成缓存
- yum clean all
- yum makecache
- # 添加 EPEL 源(Extra Packages for Enterprise Linux)
- yum install -y epel-release
- # 添加第三方仓库
- yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
复制代码
9.4 APT 包管理(Debian/Ubuntu)- # APT(Advanced Package Tool):Debian/Ubuntu 的包管理工具
- # 更新索引
- apt update # 更新包索引(必须先执行)
- # 安装
- apt install nginx # 安装
- apt install -y nginx # 安装(不询问确认)
- apt install nginx=1.18.0 # 安装指定版本
- # 卸载
- apt remove nginx # 卸载(保留配置)
- apt purge nginx # 卸载并删除配置
- apt autoremove # 清理不需要的依赖
- # 更新
- apt upgrade # 更新所有包
- apt full-upgrade # 更新所有包(可能删除旧包)
- # 搜索
- apt search nginx # 搜索包
- apt show nginx # 查看包信息
- apt list --installed # 列出已安装的包
- apt list --upgradable # 列出可更新的包
- # 清理
- apt clean # 清理下载的包
- apt autoclean # 清理旧版本的包
- # 配置源
- /etc/apt/sources.list
- # 添加 PPA(个人包归档)
- add-apt-repository ppa:ondrej/php
- apt update
复制代码
9.5 源码编译安装- # 源码编译三部曲:configure → make → make install
- # 1. 安装编译工具
- yum groupinstall "Development Tools" -y # CentOS
- apt install build-essential -y # Ubuntu
- # 2. 下载源码
- wget https://example.com/software-1.0.tar.gz
- # 3. 解压
- tar -xzvf software-1.0.tar.gz
- cd software-1.0
- # 4. 配置(检查依赖、设置安装路径)
- ./configure --prefix=/usr/local/software
- # 5. 编译
- make -j4 # 使用 4 个核心编译
- # 6. 安装
- make install
- # 7. 配置环境变量
- echo 'export PATH=/usr/local/software/bin:$PATH' >> /etc/profile
- source /etc/profile
复制代码
第九部分总结
| 章节 | 核心内容 |
|---|
| RPM | 底层包管理,安装/卸载/查询 | | YUM/DNF | 高层包管理,自动解决依赖 | | YUM 源配置 | 阿里云源、EPEL 源 | | APT | Debian/Ubuntu 包管理 | | 源码编译 | configure → make → make install |
第十部分:常见服务搭建
🎯 实战目标:掌握 Nginx、MySQL、Redis、Docker 的安装和配置
10.1 Nginx
10.1.1 安装- # CentOS
- yum install -y epel-release
- yum install -y nginx
- # Ubuntu
- apt update
- apt install -y nginx
- # 启动
- systemctl start nginx
- systemctl enable nginx
- # 验证
- curl http://localhost
复制代码
10.1.2 配置文件- # /etc/nginx/nginx.conf
- user nginx; # 运行用户
- worker_processes auto; # 工作进程数(auto = CPU 核心数)
- error_log /var/log/nginx/error.log; # 错误日志
- pid /run/nginx.pid; # PID 文件
- events {
- worker_connections 1024; # 每个进程的最大连接数
- }
- http {
- include /etc/nginx/mime.types;
- default_type application/octet-stream;
- # 日志格式
- log_format main '$remote_addr - $remote_user [$time_local] "$request" '
- '$status $body_bytes_sent "$http_referer" '
- '"$http_user_agent"';
- access_log /var/log/nginx/access.log main;
- sendfile on;
- keepalive_timeout 65;
- # 包含其他配置文件
- include /etc/nginx/conf.d/*.conf;
- }
复制代码
10.1.3 虚拟主机- # /etc/nginx/conf.d/example.conf
- server {
- listen 80;
- server_name example.com www.example.com;
- root /var/www/example;
- index index.html index.htm;
- # 日志
- access_log /var/log/nginx/example.access.log;
- error_log /var/log/nginx/example.error.log;
- # 静态文件
- location / {
- try_files $uri $uri/ /index.html;
- }
- # 缓存静态资源
- location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
- expires 1y;
- add_header Cache-Control "public, immutable";
- }
- }
复制代码
10.1.4 反向代理- # API 反向代理
- server {
- listen 80;
- server_name api.example.com;
- location / {
- proxy_pass http://127.0.0.1:8080;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
- }
- }
- # WebSocket 代理
- server {
- listen 80;
- server_name ws.example.com;
- location /ws {
- proxy_pass http://127.0.0.1:8080;
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection "upgrade";
- }
- }
- # 负载均衡
- upstream backend {
- server 192.168.1.101:8080 weight=3;
- server 192.168.1.102:8080 weight=2;
- server 192.168.1.103:8080 weight=1;
- }
- server {
- listen 80;
- server_name api.example.com;
- location / {
- proxy_pass http://backend;
- }
- }
复制代码
10.1.5 HTTPS 配置- server {
- listen 443 ssl;
- server_name example.com;
- ssl_certificate /etc/nginx/ssl/cert.pem;
- ssl_certificate_key /etc/nginx/ssl/key.pem;
- ssl_protocols TLSv1.2 TLSv1.3;
- ssl_ciphers HIGH:!aNULL:!MD5;
- # HTTP 跳转 HTTPS
- # 在 80 端口的 server 中添加:
- # return 301 https://$server_name$request_uri;
- }
- # 使用 Let's Encrypt 免费证书
- # 安装 certbot
- yum install -y certbot python3-certbot-nginx # CentOS
- apt install -y certbot python3-certbot-nginx # Ubuntu
- # 获取证书
- certbot --nginx -d example.com -d www.example.com
- # 自动续期
- certbot renew --dry-run
复制代码
10.2 MySQL
10.2.1 安装- # CentOS 7
- yum install -y mysql-server
- systemctl start mysqld
- systemctl enable mysqld
- # CentOS 8 / Rocky Linux
- dnf install -y mysql-server
- systemctl start mysqld
- systemctl enable mysqld
- # Ubuntu
- apt install -y mysql-server
- systemctl start mysql
- systemctl enable mysql
- # 获取临时密码(CentOS 7)
- grep 'temporary password' /var/log/mysqld.log
- # 安全初始化
- mysql_secure_installation
- # - 设置 root 密码
- # - 删除匿名用户
- # - 禁止 root 远程登录
- # - 删除测试数据库
复制代码
10.2.2 用户管理- -- 创建用户
- CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password';
- CREATE USER 'user1'@'%' IDENTIFIED BY 'password'; -- 允许远程连接
- -- 授权
- GRANT ALL PRIVILEGES ON mydb.* TO 'user1'@'%';
- GRANT SELECT, INSERT ON mydb.* TO 'user1'@'%';
- GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
- -- 刷新权限
- FLUSH PRIVILEGES;
- -- 查看权限
- SHOW GRANTS FOR 'user1'@'%';
- -- 撤销权限
- REVOKE ALL PRIVILEGES ON mydb.* FROM 'user1'@'%';
- -- 删除用户
- DROP USER 'user1'@'%';
- -- 修改密码
- ALTER USER 'user1'@'%' IDENTIFIED BY 'new_password';
复制代码
10.2.3 备份恢复- # 备份
- mysqldump -u root -p mydb > backup.sql
- mysqldump -u root -p --all-databases > all_backup.sql
- mysqldump -u root -p mydb table1 table2 > tables_backup.sql
- # 恢复
- mysql -u root -p mydb < backup.sql
- # 定时备份
- # /etc/cron.d/mysql-backup
- 0 2 * * * root mysqldump -u root -p'password' mydb | gzip > /backup/mydb_$(date +\%Y\%m\%d).sql.gz
复制代码
10.3 Redis
10.3.1 安装- # CentOS
- yum install -y epel-release
- yum install -y redis
- systemctl start redis
- systemctl enable redis
- # Ubuntu
- apt install -y redis-server
- systemctl start redis
- systemctl enable redis
- # 源码安装
- wget https://download.redis.io/redis-stable.tar.gz
- tar -xzvf redis-stable.tar.gz
- cd redis-stable
- make
- make install
复制代码
10.3.2 配置- # /etc/redis/redis.conf
- # 绑定地址
- bind 127.0.0.1 # 只允许本地连接
- # bind 0.0.0.0 # 允许所有连接
- # 端口
- port 6379
- # 密码
- requirepass your_password
- # 持久化
- save 900 1 # 900 秒内有 1 个 key 变化,就快照
- save 300 10 # 300 秒内有 10 个 key 变化,就快照
- save 60 10000 # 60 秒内有 10000 个 key 变化,就快照
- # AOF 持久化
- appendonly yes
- appendfsync everysec
- # 内存
- maxmemory 256mb
- maxmemory-policy allkeys-lru
复制代码
10.4 Docker
10.4.1 安装- # CentOS
- yum install -y yum-utils
- yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- yum install -y docker-ce docker-ce-cli containerd.io
- # Ubuntu
- apt install -y apt-transport-https ca-certificates curl software-properties-common
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
- add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
- apt update
- apt install -y docker-ce
- # 启动
- systemctl start docker
- systemctl enable docker
- # 配置镜像加速
- cat > /etc/docker/daemon.json <<EOF
- {
- "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
- }
- EOF
- systemctl daemon-reload
- systemctl restart docker
复制代码
10.4.2 镜像操作- docker pull nginx # 拉取镜像
- docker images # 列出镜像
- docker rmi nginx # 删除镜像
- docker image prune # 清理无用镜像
- docker save nginx > nginx.tar # 导出镜像
- docker load < nginx.tar # 导入镜像
- docker tag nginx mynginx:v1 # 打标签
复制代码
10.4.3 容器操作- # 运行容器
- docker run -d --name mynginx -p 80:80 nginx
- # 参数说明
- # -d:后台运行
- # --name:容器名称
- # -p 80:80:端口映射(宿主机:容器)
- # -v /data:/data:目录挂载
- # -e MYSQL_ROOT_PASSWORD=123456:环境变量
- # --restart=always:自动重启
- # 容器管理
- docker ps # 查看运行中的容器
- docker ps -a # 查看所有容器
- docker stop mynginx # 停止容器
- docker start mynginx # 启动容器
- docker restart mynginx # 重启容器
- docker rm mynginx # 删除容器
- docker rm -f mynginx # 强制删除
- # 查看日志
- docker logs mynginx
- docker logs -f mynginx # 实时查看
- docker logs --tail 100 mynginx # 查看最后 100 行
- # 进入容器
- docker exec -it mynginx bash
- docker exec -it mynginx sh
- # 查看容器信息
- docker inspect mynginx
- docker stats # 实时查看资源使用
复制代码
10.4.4 Docker Compose- # docker-compose.yml
- version: '3.8'
- services:
- nginx:
- image: nginx
- ports:
- - "80:80"
- volumes:
- - ./html:/usr/share/nginx/html
- depends_on:
- - app
- app:
- image: myapp:v1
- ports:
- - "8080:8080"
- environment:
- - SPRING_PROFILES_ACTIVE=prod
- depends_on:
- - db
- db:
- image: mysql:8.0
- environment:
- MYSQL_ROOT_PASSWORD: 123456
- MYSQL_DATABASE: mydb
- volumes:
- - mysql-data:/var/lib/mysql
- ports:
- - "3306:3306"
- redis:
- image: redis:7-alpine
- ports:
- - "6379:6379"
- volumes:
- mysql-data:
复制代码- # 常用命令
- docker-compose up -d # 启动所有服务
- docker-compose down # 停止所有服务
- docker-compose ps # 查看服务状态
- docker-compose logs -f # 查看日志
- docker-compose restart # 重启所有服务
- docker-compose build # 重新构建镜像
复制代码
第十部分总结
| 章节 | 核心内容 |
|---|
| Nginx | 虚拟主机、反向代理、负载均衡、HTTPS | | MySQL | 安装、用户管理、备份恢复 | | Redis | 安装配置、持久化、内存管理 | | Docker | 镜像操作、容器管理、Compose 编排 |
第十一部分:性能监控与调优
🎯 生活类比:性能监控就像"汽车仪表盘"——
- 速度表(CPU 使用率)
- 油表(内存使用率)
- 转速表(磁盘 IO)
- 里程表(网络流量)
11.1 监控命令详解
11.1.1 系统负载- # uptime:查看系统负载
- uptime
- # 14:30:00 up 10 days, 3:20, 2 users, load average: 0.50, 0.40, 0.35
- # load average 解读:
- # 1 分钟、5 分钟、15 分钟的平均负载
- # - 等于 CPU 核心数:满载
- # - 大于 CPU 核心数:超载
- # - 小于 CPU 核心数:正常
- # 查看 CPU 核心数
- nproc
- # 或
- lscpu | grep "^CPU(s):"
复制代码
11.1.2 内存监控- # free:查看内存使用
- free -h
- # total used free shared buff/cache available
- # Mem: 15Gi 4.0Gi 8.0Gi 256Mi 3.0Gi 10Gi
- # Swap: 2.0Gi 0B 2.0Gi
- # 解读:
- # total:总内存
- # used:已使用(不包括 buff/cache)
- # free:空闲内存
- # shared:共享内存
- # buff/cache:缓冲/缓存
- # available:可用内存(free + buff/cache 中可回收的部分)
- # 关键指标:
- # - available 低 → 内存不足
- # - Swap 使用高 → 内存不足,正在使用交换分区
复制代码
11.1.3 CPU 监控- # top:实时查看 CPU 使用
- # %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
- # 解读:
- # us:用户空间(应用程序)
- # sy:内核空间(系统调用)
- # ni:调整过优先级的进程
- # id:空闲
- # wa:等待 IO
- # hi:硬件中断
- # si:软件中断
- # st:虚拟机偷取的时间
- # vmstat:系统状态监控
- vmstat 1 10 # 每秒采样 10 次
- # procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
- # r b swpd free buff cache si so bi bo in cs us sy id wa st
- # 1 0 0 8000000 200000 3000000 0 0 0 0 100 200 5 2 92 0 0
- # 关键指标:
- # r:运行队列长度(大于 CPU 核心数表示 CPU 不足)
- # b:等待 IO 的进程数
- # si/so:交换分区换入/换出(大于 0 表示内存不足)
- # bi/bo:磁盘读写(大表示 IO 繁忙)
复制代码
11.1.4 磁盘监控- # df:查看磁盘使用
- df -h
- # Filesystem Size Used Avail Use% Mounted on
- # /dev/sda1 50G 20G 28G 42% /
- # du:查看目录大小
- du -sh /var/log # 查看目录总大小
- du -sh /var/log/* # 查看子目录大小
- du -sh /var/log/* | sort -rh # 按大小排序
- # iostat:磁盘 IO 监控
- iostat -x 1 10
- # Device r/s w/s rkB/s wkB/s await %util
- # sda 10.00 20.00 400 800 5.00 30.00
- # 解读:
- # r/s:每秒读次数
- # w/s:每秒写次数
- # rkB/s:每秒读取 KB
- # wkB/s:每秒写入 KB
- # await:平均 IO 等待时间(毫秒)
- # %util:磁盘使用率(接近 100% 表示磁盘瓶颈)
复制代码
11.1.5 网络监控- # sar:系统活动报告
- sar -n DEV 1 10 # 查看网络流量
- # IFACE rxpck/s txpck/s rxkB/s txkB/s
- # eth0 100.00 80.00 50.00 40.00
- # iftop:实时网络流量
- iftop -i eth0
- # nethogs:按进程查看网络使用
- nethogs eth0
复制代码
11.2 瓶颈排查- CPU 瓶颈排查:
- 1. 现象:load average 高,us 或 sy 高
- 2. 排查:
- - top 查看哪个进程占用 CPU 高
- - ps aux --sort=-%cpu | head -10
- - strace -p PID 跟踪系统调用
- 3. 解决:
- - 优化代码(减少计算)
- - 增加 CPU
- - 使用缓存
- 内存瓶颈排查:
- 1. 现象:available 低,Swap 使用高
- 2. 排查:
- - free -h 查看内存使用
- - ps aux --sort=-%mem | head -10
- - pmap PID 查看进程内存映射
- 3. 解决:
- - 优化代码(减少内存使用)
- - 增加内存
- - 调整 JVM 参数
- IO 瓶颈排查:
- 1. 现象:%util 高,await 高
- 2. 排查:
- - iostat -x 1 查看磁盘 IO
- - iotop 查看哪个进程 IO 高
- - lsof -p PID 查看进程打开的文件
- 3. 解决:
- - 优化 SQL(减少查询)
- - 使用 SSD
- - 增加缓存
- 网络瓶颈排查:
- 1. 现象:带宽打满,丢包
- 2. 排查:
- - sar -n DEV 1 查看网络流量
- - iftop 查看实时流量
- - tcpdump 抓包分析
- 3. 解决:
- - 增加带宽
- - 优化应用(减少请求)
- - 使用 CDN
复制代码
11.3 内核参数调优- # sysctl:查看和修改内核参数
- # 查看所有参数
- sysctl -a
- # 查看指定参数
- sysctl net.ipv4.ip_forward
- # 修改参数(临时)
- sysctl -w net.ipv4.ip_forward=1
- # 永久修改
- echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
- sysctl -p
- # 常用调优参数
- # 网络参数
- net.ipv4.tcp_max_syn_backlog = 65535 # SYN 队列长度
- net.core.somaxconn = 65535 # 最大连接数
- net.ipv4.tcp_tw_reuse = 1 # 复用 TIME_WAIT
- net.ipv4.tcp_fin_timeout = 30 # FIN 超时时间
- # 内存参数
- vm.swappiness = 10 # 减少 Swap 使用
- vm.overcommit_memory = 1 # 允许内存超分配
- # 文件描述符
- fs.file-max = 65535 # 最大文件描述符数
- 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 简介- Ansible 是什么?
- - 开源的自动化运维工具
- - 基于 Python 开发
- - 无需在目标主机安装客户端(SSH 连接)
- - 使用 YAML 编写 Playbook
- 核心概念:
- - 控制节点:运行 Ansible 的机器
- - 被管理节点:被 Ansible 管理的机器
- - Inventory:主机清单
- - Playbook:剧本(定义任务)
- - Module:模块(执行具体操作)
- - Role:角色(可复用的任务集合)
复制代码
12.1.2 安装配置- # 安装
- pip install ansible # Python 安装
- yum install -y ansible # CentOS
- apt install -y ansible # Ubuntu
- # 配置文件
- /etc/ansible/ansible.cfg # 全局配置
- ~/.ansible.cfg # 用户配置
- ./ansible.cfg # 项目配置
- # 主机清单
- /etc/ansible/hosts
- # 配置示例
- [webservers]
- web1 ansible_host=192.168.1.101 ansible_user=root
- web2 ansible_host=192.168.1.102 ansible_user=root
- [dbservers]
- db1 ansible_host=192.168.1.201 ansible_user=root ansible_port=2222
- [all:vars]
- ansible_python_interpreter=/usr/bin/python3
复制代码
12.1.3 常用命令- # 测试连接
- ansible all -m ping
- # 执行命令
- ansible all -m shell -a "uptime"
- ansible webservers -m shell -a "df -h"
- # 复制文件
- ansible all -m copy -a "src=./file dest=/tmp/"
- # 安装软件
- ansible all -m yum -a "name=nginx state=present"
- # 管理服务
- ansible all -m service -a "name=nginx state=started"
- # 查看主机信息
- ansible all -m setup
复制代码
12.1.4 Playbook- # deploy.yml
- ---
- - hosts: webservers
- become: yes
- vars:
- app_port: 8080
- tasks:
- - name: Install Nginx
- yum:
- name: nginx
- state: present
- - name: Copy Nginx config
- template:
- src: nginx.conf.j2
- dest: /etc/nginx/nginx.conf
- notify: Restart Nginx
- - name: Start Nginx
- service:
- name: nginx
- state: started
- enabled: yes
- - name: Create app directory
- file:
- path: /opt/myapp
- state: directory
- owner: app
- group: app
- - name: Deploy application
- copy:
- src: ./app.jar
- dest: /opt/myapp/app.jar
- owner: app
- group: app
- notify: Restart App
- handlers:
- - name: Restart Nginx
- service:
- name: nginx
- state: restarted
- - name: Restart App
- service:
- name: myapp
- state: restarted
复制代码- # 执行 Playbook
- ansible-playbook deploy.yml
- # 检查语法
- ansible-playbook deploy.yml --syntax-check
- # 模拟执行
- ansible-playbook deploy.yml --check
- # 指定主机
- ansible-playbook deploy.yml --limit webservers
复制代码
12.1.5 Role- Role 目录结构:
- roles/
- └── nginx/
- ├── tasks/
- │ └── main.yml
- ├── handlers/
- │ └── main.yml
- ├── templates/
- │ └── nginx.conf.j2
- ├── files/
- │ └── index.html
- ├── vars/
- │ └── main.yml
- └── defaults/
- └── main.yml
- # 使用 Role
- ---
- - hosts: webservers
- roles:
- - nginx
- - myapp
复制代码
12.2 Shell 运维脚本- #!/bin/bash
- # 系统巡检脚本
- echo "========== 系统巡检报告 =========="
- echo "时间:$(date)"
- echo ""
- # 系统信息
- echo "【系统信息】"
- echo "主机名:$(hostname)"
- echo "系统:$(cat /etc/redhat-release)"
- echo "内核:$(uname -r)"
- echo ""
- # CPU 信息
- echo "【CPU 信息】"
- echo "核心数:$(nproc)"
- echo "负载:$(uptime | awk -F'load average:' '{print $2}')"
- echo ""
- # 内存信息
- echo "【内存信息】"
- free -h | grep -v +1
- echo ""
- # 磁盘信息
- echo "【磁盘信息】"
- df -h | grep -v tmpfs
- echo ""
- # 网络信息
- echo "【网络信息】"
- ip -4 addr show | grep inet
- echo ""
- # 服务状态
- echo "【服务状态】"
- for service in nginx mysql redis; do
- status=$(systemctl is-active $service 2>/dev/null)
- echo "$service: $status"
- done
复制代码
第十二部分总结
| 章节 | 核心内容 |
|---|
| Ansible | 安装配置、Inventory、常用命令 | | Playbook | YAML 语法、任务、变量、Handlers | | Role | 目录结构、可复用任务 | | Shell 脚本 | 系统巡检脚本 |
|