Linux下如何让系统自动挂载加密设备

3 linux encryption mount

当我插入外部存储设备时,我需要将它自动挂载为加密设备。

我该如何做到这一点?

Law*_*ceC 5

问题在于,为了让系统自动挂载加密设备,该设备的密钥必须存储在同一系统的某个地方。因此,如果您的系统被盗,密钥可能会被泄露。如果这对您来说没问题,请继续阅读。

udev是Linux的即插即用管理器;任何时候硬件(断开)连接,它都会通过udevudev负责将它/dev放在某个目录中或做任何需要做的事情以使其被 Linux 的其余部分识别。通过深入研究udev工作原理,您会发现在连接 USB 大容量存储设备时可以运行脚本。

基本上你需要去/etc/udev/rules.d。此处的所有文件都udev在它(重新)启动时进行解析,并且这些文件可用于在连接某些设备时触发脚本。不要更改您在此处看到的任何内容,但我添加了z60_usbmount.rules以下内容:

KERNEL=="sd*", BUS=="usb", ACTION=="add", RUN+="/etc/local/usbmountcheck udev add $kernel $parent"

KERNEL=="sd*", ACTION=="remove", RUN+="/etc/local/usbmountcheck udev remove $kernel $parent"

因此,当通过 USB 连接任何外部驱动器时,该 usbmountcheck 脚本将运行,并udev放弃有关该设备的所有信息。

usbmountcheck脚本有点复杂,因为你要唯一标识的驱动器,以及sdasdb等名称,$kernel姓名,不会那么做的。这是我在脚本中包含的一些逻辑:

ACTION=$2
KVOL=$3
KVROOT=$4
# correlate volume name in /dev/disk/by-id with $KVOL, if we can
VNAME="`/bin/ls -l /dev/disk/by-id | /bin/grep $KVOL | /usr/bin/tr -s [[:space:]] ' ' | /usr/bin/cut -f 9 -d ' '`"
if [ "$?" != 0 ]; then
 die "error in pipeline that tries to get volume name, return code $?"
 fi
Run Code Online (Sandbox Code Playgroud)

此时$VNAME将具有 USB 标识的设备名称。然后您可以测试它是否是一个已知的加密卷,并编写适当的命令来安装它。您还必须编写 umount 处理程序的脚本,以便在断开连接后自动清理。

编写 udev 脚本有很多危险,因为如果它们失败,它可能会阻止 udev 工作并识别进一步的硬件更改。小心踩踏。