Буває, що ви носите із собою LUKS‑зашифрований флеш-накопичувач або диск і хочете, щоби він сам розблоковувався та монтувався щойно ви зайшли в систему. Без костилів із root‑скриптами, але надійно. Сьогодні покажу, як це зробити через udev (щоб мати стабільне правило для пристрою) і systemd‑user (щоб усе запускалося саме для вашого користувача після входу).

Що саме ми налаштуємо

Схема така: udev додасть дружній псевдонім для вашого LUKS‑розділу і права доступу користувачу, а systemd‑user (у сеансі користувача) підхопить появу пристрою й виконає команди для розблокування та монтування через udisks2. Це акуратний спосіб для автоматизація задач у робочому середовищі без зайвих привілеїв. Працюємо в термінал Linux, трохи використаємо bash скрипти; за бажанням можна доповнити логікою через cron та systemd timers.

Покрокова інструкція (How‑to)

1) Підготовка пакетів

Потрібні cryptsetup та udisks2 (вони дають зручну без root‑магiю через polkit).

# Debian/Ubuntu
sudo apt update
sudo apt install -y cryptsetup udisks2

# Fedora
sudo dnf install -y cryptsetup udisks2

# Arch
sudo pacman -S --needed cryptsetup udisks2

2) Знайдіть свій LUKS‑розділ

Підключіть накопичувач та подивіться ідентифікатори:

lsblk -f
# або
blkid

Занотуйте UUID розділу з типом crypto_LUKS, наприклад: UUID=1111-2222-3333-4444.

3) Створіть udev‑правило для стабільного імені

Дамо зручний псевдонім і доступ користувачу через uaccess (працює з polkit/seat‑настройками):

sudo nano /etc/udev/rules.d/99-luks-backup.rules

Вставте (замініть UUID на свій):

SUBSYSTEM=="block", ENV{ID_FS_UUID}=="1111-2222-3333-4444", \
  ENV{ID_FS_TYPE}=="crypto_LUKS", SYMLINK+="luks/backup_usb", TAG+="uaccess"

Перезавантажте правила й перевірте:

sudo udevadm control --reload
sudo udevadm trigger --subsystem-match=block
ls -l /dev/luks/backup_usb

4) Підготуйте ключ‑файл і додайте його до LUKS

Згенеруємо ключ у вашому $HOME та обмежимо права доступу:

mkdir -p ~/.keys
chmod 700 ~/.keys
umask 077
dd if=/dev/urandom of=~/.keys/backup_usb.key bs=64 count=1
chmod 600 ~/.keys/backup_usb.key

# Додайте ключ до LUKS (попросять ваш існуючий пароль):
sudo cryptsetup luksAddKey /dev/luks/backup_usb ~/.keys/backup_usb.key

Тепер диск можна розблоковувати без введення пароля — тільки цим ключем, який зберігається у вашому профілі.

5) Створіть systemd‑user юніти

Використаємо user‑інстанс systemd, що стартує після входу. Він відстежуватиме появу /dev/luks/backup_usb через Path‑юнiт і запускатиме сервіс із командами udisksctl.

mkdir -p ~/.config/systemd/user

Файл юніта backup-usb.service:

nano ~/.config/systemd/user/backup-usb.service
[Unit]
Description=Unlock and mount LUKS USB for %u

[Service]
Type=oneshot
ExecStart=/usr/bin/udisksctl unlock -b /dev/luks/backup_usb --key-file %h/.keys/backup_usb.key --no-user-interaction
# Ім'я маппера може відрізнятися; udisks створить /dev/dm-* і /dev/mapper/luks-... 
# Для надійності монтуємо через сам mapper, який udisks підкаже в stdout. Спрощено:
ExecStart=/usr/bin/bash -lc 'mapper=$(ls -1 /dev/mapper | grep -m1 luks- || true); if [ -n "$mapper" ]; then udisksctl mount -b /dev/mapper/$mapper; fi'
RemainAfterExit=yes

ExecStop=/usr/bin/bash -lc 'mapper=$(ls -1 /dev/mapper | grep -m1 luks- || true); if [ -n "$mapper" ]; then udisksctl unmount -b /dev/mapper/$mapper || true; fi'
ExecStop=/usr/bin/udisksctl lock -b /dev/luks/backup_usb || true

[Install]
WantedBy=default.target

Path‑юнiт, що стежить за появою пристрою (або вже підключеним пристроєм після входу):

nano ~/.config/systemd/user/backup-usb.path
[Unit]
Description=Watch LUKS USB device node for %u

[Path]
PathExists=/dev/luks/backup_usb
Unit=backup-usb.service

[Install]
WantedBy=default.target

Увімкніть і запустіть:

systemctl --user daemon-reload
systemctl --user enable --now backup-usb.path

# Перевірка статусу
systemctl --user status backup-usb.path backup-usb.service

Готово: після входу користувача, якщо диск підключений, відбудеться автоматичне розблокування і монтування. Якщо ви спочатку зайшли, а потім підключили диск — Path‑юнiт також спрацює.

6) (Необов'язково) Linger для роботи без входу

Якщо хочете, щоб автодія працювала навіть до входу (корисно для фонового сеансу), увімкніть lingering:

sudo loginctl enable-linger "$USER"

Альтернативні способи

  • crypttab + systemd‑automount: Додайте запис у /etc/crypttab і /etc/fstab з x-systemd.automount. Це зручно для серверів, але автодія не прив’язана до входу конкретного користувача.
  • udev → SYSTEMD_WANTS=... (system): udev може стартувати системний сервіс, який монтує диск. Мінус — потрібен root‑контекст або окремі polkit‑правила для користувача.
  • clevis/tang/TPM/FIDO2: Сучасні варіанти без ключ‑файлу. Складніше у налаштуванні, але зручно на корпоративних машинах.

GUI‑спосіб (udisks2 + GNOME Disks)

У GNOME Disks виберіть ваш LUKS‑розділ → піктограма шестерні → Установити параметри автозапуску/монтування → позначте «Розблоковувати при вході». Пароль можна зберегти в ключниці (keyring). Далі udisks2 і середовище робочого столу самі подбають про монтування при кожному вході користувача. Зручно, якщо не хочеться писати скрипти.

FAQ

Чому отримую «The name org.freedesktop.UDisks2 was not provided…»?
Установіть udisks2 і перезапустіть сесію. На серверах без GUI полісі polkit може вимагати підтвердження/правил.

«Not authorized to perform operation» при udisksctl?
Переконайтеся, що сесія графічна/локальна, є polkit‑агент (у більшості DE він є). Або додайте відповідні polkit‑правила, якщо це headless.

Як дізнатися точний mapper після unlock?
udisksctl unlock виводить рядок із шляхом. Можна парсити stdout або шукати перший /dev/mapper/luks-*, як у прикладі.

Чи безпечно тримати ключ‑файл у $HOME?
Так, якщо дозволи суворі (600) і $HOME зашифровано (наприклад, LUKS/LVM або fscrypt). Інакше розгляньте пароль у ключниці або апаратні методи (FIDO2/TPM).

Диск не монтується після «гарячого» від'єднання.
Спробуйте вручну: udisksctl unlock ... і udisksctl mount .... Перевірте journalctl --user -u backup-usb.service на помилки.

Можна зробити автоперемонтвання з іншими опціями (uid,gid,umask)?
Так, додайте до команди udisksctl mount параметр --options, наприклад: --options "uid=1000,gid=1000,umask=0077".

Порада від Kernelka

Замість зберігання ключа «як є» розгляньте зберігання його в менеджері паролів (pass) або в GnuPG‑зашифрованому файлі й розшифровуйте його одноразово при вході невеликим скриптом. Це трішки складніше, зате підсилює безпеку 🔐

Підсумок

  • udev дає стабільне ім’я пристрою та зручні права доступу.
  • systemd‑user запускає розблокування/монтування лише для активного користувача.
  • udisksctl спрощує роботу без root і добре дружить із polkit.
  • Ключ‑файл у $HOME потребує правильних дозволів і здорового глузду 🙂
  • Є зручна GUI‑альтернатива через GNOME Disks, якщо не хочете писати юніти.