Та же проблема возникла у меня сегодня, и я смог найти этот вопрос только в Интернете. Поэтому я попытался отладить его самостоятельно...
Скрипт/etc/initramfs-tools/hooks/mount_cryptroot
(строка 21 )пытается поместить файл в каталог /var/tmp/mkinitramfs_uIC6Q0/root/
. Этот каталог отсутствует, согласно сообщению об ошибке. Соответствующая часть скрипта:
SCRIPT="${DESTDIR}/root/mount_cryptroot.sh"
cat > "${SCRIPT}" << 'EOF'
Каталог /var/tmp/mkinitramfs_uIC6Q0/
— это временный каталог, в котором собрано содержимое нового файла initrd. Я предполагаю, что у initrd больше нет корневого подкаталога. Итак, я взглянул на содержимое существующего образа initrd :
# mkdir initrd
# cd initrd
# gunzip -c /boot/initrd.img-4.9.0-3-amd64 | cpio -i
125955 blocks
# ls
bin conf etc init lib lib64 root-aBcDeF run sbin scripts
#
У каталога root
есть суффикс с 6 случайными буквами/цифрами (, измененный здесь наaBcDeF
). Вероятно, это из соображений безопасности. Я обнаружил, что суффикс меняется каждый раз, когда генерируется initrd.
Таким образом, решение состоит в том, чтобы расширить сценарий /etc/initramfs-tools/hooks/mount_cryptroot
, чтобы узнать истинное имя корневого каталога, включая суффикс, и использовать его вместо простого root
.
Это можно сделать, вставив
ROOTDIR="$(cd "${DESTDIR}"; echo root-*)"
перед неисправными строками и изменением неисправных строк на
SCRIPT="${DESTDIR}/${ROOTDIR}/mount_cryptroot.sh"
cat > "${SCRIPT}" << 'EOF'
. Есть еще две строки, содержащие root
без суффикса. Их нужно изменить на
cat > "${DESTDIR}/${ROOTDIR}/.profile" << EOF
и
/${ROOTDIR}/mount_cryptroot.sh && exit 1 || echo "Run./mount_cryptroot.sh to try unlocking again"
. Это решило проблему для меня и
update-initramfs -u -k all
а также ввод пароля через SSH при загрузке снова заработал.
Весь мой сценарий /etc/initramfs-tools/hooks/mount_cryptroot
после адаптации:
#!/bin/sh
# Author: http://www.dont-panic.cc/capi/2012/10/24/fully-encrypted-vserver-with-ubuntu-12-04/
# This script generates two scripts in the initramfs output,
# /root-xxxxxx/mount_cryptroot.sh and /root-xxxxxx/.profile
ALLOW_SHELL=1
# Set this to 1 before running update-initramfs if you want
# to allow authorized users to type Ctrl-C to drop to a
# root shell (useful for debugging, potential for abuse.)
#
# (Note that even with ALLOW_SHELL=0 it may still be possible
# to achieve a root shell.)
#
if [ -z ${DESTDIR} ]; then
exit
fi
ROOTDIR="$(cd "${DESTDIR}"; echo root-*)"
SCRIPT="${DESTDIR}/${ROOTDIR}/mount_cryptroot.sh"
cat > "${SCRIPT}" << 'EOF'
#!/bin/sh
CMD=
while [ -z "$CMD" -o -z "`pidof askpass plymouth`" ]; do
CMD=`ps -o args | grep 'open --type luks' | grep -v grep`
sleep 0.1
done
while [ -n "`pidof askpass plymouth`" ]; do
$CMD && kill -9 `pidof askpass plymouth` && echo "Success"
done
EOF
chmod +x "${SCRIPT}"
# Run mount_cryptroot by default and close the login session afterwards
# If ALLOW_SHELL is set to 1, you can press Ctrl-C to get to an interactive prompt
cat > "${DESTDIR}/${ROOTDIR}/.profile" << EOF
ctrl_c_exit() {
exit 1
}
ctrl_c_shell() {
# Ctrl-C during.profile appears to mangle terminal settings
reset
}
if [ "$ALLOW_SHELL" == "1" ]; then
echo "Unlocking rootfs... Type Ctrl-C for a shell."
trap ctrl_c_shell INT
else
echo "Unlocking rootfs..."
trap ctrl_c_exit INT
fi
/${ROOTDIR}/mount_cryptroot.sh && exit 1 || echo "Run./mount_cryptroot.sh to try unlocking again"
trap INT
EOF
Если команда в crontab записывает что-либо в стандартный вывод, тогда cron возьмет этот вывод и попытается отправить его вам по почте. По-видимому, у вас не установлен MTA, поэтому cron не может отправить почтовое сообщение и регистрирует этот сбой в файле журнала.
Если вы хотите увидеть, что задание cron записывает в свой стандартный вывод, вам необходимо установить MTA. :cron отправит вам эти выходные данные по почте и, предположительно, ничего не зарегистрирует, поскольку отправка почты будет выполнена успешно.
Если вы не хотите видеть вывод, перенаправьте его в /dev/null. Я бы все же настроил MTA, чтобы cron был счастлив, даже если какое-то задание cron неожиданно выдает результат.
Подробности описаны на справочной странице crond (8 ).