HOWTO: Add full disk labels to an existing zfs system
To create labels:
for a list of commands type:
Why create labels?
When you reboot, sometimes the disks move around and change numbers. Maybe they are reliable with some specific hardware or driver, but don't count on it.
When a data disk from my pool would switch places with another data disk from the same pool, zfs would automatically handle it. But when a hotspare or something else switched places with a data disk, it would have an error seen in zpool status.
Option #1 (live system conversion, possible corruption if you make an error or a disk has a URE; do a backup!)
One disk at a time, replace a disk, label it, add it back, and resilver the newly labeled device into the pool where the unlabeled one was.
Practice first on a virtual machine, and then on the live system.
*** Create a backup ***
If something goes wrong, raid will not save you.
Scrub because you don't want to remove a good disk when another is bad and you don't know.
Wait...
At this point, decide if you want to go to single user mode or if you want to do it live. For a production system, I would recommend single user mode or someone can put data on there, and then you could destroy your pool, restore your backup, and their data is gone.
For all disks you can list in /dev/ad* {
Make the disk light blink, and decide what to name it based on position, then hit CTRL+c)
Replace with your spare
Set the label
Replace the spare with your original disk now with a label.
Wait for resilver...
}
Option #2 (experimental, no idea if you lose data this way, bad idea unless you are not too worried about failing and restoring from backup):
...
In my test virtual machine, it automatically found the pool and didn't have any errors. I have no idea if it is safe though. I don't have any data on my test disks.
Option #3 (restore a backup):
scrub
back up the pool
destroy the pool
label
recreate the pool with labels
restore the pool
Here is an example of the above option #1, done in a FreeBSD virtual machine in VirtualBox, using a script.
...
DISCLAIMER: I would love to hear about all the wonderful experiences the above information brings you, but won't take any blame. And this is a work in progress.
To create labels:
for a list of commands type:
# glabel
Why create labels?
When you reboot, sometimes the disks move around and change numbers. Maybe they are reliable with some specific hardware or driver, but don't count on it.
When a data disk from my pool would switch places with another data disk from the same pool, zfs would automatically handle it. But when a hotspare or something else switched places with a data disk, it would have an error seen in zpool status.
Code:
<some big number> UNAVAIL 0 0 0 was /dev/da#
Option #1 (live system conversion, possible corruption if you make an error or a disk has a URE; do a backup!)
One disk at a time, replace a disk, label it, add it back, and resilver the newly labeled device into the pool where the unlabeled one was.
Practice first on a virtual machine, and then on the live system.
*** Create a backup ***
If something goes wrong, raid will not save you.
Scrub because you don't want to remove a good disk when another is bad and you don't know.
# zpool scrub share
Wait...
At this point, decide if you want to go to single user mode or if you want to do it live. For a production system, I would recommend single user mode or someone can put data on there, and then you could destroy your pool, restore your backup, and their data is gone.
# glabel label spare1 <your spare device>
For all disks you can list in /dev/ad* {
Make the disk light blink, and decide what to name it based on position, then hit CTRL+c)
# dd if=/dev/ada4 of=/dev/null
Replace with your spare
# zpool replace share ada4 label/spare1
Set the label
# glabel label share1d1 ada4
Replace the spare with your original disk now with a label.
# zpool replace share label/spare1 label/share1d1
Wait for resilver...
}
# zpool export poolname
# glabel label poolname1d1 ad8
# glabel label poolname1d1 ad10
...
# zpool import poolname
In my test virtual machine, it automatically found the pool and didn't have any errors. I have no idea if it is safe though. I don't have any data on my test disks.
Option #3 (restore a backup):
scrub
back up the pool
destroy the pool
label
recreate the pool with labels
restore the pool
Here is an example of the above option #1, done in a FreeBSD virtual machine in VirtualBox, using a script.
# zpool status big
Code:
pool: big
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
big ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
ad8 ONLINE 0 0 0
ad10 ONLINE 0 0 0
ad12 ONLINE 0 0 0
ad14 ONLINE 0 0 0
errors: No known data errors
# vim relabeltest.bash
Code:
spare=ad16
tolabel="ad8 ad10 ad12 ad14"
IFS=' '
labels=(big1 big2 big3 big4)
i=0
IFS=' '
for disk in $tolabel; do
label=${labels[$i]}
echo "=============================="
echo "Renaming disk $disk to $label"
zpool replace big $disk ad16
glabel label $label $disk
zpool replace big ad16 label/$label
zpool status big
sleep 2
while zpool status big | grep "DEGRADED" >/dev/null 2>&1; do
echo Still waiting...
sleep 1
done
echo "=============================="
let i++
done
# chmod u+x relabeltest.bash
# ./relabeltest.bash
...
# zpool status
Code:
pool: big
state: ONLINE
scan: resilvered 43.5K in 0h0m with 0 errors on Tue Dec 6 10:43:35 2011
config:
NAME STATE READ WRITE CKSUM
big ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
label/big1 ONLINE 0 0 0
label/big2 ONLINE 0 0 0
label/big3 ONLINE 0 0 0
label/big4 ONLINE 0 0 0
errors: No known data errors
DISCLAIMER: I would love to hear about all the wonderful experiences the above information brings you, but won't take any blame. And this is a work in progress.