X-Git-Url: https://git.grml.org/?a=blobdiff_plain;f=chroot-script;h=6655cb35b08cb2faf56cc22565cd3a2f714ced0c;hb=1e27d8ed79cf72dbb999e7fb51ff0bf92a4c3383;hp=a033d8d6bcbf30e06910c26987f4e8010406c74d;hpb=4c49de9d47fef1e743d87bd7bd08fd4ac7d36f9c;p=grml-debootstrap.git diff --git a/chroot-script b/chroot-script index a033d8d..6655cb3 100755 --- a/chroot-script +++ b/chroot-script @@ -11,6 +11,7 @@ # error_handler {{{ if [ "$REPORT_TRAP_ERR" = "yes" ] || [ "$FAIL_TRAP_ERR" = "yes" ]; then + set -e set -E set -o pipefail trap "error_handler" ERR @@ -479,11 +480,16 @@ createfstab(){ EOF if [ -n "$TARGET_UUID" ] ; then - local rootfs_mount_options=",errors=remount-ro" + local rootfs_mount_options="" + + if [ -z "${FILESYSTEM}" ] ; then + FILESYSTEM="$(blkid -o value -s TYPE /dev/disk/by-uuid/"${TARGET_UUID}")" + fi + case "${FILESYSTEM}" in - f2fs) - # errors=remount-ro is unsupported, see https://github.com/grml/grml-debootstrap/issues/163 - rootfs_mount_options="" + # errors=remount-ro is supported only by a few file systems + ext*|exfat|fat|jfs|nilfs2|vfat) + rootfs_mount_options=",errors=remount-ro" ;; esac @@ -596,7 +602,12 @@ initrd() { # generate initrd if [ -n "$INITRD" ] ; then echo "Generating initrd." - update-initramfs -c -t -k "$KERNELVER" + if [ "$INITRD_GENERATOR" = 'dracut' ] ; then + DEBIAN_FRONTEND=$DEBIAN_FRONTEND $APTINSTALL dracut + dracut --no-hostonly --kver "$KERNELVER" --fstab --add-fstab /etc/fstab --force --reproducible $INITRD_GENERATOR_OPTS + else + update-initramfs -c -t -k "$KERNELVER" $INITRD_GENERATOR_OPTS + fi fi } # }}} @@ -627,6 +638,42 @@ efi_setup() { } # grub configuration/installation {{{ + +# helper function to get relevant /dev/disk/by-id/* entries, +# based on GRUB's postinst script +available_ids() { + local path ids + + [ -d /dev/disk/by-id ] || return + ids="$( + for path in /dev/disk/by-id/*; do + [ -e "${path}" ] || continue + printf '%s %s\n' "${path}" "$(readlink -f "${path}")" + done | sort -k2 -s -u | cut -d' ' -f1 + )" + echo "${ids}" +} + +# helper function to report corresponding /dev/disk/by-id/… for a given device name, +# based on GRUB's postinst script +device_to_id() { + local id + + for id in $(available_ids); do + if [ "$(readlink -f "${id}")" = "$(readlink -f "$1")" ]; then + echo "${id}" + return 0 + fi + done + + # Fall back to the plain device name if there's no by-id link for it. + if [ -e "$1" ]; then + echo "$1" + return 0 + fi + return 1 +} + grub_install() { if [ -z "$GRUB" ] ; then @@ -644,8 +691,15 @@ grub_install() { # make sure this is pre-defined so we have sane settings for automated # upgrades, see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=711019 + local grub_device + grub_device=$(device_to_id "${GRUB}") + if [ -z "${grub_device:-}" ] ; then + echo "Warning: Could not identify /dev/disk/by-id/... for '${GRUB}', falling back to '${GRUB}'" + grub_device="${GRUB}" + fi + echo "Setting ${GRUB_PACKAGE} debconf configuration for install device to $GRUB" - echo "${GRUB_PACKAGE} ${GRUB_PACKAGE}/install_devices multiselect $GRUB" | debconf-set-selections + echo "${GRUB_PACKAGE} ${GRUB_PACKAGE}/install_devices multiselect ${grub_device}" | debconf-set-selections if ! dpkg --list ${GRUB_PACKAGE} 2>/dev/null | grep -q '^ii' ; then echo "Notice: grub option set but no ${GRUB_PACKAGE} package, installing it therefore."