Автоматическое подключение шифрованного внешнего USB-устройства LUKS при вставке устройства без ошибок или зависаний при загрузке, если отсутствует.

Вопрос или проблема

Сценарий

Иметь внешнее устройство, зашифрованное с помощью LUKS, которое автоматически монтируется при вставке и не создает проблем, если его нет при загрузке.

Большинство вопросов на эту тему касаются монтирования при загрузке – это НЕ то, что я пытаюсь сделать

Кроме того, точка монтирования должна быть защищена от случайной записи, когда USB-устройство отсутствует, и я могу сделать это с помощью chattr +i <mountpoint>

Проблема

  1. Когда внешнее устройство НЕ монтируется, любая попытка доступа к точке монтирования зависает до истечения времени ожидания – это может вызвать нестабильность системы.

  2. Когда устройство вставлено, запрашивается парольная фраза, и устройство разблокируется, но не монтируется. Затем мне нужно вручную монтировать устройство с помощью mount /mnt/backup или mount /dev/mapper/fit, что, похоже, правильно использует настройки fstab.

Конфигурация

# /etc/crypttab
fit   UUID=xxxxxxxx-xxxxx-xxxxxxxx-xxxxxxxxxx none luks,noauto
# /etc/fstab
/dev/mapper/fit    /mnt/backup   ext4    noatime,user,noauto,x-systemd.automount,x-systemd.device-timeout=5ms,x-systemd.mount-timeout=100ms    0   0

У меня есть флеш-накопитель Samsung Fit, если кто-то интересуется названием

Доступ к точке монтирования при отсутствии внешнего устройства

# Доступ к точке монтирования, когда диск НЕ подключен
andy@pop-os:mnt$ ll
ls: cannot access 'backup': No such device
total 0
d????????? ? ? ? ?            ? backup/

andy@pop-os:mnt$ mountpoint /mnt/backup
/mnt/backup is a mountpoint
# journalctl
Jan 21 16:33:34 pop-os systemd[1]: mnt-backup.automount: Got automount request for /mnt/backup, triggered by 5192 (ls)
Jan 21 16:33:34 pop-os systemd[1]: dev-mapper-fit.device: Job dev-mapper-fit.device/start timed out.
Jan 21 16:33:34 pop-os systemd[1]: Timed out waiting for device /dev/mapper/fit.
Jan 21 16:33:34 pop-os systemd[1]: Dependency failed for /mnt/backup.
Jan 21 16:33:34 pop-os systemd[1]: mnt-backup.mount: Job mnt-backup.mount/start failed with result 'dependency'.
Jan 21 16:33:34 pop-os systemd[1]: dev-mapper-fit.device: Job dev-mapper-fit.device/start failed with result 'timeout'.

Нормальные процессы удаления

# Абсолютный путь требуется, если не использовать sudo (`user` был установлен в fstab)
andy@pop-os:mnt$ umount /mnt/backup

andy@pop-os:mnt$ sudo cryptsetup close fit

andy@pop-os:mnt$ sudo eject /dev/sdx

Временное решение

Я могу размонтировать точку монтирования (хотя никакое устройство все равно не смонтировано), чтобы временно исправить эту проблему, но она снова появится после перезагрузки системы или после монтирования/размонтирования устройства снова.

andy@pop-os:mnt$ sudo umount backup

andy@pop-os:mnt$ ll
total 4.0K
drwxr-xr-x 2 root root 4.0K Jan 19 10:16 backup/

andy@pop-os:mnt$ lsattr
----i---------e------- ./backup

andy@pop-os:~$ mountpoint /mnt/backup
/mnt/backup is not a mountpoint

Если я использую noauto и не включаю x-systemd.automount, то я избегаю проблемы с тем, что каталог является точкой монтирования при загрузке, когда устройство отсутствует, но я также не получаю автоматическое монтирование – хотя устройство все равно разблокируется.

Монтирование внешнего устройства

Запрашивается парольная фраза, и устройство разблокируется

andy@pop-os:mnt$ lsblk -f
NAME            FSTYPE      FSVER    LABEL     UUID                                   FSAVAIL FSUSE% MOUNTPOINTS
sdb             crypto_LUKS 2                  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx                  
└─fit           ext4        1.0                yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy                  

andy@pop-os:mnt$ ll backup/
ls: cannot access 'backup/': No such device

Обратите внимание, что MOUNTPOINTS пуст

# journalctl -f
Jan 21 17:17:26 pop-os kernel: usb 6-2: new SuperSpeed USB device number 2 using xhci_hcd
Jan 21 17:17:26 pop-os kernel: usb 6-2: New USB device found, idVendor=090c, idProduct=1000, bcdDevice=11.00
Jan 21 17:17:26 pop-os kernel: usb 6-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Jan 21 17:17:26 pop-os kernel: usb 6-2: Product: Flash Drive FIT
Jan 21 17:17:26 pop-os kernel: usb 6-2: Manufacturer: Samsung
Jan 21 17:17:26 pop-os kernel: usb 6-2: SerialNumber: 0123456789123
Jan 21 17:17:26 pop-os kernel: usb-storage 6-2:1.0: USB Mass Storage device detected
Jan 21 17:17:26 pop-os kernel: scsi host7: usb-storage 6-2:1.0
Jan 21 17:17:26 pop-os mtp-probe[10452]: checking bus 6, device 2: "/sys/devices/pci0000:00/0000:00:08.1/0000:0b:00.4/usb6/6-2"
Jan 21 17:17:26 pop-os mtp-probe[10452]: bus: 6, device: 2 was not an MTP device
Jan 21 17:17:26 pop-os mtp-probe[10467]: checking bus 6, device 2: "/sys/devices/pci0000:00/0000:00:08.1/0000:0b:00.4/usb6/6-2"
Jan 21 17:17:26 pop-os mtp-probe[10467]: bus: 6, device: 2 was not an MTP device
Jan 21 17:17:29 pop-os kernel: scsi 7:0:0:0: Direct-Access     Samsung  Flash Drive FIT  1100 PQ: 0 ANSI: 6
Jan 21 17:17:29 pop-os kernel: sd 7:0:0:0: Attached scsi generic sg1 type 0
Jan 21 17:17:29 pop-os kernel: sd 7:0:0:0: [sdb] 501253132 512-byte logical blocks: (257 GB/239 GiB)
Jan 21 17:17:29 pop-os kernel: sd 7:0:0:0: [sdb] Write Protect is off
Jan 21 17:17:29 pop-os kernel: sd 7:0:0:0: [sdb] Mode Sense: 43 00 00 00
Jan 21 17:17:29 pop-os kernel: sd 7:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesnt support DPO or FUA
Jan 21 17:17:29 pop-os kernel:  sdb: sdb1
Jan 21 17:17:29 pop-os kernel: sd 7:0:0:0: [sdb] Attached SCSI removable disk
Jan 21 17:17:41 pop-os systemd[1]: Starting Cryptography Setup for fit...
Jan 21 17:17:41 pop-os systemd-cryptsetup[10585]: Volume fit already active.
Jan 21 17:17:41 pop-os systemd[1]: Finished Cryptography Setup for fit.
Jan 21 17:17:41 pop-os systemd[1]: Reached target Block Device Preparation for /dev/mapper/fit.
Jan 21 17:17:41 pop-os gnome-shell[3744]: Unable to mount volume 257 GB Encrypted: Gio.IOErrorEnum: Operation was cancelled
Jan 21 17:17:41 pop-os udisksd[1382]: Unlocked device /dev/sdb1 as /dev/dm-4

Заметте, что в предпоследней строке “Operation was cancelled” происходит непосредственно перед тем, как udisksd сообщает “Unlock device…”

Я пробовал это на двух разных устройствах, одно с шифрованием всего диска, другое с зашифрованным разделом, разницы нет.

Иногда немного позже…

andy@pop-os:mnt$ mount /mnt/backup
mount: /mnt/backup: /dev/mapper/fit already mounted on /mnt/backup.

… но обычно это просто монтирует устройство, как и ожидалось.

Другие проблемы

  • Если я не установлю x-systemd.device-timeout на значение намного меньше, чем стандартное 90 секунд, моя система будет медленно отвечать, а затем зависнет. Я думал, что systemd может быть не успевает обработать мою парольную фразу, но более длинные тайм-ауты, кажется, не помогали
  • Я скопировал конфигурацию со старой системы Ubuntu 22.04 на Pop!_OS 22.04, иногда я видел вопросительные знаки при отображении каталога в размонтированном состоянии, но автоматическое монтирование работало идеально. На старой системе я не устанавливал неизменяемый атрибут на точке монтирования.

Связанные

  • mount-error-when-automounting-a-luks-encrypted-usb-flashdrive – другие ошибки и метод монтирования
  • Автомонтирование USB-накопителей под Debian – используется немного другой метод с nofail вместо noauto, но, к сожалению, не отвечает на мой вопрос
  • Я могу получить больше информации с помощью systemctl show mnt-backup.mount, но это не помогло мне
  • В руководстве для fstab указано, что делать для внешних устройств, но эти настройки не автоматически монтируют устройство и вызывают остановку процесса загрузки

Итак, почему при доступе к точке монтирования система пытается получить доступ к устройству после его размонтирования, что приводит к ?????????, и почему оно не корректно автоматически монтируется, когда устройство вставлено? Между старым fstab и новой systemd я, кажется, не могу найти магические переменные.

Также было бы полезно узнать, почему система зависает, если я не установлю тайм-аут устройства?


Обновление август 2023

mount-vs-automount-systemd-units… объясняет ??? как то, что .automount блок открывает точку монтирования при доступе.

Мне все еще не удалось достичь желаемого поведения, и я думаю, что это связано с тем, что без конфигурации используется udev, и единственная проблема – возможность настроить каталог, используемый как точка монтирования. Как только делается запись в fstab, создаются блоки systemd в /run/systemd/generator, и поведение меняется.

На моей новой системе также, кажется, есть проблема с plymouth, так как это вызывает ошибки, в то время как systemd использует 100% CPU и зависает система. Это не происходит на моем старом ноутбуке.

Просто быстрая идея…

Возможно, используйте udev для запуска скрипта/приложения, которое создает каталог для вашей точки монтирования, а затем выполняет все команды cryptsetup. Этот скрипт может использовать ключ с USB-накопителя.

Попробуйте сделать все без использования fstab.

(извините за ответ, но я не могу комментировать ваш вопрос).

Я придумал решение, которое чуть ли не делает то, что я хотел.

Рекомендую попробовать это на запасных устройствах, чтобы ваши данные не были под угрозой

Первое, что нужно понимать, это то, как работает systemd-automount. Он не открывает и не монтирует устройство, когда оно подключено, а при доступе. Понимание этого делает настройку гораздо более понятной.

Второе, что следует отметить, это то, что документация (и даже некоторые утилиты) не были обновлены для мира systemd.

Учитывая эти два момента, вы должны знать, что systemd сканирует как /etc/crypttab, так и /etc/fstab и создает блоки mount, automount и service по мере необходимости. Эти блоки можно найти в /run/systemd/generator/

Большинство следующих команд требуют доступа через sudo.

Подготовка

Автомонтирование работает лучше всего, когда вы используете ключевой файл для разблокировки вашего контейнера LUKS.


Хотя это напрямую не относится к этому вопросу, нет необходимости в том, чтобы зашифрованный с помощью LUKS usb-накопитель содержал раздел. На самом деле, рекомендуется создать зашифрованное необработанное устройство (нужна ссылка)


Вы можете увидеть текущие ключевые слоты, а также полезно создать резервную копию заголовка.

cryptsetup luksDump /dev/sdX

cryptsetup luksHeaderBackup --header-backup-file /root/<name>-header-backup /dev/sdX

Затем создайте и добавьте новый ключевой файл

dd if=/dev/urandom of=/root/<name>-keyfile bs=512 count=1
chmod 0400 /etc/cryptsetup-keys.d/crypt-backup.key
cryptsetup luksAddKey /dev/sdX /etc/cryptsetup-keys.d/crypt-backup.key

У меня есть парольная фраза и ключевой файл, чтобы я мог автоматически монтировать свои устройства дома, но все равно иметь доступ к ним на других машинах, с которыми я не хотел бы делиться ключевым файлом.

Следующее, что я нашел действительно полезным, это добавить метку к заголовку luks (и, возможно, к файловой системе). Это возможно с версией luks 2, и метка видна systemd до открытия устройства (расшифровки).

Я использую стратегию резервного копирования blue/green и, маркируя оба внешних диска одинаковой меткой, я могу заставить их монтироваться в одном и том же месте. Поскольку для каждой записи в fstab создается блок монтирования, записи должны быть уникальными. Метка заголовка LUKS – единственное место, где я нашел возможность это сделать.

# cryptsetup config /dev/sdX --label <label>
cryptsetup config /dev/sda --label backup

# опционально: также маркировать содержащую файловую систему (должна быть открыта)
# e2label /dev/mapper/<label> <fs-label>
e2label /dev/mapper/backup fit

Обратите внимание, что это /dev/sdX, а не /dev/sdX1, если не использовать разделы.

Настройка

Хотя логично расположить /etc/crypttab первым, а /etc/fstab затем (потому что именно такой порядок вы бы использовали), systemd работает в обратном порядке. Когда вы пытаетесь получить доступ к точке монтирования, она ищет в fstab и находит соответствующую файловую систему. Когда она видит, что это /dev/mapper/something, она затем ищет в crypttab.

Хотя вы можете использовать что-то вроде LABEL, чтобы идентифицировать свой диск в crypttab, я не смог найти другой способ для работы автомонтирования, кроме как использовать /dev/mapper/ в fstab.

# /etc/crypttab
backup LABEL=backup                              /etc/cryptsetup-keys.d/crypt-backup.key luks,nofail

Это начинается с имени, которое вы хотите использовать для своего криптодиска, “backup” в этом примере. Затем вы должны указать устройство. Избегайте использования идентификаторов типа /dev/sdX, так как они могут измениться в зависимости от того, что вы также можете или не можете подключить к своей системе. UUID – хороший способ уникально идентифицировать устройство, но, как я уже говорил ранее, я хочу, чтобы больше одного устройства монтировалось одинаково, поэтому я использую LABEL. Затем укажите расположение ключевого файла или none, если вы хотите использовать парольную фразу. Наконец, параметры luks, чтобы идентифицировать его как устройство luks, и nofail, чтобы устройство было wanted, но не required при загрузке.

# /etc/fstab
/dev/mapper/backup /mnt/backup ext4   noatime,users,nofail,x-systemd.device-timeout=100ms,x-systemd.automount,x-systemd.idle-timeout=20min  0  0

Я уже говорил о необходимости использования /dev/mapper/backup, затем идет точка монтирования /mnt/backup, которая должна существовать, и тип файловой системы. Теперь о параметрах…

Прежде всего, noauto и auto ничего не делают в сочетании с x-systemd.automount. Я сказал, что некоторые документации устарели, вы не найдете nofail, если выполните man fstab, но это то, что вы хотите использовать. Опять же, это предотвращает сбой загрузки, если устройство отсутствует. На моей системе есть 90-секундный тайм-аут, если устройства требуются, но не найдены, однако вы можете полностью испортить свой обычный процесс загрузки и потребоваться диск восстановления, если не будете осторожны (возможно).

users позволяет устройству быть смонтированным и размонтированным любым пользователем. Обычно я устанавливаю user, чтобы когда я mount устройство, я мог также umount без sudo, но поскольку systemd выполняет монтирование, мы используем users. Учитывайте последствия этого для вашего собственного использования.

Теперь самое интересное: x-systemd.device-timeout=100ms. Когда я переходил в родительский каталог моей точки монтирования и делал ls -l, я получал множество ????????. Это systemd говорит, что там должно быть что-то, но оно не может это найти. Этот способ работы предотвращает запись чего-либо в точку монтирования, когда устройство отсутствует. Однако, вы не хотите ждать целый день, чтобы перечислить /mnt, если несколько устройств не подключены (как это обычно бывает). x-systemd.idle-timeout=20min является необязательным.

Результаты

Когда вы выполняете lsblk, или в первый раз пытаетесь получить доступ к устройству, оно может казаться отсутствующим. Но затем оно автоматически монтируется, и через секунду или две устройство готово к использованию.

lsblk
# NAME            TYPE  FSTYPE      FSVER      SIZE LABEL     MOUNTPOINTS
# sda             диск  crypto_LUKS 2        117.2G backup

ls -l /mnt/backup
# ls: невозможно получить доступ к '/mnt/backup': Нет такого устройства

ls -l /mnt/backup
total 24
# drwxrwxr-x 3 andy andy  4096 Sep  5  2023 desktop
# drwxrwxr-x 3 andy andy  4096 Sep  5  2023 desktop-backup
# drwx------ 2 root root 16384 Aug  4  2023 lost+found

lsblk
# NAME            TYPE  FSTYPE      FSVER      SIZE LABEL     MOUNTPOINTS
# sda             диск  crypto_LUKS 2        117.2G backup
# └─backup        crypt ext4        1.0      117.2G fit       /mnt/backup

ls /run/systemd/generator
# mnt-backup.automount
# mnt-backup.mount
# [email protected]

Возможно, вам потребуется выполнить systemctl daemon-reload и/или перезагрузить систему, чтобы блоки были сгенерированы.

Заключение

На это ушло у меня немного времени, чтобы разобраться, и надеюсь, что мое понимание правильное. Я уверен, что есть еще чему учиться, и если необходимы какие-либо исправления, пожалуйста, редактируйте/комментируйте.

Я только что добился этого, без udev или fstab.
Машина на Arch Linux, LTS ядро, SwayWM, если быть точным.

  • Сначала создайте ключевой файл на вашей системе, чтобы хранить пароль к вашему внешнему устройству. Все это взято из мощной Arch Wiki. Делайте это как root.
    dd bs=512 count=4 if=/dev/urandom of=/my_keyfile.bin
    chmod 000 /my_keyfile.bin
    cryptsetup luksAddKey /dev/sdb1 /my_keyfile.bin
    
  • В вашем /etc/crypttab укажите:
    blah  UUID=blah-blah-blah-blah  /my_keyfile.bin  noauto
    
  • Теперь, монтировать его или нет, оставьте на усмотрение вашего файлового менеджера.

Я использую pcmanfm-qt, который имеет режим демона, который вы можете запустить автоматически при загрузке (похоже, Thunar тоже это поддерживает). Итак, в настройках вашего файлового менеджера выберите, нужно ли автоматически монтировать съемные диски или нет.

Неважно, присутствует ли мой USB-SSD диск при загрузке или вставлен позже, он без проблем монтируется без пароля.

.

Ответ или решение

Автоматическое монтирование LUKS-шифрованного внешнего USB устройства при вставке без ошибок или зависаний при загрузке, если оно отсутствует

Сценарий подразумевает необходимость автоматического монтирования внешнего USB устройства, шифрованного с помощью LUKS, при его подключении, при этом избегая ошибок или зависания при загрузке системы, если устройство не подключено. Такой подход актуален для пользователей, которым требуется гибкое управление шифрованными данными, особенно в условиях, когда регулярное наличие устройства на старте системы не может быть гарантировано.

Проблемы и требования

  • Когда устройство не подключено и есть попытки доступа к точке монтирования, система может зависнуть до истечения времени ожидания, что вызывает нестабильность.
  • При подключении устройства система запрашивает пароль и разблокирует устройство, но автоматически его не монтирует. Необходимо вручную выполнять команду mount, чтобы воспользоваться настройками из fstab.
  • Защита точки монтирования от случайной записи в случае отсутствия устройства осуществляется командой chattr +i <mountpoint>.

Текущая конфигурация

Используются файлы конфигурации /etc/crypttab и /etc/fstab:

# /etc/crypttab
fit   UUID=xxxxxxxx-xxxxx-xxxxxxxx-xxxxxxxxxx none luks,noauto
# /etc/fstab
/dev/mapper/fit    /mnt/backup   ext4    noatime,user,noauto,x-systemd.automount,x-systemd.device-timeout=5ms,x-systemd.mount-timeout=100ms    0   0

Применение x-systemd.automount зачастую не требует указания noauto, однако в этой конфигурации обусловлено тем, чтобы избежать автоподключения устройства при загрузке системы, что обычно приводит к зависаниям.

Решение

Попробуйте использовать udev для автоматического запуска скрипта, который создаст директорию для вашей точки монтирования и выполнит команды для разблокировки устройства через cryptsetup. Таким образом, вы можете обойтись без использования fstab.

1. Настройка udev

Создайте файл правил для udev, например, /etc/udev/rules.d/99-usbbackup.rules:

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd?1", ATTR{size}=="501253132", RUN+="/path/to/your/script.sh"

Убедитесь, что идентификатор устройства и другие характеристики совпадают с необходимыми параметрами вашего устройства.

2. Скрипт автоматизации

Скрипт /path/to/your/script.sh должен выполнять следующие задачи:

  1. Разблокировать LUKS-устройство:
  2. cryptsetup luksOpen /dev/sdX fit --key-file /path/to/keyfile
    
  3. Монтировать файловую систему:
  4. mount /dev/mapper/fit /mnt/backup
    

Обязательно предоставьте права на выполнение этого скрипта:

chmod +x /path/to/your/script.sh

Заключение

Использование udev в сочетании с правильной настройкой LUKS и cryptsetup позволяет достигнуть автоматического монтирования шифрованных устройств при их подключении. Это решение уменьшает вероятность ошибок и зависаний при загрузке системы, предоставляя дополнительно возможность гибко управлять доступом к точкам монтирования. Следуя описанным шагам, вы сможете достичь желаемой автоматизации и упростить управление внешними шифрованными устройствами.

Оцените материал
Добавить комментарий

Капча загружается...