I came across a need to create a ZFS Raid-Z array with a missing drive. This is easy to do with mdadm but not as easy with ZFS. It is possible, though. The trick is to create an image file with dd, then map that image file as a loopback device. Once that’s done you can treat it as if it were a regular hard drive and add it to the array. Once added to the array you can take the loopback device offline and remove it from the array, then add an actual HDD later.
Create loopback device
Thanks to this site for the information.
First, use dd to create an image file. Change the seek parameter to whatever size disk you wish to emulate.
dd if=/dev/zero of=temp.img bs=1 count=1 seek=1024G
Next, initialize the loopback driver and create the loopback device (md0 in my case)
sudo losetup -a sudo mdconfig -a -t vnode -f temp.img -u 0
List your loopback devices with the following command to verify your new loopback device:
sudo mdconfig -l
Create array using loopback device
You can now partition and add your loopback device as if it were a regular hard drive. Change volume name, array name, and device names as necessary for your environment.
sudo gpart add -t freebsd-zfs -l <volume name> md0 sudo zpool create <array name> raidz ada7p1 ada8p1 ada9p1 md0p1
Fail & Remove loopback device
Now that our new array is up and running properly we can fail out the loopback device. Make sure to modify the command to use your array name and loopback device/partition number.
sudo zpool offline <array_name> md0p1
Import new array into FreeNAS GUI
To get our new array in freenas we must export the array from the command line, then import it from the GUI.
sudo zpool export <array name>
Once the array has been exported, navigate to the FreeNAS GUI and go to Storage / Volumes / Import Volume.
You should now have your new array minus one drive ready to go in FreeNAS. You can now add a physical HDD when it becomes available (in my case, when it returns from RMA.)
2 thoughts on “Create a RaidZ array with missing drive in FreeNAS”
I found a quicker way by not bothering with partitioning the file as can pass to the create:
dd if=/dev/zero of=temp.img count=1 bs=1 seek=4T
zpool create -f main ada0p2 ada1p2 ada2p2 /root/temp.img
zpool offline main /root/temp.img
zpool export main
Hope that helps someone!
Your way is definitely more efficient. Thanks for the comment!