- Вопрос или проблема
- Сценарий
- Проблема
- Конфигурация
- Доступ к точке монтирования при отсутствии внешнего устройства
- Нормальные процессы удаления
- Временное решение
- Монтирование внешнего устройства
- Другие проблемы
- Связанные
- Обновление август 2023
- Подготовка
- Настройка
- Результаты
- Заключение
- Ответ или решение
- Автоматическое монтирование LUKS-шифрованного внешнего USB устройства при вставке без ошибок или зависаний при загрузке, если оно отсутствует
- Проблемы и требования
- Текущая конфигурация
- Решение
- 1. Настройка udev
- 2. Скрипт автоматизации
- Заключение
Вопрос или проблема
Сценарий
Иметь внешнее устройство, зашифрованное с помощью LUKS, которое автоматически монтируется при вставке и не создает проблем, если его нет при загрузке.
Большинство вопросов на эту тему касаются монтирования при загрузке – это НЕ то, что я пытаюсь сделать
Кроме того, точка монтирования должна быть защищена от случайной записи, когда USB-устройство отсутствует, и я могу сделать это с помощью chattr +i <mountpoint>
Проблема
-
Когда внешнее устройство НЕ монтируется, любая попытка доступа к точке монтирования зависает до истечения времени ожидания – это может вызвать нестабильность системы.
-
Когда устройство вставлено, запрашивается парольная фраза, и устройство разблокируется, но не монтируется. Затем мне нужно вручную монтировать устройство с помощью
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
должен выполнять следующие задачи:
- Разблокировать LUKS-устройство:
- Монтировать файловую систему:
cryptsetup luksOpen /dev/sdX fit --key-file /path/to/keyfile
mount /dev/mapper/fit /mnt/backup
Обязательно предоставьте права на выполнение этого скрипта:
chmod +x /path/to/your/script.sh
Заключение
Использование udev
в сочетании с правильной настройкой LUKS и cryptsetup
позволяет достигнуть автоматического монтирования шифрованных устройств при их подключении. Это решение уменьшает вероятность ошибок и зависаний при загрузке системы, предоставляя дополнительно возможность гибко управлять доступом к точкам монтирования. Следуя описанным шагам, вы сможете достичь желаемой автоматизации и упростить управление внешними шифрованными устройствами.