我有一台虚拟化的 CentOS 7 服务器,需要挂载多个受密码保护的加密卷。我无法在启动时自动映射设备,因为我在启动过程中无法访问控制台来输入解密密码。重新启动系统后,我必须手动运行
cryptsetup luksOpen <device> <name>
将每个底层块设备映射到加密设备。这需要记录每个底层块设备的 UUID 及其映射到的名称。有没有简单的方法可以自动执行此过程?我可以使用/etc/crypttab
关键字添加信息noauto
以防止设备在启动时安装。但是,我无法让 cryptsetup 使用此文件中的信息。
如果有这样的命令cryptsetup luksOpen <name>
可以读取并查找底层块设备的名称(类似于在中定义的/etc/crypttab
方式),那就太好了。mount <mountpoint>
/etc/fstab
有什么方法可以让 cryptsetup 读取映射吗/etc/crypttab
?
答案1
您可以使用
sudo systemctl start systemd-cryptsetup@<name>
代替
cryptsetup luksOpen UUID=... <name>
当你的 /etc/crypttab 中有如下条目时:
<name> UUID=... none noauto
如果需要,它会提示您输入密码。
相应的单元文件由systemd-cryptsetup-generator。
您可以使用列出所有生成的单元文件
systemctl list-unit-files| grep systemd-cryptsetup
答案2
看一下cryptdisks_start和cryptdisks_stop,他们确实这么做了。
# cryptdisks_start <name>
# mount <mountpoint>
...stuff...
# umount <mountpoint>
# cryptdisks_stop <name>
答案3
我想你想尝试一下systemd-cryptsetup-generator
。
通常,此进程在 initramfs 启动期间运行,以动态生成解密每个块设备的 systemd 单元列在 中/etc/crypttab
。然后您可以随时启动这些单元,并且系统会提示您输入任何必要的密码。
由于这是虚拟机,您可以应该可以访问虚拟控制台,这意味着您可以正常加密文件系统并在启动时提供密码。当然,加密文件系统的安全性无论如何都会受到损害,只需在虚拟机中使用即可,无论何时输入密码。
答案4
我专门为这种情况编写了一个 bash 脚本,
它会解析crypttab
以检索要打开/关闭的设备的 uuid,
然后用于fstab
存储挂载选项。
按照惯例,我将加密设备安装在根文件夹中名为 的设备节点/dev/mapper
但大写的目录中;
例如,名为xsnl
crypttab 的设备将安装在 上/Xsnl
。
注意:您需要在和中使用noauto
选项。fstab
crypttab
#!/bin/bash
usage(){
echo "usage: ./crypt.sh [open|close] <encrypted_dev>"
}
OP=$1
TARGET=$2
# we bail out in case no first argument is passed
if [[ $OP != 'close' ]] && [[ $OP != 'open' ]]; then
usage
echo "Exiting: first argument must be either 'lock' or 'unlock'."
exit
fi
# we bail out in case no second argument is passed
if [[ -z $TARGET ]]; then
usage
echo "Exiting: second argument must be the name of the entry in fstab."
exit
fi
# our convention is to give same name to fstab mount point (upperfirst) and crypttab name (lower)
MAPPDEV=$(echo $TARGET | awk '{print tolower($0)}')
ENCRYPTED_DEV=$(sudo grep -w $MAPPDEV /etc/crypttab)
# we bail out if we don't match a device in crypttab
if [[ -z $ENCRYPTED_DEV ]]; then
usage
echo "Exiting: no device named $MAPPDEV found in crypttab."
exit
fi
SEC_FIELD=$( echo $ENCRYPTED_DEV | sed -r 's/\s+/ /g' | cut -d' ' -f2)
# now we have all the info,
# depending on $OP (operation mode) we decide what to do
if [[ $OP == 'close' ]]; then
sudo umount /$TARGET
sudo cryptsetup luksClose $MAPPDEV
exit
fi
# if we get here we need to open and mount
sudo cryptsetup luksOpen $SEC_FIELD $MAPPDEV
sudo mount /$TARGET