【问题标题】:How to check that an encrypted disk was previously open using cryptsetup?如何使用 cryptsetup 检查加密磁盘之前是否打开过?
【发布时间】:2022-03-17 00:01:26
【问题描述】:

我正在编写一个 shell 脚本(仅适用于 Ubuntu),它假定磁盘先前已打开(使用以下命令)以对其进行操作(resize2fs、lvcreate、...) .但是,情况可能并非总是如此,当磁盘关闭时,脚本的用户必须在运行脚本之前运行此行,询问他/她的密码:

sudo cryptsetup luksOpen /dev/sdaX sdaX_crypt

理想情况下,脚本应以该命令开头,从而简化用户顺序。但是,如果磁盘确实已经打开,则脚本将失败,因为加密磁盘无法打开两次。

如何检查磁盘之前是否打开过?检查/dev/mapper/sdX_crypt 是否存在有效的解决方案/是否足够?如果不能或不可能,有没有办法让命令仅在必要时运行?

【问题讨论】:

    标签: shell ubuntu encryption


    【解决方案1】:

    我也建议使用 lsblk - 但因为我来这里是为了找到一些相关信息,所以我确实找到并认为我也会在这里发布以下命令:

    #: cryptsetup status <device> | grep -qi active
    

    干杯

    【讨论】:

    • 也许 cryptsetup 已更改,但现在 'cryptsetup status' 需要映射的 ,而不是设备路径。在手册中确认,并通过测试(Debian Buster, cryptsetup 2:2.3.5-1~bpo10+1)
    • 小心该命令。 sudo cryptsetup status luksBackup | grep -iq 'is active' 当卷未处于活动状态时,cryptsetup 的输出仍与传递给 grep 的 active 模式匹配:/dev/mapper/volumeName is inactive.
    【解决方案2】:

    由于找不到更好的解决方案,我继续选择“检查设备是否存在”。

    加密磁盘嵌入了一个特定的卷组(例如称为my-vg),所以我的工作解决方案是:

    if [ ! -b /dev/my-vg ]; then
      sudo cryptsetup luksOpen /dev/sdaX sdaX_crypt
    fi
    

    我检查了/dev/my-vg 存在而不是/dev/mapper/sda_cryptX,因为我脚本中的所有其他命令都使用第一个命令作为参数,所以我保留它以保持一致性,但我认为下面的这个解决方案看起来更加封装:

    if [ ! -b /dev/mapper/sdaX_crypt ]; then
      sudo cryptsetup luksOpen /dev/sdaX sdaX_crypt
    fi
    

    虽然我上面描述的解决方案对我有用,但我是否有充分的理由应该切换到后一种解决方案,或者没关系?

    【讨论】:

      【解决方案3】:

      您可以使用 lsblk 命令。

      如果磁盘已经解锁,它将显示两行:设备和映射设备,其中映射设备的类型应为 crypt。

      # lsblk -l -n /dev/sdaX
      sdaX   253:11   0   2G  0  part
      sdaX_crypt (dm-6) 253:11   0   2G  0  crypt
      

      如果磁盘尚未解锁,则只会显示设备。

      # lsblk -l -n /dev/sdaX
      sdaX   253:11   0   2G  0  part
      

      【讨论】:

      • lsblk 的一个优点是它提供了设备路径和映射名称之间的映射,以防你不知道它。
      【解决方案4】:
      cryptsetup status volumeName
      echo $? # Exit status should be 0 (success).
      

      如果您想避免显示cryptsetup 输出,可以将其重定向到/dev/null。

      cryptsetup status volumeName > /dev/null
      echo $? # Exit status should be 0 (success).
      

      这是我昨晚为拍摄每日快照而编写的脚本中的 sn-p。

      DEVICE=/dev/sdx
      HEADER=/root/luks/arch/sdx-header.img
      KEY_FILE=/root/luks/arch/sdx-key.bin
      VOLUME=luksHome
      MOUNTPOINT=/home
      SUBVOLUME=@home
      
      # Ensure encrypted device is active.
      cryptsetup status "${VOLUME}" > /dev/null
      IS_ACTIVE=$?
      
      while [[ $IS_ACTIVE -ne 0 ]]; do
          printf "Volume '%s' does not seem to be active. Activate? [y/N]\n" $VOLUME
          read -N 1 -r -s
      
          if [[ $REPLY =~ ^[Yy]$ ]]; then
              cryptsetup open --header="${HEADER}" --key-file="${KEY_FILE}" "${DEVICE}" "${VOLUME}"
              IS_ACTIVE=$?
          else
              exit 0
          fi
      done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-25
        • 2016-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多