当设备插入且没有错误或挂在启动时(如果不存在)时,自动安装 LUKS 加密的外部 USB

当设备插入且没有错误或挂在启动时(如果不存在)时,自动安装 LUKS 加密的外部 USB

设想

拥有使用 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 USB 闪存盘,如果有人想知道这个名字的话

当外部设备不存在时访问安装点

# Accessing the mountpoint when the drive is NOT plugged in
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'.

正常移除过程

# Absolute path is required if not using sudo (`user` was set in 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

请注意,倒数第二行“操作已取消”发生在 udisksd 报告“解锁设备...”之前。

我已经用两种不同的设备尝试过这一点,一种具有整个磁盘块加密,另一种具有加密分区,这没有什么区别。

有时过了一会儿...

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,在列出处于未安装状态的目录时有时会看到问号,但自动安装工作正常。在旧系统上,我没有在挂载点上设置不可变属性。

有关的


那么,为什么访问挂载点会在设备卸载后尝试访问该设备,导致?????????,以及为什么在插入设备时它不能正确自动挂载?在旧的 fstab 和新的 systemd 之间我似乎找不到神奇的变量。

如果我不设置设备超时,了解为什么系统崩溃也很有用?


2023 年 8 月更新

挂载与自动挂载 systemd 单元...解释了????当.automount设备尝试打开访问时的安装点时。

我仍然无法实现我想要的行为,并且想知道它是否因为没有配置任何内容而udev被使用,然后唯一的问题是能够自定义用作安装点的目录。一旦fstab创建了一个条目,/run/systemd/generator系统单元就会创建并且行为会发生变化。

我的新系统似乎也存在问题,因为plymouth当 systemd 使用 100% CPU 并挂起系统时,会出现错误。我的旧笔记本电脑上不会发生这种情况。

答案1

只是一个快速的想法...

也许用于udev启动脚本/应用程序,为您的安装点创建目录,然后执行所有 cryptsetup 操作。该脚本可能使用 USB 驱动器中的密钥。

尝试在不使用 fstab 的情况下完成所有操作。

(抱歉,我无法评论你的问题)。

答案2

我想出了一个解决方案,它几乎可以满足我的要求。

我建议在备用设备上尝试此操作,这样您的数据就不会面临风险

首先要了解的是如何systemd-automount工作。它不会在插入设备时打开并安装设备,而是在访问时打开和安装设备。理解这一点会使设置更容易理解。

第二件事要注意的是,文档(甚至一些实用程序)尚未更新systemd

考虑到这两件事,您应该知道systemd扫描/etc/crypttab和并根据需要/etc/fstab创建mountautomount和单位。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 v2 来说是可能的,并且在设备打开(解密)之前,标签对 systemd 是可见的。

我使用蓝/绿备份策略,并通过使用相同的标签标记两个外部驱动器,我可以将它们安装在同一位置。由于为 中的每个条目创建了一个安装单元fstab,因此条目必须是唯一的。 LUKS 标题标签是我发现唯一可以执行此操作的地方。

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

# optional: also label the containing filesytem (must be open)
# e2label /dev/mapper/<label> <fs-label>
e2label /dev/mapper/backup fit

请注意,当不使用分区时,它是/dev/sdX,而不是。/dev/sdX1

设置

虽然/etc/crypttab先列出然后再列出是有意义的/etc/fstab(因为这是您使用它们的顺序),但 systemd 是反向工作的。当您尝试访问挂载点时,它会查找fstab并找到关联的文件系统。当它看到它是/dev/mapper/某物时,它就会查看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以便该设备将被通缉但不是必需的在启动时。

# /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             disk  crypto_LUKS 2        117.2G backup

ls -l /mnt/backup
# ls: cannot access '/mnt/backup': No such device

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             disk  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和/或重新启动系统才能生成单元。

结论

这花了我一段时间才弄清楚,我希望我的理解是正确的。我确信还有更多东西需要学习,如果需要任何更正,请编辑/评论。

答案3

我刚刚实现了这一点,没有udevfstab。机器是Arch Linux,LTS内核,SwayWM,FWIW。

  • 首先在您的系统上创建一个密钥文件,以将密码存储到您的外部设备。这一切都来自强大的 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 驱动器是在启动时存在还是稍后插入,它都可以顺利地为我安装,无需密码。

相关内容