我的 Linux 文件服务器有四个 LUKS 加密的 USB-3 磁盘。将它们全部挂载起来有点令人困惑:虽然它们可能获得与上次相同的驱动器号,但也可能不同,这会导致一些反复试验。
为了安装它们,我通常会说这样的话(通常针对 c、d、e 和 f 中的每一个):
sudo cryptsetup open --type luks /dev/sdc d1
sudo mount /dev/mapper/d1 /d1
(请注意,这里的威胁场景是有人窃取了我的硬件。目标是当它断电时,需要我重新启动它。在我不在的时候文件服务器不提供文件是可以接受的。)
我可以在 中看到 UUID /dev/disk/by-uuid/
,尽管这些不是 LUKS UUID。我怀疑它们是稳定的。
我还看到了 USB 端口信息/dev/disk/by-path/
(不太好,取决于插入的位置)和 WWID /dev/disk/by-id/
。在这两种情况下,我都可以编写一个简短的脚本(手动运行),扫描熟悉的名称,用于sed
提取驱动器号,然后执行上面的两行来打开和安装卷。
但也许这个问题有更好的解决方案。有什么建议吗?
答案1
我会配置在/etc/crypttab中并使用 UUID 例如
usb1 UUID=d665864f-08e1-49ed-9adc-c608deadbeef
这将从相关磁盘配置 /dev/mapper/usb1。然后您可以使用 fstab 条目等来挂载东西。在启动期间,系统会提示输入密码以解锁磁盘,无需额外的脚本。
答案2
最后,我写了一个简短的 bash 脚本通过 UUID 挂载。
上面的链接将显示当前状态(可能包括死亡),所以今天的情况如下:
#!/bin/bash
# Mount all LUKS partitions that I know about that are connected to
# this machine but not already mounted.
luks_mount() {
# This is the UUID we can see before luksOpen.
uuid="$1"
# Where to mount it. Should be at the root of the root file
# system with no trailing slash. That is, /foo, not /foo/,
# /foo/bar or simply foo.
mount_point="$2"
if [ ! -d $mount_point ]; then
echo "$mount_point does not exist or is not a directory."
return
fi
root_id=$(stat -c '%D %m' /)
mount_id=$(stat -c '%D %m' "$mount_point")
if [ "$root_id" != "$mount_id" ]; then
echo "$mount_point is already mounted (is not part of the root filesystem)."
echo "$root_id != $mount_id"
return
fi
if [ ! -e /dev/disk/by-uuid/$uuid ]; then
echo "LUKS volume for $mount_point not available."
return
fi
drive_letter=$(stat /dev/disk/by-uuid/$uuid -c '%N' | \
sed -e 's/^.*sd//;' | \
tr -d "'")
device=/dev/sd$drive_letter;
mapping=$(echo $mount_point | tr -d /);
echo "Mounting $mount_point:"
sudo cryptsetup open --type luks $device $mapping;
sudo mount /dev/mapper/$mapping /$mapping;
}
luks_mount 4d4bc0a0-e67a-4f9b-8c70-05cfdbf9282c /jma-4t
luks_mount 4b824f8c-94d4-4655-8e56-67ead167ed4c /jma-3t
luks_mount 5d6777f0-f475-451e-bad8-3cdf6e80f7c5 /sb-4t
luks_mount 4ea3852f-8cdd-4ed9-898e-d86a851e0a9c /sb-3t