Этот вопрос связан с еще одним @Stefan, но он не является его дубликатом. Вопросы немного разные: автор просто хотел узнать, было ли это реализовано, а я прошу помощи конкретно о том, как это сделать (определенным образом). Кроме того, другой вопрос не получил полезных ответов для разработчиков, за исключением недавнего, который просто связан с моей попыткой сделать это.
Объяснив проблему «дублирования» ...
Я нахожусь на Ubuntu 14.04 с использованием полного шифрования диска (LVM поверх LUKS), и я хотел бы включить luksSuspend
в процедуру приостановки ( и позже используйте luksResume
), чтобы я мог приостановить работу в ОЗУ, не оставляя ключевой материал в памяти, а корневой каталог был разблокирован.
Я пытался портировать скрипт для Arch Linux , но пока безуспешно: я, честно говоря, понятия не имею, что я делаю ...
Может ли кто-нибудь помочь мне портировать это (или создать что-то подобное с нуля)? Или, по крайней мере, кто-нибудь может указать мне документацию о том, как подключить вещи к процедурам приостановки и как сохранить необходимые двоичные файлы и сценарии (такие как cryptsetup) доступными даже после того, как все операции ввода-вывода для root были заблокированы (luksSuspend
) ?
Что касается того, как сохранить необходимые двоичные файлы и сценарии, доступные для резюме, этот другой пост в блоге (также для Arch) скопировал их в /boot
; Однако я хотел бы использовать что-то еще в строках, которые использовал Вианни в сценарии, о котором я упоминал ранее, потому что этот подход выглядит немного более элегантным в этом аспекте.
Я многого не достиг, но мои разработки можно найти на GitHub .
Извините, что заявляю очевидное, но вы пытались добавить скрипт, содержащий команды cryptsetup luksSuspend / luksResume, в /usr/lib/pm-utils/sleep.d
? Если так, что случилось?
Мне показалось бы логичным вызывать службы остановки / запуска служб cryptdisks и cryptdisks_early в режиме гибернации / резюме. Подойдут ли вызовы cryptdisks_stop и cryptdisks_start в скрипте из pm-utils/sleep.d
? Я предполагаю, что это будет иметь тот же результат, что и прямой вызов cryptsetup luksSuspend
.
Самое близкое решение, которое мне удалось найти, - это сценарий доказательства концепции suspend.sh 2013 года Микко Раухала.
#!/bin/sh
# A proof of concept script for forgetting LUKS passwords on suspend
# and reasking them on resume.
# The basic idea is to copy all of the files necessary for luksResume
# onto a RAM disk so that we can be sure they'll be available without
# touching the disk at all. Then switch to a text VT to run the resume
# (easier to make sure it'll come up than to do the same with X).
# The suspend itself has to be done from the ramdisk too to make sure it
# won't hang. This is also a reason why this couldn't be reliably done as a
# self-contained /etc/pm/sleep.d script, so to make the concept clear
# (and because I'm lazy) I did just a minimal standalone proof of concept
# instead. Integrating the functionality into the usual pm tools would be
# encouraged. (Though suspend_pmu would apparently need perl on the ramdisk...)
# (C) 2013 Mikko Rauhala 2013, modifiable and distributable under
# CC0, GPLv2 or later, MIT X11 license or 2-clause BSD. Regardless
# of what you pick, there is NO WARRANTY of any kind.
RAMDEV=/dev/ram0
ROOT=/run/cryptosuspend
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# Cleanup not strictly necessary every time but good for development.
# Doing it before rather than after a suspend for debugging purposes
for a in "$ROOT"/dev/pts "$ROOT"/proc "$ROOT"/sys "$ROOT" ; do
umount "$a" > /dev/null 2>&1
done
if mount | grep -q "$ROOT" ; then
echo "Cleanup unsuccessful, cryptosuspend root premounted." 1>&2
exit 2
fi
if grep -q mem /sys/power/state; then
METHOD=mem
elif grep -q standby /sys/power/state; then
METHOD=standby
else
echo "No mem or standby states available, aborting" 1>&2
exit 1
fi
if ! mount | grep -q "$RAMDEV" ; then
mkfs -t ext2 -q "$RAMDEV" 8192
mkdir -p "$ROOT"
mount "$RAMDEV" "$ROOT"
mkdir "$ROOT"/sbin "$ROOT"/bin "$ROOT"/dev "$ROOT"/tmp "$ROOT"/proc "$ROOT"/sys
cp "$(which cryptsetup)" "$ROOT"/sbin
for a in $(ldd "$(which cryptsetup)" | grep "/" | cut -d / -f 2- | cut -d " " -f 1) ; do
mkdir -p "$ROOT""$(dirname /$a)"
cp "/$a" "$ROOT"/"$a"
done
cp "$(which busybox)" "$ROOT"/bin/
ln -s busybox "$ROOT"/bin/sh
ln -s busybox "$ROOT"/bin/sync
cp -a /dev "$ROOT"
mount -t proc proc "$ROOT"/proc
mount -t sysfs sysfs "$ROOT"/sys
mount -t devpts devpts "$ROOT"/dev/pts
fi
CRYPTDEVS="$(dmsetup --target crypt status | cut -d : -f 1)"
echo '#!/bin/sh' > "$ROOT"/bin/cryptosuspend
echo "sync" >> "$ROOT"/bin/cryptosuspend
echo "for a in $CRYPTDEVS ; do" >> "$ROOT"/bin/cryptosuspend
echo " cryptsetup luksSuspend \$a" >> "$ROOT"/bin/cryptosuspend
echo "done" >> "$ROOT"/bin/cryptosuspend
echo "echo -n \"$METHOD\" > /sys/power/state" >> "$ROOT"/bin/cryptosuspend
echo "for a in $CRYPTDEVS ; do" >> "$ROOT"/bin/cryptosuspend
echo ' while ! cryptsetup luksResume'" \$a ; do" >> "$ROOT"/bin/cryptosuspend
echo " true" >> "$ROOT"/bin/cryptosuspend
echo " done" >> "$ROOT"/bin/cryptosuspend
echo "done" >> "$ROOT"/bin/cryptosuspend
chmod a+rx "$ROOT"/bin/cryptosuspend
sync
exec openvt -s chroot "$ROOT" /bin/cryptosuspend
Некоторая работа была проделана для переноса этого на Ubuntu 14.04 здесь. Это ни в коем случае не идеальное решение, так как есть еще открытых вопросов , и похоже, что с 11 июня 2014 года не было выпущено ни одной работы. Однако это кажется хорошей отправной точкой для будущего развития.
Источник: https://github.com/jonasmalacofilho/ubuntu-luks-suspend