btrfs文件系统下的Ubuntu系统迁移

前言

我的服务器的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 ↵

系统迁移

  1. 挂载新老系统盘
# 创建挂载点
sudo mkdir /mnt/oldroot /mnt/newroot
# 挂载系统盘
sudo mount /dev/sdd2 /mnt/newroot
sudo mount /dev/nvme0n1p2 /mnt/newroot


  1. 创建只读镜像

由于非只读子卷不能直接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
  1. 传输只读镜像
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/
  1. 将只读镜像复制为可写子卷
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
  1. 删除只读镜像
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

进入新系统

  1. 重新挂载,这次指定挂载新系统盘中的子卷@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
  1. 替换 fstab 中的 UUID
blkid /dev/nvme0n1p2  # 获取新的 UUID
blkid /dev/nvme0n1p1  # 获取新的 EFI UUID
vim /etc/fstab  # 替换旧的 UUID 为新的
  1. 重新安装 grub
# 安装 GRUB 到新盘的 EFI 分区
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck

# 生成 config
update-grub
  1. 退出 chroot
exit
for dir in dev proc sys run; do
  sudo umount /mnt/newroot/$dir
done
  1. 退出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 对应的是新盘的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值