alexpanoiu icon

Fix BusyBox in the initramfs environment on Ubuntu 17.10

alexpanoiu | PRO | 03/03/25 07:35:15 PM UTC (Edited) | 0 ⭐ | 569 👁️ | Never ⏰ | []
Bash |

2.35 KB

|

None

|

0 👍

/

0 👎

#! /bin/sh
 
# ------------------------------------------------------------------------------
#
#                               fix-busybox-hook
#   update-initramfs hook to provided functional BusyBox tools in initramfs
#                          [email protected]
#                                  2017-10-13
#
#             This file must be made executable and symlinked from
#                          /etc/initramfs-tools/hooks
#
# update-initramfs tools to replace the crippled BusyBox provided by default in
# the initramfs environment by Ubuntu 17.10 with a variant compatible with the
# dropbear and cryptsetup boot scripts.
#
# Adapted from the hook script written by Hamy; see "Remote unlocking of
# LUKS-encrypted root in Ubuntu/Debian", https://hamy.io/post/0005/.
#
# ------------------------------------------------------------------------------
 
if test "/$1/" = '/prereqs/'; then
  echo ''
  exit 0
fi
 
[ "$BUSYBOX" = 'n' ] && 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
BUSYBOX_ORIGINAL=$DESTDIR/bin/busybox
[ -x $BUSYBOX_ORIGINAL ] || exit 0
 
# The one we want to replace it with
[ -x /bin/busybox ] || exit 0
BUSYBOX_NEW=/bin/busybox
 
# Ensure the original busybox lacks extended options
# and the soon-to-be-replaced-by one does not
if $BUSYBOX_ORIGINAL ps -eo pid,args >/dev/null 2>&1; then
  exit 0
elif ! $BUSYBOX_NEW ps -eo pid,args >/dev/null 2>&1; then
  exit 0
fi
 
# Get the inode number of busybox-initramfs binary
BUSYBOX_ORIGINAL_INODE=$(stat --format=%i $BUSYBOX_ORIGINAL)
 
# Replace the binary
rm -f $BUSYBOX_ORIGINAL
copy_exec $BUSYBOX_NEW /bin/busybox
 
echo "Fixing busybox-initramfs for:"
 
for alias in $(
  $BUSYBOX_NEW --list-long | sed -e 's@/\?\(usr/\)\?\(bin/\)\?@bin/@'
); do
 
  # Remove (and then re-add) all the hardlinks added by busybox-initramfs
  if [ -e "$DESTDIR/$alias" ] &&
     [ $(stat --format=%i "$DESTDIR/$alias") -eq $BUSYBOX_ORIGINAL_INODE ]
  then
    echo -n " ${alias#bin/}"
    rm -f "$DESTDIR/$alias"
    ln "$DESTDIR/bin/busybox" "$DESTDIR/$alias"
  fi
 
done | fmt -s
 
# vim: set ai bs=2 com=\:# et ft=sh sw=2 tw=80:

Comments