armbian-build/lib/image-helpers.sh
zciendor ddf0ed1edf
Redo of implementation for feature request #947 on current master
This was already implemented with https://github.com/armbian/build/pull/948,
before but never made it into the master branch yet. Probably because the
development branch has been abandoned in the meantime and it is to much effort
now to merge it into master.

It includes all the cleanup changes from commit 08743d3 and has been successfully
tested on an Odroid HC1.

In addition to what is currently in the `luks` branch the following improvments
where done/added:

1. update_initramfs() function in debbootstrap-ng.sh, which needs to be invoked
   after the partition layout and /etc/crypttab was created. Else `cryptroot-unlock`
   won't work and you'll run into:
   https://serverfault.com/questions/907254/cryproot-unlock-with-dropbear-timeout-while-waiting-for-askpass

   Apart from that it might be useful to always run `update-initramfs` at the end
   of the build process anyway, in case customize_image (userpatches) made some
   changes to the initramfs tools configs.

2. CRYPTROOT_SSH_UNLOCK=yes/no config option. It's by default set to yes, but it
   might be desired by some users to disable enable SSH/dropbear access while
   still having LUKS support. E.g. if they have a device that has a display
   and keyboard.

3. If no `authorized_keys` file is provided via userpatches, a new SSH key pair
   is generated and for convenience copied to the output directory along with
   the final image.
2018-07-31 16:02:26 -05:00

129 lines
3.9 KiB
Bash

# Copyright (c) 2015 Igor Pecovnik, igor.pecovnik@gma**.com
#
# This file is licensed under the terms of the GNU General Public
# License version 2. This program is licensed "as is" without any
# warranty of any kind, whether express or implied.
# This file is a part of the Armbian build script
# https://github.com/armbian/build/
# Functions:
# mount_chroot
# umount_chroot
# unmount_on_exit
# check_loop_device
# install_external_applications
# write_uboot
# customize_image
# install_deb_chroot
# mount_chroot <target>
#
# helper to reduce code duplication
#
mount_chroot()
{
local target=$1
mount -t proc chproc $target/proc
mount -t sysfs chsys $target/sys
mount -t devtmpfs chdev $target/dev || mount --bind /dev $target/dev
mount -t devpts chpts $target/dev/pts
} #############################################################################
# umount_chroot <target>
#
# helper to reduce code duplication
#
umount_chroot()
{
local target=$1
umount -l $target/dev/pts >/dev/null 2>&1
umount -l $target/dev >/dev/null 2>&1
umount -l $target/proc >/dev/null 2>&1
umount -l $target/sys >/dev/null 2>&1
} #############################################################################
# unmount_on_exit
#
unmount_on_exit()
{
trap - INT TERM EXIT
umount_chroot "$SDCARD/"
umount -l $SDCARD/tmp >/dev/null 2>&1
umount -l $SDCARD >/dev/null 2>&1
umount -l $MOUNT/boot >/dev/null 2>&1
umount -l $MOUNT >/dev/null 2>&1
[[ $CRYPTROOT_ENABLE == yes ]] && cryptsetup luksClose $ROOT_MAPPER
losetup -d $LOOP >/dev/null 2>&1
rm -rf --one-file-system $SDCARD
exit_with_error "debootstrap-ng was interrupted"
} #############################################################################
# check_loop_device <device_node>
#
check_loop_device()
{
local device=$1
if [[ ! -b $device ]]; then
if [[ $CONTAINER_COMPAT == yes && -b /tmp/$device ]]; then
display_alert "Creating device node" "$device"
mknod -m0660 $device b 0x$(stat -c '%t' "/tmp/$device") 0x$(stat -c '%T' "/tmp/$device")
else
exit_with_error "Device node $device does not exist"
fi
fi
} #############################################################################
install_external_applications()
{
display_alert "Installing extra applications and drivers" "" "info"
for plugin in $SRC/packages/extras/*.sh; do
source $plugin
done
} #############################################################################
# write_uboot <loopdev>
#
# writes u-boot to loop device
# Parameters:
# loopdev: loop device with mounted rootfs image
#
write_uboot()
{
local loop=$1
display_alert "Writing U-boot bootloader" "$loop" "info"
mkdir -p /tmp/u-boot/
dpkg -x ${DEST}/debs/${CHOSEN_UBOOT}_${REVISION}_${ARCH}.deb /tmp/u-boot/
write_uboot_platform "/tmp/u-boot/usr/lib/${CHOSEN_UBOOT}_${REVISION}_${ARCH}" "$loop"
[[ $? -ne 0 ]] && exit_with_error "U-boot bootloader failed to install" "@host"
rm -r /tmp/u-boot/
sync
} #############################################################################
customize_image()
{
# for users that need to prepare files at host
[[ -f $SRC/userpatches/customize-image-host.sh ]] && source $SRC/userpatches/customize-image-host.sh
cp $SRC/userpatches/customize-image.sh $SDCARD/tmp/customize-image.sh
chmod +x $SDCARD/tmp/customize-image.sh
mkdir -p $SDCARD/tmp/overlay
# util-linux >= 2.27 required
mount -o bind,ro $SRC/userpatches/overlay $SDCARD/tmp/overlay
display_alert "Calling image customization script" "customize-image.sh" "info"
chroot $SDCARD /bin/bash -c "/tmp/customize-image.sh $RELEASE $LINUXFAMILY $BOARD $BUILD_DESKTOP"
umount $SDCARD/tmp/overlay
mountpoint -q $SDCARD/tmp/overlay || rm -r $SDCARD/tmp/overlay
} #############################################################################
install_deb_chroot()
{
local package=$1
local name=$(basename $package)
cp $package $SDCARD/root/$name
display_alert "Installing" "$name"
chroot $SDCARD /bin/bash -c "dpkg -i /root/$name" >> $DEST/debug/install.log 2>&1
rm -f $SDCARD/root/$name
}