ZFS

From Leo's Notes
This page was last edited on 15 April 2013, at 17:02.

This will be a quick overview on how to manage ZFS snapshots and volumes on a FreeBSD 9.0 system, but it should apply to Solaris as well.

A Few Assumptions

Suppose that my system has the following drives.

  1. ada0 WDC WD20EARS-00J99B0
    • 3907029168 512 byte sectors
  2. ada2 WDC WD20EARS-00J99B0
    • 3907029168 512 byte sectors
  3. ada3 ST2000DM001-9YN164
    • 3907029168 512 byte sectors
  4. ada4 ST2000DL003-9VT166
    • 3907029168 512 byte sectors
  5. ada5 ST2000DM001-9YN164
    • 3907029168 512 byte sectors

Note: Find out what your disks are by running camcontrol devlist and fdisk


Creating a ZFS Volume

Since disk sizes may vary from one manufacturer to another, it's a good idea to not use the entire disk (See http://www.freebsddiary.org/zfs-with-gpart.php). Suppose that we want to put a 201MB buffer at the end of each disk, we would then need to do some calculations.

Convert 201 Megabytes into sectors:
   201 Megabytes / 512 bytes / sector  =  411648 sectors

Since our disks contains 3907029168 sectors, we would need to create a partition on each disk that has 3907029168 - 411648 (that is 3906617520) sectors. Please note that if you are using different disks with different sizes that you will need to adjust the calculation ( partition size = total sectors - 411648 ) accordingly.

# gpart add -b 2048 -s 3906617520 -t freebsd-zfs -l disk00 ada0
# gpart add -b 2048 -s 3906617520 -t freebsd-zfs -l disk01 ada2
# gpart add -b 2048 -s 3906617520 -t freebsd-zfs -l disk02 ada3
# gpart add -b 2048 -s 3906617520 -t freebsd-zfs -l disk03 ada4
# gpart add -b 2048 -s 3906617520 -t freebsd-zfs -l disk04 ada5

Once created, you should be able to create your new ZFS volume by running:

# zpool create -f storage raidz1 gpt/disk00 gpt/disk01 gpt/disk02 gpt/disk03 gpt/disk04
# zpool status
  pool: storage
 state: ONLINE
 scan: none requested
config:

        NAME            STATE     READ WRITE CKSUM
        storage         ONLINE       0     0     0
          raidz1-0      ONLINE       0     0     0
            gpt/disk00  ONLINE       0     0     0
            gpt/disk01  ONLINE       0     0     0
            gpt/disk02  ONLINE       0     0     0
            gpt/disk03  ONLINE       0     0     0
            gpt/disk04  ONLINE       0     0     0

errors: No known data errors

ZFS Snapshot

A ZFS snapshot is a read-only copy of the file system. It can be listed using the zfs list -t snapshot command.

# zfs list -t snapshot
NAME               USED  AVAIL  REFER  MOUNTPOINT
storage@20120820  31.4G      -  3.21T  -
storage@20120924   134G      -  4.15T  -
storage@20121028  36.2G      -  4.26T  -
storage@20121201  33.2M      -  4.55T  -

To create a new snapshot, run

zfs snapshot storage@today

Note that this will not consume additional space when created. It will however grow in size when data gets modified.

# zfs list -t snapshot
NAME               USED  AVAIL  REFER  MOUNTPOINT
storage@20120820  31.4G      -  3.21T  -
storage@20120924   134G      -  4.15T  -
storage@20121028  36.2G      -  4.26T  -
storage@20121201  33.2M      -  4.55T  -
storage@today         0      -  4.58T  -

Snapshot contents can be accessed through a special .zfs/snapshot/ directory. Each snapshot will contain a read-only copy of the data that existed when the snapshot was taken.

# ls /storage/.zfs/snapshot/
20120820/ 20120924/ 20121028/ 20121201/ today/

To roll back to a specific snapshot, run zfs rollback storage@yesterday. This will restore your volume to the snapshot state.

# zfs rollback storage@yesterday

To delete a specific snapshot, run zfs destroy storage@today. Note that this will not work if other volumes depend on it. eg: If you cloned it as another volume.

# zfs destroy storage@today

Data Integrity

One of the strengths of ZFS its resiliency thanks to its transactional file system. The only way data stored on a ZFS volume to be in an inconsistent state is through hardware failure or some sort of fault with the ZFS implementation. Similar to a fsck on ext file systems, a ZFS scrub provides a way to perform filesystem checking. To initiate a scrub, run:

# zpool scrub storage

Once the scrub process is underway, you can view its status by running:

# zpool status storage
  pool: storage
 state: ONLINE
 scan: scrub in progress since Mon Dec  3 23:54:53 2012
    18.3G scanned out of 6.05T at 211M/s, 8h20m to go
    0 repaired, 0.30% done
config:

        NAME            STATE     READ WRITE CKSUM
        storage         ONLINE       0     0     0
          raidz1-0      ONLINE       0     0     0
            gpt/disk00  ONLINE       0     0     0
            gpt/disk01  ONLINE       0     0     0
            gpt/disk02  ONLINE       0     0     0
            gpt/disk03  ONLINE       0     0     0
            gpt/disk04  ONLINE       0     0     0

errors: No known data errors

To stop a scrub process, run:

# zpool scrub -s storage