延迟后自动暂停 luks 音量

延迟后自动暂停 luks 音量

任何人都知道我如何luksSuspend在未使用一段时间后自动在 luks 卷上执行此操作。我正在考虑只是安排一个命令crontab或其他东西,但如果我实际使用该卷,我不希望它暂停。

答案1

的目的luksSetup是在设备仍在使用中时使用,但您希望暂时锁定对其的所有访问,直到从外部源输入密码为止。因此,仅luksSetup在设备未使用时调用没有多大意义:如果未使用,则使用 关闭它luksClose

无法自动强制设备未在使用中并调用luksSuspend.如果您确实想挂起设备但仅当设备未在使用时,您可以执行以下操作: call luksSuspend,然后检查fuserlsof检查加密设备上文件系统上的任何已安装文件;如果文件系统正在使用中,请luksResume立即调用。这确实有很小的机会要求您输入密码。

要检测文件系统是否空闲,我建议搭载现有的自动挂载器,例如 autofs。

答案2

我已经制定了一组运行得相当好的脚本,但仍在寻找其他建议(如果有人有的话)。

我所做的是编写一个脚本来暂停 luks 卷,一个脚本发送一条wall消息,提醒所有用户(在终端)它即将被暂停,另一个脚本告诉它保持打开状态(通过写入文件位于 ) 中的保留路径/var/run。我使用 cron 每半小时运行一次自动挂起脚本,并在此之前 2 分钟运行“警报”脚本(它仅在卷实际打开时发出警报)。如果有人对这些脚本感兴趣,我可以发布它们,或者至少发布有关它们的更多详细信息。

答案3

我建议使用lsof以确定是否有任何正在运行的进程并将 PID 传递给pidstat分析 IO。从那里,我们将根据是否有任何进程正在访问 LUKS 卷的底层文件系统来了解挂起是否安全且是否可取。

这将使您可以自信地安排脚本,而不必担心损坏或进程以意外方式处理挂起。

#!/bin/bash

if [ ! $1 ] ; then
  echo "Usage: $0 device-path"
  exit 1
fi

DEVICE=$1

# Collect PIDs that are running on LUKS filesystem
pids=$(lsof $DEVICE | tail -n+2 | awk '{ print $2 }')

SUSPEND=1
if [ "$pids" ] ; then
  # Get the IO statistics of each process running from LUKS device
  pidactivity=$(echo -E "$pids" | tr "\n" "," | xargs pidstat -d -p)

  # Pull out only the IO fields of the pidstat response
  pidio=$(echo -E "$pidactivity" | tail -n+4 | awk '{ print $5 " " $6 }')

  # If there is IO going on for any of these PIDs, we should suspend
  for io in "$pidio" ; do
    for stat in $io ; do
      if [ `echo "$stat > 0" | bc` -gt 0 ] ; then
        SUSPEND=0
        break 2
      fi
    done
  done
fi

if [ $SUSPEND -eq 1 ] ; then
  cryptsetup luksSuspend $DEVICE
fi

相关内容