克隆是使用强大的 rsync 命令行工具创建实时 Linux 服务器的精确副本的细致过程,该工具是一种高效的文件同步和传输工具。
克隆需要使用两个服务器实例:源服务器(用作要克隆的服务器)和目标服务器(实际克隆过程发生的位置)。
通过使用 rsync 命令,可以完成从源服务器到目标服务器的所有文件和目录的复杂同步。
在本指南中,您将学习如何使用 Rsync 文件同步工具热克隆 Linux 服务器。
以下是我们在本指南中使用的实验室设置,您可以使用 rsync 命令克隆任何 Linux 发行版。
源服务器是我们将要克隆到目标服务器上的服务器。
在继续之前,请确保您已满足以下先决条件:
注意:在热克隆之前,请确保禁用所有涉及传输或写入数据的服务,例如数据库、邮件服务等。
要成功克隆,两台服务器上都需要有 rsync 命令行工具,该工具将用于将源服务器镜像到目标服务器并同步两个系统之间的所有差异。
值得庆幸的是,现代 Linux 系统已经预装了 rsync,您可以通过运行以下命令来检查安装的 rsync 版本:
$ rsync --version
如果要查看有关 rsync 的其他信息,请执行以下 rpm 命令或 dpkg-query 命令:
$ rpm -qi rsync [On RHEL/CentOS/Fedora and Rocky/AlmaLinux] dpkg-query --status rsync [On Debian, Ubuntu and Mint]
如果缺少 rsync,请使用默认的软件包管理器将其安装到您的系统上。
$ sudo apt install rsync [On Debian, Ubuntu and Mint] sudo yum install rsync [On RHEL/CentOS/Fedora and Rocky/AlmaLinux] sudo emerge -a sys-apps/rsync [On Gentoo Linux] sudo apk add rsync [On Alpine Linux] sudo pacman -S rsync [On Arch Linux] sudo zypper install rsync [On OpenSUSE]
您可能希望从克隆中排除一些目录和文件,因为它们在目标服务器中已经可用或已自动生成。这些目录包括 /boot、/tmp 和 /dev 目录。
因此,请创建一个排除文件 /root/exclude-files.txt 并添加以下条目:
/boot /dev /tmp /sys /proc /backup /etc/fstab /etc/mtab /etc/mdadm.conf /etc/sysconfig/network*
保存并退出配置文件。
设置好所有内容后,使用以下命令继续并将您的服务器重新同步到远程或目标服务器:
$ sudo rsync -vPa -e 'ssh -o StrictHostKeyChecking=no' --exclude-from=/root/exclude-files.txt / REMOTE-IP:/
该命令将 rsync 从源服务器到目标服务器的所有内容,同时排除您之前定义的文件和目录。请务必将 REMOTE-IP: 选项替换为目标服务器的 IP 地址。
让我们分解一下 command 及其组件:
sudo – 这是一个允许执行具有管理权限的命令的命令。rsync – rsync 命令本身用于文件同步和传输。-v:此选项启用详细输出,提供有关同步进度的详细信息。-P – 此选项等效于 --progress,用于启用部分文件传输,并在同步期间显示每个文件的进度。-a – 此选项代表“存档模式”,是保留重要文件属性(如权限、所有权、时间戳等)的简写。-e – 此选项指定要用于同步的远程 shell。-o StrictHostKeyChecking=no – 禁用严格的主机密钥检查,这意味着如果远程服务器的主机密钥未知,SSH 连接将不会提示确认。--exclude-from=/root/exclude-files.txt – 此选项允许您指定一个文件,其中包含要从同步中排除的模式或路径列表。/ – 正斜杠表示将要克隆的源目录或根目录。REMOTE-IP:/ – 指定目标服务器的 IP 地址或主机名,后跟冒号和正斜杠。它指示将复制克隆文件的远程目录。同步完成后,重新启动目标系统以重新加载更改,然后使用源服务器的凭据引导至服务器。请随意停用旧服务器,因为您现在拥有它的镜像副本。
也可以使用脚本,无人值守克隆。
创建同步脚本
XML/HTML代码
后台启动同步进程
XML/HTML代码
想要查看输出可以
XML/HTML代码
等待结束,可以查看nohup结果显示完成(会有部分复制不成功,不用担心)
克隆完重启目标端服务器。
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync,从字面意思上可以理解为remote sync(远程同步)。rsync不仅可以远程同步数据(类似于scp),而且可以本地同步数据(类似于cp),但不同于cp或scp的一点是,它不会覆盖以前的数据(如果数据已经存在),而是先判断已经存在的数据和新数据的差异,只有数据不同时才会把不相同的部分覆盖。
rsync复制命令
若rsync服务端SSH为标准端口,此时rsync使用方式如下:
XML/HTML代码
若rsync服务端SSH为非标准端口,可通过rsync的-e参数进行端口指定(如ssh端口号为10022),使用方式如下:
XML/HTML代码
常用参数
XML/HTML代码
由于ssh方式不需要进行配置文件配置,只需要像scp一样执行命令即可,因此本文主要介绍该方式的使用,rsync-daemon方式可参考其他教程。
例如需求为:将10.7.2.230上的/root目录文件同步到10.7.2.231上的/root/backup下,可通过以下两种方式来实现:
将本地文件推送(上传)到远端
# 在本地服务器上执行
# rsync 命令参数 源文件目录 目的目录
rsync [OPTION] SRC [USER@]HOST
# 示例:在10.7.2.230上执行rsync,将/root目录文件同步到远程主机(10.7.2.231的/root/backup)上
rsync -avuz /root root@10.7.2.231:/root/backup
将远端文件拉(下载)到本地
# rsync 命令参数 源文件目录 目的目录
# rsync [OPTION] [USER@]HOST
[DEST]# 示例:主机10.7.2.231上执行rsync,将10.7.2.230上/root下的目录文件下载到主机10.7.2.231的/root/backup上
rsync -auvz root@10.7.2.230:/root /root/backup
#注意:
源目录加了斜线,效果就是将该目录下的内容传输到目标目录下
源目录不加斜线,效果就是将该目录传输到目标目录下
目标目录如果不存在,会自动创建目标目录
简单本机文件或者目录的复制
#复制文件
rsync -av /etc/passwd /tmp/1.txt
#复制目录
rsync -av test1/ test2/
小知识:
XML/HTML代码
其他应用,比如上传rsync到esxi的bin目录,就可以直接备份虚拟机,或者使用群晖abb直接备份虚拟机文件到nas,原汁原味,和scp复制的一样,并且支持增量备份,定时备份。更多有趣的玩法需要自己去挖掘。rsync使用的是ssh协议端口,在esxi中除了开启ssh服务,还需要在网络--防火墙中允许sshclient服务通过。
附批量设置ssh免密登录服务器的脚本和方法:
建立文件 ssh.sh 设置属性可写
XML/HTML代码
#!/bin/bash
# 检查 ssh-keygen 是否已经存在密钥对
if [ ! -f ~/.ssh/id_rsa ]; then
echo "SSH key pair not found. Generating one..."
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
else
echo "SSH key pair already exists. Skipping generation."
fi
# 定义 host.txt 文件路径
HOSTS_FILE="host.txt"
# 检查 host.txt 文件是否存在
if [ ! -f "$HOSTS_FILE" ]; then
echo "Error: $HOSTS_FILE not found!"
exit 1
fi
# 检查 host.txt 文件是否为空
if [ ! -s "$HOSTS_FILE" ]; then
echo "Error: $HOSTS_FILE is empty!"
exit 1
fi
# 读取 host.txt 文件
while IFS= read -r line; do
# 跳过空行
if [ -z "$line" ]; then
continue
fi
# 解析行中的IP、端口、用户名和密码
IFS=' ' read -r -a fields <<< "$line"
HOST_PORT_USER_PASS="${fields[0]}"
USER="${fields[1]}"
PASS="${fields[2]}"
IFS=':' read -r IP PORT <<< "$HOST_PORT_USER_PASS"
# 默认端口为22
if [ -z "$PORT" ]; then
PORT=22
fi
echo "Processing IP:$PORT"
# 使用sshpass和ssh-copy-id复制公钥
sshpass -p PORT IP
if [ $? -ne 0 ]; then
echo "Error: Failed to copy SSH key to IP:$PORT"
continue
fi
# 检查公钥是否成功上传
sshpass -p PORT IP "grep -q '(cat ~/.ssh/id_rsa.pub)' ~/.ssh/authorized_keys && echo 'Key successfully added to USER@USER@$IP'"
if [ $? -ne 0 ]; then
echo "Error: SSH connection to IP:$PORT failed"
fi
done < "$HOSTS_FILE"
echo "SSH key copied to all hosts."
相同目录下建立 host.txt 保存服务器信息,格式如下
XML/HTML代码
然后直接执行脚本,即可自动升级秘钥并上传到 host.txt 中服务器上,实现免密直接登录。如果缺少sshpass自行安装。