有一个备份用的zfs文件系统的磁盘底层出了点问题,需要更换磁盘。
zfs的存储池用的是Stripe(条带)模式,没有冗余。
下面记录一下更换磁盘的过程。
首先版本信息
root@pbs:~# zfs version
zfs-2.3.4-pve1
zfs-kmod-2.3.4-pve1
查看一下当前存储池的状态
可以看到pool 的名字是 Data,Stripe(条带)模式。
root@pbs:~# zpool status
pool: Data
state: ONLINE
scan: scrub repaired 0B in 00:04:18 with 0 errors on Sun Mar 8 00:28:19 2026
config:
NAME STATE READ WRITE CKSUM
Data ONLINE 0 0 0
sdb ONLINE 0 0 0
errors: No known data errors
给这台机器新加入了了一个磁盘,sdc
root@pbs:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1007K 0 part
├─sda2 8:2 0 512M 0 part
└─sda3 8:3 0 19.5G 0 part
├─pbs-swap 252:0 0 2.4G 0 lvm [SWAP]
└─pbs-root 252:1 0 17.1G 0 lvm /
sdb 8:16 0 300G 0 disk
├─sdb1 8:17 0 300G 0 part
└─sdb9 8:25 0 8M 0 part
sdc 8:32 0 200G 0 disk
sr0 11:0 1 1024M 0 rom
将新磁盘加入到存储池中。
# 语法:zpool add <池名> <新磁盘>
zpool add Data /dev/sdc
再次查看存储池的状态,此时这个存储池中已经有两块磁盘了。
由于没有修改存储类型,所以两块盘还是Stripe(条带)模式。
root@pbs:~# zpool status
pool: Data
state: ONLINE
scan: scrub repaired 0B in 00:04:18 with 0 errors on Sun Mar 8 00:28:19 2026
config:
NAME STATE READ WRITE CKSUM
Data ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
errors: No known data errors
接下来移除旧的磁盘。
zpool remove Data /dev/sdb
执行上面命令后,ZFS 会将 sdb 上的数据搬移到池内其他磁盘上,过程较慢。
可通过 zpool status 查看进度。
下面可以看到 sdb 处于 removeing 的状态。
在数据迁移的过程中,物理磁盘的负载会变高,存储池的 IO 速度会变慢。
等待旧磁盘从存储池中消失了之后,就可以物理移除该硬盘了。
root@pbs:~# zpool status
pool: Data
state: ONLINE
scan: scrub repaired 0B in 00:04:18 with 0 errors on Sun Mar 8 00:28:19 2026
remove: Evacuation of /dev/sdb1 in progress since Sun Mar 8 17:01:01 2026
1.85G copied out of 76.3G at 72.7M/s, 2.42% done, 0h17m to go
config:
NAME STATE READ WRITE CKSUM
Data ONLINE 0 0 0
sdb ONLINE 0 0 0 (removing)
sdc ONLINE 0 0 0
errors: No known data errors