+ mkdir -p "${MNTPOINT}"/boot/efi
+ mount -t vfat "${EFI_TARGET}" "${MNTPOINT}"/boot/efi
+
+ if ! chroot "${MNTPOINT}" dpkg --list shim-signed 2>/dev/null | grep -q '^ii' ; then
+ echo "Notice: shim-signed package not present yet, installing it therefore."
+ # shellcheck disable=SC2086
+ DEBIAN_FRONTEND=$DEBIAN_FRONTEND chroot "$MNTPOINT" apt-get -y --no-install-recommends install $DPKG_OPTIONS shim-signed
+ fi
+
+ if [ "$(dpkg --print-architecture)" = "arm64" ]; then
+ if ! chroot "${MNTPOINT}" dpkg --list grub-efi-arm64-signed 2>/dev/null | grep -q '^ii' ; then
+ echo "Notice: grub-efi-arm64-signed package not present yet, installing it therefore."
+ # shellcheck disable=SC2086
+ DEBIAN_FRONTEND=$DEBIAN_FRONTEND chroot "$MNTPOINT" apt-get -y --no-install-recommends install $DPKG_OPTIONS grub-efi-arm64-bin grub-efi-arm64-signed
+ fi
+ chroot "$MNTPOINT" grub-install --target=arm64-efi --efi-directory=/boot/efi --uefi-secure-boot --removable "/dev/$LOOP_DISK"
+ elif [ "$(dpkg --print-architecture)" = "i386" ]; then
+ if ! chroot "${MNTPOINT}" dpkg --list grub-efi-ia32-signed 2>/dev/null | grep -q '^ii' ; then
+ echo "Notice: grub-efi-ia32-signed package not present yet, installing it therefore."
+ # shellcheck disable=SC2086
+ DEBIAN_FRONTEND=$DEBIAN_FRONTEND chroot "$MNTPOINT" apt-get -y --no-install-recommends install $DPKG_OPTIONS grub-efi-ia32-bin grub-efi-ia32-signed
+ fi
+ chroot "$MNTPOINT" grub-install --target=i386-efi --efi-directory=/boot/efi --uefi-secure-boot --removable "/dev/$LOOP_DISK"
+ chroot "$MNTPOINT" grub-install --target=i386-pc "/dev/$LOOP_DISK"
+ else
+ if ! chroot "${MNTPOINT}" dpkg --list grub-efi-amd64-signed 2>/dev/null | grep -q '^ii' ; then
+ echo "Notice: grub-efi-amd64-signed package not present yet, installing it therefore."
+ # shellcheck disable=SC2086
+ DEBIAN_FRONTEND=$DEBIAN_FRONTEND chroot "$MNTPOINT" apt-get -y --no-install-recommends install $DPKG_OPTIONS grub-efi-amd64-bin grub-efi-amd64-signed
+ fi
+ chroot "$MNTPOINT" grub-install --target=x86_64-efi --efi-directory=/boot/efi --uefi-secure-boot --removable "/dev/$LOOP_DISK"
+ chroot "$MNTPOINT" grub-install --target=i386-pc "/dev/$LOOP_DISK"
+ fi
+ else
+ dd if="${MNTPOINT}/usr/lib/grub/i386-pc/boot.img" of="${ORIG_TARGET}" conv=notrunc bs=440 count=1
+ case "${_opt_filesystem}" in
+ f2fs)
+ chroot "${MNTPOINT}" grub-mkimage -O i386-pc -p "(hd0,msdos1)/boot/grub" -o /tmp/core.img biosdisk part_msdos f2fs
+ ;;
+ xfs)
+ chroot "${MNTPOINT}" grub-mkimage -O i386-pc -p "(hd0,msdos1)/boot/grub" -o /tmp/core.img biosdisk part_msdos xfs
+ ;;
+ # NOTE - we might need to distinguish between further filesystems
+ *)
+ chroot "${MNTPOINT}" grub-mkimage -O i386-pc -p "(hd0,msdos1)/boot/grub" -o /tmp/core.img biosdisk part_msdos ext2
+ ;;
+ esac
+
+ dd if="${MNTPOINT}/tmp/core.img" of="${ORIG_TARGET}" conv=notrunc seek=1
+ rm -f "${MNTPOINT}/tmp/core.img"
+ fi
+ fi
+
+ # workaround for Debian bug #918590 with lvm + udev:
+ # WARNING: Device /dev/... not initialized in udev database even after waiting 10000000 microseconds
+ if [ -d /run/udev ] ; then
+ einfo "Setting up bind-mount /run/udev"
+ mkdir -p "${MNTPOINT}"/run/udev
+ mount --bind /run/udev "${MNTPOINT}"/run/udev
+ fi
+
+ if [ -n "${BOOT_APPEND}" ] ; then
+ echo "Adding BOOT_APPEND configuration ['${BOOT_APPEND}'] to /etc/default/grub."
+ sed -i "/GRUB_CMDLINE_LINUX_DEFAULT/ s#\"\$# ${BOOT_APPEND}\"#" "${MNTPOINT}/etc/default/grub"
+ fi
+
+ einfo "Updating grub configuration file."
+ chroot "${MNTPOINT}" update-grub
+ chroot "${MNTPOINT}" sync
+
+ case "$RELEASE" in
+ jessie)
+ einfo "Applying workaround for GRUB font path bug in jessie (Debian #787685)."
+ mkdir -p "${MNTPOINT}/boot/grub/fonts/"
+ cp "${MNTPOINT}/usr/share/grub/unicode.pf2" "${MNTPOINT}/boot/grub/fonts/"
+ ;;
+ esac
+
+ if grep -q '^GRUB_DISABLE_LINUX_UUID=.*true' "${MNTPOINT}"/etc/default/grub 2>/dev/null ; then
+ ewarn "GRUB_DISABLE_LINUX_UUID is set to true in /etc/default/grub, not adjusting root= in grub.cfg."
+ ewarn "Please note that your system might NOT be able to properly boot."
+ elif [ -z "$ARM_EFI_TARGET" ]; then
+ einfo "Adjusting grub.cfg for successful boot sequence."
+ sed -i "s;root=[^ ]\\+;root=UUID=$TARGET_UUID;" "${MNTPOINT}"/boot/grub/grub.cfg
+ fi
+
+ # workaround for Debian bug #918590 with lvm + udev:
+ # WARNING: Device /dev/... not initialized in udev database even after waiting 10000000 microseconds
+ if mountpoint "${MNTPOINT}"/run/udev &>/dev/null ; then
+ einfo "Unmounting bind-mount /run/udev"
+ umount "${MNTPOINT}"/run/udev
+ fi
+
+ umount "${MNTPOINT}"/proc
+ umount "${MNTPOINT}"/sys
+ umount "${MNTPOINT}"/dev/pts
+ try_umount 3 "${MNTPOINT}"/dev
+
+ if findmnt "${MNTPOINT}"/boot/efi &>/dev/null ; then
+ umount "${MNTPOINT}"/boot/efi
+ fi
+
+}
+# }}}
+
+# unmount VM image {{{
+umount_target() {
+ if [ -z "${VIRTUAL}" ] ; then
+ return 0
+ fi
+
+ if findmnt "${MNTPOINT}"/boot/efi &>/dev/null ; then
+ umount "${MNTPOINT}"/boot/efi
+ fi
+
+ umount "${MNTPOINT}"
+ kpartx -d "${ORIG_TARGET}" >/dev/null
+ # Workaround for a bug in kpartx which doesn't clean up properly,
+ # see Debian Bug #891077 and Github-PR grml/grml-debootstrap#112
+ if dmsetup ls | grep -q "^${LOOP_PART} "; then
+ kpartx -d "/dev/${LOOP_DISK}" >/dev/null
+ fi
+}
+# }}}
+
+# install main chroot {{{
+debootstrap_system() {
+ if [ "$_opt_nodebootstrap" ]; then
+ einfo "Skipping debootstrap as requested."
+ return
+ fi
+
+ if grep -q "$MNTPOINT" /proc/mounts || [ -n "$DIRECTORY" ] ; then
+ :
+ else
+ eerror "Error: $MNTPOINT not mounted, can not continue."
+ eend 1 ; exit 1
+ fi
+
+ if [ -n "$ISO" ] ; then
+ einfo "Running $DEBOOTSTRAP $DEBOOTSTRAP_OPT for release ${RELEASE}${ARCHINFO} using ${ISO}"
+ einfo "Executing: $DEBOOTSTRAP $ARCHCMD $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $ISO"
+ # shellcheck disable=SC2086
+ "$DEBOOTSTRAP" $ARCHCMD $DEBOOTSTRAP_OPT "$RELEASE" "$MNTPOINT" "$ISO"
+ else
+ einfo "Running $DEBOOTSTRAP $DEBOOTSTRAP_OPT for release ${RELEASE}${ARCHINFO} using ${MIRROR}"
+ einfo "Executing: $DEBOOTSTRAP $ARCHCMD $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $MIRROR"
+ # shellcheck disable=SC2086
+ "$DEBOOTSTRAP" $ARCHCMD $DEBOOTSTRAP_OPT "$RELEASE" "$MNTPOINT" "$MIRROR"
+ fi
+
+ if [ $RC -ne 0 ] ; then
+ if [ -r "$MNTPOINT/debootstrap/debootstrap.log" ] && \
+ [ -s "$MNTPOINT/debootstrap/debootstrap.log" ] ; then
+ einfo "Presenting last ten lines of debootstrap.log:"
+ tail -10 "${MNTPOINT}"/debootstrap/debootstrap.log
+ einfo "End of debootstrap.log"
+ fi
+ fi
+
+ eend $RC
+}
+# }}}
+
+# prepare chroot via chroot-script {{{
+preparechroot() {
+ einfo "Preparing chroot system"
+
+ # provide variables to chroot system
+ CHROOT_VARIABLES="/var/cache/grml-debootstrap/variables_${SHORT_TARGET}"
+ touch "$CHROOT_VARIABLES"
+ chmod 600 "$CHROOT_VARIABLES" # make sure nobody except root can read it
+ echo "# Configuration of ${PN}" > "$CHROOT_VARIABLES"
+ [ -n "$ARCH" ] && echo "ARCH='${ARCH//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$BACKPORTREPOS" ] && echo "BACKPORTREPOS='${BACKPORTREPOS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$BOOT_APPEND" ] && echo "BOOT_APPEND='${BOOT_APPEND//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$CHROOT_SCRIPTS" ] && echo "CHROOT_SCRIPTS='${CHROOT_SCRIPTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$COMPONENTS" ] && echo "COMPONENTS='${COMPONENTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$CONFFILES" ] && echo "CONFFILES='${CONFFILES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$DEBCONF" ] && echo "DEBCONF='${DEBCONF//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$DEBIAN_FRONTEND" ] && echo "DEBIAN_FRONTEND='${DEBIAN_FRONTEND//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$DEBOOTSTRAP" ] && echo "DEBOOTSTRAP='${DEBOOTSTRAP//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$DEFAULT_LOCALES" ] && echo "DEFAULT_LOCALES='${DEFAULT_LOCALES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$DEFAULT_LANGUAGE" ] && echo "DEFAULT_LANGUAGE='${DEFAULT_LANGUAGE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$EXTRAPACKAGES" ] && echo "EXTRAPACKAGES='${EXTRAPACKAGES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$EFI" ] && echo "EFI='${EFI//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$FALLBACK_MIRROR" ] && echo "FALLBACK_MIRROR='${FALLBACK_MIRROR//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$FILESYSTEM" ] && echo "FILESYSTEM='${FILESYSTEM//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$FORCE" ] && echo "FORCE='${FORCE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$GRMLREPOS" ] && echo "GRMLREPOS='${GRMLREPOS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$GRUB" ] && echo "GRUB='${GRUB//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$HOSTNAME" ] && echo "HOSTNAME='${HOSTNAME//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$INITRD" ] && echo "INITRD='${INITRD//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$INITRD_GENERATOR" ] && echo "INITRD_GENERATOR='${INITRD_GENERATOR//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$INITRD_GENERATOR_OPTS" ] && echo "INITRD_GENERATOR_OPTS='${INITRD_GENERATOR_OPTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$INSTALL_NOTES" ] && echo "INSTALL_NOTES='${INSTALL_NOTES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$ISODIR" ] && echo "ISODIR='${ISO//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$ISO" ] && echo "ISO='${ISO//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$KEEP_SRC_LIST" ] && echo "KEEP_SRC_LIST='${KEEP_SRC_LIST//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$LOCALES" ] && echo "LOCALES='${LOCALES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$MIRROR" ] && echo "MIRROR='${MIRROR//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$MKFS" ] && echo "MKFS='${MKFS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$NOPASSWORD" ] && echo "NOPASSWORD=\"true\"" >> "$CHROOT_VARIABLES"
+ [ -n "$NOKERNEL" ] && echo "NOKERNEL=\"true\"" >> "$CHROOT_VARIABLES"
+ [ -n "$PACKAGES" ] && echo "PACKAGES='${PACKAGES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$POST_SCRIPTS" ] && echo "POST_SCRIPTS='${POST_SCRIPTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$PRE_SCRIPTS" ] && echo "PRE_SCRIPTS='${PRE_SCRIPTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$RECONFIGURE" ] && echo "RECONFIGURE='${RECONFIGURE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$RELEASE" ] && echo "RELEASE='${RELEASE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$RM_APTCACHE" ] && echo "RM_APTCACHE='${RM_APTCACHE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$ROOTPASSWORD" ] && echo "ROOTPASSWORD='${ROOTPASSWORD//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$SCRIPTS" ] && echo "SCRIPTS='${SCRIPTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$SECURE" ] && echo "SECURE='${SECURE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$SELECTED_PARTITIONS" ] && echo "SELECTED_PARTITIONS='${SELECTED_PARTITIONS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$TARGET" ] && echo "TARGET='${TARGET//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$UPGRADE_SYSTEM" ] && echo "UPGRADE_SYSTEM='${UPGRADE_SYSTEM//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$TARGET_UUID" ] && echo "TARGET_UUID='${TARGET_UUID//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$TIMEZONE" ] && echo "TIMEZONE='${TIMEZONE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$TUNE2FS" ] && echo "TUNE2FS='${TUNE2FS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+ [ -n "$VMSIZE" ] && echo "VMSIZE='${VMSIZE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES"
+
+ cp $VERBOSE "${CONFFILES}"/chroot-script "${MNTPOINT}"/bin/chroot-script
+ chmod 755 "${MNTPOINT}"/bin/chroot-script
+ [ -d "$MNTPOINT"/etc/debootstrap/ ] || mkdir "$MNTPOINT"/etc/debootstrap/
+
+ # make sure we have our files for later use via chroot-script
+ cp $VERBOSE "${CONFFILES}/config" "${MNTPOINT}"/etc/debootstrap/
+ # make sure we adjust the configuration variables accordingly:
+ sed -i "s#RELEASE=.*#RELEASE=\"$RELEASE\"#" "${MNTPOINT}"/etc/debootstrap/config
+ sed -i "s#TARGET=.*#TARGET=\"$TARGET\"#" "${MNTPOINT}"/etc/debootstrap/config
+ sed -i "s#GRUB=.*#GRUB=\"$GRUB\"#" "${MNTPOINT}"/etc/debootstrap/config
+
+ # install notes:
+ if [ -n "$INSTALL_NOTES" ] ; then
+ [ -r "$INSTALL_NOTES" ] && cp "$INSTALL_NOTES" "${MNTPOINT}"/etc/debootstrap/
+ fi
+
+ # package selection:
+ if [ "$PACKAGES" = 'yes' ] ; then
+ PACKAGES_FILE="packages"
+
+ if [ "$ARCH" = 'arm64' ]; then
+ PACKAGES_FILE="packages-arm64"
+ fi
+
+ cp $VERBOSE "${_opt_packages:-$CONFFILES/$PACKAGES_FILE}" \
+ "${MNTPOINT}/etc/debootstrap/${PACKAGES_FILE}"
+ fi
+
+ # debconf preseeding:
+ _opt_debconf=${_opt_debconf:-$CONFFILES/debconf-selections}
+ [ -f "${_opt_debconf}" ] && [ "$DEBCONF" = 'yes' ] && \
+ cp $VERBOSE "${_opt_debconf}" "${MNTPOINT}"/etc/debootstrap/debconf-selections
+
+ # copy scripts that should be executed inside the chroot:
+ _opt_chroot_scripts=${_opt_chroot_scripts:-$CONFFILES/chroot-scripts/}
+ [ -d "$_opt_chroot_scripts" ] && [ "$CHROOT_SCRIPTS" = 'yes' ] && {
+ mkdir -p "${MNTPOINT}"/etc/debootstrap/chroot-scripts
+ cp -a $VERBOSE "${_opt_chroot_scripts}"/* "${MNTPOINT}"/etc/debootstrap/chroot-scripts/
+ }
+
+ # notice: do NOT use $CHROOT_VARIABLES inside chroot but statically file instead!
+ cp $VERBOSE "${CHROOT_VARIABLES}" "${MNTPOINT}"/etc/debootstrap/variables
+
+ cp $VERBOSE -a -L "${CONFFILES}"/extrapackages/ "${MNTPOINT}"/etc/debootstrap/
+
+ # make sure we can access network [relevant for cdebootstrap/mmdebstrap]
+ [ -f "${MNTPOINT}"/etc/resolv.conf ] || cp $VERBOSE /etc/resolv.conf "${MNTPOINT}"/etc/resolv.conf
+
+ # setup default locales
+ [ -n "$LOCALES" ] && cp $VERBOSE "${CONFFILES}"/locale.gen "${MNTPOINT}"/etc/locale.gen
+
+ # copy any existing files to chroot
+ [ -d "${CONFFILES}"/bin ] && cp $VERBOSE -a -L "${CONFFILES}"/bin/* "${MNTPOINT}"/bin/
+ [ -d "${CONFFILES}"/boot ] && cp $VERBOSE -a -L "${CONFFILES}"/boot/* "${MNTPOINT}"/boot/
+ [ -d "${CONFFILES}"/etc ] && cp $VERBOSE -a -L "${CONFFILES}"/etc/* "${MNTPOINT}"/etc/
+ [ -d "${CONFFILES}"/sbin ] && cp $VERBOSE -a -L "${CONFFILES}"/sbin/* "${MNTPOINT}"/sbin/
+ [ -d "${CONFFILES}"/share ] && cp $VERBOSE -a -L "${CONFFILES}"/share/* "${MNTPOINT}"/share/
+ [ -d "${CONFFILES}"/usr ] && cp $VERBOSE -a -L "${CONFFILES}"/usr/* "${MNTPOINT}"/usr/
+ [ -d "${CONFFILES}"/var ] && cp $VERBOSE -a -L "${CONFFILES}"/var/* "${MNTPOINT}"/var/
+
+ # network setup
+ DEFAULT_INTERFACES="# /etc/network/interfaces - generated by grml-debootstrap
+
+# Include files from /etc/network/interfaces.d when using
+# ifupdown v0.7.44 or newer:
+#source-directory /etc/network/interfaces.d
+
+auto lo
+iface lo inet loopback
+
+allow-hotplug eth0
+iface eth0 inet dhcp
+"
+
+ # add dhcp setting for Predictable Network Interface Names
+ if [ -x /bin/udevadm ]; then
+ tmpfile=$(mktemp)
+ for interface in /sys/class/net/*; do
+ udevadm info --query=all --path="${interface}" > "${tmpfile}"
+ # skip virtual devices, like bridges, vboxnet,...
+ if grep -q 'P: /devices/virtual/net/' "${tmpfile}" ; then
+ continue
+ fi
+
+ # iterate over possible naming policies by precedence (see udev/net/link-config.c),
+ # use and stop on first match to have same behavior as udev's link_config_apply()
+ for property in ID_NET_NAME_FROM_DATABASE ID_NET_NAME_ONBOARD ID_NET_NAME_SLOT ID_NET_NAME_PATH ID_NET_NAME_MAC ; do
+ if grep -q "${property}" "${tmpfile}" ; then
+ interface=$(grep "${property}" "${tmpfile}" | sed -n -e "s/E: ${property}=\([^\$*]\)/\1/p")
+ DEFAULT_INTERFACES="${DEFAULT_INTERFACES}
+allow-hotplug ${interface}
+iface ${interface} inet dhcp
+"
+ break
+ fi
+ done
+ done
+ rm -f "${tmpfile}"
+ fi
+
+ if [ -n "$NOINTERFACES" ] ; then
+ einfo "Not installing /etc/network/interfaces as requested via --nointerfaces option"
+ elif [ -n "$USE_DEFAULT_INTERFACES" ] ; then
+ einfo "Installing default /etc/network/interfaces as requested via --defaultinterfaces options."
+ mkdir -p "${MNTPOINT}/etc/network"
+ echo "$DEFAULT_INTERFACES" > "${MNTPOINT}/etc/network/interfaces"
+ elif [ -n "$VIRTUAL" ] ; then
+ einfo "Setting up Virtual Machine, installing default /etc/network/interfaces"
+ mkdir -p "${MNTPOINT}/etc/network"
+ echo "$DEFAULT_INTERFACES" > "${MNTPOINT}/etc/network/interfaces"
+ elif [ -r /etc/network/interfaces ] ; then
+ einfo "Copying /etc/network/interfaces from host to target system"
+ mkdir -p "${MNTPOINT}/etc/network"
+ cp $VERBOSE /etc/network/interfaces "${MNTPOINT}/etc/network/interfaces"
+ else
+ ewarn "Couldn't read /etc/network/interfaces, installing default /etc/network/interfaces"
+ mkdir -p "${MNTPOINT}/etc/network"
+ echo "$DEFAULT_INTERFACES" > "${MNTPOINT}/etc/network/interfaces"
+ fi
+
+ # install config file providing some example entries
+ if [ -r /etc/network/interfaces.examples ] && [ ! -r "$MNTPOINT/etc/network/interfaces.examples" ] ; then
+ mkdir -p "${MNTPOINT}/etc/network"
+ cp /etc/network/interfaces.examples "$MNTPOINT/etc/network/interfaces.examples"
+ fi
+
+ if [ -n "${SSHCOPYID}" ] ; then
+ AUTHORIZED_KEYS_SOURCE=${AUTHORIZED_KEYS_SOURCE:-$HOME/.ssh/authorized_keys}
+ AUTHORIZED_KEYS_TARGET=${AUTHORIZED_KEYS_TARGET:-$MNTPOINT/root/.ssh/}
+ if ssh-add -L >/dev/null 2>&1 ; then
+ einfo "Use locally available public keys to authorise root login on the target system as requested via --sshcopyid option."
+ mkdir -p "${MNTPOINT}"/root/.ssh
+ chmod 0700 "${MNTPOINT}"/root/.ssh
+ if ! ssh-add -L >> "${MNTPOINT}"/root/.ssh/authorized_keys ; then
+ eerror "Error: executing 'ssh-add -L' failed."
+ bailout 1
+ fi
+ elif [ -f "$AUTHORIZED_KEYS_SOURCE" ]; then
+ einfo "copying '$AUTHORIZED_KEYS_SOURCE' to '$AUTHORIZED_KEYS_TARGET' as requested via --sshcopyid option."
+ mkdir -p "$AUTHORIZED_KEYS_TARGET"
+ chmod 0700 "$AUTHORIZED_KEYS_TARGET"
+ if ! cp "$AUTHORIZED_KEYS_SOURCE" "$AUTHORIZED_KEYS_TARGET" ; then
+ eerror "Error: copying '$AUTHORIZED_KEYS_SOURCE' to '$AUTHORIZED_KEYS_TARGET' failed"
+ bailout 1
+ fi
+ else
+ eerror "Error: Could not open a connection to your authentication agent or the agent has no identities."
+ bailout 1
+ fi
+ fi
+
+ if [ -n "${SSHCOPYAUTH}" ] ; then
+ AUTHORIZED_KEYS_SOURCE=${AUTHORIZED_KEYS_SOURCE:-${HOME}/.ssh/authorized_keys}
+
+ if ! [ -f "${AUTHORIZED_KEYS_SOURCE}" ]; then
+ eerror "Error: could not read '${AUTHORIZED_KEYS_SOURCE}' for setting up SSH key login."
+ bailout 1
+ fi
+
+ AUTHORIZED_KEYS_TARGET="${MNTPOINT}/root/.ssh/"
+ einfo "Copying '${AUTHORIZED_KEYS_SOURCE}' to '${AUTHORIZED_KEYS_TARGET}' as requested via --sshcopyauth option."
+ mkdir -p "${AUTHORIZED_KEYS_TARGET}"
+ chmod 0700 "${AUTHORIZED_KEYS_TARGET}"
+ if ! cp "${AUTHORIZED_KEYS_SOURCE}" "${AUTHORIZED_KEYS_TARGET}" ; then
+ eerror "Error: copying '${AUTHORIZED_KEYS_SOURCE}' to '${AUTHORIZED_KEYS_TARGET}' failed."
+ bailout 1
+ fi
+ fi
+
+ if [ -d /run/udev ] ; then
+ einfo "Setting up bind-mount /run/udev"
+ mkdir -p "${MNTPOINT}"/run/udev
+ mount --bind /run/udev "${MNTPOINT}"/run/udev
+ fi
+}
+# }}}
+
+# execute all scripts in /etc/debootstrap/pre-scripts/ {{{
+execute_pre_scripts() {
+ # make sure hostname is set even before chroot-script get executed
+ echo "$HOSTNAME" > "$MNTPOINT"/etc/hostname
+
+ # make sure we have $MNTPOINT available for our scripts
+ export MNTPOINT
+
+ if [ -d "$_opt_pre_scripts" ] || [ "$PRE_SCRIPTS" = 'yes' ] ; then
+ [ -d "$_opt_pre_scripts" ] && pre_scripts="$_opt_pre_scripts" || pre_scripts="${CONFFILES}/pre-scripts/"
+ for script in "${pre_scripts}"/* ; do
+ if [ -x "$script" ] ; then
+ einfo "Executing pre-script $script"
+ "$script"
+ fi
+ done
+ fi
+}
+# }}}
+
+# execute all scripts in /etc/debootstrap/post-scripts/ {{{
+execute_post_scripts() {
+ # make sure we have $MNTPOINT and HOSTNAME available for our scripts
+ export MNTPOINT
+ export TARGET_HOSTNAME=$HOSTNAME
+
+ if [ -d "$_opt_scripts" ] || [ "$SCRIPTS" = 'yes' ] ; then
+ # legacy support for /etc/debootstrap/scripts/
+ [ -d "$_opt_scripts" ] && post_scripts="$_opt_scripts" || post_scripts="${CONFFILES}/scripts/"
+ ewarn "Deprecation NOTE: --scripts/SCRIPTS are deprecated, please switch to --post-scripts/POST_SCRIPTS instead."
+ elif [ -d "$_opt_post_scripts" ] || [ "$POST_SCRIPTS" = 'yes' ] ; then
+ [ -d "$_opt_post_scripts" ] && post_scripts="$_opt_post_scripts" || post_scripts="${CONFFILES}/post-scripts/"
+ fi
+
+ if [ -n "$post_scripts" ] ; then
+ for script in "${post_scripts}"/* ; do
+ if [ -x "$script" ] ; then
+ einfo "Executing post-script $script"
+ "$script"
+ fi
+ done
+ fi
+}
+# }}}
+
+# unmount mountpoint {{{
+try_umount() {
+ local tries=$1
+ local mountpoint="$2"
+
+ for (( try=1; try<=tries; try++ )); do
+ if [[ ${try} -eq ${tries} ]]; then
+ # Last time, show errors this time
+ umount "${mountpoint}" && return 0
+ else
+ # Not last time, hide errors until fatal
+ if umount "${mountpoint}" 2>/dev/null ; then
+ return 0
+ else
+ sleep 1
+ fi
+ fi
+ done
+ return 1 # Tried enough
+}
+# }}}
+
+# execute chroot-script {{{
+chrootscript() {
+ if ! [ -r "$MNTPOINT/bin/chroot-script" ] ; then
+ mount_target
+ fi
+
+ if ! [ -x "$MNTPOINT/bin/chroot-script" ] ; then
+ eerror "Fatal: $MNTPOINT/bin/chroot-script could not be found."
+ eend 1
+ else
+ einfo "Executing chroot-script now"
+ mount -t devtmpfs udev "${MNTPOINT}"/dev
+ mount -t devpts devpts "${MNTPOINT}"/dev/pts
+ if [ "$DEBUG" = "true" ] ; then
+ chroot "$MNTPOINT" /bin/bash -x /bin/chroot-script
+ else
+ chroot "$MNTPOINT" /bin/chroot-script
+ fi
+ try_umount 3 "$MNTPOINT"/dev/pts
+ try_umount 3 "$MNTPOINT"/dev
+ eend $RC
+ fi
+
+ # finally get rid of chroot-script again, there's no good reason to
+ # keep it on the installed system
+ if grep -q GRML_CHROOT_SCRIPT_MARKER "${MNTPOINT}/bin/chroot-script" ; then
+ einfo "Removing chroot-script again"
+ rm -f "${MNTPOINT}/bin/chroot-script"
+ else
+ einfo "Keeping chroot-script as string GRML_CHROOT_SCRIPT_MARKER could not be found"
+ fi
+}
+# }}}
+
+# unmount $MNTPOINT {{{
+umount_chroot() {
+
+ # display installation notes:
+ if [ -n "$INSTALL_NOTES" ] ; then
+ [ -r "${MNTPOINT}/${INSTALL_NOTES}" ] && cat "${MNTPOINT}/${INSTALL_NOTES}"
+ fi
+
+ if [ -n "$ISODIR" ] ; then
+ if grep -q "$ISODIR" /proc/mounts ; then
+ einfo "Unmount $MNTPOINT/$ISODIR"
+ umount "$MNTPOINT/$ISODIR"
+ fi
+ fi
+
+ if grep -q "$MNTPOINT" /proc/mounts ; then
+ if mountpoint "${MNTPOINT}"/run/udev &>/dev/null ; then
+ einfo "Unmounting bind-mount /run/udev"
+ umount "${MNTPOINT}"/run/udev
+ fi
+
+ if [ -n "$PARTITION" ] ; then
+ einfo "Unmount $MNTPOINT"
+ umount "$MNTPOINT"
+ fi
+ fi
+}
+# }}}
+
+# execute filesystem check {{{
+fscktool() {
+ if [ -n "$VIRTUAL" ] ; then
+ einfo "Skipping filesystem check because we deploy a virtual machine."
+ return 0
+ fi
+
+ if [ "$FSCK" = 'yes' ] ; then