通过 rsync 迁移服务器
了解如何通过 rsync 将服务器数据传输到新服务器。
1. 什么是 rsync?
rsync (Remote Sync) 是一款用于高效文件传输和同步的工具。它采用增量传输算法:rsync 不会传输整个文件,而是仅发送源端与目标端之间的差异部分。这使得它在重复执行同步任务时尤为高效。
核心特性:
- 增量传输 – 仅传输发生更改的数据块
- 校验和验证 – 验证每个文件的完整性
- 支持 SSH – 通过网络进行安全加密传输
- 保留元数据 – 保留权限、时间戳、符号链接和所有者信息
- 演练模式(
--dry-run)– 仅模拟运行而不执行实际修改
2. 准备工作
为稳妥起见,请在传输数据前创建完整备份。
1. 准备工作
- 登录到 服务器控制面板 (SCP).
- 选择 源服务器 和 目标服务器 (即您要用于迁移的服务器)。
- 请确保服务器处于 已关机 (离线)状态。
- 前往 媒体 > 救援系统 (Media > Rescue System).
- 点击 激活 (Activate) 以及右侧的 OK 。
- 请记录下界面显示的 密码.
- 如果 SCP 未自动重启服务器,请手动将它们重启。
- 服务器将重启并进入救援系统。
2. 清点现有数据
在迁移之前,应先对源服务器进行全面的数据清点:
# Overview of disk usage
df -h
# Size of individual directories
du -sh /var /home /etc /opt /srv
记录下正在运行的服务、相关的配置文件,以及可能需要单独处理的数据库。
3. 确保 SSH 访问畅通
rsync 使用 SSH 进行传输。请提前使用密钥对设置免密 SSH 访问:
# Generate a key pair on the source server (if one does not already exist)
ssh-keygen -t ed25519 -C "server-migration"
# Copy the public key to the target server
ssh-copy-id root@targetserver.example.com
# Test the connection
ssh root@targetserver.example.com "echo Connection successful"
请注意,数据迁移完成并退出救援系统后,该临时 SSH 密钥将会丢失。
4. 挂载源服务器硬盘
识别分区
要访问操作系统的数据,您需要挂载包含数据的分区。要查看分区名称,请运行以下命令:
lsblk
挂载分区
分区的数量和名称因具体配置而异,可能与下方列出的示例有所不同。
# Root Partition
mkdir -p /mnt
mount /dev/vda1 /mnt
# Boot Partition
mkdir -p /mnt/boot
mount /dev/vda2 /mnt/boot
# Home Partition
mkdir -p /mnt/home
mount /dev/vda3 /mnt/home
5. 对目标服务器进行分区
分区操作将导致相应硬盘上的所有数据丢失!
请按照与源服务器完全相同的方式对目标服务器进行分区,具体请参阅:
https://www.netcup.com/en/helpcenter/documentation/server/partitioning-kvm-server
接下来,按照与源服务器完全相同的方式挂载各个分区。
3. rsync 命令详解
用于迁移服务器的基本命令如下:
rsync -aHAXvz --progress \
--exclude=/proc \
--exclude=/sys \
--exclude=/dev \
--exclude=/run \
--exclude=/tmp \
/mnt/ root@targetserver.example.com:/mnt/
最重要参数选项概览
选项
含义
-a
归档模式:递归同步,并保留符号链接、权限、时间戳、所有者及组信息
-H
保留硬链接 (Hard links)
-A
传输 ACL(访问控制列表)
-X
传输扩展属性 (xattrs)
-v
显示详细输出信息 (Verbose)
-z
在传输过程中进行压缩
--progress
显示每个文件的传输进度
--delete
删除目标端中在源端已不存在的文件
--dry-run / -n
仅模拟运行,不执行实际更改
--exclude
排除指定的目录或匹配模式
4. 操作步骤
1. 执行模拟演练 (Dry Run)
首先,运行一次测试以查看哪些内容将被传输:
rsync -aHAXvzn --progress \
--exclude=/proc --exclude=/sys --exclude=/dev \
--exclude=/run --exclude=/tmp \
/mnt/ root@targetserver.example.com:/mnt/
仔细检查输出结果,确认是否存在任何预期之外的文件或路径。
2. 执行首次完整同步
开始首次传输。根据数据量大小,此过程可能需要数小时。建议使用 screen 或 tmux 以便在连接中断时传输进程仍能继续运行:
screen -S migration
rsync -aHAXvz --progress --delete \
--exclude=/proc --exclude=/sys --exclude=/dev \
--exclude=/run --exclude=/tmp \
--log-file=/root/rsync-migration.log \
/mnt/ root@targetserver.example.com:/mnt/
3. 执行停机切换同步 (Cutover)
在维护窗口期间,停止源服务器上的所有相关服务,并运行最后一次 rsync 任务,以同步在此期间发生更改的文件:
# Stop services (example)
systemctl stop apache2 mysql nginx
# Final sync
rsync -aHAXvz --progress --delete \
--exclude=/proc --exclude=/sys --exclude=/dev \
--exclude=/run --exclude=/tmp \
--log-file=/root/rsync-migration-final.log \
/mnt/ root@targetserver.example.com:/mnt/
由于大部分数据已经在之前传输完毕,这次同步应该会快得多。
4. 修改目标服务器上的系统文件
数据传输完成后,您必须在目标服务器上重新安装引导加载程序 (Bootloader),并调整 /etc/fstab 以及网络配置:
# Reinstall the bootloader (if the entire system has been migrated)
grub-install /dev/vda
update-grub
# Check /etc/fstab and adjust UUID entries
blkid
nano /etc/fstab
# Adjust network configuration (IP addresses, hostnames)
hostnamectl set-hostname new-server-name
nano /etc/network/interfaces # or nmcli / netplan depending on the distribution
5. 检查目标服务器上的各项功能
在目标服务器上启动所有服务,并验证它们是否正常运行:
systemctl start mysql apache2 nginx
systemctl status mysql apache2 nginx
# Check logs
journalctl -xe
tail -f /var/log/nginx/error.log
6. 切换 DNS 解析
如果所有测试均成功通过,请修改 DNS 记录,使其指向新的 IP 地址。等待生存时间 (TTL) 过期以完成 DNS 生效传播。
您可能还对以下内容感兴趣:
最后更新:2026 年 10 月 1 日
这篇文章有帮助吗?