jessie에서 Stretch로 업그레이드한 후 update-initramfs가 실패합니다.

jessie에서 Stretch로 업그레이드한 후 update-initramfs가 실패합니다.

최근에 Stretch를 실행하도록 Debian 컴퓨터 중 하나를 업데이트했지만 불행하게도 initramfs 이미지를 다시 작성하는 데 문제가 있습니다.

시작할 때 디렉토리와 그 내용이 존재 해야 한다는 것을 인식하지 못하는 것 같습니다 /root/.ssh/. update-initramfs가 /etc/initramfs-tools/root의 내용을 강제로 가져오도록 하는 구성 옵션을 찾아보았지만, 이미지를 빌드할 수 없는 후 수동으로 생성했지만 운이 없었습니다. 마지막으로, 내 측의 구성 오류가 아닌지 확인하기 위해 sysresccd에서 debootstrap 설치를 수행했지만 그것도 실패했습니다.

initramfs 이미지를 업데이트하려고 할 때 나타나는 출력은 다음과 같습니다.

root@sysresccd:/etc/initramfs-tools# update-initramfs -u -k all
update-initramfs: Generating /boot/initrd.img-4.3.0-1-amd64
/etc/initramfs-tools/hooks/mount_cryptroot: 21: /etc/initramfs-tools/hooks/mount_cryptroot: cannot create /var/tmp/mkinitramfs_uIC6Q0/root/mount_cryptroot.sh: Directory nonexistent
chmod: cannot access /var/tmp/mkinitramfs_uIC6Q0/root/mount_cryptroot.sh: No such file or directory
/etc/initramfs-tools/hooks/mount_cryptroot: 36: /etc/initramfs-tools/hooks/mount_cryptroot: cannot create /var/tmp/mkinitramfs_uIC6Q0/root/.profile: Directory nonexistent
/etc/initramfs-tools/hooks/mount_cryptroot: 21: /etc/initramfs-tools/hooks/mount_cryptroot: cannot create /var/tmp/mkinitramfs_uIC6Q0/root/mount_cryptroot.sh: Directory nonexistent
chmod: cannot access /var/tmp/mkinitramfs_uIC6Q0/root/mount_cryptroot.sh: No such file or directory
/etc/initramfs-tools/hooks/mount_cryptroot: 36: /etc/initramfs-tools/hooks/mount_cryptroot: cannot create /var/tmp/mkinitramfs_uIC6Q0/root/.profile: Directory nonexistent
E: /etc/initramfs-tools/hooks/mount_cryptroot failed with return 2.
update-initramfs: failed for /boot/initrd.img-4.3.0-1-amd64 with 2.

사실 지금은 아이디어가 부족합니다. 누구든지 이 문제를 해결하도록 도와주시면 매우 감사하겠습니다.

일부 배경 정보:
내가 사용하는 것 이 가이드내 시스템을 설치했는데 Jesse에서는 제대로 작동했지만 확장했을 때 위에서 언급한 이유로 인해 실패했습니다.

답변1

오늘도 같은 문제가 있었고 이 문제는 온라인에서만 찾을 수 있었습니다. 그래서 제가 직접 디버깅을 해보았습니다...

스크립트 /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

관련 정보