本文在模拟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
此时新老硬盘数据一致,同时都有单独启动系统的能力。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。