1. 25

  2. 10

    Nice to see other attempts than what I usually do:

    Instead of device unit files, fstab, crypttab generated stuff, I mainly just use udev rules, a systemd service to track and log execution and a simple script.

    Literally looks like:

    % cat /etc/udev/rules.d/99-backup-hd.rules 
    ACTION=="add" \
    , SUBSYSTEM=="block" \
    , TAG+="systemd" \
    , ENV{ID_FS_UUID}=="4a823890-8f07-411e-933e-e73004b02066" \
    , ENV{UDISKS_IGNORE}="1" \
    , ENV{SYSTEMD_WANTS}+="sys-backup.service
    % systemctl cat sys-backup.service
    # /etc/systemd/system/sys-backup.service
    Description=Do full system backup on harddrive insertion
    # I can disable backing up by removing this file
    ExecStart=/bin/sh /usr/local/sbin/sys-backup.sh
    % cat /usr/local/sbin/sys-backup.sh
    set -e
    cryptsetup open \
        --key-file /root/storage-keys/usb-"$disk_uuid".key \
        /dev/disk/by-uuid/"$disk_uuid" \
    mount -o compress=zstd /dev/mapper/luks-backup-"$disk_uuid" /backup
    btrfs-sxbackup run / /home /var
    umount /backup
    cryptsetup close luks-backup-"$disk_uuid"
    udisksctl power-off -b \

    The tricky thing with udev rules comes down to syntactic mistakes like assignment vs binary operator equality, ordering of rules and what environments they produce. It took me a nontrivial amount of time to learn that ENV{ID_FS_UUID} is only set in later rules. I wish udev would be updated with explicit “requires/provides” like syntax instead of trying to guess which glob sort order I have to contend with.

    1. 1

      That’s…that’s a really smart solution. Nice.

      If I ever buy an external harddrive again I’ll probably steal this idea and implement for my FreeBSD storage box.

    2. 3

      That’s a pretty cool solution. One thing I’d add to this service would be a “Nice” option so whatever you’re doing after connecting the drive is not affected too much by the process.