## ZFS ### Update / Upgrade ```bash sudo apt update && sudo apt upgrade -y ``` ### Enable the contrib repository ```bash sudo nano /etc/apt/sources.list ``` ```bash #deb cdrom:[Debian GNU/Linux 13.3.0 _Trixie_ - Official amd64 NETINST with firmware 20260110-10:59]/ trixie contrib main non-free-firmware deb http://deb.debian.org/debian/ trixie main contrib non-free-firmware deb-src http://deb.debian.org/debian/ trixie main contrib non-free-firmware deb http://security.debian.org/debian-security trixie-security main contrib non-free-firmware deb-src http://security.debian.org/debian-security trixie-security main contrib non-free-firmware # trixie-updates, to get updates before a point release is made; # see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports deb http://deb.debian.org/debian/ trixie-updates main contrib non-free-firmware deb-src http://deb.debian.org/debian/ trixie-updates main contrib non-free-firmware # This system was installed using removable media other than # CD/DVD/BD (e.g. USB stick, SD card, ISO image file). # The matching "deb cdrom" entries were disabled at the end # of the installation process. # For information about how to configure apt package sources, # see the sources.list(5) manual. ``` ### Refresh package index and install ZFS ```bash sudo apt update && sudo apt install linux-headers-6.12.85+deb13-amd64 zfsutils-linux -y sudo modprobe zfs sudo reboot ``` ### Verify ZFS Installation ```bash lsmod | grep zfs zfs --version zpool --version ``` ### Creating and Using a ZFS Pool & Datasets Once ZFS is installed, you can create pools (zpools) and datasets. Below is a typical example. #### Identify disks / partitions List available block devices: ```bash lsblk sudo blkid ``` Create a mirrored pool named *tank* using /dev/sda and /dev/sdb: ```bash sudo zpool create \ -o ashift=12 \ -o autotrim=on \ tank mirror /dev/sda /dev/sdb ``` Explanation: ashift=12 sets a 4KiB sector alignment (useful for modern drives/SSDs). autotrim=on enables automatic trimming (on SSDs). mirror defines redundancy — you could also use raidz, raidz2, etc. You can also check pool properties: ```bash sudo zpool get all tank ``` Within the pool, create datasets: ```bash sudo zfs create tank/cloud # sudo zfs create tank/data # sudo zfs create tank/data/projects # sudo zfs create tank/data/backups ``` Datasets behave like sub-filesystems; you can set properties on each. Example: enable compression and disable atime: ```bash sudo zfs set compression=lz4 tank/data sudo zfs set atime=off tank/data ``` #### Mountpoints > By default, datasets are mounted under /tank/..., but you can set mountpoint property: ```bash sudo mkdir -p /mnt/cloud sudo zfs set mountpoint=/mnt/cloud tank/cloud ``` To list datasets and their mountpoints: ```bash zfs list ``` #### Using snapshots & rollbacks ```bash sudo zfs snapshot tank/data@before-update ``` Roll back: ```bash sudo zfs rollback tank/data@before-update ``` Send/receive snapshots for backups: ```bash sudo zfs send tank/data@before-update | ssh user@backuphost "zfs receive backup/data" ``` #### Mounting, Autostart, and Integration > ZFS datasets are managed by ZFS itself; the mount/unmount is handled automatically by the ZFS service at boot (once ZFS is loaded). Ensure that ZFS mounting is enabled via systemd or init scripts: ```bash sudo systemctl enable zfs-zed sudo systemctl enable zfs-mount sudo systemctl enable zfs-import-cache ``` PS : on Debian, the installation of zfs-zed may already set up the necessary services. You can configure /etc/zfs/zfs-list.cache (automatically generated) for faster mounting.