rsync 是一款快速且灵活的文件拷贝工具,既能实现本地拷贝也能完成远程同步。本文将使用 rsync
作为核心工具来介绍如何复刻 Linux 操作系统。
准备工作
需要注意的是源设备和目标设备之间的 CPU 架构需保持一致。
硬件
- 一台被复刻的设备作为源设备(参考搭建 IPPBX 基础开发环境)
- 一台新设备作为目标设备
- 一个 Linux USB 启动盘(制作方法网络上很多这里不多作介绍,我制作的是
Debian10
USB 启动盘)
软件
- rsync
- openssh-server(可选)
配置源设备
在搭建 IPPBX 基础开发环境一文中我们已经搭建好了一个开发环境,其中的 /dev/sdb2
设备里包含了一个完整的用于生产环境的操作系统。现在我们将 /dev/sdb2
用作拷贝源。
源设备网络
简单的方法是将源设备接到路由器上,由路由器自动分配 IP 地址。也可以采用和目标设备直接连接的方式,则需要自己配置静态 IP 地址。
挂载 /dev/sdb2
1 | sudo mkdir -p /mnt/debian_10 |
安装&配置 rsync
1 | $ sudo -i |
配置目标设备
将目标设备从 USB 启动盘启动,然后将必备的软件安装好。
目标设备网络
简单的方法是将目标设备接到路由器上,由路由器自动分配 IP 地址。也可以采用和源设备直接连接的方式,则需要自己配置静态 IP 地址。
使用 rsync 复刻系统
使用 rsync
将源设备上 Linux 系统复刻到目标设备上的方法有两种:
- 使用脚本操作
- 手动操作
推荐使用脚本,用 root 用户执行脚本之后根据提示信息操作即可。如果需要手动操作,则接着往下看(后面的操作均使用 root 用户执行)。
对目标硬盘分区
首先查看一下分区信息:
1 | $ lsblk |
其中 sdb
是 USB 启动盘 sda
是目标设备上的硬盘。对 sda
分区:
1 | dd if=/dev/zero of=/dev/sda bs=1024 count=1 |
这里我们将 sda
划了2个分区,第一个是4G的交换分区,剩余的空间划分为系统分区并格式化为 ext4
文件系统(分区方式需和源设备保持一致)。
从源设备同步文件
首先将刚刚创建好的系统分区挂载到本地目录:
1 | mkdir -p /mnt/rsync_tmp |
检查一下与源设备的连通性(假定源设备的 IP 地址是 192.168.198.140
):
1 | ping -c 1 192.168.198.140 |
开始同步:
1 | rsync -avHX 192.168.198.140::all/mnt/debian_10/ /mnt/rsync_tmp/ |
注意:路径结尾处的 /
必须有。
重新安装 GRUB 启动器
从源设备同步完成之后,目标设备上的 GRUB 启动器以及其配置都未更新,所以需要更新。
首先获取2个分区的 UUID
:
1 | $ blkid /dev/sda1 |
将对应分区的 UUID
更新到 /mnt/rsync_tmp/etc/fstab
文件中后执行:
1 | mount --bind /proc /mnt/rsync_tmp/proc |
进入到 chroot
环境后,更新 GRUB:
1 | grub-install /dev/sda |
重启设备
1 | reboot |
进入 BIOS 中将启动设备设置为硬盘后启动,即可进入完成复刻的 Linux 系统。