复制 btrfs 分区到另一块硬盘

本文最后更新于 2023年11月12日 晚上

双十一来了,我入手了心心念念的致钛Ti 7100 plus。 但是迟迟没有将它换到我的笔记本上,直到这周末,才终于有时间将数据迁移到新盘上面,可惜的是,我的 $HOME 已经在周五晚上的测试打包过程中被误删了,后来回滚到了今年 7 月的快照。不过幸运的是除了我以外没有其他用户被删 $HOME,咱不用被挂在耻辱柱上了。

基本思路

由于 btrfs 有子卷 (subvolume),无法像以前 ext4 时候一样直接用 rsync 同步数据。但是我又不想直接全盘 dd
在咨询了群友以及在谷歌后,决定使用 dd 来迁移数据。基本步骤是

  1. 缩小 btrfs 所在分区
  2. dd 缩小后的分区到新的硬盘上。

开始操作

应某群友的要求,这一部分我尽量详细地介绍具体操作。本操作需要你的电脑具有至少两个 nvme 硬盘位。

拆机换硬盘

  1. 电脑关机,拔掉电源。
  2. 脱下毛衣等易产生静电的衣物,双手摸墙 10s 放静电
  3. 用螺丝刀将电脑后盖拆开。
  4. 断开电脑的内置电池。
  5. 长按电源键 15s 放电。
  6. 顺便清一下灰,这一步可以不做。
  7. 换上新的硬盘到另一个槽位。
  8. 合上后盖(轻轻合在一起即可,不要拧后盖螺丝)。

复制文件

  1. 接上电源,外接 USB, 从 livecd 启动。启动后可以拔掉 U 盘。(默认 copytoram)。
  2. 给新硬盘分区,分区布局与旧硬盘一样(我的是 512M EFI,其他全给 btrfs),这一步不用 mkfs。
  3. dd 拷贝旧的 EFI 分区。
  4. 挂载旧硬盘的 btrfs 分区到 /mnt
1
mount /dev/nvme0n1p2 /mnt
  • a. 查看 btrfs 分区的用量,注意两个地方,Device allocatedFreemin.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
➜  ~ btrfs filesystem usage /mnt
Overall:
Device size: 1.86TiB
Device allocated: 815.02GiB
Device unallocated: 1.07TiB
Device missing: 0.00B
Device slack: 0.00B
Used: 807.01GiB
Free (estimated): 1.07TiB (min: 548.94GiB)
Free (statfs, df): 1.07TiB
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 512.00MiB (used: 0.00B)
Multiple profiles: no

Data,single: Size:789.01GiB, Used:786.17GiB (99.64%)
/dev/nvme0n1p2 789.01GiB

Metadata,DUP: Size:13.00GiB, Used:10.42GiB (80.17%)
/dev/nvme0n1p2 26.00GiB

System,DUP: Size:8.00MiB, Used:128.00KiB (1.56%)
/dev/nvme0n1p2 16.00MiB

Unallocated:
/dev/nvme0n1p2 1.07TiB
  • b. 缩小分区,我们将分区缩小比 min: 548.94GiB 稍微小一点的大小,比如缩小 540G.
1
btrfs filesystem resize -540G /mnt

重复上述缩小分区的过程,直到不能再缩小(或者到你认为合适的大小)。
操作完毕之后将它卸载掉

1
umount /mnt
  1. 开始拷贝分区。这里 /dev/nvme0n1p2 是旧硬盘,/dev/nvme1n1p2 是新硬盘。其中 bs 是 block size, 需要大于一个扇区的大小(通常为4k),可以设置得大一些,这样复制得快。(比如 16M), count 是块数量,需要满足
    bs * count >= Device size,我们假设 bs=16M, 设备大小我们成功缩小到了 1T, 则 count 至少应该为 65536, 实际中应该稍微再多一些为好。
1
dd if=/dev/nvme0n1p2 of=/dev/nvme1n1p2 status=progress bs=4M count=XXX

等到跑完就拷贝完毕了。

重建 boot 分区

这一步可能不是必要的,但是保险起见还是操作下。

  1. 将新硬盘挂载上,然后 chroot 进去
1
2
3
mount /dev/nvme1n1p2 /mnt
mount /dev/nvme1n1p1 /mnt/boot
arch-chroot /mnt
  1. chroot 里面 执行 mkinitcpio -P 重新生成引导。
    注意可以不用修改 fstab 并重新生成 grub.cfg

检查能否启动

关机,断开电源,打开后盖,双手摸墙放静电,拔掉旧硬盘,将其他的硬盘一并插回去(比如 windows 盘)。

按电源键开机,进入 BIOS, 添加启动项指向新的硬盘,EFI/GRUB/grubx64.efi,然后将它调到第一启动项,保存重启。应当会正常进入 linux 系统。

关机,断开电源,双手摸墙放静电,长按电源键放电。然后将电池插上。按电源键开机,能正常进入系统即可。

然后继续关机,把后盖合上,卡扣也扣上,螺丝拧上,插上电源,开机。

教程完毕。

推荐阅读

  1. partclone 可以比较简单地完成复制分区。
  2. dd 用法以及它的文档。

复制 btrfs 分区到另一块硬盘
https://blog.askk.cc/2023/11/12/move-btrfs-to-another-disk/
作者
sukanka
发布于
2023年11月12日
许可协议