Если зашифрованная подкачка не предназначена также для возобновления режима гибернации, она часто инициализируется с помощью -случайно сгенерированного ключа, который нигде не хранится постоянно. Это обеспечивает довольно надежную гарантию того, что любые попытки криминалистического анализа содержимого области подкачки окажутся бесполезными, как только система будет должным образом выключена.
Поскольку единственная копия такого непостоянного ключа -в ОЗУ будет активно обнуляться в рамках нормального завершения работы после закрытия криптоустройства, любые попытки восстановить ключ из содержимого ОЗУ после полного отключения будут также быть бесполезным.
Тот факт, что ваш crypttab
включает опцию swap
, предполагает, что эта схема может использоваться :опция swap
заставляет cryptsetup
запускать mkswap
на /dev/mapper/swap_crypt
после инициализации шифрования, это было бы необходимо только в том случае, если бы существующее содержимое раздела подкачки было нечитаемой тарабарщиной... т.е. зашифровано другим постоянным ключом, отличным от -.
При использовании системы инициализации systemd
параметр keyscript=
может быть проигнорирован, и вместо него будет использоваться помощник cryptsetup systemd
, в зависимости от выбора, сделанного вашим дистрибутивом Linux. Подробнее см. man systemd-cryptsetup-generator
и man systemd-cryptsetup@.service
.
Вам нужно будет получить дочерний процесс от родительского. См. wait(2)
. Кажется, что происходит то, что вы просто обрабатываете случай, когда выполняется код дочернего процесса, и просто игнорируете результат в родительском. В результате родитель не выполняет никакой очистки после выхода дочернего элемента, и в результате происходит утечка PID.
Самое простое решение — добавить к условию if
следующий else
случай.
else if (pid > 0) {
int status;
waitpid(pid, &status, 0);
}
РЕДАКТИРОВАТЬ:Приведенное выше условие блокирует родительский процесс до завершения дочернего процесса. При выходе потомка сигнал SIGCHLD
отправляется родителю, и по умолчанию он игнорируется. Однако, согласно POSIX.1 -2001, если вы явно установите обработчик сигнала для SIGCHLD
на SIG_IGN
, тогда система автоматически очистит дочерний процесс с оговоркой, что родительский процесс ничего не знает о выходной статус ребенка.
В функцию инициализации добавьте следующий код:
signal(SIGCHLD, SIG_IGN);