Creating a ZFS Storage Pool Using a File-Based VDEV for Testing Purposes


4 views

When working with ZFS for testing or development purposes, creating actual physical vdevs might be impractical. A file-backed vdev provides a convenient alternative that behaves exactly like a physical device but uses a file as storage backend.

First, create the backing file:

dd if=/dev/zero of=/tank/test/zpool bs=1M count=100

This creates a 100MB file filled with zeros. For more realistic testing, consider larger sizes (e.g., 1G or more).

Use the zpool create command with the file:

zpool create -f testpool /tank/test/zpool

The -f flag forces creation even though we're using a regular file.

Check the pool status:

zpool status testpool

You should see output similar to:

  pool: testpool
 state: ONLINE
  scan: none requested
config:

        NAME               STATE     READ WRITE CKSUM
        testpool           ONLINE       0     0     0
          /tank/test/zpool  ONLINE       0     0     0

For more complex testing scenarios:

# Create a mirrored pool using two files
dd if=/dev/zero of=/tank/test/mirror1 bs=1M count=100
dd if=/dev/zero of=/tank/test/mirror2 bs=1M count=100
zpool create -f mirrorpool mirror /tank/test/mirror1 /tank/test/mirror2

# Create a RAIDZ pool using three files
for i in {1..3}; do
  dd if=/dev/zero of=/tank/test/raidz$i bs=1M count=100
done
zpool create -f raidzpool raidz /tank/test/raidz1 /tank/test/raidz2 /tank/test/raidz3

Remember these key points when using file-based vdevs:

  • Performance will be slower than physical devices
  • Files consume space on your existing filesystem
  • Not recommended for production use
  • Excellent for testing ZFS features, upgrades, or configurations

When done testing:

zpool destroy testpool
rm /tank/test/zpool

When testing ZFS functionality, you might want to use a file as a virtual device (VDEV) instead of physical disks. This approach is perfect for experimentation without risking actual storage hardware.

First, create a file that will act as your virtual device:

dd if=/dev/zero of=/tank/test/zpool bs=1M count=100

This creates a 100MB file filled with zeros. Adjust the count parameter to change the size.

For better performance and compatibility, associate your file with a loop device:

sudo losetup -f /tank/test/zpool

Find your assigned loop device with:

losetup -l | grep /tank/test/zpool

Now create your pool using either the file directly or the loop device:

# Using the file directly
sudo zpool create testpool /tank/test/zpool

# Or using the loop device (better)
sudo zpool create testpool /dev/loopX

Check your new pool's status:

zpool status testpool

You should see your file or loop device listed as the pool's storage.

Remember that file-based ZFS pools:

  • Are significantly slower than physical devices
  • Should only be used for testing
  • May have unexpected behavior with certain ZFS features
  • Can be destroyed by simply deleting the backing file

When you're done testing:

sudo zpool destroy testpool
sudo losetup -d /dev/loopX  # if using loop device
rm /tank/test/zpool