当我插入外部存储时,我需要自动将其安装为加密设备。
我怎样才能做到这一点?
答案1
问题是,为了让系统自动安装加密设备,该设备的密钥必须存储在同一系统的某个位置。因此,如果您的系统被盗,密钥可能会被泄露。如果这适合您,请继续阅读。
udev
是Linux的即插即用管理器;每当硬件连接(断开)时,它都会通过udev
并udev
负责将其放入/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
脚本有点复杂,因为您想要唯一地标识驱动器,而sda
、sdb
等名称、名称$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
此时$VNAME
就会有 USB 识别的设备名称。然后,您可以测试它是否是已知的加密卷,并编写适当的命令脚本来安装它。您还必须编写一个 umount 处理程序脚本,以便在断开连接后自动清理。
编写 udev 脚本存在很多危险,因为如果它们失败,可能会阻止 udev 工作并识别进一步的硬件更改。谨慎行事。