任何人都知道我如何luksSuspend
在未使用一段时间后自动在 luks 卷上执行此操作。我正在考虑只是安排一个命令crontab
或其他东西,但如果我实际使用该卷,我不希望它暂停。
答案1
的目的luksSetup
是在设备仍在使用中时使用,但您希望暂时锁定对其的所有访问,直到从外部源输入密码为止。因此,仅luksSetup
在设备未使用时调用没有多大意义:如果未使用,则使用 关闭它luksClose
。
无法自动强制设备未在使用中并调用luksSuspend
.如果您确实想挂起设备但仅当设备未在使用时,您可以执行以下操作: call luksSuspend
,然后检查fuser
或lsof
检查加密设备上文件系统上的任何已安装文件;如果文件系统正在使用中,请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