跳转到正文

netcup 技术文档

服务器

通过 rsync 迁移服务器

了解如何通过 rsync 将服务器数据传输到新服务器。

1. 什么是 rsync?

rsync (Remote Sync) 是一款用于高效文件传输和同步的工具。它采用增量传输算法:rsync 不会传输整个文件,而是仅发送源端与目标端之间的差异部分。这使得它在重复执行同步任务时尤为高效。

 

核心特性:

  • 增量传输 – 仅传输发生更改的数据块
  • 校验和验证 – 验证每个文件的完整性
  • 支持 SSH – 通过网络进行安全加密传输
  • 保留元数据 – 保留权限、时间戳、符号链接和所有者信息
  • 演练模式(--dry-run)– 仅模拟运行而不执行实际修改

2. 准备工作

为稳妥起见,请在传输数据前创建完整备份。

1. 准备工作

  1. 登录到 服务器控制面板 (SCP).
  2. 选择 源服务器 和 目标服务器 (即您要用于迁移的服务器)。
  3. 请确保服务器处于 已关机 (离线)状态。
  4. 前往 媒体 > 救援系统 (Media > Rescue System).
  5. 点击 激活 (Activate) 以及右侧的 OK 。
  6. 请记录下界面显示的 密码.
  7. 如果 SCP 未自动重启服务器,请手动将它们重启。
  8. 服务器将重启并进入救援系统。

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 [email protected]

 

# Test the connection
ssh [email protected] "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/ [email protected]:/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/ [email protected]:/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/ [email protected]:/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/ [email protected]:/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 日

这篇文章有帮助吗?