Ubuntu 24.04 LTS 服务器版完整教程

IT 技术 86 阅读 更新于 2026-09-04 07:59

从安装到生产环境部署的超详细指南 · 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 安装过程

  1. 从 U 盘启动,选择 Try or Install Ubuntu Server
  2. 选择语言:推荐 English(服务器环境)
  3. 选择键盘布局
  4. 选择安装类型:Ubuntu Server(标准)或 Ubuntu Server (minimized)
  5. 配置网络:自动 DHCP 或手动静态 IP
  6. 配置代理(如在内网环境)
  7. 配置镜像源:选择国内源加速下载
  8. 选择安装类型:Use an entire diskCustom storage layout
  9. 选择是否使用LVM(推荐生产环境使用LVM)
  10. 确认磁盘分区方案
  11. 设置 Profile:Full Name、Server Name、Username、Password
  12. 选择安装 OpenSSH Server(强烈建议勾选)
  13. 选择 Featured Server Snaps(可选)
  14. 等待安装完成,重启系统
  15. 1.6 推荐分区方案(服务器)

    分区大小类型说明
    /boot/efi512MBEFI/FAT32UEFI启动分区
    /boot1-2GBext4启动文件(如不用LVM管理boot)
    swap内存×1~2swap交换分区(大内存可用文件替代)
    /30-50GBext4/xfs根分区
    /var50-100GB+xfs日志与数据(高IO分区)
    /tmp10-20GBext4临时文件(可挂载为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

← 返回IT 技术 yicool 百科 · Ubuntu 24.04 LTS 服务器版完整教程

评论 0