将 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

使用 blkidlsblk -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,然后 syncreboot

测试能否引导进入“新”系统。

后续操作

如果克隆出来的新系统将会和原系统同时使用,需要更改不应重复的 ID 和名称,如:

  • hostname
  • SSH host key
  • ZeroTier ID(rm /var/lib/zerotier-one/identity.*