学习目标

  • 理解本节涉及的核心主题:Linux 性能监控与优化、日志与系统监控工具、自动化报警与性能报告、总结。
  • 掌握重点命令或工具:rsynctarddfsck
  • 能够结合示例完成常见操作,并理解关键参数、使用场景与结果差异。
  • 能够识别本节相关的常见风险、易错点或排查思路。

学习重点

  • 主题范围:Linux 性能监控与优化、日志与系统监控工具、自动化报警与性能报告、总结、系统备份与恢复、备份策略与工具
  • 重点命令:rsynctarddfsck
  • 学习重点:命令用途、关键参数、典型场景、与相近命令的区别
  • 复习方式:先理解场景,再动手练习,最后对照结果检查

Linux 性能监控与优化

日志与系统监控工具

自动化报警与性能报告

通过配置自动化报警和生成定期性能报告,可以及时发现和应对系统性能问题,确保系统的高可用性和稳定性。

配置报警规则
  • 使用 sysstat 设置阈值
    sysstat 工具包中的 sar 可与脚本结合,实现简单的性能报警。
    示例:创建一个脚本监控 CPU 使用率,并在超过阈值时发送报警邮件

    1. 创建监控脚本

      sudo nano /usr/local/bin/cpu_alert.sh
      

      内容:

      #!/bin/bash
      
      THRESHOLD=90
      CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | \
          sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
          awk '{print 100 - $1}')
      
      if (( $(echo "$CPU_USAGE > $THRESHOLD" | bc -l) )); then
          echo "CPU usage is above threshold: $CPU_USAGE%" | \
          mail -s "CPU Alert" admin@example.com
      fi
      
    2. 赋予脚本执行权限

      sudo chmod +x /usr/local/bin/cpu_alert.sh
      
    3. 添加 cron 任务定期运行脚本

      sudo crontab -e
      

      添加以下行,每5分钟运行一次脚本:

      */5 * * * * /usr/local/bin/cpu_alert.sh
      
  • 使用监控工具(如 Nagios, Zabbix)配置报警
    Nagios 示例:

    1. 定义报警规则
      编辑 Nagios 配置文件,添加 CPU 使用率的报警规则。
      define service{
          use                     generic-service
          host_name               localhost
          service_description     CPU Load
          check_command           check_cpu!90!95
      }
      
    2. 配置通知
      配置邮件通知,当 CPU 使用率超过阈值时,Nagios 将自动发送报警邮件。
      define contact{
          contact_name            admin
          use                     generic-contact
          email                   admin@example.com
      }
      
      define contactgroup{
          contactgroup_name       admins
          members                 admin
      }
      
      define service{
          ...
          contacts                admins
      }
      

    Zabbix 示例:

    1. 创建触发器
      在 Zabbix 前端,创建一个触发器,当 CPU 使用率超过 90% 时触发报警。
      {localhost:system.cpu.util[,idle].last()}<10
      
    2. 配置报警动作
      设置当触发器被激活时,发送邮件通知给管理员。
生成定期性能报告

定期生成性能报告有助于长期监控系统性能趋势,发现潜在问题并进行容量规划。

  • 使用脚本自动化生成报告
    创建一个脚本,定期收集性能数据并生成报告,例如生成 HTML 格式的性能报告。
    示例:

    sudo nano /usr/local/bin/performance_report.sh
    

    内容:

    #!/bin/bash
    
    REPORT_DIR="/var/reports"
    DATE=$(date +%F)
    REPORT_FILE="$REPORT_DIR/performance_report_$DATE.html"
    
    mkdir -p $REPORT_DIR
    
    {
        echo "<html><head><title>Performance Report - $DATE</title></head><body>"
        echo "<h1>Performance Report - $DATE</h1>"
    
        echo "<h2>CPU Usage</h2>"
        top -b -n1 | head -15 | tail -10 | awk 'BEGIN{print "<pre>"} {print} END{print "</pre>"}'
    
        echo "<h2>Memory Usage</h2>"
        free -h | awk 'BEGIN{print "<pre>"} {print} END{print "</pre>"}'
    
        echo "<h2>Disk Usage</h2>"
        df -hT | awk 'BEGIN{print "<pre>"} {print} END{print "</pre>"}'
    
        echo "<h2>Network Usage</h2>"
        iftop -t -s 5 | awk 'BEGIN{print "<pre>"} {print} END{print "</pre>"}'
    
        echo "</body></html>"
    } > $REPORT_FILE
    
    1. 赋予脚本执行权限

      sudo chmod +x /usr/local/bin/performance_report.sh
      
    2. 添加 cron 任务定期运行脚本

      sudo crontab -e
      

      添加以下行,每天凌晨1点生成一次报告:

      0 1 * * * /usr/local/bin/performance_report.sh
      
  • 使用监控工具生成图表与报告
    利用如 Grafana 等可视化工具,结合 collectdPrometheus 等数据源,生成实时和历史性能图表,自动化生成报告。
    示例:

    1. 在 Grafana 中创建仪表盘
      • 添加数据源(如 InfluxDB、Prometheus)。
      • 创建图表和面板,展示 CPU、内存、磁盘和网络的实时和历史数据。
    2. 配置定期报告生成
      使用 Grafana 的报告插件或第三方工具,如 Grafana Reporting,自动生成并发送性能报告给指定的收件人。

总结

Linux 性能监控与优化是确保系统高效、稳定运行的重要措施。通过系统资源监控,系统管理员可以实时了解 CPU、内存、磁盘和网络的使用情况,及时发现性能瓶颈。针对关键资源的优化措施,如调整进程优先级、优化内核参数和文件系统设置,可以显著提升系统性能。此外,使用专业的监控工具(如 sysstatcollectdMuninNagiosZabbix)和自动化报警与报告机制,可以实现全面的性能监控和优化,确保系统在面对各种负载和需求时依然保持高效运行。

以下是基于具体实例的应用总结:

  • 查看 CPU 使用率并识别高负载进程

    top
    

    P 键排序,找到消耗大量 CPU 的进程,如 myapp,并进行优化。

  • 使用 free 查看内存使用情况

    free -h
    

    确认系统内存使用合理,避免过高的内存占用。

  • 使用 df du 分析磁盘空间

    df -hT
    du -sh /var/log
    du -ah /var | sort -hr | head -n 20
    

    识别并清理占用大量磁盘空间的目录或文件。

  • 使用 iftop 监控网络流量

    sudo iftop -i eth0
    

    识别高流量连接,预防潜在的网络攻击或配置问题。

  • 调整进程优先级优化 CPU 使用

    sudo renice -n 10 -p 1234
    

    将 PID 为 1234 的进程优先级设置为 10,降低其 CPU 使用优先级。

  • 优化内核参数
    vm.swappiness 设置为 10,减少交换空间的使用:

    sudo sysctl -w vm.swappiness=10
    sudo nano /etc/sysctl.conf
    # 添加 vm.swappiness=10
    sudo sysctl -p
    
  • 配置并监控 RAID 阵列
    使用 mdadm 创建 RAID 1 阵列,提升磁盘性能和数据冗余性:

    sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
    sudo mkfs.ext4 /dev/md0
    sudo mount /dev/md0 /mnt/raid1
    
  • 安装并配置 collectd Grafana 进行性能监控

    sudo apt install collectd influxdb grafana
    sudo systemctl enable collectd influxdb grafana-server
    sudo systemctl start collectd influxdb grafana-server
    

    配置 collectd 发送数据到 InfluxDB,并在 Grafana 中创建性能监控仪表盘。

  • 配置自动化报警规则
    创建一个脚本监控 CPU 使用率,并在超过阈值时发送报警邮件:

    sudo crontab -e
    # 添加以下行,每5分钟运行一次监控脚本
    */5 * * * * /usr/local/bin/cpu_alert.sh
    

系统备份与恢复

备份策略与工具

备份策略的制定应基于业务需求、数据重要性和系统资源等因素。常见的备份策略包括全量备份、增量备份和差异备份。本文将重点介绍几种常用的备份工具及其应用场景。

使用 rsync 进行文件和目录备份

rsync 是一个强大的文件同步和备份工具,广泛用于本地和远程数据备份。它支持增量备份,仅传输变化的部分,节省带宽和存储空间。

基本用法
rsync [选项] 源路径 目标路径
常用选项与参数
  • -a(归档模式):递归传输文件,并保持文件的权限、所有者、时间戳等属性。
  • -v(详细模式):显示详细的传输过程。
  • -h(人类可读):以人类易读的格式显示文件大小。
  • --delete:删除目标路径中源路径不存在的文件,保持两边同步。
  • -z(压缩):在传输过程中压缩数据,节省带宽。
  • -P(进度条和部分传输):显示传输进度,并允许部分传输的恢复。
示例与应用场景

示例 1:本地目录备份

/home/user/documents 备份到 /backup/documents_backup

rsync -avh /home/user/documents/ /backup/documents_backup/

说明:

  • -a:归档模式,保持文件属性。
  • -v:详细输出。
  • /home/user/documents/:源路径,末尾的 / 表示仅复制目录内容。
  • /backup/documents_backup/:目标路径。

示例 2:远程服务器备份

将本地目录备份到远程服务器 backup.example.com/backup/documents_backup 目录:

rsync -avz -e ssh /home/user/documents/ user@backup.example.com:/backup/documents_backup/

说明:

  • -z:压缩传输数据。
  • -e ssh:使用 SSH 作为传输协议,确保数据传输的安全性。
  • user@backup.example.com:/backup/documents_backup/:远程目标路径。

示例 3:增量备份并删除目标中不存在的文件

rsync -avh --delete /home/user/documents/ /backup/documents_backup/

说明:

  • --delete:删除目标路径中源路径不存在的文件,确保两边完全同步。

应用场景:

  • 定期备份:使用 rsync 结合 cron 任务,定期备份关键目录。
  • 镜像同步:在多台服务器之间同步文件,保持一致性。
  • 远程备份:将本地数据备份到远程服务器,防止本地灾难。
定期备份脚本示例

以下是一个使用 rsync 进行每日备份的 bash 脚本示例:

#!/bin/bash

SOURCE="/home/user/documents/"
DESTINATION="user@backup.example.com:/backup/documents_backup/"

rsync -avz --delete -e ssh "$SOURCE" "$DESTINATION"

echo "Backup completed on $(date)" >> /var/log/rsync_backup.log

设置 cron 任务每天凌晨2点运行备份脚本:

crontab -e

添加以下行:

0 2 * * * /path/to/backup_script.sh

注意事项:

  • 确保目标路径有足够的存储空间。
  • 使用 SSH 密钥认证,避免 rsync 执行时需要输入密码。
  • 定期检查备份日志,确保备份任务正常完成。

使用 tar 创建归档文件

tar 是一个用于打包文件和目录的工具,常与压缩工具(如 gzipbzip2)结合使用,创建压缩归档文件,便于存储和传输。

基本用法
tar [选项] 归档文件名 源路径
常用选项与参数
  • -c(创建):创建一个新的归档文件。
  • -x(解压):解压归档文件。
  • -v(详细):显示处理的文件。
  • -f(文件):指定归档文件名。
  • -z(gzip 压缩):使用 gzip 压缩或解压。
  • -j(bzip2 压缩):使用 bzip2 压缩或解压。
  • -C(目录切换):切换到指定目录后再执行操作。
压缩与解压缩归档文件

创建压缩归档文件

/home/user/documents 目录打包并使用 gzip 压缩:

tar -czvf documents_backup.tar.gz /home/user/documents/

说明:

  • -c:创建归档。
  • -z:使用 gzip 压缩。
  • -v:详细输出。
  • -f:指定归档文件名。

解压缩归档文件

documents_backup.tar.gz 解压到 /home/user/restored_documents 目录:

tar -xzvf documents_backup.tar.gz -C /home/user/restored_documents/

说明:

  • -x:解压归档。
  • -z:使用 gzip 解压。
  • -v:详细输出。
  • -f:指定归档文件名。
  • -C:指定解压目标目录。
备份与恢复脚本示例

创建备份脚本

#!/bin/bash

SOURCE="/home/user/documents/"
BACKUP_DIR="/backup/documents_archives/"
DATE=$(date +%F)

mkdir -p "$BACKUP_DIR"

tar -czvf "${BACKUP_DIR}documents_backup_${DATE}.tar.gz" "$SOURCE"

echo "Backup created on ${DATE}" >> /var/log/tar_backup.log

恢复备份脚本

#!/bin/bash

ARCHIVE="/backup/documents_archives/documents_backup_2024-04-27.tar.gz"
RESTORE_DIR="/home/user/restored_documents/"

tar -xzvf "$ARCHIVE" -C "$RESTORE_DIR"

echo "Backup restored from $ARCHIVE on $(date)" >> /var/log/tar_restore.log

注意事项:

  • 定期清理旧的归档文件,防止备份目录占满磁盘空间。
  • 使用加密工具(如 gpg)对备份归档文件进行加密,确保数据安全。
  • 确保恢复目录的权限和所有权设置正确,防止数据泄露。

创建全盘备份:使用 dd 工具

dd 是一个低级别的数据复制工具,可以创建整个磁盘或分区的位拷贝(bit-by-bit copy),适用于创建系统镜像和进行灾难恢复。

基本用法
dd if=源设备 of=目标文件 bs=块大小 status=进度信息
  • if(输入文件):源设备或文件。
  • of(输出文件):目标设备或文件。
  • bs(块大小):每次读取和写入的数据块大小,通常设置为 4M 或更大,以提高速度。
  • status:显示进度信息,设置为 progress 可实时显示进度。
创建和恢复磁盘镜像

创建磁盘镜像

将整个 /dev/sda 磁盘创建为镜像文件 sda_backup.img

sudo dd if=/dev/sda of=/backup/sda_backup.img bs=4M status=progress

说明:

  • if=/dev/sda:源设备。
  • of=/backup/sda_backup.img:目标镜像文件。
  • bs=4M:块大小为4MB,提升复制速度。
  • status=progress:实时显示复制进度。

恢复磁盘镜像

将镜像文件 sda_backup.img 恢复到 /dev/sda 磁盘:

sudo dd if=/backup/sda_backup.img of=/dev/sda bs=4M status=progress

说明:

  • if=/backup/sda_backup.img:源镜像文件。
  • of=/dev/sda:目标设备。
  • bs=4Mstatus=progress 同上。
注意事项与风险
  • 数据一致性:在创建磁盘镜像时,确保源磁盘处于静止状态(如系统从 Live CD/USB 启动),避免数据在备份过程中发生变化,导致镜像不一致。
  • 备份大小:全盘备份需要与源磁盘相同或更大的存储空间。对于大容量磁盘,备份文件可能非常大,需合理规划存储资源。
  • 恢复风险:错误地指定目标设备可能导致数据覆盖和不可恢复的损失。操作前务必确认设备名称和路径。
  • 性能影响dd 是一个低级别工具,直接操作磁盘设备,可能对系统性能产生较大影响。建议在系统负载较低或维护窗口期间执行。
备份与恢复脚本示例

创建全盘备份脚本

#!/bin/bash

SOURCE_DEVICE="/dev/sda"
BACKUP_FILE="/backup/sda_backup_$(date +%F).img"

sudo dd if="$SOURCE_DEVICE" of="$BACKUP_FILE" bs=4M status=progress

sync

echo "Full disk backup created: $BACKUP_FILE on $(date)" >> /var/log/dd_backup.log

恢复全盘备份脚本

#!/bin/bash

BACKUP_FILE="/backup/sda_backup_2024-04-27.img"
TARGET_DEVICE="/dev/sda"

read -p "Are you sure you want to restore $BACKUP_FILE to $TARGET_DEVICE? This will overwrite all data on the target device. (y/n): " CONFIRM
if [[ "$CONFIRM" != "y" ]]; then
    echo "Restore operation aborted."
    exit 1
fi

sudo dd if="$BACKUP_FILE" of="$TARGET_DEVICE" bs=4M status=progress

sync

echo "Full disk backup restored from $BACKUP_FILE to $TARGET_DEVICE on $(date)" >> /var/log/dd_restore.log

注意事项:

  • 在恢复操作前,确保目标设备未被挂载,避免数据损坏。
  • 使用 sync 命令确保所有数据写入磁盘。
  • 定期测试备份和恢复流程,确保在实际需要时能够顺利执行。

数据恢复

在数据丢失或系统故障时,数据恢复是关键步骤。根据备份方式的不同,可以使用相应的工具和方法恢复数据。

从备份恢复文件

根据备份工具的不同,恢复文件的方法也有所不同。以下分别介绍使用 rsynctardd 恢复文件的方法。

使用 rsync 恢复文件

rsync 可以高效地同步备份数据到目标位置,实现快速恢复。

示例:从远程备份服务器恢复文件

将备份服务器上的 /backup/documents_backup/ 目录恢复到本地的 /home/user/documents/

rsync -avz user@backup.example.com:/backup/documents_backup/ /home/user/documents/

说明:

  • -a:归档模式。
  • -v:详细输出。
  • -z:压缩传输数据。
  • 源路径和目标路径配置正确,确保数据同步无误。
使用 tar 解压归档文件

tar 可以方便地解压归档文件,将备份数据恢复到指定位置。

示例:从本地归档文件恢复

documents_backup_2024-04-27.tar.gz 解压到 /home/user/restored_documents/

tar -xzvf documents_backup_2024-04-27.tar.gz -C /home/user/restored_documents/

说明:

  • -x:解压归档。
  • -z:使用 gzip 解压。
  • -v:详细输出。
  • -f:指定归档文件名。
  • -C:指定解压目标目录。
使用 dd 恢复磁盘镜像

dd 可以将磁盘镜像恢复到目标设备,实现全盘恢复。

示例:恢复全盘镜像

将镜像文件 sda_backup.img 恢复到 /dev/sda

sudo dd if=/backup/sda_backup.img of=/dev/sda bs=4M status=progress

说明:

  • if=/backup/sda_backup.img:源镜像文件。
  • of=/dev/sda:目标设备。
  • 确保目标设备正确,避免数据覆盖。

注意事项:

  • 恢复前,确保目标设备未被挂载,避免数据损坏。
  • 恢复全盘镜像后,可能需要重新安装引导加载器(如 GRUB),以确保系统正常启动。

恢复被删除的文件

在文件被误删除或意外丢失时,可以使用专业的数据恢复工具尝试恢复数据。以下介绍 extundeletetestdisk 两种工具的使用方法。

使用 extundelete 恢复 EXT 文件系统中的文件

extundelete 是一个专门用于 EXT 文件系统(如 EXT3、EXT4)恢复被删除文件的工具。

安装与基本用法

安装 extundelete

sudo apt install extundelete    # Debian/Ubuntu
sudo yum install extundelete    # CentOS/RHEL (可能需要 EPEL 仓库)
sudo dnf install extundelete    # Fedora

基本用法

  1. 卸载目标分区
    在恢复文件前,必须卸载包含被删除文件的分区,避免新数据覆盖已删除的数据。

    sudo umount /dev/sda1
    
  2. 执行恢复操作
    恢复所有被删除的文件:

    sudo extundelete /dev/sda1 --restore-all
    

    恢复特定目录或文件:

    sudo extundelete /dev/sda1 --restore-directory /home/user/documents/
    sudo extundelete /dev/sda1 --restore-file /home/user/documents/file.txt
    
  3. 查看恢复结果
    恢复的文件通常位于当前目录下的 RECOVERED_FILES 目录中。

    ls RECOVERED_FILES/
    
恢复过程与限制

恢复过程:

  • extundelete 通过扫描文件系统的元数据,查找被删除文件的记录并尝试恢复数据块。
  • 恢复过程可能需要较长时间,具体取决于分区大小和文件系统的状态。

限制:

  • 数据覆盖:如果在文件删除后写入了新数据,可能导致恢复失败或部分数据丢失。
  • 文件系统类型:仅支持 EXT3 和 EXT4 文件系统,不支持其他文件系统。
  • 文件完整性:无法保证恢复的文件完整无损,尤其是在文件被部分覆盖的情况下。
使用 testdisk 进行分区恢复

testdisk 是一个功能强大的数据恢复工具,不仅可以恢复被删除的文件,还可以恢复丢失的分区和修复分区表。

安装与基本用法

安装 testdisk

sudo apt install testdisk    # Debian/Ubuntu
sudo yum install testdisk    # CentOS/RHEL (可能需要 EPEL 仓库)
sudo dnf install testdisk    # Fedora

基本用法

  1. 启动 testdisk
    sudo testdisk
    
  2. 选择创建日志文件
    在启动时,选择创建新的日志文件或追加到现有日志文件,或选择不创建日志文件。
  3. 选择磁盘
    选择要恢复的磁盘,使用上下箭头键进行选择,然后按 Enter 确认。
  4. 选择分区表类型
    testdisk 会自动检测分区表类型,通常无需手动选择。
  5. 选择操作
    • Analyse:分析当前分区结构。
    • Advanced:高级文件系统操作。
    • Geometry:查看磁盘几何信息。
    • Options:设置恢复选项。 选择 Analyse,然后按 Enter
  6. 扫描分区
    testdisk 会扫描当前分区表,显示已检测到的分区。
  7. 恢复分区
    • 选择要恢复的分区,按 P 查看其中的文件。
    • 使用箭头键导航,选择要恢复的文件或目录。
    • C 将选定的文件复制到指定位置。

恢复分区表

  1. 启动 testdisk 并选择磁盘和分区表类型
  2. 选择 Analyse 并扫描分区
  3. 如果检测到丢失的分区,选择它并按 Enter
  4. 选择 Write 以写入新的分区表
  5. 确认操作,并重启系统

注意事项:

  • 数据覆盖风险:在恢复分区前,避免对磁盘进行写操作,防止数据覆盖。
  • 备份当前分区表:在进行任何恢复操作前,备份当前的分区表,以防进一步损坏。
  • 谨慎操作testdisk 是一个强大的工具,但也需要小心使用,避免误操作导致数据不可恢复。

使用 fsck 修复文件系统

fsck(File System Consistency Check)是一个用于检查和修复 Linux 文件系统错误的工具。通过检测文件系统中的不一致性,fsck 可以修复损坏的元数据和目录结构,确保文件系统的健康状态。

基本用法
sudo fsck [选项] 文件系统设备

常用选项:

  • -a:自动修复文件系统,无需用户干预(不推荐,可能会导致数据丢失)。
  • -y:假定所有询问均回答「是」,自动修复问题。
  • -n:假定所有询问均回答「否」,仅检测问题,不进行修复。
  • -f:强制检查,即使文件系统看起来没有问题。
检查与修复文件系统错误

步骤:

  1. 卸载目标分区
    在检查和修复文件系统前,必须卸载目标分区,确保没有进程正在访问该分区,避免数据损坏。

    sudo umount /dev/sda1
    
  2. 执行 fsck 检查与修复
    使用 fsck 检查并修复 /dev/sda1 文件系统:

    sudo fsck -y /dev/sda1
    

    说明:

    • -y:自动修复所有检测到的问题。
  3. 查看修复结果
    fsck 会输出修复过程中的详细信息,显示修复了哪些问题。

  4. 重新挂载分区
    检查和修复完成后,重新挂载分区:

    sudo mount /dev/sda1 /mnt
    
实例与注意事项

示例:检查并修复 EXT4 文件系统

sudo umount /dev/sda1
sudo fsck -f -y /dev/sda1
sudo mount /dev/sda1 /mnt

注意事项:

  • 备份数据:在执行 fsck 修复操作前,尽可能备份重要数据,防止修复过程中数据丢失。
  • 避免在线修复:尽量在单用户模式或从 Live CD/USB 启动系统,确保目标分区未被挂载和使用。
  • 定期检查文件系统:通过定期运行 fsck,预防文件系统错误的积累,保持文件系统的健康状态。
  • 处理严重损坏:对于严重损坏的文件系统,可能需要使用更专业的恢复工具或寻求数据恢复服务。

本节总结

  • 本节主要围绕 Linux 性能监控与优化、日志与系统监控工具、自动化报警与性能报告、总结、系统备份与恢复 展开。
  • 需要重点掌握的命令或工具包括:rsynctarddfsck
  • 学习时应优先抓住「命令解决什么问题、在什么场景下使用、执行后会产生什么结果」。
  • 对涉及权限、覆盖、网络、系统服务、删除或安全配置的操作,建议先在测试环境练习。

复习建议

  • 先用自己的话复述本节每个主题或命令的作用,避免只记参数不懂用途。
  • 按原文示例至少手敲一遍典型命令,并观察输出变化。
  • 对高风险操作先确认路径、权限和目标对象,再执行实际命令。
  • 可优先复习这些高频命令:rsynctarddfsck