如何从挂载点判断一个分区是否是LUKS分区?

如何从挂载点判断一个分区是否是LUKS分区?

我知道可以使用该cryptsetup isLuks命令来查明分区是否为 LUKS 容器。我希望能够将此命令与 LUKS 容器的挂载点一起使用,因为我不能确定我知道分区的设备名称,如何在一个命令中执行此操作?

例如,我有一个 Luks 容器/dev/sda2,我用它打开它

$ cryptsetup luksOpen /dev/sda2 vault

然后我用

$ mount /dev/mapper/vault /mountpoint

此时我想知道/mountpointLuks 容器

$ cryptsetup isLuks -v /dev/sda2
Command successful.
$ cryptsetup isLuks -v /mountpoint
Command failed with code 15: Block device required
$ cryptsetup isLuks -v /dev/mapper/vault
Command failed with code 22: Device /dev/mapper/vault is not a valid LUKS device.

通常我会用它lsblk来获取挂载点的块设备,但这会返回路径/dev/mapper/vault

└─sda2   8:8    0   9.3G  0 part
  └─vault 252:0    0   9.3G  0 crypt /mountpoint

如果我能以某种方式解决/dev/mapper/vault/dev/sda2我就能够在cryptsetup isLuks命令中使用命令替换。

awk如果能找到比使用或解析输出更优雅的方法就太好了mount,但如果这是唯一的方法,那么我想它就可以起作用。

答案1

我也有同样的问题。就这样解决了。

lsblk -sJp | jq -r --arg dsk "/dev/mapper/disk_name" '.blockdevices | .[] | select(.name == $dsk) | .children | .[0] | .name'

返回例如/dev/sda2

答案2

这应该可行。它有点长,但使用 bash 函数可以简化它:

cryptsetup isLuks -v `df /mountpoint | tail -n1 | awk '{print $1;}'`

答案3

有人提到使用lsblk

这是一个相对简单的方法,但前提是你必须

alias lsblk2='lsblk -o type,name,label,partlabel,size,fstype,model,serial,wwn,uuid'

然后 lsblk 的输出将包含许多额外的有用信息,并且FSTYPE将显示crypto_LUKS并显示下面的结果分区。您还可以参考磁盘型号和序列号,我发现这很有用,可以帮助您了解事情的来龙去脉。

man lsblk并在之后添加任何-o您可能发现使其对您更有用的选项。

我认为这样......获得 Linux 当前看到的所有磁盘的简单可见树形列表......是最直接的方式,只需输入最少的内容即可知道哪些磁盘/分区是 luks 加密的,至少在crypto_LUKS我使用 RHEL 7.9 时会看到这样的显示。

答案4

这对我有用:

for part in $(lsblk -o NAME -ln | grep -E '^[^loop]'); do
    if cryptsetup isLuks /dev/$part 2> /dev/null; then
        lsblk /dev/$part -ln -o MOUNTPOINT
    fi
done

lsblk命令只有选项NAME,因此我们只会获取系统中分区的名称。它还-ln退出了标题和树形结构,因此是一个纯列表。该grep命令是可选的,它将跳过检查 snap 创建的循环分区。然后检查另一个lsblk被检测为 LUKS 的分区。

这很棘手,但 LUKS 适用cryptsetup于分区,而不是挂载点。如果您要在脚本中使用它,可以将其创建为函数以获得更好的练习。

相关内容