X-Git-Url: https://git.grml.org/?p=grml-debootstrap.git;a=blobdiff_plain;f=grml-debootstrap;h=b1586453daa85bb31650751f6688e300bac30dcb;hp=ac1fe8bbfd53bca614d82ae0b1f41e8cf4b73839;hb=4b7bcd8bb312afbc7eb0be80f72c1cc99566a56b;hpb=c83de438d2bd024b703a0dd456dc028d2ca42f6c diff --git a/grml-debootstrap b/grml-debootstrap index ac1fe8b..b158645 100755 --- a/grml-debootstrap +++ b/grml-debootstrap @@ -111,6 +111,7 @@ Bootstrap options: --interactive Use interactive mode (frontend). --nodebootstrap Skip debootstrap, only do configuration to the target. --grub Target for grub installation. Usage example: /dev/sda + --efi Target for EFI installation. Usage example: /dev/sda1 --arch Set target architecture, use for installing i386 on amd64. --filesystem Filesystem that should be used when target is a partition or Virtual Machine (see --vmfile). @@ -395,6 +396,7 @@ fi [ "$_opt_nokernel" ] && NOKERNEL="true" [ "$_opt_bootappend" ] && BOOT_APPEND=$_opt_bootappend [ "$_opt_grub" ] && GRUB=$_opt_grub +[ "$_opt_efi" ] && EFI=$_opt_efi [ "$_opt_arch" ] && ARCH=$_opt_arch [ "$_opt_insecure" ] && echo "Warning: --insecure is deprecated, continuing anyway." [ "$_opt_force" ] && FORCE=$_opt_force @@ -448,7 +450,7 @@ fi # make sure we have what we need {{{ if [ -n "$VIRTUAL" ] ; then - check4progs kpartx mksh parted qemu-img || bailout 1 + check4progs kpartx parted qemu-img || bailout 1 fi # }}} @@ -759,9 +761,63 @@ Do you want to stop now?" 0 0 2>/dev/null } # }}} +format_efi_partition() { + if [ -z "$EFI" ] ; then + return 0 + fi + + if ! [ -b "$EFI" ] ; then + eerror "Specified efi argument [$EFI] not a valid block device." + bailout 1 + fi + + if fsck.vfat -bn "$EFI" >/dev/null; then + einfo "EFI partition $EFI seems to have a FAT filesystem, not modifying." ; eend 0 + else + einfo "EFI partition $EFI doesn't seem to be formated, creating filesystem." + mkfs.fat -F32 -n "EFI System Partition" "$EFI" + RC=$? + if [ $RC -eq 0 ] ; then + eend 0 + else + eerror "Error while creating filesystem on ${EFI}." + eend 1 + bailout 1 + fi + fi +} + +# check for EFI support or try to enable it {{{ +efi_support() { + if lsmod | grep -q efivars ; then + einfo "EFI support detected." ; eend 0 + return 0 + fi + + if modprobe efivars &>/dev/null ; then + einfo "EFI support enabled now." ; eend 0 + return 0 + fi + + return 1 +} +# }}} + # make sure the user is aware of the used configuration {{{ checkconfiguration() { + +if efi_support ; then + if [ -z "$_opt_efi" ] ; then + ewarn "EFI support detected but no --efi option given, please consider enabling it." ; eend 0 + fi +else + if [ -n "$_opt_efi" ] ; then + eerror "EFI option used but no EFI support detected." ; eend 0 + bailout 1 + fi +fi + if [ -n "$AUTOINSTALL" ] ; then if checkforrun ; then eerror "Exiting as requested" ; eend 0 @@ -775,6 +831,8 @@ elif [ -n "$INTERACTIVE" ] ; then Target: $TARGET" [ -n "$GRUB" ] && INFOTEXT="$INFOTEXT Install grub: $GRUB" + [ -n "$EFI" ] && INFOTEXT="$INFOTEXT + Install efi: $EFI" [ -n "$RELEASE" ] && INFOTEXT="$INFOTEXT Using release: $RELEASE" [ -n "$HOSTNAME" ] && INFOTEXT="$INFOTEXT @@ -808,6 +866,7 @@ else # if not running automatic installation display configuration and prompt fo echo " Install grub: yes" else [ -n "$GRUB" ] && echo " Install grub: $GRUB" || echo " Install grub: no" + [ -n "$EFI" ] && echo " Install efi: $EFI" || echo " Install efi: no" fi [ -n "$RELEASE" ] && echo " Using release: $RELEASE" @@ -996,6 +1055,24 @@ mkfs() { einfo "Enabling force option (-F) for mkfs.ext* tool as requested via --force switch." MKFS_OPTS="$MKFS_OPTS -F" eend 0 + + ;; + esac + fi + + # starting with e2fsprogs 1.43~WIP.2015.05.18-1 mkfs.ext4 enables the metadata_csum feature + # by default, which requires a recent version of tune2fs on the target system then, + # so disable this feature for older Debian releases where it's known to be unsupported + if [ -n "$MKFS" ] && [ "$MKFS" = "mkfs.ext4" ] ; then + case "$RELEASE" in + lenny|squeeze|wheezy|jessie) + # assume a more recent version if we can't identify the version via dpkg-query + local e2fsprogs_version="$(dpkg-query --show --showformat='${Version}' e2fsprogs 2>/dev/null || echo 1.44)" + if [ -n "$e2fsprogs_version" ] && dpkg --compare-versions "$e2fsprogs_version" ge '1.43~WIP.2015.05.18-1' ; then + einfo "Disabling metadata_csum feature for $MKFS as $RELEASE doesn't support it." + MKFS_OPTS="$MKFS_OPTS -O ^metadata_csum" + eend 0 + fi ;; esac fi @@ -1102,8 +1179,7 @@ prepare_vm() { if [ -n "$VMFILE" ]; then qemu-img create -f raw "${TARGET}" "${VMSIZE}" fi - echo 4 66 | /usr/share/grml-debootstrap/bootgrub.mksh -A | dd of="$TARGET" conv=notrunc - dd if=/dev/zero bs=1 conv=notrunc count=64 seek=446 of="$TARGET" + parted -s "${TARGET}" 'mklabel msdos' if [ "$FIXED_DISK_IDENTIFIERS" = "yes" ] ; then einfo "Adjusting disk signature to a fixed (non-random) value" MBRTMPFILE=$(mktemp) @@ -1113,6 +1189,7 @@ prepare_vm() { eend $? fi parted -s "${TARGET}" 'mkpart primary ext4 2M -1' + parted -s "${TARGET}" 'set 1 boot on' # if dm-mod isn't available then kpartx will fail with # "Is device-mapper driver missing from kernel? [...]" @@ -1191,8 +1268,9 @@ if [[ -z "${GRUB}" ]] || ! dd if="${GRUB}" bs=512 count=1 2>/dev/null | cat -v | cp -a "${MNTPOINT}"/usr/lib/grub/i386-pc "${MNTPOINT}/boot/grub/" ;; esac + dd if="${MNTPOINT}/usr/lib/grub/i386-pc/boot.img" of="${ORIG_TARGET}" conv=notrunc bs=440 count=1 chroot "${MNTPOINT}" grub-mkimage -O i386-pc -p "(hd0,msdos1)/boot/grub" -o /tmp/core.img biosdisk part_msdos ext2 - dd if="${MNTPOINT}/tmp/core.img" of="${ORIG_TARGET}" conv=notrunc seek=4 + dd if="${MNTPOINT}/tmp/core.img" of="${ORIG_TARGET}" conv=notrunc seek=1 rm -f "${MNTPOINT}/tmp/core.img" fi @@ -1292,6 +1370,7 @@ preparechroot() { [ -n "$DEFAULT_LOCALES" ] && echo "DEFAULT_LOCALES='$(sed "s,','\\\\'',g" <<<"${DEFAULT_LOCALES}")'" >> "$CHROOT_VARIABLES" [ -n "$DEFAULT_LANGUAGE" ] && echo "DEFAULT_LANGUAGE='$(sed "s,','\\\\'',g" <<<"${DEFAULT_LANGUAGE}")'" >> "$CHROOT_VARIABLES" [ -n "$EXTRAPACKAGES" ] && echo "EXTRAPACKAGES='$(sed "s,','\\\\'',g" <<<"${EXTRAPACKAGES}")'" >> "$CHROOT_VARIABLES" + [ -n "$EFI" ] && echo "EFI='$(sed "s,','\\\\'',g" <<<"${EFI}")'" >> "$CHROOT_VARIABLES" [ -n "$FALLBACK_MIRROR" ] && echo "FALLBACK_MIRROR='$(sed "s,','\\\\'',g" <<<"${FALLBACK_MIRROR}")'" >> "$CHROOT_VARIABLES" [ -n "$FORCE" ] && echo "FORCE='$(sed "s,','\\\\'',g" <<<"${FORCE}")'" >> "$CHROOT_VARIABLES" [ -n "$GRMLREPOS" ] && echo "GRMLREPOS='$(sed "s,','\\\\'',g" <<<"${GRMLREPOS}")'" >> "$CHROOT_VARIABLES" @@ -1451,8 +1530,9 @@ execute_pre_scripts() { # execute all scripts in /etc/debootstrap/post-scripts/ {{{ execute_post_scripts() { - # make sure we have $MNTPOINT available for our 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/ @@ -1589,7 +1669,7 @@ remove_configs() { # }}} # now execute all the functions {{{ -for i in prepare_vm mkfs tunefs mount_target debootstrap_system \ +for i in format_efi_partition prepare_vm mkfs tunefs mount_target debootstrap_system \ preparechroot execute_pre_scripts chrootscript execute_post_scripts \ remove_configs umount_chroot finalize_vm fscktool ; do if stage "${i}" ; then