实战:用 Rsync 实现服务器间的高效增量同步与备份

1. 引言

在现代 IT 基础设施管理中,数据同步与备份是确保业务连续性和数据安全的关键环节。Rsync(Remote Synchronization)作为一款强大的文件同步工具,以其高效的增量传输算法和灵活的配置选项,成为系统管理员的首选工具之一。

1.1 Rsync 的核心优势

  • 增量同步:仅传输发生变化的部分,大幅减少带宽消耗
  • 保持权限:完整保留文件属性、权限和时间戳
  • 压缩传输:内置压缩功能,优化网络利用率
  • 灵活配置:支持多种传输模式和过滤规则
  • 可靠性:支持断点续传和完整性校验

2. 环境准备与安装

2.1 系统要求

确保所有参与同步的服务器均满足以下要求:

  • Linux 操作系统(CentOS、Ubuntu 等)
  • SSH 访问权限
  • 足够的磁盘空间

2.2 Rsync 安装

创建安装脚本文件:install_rsync.sh

bash 复制代码
#!/bin/bash

# 安装 Rsync 的通用脚本
# 适用于大多数 Linux 发行版

set -e  # 遇到错误立即退出

echo "开始安装 Rsync..."

# 检测系统类型并安装
if [ -f /etc/redhat-release ]; then
    # CentOS/RHEL 系统
    sudo yum update -y
    sudo yum install -y rsync
elif [ -f /etc/debian_version ]; then
    # Ubuntu/Debian 系统
    sudo apt-get update
    sudo apt-get install -y rsync
else
    echo "不支持的 Linux 发行版"
    exit 1
fi

# 验证安装
rsync_version=$(rsync --version | head -n1)
echo "安装成功: $rsync_version"

# 创建必要的目录结构
sudo mkdir -p /var/log/rsync
sudo touch /var/log/rsync/sync.log
sudo chmod 666 /var/log/rsync/sync.log

echo "Rsync 安装完成"

运行安装脚本:

bash 复制代码
chmod +x install_rsync.sh
./install_rsync.sh

3. Rsync 基础配置

3.1 SSH 密钥认证配置

为实现无密码同步,需要配置 SSH 密钥认证。

创建 SSH 密钥配置脚本:setup_ssh_keys.sh

bash 复制代码
#!/bin/bash

# SSH 密钥配置脚本
# 在源服务器上执行

set -e

echo "设置 SSH 密钥认证..."

# 生成 SSH 密钥对(如果不存在)
if [ ! -f ~/.ssh/id_rsa ]; then
    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
    echo "SSH 密钥对已生成"
fi

# 显示公钥内容
echo "请将以下公钥内容添加到目标服务器的 authorized_keys 文件中:"
echo "=========================================================="
cat ~/.ssh/id_rsa.pub
echo "=========================================================="

# 设置正确的权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub

echo "SSH 密钥设置完成"

在目标服务器上添加公钥:

bash 复制代码
# 将源服务器的公钥添加到 ~/.ssh/authorized_keys
echo "ssh-rsa AAAAB3NzaC1yc2E...你的公钥内容..." >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

3.2 测试 SSH 连接

创建连接测试脚本:test_connection.sh

bash 复制代码
#!/bin/bash

# 测试 SSH 连接脚本

read -p "请输入目标服务器IP地址: " remote_host
read -p "请输入目标服务器用户名: " remote_user

echo "测试 SSH 连接到 $remote_user@$remote_host..."

# 测试连接
ssh -o BatchMode=yes -o ConnectTimeout=5 $remote_user@$remote_host "echo 'SSH 连接成功!'"

if [ $? -eq 0 ]; then
    echo "✓ SSH 连接测试成功"
else
    echo "✗ SSH 连接测试失败"
    exit 1
fi

4. Rsync 同步流程详解

以下是 Rsync 同步过程的完整流程图:

graph TD A[开始同步任务] --> B[扫描源目录文件] B --> C[生成文件校验和] C --> D[与目标目录比较] D --> E{发现差异?} E -->|是| F[仅传输差异部分] E -->|否| G[跳过文件] F --> H[更新目标文件] G --> I[验证文件完整性] H --> I I --> J[记录同步日志] J --> K[发送完成通知] K --> L[结束同步任务] style A fill:#2d5c8a,color:#ffffff style L fill:#2d5c8a,color:#ffffff style F fill:#4caf50,color:#ffffff style H fill:#4caf50,color:#ffffff style I fill:#ff9800,color:#ffffff style J fill:#ff9800,color:#ffffff

5. 基础同步实战

5.1 本地文件同步

创建本地同步脚本:local_sync.sh

bash 复制代码
#!/bin/bash

# 本地目录同步脚本

set -e

# 配置变量
SOURCE_DIR="/home/user/source"
BACKUP_DIR="/home/user/backup"
LOG_FILE="/var/log/rsync/local_sync.log"

echo "$(date): 开始本地同步" >> $LOG_FILE

# 执行 rsync 同步
rsync -avh \
    --progress \
    --delete \
    --exclude='*.tmp' \
    --exclude='.git/' \
    $SOURCE_DIR/ $BACKUP_DIR/ >> $LOG_FILE 2>&1

# 检查执行结果
if [ $? -eq 0 ]; then
    echo "$(date): 本地同步完成" >> $LOG_FILE
    echo "同步完成!查看日志: $LOG_FILE"
else
    echo "$(date): 本地同步失败" >> $LOG_FILE
    echo "同步失败!查看日志: $LOG_FILE"
    exit 1
fi

5.2 远程服务器同步

创建远程同步脚本:remote_sync.sh

bash 复制代码
#!/bin/bash

# 远程服务器同步脚本

set -e

# 配置变量
REMOTE_USER="backupuser"
REMOTE_HOST="192.168.1.100"
REMOTE_PORT="22"
SOURCE_DIR="/data/important"
BACKUP_DIR="/backup/primary"
LOG_FILE="/var/log/rsync/remote_sync.log"

# 同步选项
RSYNC_OPTIONS="-avzhP \
    --progress \
    --delete \
    --exclude='cache/*' \
    --exclude='temp/*' \
    --exclude='*.log' \
    --log-file=$LOG_FILE"

echo "$(date): 开始远程同步到 $REMOTE_USER@$REMOTE_HOST" >> $LOG_FILE

# 执行远程同步
rsync $RSYNC_OPTIONS \
    -e "ssh -p $REMOTE_PORT" \
    $SOURCE_DIR/ $REMOTE_USER@$REMOTE_HOST:$BACKUP_DIR/

# 验证同步结果
if [ $? -eq 0 ]; then
    echo "$(date): 远程同步成功完成" >> $LOG_FILE
    
    # 统计同步结果
    echo "=== 同步统计 ===" >> $LOG_FILE
    tail -n 10 $LOG_FILE | grep -E "sent|received" >> $LOG_FILE
else
    echo "$(date): 远程同步失败" >> $LOG_FILE
    exit 1
fi

echo "远程同步完成!详细日志: $LOG_FILE"

6. 高级备份策略

6.1 增量备份与轮转

创建智能备份脚本:smart_backup.sh

bash 复制代码
#!/bin/bash

# 智能备份脚本 - 支持增量备份和轮转

set -e

# 配置变量
SOURCE_DIR="/data/production"
BACKUP_BASE="/backup"
REMOTE_HOST="backup.server.com"
REMOTE_USER="backup"
LOG_FILE="/var/log/rsync/backup_$(date +%Y%m%d).log"

# 备份类型配置
BACKUP_TYPE="incremental"  # incremental 或 full
RETENTION_DAYS=30

# 创建备份目录结构
YEAR=$(date +%Y)
MONTH=$(date +%m)
DAY=$(date +%d)
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

BACKUP_PATH="$BACKUP_BASE/$YEAR/$MONTH/$DAY"
LATEST_LINK="$BACKUP_BASE/latest"

# 远程备份目录
REMOTE_BACKUP_PATH="/backup/$(hostname)/$YEAR/$MONTH/$DAY"

echo "==========================================" >> $LOG_FILE
echo "开始备份: $(date)" >> $LOG_FILE
echo "源目录: $SOURCE_DIR" >> $LOG_FILE
echo "备份路径: $BACKUP_PATH" >> $LOG_FILE
echo "==========================================" >> $LOG_FILE

# 创建本地备份目录
mkdir -p $BACKUP_PATH

# 根据备份类型执行相应操作
case $BACKUP_TYPE in
    "full")
        echo "执行完整备份..." >> $LOG_FILE
        LINK_DEST=""
        ;;
    "incremental")
        echo "执行增量备份..." >> $LOG_FILE
        if [ -L $LATEST_LINK ]; then
            LINK_DEST="--link-dest=$LATEST_LINK"
            echo "基于上一个备份: $(readlink $LATEST_LINK)" >> $LOG_FILE
        else
            LINK_DEST=""
            echo "首次完整备份(增量基准)" >> $LOG_FILE
        fi
        ;;
    *)
        echo "错误的备份类型: $BACKUP_TYPE" >> $LOG_FILE
        exit 1
        ;;
esac

# 执行本地备份
rsync -avh \
    --progress \
    --delete \
    $LINK_DEST \
    --exclude='*.tmp' \
    --exclude='/cache/' \
    --log-file=$LOG_FILE \
    $SOURCE_DIR/ $BACKUP_PATH/

# 更新 latest 符号链接
ln -sfn $BACKUP_PATH $LATEST_LINK

# 执行远程同步
echo "开始远程同步..." >> $LOG_FILE
rsync -avzh \
    -e "ssh" \
    --progress \
    --delete \
    $BACKUP_BASE/ $REMOTE_USER@$REMOTE_HOST:$REMOTE_BACKUP_PATH/ >> $LOG_FILE 2>&1

# 清理旧备份
echo "清理超过 $RETENTION_DAYS 天的备份..." >> $LOG_FILE
find $BACKUP_BASE -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \; 2>/dev/null || true

echo "备份完成: $(date)" >> $LOG_FILE
echo "备份日志: $LOG_FILE"

6.2 备份验证脚本

创建备份验证脚本:verify_backup.sh

bash 复制代码
#!/bin/bash

# 备份验证脚本

set -e

# 配置变量
SOURCE_DIR="/data/production"
BACKUP_DIR="/backup/latest"
LOG_FILE="/var/log/rsync/verify.log"

echo "$(date): 开始备份验证" >> $LOG_FILE

# 生成源目录校验和
echo "生成源目录文件列表..." >> $LOG_FILE
find $SOURCE_DIR -type f -exec sha256sum {} \; | sort > /tmp/source_checksums.txt

# 生成备份目录校验和
echo "生成备份目录文件列表..." >> $LOG_FILE
find $BACKUP_DIR -type f -exec sha256sum {} \; | sort > /tmp/backup_checksums.txt

# 比较校验和
echo "比较文件校验和..." >> $LOG_FILE
diff /tmp/source_checksums.txt /tmp/backup_checksums.txt > /tmp/checksum_diff.txt

if [ $? -eq 0 ]; then
    echo "$(date): ✓ 备份验证成功 - 所有文件一致" >> $LOG_FILE
    echo "备份验证成功!"
else
    echo "$(date): ✗ 备份验证失败 - 发现差异:" >> $LOG_FILE
    cat /tmp/checksum_diff.txt >> $LOG_FILE
    echo "备份验证失败!查看日志: $LOG_FILE"
    exit 1
fi

# 清理临时文件
rm -f /tmp/source_checksums.txt /tmp/backup_checksums.txt /tmp/checksum_diff.txt

7. 自动化与监控

7.1 Cron 定时任务配置

创建 Cron 配置脚本:setup_cron.sh

bash 复制代码
#!/bin/bash

# 设置 Rsync 定时任务

set -e

# 备份脚本路径
BACKUP_SCRIPT="/usr/local/bin/smart_backup.sh"
VERIFY_SCRIPT="/usr/local/bin/verify_backup.sh"

# 确保脚本有执行权限
chmod +x $BACKUP_SCRIPT
chmod +x $VERIFY_SCRIPT

# 添加定时任务
echo "设置 Rsync 定时任务..."

# 每天凌晨2点执行完整备份
(crontab -l 2>/dev/null; echo "0 2 * * 1 $BACKUP_SCRIPT") | crontab -

# 每天凌晨3点执行增量备份
(crontab -l 2>/dev/null; echo "0 3 * * 2-7 $BACKUP_SCRIPT") | crontab -

# 每周日凌晨4点验证备份
(crontab -l 2>/dev/null; echo "0 4 * * 0 $VERIFY_SCRIPT") | crontab -

# 显示当前定时任务
echo "当前定时任务:"
crontab -l

echo "定时任务设置完成"

7.2 监控与告警脚本

创建监控脚本:monitor_backup.sh

bash 复制代码
#!/bin/bash

# 备份监控和告警脚本

set -e

# 配置变量
LOG_DIR="/var/log/rsync"
ALERT_EMAIL="admin@company.com"
MAX_LOG_AGE=24  # 小时

# 检查最近的备份日志
RECENT_LOGS=$(find $LOG_DIR -name "backup_*.log" -mtime -1)

if [ -z "$RECENT_LOGS" ]; then
    SUBJECT="警告: 未发现最近备份日志"
    MESSAGE="在 $LOG_DIR 中未找到最近 $MAX_LOG_AGE 小时内的备份日志,请检查备份任务状态。"
    echo "$MESSAGE" | mail -s "$SUBJECT" $ALERT_EMAIL
    exit 1
fi

# 检查最新备份状态
LATEST_LOG=$(ls -t $LOG_DIR/backup_*.log | head -n1)

if grep -q "备份完成" "$LATEST_LOG"; then
    echo "备份状态: 正常"
    
    # 提取备份统计信息
    echo "=== 最新备份统计 ==="
    tail -n 20 $LATEST_LOG | grep -E "sent|received|Number of files"
else
    SUBJECT="紧急: 备份任务失败"
    MESSAGE="最新备份任务可能失败,请立即检查日志: $LATEST_LOG"
    echo "$MESSAGE" | mail -s "$SUBJECT" $ALERT_EMAIL
    echo "备份状态: 失败 - 已发送告警"
    exit 1
fi

# 检查磁盘空间
DISK_USAGE=$(df -h $LOG_DIR | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 90 ]; then
    SUBJECT="警告: 备份磁盘空间不足"
    MESSAGE="备份目录磁盘使用率: ${DISK_USAGE}%,请及时清理。"
    echo "$MESSAGE" | mail -s "$SUBJECT" $ALERT_EMAIL
fi

echo "监控检查完成: $(date)"

8. 高级配置与优化

8.1 Rsync 守护模式配置

创建 Rsync 服务端配置:rsyncd.conf

bash 复制代码
# Rsync 守护进程配置文件
# 位置: /etc/rsyncd.conf

uid = nobody
gid = nobody
use chroot = yes
max connections = 10
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log

[backup]
    path = /data/backup
    comment = Main backup directory
    read only = no
    auth users = backupuser
    secrets file = /etc/rsyncd.secrets
    hosts allow = 192.168.1.0/24
    hosts deny = *
    list = yes

[webdata]
    path = /var/www/html
    comment = Web data backup
    read only = yes
    exclude = cache/ temp/ logs/
    dont compress = *.gz *.zip *.jpg *.png

创建认证文件:setup_rsync_daemon.sh

bash 复制代码
#!/bin/bash

# 设置 Rsync 守护模式

set -e

echo "设置 Rsync 守护进程..."

# 创建认证文件
echo "backupuser:password123" | sudo tee /etc/rsyncd.secrets
sudo chmod 600 /etc/rsyncd.secrets

# 创建备份目录
sudo mkdir -p /data/backup
sudo chown nobody:nobody /data/backup

# 复制配置文件
sudo cp rsyncd.conf /etc/

# 启动 Rsync 守护进程
if command -v systemctl >/dev/null; then
    # Systemd 系统
    sudo systemctl enable rsync
    sudo systemctl start rsync
    sudo systemctl status rsync
else
    # SysV init 系统
    sudo service rsync start
    sudo service rsync status
fi

echo "Rsync 守护进程设置完成"

8.2 性能优化脚本

创建性能优化脚本:optimize_rsync.sh

bash 复制代码
#!/bin/bash

# Rsync 性能优化配置

set -e

echo "优化 Rsync 性能配置..."

# 创建优化配置
cat > /tmp/rsync_optimizations.txt << 'EOF'
# Rsync 性能优化建议

1. 网络优化:
   - 使用 -z 压缩传输
   - 调整 --block-size 参数
   - 使用 -W 禁用增量检测(全量传输时)

2. 文件处理优化:
   - 使用 --inplace 避免临时文件
   - 合理使用 --exclude 减少扫描文件数
   - 考虑使用 --max-size 和 --min-size

3. 系统级优化:
   - 调整 TCP 缓冲区大小
   - 使用更快的加密算法(如 arcfour)
   - 考虑使用 rsync over rsync 守护进程

4. 针对大文件集的优化参数:
   rsync -avzh \
     --progress \
     --delete \
     --partial \
     --inplace \
     --compress \
     --compress-level=6 \
     --bwlimit=50000 \
     --timeout=300 \
     source/ destination/
EOF

echo "性能优化建议已保存到: /tmp/rsync_optimizations.txt"
cat /tmp/rsync_optimizations.txt

9. 故障排除与维护

9.1 常见问题解决脚本

创建故障排除脚本:troubleshoot_rsync.sh

bash 复制代码
#!/bin/bash

# Rsync 故障排除工具

set -e

echo "Rsync 故障排除检查..."
echo "========================"

# 检查 Rsync 是否安装
if command -v rsync >/dev/null; then
    echo "✓ Rsync 已安装: $(rsync --version | head -n1)"
else
    echo "✗ Rsync 未安装"
    exit 1
fi

# 检查 SSH 连接
read -p "测试远程连接?(y/n): " test_ssh
if [ "$test_ssh" = "y" ]; then
    read -p "远程主机: " remote_host
    read -p "用户名: " remote_user
    ssh -o BatchMode=yes $remote_user@$remote_host "echo 'SSH 连接成功'"
fi

# 检查磁盘空间
echo "=== 磁盘空间检查 ==="
df -h | grep -E "(Filesystem|/backup|/data)"

# 检查最近日志
echo "=== 最近 Rsync 日志 ==="
find /var/log/rsync -name "*.log" -mtime -1 -exec tail -n 5 {} \; 2>/dev/null || echo "未找到日志文件"

# 检查定时任务
echo "=== 定时任务检查 ==="
crontab -l | grep -E "(rsync|backup)" || echo "未找到相关定时任务"

# 检查进程
echo "=== 相关进程检查 ==="
ps aux | grep -E "(rsync|backup)" | grep -v grep || echo "未找到相关进程"

echo "故障排除检查完成"

9.2 日志分析脚本

创建日志分析脚本:analyze_logs.sh

bash 复制代码
#!/bin/bash

# Rsync 日志分析工具

set -e

LOG_DIR="/var/log/rsync"
OUTPUT_FILE="/tmp/rsync_analysis_$(date +%Y%m%d).txt"

echo "开始分析 Rsync 日志..."
echo "Rsync 日志分析报告 - $(date)" > $OUTPUT_FILE
echo "=================================" >> $OUTPUT_FILE

# 分析最近7天的日志
for log_file in $(find $LOG_DIR -name "*.log" -mtime -7); do
    echo "" >> $OUTPUT_FILE
    echo "分析文件: $log_file" >> $OUTPUT_FILE
    echo "-------------------------" >> $OUTPUT_FILE
    
    # 统计成功次数
    success_count=$(grep -c "完成\|成功" "$log_file" || true)
    echo "成功次数: $success_count" >> $OUTPUT_FILE
    
    # 统计失败次数
    failure_count=$(grep -c "失败\|错误\|error" "$log_file" || true)
    echo "失败次数: $failure_count" >> $OUTPUT_FILE
    
    # 提取传输统计
    echo "传输统计:" >> $OUTPUT_FILE
    grep -E "sent|received|total size" "$log_file" | tail -n 5 >> $OUTPUT_FILE || echo "无传输统计" >> $OUTPUT_FILE
    
    # 检查最近错误
    recent_errors=$(grep -i "error\|fail" "$log_file" | tail -n 3)
    if [ -n "$recent_errors" ]; then
        echo "最近错误:" >> $OUTPUT_FILE
        echo "$recent_errors" >> $OUTPUT_FILE
    fi
done

echo "日志分析完成: $OUTPUT_FILE"
cat $OUTPUT_FILE

10. 完整部署示例

10.1 生产环境部署脚本

创建完整部署脚本:deploy_rsync_system.sh

bash 复制代码
#!/bin/bash

# 完整的 Rsync 备份系统部署脚本

set -e

echo "开始部署完整的 Rsync 备份系统..."
echo "=================================="

# 创建目录结构
echo "创建目录结构..."
sudo mkdir -p /{backup,data,usr/local/bin,var/log/rsync}

# 安装 Rsync
echo "安装 Rsync..."
if [ -f /etc/redhat-release ]; then
    sudo yum install -y rsync
elif [ -f /etc/debian_version ]; then
    sudo apt-get update && sudo apt-get install -y rsync
fi

# 部署所有脚本
echo "部署管理脚本..."
sudo cp smart_backup.sh /usr/local/bin/
sudo cp verify_backup.sh /usr/local/bin/
sudo cp monitor_backup.sh /usr/local/bin/
sudo cp troubleshoot_rsync.sh /usr/local/bin/

# 设置执行权限
sudo chmod +x /usr/local/bin/*.sh

# 设置定时任务
echo "配置定时任务..."
(sudo crontab -l 2>/dev/null | grep -v -E "(smart_backup|verify_backup)" ; cat << 'EOF'
# Rsync 备份任务
0 2 * * * /usr/local/bin/smart_backup.sh
0 4 * * 0 /usr/local/bin/verify_backup.sh
0 6 * * * /usr/local/bin/monitor_backup.sh
EOF
) | sudo crontab -

# 创建日志轮转配置
echo "配置日志轮转..."
sudo cat > /etc/logrotate.d/rsync << 'EOF'
/var/log/rsync/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 644 root root
}
EOF

echo "部署完成!"
echo "========== 部署摘要 =========="
echo "✓ Rsync 已安装"
echo "✓ 管理脚本已部署到 /usr/local/bin/"
echo "✓ 定时任务已配置"
echo "✓ 日志轮转已设置"
echo "=============================="
echo "请根据实际环境修改脚本中的配置变量"

11. 总结

通过本教程,我们构建了一个完整的 Rsync 备份和同步系统,具备以下特性:

  • 完整的安装和配置指南
  • 灵活的同步策略(完整备份 + 增量备份)
  • 自动化运维(定时任务 + 监控告警)
  • 健壮的故障处理(验证 + 日志分析)
  • 性能优化建议

这套系统可以直接在生产环境中部署使用,能够满足大多数企业的数据同步和备份需求。根据实际环境调整配置参数后,即可提供可靠的数据保护解决方案。

11.1 后续维护建议

  1. 定期检查日志文件,确保备份任务正常运行
  2. 监控磁盘空间,及时清理过期备份
  3. 定期验证备份完整性,确保可恢复性
  4. 更新安全配置,定期更换认证密钥
  5. 测试恢复流程,确保灾难恢复可行性

通过遵循这些最佳实践,您可以构建一个可靠、高效的数据保护体系,为业务连续性提供坚实保障。

相关推荐
曹牧3 小时前
Oracle:查询当前正在等待执行的SQL语句
linux·数据库·oracle
孙12~3 小时前
两台虚拟机搭建多机区块链网络
linux·ubuntu·区块链·学习方法
大Null3 小时前
Linux安装GO环境
linux·golang
LCG元4 小时前
Linux 网络调试神器:tcpdump 和 Wireshark 抓包分析实战
linux
QT 小鲜肉4 小时前
【C++基础与提高】第十一章:面向对象编程进阶——继承与多态
java·linux·开发语言·c++·笔记·qt
序属秋秋秋4 小时前
《Linux系统编程之进程基础》【进程入门】
linux·运维·c语言·c++·进程·系统编程·fork
橘子真甜~5 小时前
C/C++ Linux网络编程4 - 解决TCP服务器并发的方式
linux·运维·服务器
last demo5 小时前
Linux 逻辑卷管理
linux·运维·服务器
ll_god5 小时前
ubuntu:beyond compare 4 This license key has been revoked 解决办法
linux·运维·ubuntu