luksSuspend
Luksボリュームをしばらく使用しなかった後に自動的にこれを行う方法を知っている人がいます。コマンドcrontab
や他のものを予約しようとしていますが、実際にボリュームを使用している場合は一時停止したくありません。
答え1
デバイスの使用中に使用するようになっていますが、luksSetup
外部ソースからパスワードを入力するまで、そのデバイスへのすべてのアクセスを一時的にロックしたいと思います。したがって、luksSetup
デバイスを使用していないときに単に呼び出すことはあまり意味がありません。使用しない場合は、デバイスを閉じるために使用してくださいluksClose
。
デバイスを自動的に使用せずに呼び出す方法はありませんluksSuspend
。デバイスを使用していない場合にのみデバイスを一時停止したい場合は、次のことができます。呼び出して、luksSuspend
マウントされた項目を確認してくださいfuser
。lsof
暗号化されたデバイスのファイルシステム上のファイル。ファイルシステムが使用されている場合は、luksResume
すぐに呼び出してください。実際、パスワードを入力するように求められる可能性はほとんどありません。
ファイルシステムが使用可能であることを確認するには、autofs などの既存の自動マウントをピギーバックすることをお勧めします。
答え2
私は合理的にうまく動作する一連のスクリプトを書いていますが、誰かがあればまだ別の提案を探しています。
私がしたことは、luksボリュームを一時停止するスクリプトを書くことでした。あるスクリプトはwall
(端末で)すべてのユーザーに一時停止することを知らせるメッセージを送信し、もう一方のスクリプトはボリュームを開いたままにするように指示します(保存ボリュームに書き込む)。ファイルがあるパス)/var/run
。 cronを使用して30分ごとに自動サスペンドスクリプトを実行し、その2分前に「警告」スクリプトを実行します(ボリュームが実際に開いている場合にのみ警告します)。誰もがこのスクリプトに興味がある場合は、投稿するか、少なくともこれについての詳細を投稿できます。
答え3
lsof
IOを使用して実行中のプロセスがあることを確認し、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