ZFS
The following creates a zfs pool with 2 mirrors of 2 disks each, with:
- LZ4 compression
- Linux ACLs
- Larger record size for media
- Snapshots with a retention policy:
- 4 every 15 minutes in the last hour
- 24 every hour in the last day
- 31 every day in the last month
- 8 every week in the last 2 months
- 12 every month in the last year (disabled for
/mnt/pool/media
)
- Scrub reports and alerts sent to ntfy
Installation
sudo apt install zfsutils-linux zfs-auto-snapshot
Creation
Find the IDs of the disks you want to use for the zfs pool:
sudo lsblk -o NAME,SIZE,SERIAL,LABEL,FSTYPE
NAME SIZE SERIAL LABEL FSTYPE
sda 18.2T 8LG7V8BA
sdb 14.6T 2CGREXTB
sdc 18.2T 8LG87T5A
sdd 14.6T 2CGPPSGB
Decide on a layout create the zfs pool using the disk IDs:
sudo mkdir -p /mnt/pool
sudo zpool create -o ashift=12 -m /mnt/pool pool mirror /dev/disk/by-id/ata-WDC_WUH722020BLE6L4_8LG7V8BA /dev/disk/by-id/ata-WDC_WUH722020BLE6L4_8LG87T5A mirror /dev/disk/by-id/ata-WDC_WUH721816ALE6L4_2CGREXTB /dev/disk/by-id/ata-WDC_WUH721816ALE6L4_2CGPPSGB
Configuration
Set the pool configuration:
sudo zfs set compression=lz4 pool
sudo zfs set acltype=posixacl pool
sudo zfs set xattr=sa pool
sudo zfs set aclinherit=passthrough pool
sudo zfs set atime=off pool
Create a filesystem under /mnt/pool/media
to configure it for media (larger record size and no monthly snapshots):
sudo zfs create pool/media
sudo zfs set recordsize=1M pool/media
sudo zfs set com.sun:auto-snapshot:monthly=false pool/media
Alerts
Pull the latest zed scripts that have ntfy support:
cd /etc/zfs/zed.d/
sudo mv /etc/zfs/zed.d/zed-functions.sh /etc/zfs/zed.d/zed-functions.sh.bak
sudo mv /etc/zfs/zed.d/zed.rc /etc/zfs/zed.d/zed.rc.bak
sudo wget https://raw.githubusercontent.com/openzfs/zfs/master/cmd/zed/zed.d/zed-functions.sh
sudo wget https://raw.githubusercontent.com/openzfs/zfs/master/cmd/zed/zed.d/zed.rc
sudo chmod 0644 /etc/zfs/zed.d/zed-functions.sh
sudo chmod 0600 /etc/zfs/zed.d/zed.rc
Edit /etc/zfs/zed.d/zed.rc
and set the following:
ZED_NOTIFY_VERBOSE=1
ZED_NTFY_TOPIC="zfs"
ZED_NTFY_URL="https://ntfy.domain.com"
Restart zed:
sudo systemctl daemon-reload
sudo systemctl restart zed
Test the alerts:
cd /tmp
dd if=/dev/zero of=sparse_file bs=1 count=0 seek=512M
sudo zpool create test /tmp/sparse_file
sudo zpool scrub test
Remove the test file:
zpool export test
rm sparse_file