1

本文在模拟FreeBSD操作系统在 ZFS 的加持下如果不小心损坏一块硬盘后,如何更换新硬盘的场景。

而实际的场景是,有部分服务器压力过大,想创建一个新的服务器来分担,但在安装mysql57却发现该包被freebsd于2023年底抛弃了。而时间原因,又不可能在短时间内把应用的数据库版本升级为mysql83, 所以就有了将原来的FreeBSD操作系统中的两块硬盘分离,然后再为每块硬盘配置另一块同大小的硬盘。达到了将历史上安装有mysql57的服务器复制的目的。

前提

FreeBSD有两块硬盘,安装时选择了 ZFS,模式选择的为mirror。

分区

新的硬盘被换上后,首先是需要保证分区与原硬盘相同。假设新的硬盘为da1,原可以正常启动FreeBSD系统的为da2。

在用户目录下如下复制分区表:

# gpart backup da1 > gpt_backup_da1.txt
# gpart restore -F da0 < gpt_backup_da1.txt

此时 da1 的分区信息便被成功的复制到 da0 中。

替换硬盘

然后由于操作系统直接就基于zfs,所以zpool状态如下:

    NAME        STATE     READ WRITE CKSUM
    zroot       DEGRADED     0     0     0
      mirror-0  DEGRADED     0     0     0
        da0p3   UNAVAIL      0     0     0  cannot open
        da1p3   ONLINE       0     0     0

然后我们直接替换 da0p3:

 # zpool replace zroot da0p3

此时zfs将进行数据的复制,即将 da1p3的内容复制到 da0p3。使用zpool status可以查看复制进度:

# zpool status
  pool: zroot
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
    continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Wed Jan 17 23:28:49 2024
    2.72G scanned at 121M/s, 1.64G issued at 73.1M/s, 2.72G total
    1.73G resilvered, 60.50% done, 00:00:15 to go
config:

复制完成后,再使用zpool status查看,显示如下;

  scan: resilvered 2.95G in 00:00:39 with 0 errors on Wed Jan 17 23:29:28 2024

写入引导

最后,为了使新硬盘可以独立引导系统,还需要执行以下命令来安装引导数据:

 # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
partcode written to da0p1
bootcode written to da0

此时新老硬盘数据一致,同时都有单独启动系统的能力。


潘杰
3.1k 声望238 粉丝

引用和评论

0 条评论