Ubuntu + ZFS:如何将整个系统迁移到新磁盘?

Ubuntu + ZFS:如何将整个系统迁移到新磁盘?

这是我的情况:

我有 Ubuntu原生 ZFS安装在具有 2 x 500 GB SATA 磁盘的服务器上。我按照以下指南进行安装:https://github.com/dajhorn/pkg-zfs/wiki/HOWTO-install-Ubuntu-to-a-Native-ZFS-Root-Filesystem

因此,我在磁盘 1 上为 /boot/grub 设置了一个 16 MB 的分区,并将该磁盘的其余部分和整个第二个驱动器专用于镜像 zpool 中的 ZFS。一切正常。

问题是,现在我需要摆脱 500 GB 磁盘并将其替换为 2 x 1.5 TB 磁盘。

有没有什么方法可以将所有内容(数据、分区表等)从我的两个 500 GB 硬盘复制到两个 1.GB TB 硬盘,而不必从头开始重新安装系统?

我在这里添加@jlliagre 要求的信息:

fdisk:

# fdisk -l

Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf4bfe018

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *          63       32129       16033+  be  Solaris boot
/dev/sda2           32130   976773167   488370519    5  Extended
/dev/sda5           32193   976773167   488370487+  bf  Solaris

Disk /dev/sdb: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I    /O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf4bfe018

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1              63   976773167   488386552+   5  Extended
/dev/sdb5             126   976773167   488386521   bf  Solaris

zpool状态:

# zpool status
  pool: labpool
 state: ONLINE
 scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    labpool     ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        sda5    ONLINE       0     0     0
        sdb5    ONLINE       0     0     0

errors: No known data errors

zpool 列表

# zpool list
NAME      SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
labpool   464G  70.7G   393G    15%  1.00x  ONLINE  -

zpool 历史

# zpool history
History for 'labpool':
2012-02-17.19:23:39 zpool create labpool mirror /dev/disk/by-id/ata-WDC_WD5000AAKX-001CA0_WD-WCAYUFF66324-part5 /dev/disk/by-id/ata-WDC_WD5000AAKX-001CA0_WD-WCAYUFJ06204-part5
2012-02-17.19:26:39 zfs create labpool/ROOT
2012-02-17.19:26:44 zfs create labpool/ROOT/ubuntu-1
2012-02-17.19:27:15 zfs set mountpoint=/ labpool/ROOT/ubuntu-1
2012-02-17.19:27:36 zpool set bootfs=labpool/ROOT/ubuntu-1 labpool
2012-02-17.19:28:03 zpool export labpool
2012-02-17.19:28:30 zpool import -d /dev/disk/by-id/ -R /mnt labpool
2012-02-17.20:48:20 zpool export labpool
2012-02-17.21:03:30 zpool import -f -N labpool
2012-02-17.21:07:35 zpool import -f -N labpool
2012-02-17.21:42:09 zpool import -f -N labpool
2012-02-17.21:51:39 zpool import -f -N labpool
2012-02-17.21:55:49 zpool import -f -N labpool
2012-02-17.21:58:10 zpool import -f -N labpool
2012-02-22.13:25:26 zpool import -f -N labpool
2012-02-22.13:40:15 zpool import -f -N labpool
2012-02-22.12:50:38 zpool import -f -N labpool

我一直在想:如果我从 LiveCD 启动,按照安装指南直到步骤 4(在新的磁盘对上分区并创建 ZFS 池),然后将新文件系统挂载到 /mnt/new,将旧文件系统挂载到 /mnt/old,然后从旧文件系统 rsync 到新文件系统?这可能吗?还是会把一切都搞乱?

答案1

这应该有效:

  • 在新磁盘上创建类似的分区布局,ZFS 不会为您执行此操作。

  • 复制启动分区并重新安装启动加载程序。

  • 在根池 zpool 上设置自动扩展属性set autoexpand=on labpool

  • 更换其中一个磁盘,例如zpool replace labpool sda5 sdc5,等待重新同步以使用以下方式镜像所有池数据集zpool status

  • 更换第二张磁盘zpool replace labpool sdb5 sdd5

  • 删除旧磁盘

答案2

您应该能够zpool replace <pool> <old disk> <new disk>对每个磁盘使用。这将保留所有分区、文件属性等。我已成功将其与 zfs-fuse 结合使用。

查看手册页

答案3

我通过电子邮件联系了安装 Ubuntu+ZFS 指南的作者,他给了我一个可行的解决方案:

ZFS 实例无法调整大小,因此您必须在更大的磁盘上重新创建池以扩大它。请执行以下操作:

  1. 安装新磁盘。
  2. 对新磁盘进行分区以用于 /boot 及更大的池区域。
  3. 创建一个新池,但赋予它不同的名称。
  4. zfs snapshot -r oldpool@now
  5. zfs send -R oldpool@now | zfs recv newpool
  6. 将旧的 /boot 复制到新的 /boot。
  7. 重复 GRUB 安装。
  8. 移除旧磁盘。

如果要保留相同的池名称,则必须导出新池并zpool import -R在手册页中描述的第 3 步之后使用。

我遇到了一些问题,因为我需要更改连接磁盘的插槽,但我认为这个答案可以帮助处于我这种情况的其他人。

我没有尝试@jlliagre 的解决方案,因为我后来才看到它,但我认为我在电子邮件中引用的关于 ZFS 实例无法调整大小的问题(记得我想从 2x500 GB 镜像传递到 2x1.5 TB 镜像)可能存在问题。

相关内容