将 Arch Linux 克隆到其它存储设备(硬盘 / U盘)
假设系统安装在 Btrfs 的一个子卷中,并且没有单独的 /boot
, /home
等分区。
$root_dev=/dev/sda2 # "/" 所在的块设备
$root_subvol=@ # "/" 所在的 btrfs 子卷
$target_dev=/dev/sdb2 # 目标块设备
$target_esp=/dev/sdb1 # 目标 EFI 系统分区块设备
格式化、挂载
格式化目标设备:
mkfs.btrfs $target_dev
mkfs.vfat $target_esp
挂载原/目标文件系统(使用 subvol=/
参数挂载原文件系统,以便操作 Btrfs 子卷):
mkdir -p /mnt/{src,target}
mount $root_dev /mnt/src -o subvol=/
mount $target_dev /mnt/target
复制根文件系统
# 为 btrfs send 创建一个只读快照
btrfs sub snap -r "/mnt/src/$root_subvol" "/mnt/src/send_$root_subvol"
# 使用 btrfs send | btrfs receive 发送快照到目标文件系统
btrfs send "/mnt/src/send_$root_subvol" | btrfs receive /mnt/target/
# 在目标文件系统,创建一个可写快照
btrfs sub snap "/mnt/target/send_$root_subvol" "/mnt/target/$root_subvol"
进入目标系统
挂载并 chroot
# 创建用于 chroot 的目录
mkdir -p /mnt/target_os
# 挂载 / 与 ESP 分区
mount -B "/mnt/target/$root_subvol" /mnt/target_os
mount $target_esp /mnt/target_os/boot/efi
arch-chroot /mnt/target_os
(以下命令均在 chroot 中执行)
更新 fstab
使用 blkid
或 lsblk -f
查看新文件系统的 UUID,手动修改 /etc/fstab
中的 UUID。
或使用 genfstab -U
重新生成并替换 /etc/fstab
。
重建 GRUB 引导
安装 GRUB 到 ESP:
# 如果安装到移动设备:
grub-install --no-nvram --removable
# 如果安装到固定硬盘,在目标机器上运行:
grub-install
重新生成 GRUB 配置:(在此之前,可能需要检查 /etc/default/grub
中是否有与原系统关联的参数)
grub-mkconfig -o /boot/grub/grub.cfg
Reboot!
退出 chroot,然后 sync
并 reboot
。
测试能否引导进入“新”系统。
后续操作
如果克隆出来的新系统将会和原系统同时使用,需要更改不应重复的 ID 和名称,如:
- hostname
- SSH host key
- ZeroTier ID(
rm /var/lib/zerotier-one/identity.*
)