从安装到生产环境部署的超详细指南 · 2026年7月版
1. 系统安装
1.1 获取镜像
从官网下载 Ubuntu 24.04 LTS Server 版 ISO 镜像:
https://ubuntu.com/download/server
推荐选择最小化安装镜像(约100MB),按需选择:
- ubuntu-24.04-live-server-amd64.iso — 标准服务器版
- ubuntu-24.04-minimal-amd64.iso — 最小化版(推荐服务器使用)
💡 LTS(Long Term Support)版本支持5年标准安全更新,ESM(Extended Security Maintenance)可扩展至10年(2034年)。
1.2 验证镜像完整性
# 下载SHA256校验文件
wget https://releases.ubuntu.com/24.04/SHA256SUMS
# 验证镜像完整性
sha256sum -c SHA256SUMS --ignore-missing
# 或手动对比
sha256sum ubuntu-24.04-live-server-amd64.iso
1.3 制作启动介质
使用以下工具将 ISO 写入 U 盘或光盘:
# Linux/macOS 使用 dd 命令(注意替换 sdX)
sudo dd if=ubuntu-24.04-live-server-amd64.iso of=/dev/sdX bs=4M status=progress && sync
# 或使用 Ventoy(推荐,支持多镜像)
# https://www.ventoy.net
# Windows使用 Rufus
# https://rufus.ie
# macOS使用 balenaEtcher
# https://etcher.balena.io
1.4 BIOS/UEFI设置
- 进入BIOS/UEFI(开机按F2/F12/Del)
- 设置UEFI模式启动(推荐)或Legacy BIOS模式
- 启用VT-x/AMD-V(虚拟化支持)
- 启用IOMMU(用于设备直通)
- 关闭Secure Boot(如有兼容问题)
- 设置U盘为第一启动设备
- 配置RAID模式(AHCI推荐,避免RAID模式下的兼容问题)
1.5 安装过程
- 从 U 盘启动,选择
Try or Install Ubuntu Server - 选择语言:推荐 English(服务器环境)
- 选择键盘布局
- 选择安装类型:Ubuntu Server(标准)或 Ubuntu Server (minimized)
- 配置网络:自动 DHCP 或手动静态 IP
- 配置代理(如在内网环境)
- 配置镜像源:选择国内源加速下载
- 选择安装类型:
Use an entire disk或Custom storage layout - 选择是否使用LVM(推荐生产环境使用LVM)
- 确认磁盘分区方案
- 设置 Profile:Full Name、Server Name、Username、Password
- 选择安装 OpenSSH Server(强烈建议勾选)
- 选择 Featured Server Snaps(可选)
- 等待安装完成,重启系统
1.6 推荐分区方案(服务器)
| 分区 | 大小 | 类型 | 说明 |
|---|---|---|---|
| /boot/efi | 512MB | EFI/FAT32 | UEFI启动分区 |
| /boot | 1-2GB | ext4 | 启动文件(如不用LVM管理boot) |
| swap | 内存×1~2 | swap | 交换分区(大内存可用文件替代) |
| / | 30-50GB | ext4/xfs | 根分区 |
| /var | 50-100GB+ | xfs | 日志与数据(高IO分区) |
| /tmp | 10-20GB | ext4 | 临时文件(可挂载为tmpfs) |
| /home | 剩余 | ext4 | 用户数据 |
| /data | 按需 | xfs/ext4 | 业务数据独立分区 |
💡 数据库服务器建议将 /var/lib/mysql 或 /var/lib/postgresql 单独挂载为独立分区,使用XFS文件系统获得更好性能。
1.7 LVM分区方案(推荐生产环境)
# LVM分区规划示例
# 物理磁盘: /dev/sda 500GB
# PV (Physical Volume)
/dev/sda3 → PV (整个磁盘的剩余空间)
# VG (Volume Group)
vg_system → 包含所有LV
# LV (Logical Volume)
lv_root 50GB / ext4
lv_var 100GB /var xfs
lv_home 50GB /home ext4
lv_tmp 20GB /tmp ext4
lv_swap 16GB swap swap
lv_data 剩余 /data xfs
✅ LVM优势:动态扩容、快照备份、灵活管理,生产环境强烈推荐。
1.8 RAID配置
# 软件RAID配置(使用mdadm)
sudo apt install mdadm
# RAID 0(条带化,高性能无冗余)
sudo mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sda /dev/sdb
# RAID 1(镜像,高可靠)
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda /dev/sdb
# RAID 5(条带+奇偶校验,至少3块盘)
sudo mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sda /dev/sdb /dev/sdc
# RAID 10(镜像+条带,高性能高可靠)
sudo mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sda /dev/sdb /dev/sdc /dev/sdd
# 查看RAID状态
cat /proc/mdstat
sudo mdadm --detail /dev/md0
# 保存RAID配置
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u
2. 首次启动配置
2.1 更新系统
# 更新软件源列表
sudo apt update
# 查看可升级的包
apt list --upgradable
# 升级所有已安装的软件包
sudo apt upgrade -y
# 完整升级(处理依赖变更)
sudo apt full-upgrade -y
# 升级发行版(如有大版本更新)
sudo apt dist-upgrade -y
# 清理不需要的包和缓存
sudo apt autoremove -y
sudo apt autoclean
sudo apt clean
# 检查是否需要重启(内核更新后)
[ -f /var/run/reboot-required ] && echo "需要重启" && sudo reboot
2.2 设置时区与时间
# 查看当前时区
timedatectl
# 列出所有可用时区
timedatectl list-timezones | grep Asia
# 设置为上海时区
sudo timedatectl set-timezone Asia/Shanghai
# 启用NTP时间同步
sudo timedatectl set-ntp true
# 查看时间同步状态
timedatectl status
chronyc tracking # 如果使用chrony
# 手动同步时间(紧急使用)
sudo chronyc makestep
# 或
sudo ntpdate pool.ntp.org
2.3 设置主机名
# 查看当前主机名
hostnamectl
# 修改主机名(立即生效)
sudo hostnamectl set-hostname myserver
# 更新hosts文件
sudo nano /etc/hosts
# 确保包含:
# 127.0.0.1 localhost
# 127.0.1.1 myserver
# ::1 localhost ip6-localhost ip6-loopback
2.4 配置语言环境
# 查看当前语言
locale
# 生成UTF-8语言支持
sudo locale-gen en_US.UTF-8
sudo locale-gen zh_CN.UTF-8 # 如需中文支持
# 设置系统默认语言
sudo update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
# 查看可用locale
locale -a
2.5 MOTD(登录提示信息)
# 自定义登录提示
sudo nano /etc/update-motd.d/99-custom
#!/bin/bash
echo "================================="
echo " Welcome to $(hostname)"
echo " System: $(lsb_release -ds)"
echo " Kernel: $(uname -r)"
echo " Uptime: $(uptime -p)"
echo "================================="
sudo chmod +x /etc/update-motd.d/99-custom
# 禁用不需要的MOTD模块
sudo chmod -x /etc/update-motd.d/10-help-text
sudo chmod -x /etc/update-motd.d/50-motd-news
2.6 系统信息查看
# 全面系统信息
neofetch # 需安装: sudo apt install neofetch
screenfetch # 需安装: sudo apt install screenfetch
# 硬件信息
sudo lshw -short
sudo hwinfo --short
sudo dmidecode -t system
sudo lspci -v
lsusb -v
cat /proc/cpuinfo
cat /proc/meminfo
3. 用户与权限管理
3.1 创建普通用户
# 创建用户并自动创建home目录,设置shell为bash
sudo adduser --create-home --shell /bin/bash username
# 为用户设置sudo权限
sudo usermod -aG sudo username
# 或使用useradd(更底层控制)
sudo useradd -m -s /bin/bash -c "Full Name" -G sudo,developers username
sudo passwd username
# 设置用户过期日期
sudo usermod -e 2026-12-31 username
# 锁定/解锁用户账户
sudo usermod -L username # 锁定
sudo usermod -U username # 解锁
3.2 sudo权限配置
# 使用visudo编辑sudoers(安全编辑方式,防止语法错误)
sudo visudo
# 或编辑独立配置文件(推荐)
sudo visudo -f /etc/sudoers.d/developers
# sudoers配置示例:
# 允许用户无需密码执行sudo(慎用)
username ALL=(ALL) NOPASSWD:ALL
# 限制用户只能执行特定命令
username ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx
# 限制用户只能以特定身份执行命令
deploy ALL=(www-data) NOPASSWD: /usr/bin/systemctl restart php-fpm
# 用户组权限
%developers ALL=(ALL) NOPASSWD: /usr/bin/docker, /usr/bin/docker-compose
# 禁止用户执行特定命令
username ALL=(ALL) ALL, !/usr/bin/passwd root, !/usr/sbin/visudo
3.3 删除用户
# 删除用户但保留home目录
sudo userdel username
# 删除用户并删除home目录和邮件队列
sudo userdel -r username
# 使用deluser(更安全的Ubuntu方式)
sudo deluser --remove-home username
sudo deluser --remove-all-files username
3.4 用户组管理
# 创建组(指定GID)
sudo groupadd -g 2000 developers
sudo groupadd -r system_group # 系统组(GID < 1000)
# 将用户添加到组(-a表示追加,不可省略)
sudo usermod -aG groupname username
# 设置用户主组
sudo usermod -g new_primary_group username
# 从组中移除用户
sudo gpasswd -d username groupname
# 设置组管理员
sudo gpasswd -A admin_user groupname
# 删除组
sudo groupdel groupname
# 查看用户所属组
groups username
id username
# 查看组成员
getent group groupname
grep groupname /etc/group
3.5 密码策略
# 安装密码质量检查工具
sudo apt install libpam-pwquality
# 编辑密码策略
sudo nano /etc/security/pwquality.conf
# minlen = 14 最小长度
# dcredit = -2 至少2个数字
# ucredit = -1 至少1个大写字母
# lcredit = -2 至少2个小写字母
# ocredit = -1 至少1个特殊字符
# maxrepeat = 3 最多连续相同字符数
# maxclassrepeat = 4 同一类别最多连续字符数
# difok = 4 新密码至少与旧密码不同字符数
# 设置密码过期策略
sudo chage -M 90 username # 90天后过期
sudo chage -W 7 username # 提前7天警告
sudo chage -I 30 username # 30天不活动后禁用
sudo chage -m 1 username # 最少1天才能修改
# 查看密码信息
sudo chage -l username
# 强制用户下次登录修改密码
sudo chage -d 0 username
# 查看登录失败记录
sudo faillog -a
sudo lastb
3.6 特殊用户和系统账户
# 创建系统账户(无home目录,不可登录)
sudo useradd -r -s /usr/sbin/nologin -d /nonexistent service_account
# 常见系统账户
# www-data Web服务器
# mysql MySQL数据库
# postgres PostgreSQL数据库
# nobody 无特权用户
# daemon 系统守护进程
# syslog 日志服务
# 查看系统账户(UID < 1000)
awk -F: '$3 < 1000 {print $1, $3}' /etc/passwd
4. 软件包管理
4.1 APT基础操作
# 更新包索引
sudo apt update
# 升级所有包
sudo apt upgrade -y
# 完整升级
sudo apt full-upgrade -y
# 安装软件包
sudo apt install package_name
# 安装指定版本
sudo apt install package_name=1.2.3-4
# 重新安装软件包
sudo apt reinstall package_name
# 卸载软件包(保留配置)
sudo apt remove package_name
# 完全卸载(删除配置)
sudo apt purge package_name
# 搜索软件包
apt search keyword
# 查看包信息
apt show package_name
# 查看包依赖
apt depends package_name
apt rdepends package_name # 反向依赖(谁依赖它)
# 查看包包含的文件
dpkg -L package_name
# 查找文件属于哪个包
dpkg -S /usr/bin/command
apt-file search filename # 需安装apt-file
# 列出已安装的包
apt list --installed
dpkg --get-selections
# 清理缓存
sudo apt clean
sudo apt autoclean
sudo apt autoremove --purge
# 固定包版本(防止升级)
sudo apt-mark hold package_name
sudo apt-mark unhold package_name
apt-mark showhold
4.2 配置国内镜像源
# Ubuntu 24.04 使用新格式的源配置
# 查看当前源配置
ls /etc/apt/sources.list.d/
cat /etc/apt/sources.list.d/ubuntu.sources
# 备份原始配置
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
# 阿里云源(/etc/apt/sources.list.d/ubuntu.sources)
Types: deb
URIs: http://mirrors.aliyun.com/ubuntu/
Suites: noble noble-updates noble-security noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
# 或使用传统格式(/etc/apt/sources.list)
deb http://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse
# 更新索引
sudo apt update
# 其他推荐镜像源:
# 清华源: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/
# 中科大源: https://mirrors.ustc.edu.cn/ubuntu/
# 华为源: https://repo.huaweicloud.com/ubuntu/
4.3 添加第三方PPA仓库
# 添加PPA(需要software-properties-common)
sudo apt install software-properties-common
sudo add-apt-repository ppa:user/ppa-name
# 手动添加仓库
sudo nano /etc/apt/sources.list.d/custom.list
# deb [signed-by=/usr/share/keyrings/custom.gpg] http://repo.example.com/ubuntu noble main
# 导入GPG密钥
curl -fsSL https://repo.example.com/key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/custom.gpg
# 删除PPA
sudo add-apt-repository --remove ppa:user/ppa-name
# 或使用ppa-purge
sudo apt install ppa-purge
sudo ppa-purge ppa:user/ppa-name
4.4 dpkg底层操作
# 安装本地deb包
sudo dpkg -i package.deb
# 修复依赖问题
sudo apt --fix-broken install
# 查看包状态
dpkg -s package_name
# 列出包文件
dpkg -L package_name
# 列出所有已安装包
dpkg -l | grep package
# 重新配置包
sudo dpkg-reconfigure package_name
# 强制安装(不推荐)
sudo dpkg --force-all -i package.deb
4.5 Snap包管理
# Ubuntu 24.04 默认包含snap
# 安装snap包
sudo snap install package_name
sudo snap install package_name --channel=latest/stable
# 列出已安装的snap
snap list
# 查看snap信息
snap info package_name
# 更新snap
sudo snap refresh package_name
sudo snap refresh # 更新所有
# 卸载snap
sudo snap remove package_name
sudo snap remove --purge package_name # 清除所有数据
# 搜索snap
snap find keyword
# 查看snap服务
snap services
# 管理snap配置
snap get package_name
snap set package_name key=value
4.6 Flatpak管理
# 安装Flatpak
sudo apt install flatpak
# 添加Flathub仓库
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
# 安装应用
flatpak install flathub com.example.App
# 运行应用
flatpak run com.example.App
# 列出已安装
flatpak list
# 更新
flatpak update
# 卸载
flatpak uninstall com.example.App
4.7 从源码编译安装
# 安装编译工具
sudo apt install build-essential cmake autoconf automake libtool pkg-config
# 下载源码
wget https://example.com/software-1.0.tar.gz
# 或使用git
git clone https://github.com/user/software.git
# 解压
tar -xzf software-1.0.tar.gz
cd software-1.0
# 查看编译选项
./configure --help
# 配置(指定安装路径)
./configure --prefix=/opt/software --sysconfdir=/etc --enable-feature
# 编译(使用多核加速)
make -j$(nproc)
# 安装
sudo make install
# 或创建deb包(推荐)
sudo apt install checkinstall
sudo checkinstall # 交互式创建deb包
5. 网络配置
5.1 查看网络信息
# 查看网络接口
ip addr
ip -br addr # 简洁格式
ip link show
# 查看路由表
ip route
ip route show table main
ip -6 route # IPv6路由
# 查看ARP表
ip neigh
# 查看DNS
cat /etc/resolv.conf
resolvectl status
resolvectl query example.com
# 测试连通性
ping -c 4 8.8.8.8
ping -c 4 baidu.com
mtr baidu.com # 综合路径测试(需安装mtr)
tracepath baidu.com # UDP traceroute
# 查看端口占用
ss -tuln
ss -tulnp # 显示进程(需root)
netstat -tuln # 需安装 net-tools
# 查看网络统计
ip -s link
ss -s # 统计摘要
5.2 配置静态IP (Netplan)
Ubuntu 24.04 使用 Netplan 管理网络(基于YAML):
# 查看当前网络配置
ls /etc/netplan/
cat /etc/netplan/*.yaml
# 确认网卡名称
ip link show
# 编辑配置
sudo nano /etc/netplan/01-netcfg.yaml
# 单网卡静态IP配置
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses:
- 192.168.1.100/24
- 2001:db8::100/64 # IPv6地址(可选)
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
- 114.114.114.114
search:
- local.domain
# 应用配置
sudo netplan apply
# 调试模式(显示详细信息)
sudo netplan --debug apply
sudo netplan --debug generate
5.3 配置双网卡/多IP
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses:
- 192.168.1.100/24
- 192.168.1.101/24 # 第二个IP
routes:
- to: default
via: 192.168.1.1
ens34:
dhcp4: no
addresses:
- 10.0.0.100/24
# 第二个网卡不设默认路由,用于内网通信
5.4 配置网桥 (用于虚拟化)
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
bridges:
br0:
interfaces:
- ens33
dhcp4: no
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 114.114.114.114]
parameters:
stp: true
forward-delay: 4
5.5 DNS配置
# 方法1: 通过systemd-resolved(推荐)
sudo nano /etc/systemd/resolved.conf
[Resolve]
DNS=8.8.8.8 114.114.114.114
FallbackDNS=8.8.4.4 223.5.5.5
DNSSEC=allow-downgrade
DNSOverTLS=opportunistic
Cache=yes
sudo systemctl restart systemd-resolved
# 方法2: 使用resolvectl临时设置
sudo resolvectl dns ens33 8.8.8.8 114.114.114.114
sudo resolvectl domain ens33 local.domain
# 验证DNS
resolvectl status
dig example.com
nslookup example.com
5.6 主机名解析
# 编辑hosts文件
sudo nano /etc/hosts
# 127.0.0.1 localhost
# 127.0.1.1 myserver
# 192.168.1.100 server1.local server1
# 192.168.1.101 server2.local server2
# 192.168.1.102 db.local db
# 配置nsswitch解析顺序
cat /etc/nsswitch.conf
# hosts: files dns
5.7 网络诊断工具
# 安装诊断工具
sudo apt install tcpdump nmap mtr iperf3 nethogs iftop
# 抓包分析
sudo tcpdump -i ens33 -nn port 80 -c 100
sudo tcpdump -i ens33 -w capture.pcap
# 端口扫描
nmap -sV 192.168.1.1
nmap -p 1-65535 localhost
# 带宽测试
iperf3 -s # 服务端
iperf3 -c 192.168.1.100 # 客户端
# 实时流量监控
sudo nethogs ens33 # 按进程显示
sudo iftop -i ens33 # 按连接显示
# Wireshark命令行版
tshark -i ens33 -f "port 80" -c 100
6. SSH远程管理
6.1 安装SSH服务
# 安装OpenSSH服务端
sudo apt install openssh-server
# 启动并设置开机自启
sudo systemctl enable --now ssh
# 查看状态
sudo systemctl status ssh
# 查看SSH版本
ssh -V
sshd -V
6.2 SSH安全配置
# 备份配置文件
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# 创建独立配置片段(推荐)
sudo mkdir -p /etc/ssh/sshd_config.d
sudo nano /etc/ssh/sshd_config.d/security.conf
# 推荐的安全配置:
# 网络设置
Port 2222
AddressFamily inet
ListenAddress 0.0.0.0
Protocol 2
# 认证设置
PermitRootLogin no
PermitEmptyPasswords no
MaxAuthTries 3
MaxSessions 5
LoginGraceTime 30
AuthenticationMethods publickey
# 仅允许特定用户/组
AllowUsers admin deploy
AllowGroups sshusers
# 禁用密码认证(密钥配置好后)
PasswordAuthentication no
ChallengeResponseAuthentication no
# 密钥认证
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# 禁用不需要的功能
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
PermitTunnel no
# 日志
LogLevel VERBOSE
SyslogFacility AUTH
# 连接保活
ClientAliveInterval 300
ClientAliveCountMax 2
# 禁用不安全算法
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
KexAlgorithms curve25519-sha256,diffie-hellman-group16-sha512
HostKeyAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256
# 验证配置语法
sudo sshd -t
# 重启SSH服务
sudo systemctl restart ssh
# 注意:重启前请确保有一个活动的SSH连接用于测试!
6.3 SSH密钥认证
# 在客户端生成密钥对(推荐Ed25519算法)
ssh-keygen -t ed25519 -C "admin@company.com" -f ~/.ssh/id_ed25519
# 或使用RSA 4096位
ssh-keygen -t rsa -b 4096 -C "admin@company.com"
# 将公钥复制到服务器
ssh-copy-id -p 2222 username@server_ip
# 或手动复制
cat ~/.ssh/id_ed25519.pub | ssh -p 2222 username@server_ip \
"mkdir -p ~/.ssh && chmod 700 ~/.ssh && \
cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
# 测试密钥登录
ssh -p 2222 -i ~/.ssh/id_ed25519 username@server_ip
# 设置密钥密码短语(额外安全层)
ssh-keygen -p -f ~/.ssh/id_ed25519
6.4 SSH客户端配置
# 编辑客户端配置(本地电脑 ~/.ssh/config)
nano ~/.ssh/config
# SSH客户端配置示例
Host myserver
HostName 192.168.1.100
User admin
Port 2222
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
ServerAliveCountMax 3
Compression yes
ForwardAgent no
AddKeysToAgent yes
ConnectTimeout 10
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
HashKnownHosts yes
IdentitiesOnly yes
VisualHostKey yes
6.5 SSH端口转发
# 本地端口转发(将远程服务映射到本地)
ssh -L 3306:localhost:3306 -p 2222 user@server
# 本地3306 → 服务器localhost:3306
# 远程端口转发(将本地服务暴露到远程)
ssh -R 8080:localhost:3000 -p 2222 user@server
# 服务器8080 → 本地localhost:3000
# 动态端口转发(SOCKS代理)
ssh -D 1080 -p 2222 user@server
# 本地1080端口作为SOCKS5代理
# SSH隧道配置
Host tunnel
HostName 192.168.1.100
User admin
Port 2222
LocalForward 3306 127.0.0.1:3306
LocalForward 6379 127.0.0.1:6379
6.6 SSH安全加固
# 安装Fail2ban防止暴力破解
sudo apt install fail2ban
# 配置SSH防护
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
banaction = iptables-multiport
backend = systemd
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = %(sshd_log)s
maxretry = 3
bantime = 3600
# 启动fail2ban
sudo systemctl enable --now fail2ban
# 查看状态
sudo fail2ban-client status
sudo fail2ban-client status sshd
# 手动封禁/解封IP
sudo fail2ban-client set sshd banip 192.168.1.50
sudo fail2ban-client set sshd unbanip 192.168.1.50
6.7 SSH证书认证(高级)
# 生成CA密钥
ssh-keygen -t ed25519 -f ca_key -C "SSH CA"
# 签发用户证书(有效期1周)
ssh-keygen -s ca_key -I user_cert -n admin,deploy -V +1w user_key.pub
# 签发主机证书
ssh-keygen -s ca_key -I server_cert -h -n server.example.com -V +52w ssh_host_ed25519_key.pub
# 配置服务器信任CA
echo "@cert-authority *.example.com $(cat ca_key.pub)" >> /etc/ssh/ssh_known_hosts
# 客户端使用证书登录
ssh -i user_key-cert.pub -p 2222 admin@server.example.com
7. 防火墙与安全
7.1 UFW防火墙
# 启用UFW(默认禁用)
sudo ufw enable
# 默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 允许SSH(自定义端口)
sudo ufw allow 2222/tcp comment 'SSH'
# 允许HTTP/HTTPS
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
# 允许特定IP访问
sudo ufw allow from 192.168.1.0/24
# 允许特定IP访问特定端口
sudo ufw allow from 10.0.0.5 to any port 3306 proto tcp
sudo ufw allow from 10.0.0.5 to any port 5432 proto tcp
# 限速(防暴力破解)
sudo ufw limit 2222/tcp
# 拒绝特定IP
sudo ufw deny from 203.0.113.50
# 删除规则
sudo ufw delete allow 80/tcp
sudo ufw delete 3 # 按编号删除
# 查看状态
sudo ufw status
sudo ufw status numbered
sudo ufw status verbose
# 查看日志
sudo less /var/log/ufw.log
sudo ufw logging on # 开启日志
sudo ufw logging low # 日志级别: off/low/medium/high/full
# 重置所有规则
sudo ufw reset
# 禁用UFW
sudo ufw disable
7.2 iptables/nftables高级配置
# Ubuntu 24.04 默认使用nftables后端
# 安装nftables
sudo apt install nftables
# 查看当前规则
sudo nft list ruleset
# 创建规则文件
sudo nano /etc/nftables.conf
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# 允许回环
iif lo accept
# 允许已建立的连接
ct state established,related accept
# 丢弃无效连接
ct state invalid drop
# 允许SSH
tcp dport 2222 accept
# 允许HTTP/HTTPS
tcp dport { 80, 443 } accept
# 允许ICMP ping
icmp type echo-request limit rate 5/second accept
# 限速SSH(防暴力破解)
tcp dport 2222 ct state new limit rate 3/minute accept
# 日志记录被拒绝的包
counter log prefix "NFT-DROP: " drop
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
# 加载规则
sudo nft -f /etc/nftables.conf
# 持久化规则
sudo systemctl enable nftables
7.3 内核安全参数
# 编辑内核参数
sudo nano /etc/sysctl.d/99-security.conf
# 防止IP欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.log_martians = 1
# 禁止ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
# 禁止源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
# SYN Flood防护
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5
# 防止TCP时间等待攻击
net.ipv4.tcp_rfc1337 = 1
# 启用反向路径过滤
net.ipv4.conf.all.arp_filter = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
# 禁用IPv6(如不需要)
# net.ipv6.conf.all.disable_ipv6 = 1
# net.ipv6.conf.default.disable_ipv6 = 1
# 内核随机数熵
kernel.randomize_va_space = 2
# 限制内核日志
kernel.printk = 4 4 1 7
# 防止内核模块自动加载(需要时手动加载)
# kernel.modules_disabled = 1
# 应用参数
sudo sysctl --system
# 或
sudo sysctl -p /etc/sysctl.d/99-security.conf
# 验证参数
sysctl net.ipv4.tcp_syncookies
8. 服务管理 (systemd)
8.1 systemctl基础命令
# 启动/停止/重启服务
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx # 重载配置(不中断服务)
# 设置开机自启
sudo systemctl enable nginx
sudo systemctl disable nginx
sudo systemctl is-enabled nginx
# 查看服务状态
sudo systemctl status nginx
sudo systemctl show nginx # 详细信息
# 列出所有服务
systemctl list-units --type=service --state=running
systemctl list-units --type=service --all
# 列出失败的服务
systemctl --failed
# 服务依赖
systemctl list-dependencies nginx
systemctl list-dependencies --reverse nginx
8.2 journalctl日志查看
# 查看服务日志
journalctl -u nginx
journalctl -u nginx --since today
journalctl -u nginx --since "2026-07-01" --until "2026-07-18"
journalctl -u nginx -n 100 # 最近100行
journalctl -u nginx -f # 实时跟踪
# 按优先级过滤
journalctl -p err # 错误及以上
journalctl -p warning # 警告及以上
# 级别: emerg(0) alert(1) crit(2) err(3) warning(4) notice(5) info(6) debug(7)
# 查看系统日志
journalctl -b # 本次启动
journalctl -b -1 # 上次启动
journalctl -k # 内核日志
# 日志维护
journalctl --disk-usage # 查看占用空间
sudo journalctl --vacuum-size=500M # 限制大小
sudo journalctl --vacuum-time=7d # 保留7天
sudo journalctl --rotate # 立即轮转
8.3 创建自定义服务
# 创建服务文件
sudo nano /etc/systemd/system/myapp.service
[Unit]
Description=My Application Service
Documentation=https://docs.myapp.com
After=network.target network-online.target
Wants=network-online.target
Requires=postgresql.service
ConditionPathExists=/opt/myapp
[Service]
Type=simple
User=appuser
Group=appuser
WorkingDirectory=/opt/myapp
ExecStartPre=/opt/myapp/check_config.sh
ExecStart=/opt/myapp/start.sh
ExecStartPost=/opt/myapp/notify.sh
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/opt/myapp/stop.sh
# 重启策略
Restart=on-failure
RestartSec=5
RestartPreventExitStatus=1
StartLimitBurst=3
StartLimitIntervalSec=60
# 环境变量
Environment=NODE_ENV=production
Environment=PORT=3000
EnvironmentFile=/etc/myapp/env.conf
# 标准输出
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp
# 安全加固
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/myapp/data /var/log/myapp
PrivateTmp=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictRealtime=true
RestrictNamespaces=true
# 资源限制
LimitNOFILE=65536
LimitNPROC=4096
MemoryMax=512M
CPUQuota=80%
TasksMax=500
# 超时
TimeoutStartSec=30
TimeoutStopSec=30
[Install]
WantedBy=multi-user.target
# 重新加载systemd配置
sudo systemctl daemon-reload
# 启动服务
sudo systemctl enable --now myapp
# 查看服务状态
sudo systemctl status myapp
8.4 Systemd Timer(替代Cron)
# 创建服务文件 /etc/systemd/system/backup.service
[Unit]
Description=Daily Backup Service
[Service]
Type=oneshot
ExecStart=/opt/scripts/backup.sh
User=root
# 创建定时器 /etc/systemd/system/backup.timer
[Unit]
Description=Run backup daily at 2AM
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300
[Install]
WantedBy=timers.target
# 启用定时器
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
# 查看定时器
systemctl list-timers
systemctl list-timers --all
8.5 Systemd高级功能
# 服务模板(多个实例)
# 文件: myapp@.service
[Service]
ExecStart=/opt/myapp/start.sh %i
# 启动实例
sudo systemctl start myapp@instance1
sudo systemctl start myapp@instance2
# Socket激活(按需启动服务)
# myapp.socket
[Unit]
Description=MyApp Socket
[Socket]
ListenStream=3000
Accept=false
[Install]
WantedBy=sockets.target
# 路径监控(文件变化时触发服务)
# watch.path
[Path]
PathChanged=/opt/myapp/config.yml
[Install]
WantedBy=multi-user.target
9. Web服务器搭建
9.1 Nginx安装与配置
# 安装Nginx(推荐使用官方仓库获取最新版本)
# 添加Nginx官方仓库
curl -fsSL https://nginx.org/keys/nginx_signing.key | \
sudo gpg --dearmor -o /usr/share/keyrings/nginx-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu noble nginx" | \
sudo tee /etc/apt/sources.list.d/nginx.list
sudo apt update
sudo apt install nginx
# 或使用Ubuntu仓库
sudo apt install nginx
# 启动并设置开机自启
sudo systemctl enable --now nginx
# 查看版本和编译参数
nginx -V
# 测试配置文件
sudo nginx -t
# 重新加载配置
sudo systemctl reload nginx
9.2 Nginx虚拟主机配置
# 创建网站目录
sudo mkdir -p /var/www/example.com/{html,logs,ssl}
sudo chown -R $USER:$USER /var/www/example.com
sudo chmod -R 755 /var/www/example.com
# 创建测试页面
cat > /var/www/example.com/html/index.html << 'EOF'
Example
Hello from example.com
EOF
# 创建虚拟主机配置
sudo nano /etc/nginx/sites-available/example.com
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.htm index.php;
# 日志
access_log /var/www/example.com/logs/access.log;
error_log /var/www/example.com/logs/error.log warn;
# Gzip压缩
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript
text/xml application/xml application/xml+rss text/javascript
image/svg+xml;
gzip_min_length 1000;
# 安全头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'" always;
add_header Permissions-Policy "geolocation=(), microphone=()" always;
# 禁止访问隐藏文件
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
location / {
try_files $uri $uri/ /index.html;
}
# 静态文件缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2|woff|ttf|svg)$ {
expires 30d;
add_header Cache-Control "public, immutable";
access_log off;
}
# 错误页面
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
# 启用站点
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
# 移除默认站点(可选)
sudo rm /etc/nginx/sites-enabled/default
# 测试并重载
sudo nginx -t
sudo systemctl reload nginx
9.3 HTTPS/SSL配置 (Let's Encrypt)
# 安装Certbot
sudo apt install certbot python3-certbot-nginx
# 自动获取并配置SSL证书
sudo certbot --nginx -d example.com -d www.example.com
# 使用webroot验证方式
sudo certbot certonly --webroot -w /var/www/example.com/html -d example.com
# 使用DNS验证(适用于通配符证书)
sudo certbot certonly --manual --preferred-challenges dns -d "*.example.com"
# 自动续期测试
sudo certbot renew --dry-run
# 手动续期
sudo certbot renew
# 查看证书信息
sudo certbot certificates
# 删除证书
sudo certbot delete --cert-name example.com
9.4 HTTPS完整配置
# SSL优化的Nginx配置
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
# SSL证书
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# SSL优化
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS
add_header Strict-Transport-Security "max-age=63072000" always;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
# 其余配置同HTTP...
root /var/www/example.com/html;
index index.html;
}
# HTTP重定向到HTTPS
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
9.5 Nginx反向代理
# 负载均衡配置
upstream backend {
# 负载均衡算法
# round-robin(默认)
# least_conn;
# ip_hash;
# hash $request_uri consistent;
server 127.0.0.1:3000 weight=3 max_fails=3 fail_timeout=30s;
server 127.0.0.1:3001 weight=2 max_fails=3 fail_timeout=30s;
server 127.0.0.1:3002 backup; # 备用服务器
keepalive 32;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
# 头部传递
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支持
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
# 超时设置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 缓冲区
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
# 错误处理
proxy_next_upstream error timeout http_500 http_502 http_503;
proxy_next_upstream_tries 3;
}
# 健康检查(Nginx Plus或开源替代)
location /health {
proxy_pass http://backend;
proxy_next_upstream error timeout http_500;
}
}
9.6 Nginx性能优化
# 编辑主配置
sudo nano /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
worker_rlimit_nofile 65535;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log warn;
events {
worker_connections 4096;
multi_accept on;
use epoll;
}
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" '
'$request_time $upstream_response_time';
access_log /var/log/nginx/access.log main;
# 性能优化
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
types_hash_max_size 2048;
server_tokens off;
# 客户端限制
client_max_body_size 64M;
client_body_buffer_size 16k;
client_header_buffer_size 4k;
large_client_header_buffers 4 16k;
client_body_timeout 12;
client_header_timeout 12;
# 代理优化
proxy_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
# 文件缓存
open_file_cache max=10000 inactive=60s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# Rate Limiting
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
10. 数据库服务器
10.1 MySQL 8.0 安装与配置
# 安装MySQL 8.0
sudo apt install mysql-server
# 安全初始化
sudo mysql_secure_installation
# 设置root密码
# 移除匿名用户
# 禁止root远程登录
# 移除测试数据库
# 重新加载权限表
# 启动并设置开机自启
sudo systemctl enable --now mysql
# 查看状态
sudo systemctl status mysql
10.2 MySQL用户和数据库管理
# 登录MySQL
sudo mysql -u root -p
# 创建数据库
CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 创建用户(本地和远程)
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
CREATE USER 'myapp_user'@'10.0.0.%' IDENTIFIED BY 'StrongPassword123!';
# 授权
GRANT ALL PRIVILEGES ON myapp_db.* TO 'myapp_user'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp_db.* TO 'myapp_user'@'10.0.0.%';
# 刷新权限
FLUSH PRIVILEGES;
# 查看用户权限
SHOW GRANTS FOR 'myapp_user'@'localhost';
# 查看所有用户
SELECT user, host FROM mysql.user;
# 查看所有数据库
SHOW DATABASES;
# 查看数据库大小
SELECT table_schema AS 'Database',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.tables
GROUP BY table_schema;
10.3 MySQL性能优化
# 编辑配置文件
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# 基础设置
bind-address = 127.0.0.1
port = 3306
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock
# 连接数
max_connections = 500
max_connect_errors = 100000
wait_timeout = 600
interactive_timeout = 600
# InnoDB优化(最重要的性能参数)
innodb_buffer_pool_size = 4G # 物理内存的50-70%
innodb_buffer_pool_instances = 4 # buffer_pool_size > 1G时设置
innodb_log_file_size = 512M
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 2 # 1=最安全 2=性能 0=最快
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_io_capacity = 2000 # SSD可设更高
innodb_io_capacity_max = 4000
innodb_read_io_threads = 8
innodb_write_io_threads = 8
# 查询优化
tmp_table_size = 64M
max_heap_table_size = 64M
sort_buffer_size = 4M
join_buffer_size = 4M
read_buffer_size = 2M
read_rnd_buffer_size = 4M
# 线程池
thread_cache_size = 64
table_open_cache = 4000
table_definition_cache = 2000
# 慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
# 二进制日志(用于复制和恢复)
server-id = 1
log_bin = /var/log/mysql/mysql-bin
binlog_format = ROW
binlog_expire_logs_seconds = 604800
max_binlog_size = 256M
# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
10.4 MySQL复制(主从)
# 主库配置(my.cnf)
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin
binlog_format = ROW
sync_binlog = 1
# 创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplicationPass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
# 查看主库状态
SHOW MASTER STATUS;
# 记录File和Position
# 从库配置(my.cnf)
[mysqld]
server-id = 2
relay_log = /var/log/mysql/relay-bin
read_only = 1
# 从库配置复制
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl',
MASTER_PASSWORD='ReplicationPass123!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
SHOW SLAVE STATUS\G
10.5 PostgreSQL
# 安装PostgreSQL
sudo apt install postgresql postgresql-contrib
# 启动服务
sudo systemctl enable --now postgresql
# 切换用户
sudo -i -u postgres
# 进入数据库
psql
# 常用操作
CREATE DATABASE mydb;
CREATE USER myuser WITH ENCRYPTED PASSWORD 'mypassword';
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
ALTER USER myuser WITH SUPERUSER;
# 查看数据库列表
\l
# 查看表
\dt
# 查看表结构
\d tablename
# 退出
\q
# PostgreSQL性能优化 (/etc/postgresql/16/main/postgresql.conf)
# 内存设置
shared_buffers = 2GB # 物理内存的25%
effective_cache_size = 6GB # 物理内存的75%
work_mem = 64MB
maintenance_work_mem = 512MB
# WAL设置
wal_buffers = 64MB
min_wal_size = 1GB
max_wal_size = 4GB
checkpoint_completion_target = 0.9
# 查询优化
random_page_cost = 1.1 # SSD设置
effective_io_concurrency = 200 # SSD设置
max_worker_processes = 8
max_parallel_workers = 8
max_parallel_workers_per_gather = 4
10.6 Redis缓存
# 安装Redis
sudo apt install redis-server
# 编辑配置
sudo nano /etc/redis/redis.conf
# 网络设置
bind 127.0.0.1 -::1
port 6379
protected-mode yes
# 认证
requirepass YourStrongPasswordHere
# 内存管理
maxmemory 2gb
maxmemory-policy allkeys-lru
# 持久化 - RDB快照
save 900 1
save 300 10
save 60 10000
# 持久化 - AOF(推荐生产环境)
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 性能
tcp-backlog 511
tcp-keepalive 300
hz 10
# 日志
loglevel notice
logfile /var/log/redis/redis-server.log
# 重启服务
sudo systemctl restart redis-server
# 连接Redis
redis-cli -a YourStrongPasswordHere
# 常用命令
> PING
> SET key value
> GET key
> INFO memory
> INFO server
> DBSIZE
> FLUSHDB # 清空当前数据库
> CONFIG GET maxmemory
10.7 数据库备份与恢复
# MySQL备份
# 备份单个数据库
mysqldump -u root -p myapp_db > backup_$(date +%Y%m%d).sql
# 备份所有数据库
mysqldump -u root -p --all-databases > all_backup_$(date +%Y%m%d).sql
# 带压缩的备份
mysqldump -u root -p --all-databases --single-transaction --routines --triggers \
| gzip > /backup/mysql_$(date +%Y%m%d_%H%M%S).sql.gz
# 恢复
mysql -u root -p myapp_db < backup_20260718.sql
gunzip < backup.sql.gz | mysql -u root -p myapp_db
# PostgreSQL备份
pg_dump -U postgres mydb > backup.sql
pg_dumpall -U postgres > all_backup.sql
pg_restore -U postgres -d mydb backup.dump
# Redis备份
# 复制RDB文件
cp /var/lib/redis/dump.rdb /backup/redis_$(date +%Y%m%d).rdb
# Redis自动备份脚本
redis-cli -a password BGSAVE
cp /var/lib/redis/dump.rdb /backup/redis_$(date +%Y%m%d).rdb
11. 容器化部署 (Docker)
11.1 安装Docker
# 卸载旧版本
sudo apt remove docker docker-engine docker.io containerd runc 2>/dev/null
# 安装依赖
sudo apt install ca-certificates curl gnupg lsb-release
# 添加Docker官方GPG密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 添加仓库
echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
# 将用户加入docker组(免sudo)
sudo usermod -aG docker $USER
# 需重新登录生效
# 验证安装
docker --version
docker compose version
docker run hello-world
11.2 Docker配置优化
# 编辑Docker守护进程配置
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "5"
},
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65535,
"Soft": 65535
}
},
"dns": ["8.8.8.8", "114.114.114.114"],
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
],
"live-restore": true,
"default-address-pools": [
{"base": "172.30.0.0/16", "size": 24}
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
# 重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
11.3 Docker Compose
# 创建项目目录
mkdir ~/myapp && cd ~/myapp
# 创建docker-compose.yml
nano docker-compose.yml
services:
web:
image: nginx:1.25-alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./nginx/ssl:/etc/nginx/ssl:ro
- ./html:/usr/share/nginx/html:ro
depends_on:
- app
restart: unless-stopped
networks:
- frontend
app:
build:
context: ./app
dockerfile: Dockerfile
environment:
- NODE_ENV=production
- DB_HOST=db
- DB_PORT=3306
- DB_NAME=myapp
- REDIS_HOST=redis
volumes:
- ./app:/app
- app_data:/app/data
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
restart: unless-stopped
deploy:
resources:
limits:
cpus: '2'
memory: 1G
reservations:
cpus: '1'
memory: 512M
networks:
- frontend
- backend
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
MYSQL_DATABASE: myapp
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASS}
volumes:
- db_data:/var/lib/mysql
- ./db/init:/docker-entrypoint-initdb.d
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
networks:
- backend
redis:
image: redis:7-alpine
command: redis-server --requirepass ${REDIS_PASS} --maxmemory 256mb
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
networks:
- backend
volumes:
db_data:
redis_data:
app_data:
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true
# 创建环境变量文件
nano .env
DB_ROOT_PASS=SuperSecureRootPass123!
DB_USER=myapp_user
DB_PASS=SecurePass456!
REDIS_PASS=RedisPass789!
# 启动服务
docker compose up -d
# 查看日志
docker compose logs -f app
docker compose logs --tail=100
# 停止服务
docker compose down
# 重新构建并启动
docker compose up -d --build
# 查看资源使用
docker compose top
docker stats
11.4 Dockerfile最佳实践
# 多阶段构建 Node.js 应用
# Stage 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production && \
npm cache clean --force
COPY . .
RUN npm run build
# Stage 2: Production
FROM node:20-alpine AS production
LABEL maintainer="admin@example.com"
LABEL version="1.0"
RUN addgroup -g 1001 -S appgroup && \
adduser -S appuser -u 1001 -G appgroup
WORKDIR /app
COPY --from=builder --chown=appuser:appgroup /app/dist ./dist
COPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modules
COPY --from=builder --chown=appuser:appgroup /app/package.json ./
EXPOSE 3000
USER appuser
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
CMD ["node", "dist/index.js"]
11.5 Docker网络管理
# 查看网络
docker network ls
docker network inspect bridge
# 创建自定义网络
docker network create --driver bridge --subnet 172.20.0.0/16 mynet
docker network create --driver overlay myoverlay # Swarm模式
# 连接容器到网络
docker network connect mynet container1
# 删除网络
docker network rm mynet
docker network prune # 清理未使用的网络
11.6 Docker Swarm集群
# 初始化Swarm
docker swarm init --advertise-addr 192.168.1.100
# 加入集群(在其他节点执行)
docker swarm join --token SWMTKN-xxx 192.168.1.100:2377
# 部署stack
docker stack deploy -c docker-compose.yml myapp
# 查看服务
docker service ls
docker service ps myapp_web
docker service logs myapp_web
# 扩缩容
docker service scale myapp_web=5
# 更新服务
docker service update --image nginx:1.26 myapp_web
11.7 Docker安全
# 以非root用户运行容器
# 在Dockerfile中指定
USER appuser
# 只读文件系统
docker run --read-only --tmpfs /tmp myimage
# 限制能力
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE myimage
# 资源限制
docker run --memory=512m --cpus=1 --pids-limit=100 myimage
# 安全扫描
docker scout cves myimage:latest
# 或使用trivy
sudo apt install trivy
trivy image myimage:latest
12. 文件共享服务
12.1 Samba文件共享
# 安装Samba
sudo apt install samba samba-common-bin
# 创建共享目录
sudo mkdir -p /srv/samba/{public,secure}
sudo chown nobody:nogroup /srv/samba/public
sudo chmod 777 /srv/samba/public
sudo chown root:sambashare /srv/samba/secure
sudo chmod 2770 /srv/samba/secure
# 编辑配置
sudo nano /etc/samba/smb.conf
[global]
workgroup = WORKGROUP
server string = Samba Server
server role = standalone server
log file = /var/log/samba/log.%m
max log size = 1000
dns proxy = no
# 安全设置
min protocol = SMB2
client min protocol = SMB2
[public]
path = /srv/samba/public
browseable = yes
read only = yes
guest ok = yes
create mask = 0644
directory mask = 0755
[secure]
path = /srv/samba/secure
browseable = yes
read only = no
guest ok = no
valid users = user1 user2 @developers
create mask = 0660
directory mask = 0770
force group = sambashare
# 设置Samba密码
sudo smbpasswd -a user1
sudo smbpasswd -e user1 # 启用用户
# 测试配置
testparm
# 重启服务
sudo systemctl restart smbd nmbd
# 防火墙放行
sudo ufw allow samba
# 查看Samba状态
sudo smbstatus
12.2 NFS网络文件系统
# NFS服务端配置
sudo apt install nfs-kernel-server
# 创建共享目录
sudo mkdir -p /srv/nfs/{share,data}
sudo chown nobody:nogroup /srv/nfs/share
sudo chmod 755 /srv/nfs/share
sudo chown www-data:www-data /srv/nfs/data
sudo chmod 755 /srv/nfs/data
# 配置导出
sudo nano /etc/exports
# /srv/nfs/share 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
# /srv/nfs/data 192.168.1.0/24(rw,sync,no_subtree_check,all_squash,anonuid=33,anongid=33)
# /srv/nfs/share 10.0.0.5(rw,sync,no_subtree_check)
# 应用配置
sudo exportfs -arv
sudo systemctl restart nfs-kernel-server
# 查看导出
sudo exportfs -v
# NFS客户端挂载
sudo apt install nfs-common
# 手动挂载
sudo mount -t nfs -o rw,sync,hard,intr 192.168.1.100:/srv/nfs/share /mnt/nfs
# 开机自动挂载(/etc/fstab)
# 192.168.1.100:/srv/nfs/share /mnt/nfs nfs defaults,hard,intr,timeo=600,retrans=2 0 0
# NFSv4挂载
# 192.168.1.100:/share /mnt/nfs nfs4 defaults,sec=sys 0 0
12.3 FTP服务器 (vsftpd)
# 安装vsftpd
sudo apt install vsftpd
# 备份并编辑配置
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
sudo nano /etc/vsftpd.conf
# 基本设置
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
chroot_local_user=YES
allow_writeable_chroot=YES
# 被动模式
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30100
# 用户限制
user_sub_token=$USER
local_root=/home/$USER/ftp
# SSL/TLS(推荐)
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.key
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
# 创建FTP用户
sudo useradd -m -s /usr/sbin/nologin ftpuser
sudo passwd ftpuser
sudo mkdir -p /home/ftpuser/ftp/upload
sudo chown -R ftpuser:ftpuser /home/ftpuser/ftp
sudo chmod 755 /home/ftpuser/ftp
sudo chmod 775 /home/ftpuser/ftp/upload
# 允许nologin用户使用FTP
echo "/usr/sbin/nologin" | sudo tee -a /etc/shells
# 重启服务
sudo systemctl restart vsftpd
# 防火墙
sudo ufw allow 21/tcp
sudo ufw allow 30000:30100/tcp
13. 定时任务与自动化
13.1 Cron定时任务
# 编辑当前用户的crontab
crontab -e
# 查看当前用户的定时任务
crontab -l
# 编辑系统crontab
sudo nano /etc/crontab
# Cron格式: 分(0-59) 时(0-23) 日(1-31) 月(1-12) 周(0-7) 命令
# * = 任意值, */n = 每n次, n-m = 范围, n,m = 列表
# 每天凌晨2点执行备份
0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
# 每小时执行一次
0 * * * * /opt/scripts/check_health.sh
# 每5分钟
*/5 * * * * /opt/scripts/monitor.sh
# 每周一上午9点
0 9 * * 1 /opt/scripts/weekly_report.sh
# 每月1号和15号零点
0 0 1,15 * * /opt/scripts/monthly_task.sh
# 工作日(周一到周五)早上8点
0 8 * * 1-5 /opt/scripts/weekday_task.sh
# 每季度第一天
0 0 1 */3 * /opt/scripts/quarterly_task.sh
# 系统级crontab需要指定用户
# /etc/crontab 格式: 分 时 日 月 周 用户 命令
30 2 * * * root /opt/scripts/cleanup.sh
13.2 Systemd Timer(推荐替代Cron)
# 创建服务文件 /etc/systemd/system/backup.service
[Unit]
Description=Daily Backup
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/opt/scripts/backup.sh
StandardOutput=journal
StandardError=journal
# 创建定时器 /etc/systemd/system/backup.timer
[Unit]
Description=Run backup daily at 2AM
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300
[Install]
WantedBy=timers.target
# 启用定时器
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
# 查看定时器状态
systemctl list-timers --all
journalctl -u backup.service
13.3 Anacron(不固定时间开机)
# Anacron适合不常开机的机器
sudo apt install anacron
# 配置(/etc/anacrontab)
# 格式: 周期(天) 延迟(分钟) 任务ID 命令
1 5 cron.daily run-parts --report /etc/cron.daily
7 10 cron.weekly run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly run-parts --report /etc/cron.monthly
13.4 任务调度最佳实践
#!/bin/bash
# 定时任务模板脚本 /opt/scripts/task.sh
# 严格模式
set -euo pipefail
# 日志文件
LOGFILE="/var/log/mytask.log"
LOCKFILE="/tmp/mytask.lock"
# 防止重复执行
if [ -f "$LOCKFILE" ]; then
echo "$(date): Task already running" >> "$LOGFILE"
exit 1
fi
trap 'rm -f $LOCKFILE' EXIT
touch "$LOCKFILE"
# 记录开始时间
echo "$(date): Task started" >> "$LOGFILE"
# 执行任务
/opt/scripts/actual_task.sh 2>&1 | tee -a "$LOGFILE"
# 检查退出码
if [ $? -eq 0 ]; then
echo "$(date): Task completed successfully" >> "$LOGFILE"
else
echo "$(date): Task failed with exit code $?" >> "$LOGFILE"
# 发送告警
echo "Task failed on $(hostname)" | mail -s "Alert" admin@example.com
fi
14. 系统监控与日志
14.1 系统资源监控
# 安装监控工具
sudo apt install htop iotop iftop nload sysstat dstat nmon glances
# CPU和内存监控
htop # 交互式进程查看(推荐)
top # 基础进程查看
btop # 现代化监控工具(sudo snap install btop)
glances # 综合监控(支持Web界面)
# 系统资源概览
vmstat 1 10 # 每秒刷新,共10次
mpstat -P ALL 1 5 # CPU使用率(每个核心)
sar -u 1 5 # CPU统计
# 磁盘IO监控
iostat -xz 1 5 # 磁盘IO详情
iotop -o # 仅显示有IO的进程
dstat -d # 磁盘统计
# 网络监控
iftop -i ens33 # 实时流量
nload ens33 # 带宽监控
ss -tuln # 端口监听
watch -n 1 ss -s # 实时连接统计
nethogs ens33 # 按进程显示网络使用
# 综合监控
dstat -cdngy # CPU、磁盘、网络、系统综合
nmon # 交互式综合监控
14.2 日志管理
# 主要日志文件位置
/var/log/syslog # 系统日志
/var/log/auth.log # 认证日志(SSH等)
/var/log/kern.log # 内核日志
/var/log/dpkg.log # 包管理日志
/var/log/apt/ # APT日志
/var/log/nginx/ # Nginx日志
/var/log/mysql/ # MySQL日志
/var/log/redis/ # Redis日志
/var/log/ufw.log # 防火墙日志
# 实时查看日志
tail -f /var/log/syslog
tail -f /var/log/auth.log | grep -i "ssh\|login\|fail"
multitail /var/log/syslog /var/log/auth.log # 多文件同时查看
# 日志搜索
grep "error" /var/log/syslog
grep -r "failed" /var/log/
journalctl -g "error" # 正则搜索
14.3 日志轮转
# 创建自定义日志轮转配置
sudo nano /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
systemctl reload myapp > /dev/null 2>&1 || true
endscript
}
# Nginx日志轮转
/var/log/nginx/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}
# 手动执行轮转
sudo logrotate -f /etc/logrotate.d/myapp
# 测试配置(不实际执行)
sudo logrotate -d /etc/logrotate.d/myapp
14.4 磁盘空间管理
# 查看磁盘使用
df -h
df -i # 查看inode使用率
# 查看目录大小
du -sh /var/log/*
du -sh /* | sort -rh | head -20
du -sh /var/lib/docker # Docker占用
docker system df # Docker详细占用
# 查找大文件
sudo find / -type f -size +100M -exec ls -lh {} \;
sudo find / -type f -size +1G -printf '%s %p\n' | sort -rn | head -20
# 查找并清理旧文件
find /var/log -name "*.gz" -mtime +30 -delete
find /tmp -type f -mtime +7 -delete
# 清理系统缓存
sudo apt clean
sudo apt autoclean
sudo apt autoremove
# 清理journal日志
sudo journalctl --vacuum-size=500M
sudo journalctl --vacuum-time=7d
# 清理Docker
docker system prune -a --volumes # 清理所有未使用的
14.5 实时监控脚本
#!/bin/bash
# /opt/scripts/system_monitor.sh
# 系统健康检查脚本
echo "=== System Health Report ==="
echo "Time: $(date)"
echo "Hostname: $(hostname)"
echo ""
echo "--- Uptime & Load ---"
uptime
echo ""
echo "--- Memory ---"
free -h
echo ""
echo "--- Disk Usage ---"
df -h | grep -vE '^Filesystem|tmpfs|cdrom'
echo ""
echo "--- Top CPU Processes ---"
ps aux --sort=-%cpu | head -6
echo ""
echo "--- Top Memory Processes ---"
ps aux --sort=-%mem | head -6
echo ""
echo "--- Network Connections ---"
ss -s
echo ""
echo "--- Failed Services ---"
systemctl --failed --no-pager
echo ""
echo "--- Recent Auth Failures ---"
grep "Failed" /var/log/auth.log | tail -5
echo ""
echo "=== End Report ==="
15. 备份与灾难恢复
15.1 rsync增量备份
# 本地备份
rsync -avh --progress /source/ /backup/
# 远程备份(通过SSH)
rsync -avh --progress -e "ssh -p 2222" /source/ user@remote:/backup/
# 排除特定文件
rsync -avh --exclude='*.tmp' --exclude='.cache' --exclude='node_modules' \
/source/ /backup/
# 使用排除文件
rsync -avh --exclude-from=/opt/scripts/rsync_exclude.txt /source/ /backup/
# 删除目标中源已删除的文件(镜像同步)
rsync -avh --delete /source/ /backup/
# 仅模拟不执行(dry-run)
rsync -avhn --delete /source/ /backup/
# 限制带宽
rsync -avh --bwlimit=10000 /source/ /backup/ # 10MB/s
# 增量备份(基于link-dest)
rsync -avh --delete --link-dest=/backup/latest /source/ /backup/$(date +%Y%m%d)
ln -sfn /backup/$(date +%Y%m%d) /backup/latest
15.2 完整系统备份
# 使用tar备份整个系统
sudo tar -czf /backup/system_$(date +%Y%m%d).tar.gz \
--exclude=/proc \
--exclude=/sys \
--exclude=/dev \
--exclude=/run \
--exclude=/tmp \
--exclude=/mnt \
--exclude=/media \
--exclude=/backup \
--exclude=/lost+found \
--exclude=/var/cache/apt \
--exclude=/var/tmp \
--exclude=/swapfile \
/
# 恢复系统备份
cd /
sudo tar -xzf /backup/system_20260718.tar.gz
sudo grub-install /dev/sda
sudo update-grub
15.3 高级备份工具 (Borg Backup)
# 安装Borg
sudo apt install borgbackup
# 初始化仓库
borg init --encryption=repokey /backup/borg-repo
# 或远程仓库
borg init --encryption=repokey user@remote:/backup/borg-repo
# 创建备份
borg create --stats --progress \
/backup/borg-repo::backup-{now:%Y-%m-%d_%H:%M} \
/etc /home /var/www /opt \
--exclude='*.tmp' \
--exclude='/var/cache' \
--exclude='/tmp'
# 列出备份
borg list /backup/borg-repo
# 查看备份内容
borg list /backup/borg-repo::backup-2026-07-18_02:00
# 恢复备份
borg extract /backup/borg-repo::backup-2026-07-18_02:00
# 清理旧备份(保留策略)
borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=6 \
--stats /backup/borg-repo
# 验证备份完整性
borg check --verify-data /backup/borg-repo
15.4 自动化备份脚本
#!/bin/bash
# /opt/scripts/full_backup.sh
set -euo pipefail
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d)
RETENTION_DAYS=7
REMOTE_USER="backup"
REMOTE_HOST="backup-server"
REMOTE_DIR="/backup/server1"
LOGFILE="/var/log/backup.log"
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOGFILE"
}
log "===== Backup Started ====="
mkdir -p $BACKUP_DIR
# 1. 数据库备份
log "Backing up databases..."
mysqldump -u root -p$DB_PASS --all-databases --single-transaction \
--routines --triggers --events | gzip > \
$BACKUP_DIR/db_all_$DATE.sql.gz
# 2. 配置文件备份
log "Backing up configuration files..."
tar -czf $BACKUP_DIR/config_$DATE.tar.gz \
/etc/nginx /etc/mysql /etc/ssh /etc/systemd \
/etc/netplan /etc/fail2ban /etc/docker 2>/dev/null
# 3. 网站文件备份
log "Backing up web files..."
tar -czf $BACKUP_DIR/www_$DATE.tar.gz /var/www
# 4. 应用数据备份
log "Backing up application data..."
rsync -az --delete /opt/myapp/data/ $BACKUP_DIR/myapp_data/
# 5. 清理旧备份
log "Cleaning old backups..."
find $BACKUP_DIR -name "*.gz" -mtime +$RETENTION_DAYS -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
# 6. 同步到远程
log "Syncing to remote..."
rsync -az --delete -e "ssh -p 2222" \
$BACKUP_DIR/ $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/
# 7. 验证备份
log "Verifying backups..."
if [ -f "$BACKUP_DIR/db_all_$DATE.sql.gz" ]; then
gunzip -t $BACKUP_DIR/db_all_$DATE.sql.gz
log "Database backup verified OK"
fi
log "===== Backup Completed Successfully ====="
log "Backup size: $(du -sh $BACKUP_DIR | cut -f1)"
16. 性能优化
16.1 内核参数优化
# /etc/sysctl.d/99-performance.conf 服务器性能优化
# 网络优化 - 高并发场景
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.core.optmem_max = 65535
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# TCP优化
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_max_tw_buckets = 131072
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_slow_start_after_idle = 0
# IP优化
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.conf.all.arp_notify = 1
# 文件系统
fs.file-max = 2097152
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 8192
16.2 文件描述符限制
# 编辑limits配置
sudo nano /etc/security/limits.d/99-nofile.conf
# 文件描述符限制
* soft nofile 1048576
* hard nofile 1048576
root soft nofile 1048576
root hard nofile 1048576
# 进程数限制
* soft nproc 65535
* hard nproc 65535
# 内存锁定(用于数据库等需要锁定内存的应用)
* soft memlock unlimited
* hard memlock unlimited
# 核心转储
* soft core 0
* hard core 0
# 确保PAM模块加载
sudo nano /etc/pam.d/common-session
# session required pam_limits.so
# systemd服务也需要设置
# 在服务的[Service]段添加:
# LimitNOFILE=1048576
# LimitNPROC=65535
# 验证
ulimit -n
ulimit -u
16.3 CPU调度优化
# 查看当前CPU调度策略
cat /sys/block/sda/queue/scheduler
# 设置为deadline(适合数据库服务器)
echo deadline | sudo tee /sys/block/sda/queue/scheduler
# 或设置为none(NVMe SSD推荐)
echo none | sudo tee /sys/block/sda/queue/scheduler
# 持久化(GRUB参数)
sudo nano /etc/default/grub
# GRUB_CMDLINE_LINUX="elevator=deadline"
sudo update-grub
# CPU频率策略
sudo apt install cpufrequtils
echo 'GOVERNOR="performance"' | sudo tee /etc/default/cpufrequtils
sudo systemctl restart cpufrequtils
16.4 Swap优化
# 调整swappiness(降低swap使用倾向)
# 0 = 尽量不用swap, 100 = 积极使用swap
sudo sysctl vm.swappiness=10
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.d/99-performance.conf
# 调整vfs_cache_pressure(降低inode/dentry缓存回收)
sudo sysctl vm.vfs_cache_pressure=50
echo "vm.vfs_cache_pressure=50" | sudo tee -a /etc/sysctl.d/99-performance.conf
# 调整dirty pages(减少磁盘写入频率)
sudo sysctl vm.dirty_ratio=10
sudo sysctl vm.dirty_background_ratio=5
echo "vm.dirty_ratio=10" | sudo tee -a /etc/sysctl.d/99-performance.conf
echo "vm.dirty_background_ratio=5" | sudo tee -a /etc/sysctl.d/99-performance.conf
# 创建swap文件(如没有swap分区)
sudo fallocate -l 4G /swapfile
# 或使用dd
# sudo dd if=/dev/zero of=/swapfile bs=1G count=4
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
16.5 IO调度与存储优化
# 查看当前IO调度器
cat /sys/block/sda/queue/scheduler
# SSD优化:使用none/mq-deadline
echo mq-deadline | sudo tee /sys/block/nvme0n1/queue/scheduler
# 禁用SSD的旋转延迟计算
echo 0 | sudo tee /sys/block/nvme0n1/queue/rotational
# 优化队列深度
echo 1024 | sudo tee /sys/block/nvme0n1/queue/nr_requests
# 启用TRIM(SSD优化)
sudo systemctl enable fstrim.timer
sudo systemctl start fstrim.timer
# 手动TRIM
sudo fstrim -v /
16.6 网络性能优化 (TCP BBR)
# 启用BBR拥塞控制算法(内核4.9+)
# 确认内核版本
uname -r
# 加载BBR模块
sudo modprobe tcp_bbr
# 启用BBR
echo "net.ipv4.tcp_congestion_control = bbr" | sudo tee -a /etc/sysctl.d/99-performance.conf
echo "net.core.default_qdisc = fq" | sudo tee -a /etc/sysctl.d/99-performance.conf
sudo sysctl --system
# 验证BBR已启用
sysctl net.ipv4.tcp_congestion_control
lsmod | grep bbr
17. 安全加固
17.1 安全审计工具
# Lynis - 系统安全审计
sudo apt install lynis
sudo lynis audit system # 完整审计
sudo lynis audit system --quick # 快速审计
sudo lynis audit system --profile custom.prf # 使用自定义配置
# 查看审计报告
cat /var/log/lynis.log
cat /var/log/lynis-report.dat
# Rootkit检测 - rkhunter
sudo apt install rkhunter
sudo rkhunter --update
sudo rkhunter --propupd # 更新属性数据库
sudo rkhunter --check --skip-keypress # 检查
# chkrootkit
sudo apt install chkrootkit
sudo chkrootkit
# ClamAV - 病毒扫描
sudo apt install clamav clamav-daemon
sudo freshclam # 更新病毒库
sudo clamscan -r /var/www # 扫描目录
sudo clamscan --infected --remove -r /home
17.2 AppArmor配置
# 查看AppArmor状态
sudo aa-status
# 查看所有配置文件
ls /etc/apparmor.d/
# 查看某个程序的AppArmor状态
sudo aa-status /usr/sbin/nginx
# 设置为强制模式(执行策略)
sudo aa-enforce /etc/apparmor.d/usr.sbin.mysqld
# 设置为投诉模式(仅记录不阻止)
sudo aa-complain /etc/apparmor.d/usr.sbin.mysqld
# 禁用配置文件
sudo aa-disable /etc/apparmor.d/usr.sbin.mysqld
# 重新加载所有配置
sudo systemctl reload apparmor
# 查看审计日志中的AppArmor拒绝
sudo grep DENIED /var/log/syslog
sudo dmesg | grep -i apparmor
# 创建自定义配置文件
sudo nano /etc/apparmor.d/local/usr.sbin.myapp
# 添加自定义规则后:
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.myapp
17.3 自动安全更新
# 安装unattended-upgrades
sudo apt install unattended-upgrades apt-listchanges
# 启用自动更新
sudo dpkg-reconfigure -plow unattended-upgrades
# 编辑配置
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
// 自动安装安全更新
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}";
"${distro_id}:${distro_codename}-security";
"${distro_id}ESMApps:${distro_codename}-apps-security";
"${distro_id}:${distro_codename}-updates";
};
// 黑名单(不自动更新的包)
Unattended-Upgrade::Package-Blacklist {
"nodejs";
"docker-ce";
};
// 自动清理
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
// 自动重启(如有内核更新)
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-WithUsers "false";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";
// 邮件通知
Unattended-Upgrade::Mail "admin@example.com";
Unattended-Upgrade::MailReport "always";
17.4 入侵检测 (AIDE)
# 安装AIDE
sudo apt install aide aide-common
# 初始化数据库(首次使用,耗时较长)
sudo aideinit
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# 检查系统完整性
sudo aide --check
# 更新数据库(在系统变更合法后)
sudo aide --update
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# 配置定时检查
sudo nano /etc/cron.daily/aide
# 确保存在自动检查任务
# 自定义检查规则
sudo nano /etc/aide/aide.conf
# 添加自定义目录:
# /opt/myapp p+i+u+g+sha512
17.5 文件完整性监控
# Tripwire(企业级文件完整性监控)
sudo apt install tripwire
sudo tripwire-setup-keyfiles # 设置密钥
sudo tripwire --init # 初始化数据库
sudo tripwire --check # 检查
sudo tripwire --update # 更新策略
# OSSEC/Wazuh(开源HIDS)
# 适合大规模部署
# https://documentation.wazuh.com/
17.6 SSH密钥管理
# 定期轮换SSH密钥
# 1. 生成新密钥
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_2026 -C "admin@$(date +%Y)"
# 2. 将新公钥添加到服务器
ssh-copy-id -i ~/.ssh/id_ed25519_2026.pub -p 2222 user@server
# 3. 测试新密钥
ssh -i ~/.ssh/id_ed25519_2026 -p 2222 user@server
# 4. 移除旧密钥
ssh -p 2222 user@server "sed -i '/old_key_comment/d' ~/.ssh/authorized_keys"
# 5. 删除旧密钥文件
rm ~/.ssh/id_ed25519
# 查看authorized_keys中的密钥
ssh -p 2222 user@server "cat ~/.ssh/authorized_keys"
17.7 USB和外部设备安全
# 禁用USB存储
echo "blacklist usb-storage" | sudo tee /etc/modprobe.d/blacklist-usb.conf
sudo update-initramfs -u
# 或使用udev规则限制
sudo nano /etc/udev/rules.d/99-usb-restrict.rules
# 禁止USB存储设备
# ACTION=="add", SUBSYSTEM=="usb", ENV{ID_USB_INTERFACES}=="*:0806*:", RUN+="/bin/sh -c 'echo 0 > /sys$DEVPATH/authorized'"
# 禁止USB设备自动挂载
sudo systemctl disable udisks2
18. 故障排查
18.1 启动故障
# 查看启动日志
journalctl -b -1 # 上次启动日志
journalctl -b -p err # 本次启动错误
journalctl -b -p emerg # 紧急错误
systemd-analyze # 启动时间分析
systemd-analyze blame # 各服务启动耗时
systemd-analyze critical-chain # 关键启动链
# 检查GRUB
sudo update-grub
sudo grub-install /dev/sda
sudo grub-mkconfig -o /boot/grub/grub.cfg
# 单用户模式/救援模式
# 重启时按e编辑GRUB,在linux行末添加:
# systemd.unit=rescue.target
# 或
# init=/bin/bash rw
# 然后Ctrl+X启动
# 从Live CD修复
# 1. 从Ubuntu Live CD启动
# 2. 挂载原系统
sudo mount /dev/sda3 /mnt
sudo mount /dev/sda1 /mnt/boot
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
# 3. chroot
sudo chroot /mnt
# 4. 修复
grub-install /dev/sda
update-grub
exit
18.2 网络故障排查
# 无法联网检查步骤
# 1. 测试本地回环
ping -c 4 127.0.0.1
# 2. 检查网卡状态
ip addr
ip link show
# 确认网卡是否UP,是否有IP
# 3. 检查路由
ip route
# 确认有默认网关
# 4. 测试网关连通
ping -c 4 192.168.1.1
# 5. 测试外网连通(IP方式)
ping -c 4 8.8.8.8
# 6. 测试DNS
ping -c 4 baidu.com
nslookup baidu.com
dig baidu.com
dig baidu.com @8.8.8.8
# 7. 查看DNS配置
cat /etc/resolv.conf
resolvectl status
# 重置网络
sudo netplan --debug apply
sudo systemctl restart systemd-networkd
sudo systemctl restart systemd-resolved
# 检查防火墙
sudo ufw status
sudo iptables -L -n
sudo nft list ruleset
18.3 服务故障排查
# 服务无法启动
sudo systemctl status service_name
journalctl -u service_name --since "1 hour ago" -n 100
# 检查配置文件语法
sudo nginx -t # Nginx
sudo sshd -t # SSH
sudo named-checkconf # BIND DNS
# 端口被占用
sudo ss -tulnp | grep :80
sudo lsof -i :80
# 找到占用进程后
sudo kill -9 PID
# 权限问题
ls -la /path/to/file
namei -l /path/to/file # 显示完整路径权限链
stat /path/to/file
# 磁盘满导致问题
df -h
df -i # inode满也会导致无法创建文件
sudo du -sh /var/log/* | sort -rh | head -10
# OOM(内存不足)被kill
dmesg | grep -i "oom\|killed"
journalctl -k | grep -i oom
18.4 性能问题排查
# CPU占用高
top # 按1查看各核心
htop
mpstat -P ALL 1
pidstat -u 1 5 # 按进程查看CPU
# 找到高CPU进程后
strace -p PID # 跟踪系统调用
perf top # 性能分析(需安装linux-tools)
# 内存不足
free -h
vmstat 1
cat /proc/meminfo
# 查看内存占用最大的进程
ps aux --sort=-%mem | head -10
# 磁盘IO高
iostat -xz 1
iotop -o
# 查看IO最大的进程
pidstat -d 1
# 负载高但CPU不高
# 可能是IO等待(iowait)
# 用iostat查看await和%util
# await > 10ms 说明IO延迟高
# %util > 80% 说明磁盘接近饱和
# 网络延迟
ping -c 100 8.8.8.8 | tail -1
mtr -r -c 100 8.8.8.8 # 报告模式
tcptraceroute 8.8.8.8 443
18.5 磁盘故障排查
# SMART磁盘健康检查
sudo apt install smartmontools
sudo smartctl -a /dev/sda # 全部信息
sudo smartctl -H /dev/sda # 快速健康检查
sudo smartctl -t short /dev/sda # 短测试
sudo smartctl -t long /dev/sda # 长测试
sudo smartctl -l selftest /dev/sda # 测试结果
# 文件系统检查(必须umount)
sudo fsck /dev/sda3
sudo fsck.ext4 -f /dev/sda3 # 强制检查
sudo xfs_repair /dev/sda3 # XFS修复
# 查看磁盘错误
dmesg | grep -i "ext4\|xfs\|error\|corrupt"
# 坏块检测
sudo badblocks -v /dev/sda > bad_blocks.txt
19. 系统更新与维护
19.1 定期维护清单
| 任务 | 频率 | 命令/操作 |
|---|---|---|
| 系统更新 | 每周 | sudo apt update && sudo apt upgrade |
| 安全审计 | 每月 | sudo lynis audit system |
| Rootkit扫描 | 每周 | sudo rkhunter --check |
| 日志清理 | 每月 | journalctl --vacuum-time=30d |
| 磁盘检查 | 每周 | df -h && du -sh /var/* |
| 备份验证 | 每月 | 恢复测试 |
| 密码更换 | 90天 | passwd username |
| SSL证书续期 | 80天 | certbot renew |
| SSH密钥轮换 | 180天 | 生成新密钥对 |
| 用户账户审查 | 每月 | 检查无用账户 |
| 性能基线比较 | 每周 | 对比监控指标 |
| SMART检查 | 每月 | smartctl -H /dev/sda |
19.2 自动化维护脚本
#!/bin/bash
# /opt/scripts/maintenance.sh
set -euo pipefail
REPORT="/var/log/maintenance_$(date +%Y%m%d).log"
exec > >(tee -a "$REPORT") 2>&1
echo "===== System Maintenance $(date) ====="
# 1. 系统更新
echo "[1/8] Updating system..."
apt update -q
UPDATES=$(apt list --upgradable 2>/dev/null | wc -l)
echo " Available updates: $UPDATES"
apt upgrade -y
apt autoremove -y
# 2. 安全扫描
echo "[2/8] Running security scan..."
rkhunter --check --skip-keypress || true
# 3. 清理日志
echo "[3/8] Cleaning logs..."
journalctl --vacuum-size=500M
find /var/log -name "*.gz" -mtime +30 -delete
# 4. 磁盘检查
echo "[4/8] Checking disk usage..."
df -h | grep -vE '^Filesystem|tmpfs|cdrom'
INODE_WARN=$(df -i | awk 'NR>1 && $5+0 > 80 {print $6 " (" $5 ")"}')
[ -n "$INODE_WARN" ] && echo " WARNING: High inode usage: $INODE_WARN"
# 5. 检查失败服务
echo "[5/8] Checking failed services..."
FAILED=$(systemctl --failed --no-pager --no-legend | wc -l)
echo " Failed services: $FAILED"
[ $FAILED -gt 0 ] && systemctl --failed
# 6. 检查磁盘健康
echo "[6/8] Checking disk health..."
for disk in $(lsblk -dn -o NAME | grep -E '^(sd|nvme)'); do
HEALTH=$(smartctl -H /dev/$disk 2>/dev/null | grep "PASSED\|FAILED" || echo "N/A")
echo " /dev/$disk: $HEALTH"
done
# 7. 检查SSH密钥
echo "[7/8] Checking SSH authorized keys..."
for user_home in /home/*/; do
user=$(basename $user_home)
keys=$(wc -l < "$user_home/.ssh/authorized_keys" 2>/dev/null || echo "0")
echo " $user: $keys authorized keys"
done
# 8. 系统信息
echo "[8/8] System info..."
echo " Uptime: $(uptime -p)"
echo " Kernel: $(uname -r)"
echo " Last reboot: $(who -b | awk '{print $3, $4}')"
echo "===== Maintenance Complete $(date) ====="
19.3 版本升级
# 升级前准备
sudo apt update && sudo apt full-upgrade -y
sudo apt autoremove -y
# 完整备份!
# 从22.04升级到24.04
sudo do-release-upgrade
# 检查可用升级
sudo do-release-upgrade -c
# 强制升级(如果提示没有新版本)
sudo do-release-upgrade -d
# 升级后检查
sudo apt update && sudo apt full-upgrade -y
sudo apt autoremove -y
sudo reboot
# 验证版本
lsb_release -a
cat /etc/os-release
⚠️ 重要:升级前请完整备份系统,并在测试环境先验证。生产环境建议在维护窗口期进行。
19.4 内核管理
# 查看已安装的内核
dpkg --list | grep linux-image
# 查看当前使用的内核
uname -r
# 清理旧内核(保留当前和上一个版本)
sudo apt autoremove --purge
# 更新GRUB
sudo update-grub
# 查看GRUB默认启动项
grep menuentry /boot/grub/grub.cfg
20. 常用命令速查
20.1 文件与目录
ls -lah # 列出所有文件(含隐藏)
ls -lSr # 按大小排序
tree -L 2 # 树形显示目录
cd /path # 切换目录
cd - # 切换到上次的目录
pwd # 显示当前路径
cp -r src/ dest/ # 复制目录
cp -a src/ dest/ # 完整复制(保留属性)
cp --backup=numbered src dest # 备份已存在的文件
mv old new # 移动/重命名
rm -rf dir/ # 强制删除
rm -i file # 交互式删除
find / -name "*.log" -mtime +7 -delete # 查找并删除旧日志
find . -type f -size +100M # 查找大文件
find . -perm 777 # 查找777权限文件
locate filename # 快速查找(需updatedb)
updatedb # 更新locate数据库
grep -rn "text" /dir # 递归搜索文本(显示行号)
grep -i "error" log # 忽略大小写
grep -v "pattern" # 反向匹配
chmod 755 file # 修改权限
chmod -R u+x dir/ # 递归给owner添加执行权限
chown user:group file # 修改所有者
chown -R user:group dir/ # 递归修改
ln -s target link # 创建软链接
ln target link # 创建硬链接
tar -czf archive.tar.gz dir/ # 压缩gz
tar -cjf archive.tar.bz2 dir/ # 压缩bz2
tar -cJf archive.tar.xz dir/ # 压缩xz
tar -xzf archive.tar.gz # 解压gz
tar -xjf archive.tar.bz2 # 解压bz2
tar -xJf archive.tar.xz # 解压xz
tar -tvf archive.tar.gz # 查看内容
zip -r archive.zip dir/ # ZIP压缩
unzip archive.zip # ZIP解压
20.2 系统信息
uname -a # 内核信息
uname -r # 内核版本
lsb_release -a # 发行版信息
cat /etc/os-release # 系统信息
hostnamectl # 主机名和系统信息
uptime # 运行时间和负载
uptime -p # 可读格式的运行时间
w # 当前登录用户
who # 登录用户详情
whoami # 当前用户
id # 当前用户UID/GID
last # 登录历史
lastb # 失败登录(需root)
lastlog # 所有用户最后登录
free -h # 内存使用
free -m # 内存使用(MB)
df -h # 磁盘使用
df -i # inode使用
du -sh * # 目录大小
du -sh /var/* # 特定目录
lscpu # CPU信息
lscpu | grep "Model name" # CPU型号
nproc # CPU核心数
lsblk # 块设备
lsblk -f # 文件系统信息
blkid # 分区UUID
fdisk -l # 磁盘信息(需root)
lsmod # 内核模块
modinfo module # 模块详情
dmesg | tail # 内核日志
dmesg | grep -i error # 内核错误
lspci -v # PCI设备
lsusb -v # USB设备
dmidecode # 硬件信息(需root)
dmidecode -t memory # 内存信息
dmidecode -t bios # BIOS信息
cat /proc/cpuinfo # CPU详情
cat /proc/meminfo # 内存详情
cat /proc/loadavg # 负载
sensors # 温度传感器(需lm-sensors)
20.3 网络命令
ip addr # IP地址
ip addr show ens33 # 特定网卡
ip link # 链路状态
ip route # 路由表
ip neigh # ARP表
ss -tuln # 监听端口
ss -tulnp # 监听端口+进程
ss -s # 统计
ss -tn state established # 已建立的TCP连接
ping -c 4 host # 连通性测试
ping6 host # IPv6测试
curl -I url # HTTP头信息
curl -v url # 详细请求信息
curl -X POST -d "data" url # POST请求
wget url # 下载文件
wget -c url # 断点续传
wget -r -np url # 递归下载
scp file user@host:/path # 远程复制
scp -r dir/ user@host:/path
rsync -av src/ dest/ # 同步文件
sftp user@host # SFTP交互
dig domain # DNS查询
dig +short domain # 简短DNS结果
dig MX domain # 查询邮件记录
dig @8.8.8.8 domain # 指定DNS服务器
host domain # 简单DNS查询
nslookup domain # DNS查询
traceroute host # 路由追踪
tracepath host # UDP追踪
mtr host # 综合追踪
nmap -sV host # 端口扫描+版本
nmap -sS host # SYN扫描
nmap -A host # 全扫描
nc -zv host port # 端口连通测试
nc -l -p 8080 # 监听端口
openssl s_client -connect host:443 # 检查SSL证书
20.4 进程管理
ps aux # 所有进程
ps aux | grep name # 查找进程
ps -ef # 另一种格式
ps -u username # 特定用户的进程
ps --forest # 树形显示
pgrep process_name # 按名称查找PID
pstree # 进程树
pstree -p # 进程树+PID
kill PID # 终止进程
kill -15 PID # 优雅终止(SIGTERM)
kill -9 PID # 强制终止(SIGKILL)
kill -HUP PID # 重载配置
killall name # 按名称终止
pkill pattern # 按模式终止
xkill # 点击窗口终止(图形界面)
top # 进程监控
htop # 增强进程监控(推荐)
bg # 后台运行
fg # 前台运行
jobs # 查看后台任务
nohup cmd & # 后台运行(不挂断)
disown %1 # 从shell中脱离任务
nice -n 10 cmd # 低优先级运行
renice 10 PID # 调整优先级
ionice -c 2 cmd # 调整IO优先级
strace -p PID # 跟踪系统调用
lsof -p PID # 进程打开的文件
lsof -i :port # 端口相关进程
/proc/PID/ # 进程详情目录
/proc/PID/fd/ # 进程文件描述符
/proc/PID/status # 进程状态
20.5 文本处理
cat file # 显示文件
head -n 20 file # 显示前20行
tail -n 20 file # 显示后20行
tail -f file # 实时跟踪
less file # 分页查看
more file # 分页查看(功能较少)
wc -l file # 行数
wc -w file # 单词数
wc -c file # 字符数
sort file # 排序
sort -n file # 数字排序
sort -r file # 倒序
sort -u file # 去重排序
uniq file # 去重(需先排序)
cut -d: -f1 /etc/passwd # 按分隔符截取
awk '{print $1}' file # AWK打印第一列
awk -F: '{print $1}' /etc/passwd
sed 's/old/new/g' file # 替换文本
sed -i 's/old/new/g' file # 直接修改文件
sed -n '5,10p' file # 打印5-10行
grep -c "pattern" file # 匹配行数
diff file1 file2 # 比较文件
colordiff file1 file2 # 彩色比较
comm file1 file2 # 比较共同行
tee file # 同时输出到屏幕和文件
xargs # 将输入转为命令参数
echo "file1\nfile2" | xargs rm # 批量删除
seq 1 10 # 生成序列
yes "text" | head -5 # 重复输出
21. 磁盘管理 (LVM/ZFS/Btrfs)
21.1 LVM (Logical Volume Manager)
# 查看LVM状态
sudo pvs # 物理卷
sudo vgs # 卷组
sudo lvs # 逻辑卷
sudo pvdisplay
sudo vgdisplay
sudo lvdisplay
# 创建物理卷
sudo pvcreate /dev/sdb
sudo pvcreate /dev/sdc
# 创建卷组
sudo vgcreate vg_data /dev/sdb /dev/sdc
# 创建逻辑卷
sudo lvcreate -L 100G -n lv_app vg_data
sudo lvcreate -l 100%FREE -n lv_data vg_data # 使用全部剩余空间
sudo lvcreate -l 50%VG -n lv_half vg_data # 使用50%空间
# 格式化并挂载
sudo mkfs.ext4 /dev/vg_data/lv_app
sudo mkfs.xfs /dev/vg_data/lv_data
sudo mkdir -p /app /data
sudo mount /dev/vg_data/lv_app /app
sudo mount /dev/vg_data/lv_data /data
# 添加到fstab
# /dev/vg_data/lv_app /app ext4 defaults 0 2
# /dev/vg_data/lv_data /data xfs defaults 0 2
21.2 LVM扩容
# 添加新磁盘到VG
sudo pvcreate /dev/sdd
sudo vgextend vg_data /dev/sdd
# 扩展逻辑卷
sudo lvextend -L +50G /dev/vg_data/lv_app
# 或扩展到指定大小
sudo lvextend -L 200G /dev/vg_data/lv_app
# 或使用全部剩余空间
sudo lvextend -l +100%FREE /dev/vg_data/lv_data
# 扩展文件系统
# ext4
sudo resize2fs /dev/vg_data/lv_app
# xfs
sudo xfs_growfs /data
21.3 LVM快照
# 创建快照(用于备份)
sudo lvcreate -L 10G -s -n snap_app /dev/vg_data/lv_app
# 挂载快照
sudo mount -o ro /dev/vg_data/snap_app /mnt/snap
# 备份数据
tar -czf /backup/app_$(date +%Y%m%d).tar.gz /mnt/snap
# 删除快照
sudo umount /mnt/snap
sudo lvremove /dev/vg_data/snap_app
21.4 ZFS文件系统
# 安装ZFS
sudo apt install zfsutils-linux
# 创建ZFS池
sudo zpool create tank /dev/sdb /dev/sdc # RAID0
sudo zpool create tank mirror /dev/sdb /dev/sdc # RAID1镜像
sudo zpool create tank raidz /dev/sdb /dev/sdc /dev/sdd # RAID5
# 查看池状态
zpool status
zpool list
zfs list
# 创建数据集
sudo zfs create tank/data
sudo zfs create tank/backup
sudo zfs create -o mountpoint=/home tank/home
# 设置属性
sudo zfs set compression=lz4 tank/data
sudo zfs set atime=off tank/data
sudo zfs set quota=100G tank/data
# 快照
sudo zfs snapshot tank/data@20260718
sudo zfs list -t snapshot
# 回滚快照
sudo zfs rollback tank/data@20260718
# 克隆快照
sudo zfs clone tank/data@20260718 tank/data_clone
# 发送/接收(远程备份)
zfs send tank/data@20260718 | ssh user@remote "zfs receive backup/data"
# 数据校验(Scrub)
sudo zpool scrub tank
zpool status tank
21.5 Btrfs文件系统
# 安装Btrfs工具
sudo apt install btrfs-progs
# 创建Btrfs文件系统
sudo mkfs.btrfs /dev/sdb
# 多设备创建
sudo mkfs.btrfs -d raid1 /dev/sdb /dev/sdc
# 挂载
sudo mount /dev/sdb /data
# 创建子卷
sudo btrfs subvolume create /data/subvol1
sudo mount -o subvol=subvol1 /dev/sdb /mnt/sub1
# 快照
sudo btrfs subvolume snapshot /data /data/snap_20260718
# 只读快照
sudo btrfs subvolume snapshot -r /data /data/ro_snap
# 删除快照
sudo btrfs subvolume delete /data/snap_20260718
# 数据校验(Scrub)
sudo btrfs scrub start /data
sudo btrfs scrub status /data
# 压缩
sudo mount -o compress=zstd /dev/sdb /data
# 文件系统检查
sudo btrfs check /dev/sdb
22. 内核管理
22.1 内核版本管理
# 查看当前内核版本
uname -r
uname -a
# 查看已安装的内核
dpkg --list | grep linux-image
dpkg --list | grep linux-headers
# 安装特定内核
sudo apt install linux-image-6.8.0-40-generic
sudo apt install linux-headers-6.8.0-40-generic
# 安装HWE(硬件启用)内核
sudo apt install linux-generic-hwe-24.04
# 安装Low Latency内核(实时应用)
sudo apt install linux-lowlatency
# 删除旧内核(保留当前+一个旧版)
sudo apt autoremove --purge
22.2 内核模块管理
# 查看已加载模块
lsmod
lsmod | grep driver_name
# 加载模块
sudo modprobe module_name
sudo modprobe module_name param=value
# 卸载模块
sudo modprobe -r module_name
sudo rmmod module_name
# 查看模块信息
modinfo module_name
# 禁止自动加载模块
echo "blacklist module_name" | sudo tee /etc/modprobe.d/blacklist-module.conf
# 永久加载模块(开机自动加载)
echo "module_name" | sudo tee /etc/modules-load.d/module.conf
# 更新initramfs
sudo update-initramfs -u
sudo update-initramfs -u -k all
22.3 内核参数管理
# 查看内核参数
sysctl -a | grep parameter
sysctl net.ipv4.ip_forward
# 临时修改
sudo sysctl -w net.ipv4.ip_forward=1
# 持久化修改
echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-custom.conf
sudo sysctl --system
# GRUB内核参数
sudo nano /etc/default/grub
# GRUB_CMDLINE_LINUX="quiet splash"
# 常用参数:
# nomodeset - 禁用GPU模式设置
# acpi=off - 禁用ACPI
# processor.max_cstate=1 - 限制CPU C状态
# intel_iommu=on - 启用IOMMU
# iommu=pt - IOMMU直通模式
sudo update-grub
22.4 内核编译(高级)
# 安装编译工具
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev bc
# 下载内核源码
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.8.tar.xz
tar -xf linux-6.8.tar.xz
cd linux-6.8
# 复制当前内核配置
cp /boot/config-$(uname -r) .config
# 修改配置
make menuconfig # 图形界面配置
make olddefconfig # 使用默认值更新配置
# 编译
make -j$(nproc)
# 安装模块和内核
sudo make modules_install
sudo make install
# 更新GRUB
sudo update-grub
sudo reboot
23. 高级网络技术
23.1 网卡绑定 (Bonding)
# 网卡绑定提供冗余和负载均衡
# 编辑netplan配置
sudo nano /etc/netplan/02-bond.yaml
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
ens34:
dhcp4: no
bonds:
bond0:
interfaces:
- ens33
- ens34
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [8.8.8.8]
parameters:
mode: 802.3ad # LACP模式(推荐)
# 其他模式:
# balance-rr (0) - 轮询
# active-backup (1) - 主备
# balance-xor (2) - XOR哈希
# broadcast (3) - 广播
# 802.3ad (4) - LACP(需交换机支持)
# balance-tlb (5) - 自适应发送
# balance-alb (6) - 自适应收发
lacp-rate: fast
mii-monitor-interval: 100
transmit-hash-policy: layer3+4
# 应用配置
sudo netplan apply
# 查看绑定状态
cat /proc/net/bonding/bond0
23.2 VLAN配置
# 安装VLAN支持
sudo apt install vlan
sudo modprobe 8021q
echo "8021q" | sudo tee /etc/modules-load.d/vlan.conf
# Netplan VLAN配置
sudo nano /etc/netplan/03-vlan.yaml
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
vlans:
vlan10:
id: 10
link: ens33
addresses:
- 192.168.10.100/24
vlan20:
id: 20
link: ens33
addresses:
- 192.168.20.100/24
23.3 策略路由
# 多ISP策略路由
# 创建路由表
echo "100 isp1" | sudo tee -a /etc/iproute2/rt_tables
echo "200 isp2" | sudo tee -a /etc/iproute2/rt_tables
# 配置路由表1(ISP1)
sudo ip route add default via 192.168.1.1 dev ens33 table isp1
sudo ip route add 192.168.1.0/24 dev ens33 table isp1
# 配置路由表2(ISP2)
sudo ip route add default via 10.0.0.1 dev ens34 table isp2
sudo ip route add 10.0.0.0/24 dev ens34 table isp2
# 根据源IP选择路由表
sudo ip rule add from 192.168.1.100 table isp1
sudo ip rule add from 10.0.0.100 table isp2
# 持久化
# 创建脚本 /etc/networkd-dispatcher/routable.d/policy-routing
23.4 流量整形 (TC)
# 安装tc工具
sudo apt install iproute2
# 限制ens33的出方向带宽为100Mbps
sudo tc qdisc add dev ens33 root tbf rate 100mbit burst 32kbit latency 400ms
# 查看规则
sudo tc qdisc show dev ens33
# 删除规则
sudo tc qdisc del dev ens33 root
# 基于IP的限速
sudo tc qdisc add dev ens33 root handle 1: htb default 10
sudo tc class add dev ens33 parent 1: classid 1:1 htb rate 100mbit
sudo tc class add dev ens33 parent 1:1 classid 1:10 htb rate 50mbit ceil 100mbit
sudo tc class add dev ens33 parent 1:1 classid 1:20 htb rate 50mbit ceil 100mbit
sudo tc filter add dev ens33 protocol ip parent 1:0 prio 1 u32 \
match ip src 192.168.1.100 flowid 1:10
24. 虚拟化 (KVM/LXC)
24.1 KVM安装
# 检查CPU虚拟化支持
egrep -c '(vmx|svm)' /proc/cpuinfo
# 结果>0表示支持
# 安装KVM及相关工具
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients \
bridge-utils virt-manager cloud-image-utils
# 将用户加入libvirt和kvm组
sudo usermod -aG libvirt,kvm $USER
# 启动libvirtd
sudo systemctl enable --now libvirtd
# 验证安装
virsh list --all
sudo virsh nodeinfo
24.2 KVM网络桥接
# 配置网桥(netplan)
sudo nano /etc/netplan/01-kvm-bridge.yaml
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
bridges:
br0:
interfaces:
- ens33
dhcp4: no
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [8.8.8.8]
sudo netplan apply
# 定义KVM使用的网络
sudo virsh net-define /dev/stdin << EOF
br0
EOF
sudo virsh net-start br0
sudo virsh net-autostart br0
24.3 创建KVM虚拟机
# 使用virt-install创建虚拟机
sudo virt-install \
--name=ubuntu-vm1 \
--ram=4096 \
--vcpus=2 \
--disk path=/var/lib/libvirt/images/ubuntu-vm1.qcow2,size=50,bus=virtio \
--cdrom=/path/to/ubuntu-24.04-live-server-amd64.iso \
--os-variant=ubuntu24.04 \
--network bridge=br0,model=virtio \
--graphics spice,listen=0.0.0.0 \
--noautoconsole
# 使用cloud-init快速创建
# 下载cloud镜像
wget https://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-amd64.img
# 创建cloud-init配置
cat > user-data << 'EOF'
#cloud-config
users:
- name: admin
sudo: ALL=(ALL) NOPASSWD:ALL
ssh_authorized_keys:
- ssh-ed25519 AAAA...
EOF
# 创建seed镜像
cloud-localds seed.img user-data
# 创建并启动
sudo virt-install \
--name=cloud-vm \
--ram=2048 --vcpus=2 \
--disk path=ubuntu-24.04-server-cloudimg-amd64.img,device=disk \
--disk path=seed.img,device=cdrom \
--os-variant=ubuntu24.04 \
--network bridge=br0 \
--import --noautoconsole
24.4 KVM虚拟机管理
# 虚拟机管理命令
virsh list --all # 列出所有虚拟机
virsh start vm_name # 启动
virsh shutdown vm_name # 优雅关机
virsh destroy vm_name # 强制关机
virsh reboot vm_name # 重启
virsh suspend vm_name # 暂停
virsh resume vm_name # 恢复
# 查看虚拟机信息
virsh dominfo vm_name
virsh domblklist vm_name
virsh domiflist vm_name
# 快照管理
virsh snapshot-create-as vm_name snap1
virsh snapshot-list vm_name
virsh snapshot-revert vm_name snap1
virsh snapshot-delete vm_name snap1
# 克隆虚拟机
virt-clone --original vm1 --name vm2 \
--file /var/lib/libvirt/images/vm2.qcow2
# 连接控制台
virsh console vm_name
# 或通过SSH
ssh admin@vm_ip
24.5 LXC/LXD容器
# 安装LXD
sudo snap install lxd --channel=5.21/stable
# 初始化LXD
sudo lxd init
# 选择默认值,设置存储池大小等
# 容器操作
lxc launch ubuntu:24.04 mycontainer
lxc list
lxc exec mycontainer -- /bin/bash
lxc stop mycontainer
lxc start mycontainer
lxc delete mycontainer
# 资源配置
lxc config set mycontainer limits.memory 2GB
lxc config set mycontainer limits.cpu 2
# 网络
lxc network list
lxc network create mybridge
lxc network attach mybridge mycontainer
# 存储
lxc storage list
lxc storage create mypool zfs source=/dev/sdb
# 快照
lxc snapshot mycontainer snap1
lxc restore mycontainer snap1
# 导入/导出
lxc export mycontainer backup.tar.gz
lxc import backup.tar.gz
25. Kubernetes部署
25.1 安装kubeadm
# 所有节点都需要执行
# 禁用swap
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab
# 加载内核模块
cat << EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 内核参数
cat << EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
# 安装容器运行时(containerd)
sudo apt install containerd
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
# 修改SystemdCgroup = true
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
# 安装kubeadm、kubelet、kubectl
sudo apt install apt-transport-https ca-certificates curl gpg
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | \
sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install kubeadm kubelet kubectl
sudo apt-mark hold kubeadm kubelet kubectl
25.2 初始化集群
# Master节点初始化集群
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.1.100
# 配置kubectl
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 安装网络插件(Calico)
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico.yaml
# 或安装Flannel
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
# Worker节点加入(使用kubeadm init输出的命令)
sudo kubeadm join 192.168.1.100:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx
25.3 Kubernetes基本操作
# 查看节点
kubectl get nodes
kubectl describe node node1
# 部署应用
kubectl create deployment nginx --image=nginx:latest --replicas=3
kubectl get deployments
kubectl get pods
kubectl get pods -o wide
# 暴露服务
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get services
# 扩缩容
kubectl scale deployment nginx --replicas=5
# 更新镜像
kubectl set image deployment/nginx nginx=nginx:1.26
# 回滚
kubectl rollout undo deployment/nginx
kubectl rollout status deployment/nginx
# 删除
kubectl delete deployment nginx
kubectl delete service nginx
25.4 Helm包管理
# 安装Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
# 搜索Chart
helm search repo nginx
helm search hub wordpress
# 安装应用
helm install my-nginx bitnami/nginx
helm install my-wordpress bitnami/wordpress --set wordpressPassword=pass123
# 管理
helm list
helm upgrade my-nginx bitnami/nginx
helm rollback my-nginx
helm uninstall my-nginx
26. VPN搭建
26.1 WireGuard VPN
# 安装WireGuard
sudo apt install wireguard
# 生成密钥对(服务器端)
cd /etc/wireguard
umask 077
wg genkey | tee server_private.key | wg pubkey > server_public.key
# 生成密钥对(客户端)
wg genkey | tee client_private.key | wg pubkey > client_public.key
# 服务器配置
sudo nano /etc/wireguard/wg0.conf
[Interface]
PrivateKey =
Address = 10.0.0.1/24
ListenPort = 51820
# NAT转发
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens33 -j MASQUERADE
[Peer]
# Client 1
PublicKey =
AllowedIPs = 10.0.0.2/32
[Peer]
# Client 2
PublicKey =
AllowedIPs = 10.0.0.3/32
# 启用IP转发
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system
# 启动WireGuard
sudo systemctl enable --now wg-quick@wg0
# 查看状态
sudo wg show
26.2 WireGuard客户端配置
# 客户端配置(wg0.conf)
[Interface]
PrivateKey =
Address = 10.0.0.2/24
DNS = 8.8.8.8
[Peer]
PublicKey =
Endpoint = server_ip:51820
AllowedIPs = 0.0.0.0/0, ::/0 # 全部流量走VPN
PersistentKeepalive = 25
26.3 OpenVPN
# 安装OpenVPN和Easy-RSA
sudo apt install openvpn easy-rsa
# 初始化PKI
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-dh
openvpn --genkey --secret pki/ta.key
# 生成客户端证书
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
# 服务器配置
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
gunzip /etc/openvpn/server.conf.gz
# 编辑配置文件指向证书路径
# 启动服务
sudo systemctl enable --now openvpn@server
27. DNS服务器
27.1 BIND9 DNS服务器
# 安装BIND9
sudo apt install bind9 bind9utils bind9-doc dnsutils
# 主配置文件
sudo nano /etc/bind/named.conf.options
options {
directory "/var/cache/bind";
recursion yes;
allow-recursion { localhost; 192.168.1.0/24; };
listen-on { any; };
listen-on-v6 { any; };
# 转发器
forwarders {
8.8.8.8;
8.8.4.4;
};
# DNSSEC
dnssec-validation auto;
# 安全
allow-query { any; };
allow-transfer { none; };
version "Not disclosed";
};
27.2 正向解析区域
# 添加区域配置
sudo nano /etc/bind/named.conf.local
zone "example.com" {
type master;
file "/etc/bind/zones/db.example.com";
allow-update { none; };
};
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/zones/db.192.168.1";
};
# 创建区域文件
sudo mkdir -p /etc/bind/zones
sudo nano /etc/bind/zones/db.example.com
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2026071801 ; Serial
3600 ; Refresh (1小时)
1800 ; Retry (30分钟)
604800 ; Expire (1周)
86400 ; Minimum TTL (1天)
)
; NS记录
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.
; A记录
@ IN A 192.168.1.100
ns1 IN A 192.168.1.100
ns2 IN A 192.168.1.101
www IN A 192.168.1.100
mail IN A 192.168.1.102
api IN A 192.168.1.103
db IN A 192.168.1.104
; CNAME记录
ftp IN CNAME www
blog IN CNAME www
; MX记录
@ IN MX 10 mail.example.com.
; TXT记录
@ IN TXT "v=spf1 mx ~all"
; AAAA记录(IPv6)
@ IN AAAA 2001:db8::100
27.3 反向解析区域
# 反向解析文件
sudo nano /etc/bind/zones/db.192.168.1
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2026071801
3600
1800
604800
86400
)
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.
100 IN PTR ns1.example.com.
100 IN PTR www.example.com.
101 IN PTR ns2.example.com.
102 IN PTR mail.example.com.
103 IN PTR api.example.com.
104 IN PTR db.example.com.
# 验证配置
sudo named-checkconf
sudo named-checkzone example.com /etc/bind/zones/db.example.com
# 重启服务
sudo systemctl restart bind9
# 测试
dig example.com @localhost
dig -x 192.168.1.100 @localhost
nslookup example.com 127.0.0.1
27.4 Unbound递归DNS
# 安装Unbound
sudo apt install unbound
# 配置
sudo nano /etc/unbound/unbound.conf.d/myconf.conf
server:
interface: 0.0.0.0
access-control: 192.168.1.0/24 allow
access-control: 127.0.0.0/8 allow
# DNSSEC验证
auto-trust-anchor-file: "/var/lib/unbound/root.key"
# 性能
num-threads: 4
msg-cache-slabs: 8
rrset-cache-slabs: 8
infra-cache-slabs: 8
key-cache-slabs: 8
rrset-cache-size: 256m
msg-cache-size: 128m
# 隐私
hide-identity: yes
hide-version: yes
# 转发到上游(可选)
# forward-zone:
# name: "."
# forward-addr: 8.8.8.8
# forward-addr: 1.1.1.1
sudo systemctl enable --now unbound
sudo resolvectl dns ens33 127.0.0.1
28. 高可用集群
28.1 Keepalived (VIP高可用)
# 安装Keepalived
sudo apt install keepalived
# Master节点配置
sudo nano /etc/keepalived/keepalived.conf
vrrp_script check_nginx {
script "/usr/bin/pgrep -x nginx"
interval 2
weight -20
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass secret123
}
virtual_ipaddress {
192.168.1.200/24
}
track_script {
check_nginx
}
notify_master "/opt/scripts/notify.sh master"
notify_backup "/opt/scripts/notify.sh backup"
}
# Backup节点配置(主要区别)
# state BACKUP
# priority 90
sudo systemctl enable --now keepalived
# 验证VIP
ip addr show ens33
# 查看是否有 192.168.1.200
28.2 HAProxy负载均衡
# 安装HAProxy
sudo apt install haproxy
# 配置
sudo nano /etc/haproxy/haproxy.cfg
global
log /dev/log local0
log /dev/log local1 notice
maxconn 4096
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
retries 3
option redispatch
frontend http_front
bind *:80
bind *:443 ssl crt /etc/haproxy/certs/combined.pem
default_backend http_back
# HTTP重定向到HTTPS
redirect scheme https if !{ ssl_fc }
backend http_back
balance roundrobin
option httpchk GET /health
http-check expect status 200
server web1 192.168.1.101:80 check weight 1 maxconn 100
server web2 192.168.1.102:80 check weight 1 maxconn 100
server web3 192.168.1.103:80 check weight 1 maxconn 100 backup
# 统计页面
listen stats
bind *:8404
stats enable
stats uri /stats
stats realm HAProxy\ Statistics
stats auth admin:password
sudo systemctl enable --now haproxy
28.3 Pacemaker/Corosync集群
# 安装集群组件
sudo apt install pacemaker corosync pcs
# 设置集群用户密码
sudo passwd hacluster
# 启动服务
sudo systemctl enable --now pcsd corosync pacemaker
# 认证节点
sudo pcs host auth node1 node2 -u hacluster
# 创建集群
sudo pcs cluster setup mycluster node1 node2
# 启动集群
sudo pcs cluster start --all
sudo pcs cluster enable --all
# 配置资源
sudo pcs resource create VirtualIP ocf:heartbeat:IPaddr2 \
ip=192.168.1.200 cidr_netmask=24 op monitor interval=30s
sudo pcs resource create WebServer systemd:nginx \
op monitor interval=30s
# 资源约束(确保VIP和Web在同一节点)
sudo pcs constraint colocation add WebServer VirtualIP INFINITY
sudo pcs constraint order VirtualIP then WebServer
# 查看状态
sudo pcs status
sudo crm_mon -1
29. 高级存储方案
29.1 Ceph分布式存储
# Ceph部署(使用cephadm)
# 安装cephadm
curl --silent --remote-name --location \
https://github.com/ceph/ceph/raw/quincy/src/cephadm/cephadm
chmod +x cephadm
sudo ./cephadm add-repo --release quincy
sudo ./cephadm install ceph-common
# 创建集群
sudo cephadm bootstrap --mon-ip 192.168.1.100
# 添加节点
sudo ceph orch host add node2 192.168.1.101
sudo ceph orch host add node3 192.168.1.102
# 添加OSD
sudo ceph orch daemon add osd node1:/dev/sdb
sudo ceph orch daemon add osd node2:/dev/sdb
sudo ceph orch daemon add osd node3:/dev/sdb
# 创建存储池
sudo ceph osd pool create mypool 128 128
sudo ceph osd pool set mypool size 3
sudo ceph osd pool set mypool min_size 2
# 创建文件系统(CephFS)
sudo ceph fs volume create myfs
sudo ceph fs subvolume create myfs mysubvol
# 创建块设备(RBD)
sudo rbd create mypool/myimage --size 10240 # 10GB
sudo rbd map mypool/myimage
sudo mkfs.ext4 /dev/rbd0
sudo mount /dev/rbd0 /mnt/rbd
# 创建对象存储(RGW)
sudo ceph orch apply rgw myrgw
# 查看集群状态
sudo ceph status
sudo ceph osd tree
29.2 GlusterFS分布式文件系统
# 安装GlusterFS(所有节点)
sudo apt install glusterfs-server
# 启动服务
sudo systemctl enable --now glusterd
# 在node1上添加peer
sudo gluster peer probe node2
sudo gluster peer probe node3
sudo gluster peer status
# 创建brick目录(所有节点)
sudo mkdir -p /data/glusterfs/myvolume/brick1
# 创建卷
sudo gluster volume create myvolume replica 3 \
node1:/data/glusterfs/myvolume/brick1 \
node2:/data/glusterfs/myvolume/brick1 \
node3:/data/glusterfs/myvolume/brick1
# 启动卷
sudo gluster volume start myvolume
# 查看卷信息
sudo gluster volume info
sudo gluster volume status
# 客户端挂载
sudo apt install glusterfs-client
sudo mount -t glusterfs node1:/myvolume /mnt/gluster
# fstab持久化
# node1:/myvolume /mnt/gluster glusterfs defaults,_netdev 0 0
29.3 iSCSI存储
# iSCSI Target(服务端)
sudo apt install targetcli-fb
sudo systemctl enable --now target
# 配置target
sudo targetcli
/> backstores/fileio create name=lun0 dev=/dev/vg_data/lv_iscsi size=100G
/> iscsi/ create iqn.2026-07.com.example:storage
/> iscsi/iqn.2026-07.com.example:storage/tpg1/luns create /backstores/fileio/lun0
/> iscsi/iqn.2026-07.com.example:storage/tpg1/portals create 192.168.1.100
/> iscsi/iqn.2026-07.com.example:storage/tpg1 set attribute authentication=0
/> saveconfig
/> exit
# iSCSI Initiator(客户端)
sudo apt install open-iscsi
# 发现目标
sudo iscsiadm -m discovery -t sendtargets -p 192.168.1.100
# 登录
sudo iscsiadm -m node --login
# 查看磁盘
lsblk
# 新磁盘会自动出现
# 格式化和挂载
sudo mkfs.ext4 /dev/sdb
sudo mount /dev/sdb /mnt/iscsi
30. 自动化运维 (Ansible)
30.1 安装Ansible
# 安装Ansible
sudo apt install ansible
# 或使用pip安装最新版
sudo apt install python3-pip
pip3 install ansible --break-system-packages
# 验证安装
ansible --version
# 配置inventory
sudo mkdir -p /etc/ansible
sudo nano /etc/ansible/hosts
[webservers]
web1 ansible_host=192.168.1.101
web2 ansible_host=192.168.1.102
[dbservers]
db1 ansible_host=192.168.1.103
db2 ansible_host=192.168.1.104
[all:vars]
ansible_user=admin
ansible_ssh_private_key_file=~/.ssh/id_ed25519
ansible_python_interpreter=/usr/bin/python3
30.2 Ansible Ad-Hoc命令
# Ping所有主机
ansible all -m ping
# 在webservers组执行命令
ansible webservers -a "uptime"
ansible webservers -a "df -h"
# 使用sudo
ansible all -m shell -a "apt update" --become
# 复制文件
ansible webservers -m copy -a "src=/local/file dest=/remote/file"
# 安装软件包
ansible webservers -m apt -a "name=nginx state=present" --become
# 管理服务
ansible webservers -m service -a "name=nginx state=started enabled=yes" --become
# 获取facts
ansible all -m setup
30.3 Ansible Playbook
# 创建playbook
nano ~/playbooks/webserver.yml
---
- name: Configure Web Servers
hosts: webservers
become: yes
vars:
nginx_version: "1.25"
document_root: /var/www/html
tasks:
- name: Update apt cache
apt:
update_cache: yes
cache_valid_time: 3600
- name: Install Nginx
apt:
name: nginx
state: present
- name: Configure Nginx
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/sites-available/default
notify: Restart Nginx
- name: Deploy website
copy:
src: files/index.html
dest: "{{ document_root }}/index.html"
- name: Enable firewall rules
ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- "80"
- "443"
- name: Ensure Nginx is running
service:
name: nginx
state: started
enabled: yes
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
# 执行playbook
ansible-playbook ~/playbooks/webserver.yml
# 检查语法
ansible-playbook ~/playbooks/webserver.yml --syntax-check
# 模拟执行(dry-run)
ansible-playbook ~/playbooks/webserver.yml --check
# 详细输出
ansible-playbook ~/playbooks/webserver.yml -v
30.4 Ansible Roles
# 创建Role结构
ansible-galaxy init myrole
# 目录结构
# myrole/
# ├── defaults/main.yml # 默认变量
# ├── handlers/main.yml # 处理器
# ├── meta/main.yml # 元数据
# ├── tasks/main.yml # 任务
# ├── templates/ # Jinja2模板
# ├── files/ # 静态文件
# └── vars/main.yml # 变量
# 使用Role的playbook
---
- hosts: webservers
become: yes
roles:
- common
- nginx
- php
- { role: mysql, when: "'dbservers' in group_names" }
31. 高级监控系统
31.1 Prometheus + Grafana
# 安装Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.53.0/prometheus-2.53.0.linux-amd64.tar.gz
tar xzf prometheus-2.53.0.linux-amd64.tar.gz
sudo mv prometheus-2.53.0.linux-amd64 /opt/prometheus
# 创建系统服务
sudo useradd --no-create-home --shell /bin/false prometheus
sudo mkdir /etc/prometheus /var/lib/prometheus
sudo cp /opt/prometheus/prometheus /opt/prometheus/promtool /usr/local/bin/
sudo cp -r /opt/prometheus/consoles /opt/prometheus/console_libraries /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
# Prometheus配置
sudo nano /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']
rule_files:
- "alert_rules.yml"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets: ['localhost:9100']
- job_name: 'nginx'
static_configs:
- targets: ['localhost:9113']
- job_name: 'mysql'
static_configs:
- targets: ['localhost:9104']
# Node Exporter(系统指标收集)
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.1/node_exporter-1.8.1.linux-amd64.tar.gz
tar xzf node_exporter-1.8.1.linux-amd64.tar.gz
sudo mv node_exporter-1.8.1.linux-amd64/node_exporter /usr/local/bin/
# 创建systemd服务
sudo nano /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--collector.systemd \
--collector.processes
[Install]
WantedBy=multi-user.target
# 安装Grafana
sudo apt install apt-transport-https software-properties-common
wget -q -O /usr/share/keyrings/grafana.key https://apt.grafana.com/gpg.key
echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://apt.grafana.com stable main" | \
sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt update
sudo apt install grafana
sudo systemctl enable --now grafana-server
# 访问 http://server:3000 默认 admin/admin
31.2 告警配置
# Alertmanager安装
wget https://github.com/prometheus/alertmanager/releases/download/v0.27.0/alertmanager-0.27.0.linux-amd64.tar.gz
tar xzf alertmanager-0.27.0.linux-amd64.tar.gz
sudo mv alertmanager-0.27.0.linux-amd64/alertmanager /usr/local/bin/
# Alertmanager配置
sudo nano /etc/alertmanager/alertmanager.yml
global:
smtp_smarthost: 'smtp.example.com:587'
smtp_from: 'alert@example.com'
smtp_auth_username: 'alert@example.com'
smtp_auth_password: 'password'
route:
receiver: 'email-alerts'
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receivers:
- name: 'email-alerts'
email_configs:
- to: 'admin@example.com'
send_resolved: true
- name: 'slack-alerts'
slack_configs:
- api_url: 'https://hooks.slack.com/services/xxx'
channel: '#alerts'
32. Shell脚本编程
32.1 脚本基础
#!/bin/bash
# 脚本第一行指定解释器
# 常用: #!/bin/bash #!/bin/sh #!/usr/bin/env bash
# 严格模式(推荐所有脚本使用)
set -euo pipefail
# -e: 命令失败时退出
# -u: 未定义变量时报错
# -o pipefail: 管道中任意命令失败则整体失败
# 变量定义
NAME="Ubuntu"
VERSION=24.04
READONLY_VAR="constant" # 只读变量
readonly READONLY_VAR
# 使用变量
echo "System: $NAME $VERSION"
echo "Path: ${HOME}/documents" # 花括号避免歧义
# 命令替换
CURRENT_DATE=$(date +%Y-%m-%d)
FILE_COUNT=$(ls -1 | wc -l)
# 算术运算
COUNT=$((5 + 3))
RESULT=$((COUNT * 2))
# 数组
ARRAY=(one two three)
echo ${ARRAY[0]} # 第一个元素
echo ${ARRAY[@]} # 所有元素
echo ${#ARRAY[@]} # 数组长度
32.2 条件判断
# if-elif-else
if [ "$USER" = "root" ]; then
echo "You are root"
elif [ "$USER" = "admin" ]; then
echo "You are admin"
else
echo "You are $USER"
fi
# 文件测试
if [ -f "/etc/hosts" ]; then
echo "File exists"
fi
# 常用文件测试:
# -f file 文件存在且是普通文件
# -d dir 目录存在
# -e path 路径存在
# -r file 可读
# -w file 可写
# -x file 可执行
# -s file 文件大小>0
# -L file 是软链接
# 字符串比较
if [ -z "$VAR" ]; then # 字符串为空
echo "Empty"
fi
if [ -n "$VAR" ]; then # 字符串非空
echo "Not empty"
fi
if [ "$A" = "$B" ]; then # 字符串相等
echo "Equal"
fi
# 数字比较
if [ "$A" -eq "$B" ]; then echo "Equal"; fi # 等于
if [ "$A" -ne "$B" ]; then echo "Not equal"; fi # 不等于
if [ "$A" -gt "$B" ]; then echo "Greater"; fi # 大于
if [ "$A" -lt "$B" ]; then echo "Less"; fi # 小于
if [ "$A" -ge "$B" ]; then echo "Gte"; fi # 大于等于
if [ "$A" -le "$B" ]; then echo "Lte"; fi # 小于等于
# 逻辑运算
if [ -f "$FILE" ] && [ -r "$FILE" ]; then
echo "File exists and readable"
fi
if [ "$A" = "1" ] || [ "$B" = "2" ]; then
echo "Either condition true"
fi
# case语句
case "$1" in
start)
echo "Starting..."
;;
stop)
echo "Stopping..."
;;
restart)
echo "Restarting..."
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
32.3 循环结构
# for循环
for i in 1 2 3 4 5; do
echo "Number: $i"
done
# 范围循环
for i in {1..10}; do
echo "Number: $i"
done
# C风格循环
for ((i=0; i<10; i++)); do
echo "Index: $i"
done
# 遍历文件
for file in /var/log/*.log; do
echo "Processing: $file"
wc -l "$file"
done
# while循环
count=0
while [ $count -lt 5 ]; do
echo "Count: $count"
((count++))
done
# 读取文件逐行
while IFS= read -r line; do
echo "Line: $line"
done < /etc/hosts
# until循环(条件为假时执行)
until ping -c 1 8.8.8.8 &>/dev/null; do
echo "Waiting for network..."
sleep 5
done
echo "Network is up!"
32.4 函数
# 函数定义
log() {
local level=$1
local message=$2
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $message"
}
# 调用函数
log "INFO" "Script started"
log "ERROR" "Something went wrong"
# 带返回值的函数
check_disk() {
local usage=$(df -h / | tail -1 | awk '{print $5}' | tr -d '%')
if [ "$usage" -gt 80 ]; then
echo "WARNING"
return 1
else
echo "OK"
return 0
fi
}
# 使用返回值
result=$(check_disk)
if [ $? -eq 0 ]; then
echo "Disk usage: $result"
else
echo "Disk usage: $result - Need attention!"
fi
# 函数参数
backup_dir() {
local src=$1
local dest=$2
local date=$(date +%Y%m%d)
if [ ! -d "$src" ]; then
log "ERROR" "Source directory not found: $src"
return 1
fi
tar -czf "${dest}/backup_${date}.tar.gz" "$src"
log "INFO" "Backup created: ${dest}/backup_${date}.tar.gz"
}
32.5 实用脚本示例
#!/bin/bash
# 系统健康检查脚本
set -euo pipefail
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 函数
print_section() {
echo ""
echo "=== $1 ==="
}
check_and_print() {
local name=$1
local value=$2
local threshold=$3
local unit=$4
if [ "$value" -gt "$threshold" ]; then
echo -e "${RED}[WARN]${NC} $name: ${value}${unit} (threshold: ${threshold}${unit})"
else
echo -e "${GREEN}[OK]${NC} $name: ${value}${unit}"
fi
}
# 主程序
echo "System Health Check - $(date)"
echo "Host: $(hostname)"
print_section "Disk Usage"
while read -r line; do
usage=$(echo "$line" | awk '{print $5}' | tr -d '%')
mount=$(echo "$line" | awk '{print $6}')
[ -n "$usage" ] && check_and_print "$mount" "$usage" 85 "%"
done < <(df -h | grep -vE '^Filesystem|tmpfs|cdrom')
print_section "Memory"
mem_total=$(free -m | awk '/Mem:/ {print $2}')
mem_used=$(free -m | awk '/Mem:/ {print $3}')
mem_pct=$((mem_used * 100 / mem_total))
check_and_print "Memory" "$mem_pct" 85 "%"
print_section "Load Average"
load=$(cat /proc/loadavg | awk '{print $1}')
load_int=${load%.*}
cpu_count=$(nproc)
check_and_print "Load (1min)" "$load_int" "$cpu_count" ""
print_section "Failed Services"
failed=$(systemctl --failed --no-pager --no-legend 2>/dev/null | wc -l)
if [ "$failed" -gt 0 ]; then
echo -e "${RED}[WARN]${NC} $failed failed services"
systemctl --failed --no-pager
else
echo -e "${GREEN}[OK]${NC} No failed services"
fi
print_section "Uptime"
echo "Uptime: $(uptime -p)"
echo ""
echo "Check completed at $(date)"
33. 文件系统高级
33.1 文件权限深入
# 权限数字表示
# 4 = read (r)
# 2 = write (w)
# 1 = execute (x)
# 755 = rwxr-xr-x
# 644 = rw-r--r--
# 特殊权限
# SUID (4000): 执行时以文件所有者身份运行
sudo chmod u+s /usr/bin/passwd
# chmod 4755 file
# SGID (2000): 执行时以文件所属组身份运行 / 目录中创建的文件继承组
sudo chmod g+s /shared_dir
# chmod 2755 dir
# Sticky Bit (1000): 只有文件所有者能删除(常用于/tmp)
sudo chmod +t /tmp
# chmod 1777 dir
# ACL (Access Control Lists) 细粒度权限
sudo apt install acl
# 设置ACL
setfacl -m u:username:rwx file
setfacl -m g:groupname:rwx dir
setfacl -m o::r file
# 默认ACL(目录中新创建文件的默认权限)
setfacl -d -m u:username:rwx dir
setfacl -d -m g:groupname:rwx dir
# 查看ACL
getfacl file
getfacl dir
# 删除ACL
setfacl -b file # 删除所有ACL
setfacl -x u:username file # 删除特定ACL
33.2 扩展属性
# 安装工具
sudo apt install attr
# 设置扩展属性
setfattr -n user.comment -v "important document" file.txt
# 查看扩展属性
getfattr file.txt
getfattr -d file.txt # 显示值
getfattr -n user.comment file.txt # 显示特定属性
# 删除扩展属性
setfattr -x user.comment file.txt
# 不可变属性(即使root也不能修改/删除)
sudo chattr +i file.txt
sudo lsattr file.txt # 查看属性
# 只追加(只能追加不能删除)
sudo chattr +a /var/log/myapp.log
# 移除属性
sudo chattr -i file.txt
sudo chattr -a /var/log/myapp.log
33.3 挂载选项
# /etc/fstab 完整示例
#
# 标准挂载
UUID=xxxx / ext4 defaults 0 1
UUID=yyyy /boot ext4 defaults 0 2
UUID=zzzz none swap sw 0 0
# 安全挂载选项
/dev/sda3 /data ext4 defaults,noexec,nosuid,nodev 0 2
# 常用挂载选项:
# defaults = rw,suid,dev,exec,auto,nouser,async
# noexec 禁止执行文件
# nosuid 忽略SUID/SGID位
# nodev 禁止解释字符/块设备
# ro 只读
# rw 读写
# noatime 不更新访问时间(提升性能)
# nodiratime 不更新目录访问时间
# relatime 相对访问时间(推荐)
# discard 启用TRIM(SSD)
# errors=remount-ro 出错时重新挂载为只读
# tmpfs(内存文件系统)
tmpfs /tmp tmpfs defaults,noatime,size=2G 0 0
# bind mount(目录映射)
/var/www/html /srv/web none bind 0 0
33.4 文件系统检查与修复
# ext4检查和修复
sudo umount /dev/sda3
sudo fsck.ext4 -f /dev/sda3 # 强制检查
sudo fsck.ext4 -y /dev/sda3 # 自动修复
sudo e2fsck -f -y /dev/sda3 # 等同于fsck.ext4
# XFS检查和修复
sudo xfs_repair /dev/sda3
sudo xfs_repair -L /dev/sda3 # 清除日志(可能丢失数据)
# Btrfs检查和修复
sudo btrfs check /dev/sda3
sudo btrfs check --repair /dev/sda3 # 修复(谨慎使用)
# 在线调整大小(不卸载)
# ext4
sudo resize2fs /dev/vg_data/lv_app
# xfs
sudo xfs_growfs /data
# 查看文件系统信息
sudo dumpe2fs /dev/sda3 | head -30 # ext4
sudo xfs_info /data # xfs
sudo btrfs filesystem show # btrfs
34. 进程与内存管理
34.1 进程深入理解
# 进程状态
# R - Running/Runnable
# S - Interruptible Sleep (等待事件)
# D - Uninterruptible Sleep (IO等待)
# Z - Zombie (僵尸进程)
# T - Stopped/Traced
# 查看进程详情
ps aux --sort=-%cpu | head -20
ps -eo pid,ppid,user,stat,%cpu,%mem,cmd --sort=-%mem | head -20
# 进程树
pstree -p
pstree -u # 显示用户
pstree -s PID # 显示进程的父进程链
# /proc文件系统
cat /proc/PID/status # 进程状态
cat /proc/PID/cmdline # 启动命令
ls -l /proc/PID/fd/ # 打开的文件描述符
cat /proc/PID/maps # 内存映射
cat /proc/PID/environ # 环境变量
# 信号
kill -l # 列出所有信号
# 常用信号:
# 1 SIGHUP - 重载配置
# 2 SIGINT - 中断(Ctrl+C)
# 9 SIGKILL - 强制终止(不可捕获)
# 15 SIGTERM - 优雅终止(默认)
# 18 SIGCONT - 继续
# 19 SIGSTOP - 暂停
# 进程优先级
nice -n -20 cmd # 最高优先级(-20到19)
nice -n 19 cmd # 最低优先级
renice -n 10 -p PID # 修改运行中进程
# realtime优先级(需root)
chrt -f 99 cmd
34.2 cgroups资源限制
# cgroup v2(Ubuntu 24.04默认)
# 查看cgroup层级
cat /proc/cgroups
ls /sys/fs/cgroup/
# 为进程设置资源限制(使用systemd)
# 在服务文件中:
[Service]
MemoryMax=1G
MemoryHigh=800M
CPUQuota=50%
TasksMax=100
IOWeight=100
# 使用cgexec临时限制
sudo apt install cgroup-tools
sudo cgcreate -g memory,cpu:/mygroup
sudo cgset -r memory.max=1G mygroup
sudo cgset -r cpu.max=50000 mygroup # 50%
sudo cgexec -g memory,cpu:mygroup ./myapp
34.3 内存管理
# 查看内存详情
free -h
free -m
cat /proc/meminfo
vmstat 1 10
# 内存字段说明:
# total 总内存
# used 已使用
# free 完全空闲
# shared 共享内存
# buff/cache 缓冲/缓存
# available 应用可用内存(重要!)
# 清除缓存(仅在需要时)
sudo sync
echo 1 | sudo tee /proc/sys/vm/drop_caches # 清pagecache
echo 2 | sudo tee /proc/sys/vm/drop_caches # 清dentries和inodes
echo 3 | sudo tee /proc/sys/vm/drop_caches # 清所有
# OOM Killer
# 查看OOM分数
cat /proc/PID/oom_score
# 调整OOM优先级(-1000到1000)
echo -500 | sudo tee /proc/PID/oom_score_adj
# -1000表示永不OOM kill
echo -1000 | sudo tee /proc/PID/oom_score_adj
# 查看OOM历史
dmesg | grep -i oom
journalctl -k | grep -i "oom\|killed"
34.4 进程监控工具
# 安装高级工具
sudo apt install glances nmon atop
# Glances - Web模式
glances -w
# 访问 http://server:61208
# atop - 历史回溯
atop -r /var/log/atop/atop_20260718
# strace - 系统调用跟踪
sudo strace -p PID
sudo strace -e trace=network -p PID # 仅跟踪网络调用
sudo strace -f -o output.txt ./app # 跟踪子进程
# ltrace - 库调用跟踪
ltrace ./app
# perf - 性能分析
sudo apt install linux-tools-$(uname -r)
sudo perf top # 实时热点
sudo perf record -g ./app # 记录性能数据
sudo perf report # 分析报告
sudo perf stat ./app # 统计事件
35. Cloud-Init与自动部署
35.1 Cloud-Init基础
# Cloud-Init是云环境中初始化实例的标准工具
# Ubuntu 24.04 Server默认包含cloud-init
# 查看cloud-init状态
sudo cloud-init status
sudo cloud-init status --long
# 查看cloud-init日志
sudo less /var/log/cloud-init.log
sudo less /var/log/cloud-init-output.log
# 重新运行cloud-init(慎用)
sudo cloud-init clean
sudo cloud-init init
sudo cloud-init modules --mode=config
sudo cloud-init modules --mode=final
35.2 Cloud-Init用户数据
# cloud-config格式(YAML)
# 用于云环境或虚拟机首次启动时自动配置
#cloud-config
# 设置主机名
hostname: myserver
fqdn: myserver.example.com
# 用户管理
users:
- name: admin
sudo: ALL=(ALL) NOPASSWD:ALL
groups: sudo, docker
shell: /bin/bash
ssh_authorized_keys:
- ssh-ed25519 AAAA... user@host
# 设置时区
timezone: Asia/Shanghai
# 安装软件包
package_update: true
package_upgrade: true
packages:
- nginx
- docker.io
- htop
# 运行命令
runcmd:
- systemctl enable --now nginx
- ufw allow 80/tcp
- ufw allow 443/tcp
- ufw enable
# 写入文件
write_files:
- path: /etc/nginx/sites-available/default
content: |
server {
listen 80;
server_name _;
root /var/www/html;
index index.html;
}
# 最终消息
final_message: "System ready after $UPTIME seconds"
35.3 Preseed自动安装
# Preseed用于完全自动化的Ubuntu安装
# 创建preseed.cfg文件
# 语言设置
d-i debian-installer/locale string en_US.UTF-8
d-i console-setup/ask_detect boolean false
d-i keyboard-configuration/xkb-keymap select us
# 网络设置
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string ubuntu-server
d-i netcfg/get_domain string local
# 镜像源
d-i mirror/country string manual
d-i mirror/http/hostname string mirrors.aliyun.com
d-i mirror/http/directory string /ubuntu
d-i mirror/http/proxy string
# 磁盘分区(使用整块磁盘+LVM)
d-i partman-auto/method string lvm
d-i partman-auto-lvm/guided_size string max
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto/choose_recipe select atomic
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
# 用户设置
d-i passwd/root-login boolean false
d-i passwd/user-fullname string Admin User
d-i passwd/username string admin
d-i passwd/user-password password SecurePass123!
d-i passwd/user-password-again password SecurePass123!
# 软件选择
tasksel tasksel/first multiselect standard, openssh-server
d-i pkgsel/include string curl wget vim htop
# GRUB
d-i grub-installer/only_debian boolean true
d-i grub-installer/bootdev string /dev/sda
# 完成后执行脚本
d-i preseed/late_command string \
in-target sh -c 'echo "admin ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/admin'
35.4 Packer镜像构建
# Packer用于构建可重复的虚拟机镜像
# 安装Packer
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \
sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install packer
# Packer HCL模板 (ubuntu-2404.pkr.hcl)
packer {
required_plugins {
qemu = {
version = ">= 1.0.0"
source = "github.com/hashicorp/qemu"
}
}
}
source "qemu" "ubuntu" {
iso_url = "https://releases.ubuntu.com/24.04/ubuntu-24.04-live-server-amd64.iso"
iso_checksum = "sha256:xxx"
output_directory = "output"
vm_name = "ubuntu-2404.qcow2"
disk_size = "20G"
format = "qcow2"
accelerator = "kvm"
boot_wait = "5s"
boot_command = [
"c",
"linux /casper/vmlinuz autoinstall ds=nocloud-net;s=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ ---",
"<enter><wait>",
"initrd /casper/initrd",
"<enter><wait>",
"boot",
"<enter>"
]
http_directory = "http"
ssh_username = "admin"
ssh_password = "password"
ssh_timeout = "20m"
shutdown_command = "sudo shutdown -P now"
}
build {
sources = ["source.qemu.ubuntu"]
provisioner "shell" {
inline = [
"sudo apt update",
"sudo apt upgrade -y",
"sudo apt install -y nginx docker.io",
"sudo apt autoremove -y",
"sudo apt clean"
]
}
}
36. CI/CD流水线
36.1 Gitea (自建Git服务)
# 使用Docker部署Gitea
docker compose up -d
# docker-compose.yml
services:
gitea:
image: gitea/gitea:latest
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=sqlite3
- GITEA__server__ROOT_URL=https://git.example.com
- GITEA__server__DOMAIN=git.example.com
volumes:
- gitea_data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "222:22"
restart: unless-stopped
volumes:
gitea_data:
36.2 Jenkins部署
# 安装Jenkins
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | \
sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian-stable binary/" | \
sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt update
sudo apt install fontconfig openjdk-17-jre jenkins
# 启动Jenkins
sudo systemctl enable --now jenkins
# 获取初始密码
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
# 访问 http://server:8080
36.3 GitHub Actions Runner
# 创建runner用户
sudo useradd -m -s /bin/bash runner
sudo usermod -aG docker runner
# 下载runner
mkdir actions-runner && cd actions-runner
curl -o actions-runner-linux-x64-2.317.0.tar.gz -L \
https://github.com/actions/runner/releases/download/v2.317.0/actions-runner-linux-x64-2.317.0.tar.gz
tar xzf actions-runner-linux-x64-2.317.0.tar.gz
# 配置runner
./config.sh --url https://github.com/owner/repo --token XXXXXXXX
# 安装为服务
sudo ./svc.sh install
sudo ./svc.sh start
36.4 Drone CI
# 使用Docker部署Drone
# docker-compose.yml
services:
drone:
image: drone/drone:2
ports:
- "8080:80"
volumes:
- drone_data:/data
environment:
- DRONE_GITHUB_CLIENT_ID=xxx
- DRONE_GITHUB_CLIENT_SECRET=xxx
- DRONE_SERVER_HOST=ci.example.com
- DRONE_SERVER_PROTO=https
- DRONE_RPC_SECRET=super_secret_key
restart: unless-stopped
drone-runner:
image: drone/drone-runner-docker:1
command: agent
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=drone:80
- DRONE_RPC_SECRET=super_secret_key
- DRONE_RUNNER_CAPACITY=4
restart: unless-stopped
volumes:
drone_data:
37. 邮件服务器
37.1 Postfix邮件服务器
# 安装Postfix
sudo apt install postfix mailutils
# 基本配置(选择"Internet Site")
sudo dpkg-reconfigure postfix
# 手动配置
sudo nano /etc/postfix/main.cf
# 基本设置
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 127.0.0.0/8, 192.168.1.0/24
# TLS/SSL
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtp_tls_security_level = may
# SASL认证
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
# 限制
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination
# 虚拟域名
virtual_alias_domains = example.com otherdomain.com
virtual_alias_maps = hash:/etc/postfix/virtual
37.2 Dovecot IMAP/POP3
# 安装Dovecot
sudo apt install dovecot-core dovecot-imapd dovecot-pop3d
# 配置认证
sudo nano /etc/dovecot/conf.d/10-auth.conf
# disable_plaintext_auth = yes
# auth_mechanisms = plain login
# 配置邮件位置
sudo nano /etc/dovecot/conf.d/10-mail.conf
# mail_location = maildir:~/Maildir
# 配置SSL
sudo nano /etc/dovecot/conf.d/10-ssl.conf
# ssl = required
# ssl_cert =
37.3 邮件客户端测试
# 发送测试邮件
echo "Test message" | mail -s "Test Subject" user@example.com
# 使用sendmail
sendmail user@example.com << EOF
Subject: Test
From: admin@example.com
To: user@example.com
This is a test email.
EOF
# 使用swaks测试
sudo apt install swaks
swaks --to user@example.com --from admin@example.com \
--server mail.example.com --port 587 --auth LOGIN \
--auth-user admin --auth-password password --tls
# 查看邮件队列
sudo mailq
sudo postqueue -f # 强制发送队列中的邮件
# 查看日志
sudo tail -f /var/log/mail.log
38. 安全合规与审计
38.1 CIS基准检查
# CIS (Center for Internet Security) 基准是业界标准的安全配置指南
# 使用CIS-CAT或开源替代工具
# Ubuntu CIS基准涵盖:
# - 初始设置(文件系统、服务)
# - 服务配置(SSH、NTP、DNS)
# - 网络配置(防火墙、内核参数)
# - 日志和审计
# - 访问认证和权限
# - 系统维护
# 自动化检查工具
# Docker Bench for Security
docker run -it --net host --pid host --userns host \
-v /:/host docker/docker-bench-security
# kube-bench(Kubernetes安全基准)
# https://github.com/aquasecurity/kube-bench
38.2 审计日志 (auditd)
# 安装auditd
sudo apt install auditd audispd-plugins
# 配置审计规则
sudo nano /etc/audit/rules.d/audit.rules
# 删除所有当前规则
-D
# 缓冲区大小
-b 8192
# 失败模式(0=silent, 1=printk, 2=panic)
-f 1
# 监控文件修改
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
-w /etc/ssh/sshd_config -p wa -k sshd_config
# 监控用户操作
-a always,exit -F arch=b64 -S execve -k process_execution
-a always,exit -F arch=b64 -S open,openat -F dir=/etc -k etc_access
# 监控登录
-w /var/log/auth.log -p wa -k auth_log
-w /var/run/faillock -p wa -k faillock
# 监控特权操作
-a always,exit -F arch=b64 -S setuid,setgid -k privilege_escalation
-a always,exit -F arch=b64 -S mount -k filesystem_mount
# 使规则不可修改(需重启才能修改)
-e 2
# 加载规则
sudo augenrules --load
# 或
sudo service auditd restart
# 查看审计日志
sudo ausearch -k identity
sudo ausearch -k sshd_config
sudo ausearch -ts today
sudo aureport -au # 认证报告
sudo aureport -x # 执行报告
sudo aureport -f # 文件访问报告
# 搜索特定用户的活动
sudo ausearch -ua 1000 -ts today
38.3 日志集中管理
# rsyslog远程日志收集
# 服务端配置(/etc/rsyslog.d/remote.conf)
module(load="imtcp")
input(type="imtcp" port="514")
# 按主机名分文件
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
# 客户端配置(/etc/rsyslog.d/remote.conf)
*.* @@logserver.example.com:514 # TCP (@@)
# 或
*.* @logserver.example.com:514 # UDP (@)
sudo systemctl restart rsyslog
# Elasticsearch + Logstash + Kibana (ELK)
# 使用Docker Compose快速部署
# 或使用OpenSearch(开源替代)
38.4 漏洞扫描
# OpenVAS/Greenbone漏洞扫描
# 使用Docker部署
docker pull greenbone/gvm
# 或使用容器化的GVM-CE
# Nikto Web扫描
sudo apt install nikto
nikto -h https://example.com
# Nuclei(快速漏洞扫描)
# https://github.com/projectdiscovery/nuclei
nuclei -u https://example.com -severity critical,high
# Trivy(容器和依赖扫描)
trivy image myimage:latest
trivy fs /path/to/project
trivy config /path/to/infrastructure
39. 高级文本处理
39.1 AWK高级用法
# AWK是强大的文本处理工具
# 基本语法
awk 'pattern {action}' file
# 打印特定列
awk '{print $1, $3}' file
awk -F: '{print $1, $7}' /etc/passwd
# 条件过滤
awk '$3 > 1000 {print $1}' /etc/passwd # UID>1000的用户
awk '$5 ~ /error/ {print}' log.txt # 包含error的行
awk '$1 == "root" {print}' /etc/passwd # 精确匹配
# 计算统计
# 求和
awk '{sum += $1} END {print sum}' numbers.txt
# 平均值
awk '{sum += $1; count++} END {print sum/count}' numbers.txt
# 最大/最小值
awk 'BEGIN{max=0} {if($1>max) max=$1} END{print max}' numbers.txt
# 频率统计
awk '{count[$1]++} END {for(item in count) print item, count[item]}' access.log
# BEGIN和END块
awk 'BEGIN{print "Start"} {print NR": "$0} END{print "Total: "NR" lines"}' file
# 多文件处理
awk 'FNR==1{print "---" FILENAME "---"} {print}' file1 file2
39.2 Sed高级用法
# 替换(全局)
sed 's/old/new/g' file
sed 's|/old/path|/new/path|g' file # 用|作分隔符
# 只替换第N次出现
sed 's/old/new/2' file
# 删除行
sed '5d' file # 删除第5行
sed '5,10d' file # 删除5-10行
sed '/^$/d' file # 删除空行
sed '/pattern/d' file # 删除匹配行
sed '/^#/d' file # 删除注释行
# 插入和追加
sed '3i\New line here' file # 在第3行前插入
sed '3a\New line here' file # 在第3行后追加
sed '/pattern/a\New line' file # 在匹配行后追加
# 替换整行
sed '5s/.*/replacement/' file # 替换第5行整行
# 多命令
sed -e 's/foo/bar/g' -e 's/baz/qux/g' file
sed -e '/^#/d' -e '/^$/d' file
# 反向引用
sed 's/\(word1\) \(word2\)/\2 \1/g' file # 交换两个词
# 范围操作
sed '/START/,/END/d' file # 删除START到END之间的行
sed -n '/START/,/END/p' file # 只打印START到END之间的行
# 直接修改文件
sed -i 's/old/new/g' file
sed -i.bak 's/old/new/g' file # 备份原文件
39.3 正则表达式
# 基本正则表达式 (BRE)
. 任意单个字符
* 前一个字符0次或多次
^ 行首
$ 行尾
[abc] 字符集合
[^abc] 排除字符集
[a-z] 范围
# 扩展正则表达式 (ERE, 使用grep -E或egrep)
+ 1次或多次
? 0次或1次
{n} 精确n次
{n,m} n到m次
{n,} 至少n次
| 或
() 分组
# 特殊字符类
[:alpha:] 字母
[:digit:] 数字
[:alnum:] 字母数字
[:space:] 空白
[:upper:] 大写
[:lower:] 小写
# 实用正则示例
grep -E '^[a-z]+@[a-z]+\.[a-z]+$' emails.txt # 简单邮箱
grep -E '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' file # IP地址
grep -E '^ERROR.*[0-9]{4}-[0-9]{2}-[0-9]{2}' log # 带日期的ERROR行
sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/' file # 日期格式转换
39.4 jq (JSON处理)
# 安装jq
sudo apt install jq
# 基本操作
echo '{"name":"John","age":30}' | jq '.'
echo '{"name":"John","age":30}' | jq '.name'
echo '{"name":"John","age":30}' | jq '.age'
# 数组操作
echo '[1,2,3,4,5]' | jq '.[0]' # 第一个元素
echo '[1,2,3,4,5]' | jq '.[2:4]' # 切片
echo '[1,2,3,4,5]' | jq '.[]' # 展开数组
echo '[1,2,3,4,5]' | jq 'map(. * 2)' # 每个元素乘2
echo '[1,2,3,4,5]' | jq 'map(select(. > 3))' # 过滤
# 复杂JSON
cat data.json | jq '.users[] | {name, email}'
cat data.json | jq '.users[] | select(.age > 25) | .name'
cat data.json | jq '[.users[] | {id, fullName: (.first + " " + .last)}]'
# 修改JSON
echo '{"a":1}' | jq '.b = 2'
echo '{"a":1}' | jq 'del(.a)'
echo '{"users":[]}' | jq '.users += [{"name":"John"}]'
# 格式化输出
jq '.' data.json > formatted.json
jq -c '.' data.json # 紧凑输出
# 结合curl使用
curl -s https://api.github.com/users/octocat | jq '.name, .bio'
curl -s https://api.github.com/repos/torvalds/linux | jq '.stargazers_count'
40. 生产环境最佳实践
40.1 服务器部署清单
| 类别 | 检查项 | 状态 |
|---|---|---|
| 基础安全 | SSH密钥认证+禁用密码 | ☐ |
| 基础安全 | SSH端口非默认22 | ☐ |
| 基础安全 | Fail2ban已配置 | ☐ |
| 基础安全 | UFW/防火墙已启用 | ☐ |
| 基础安全 | 自动安全更新已启用 | ☐ |
| 基础安全 | 非root用户运行服务 | ☐ |
| 网络 | 静态IP已配置 | ☐ |
| 网络 | NTP时间同步 | ☐ |
| 网络 | DNS已配置冗余 | ☐ |
| 监控 | 系统监控已部署 | ☐ |
| 监控 | 告警通知已配置 | ☐ |
| 监控 | 日志集中收集 | ☐ |
| 备份 | 自动备份已配置 | ☐ |
| 备份 | 备份恢复已测试 | ☐ |
| 备份 | 异地备份已配置 | ☐ |
| 性能 | 内核参数已优化 | ☐ |
| 性能 | 文件描述符限制已调整 | ☐ |
| 文档 | 部署文档已完善 | ☐ |
| 文档 | 灾备恢复计划 | ☐ |
40.2 命名规范
# 主机名规范
# [环境]-[角色]-[序号].[域名]
# prod-web-01.example.com
# prod-db-01.example.com
# staging-api-01.example.com
# dev-app-01.example.com
# 服务账户命名
svc_[服务名]_[环境]
# svc_nginx_prod
# svc_mysql_prod
# svc_redis_staging
# 目录规范
/opt/[company]/[project]/[component]
# /opt/mycompany/webapp/frontend
# /opt/mycompany/webapp/backend
# /opt/mycompany/webapp/scripts
# 日志目录
/var/log/[service_name]/
# /var/log/myapp/access.log
# /var/log/myapp/error.log
# /var/log/myapp/audit.log
40.3 变更管理
# 生产环境变更流程:
# 1. 变更申请 (说明原因、影响、风险)
# 2. 变更评审 (团队审核)
# 3. 测试验证 (在staging环境验证)
# 4. 变更窗口 (选择低峰期执行)
# 5. 回滚计划 (准备好回退方案)
# 6. 执行变更 (按步骤执行)
# 7. 验证确认 (确认服务正常)
# 8. 记录归档 (记录变更详情)
# 变更管理脚本模板
#!/bin/bash
# change_management.sh
CHANGE_ID=$1
ACTION=$2
SERVICE=$3
log_change() {
echo "$(date '+%Y-%m-%d %H:%M:%S') | $CHANGE_ID | $USER | $ACTION | $SERVICE | $1" \
>> /var/log/changes.log
}
case $ACTION in
deploy)
log_change "START"
# 执行部署步骤
# ...
log_change "COMPLETED"
;;
rollback)
log_change "ROLLBACK_START"
# 执行回滚步骤
# ...
log_change "ROLLBACK_COMPLETED"
;;
esac
40.4 灾难恢复计划
# RTO (Recovery Time Objective) - 恢复时间目标
# 定义服务恢复的最大允许时间
# RPO (Recovery Point Objective) - 恢复点目标
# 定义可接受的数据丢失时间范围
# 灾难恢复层级:
# Level 1: 数据备份恢复(小时级RTO)
# Level 2: 服务重启恢复(分钟级RTO)
# Level 3: 热备切换(秒级RTO)
# Level 4: 多活架构(零中断)
# 恢复步骤文档模板
# 1. 评估影响范围
# 2. 启动恢复流程
# 3. 恢复基础设施
# 4. 恢复数据
# 5. 恢复服务
# 6. 验证功能
# 7. 通知相关方
# 8. 事后复盘
40.5 安全基线检查清单
# 每月安全检查
□ 系统补丁已更新
□ 用户账户审计(删除无用账户)
□ SSH密钥审计(检查authorized_keys)
□ 防火墙规则审计
□ 备份恢复测试
□ 安全扫描(Lynis/rkhunter)
□ 日志审计(检查异常登录)
□ 证书到期检查
□ 依赖漏洞检查
# 每季度安全检查
□ 密码策略审查
□ 访问权限最小化原则检查
□ 安全培训
□ 灾备演练
□ 渗透测试(可选)
45.64.74.193