Create a gist now

Instantly share code, notes, and snippets.

Embed
What would you like to do?
#!/bin/sh
# This hook is for fixing busybox-initramfs issue while unlocking a luks
# encrypted rootfs. The problem is that the included busybox version
# is stripped down to the point that it breaks cryptroot-unlock script:
# https://bugs.launchpad.net/ubuntu/+source/busybox/+bug/1651818
# This is a non-aggressive fix based on the original busybox-initramfs hook
# until the bug is fixed.
# busybox or busybox-static package must be present for this to work
# This file should be placed in /etc/initramfs-tools/hooks/ and have +x flag set
# after that you need to rebuild the initramfs with 'update-initramfs -u'
# This is only tested in Ubuntu Server 17.04 . May or may not work in other
# Ubuntu/Debian releases.
# Also note that this does not replace busybox-initramfs package.
# The package must be present, this hook just fixes what's broken.
# Hamy - www.hamy.io
set -e
case "${1:-}" in
prereqs) echo ""; exit 0;;
esac
[ n = "$BUSYBOX" ] && exit 0
[ -r /usr/share/initramfs-tools/hook-functions ] || exit 0
. /usr/share/initramfs-tools/hook-functions
# Testing the presence of busybox-initramfs hook
[ -x /usr/share/initramfs-tools/hooks/zz-busybox-initramfs ] || exit 0
# The original busybox binary added by busybox-initramfs
BB_BIN_ORG=$DESTDIR/bin/busybox
[ -x $BB_BIN_ORG ] || exit 0
# The one we want to replace it with
[ -x /bin/busybox ] || exit 0
BB_BIN=/bin/busybox
# Ensure the original busybox lacks extended options
# and the soon-to-be-replaced-by one does not
if $BB_BIN_ORG ps -eo pid,args >/dev/null 2>&1; then
exit 0
elif ! $BB_BIN ps -eo pid,args >/dev/null 2>&1; then
exit 0
fi
# Get the inode number of busybox-initramfs binary
BB_BIN_ORG_IND=$(stat --format=%i $BB_BIN_ORG)
# Replace the binary
rm -f $BB_BIN_ORG
copy_exec $BB_BIN /bin/busybox
echo -n "Fixing busybox-initramfs for:"
for alias in $($BB_BIN --list-long); do
alias="${alias#/}"
case "$alias" in
# strip leading /usr, we don't use it
usr/*) alias="${alias#usr/}" ;;
*/*) ;;
*) alias="bin/$alias" ;; # make it into /bin
esac
# Remove (and then re-add) all the hardlinks added by busybox-initramfs
if [ -e "$DESTDIR/$alias" ] && [ $(stat --format=%i "$DESTDIR/$alias") -eq $BB_BIN_ORG_IND ]; then
echo -n " ${alias##*/}"
rm -f "$DESTDIR/$alias"
ln "$DESTDIR/bin/busybox" "$DESTDIR/$alias"
fi
done
# To get a trailing new line
echo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment