Это более устойчиво:
TMPFILE=tmp.$$
mv -- "$file1" $TMPFILE && mv -- "$file2" "$file1" && mv -- $TMPFILE "$file2"
заключение в кавычки для предотвращения проблем с пробелами в именах файлов, оно использует tmp файл, и && делают следующую команду выполненной, только если предыдущее закончилось успешно.
Намерение luksSetup
должен использоваться, когда устройство все еще используется, но Вы хотите временно заблокировать все доступы к нему, пока пароль не вводится из внешнего источника. Таким образом не имеет большого смысла только звонить luksSetup
когда устройство не использовано: если это не использовано, закройте его с luksClose
.
Нет никакого способа атомарно осуществить это, устройство не используется, и звонить luksSuspend
. То, что можно сделать, если Вы действительно хотите приостановить устройство, но только если оно не используется, является вызовом luksSuspend
, затем сверьтесь fuser
или lsof
для любого смонтированного файла в файловой системе это находится на шифруемом устройстве; если файловая система используется, звонить luksResume
сразу. Это действительно имеет маленький шанс требования, чтобы Вы ввели пароль.
Чтобы обнаружить, неактивна ли файловая система, я рекомендую осуществить контрейлерные перевозки на существующей утилите автоматического монтирования, такой как autofs.
Я разработал ряд сценариев, которые работают обоснованно хорошо, но все еще ищут другие предложения, если у кого-либо есть кто-либо.
То, что я сделал, должно записать один сценарий, который приостанавливает объем удач, тот, который отправляет a wall
сообщение, предупреждая всех пользователей (на терминалах), что это собирается быть приостановленным, и то, которое говорит этому сохранять это открытым (путем записи в файл в зарезервированном пути в /var/run
). Я использовал крон для выполнения автоприостановить скрипта каждое полчаса и "аварийного" сценария 2 за минуты до того (он только выпускает предупреждение, если объем на самом деле открыт). Если кто-либо интересуется этими сценариями, я могу отправить их или по крайней мере больше деталей о них.
Я предлагаю использовать lsof
, чтобы определить, есть ли какие-либо запущенные процессы, и передать идентификаторы PID в pidstat
для анализа операций ввода-вывода. Оттуда мы узнаем, безопасно и желательно ли приостановить работу, в зависимости от того, обращаются ли какие-либо процессы к базовой файловой системе тома 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