遅延後にLuksボリュームを自動的に一時停止します。

遅延後にLuksボリュームを自動的に一時停止します。

luksSuspendLuksボリュームをしばらく使用しなかった後に自動的にこれを行う方法を知っている人がいます。コマンドcrontabや他のものを予約しようとしていますが、実際にボリュームを使用している場合は一時停止したくありません。

答え1

デバイスの使用中に使用するようになっていますが、luksSetup外部ソースからパスワードを入力するまで、そのデバイスへのすべてのアクセスを一時的にロックしたいと思います。したがって、luksSetupデバイスを使用していないときに単に呼び出すことはあまり意味がありません。使用しない場合は、デバイスを閉じるために使用してくださいluksClose

デバイスを自動的に使用せずに呼び出す方法はありませんluksSuspend。デバイスを使用していない場合にのみデバイスを一時停止したい場合は、次のことができます。呼び出して、luksSuspendマウントされた項目を確認してくださいfuserlsof暗号化されたデバイスのファイルシステム上のファイル。ファイルシステムが使用されている場合は、luksResumeすぐに呼び出してください。実際、パスワードを入力するように求められる可能性はほとんどありません。

ファイルシステムが使用可能であることを確認するには、autofs などの既存の自動マウントをピギーバックすることをお勧めします。

答え2

私は合理的にうまく動作する一連のスクリプトを書いていますが、誰かがあればまだ別の提案を探しています。

私がしたことは、luksボリュームを一時停止するスクリプトを書くことでした。あるスクリプトはwall(端末で)すべてのユーザーに一時停止することを知らせるメッセージを送信し、もう一方のスクリプトはボリュームを開いたままにするように指示します(保存ボリュームに書き込む)。ファイルがあるパス)/var/run。 cronを使用して30分ごとに自動サスペンドスクリプトを実行し、その2分前に「警告」スクリプトを実行します(ボリュームが実際に開いている場合にのみ警告します)。誰もがこのスクリプトに興味がある場合は、投稿するか、少なくともこれについての詳細を投稿できます。

答え3

lsofIOを使用して実行中のプロセスがあることを確認し、PIDをpidstatIO分析に渡すことをお勧めします。ここでは、プロセスが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

関連情報