Table of Contents

ZFS Playground

This small demo shows the basic ZFS operations. You will need a Solaris 10 or OpenSolaris host and 1,2GB of disk space.

Preparation

First, go to a directory where you have enought space. We will need 1,2GB for 6 files of 200MB. The files are named like disks, but they are only files for this demo.

cd /var/tmp
mkfile 200m c0d0 c0d1 c0d2 c1d0 c1d1 c1d2

Create Pool

pfexec zpool create demo /var/tmp/c0d0 
zpool status
  pool: demo
 state: ONLINE
 scrub: none requested
config:
 
	NAME             STATE     READ WRITE CKSUM
	demo             ONLINE       0     0     0
	  /var/tmp/c0d0  ONLINE       0     0     0
 
errors: No known data errors

I will omit the errors: No known data errors in all following outputs.

Also, the rpool is also omitted.

Attach a second disk

This will attach a second disk to the existing, creating a mirror.

pfexec zpool attach demo /var/tmp/c0d0 /var/tmp/c0d1 
zpool status
  pool: demo
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Tue Aug 11 15:45:59 2009
config:
 
	NAME               STATE     READ WRITE CKSUM
	demo               ONLINE       0     0     0
	  mirror           ONLINE       0     0     0
	    /var/tmp/c0d0  ONLINE       0     0     0
	    /var/tmp/c0d1  ONLINE       0     0     0  73K resilvered

Note that the zpool status output now shows a mirror over two files.

Also note the resilver completed message. This tells you that the mirror is synchronized.

Replace a disk

In this example, I made the mistake of mirroring c0d0 to c0d1. I wanted to mirror c0d0 to c1d0, simulating mirroring two disks on different controllers. So, let's replace c0d1 with c1d0.

pfexec zpool replace demo /var/tmp/c0d1 /var/tmp/c1d0 
zpool status
  pool: demo
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Tue Aug 11 15:52:24 2009
config:
 
	NAME               STATE     READ WRITE CKSUM
	demo               ONLINE       0     0     0
	  mirror           ONLINE       0     0     0
	    /var/tmp/c0d0  ONLINE       0     0     0
	    /var/tmp/c1d0  ONLINE       0     0     0  83,5K resilvered

Note that the new “disk” c1d0 also had to be resilvered.

Expand the Pool by adding another disk

Now we add the “disk” c0d1 to the stripe, expanding the capacity of the pool.

pfexec zpool add demo /var/tmp/c0d1
invalid vdev specification
use '-f' to override the following errors:
mismatched replication level: pool uses mirror and new vdev is file

You have to force adding a vdev with a different redundancy. It's recommendend to have the same type of redundancy (none, mirror or raidz) for all vdevs in a pool. For this demo, we will ignore this recommendation.

pfexec zpool add -f demo /var/tmp/c0d1
zpool status
  pool: demo
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Tue Aug 11 15:52:24 2009
config:
 
	NAME               STATE     READ WRITE CKSUM
	demo               ONLINE       0     0     0
	  mirror           ONLINE       0     0     0
	    /var/tmp/c0d0  ONLINE       0     0     0
	    /var/tmp/c1d0  ONLINE       0     0     0  83,5K resilvered
	  /var/tmp/c0d1    ONLINE       0     0     0

You see that the pool demo consists of a mirror (c0d0 and c1d0) and a single file c1d0.

Mirror the second disk

We now attach a mirror to the second “disk”, which will bring us back to what we should have done in the step before.

pfexec zpool attach demo /var/tmp/c0d1 /var/tmp/c1d1 
zpool status
  pool: demo
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Tue Aug 11 15:57:30 2009
config:
 
	NAME               STATE     READ WRITE CKSUM
	demo               ONLINE       0     0     0
	  mirror           ONLINE       0     0     0
	    /var/tmp/c0d0  ONLINE       0     0     0
	    /var/tmp/c1d0  ONLINE       0     0     0
	  mirror           ONLINE       0     0     0
	    /var/tmp/c0d1  ONLINE       0     0     0
	    /var/tmp/c1d1  ONLINE       0     0     0  18,5K resilvered

The new disk also had to be resilvered.

Add a third Mirror to the Pool

This time, we will add two mirrored “disks” right away in one step.

pfexec zpool add demo mirror /var/tmp/c0d2 /var/tmp/c1d2 
zpool status
  pool: demo
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Tue Aug 11 15:57:30 2009
config:
 
	NAME               STATE     READ WRITE CKSUM
	demo               ONLINE       0     0     0
	  mirror           ONLINE       0     0     0
	    /var/tmp/c0d0  ONLINE       0     0     0
	    /var/tmp/c1d0  ONLINE       0     0     0
	  mirror           ONLINE       0     0     0
	    /var/tmp/c0d1  ONLINE       0     0     0
	    /var/tmp/c1d1  ONLINE       0     0     0  18,5K resilvered
	  mirror           ONLINE       0     0     0
	    /var/tmp/c0d2  ONLINE       0     0     0
	    /var/tmp/c1d2  ONLINE       0     0     0

Scrub the Pool

It's a good practice to run a scrub from time to time. The scrub will read all blocks of the pool and check the checksums. Any errors will be reported an corrected (if there is enough redundancy).

pfexec zpool scrub demo
zpool status
  pool: demo
 state: ONLINE
 scrub: scrub completed after 0h0m with 0 errors on Tue Aug 11 16:00:19 2009
config:
 
	NAME               STATE     READ WRITE CKSUM
	demo               ONLINE       0     0     0
	  mirror           ONLINE       0     0     0
	    /var/tmp/c0d0  ONLINE       0     0     0
	    /var/tmp/c1d0  ONLINE       0     0     0
	  mirror           ONLINE       0     0     0
	    /var/tmp/c0d1  ONLINE       0     0     0
	    /var/tmp/c1d1  ONLINE       0     0     0
	  mirror           ONLINE       0     0     0
	    /var/tmp/c0d2  ONLINE       0     0     0
	    /var/tmp/c1d2  ONLINE       0     0     0

In this case, the scrub didn't find any errors, so nothig needed to be repaired.

Clean Up

For now, we are finished. We destroy the pool and remove the files. Note that zpool status doesn't show the pool any more.

pfexec zpool destroy demo
zpool status
rm c[01]d[012]

to be continued…