# Create a raidz zpool $ zpool create zroot raidz1 gpt/zfs0 gpt/zfs1 gpt/zfs2 # List ZPools $ zpool list NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT zroot 141G 106G 35.2G - 43% 75% 1.00x ONLINE - # List detailed information about a specific zpool $ zpool list -v zroot NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT zroot 141G 106G 35.2G - 43% 75% 1.00x ONLINE - gptid/c92a5ccf-a5bb-11e4-a77d-001b2172c655 141G 106G 35.2G - 43% 75% # Get status information about zpools $ zpool status pool: zroot state: ONLINE scan: scrub repaired 0 in 2h51m with 0 errors on Thu Oct 1 07:08:31 2015 config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 gptid/c92a5ccf-a5bb-11e4-a77d-001b2172c655 ONLINE 0 0 0 errors: No known data errors # Scrubbing a zpool to correct any errors $ zpool scrub zroot $ zpool status -v zroot pool: zroot state: ONLINE scan: scrub in progress since Thu Oct 15 16:59:14 2015 39.1M scanned out of 106G at 1.45M/s, 20h47m to go 0 repaired, 0.04% done config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 gptid/c92a5ccf-a5bb-11e4-a77d-001b2172c655 ONLINE 0 0 0 errors: No known data errors # Getting properties from the pool properties can be user set or system provided. $ zpool get all zroot NAME PROPERTY VALUE SOURCE zroot size 141G - zroot capacity 75% - zroot altroot - default zroot health ONLINE - ... # Setting a zpool property $ zpool set comment="Storage of mah stuff" zroot $ zpool get comment NAME PROPERTY VALUE SOURCE tank comment - default zroot comment Storage of mah stuff local $ zpool destroy test # Create dataset $ zfs create zroot/root/data $ mount | grep data zroot/root/data on /data (zfs, local, nfsv4acls) # Create child dataset $ zfs create zroot/root/data/stuff $ mount | grep data zroot/root/data on /data (zfs, local, nfsv4acls) zroot/root/data/stuff on /data/stuff (zfs, local, nfsv4acls) # Create Volume $ zfs create -V zroot/win_vm $ zfs list zroot/win_vm NAME USED AVAIL REFER MOUNTPOINT zroot/win_vm 4.13G 17.9G 64K - # List all datasets $ zfs list NAME USED AVAIL REFER MOUNTPOINT zroot 106G 30.8G 144K none zroot/ROOT 18.5G 30.8G 144K none zroot/ROOT/10.1 8K 30.8G 9.63G / zroot/ROOT/default 18.5G 30.8G 11.2G / zroot/backup 5.23G 30.8G 144K none zroot/home 288K 30.8G 144K none ... # List a specific dataset $ zfs list zroot/home NAME USED AVAIL REFER MOUNTPOINT zroot/home 288K 30.8G 144K none # List snapshots $ zfs list -t snapshot zroot@daily-2015-10-15 0 - 144K - zroot/ROOT@daily-2015-10-15 0 - 144K - zroot/ROOT/default@daily-2015-10-15 0 - 24.2G - zroot/tmp@daily-2015-10-15 124K - 708M - zroot/usr@daily-2015-10-15 0 - 144K - zroot/home@daily-2015-10-15 0 - 11.9G - zroot/var@daily-2015-10-15 704K - 1.42G - zroot/var/log@daily-2015-10-15 192K - 828K - zroot/var/tmp@daily-2015-10-15 0 - 152K - $ zfs rename zroot/root/home zroot/root/old_home $ zfs rename zroot/root/new_home zroot/root/home # Datasets cannot be deleted if they have any snapshots $ zfs destroy zroot/root/home # Get all properties $ zfs get all zroot/usr/home NAME PROPERTY VALUE SOURCE zroot/home type filesystem - zroot/home creation Mon Oct 20 14:44 2014 - zroot/home used 11.9G - zroot/home available 94.1G - zroot/home referenced 11.9G - zroot/home mounted yes - ... # Get property from dataset $ zfs get compression zroot/usr/home NAME PROPERTY VALUE SOURCE zroot/home compression off default # Set property on dataset $ zfs set compression=lz4 zroot/lamb # Get a set of properties from all datasets $ zfs list -o name,quota,reservation NAME QUOTA RESERV zroot none none zroot/ROOT none none zroot/ROOT/default none none zroot/tmp none none zroot/usr none none zroot/home none none zroot/var none none ... # Create a snapshot of a single dataset zfs snapshot zroot/home/sarlalian@now # Create a snapshot of a dataset and its children $ zfs snapshot -r zroot/home@now $ zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT zroot/home@now 0 - 26K - zroot/home/sarlalian@now 0 - 259M - zroot/home/alice@now 0 - 156M - zroot/home/bob@now 0 - 156M - ... # How to destroy a snapshot $ zfs destroy zroot/home/sarlalian@now # Delete a snapshot on a parent dataset and its children $ zfs destroy -r zroot/home/sarlalian@now # Rename a snapshot $ zfs rename zroot/home/sarlalian@now zroot/home/sarlalian@today $ zfs rename zroot/home/sarlalian@now today $ zfs rename -r zroot/home@now @yesterday # CD into a snapshot directory $ cd /home/.zfs/snapshot/ # Backup a snapshot to a file $ zfs send zroot/home/sarlalian@now | gzip > backup_file.gz # Send a snapshot to another dataset $ zfs send zroot/home/sarlalian@now | zfs recv backups/home/sarlalian # Send a snapshot to a remote host $ zfs send zroot/home/sarlalian@now | ssh root@backup_server 'zfs recv zroot/home/sarlalian' # Send full dataset with snapshots to new host $ zfs send -v -R zroot/home@now | ssh root@backup_server 'zfs recv zroot/home' # Clone a snapshot $ zfs clone zroot/home/sarlalian@now zroot/home/sarlalian_new # Promoting the clone so it is no longer dependent on the snapshot $ zfs promote zroot/home/sarlalian_new #!/bin/sh echo "==== Stopping the staging database server ====" jail -r staging echo "==== Cleaning up existing staging server and snapshot ====" zfs destroy -r zroot/jails/staging zfs destroy zroot/jails/slave@staging echo "==== Quiescing the slave database ====" echo "FLUSH TABLES WITH READ LOCK;" | /usr/local/bin/mysql -u root -pmyrootpassword -h slave echo "==== Snapshotting the slave db filesystem as zroot/jails/slave@staging ====" zfs snapshot zroot/jails/slave@staging echo "==== Starting the slave database server ====" jail -c slave echo "==== Cloning the slave snapshot to the staging server ====" zfs clone zroot/jails/slave@staging zroot/jails/staging echo "==== Installing the staging mysql config ====" mv /jails/staging/usr/local/etc/my.cnf /jails/staging/usr/local/etc/my.cnf.slave cp /jails/staging/usr/local/etc/my.cnf.staging /jails/staging/usr/local/etc/my.cnf echo "==== Setting up the staging rc.conf file ====" mv /jails/staging/etc/rc.conf.local /jails/staging/etc/rc.conf.slave mv /jails/staging/etc/rc.conf.staging /jails/staging/etc/rc.conf.local echo "==== Starting the staging db server ====" jail -c staging echo "==== Makes the staging database not pull from the master ====" echo "STOP SLAVE;" | /usr/local/bin/mysql -u root -pmyrootpassword -h staging echo "RESET SLAVE;" | /usr/local/bin/mysql -u root -pmyrootpassword -h staging