如何仅使用 `mount` 挂载 cryptsetup 容器?

Tob*_*ler 9 mount dm-crypt luks cryptsetup

我通过创建了一个加密的容器

#!/bin/bash
dd if=/dev/zero of=$1 bs=1 count=0 seek=$2
MAPPER=$(mktemp -up /dev/mapper)
LOOPDEV=$(losetup --find --show $1)
cryptsetup luksFormat $LOOPDEV
cryptsetup luksOpen $LOOPDEV $(basename $MAPPER)
mkfs.ext3 $MAPPER
cryptsetup luksClose $MAPPER
losetup -d $LOOPDEV
Run Code Online (Sandbox Code Playgroud)

例如,container指定给此脚本的文件将包含通过 .ext3 加密的 ext3 文件系统cryptsetup luksFormat

要安装它,我目前使用另一个脚本,例如dm.mount container /mnt/decrypted

#!/bin/bash
set -e
MAPPER=$(mktemp -up /dev/mapper)
LOOPDEV=$(losetup --find --show $1)
cryptsetup luksOpen $LOOPDEV $(basename $MAPPER) || losetup -d $LOOPDEV
mount $MAPPER $2 || (
  cryptsetup luksClose $MAPPER
  losetup -d $LOOPDEV
)
Run Code Online (Sandbox Code Playgroud)

并卸载它dm.umount /mnt/decrypted

#!/bin/bash
set -e
MAPPER=$(basename $(mount | grep $1 | gawk ' { print $1 } '))
LOOPDEV=$(cryptsetup status $MAPPER | grep device | gawk ' { print $2 } ')
umount $1
cryptsetup luksClose $MAPPER
losetup -d $LOOPDEV
Run Code Online (Sandbox Code Playgroud)

有很多冗余和手动抓取循环设备和映射器,这两者都可以保持匿名。有没有办法简单地做一些类似mount -o luks ~/container /mnt/decrypted(提示输入密码)和umount /mnt/decrypted简单的方法?


编辑基本上我对我上面的脚本很满意(虽然错误检查可以改进......),所以

如何-o luks=~/container-o loop ~/loopfile使用我编写的脚本类似地实现挂载选项?

这可以在不重写的情况下实现mount吗?或者,是否-t luks -o loop ~/container可以实施?

Tob*_*ler 6

事实上,修改mount是可能的,正如我从mount.ntfs-3g. 我只是在做猜测,但我怀疑mount -t sometype结果是调用mount.sometype $DEV $MOUNTPOINT $OPTIONS,请随时在此处纠正我或引用一些实际文档。特别是该选项-o loop已经处理过,因此不再需要lopsetup......

符号链接/创建挂载脚本为/sbin/mount.crypto_LUKS. 移除 loopdevice 部分,而只是使用-o loop开关。这是我的/sbin/mount.crypto_LUKS

#!/bin/bash
set -e
if [[ $(mount | grep ${2%%/} | wc -l) -gt 0 ]]; then
  echo "Path $2 is already mounted!" >&2
  exit 9
else
  MAPPER=$(mktemp -up /dev/mapper)
  cryptsetup luksOpen $1 $(basename $MAPPER)
  shift
  mount $MAPPER $* || cryptsetup luksClose $(basename $MAPPER)
fi
Run Code Online (Sandbox Code Playgroud)

现在我只需要运行mount -o loop ~/container /mnt/decryptedmount就会提示我输入密码,然后挂载容器,一旦容器关闭就会自动释放loopdevice。如果解密的文件系统无法挂载,容器将再次关闭,但您当然可以修改它。或者实现一些选项解析而不是将所有内容传递给mount.

我希望可以通过 实现同样的效果/sbin/umount.luks,但是umount /mnt/decrypted(即使使用-t crypto_LUKS)仍然只执行通常的卸载,让容器保持打开状态。如果你找到一种方法来umount调用我的dm.umount脚本,请告诉我......目前,umount不鼓励直接调用,因为你必须/dev/mapper手动找出名称cryptsetup luksClose $MAPPER。如果mount -o loop之前使用过,至少循环设备会自动释放......