前言
我的服务器的Ubuntu系统是装在btrfs文件系统下的,用的一块8年前出厂的128GB m2 SATA SSD。升级服务器,买了块2T的SSD用作系统盘,现在需要将系统从旧盘移动到新盘中。
系统概况
我的系统目前系统是这样的
$ sudo btrfs subvolume list /
ID 259 gen 373888 top level 5 path @ubuntu
ID 261 gen 373807 top level 5 path @cache
ID 262 gen 373883 top level 5 path @log
ID 263 gen 373872 top level 5 path @tmp
ID 264 gen 373808 top level 5 path @snapshots
ID 271 gen 486 top level 5 path @swap
ID 274 gen 373888 top level 5 path @home
...
$ cat /etc/fstab
# SYSTEM
/dev/disk/by-uuid/6ef6ead8-f57c-4552-8635-c56274145d64 / btrfs rw,noatime,subvol=/@ubuntu 0 1
/dev/disk/by-uuid/6ef6ead8-f57c-4552-8635-c56274145d64 /home btrfs rw,noatime,subvol=/@home 0 0
/dev/disk/by-uuid/6ef6ead8-f57c-4552-8635-c56274145d64 /var/cache btrfs rw,noatime,subvol=/@cache 0 0
/dev/disk/by-uuid/6ef6ead8-f57c-4552-8635-c56274145d64 /var/log btrfs rw,noatime,subvol=/@log 0 0
/dev/disk/by-uuid/6ef6ead8-f57c-4552-8635-c56274145d64 /tmp btrfs rw,noatime,subvol=/@tmp 0 0
/dev/disk/by-uuid/6ef6ead8-f57c-4552-8635-c56274145d64 /swap btrfs rw,noatime,subvol=/@swap 0 0
/dev/disk/by-uuid/6ef6ead8-f57c-4552-8635-c56274145d64 /.snapshots btrfs rw,noatime,subvol=/@snapshots 0 0
# EFI
/dev/disk/by-uuid/4206-CA09 /boot/efi vfat defaults 0 1
# DATA
/dev/disk/by-uuid/a82a8cd6-c5ed-4595-88e0-d5aad647eafd /data btrfs defaults 0 1
# SWAP
/swap/swap.img none swap sw 0 0
执行迁移
从U盘的Live CD系统启动,
lsblk查看磁盘分区,我的旧系统盘是sdd,有两个分区(EFI分区和Linxu文件系统),新系统盘是nvme0n1。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdd 8:48 0 119.2G 0 disk
├─sdd1 8:49 0 1G 0 part
└─sdd2 8:50 0 118.2G 0 part
nvme0n1 259:0 0 1.9T 0 disk
新盘分区
进入gdisk交互程序
gdisk /dev/nvme0n1
🔹 1. 创建新的空 GPT 分区表
键入:
o ↵
y ↵
这会清除所有现有分区信息。
🔹 2. 创建 EFI 分区(512MB)
n ↵
<默认分区号 1> ↵
<默认起始扇区> ↵
+1G ↵
ef00 ↵
分区号:1
起始扇区:默认
结束位置:+1G
类型代码:ef00(EFI 系统分区)
🔹 3. 创建 Btrfs 主分区(剩余空间)
n ↵
<默认分区号 2> ↵
<默认起始扇区> ↵
<默认结束扇区> ↵
8300 ↵
分区号:2
起始扇区:默认
结束位置:默认(用满剩余空间)
类型代码:8300(Linux LVM 或通用 Linux 数据分区)
🔹 4. 检查分区情况
Command (? for help): p
Disk /dev/nvme0n1: 4000797360 sectors, 1.9 TiB
Model: ZHITAI TiPlus7100 2TB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 715A6344-A590-43C4-990D-A9FF67629B70
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 4000797326
Partitions will be aligned on 2048-sector boundaries
Total free space is 2669 sectors (1.3 MiB)
Number Start (sector) End (sector) Size Code Name
1 2048 2099199 1024.0 MiB EF00 EFI system partition
2 2099200 4000796671 1.9 TiB 8300 Linux filesystem
🔹 5. 写入更改并退出
w ↵
y ↵
系统迁移
- 挂载新老系统盘
# 创建挂载点
sudo mkdir /mnt/oldroot /mnt/newroot
# 挂载系统盘
sudo mount /dev/sdd2 /mnt/newroot
sudo mount /dev/nvme0n1p2 /mnt/newroot
- 创建只读镜像
由于非只读子卷不能直接btrfs send/receive,因此需要创建最新的只读镜像用于传输。
目前旧系统盘中主要卷结构是这样的:
$ ll /mnt/oldroot
total 16
drwxr-xr-x 1 root root 82 Feb 14 21:23 ./
drwxr-xr-x 1 root root 80 Jul 1 05:10 ../
drwxr-xr-x 1 root root 230 Feb 15 09:49 '@cache'/
drwxr-xr-x 1 root root 6 Feb 14 17:22 '@home'/
drwxrwxr-x 1 root syslog 1102 Jun 30 16:00 '@log'/
drwxr-xr-x 1 root root 996 Jul 1 05:36 '@snapshots'/
drwxr-xr-x 1 root root 16 Feb 14 20:46 '@swap'/
drwxrwxrwt 1 root root 294 Jul 1 04:49 '@tmp'/
drwxr-xr-x 1 root root 304 Jun 30 14:45 '@ubuntu'/
创建只读镜像:
sudo mkdir /mnt/oldroot/@snapshots/mig
sudo btrfs subvolume snapshot -r /mnt/oldroot/@ubuntu /mnt/oldroot/@snapshots/mig/@ubuntu_ro
sudo btrfs subvolume snapshot -r /mnt/oldroot/@home /mnt/oldroot/@snapshots/mig/@home_ro
sudo btrfs subvolume snapshot -r /mnt/oldroot/@cache /mnt/oldroot/@snapshots/mig/@cache_ro
sudo btrfs subvolume snapshot -r /mnt/oldroot/@log /mnt/oldroot/@snapshots/mig/@log_ro
sudo btrfs subvolume snapshot -r /mnt/oldroot/@tmp /mnt/oldroot/@snapshots/mig/@tmp_ro
sudo btrfs subvolume snapshot -r /mnt/oldroot/@swap /mnt/oldroot/@snapshots/mig/@swap_ro
sudo btrfs subvolume snapshot -r /mnt/oldroot/@snapshots /mnt/oldroot/@snapshots/mig/@snapshots_ro
- 传输只读镜像
sudo btrfs send /mnt/oldroot/@snapshots/mig/@ubuntu_ro | sudo btrfs receive /mnt/newroot/
sudo btrfs send /mnt/oldroot/@snapshots/mig/@home_ro | sudo btrfs receive /mnt/newroot/
sudo btrfs send /mnt/oldroot/@snapshots/mig/@cache_ro | sudo btrfs receive /mnt/newroot/
sudo btrfs send /mnt/oldroot/@snapshots/mig/@log_ro | sudo btrfs receive /mnt/newroot/
sudo btrfs send /mnt/oldroot/@snapshots/mig/@tmp_ro | sudo btrfs receive /mnt/newroot/
sudo btrfs send /mnt/oldroot/@snapshots/mig/@swap_ro | sudo btrfs receive /mnt/newroot/
sudo btrfs send /mnt/oldroot/@snapshots/mig/@snapshots_ro | sudo btrfs receive /mnt/newroot/
- 将只读镜像复制为可写子卷
sudo btrfs subvolume snapshot /mnt/newroot/@ubuntu_ro /mnt/newroot/@ubuntu
sudo btrfs subvolume snapshot /mnt/newroot/@home_ro /mnt/newroot/@home
sudo btrfs subvolume snapshot /mnt/newroot/@cache_ro /mnt/newroot/@cache
sudo btrfs subvolume snapshot /mnt/newroot/@log_ro /mnt/newroot/@log
sudo btrfs subvolume snapshot /mnt/newroot/@tmp_ro /mnt/newroot/@tmp
sudo btrfs subvolume snapshot /mnt/newroot/@swap_ro /mnt/newroot/@swap
sudo btrfs subvolume snapshot /mnt/newroot/@snapshots_ro /mnt/newroot/@snapshots
- 删除只读镜像
sudo btrfs subvolume delete /mnt/newroot/@ubuntu_ro
sudo btrfs subvolume delete /mnt/newroot/@home_ro
sudo btrfs subvolume delete /mnt/newroot/@cache_ro
sudo btrfs subvolume delete /mnt/newroot/@log_ro
sudo btrfs subvolume delete /mnt/newroot/@tmp_ro
sudo btrfs subvolume delete /mnt/newroot/@swap_ro
sudo btrfs subvolume delete /mnt/newroot/@snapshots_ro
进入新系统
- 重新挂载,这次指定挂载新系统盘中的子卷
@ubuntu到/mnt/newroot
sudo umount /mnt/newroot/
sudo mount -o subvol=@ubuntu /dev/nvme0n1p2 /mnt/newroot
按原系统的对应情况,将其他子卷挂载到新系统中,模拟真实系统结构
# 挂载对应文件夹的子卷
sudo mount -o subvol=@home /dev/nvme0n1p2 /mnt/newroot/home
sudo mount -o subvol=@cache /dev/nvme0n1p2 /mnt/newroot/var/cache
sudo mount -o subvol=@log /dev/nvme0n1p2 /mnt/newroot/var/log
sudo mount -o subvol=@tmp /dev/nvme0n1p2 /mnt/newroot/tmp
sudo mount -o subvol=@snapshots /dev/nvme0n1p2 /mnt/newroot/.snapshots
sudo mount -o subvol=@swap /dev/nvme0n1p2 /mnt/newroot/swap
# 挂载 EFI 分区
sudo mount /dev/nvme0n1p1 /mnt/newroot/boot/efi
绑定系统目录
for dir in dev proc sys run; do
sudo mount --bind /$dir /mnt/newroot/$dir
done
进入新系统的chroot环境
sudo chroot /mnt/newroot /bin/bash
- 替换 fstab 中的 UUID
blkid /dev/nvme0n1p2 # 获取新的 UUID
blkid /dev/nvme0n1p1 # 获取新的 EFI UUID
vim /etc/fstab # 替换旧的 UUID 为新的
- 重新安装 grub
# 安装 GRUB 到新盘的 EFI 分区
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck
# 生成 config
update-grub
- 退出 chroot
exit
for dir in dev proc sys run; do
sudo umount /mnt/newroot/$dir
done
- 退出Live CD环境
sudo umount -R /mnt/oldroot
sudo umount -R /mnt/newroot
sudo reboot
启动新系统
查看挂载情况
$ mount | grep btrfs
/dev/nvme0n1p2 on / type btrfs (rw,noatime,ssd,discard=async,space_cache=v2,subvolid=263,subvol=/@ubuntu)
/dev/nvme0n1p2 on /.snapshots type btrfs (rw,noatime,ssd,discard=async,space_cache=v2,subvolid=269,subvol=/@snapshots)
/dev/nvme0n1p2 on /swap type btrfs (rw,noatime,ssd,discard=async,space_cache=v2,subvolid=268,subvol=/@swap)
/dev/nvme0n1p2 on /tmp type btrfs (rw,noatime,ssd,discard=async,space_cache=v2,subvolid=267,subvol=/@tmp)
/dev/nvme0n1p2 on /home type btrfs (rw,noatime,ssd,discard=async,space_cache=v2,subvolid=264,subvol=/@home)
/dev/nvme0n1p2 on /var/cache type btrfs (rw,noatime,ssd,discard=async,space_cache=v2,subvolid=265,subvol=/@cache)
/dev/nvme0n1p2 on /var/log type btrfs (rw,noatime,ssd,discard=async,space_cache=v2,subvolid=266,subvol=/@log)
$ lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sdd
├─sdd1 vfat FAT32 4206-CA09
└─sdd2 btrfs 6ef6ead8-f57c-4552-8635-c56274145d64
nvme0n1 zfs_member 5000 rpool 10967845469585707948
├─nvme0n1p1 vfat FAT32 133B-6E69 1015.8M 1% /boot/efi
└─nvme0n1p2 btrfs 53e917db-cec3-4e17-9802-0b6b9f195729 1.8T 2% /var/log
/var/cache
/home
/tmp
/swap
/.snapshots
/
确保所有子卷都挂载到了正确的位置,UUID 对应的是新盘的。

100

被折叠的 条评论
为什么被折叠?



