Cambiar discos en ZFS
6 de febrero de 2025
Hace poco compré un disco duro más grande para mi servidor de almacenamiento. Así que estas son mis notas para cómo cambiar un disco en una agrupación de dispositivos en ZFS.
Comprobar integridad de datos
Antes de cambiar un disco, probablemente deberías de iniciar un proceso de limpieza para comprobar la integridad de tus datos.
# zpool scrub tank
Escoger disco
En mi caso, el disco que voy a reemplazar sí funciona. Sin embargo, lo quiero reemplazar con uno más grande.
$ lsblk -o name,size,model,serial
NAME SIZE MODEL SERIAL
sda 931.5G WDC WD10EFRX-68FYTN0 WD-WCC4J0LZ4AL8
├─sda1 931.5G
└─sda9 8M
sdb 931.5G WDC WD10EFRX-68FYTN0 WD-WCC4J5DXJZN0
├─sdb1 931.5G
└─sdb9 8M
sdc 3.6T ST4000NE001-2MA101 WS2515Z7
├─sdc1 3.6T
└─sdc9 8M
sdd 3.6T Hitachi HUS724040ALE640 PK2331PAG54ZXT
├─sdd1 3.6T
└─sdd9 8M
nvme0n1 119.2G SPCC M.2 PCIe SSD AA230705NV012800315
├─nvme0n1p1 512M
├─nvme0n1p2 117.8G
└─nvme0n1p3 977M
Aquí puedo ver que /dev/sda
o /dev/sdb
son los discos chicos. Puedo escoger
uno de esos.
Informar a ZFS que voy a hacer
Dado a que quiero quitar un disco y reemplazarlo con uno diferente, tengo dos opciones.
zpool replace
zpool detach
yzpool attach
La diferencia es que replace
requiere un puerto adicional para conectar el
disco nuevo. Esto sería más seguro porque puedes conectar el disco nuevo, usar
replace
y luego quitar el disco viejo.
En cambio un detach
y attach
requiere que remuevas el disco que quieres
cambiar primero. Dependiendo en tu configuración, esto puede afectarte de
varias maneras.
En mi caso, estos discos son parte de una argupación espejo y no tengo un
puerto extra, así que tengo que usar detach
y attach
.
Primero esto.
# zpool detach tank ata-WDC_WD10EFRX-68FYTN0_WD-WCC4J5DXJZN0
Reemplazar disco duro físico
Ahora a apagar el servidor, abrirlo, quitar el disco viejo, e instalar el disco nuevo.
Puedes comparar el número de serie que tiene el disco con el que identificamos en el paso anterior.
Reemplazar disco duro en ZFS
Ahora compara la información nueva con la vieja.
$ lsblk -o name,size,model,serial
NAME SIZE MODEL SERIAL
sda 931.5G WDC WD10EFRX-68FYTN0 WD-WCC4J0LZ4AL8
├─sda1 931.5G
└─sda9 8M
sdb 3.6T WDC WD40EFRX-68N32N0 WD-WCC7K2PC3TTX
sdc 3.6T Hitachi HUS724040ALE640 PK2331PAG54ZXT
├─sdc1 3.6T
└─sdc9 8M
sdd 3.6T ST4000NE001-2MA101 WS2515Z7
├─sdd1 3.6T
└─sdd9 8M
nvme0n1 119.2G SPCC M.2 PCIe SSD AA230705NV012800315
├─nvme0n1p1 512M
├─nvme0n1p2 117.8G
└─nvme0n1p3 977M
En mi caso /dev/sdb
es el disco nuevo. Aunque me gustaría saber el id
para
decirle a ZFS.
$ udevadm info --no-pager -q symlink --path=/sys/block/sdb
disk/by-path/pci-0000:00:17.0-ata-2.0 disk/by-id/ata-WDC_WD40EFRX-68N32N0_WD-WCC7K2PC3TTX disk/by-diskseq/3 disk/by-id/wwn-0x50014ee26542d407 disk/by-path/pci-0000:00:17.0-ata-2
Y puedo verificar así.
$ ls -l /dev/disk/by-id/ata-WDC_WD40EFRX-68N32N0_WD-WCC7K2PC3TTX
lrwxrwxrwx 1 root root 9 Feb 7 18:19 /dev/disk/by-id/ata-WDC_WD40EFRX-68N32N0_WD-WCC7K2PC3TTX -> ../../sdb
Ahora le vamos a decir a ZFS.
# disco viejo disco nuevo
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
# zpool attach tank ata-WDC_WD10EFRX-68FYTN0_WD-WCC4J0LZ4AL8 ata-WDC_WD40EFRX-68N32N0_WD-WCC7K2PC3TTX
Luego espera unos segundos y corre este comando.
# zpool status tank
pool: tank
state: ONLINE
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 Fri Feb 7 18:33:45 2025
945G / 2.49T scanned at 10.1G/s, 1.91G / 2.24T issued at 20.8M/s
46.1M resilvered, 0.08% done, 1 days 07:20:43 to go
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ata-WDC_WD10EFRX-68FYTN0_WD-WCC4J0LZ4AL8 ONLINE 0 0 0
ata-WDC_WD40EFRX-68N32N0_WD-WCC7K2PC3TTX ONLINE 0 0 0 (resilvering)
mirror-1 ONLINE 0 0 0
ata-Hitachi_HUS724040ALE640_PK2331PAG54ZXT ONLINE 0 0 0
ata-ST4000NE001-2MA101_WS2515Z7 ONLINE 0 0 0
errors: No known data errors
Y ya. Ahora nada más espera que la reconstrucción termine.