X-Git-Url: https://git.grml.org/?p=grml-debootstrap.git;a=blobdiff_plain;f=grml-debootstrap;h=135b660ade04ac17f30bca7d315382dfaea6cecc;hp=d3932f07ba13fb62d93af2f98bf2d37674131e1e;hb=05ed1a4c5039c78a991d55fd93296e620c6bf900;hpb=7e3c788fd3874cecf4aab08011fda562c1f1ae70 diff --git a/grml-debootstrap b/grml-debootstrap index d3932f0..135b660 100755 --- a/grml-debootstrap +++ b/grml-debootstrap @@ -72,7 +72,7 @@ MNTPOINT="/mnt/debootstrap.$$" [ -n "$POST_SCRIPTS" ] || POST_SCRIPTS='yes' [ -n "$PRE_SCRIPTS" ] || PRE_SCRIPTS='yes' [ -n "$RECONFIGURE" ] || RECONFIGURE='console-data' -[ -n "$RELEASE" ] || RELEASE='jessie' +[ -n "$RELEASE" ] || RELEASE='stretch' [ -n "$RM_APTCACHE" ] || RM_APTCACHE='yes' [ -n "$SCRIPTS" ] || SCRIPTS='no' # deprecated, replaced by POST_SCRIPTS [ -n "$SECURE" ] || SECURE='yes' @@ -102,7 +102,7 @@ Bootstrap options: -m, --mirror Mirror which should be used for apt-get/aptitude. -i, --iso Mountpoint where a Debian ISO is mounted to, for use instead of fetching packages from a mirror. - -r, --release Release of new Debian system (default: jessie). + -r, --release Release of new Debian system (default: stretch). -t, --target Target partition (/dev/...) or directory where the system should be installed to. -p, --mntpoint Mountpoint used for mounting the target system, @@ -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 @@ -461,7 +463,7 @@ if [ -n "$CONFIGFILE" ] ; then fi # }}} -# backwards compability checks {{{ +# backwards compatibility checks {{{ if [ -n "$GROOT" ] ; then eerror "Error: you seem to have \$GROOT configured." eerror "This variable is no longer supported, please visit the" @@ -586,7 +588,7 @@ prompt_for_bootmanager() # ask for Debian release {{{ prompt_for_release() { - [ -n "$RELEASE" ] && DEFAULT_RELEASE="$RELEASE" || DEFAULT_RELEASE='jessie' + [ -n "$RELEASE" ] && DEFAULT_RELEASE="$RELEASE" || DEFAULT_RELEASE='stretch' RELEASE="$(dialog --stdout --title "${PN}" --default-item $DEFAULT_RELEASE --menu \ "Please enter the Debian release you would like to use for installation:" \ 0 50 5 \ @@ -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 formatted, 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 @@ -1036,14 +1113,52 @@ mkfs() { # race conditions :-/ sleep 2 - eval "$(blkid -o udev "$TARGET" 2>/dev/null)" - [ -n "$ID_FS_UUID" ] && TARGET_UUID="$ID_FS_UUID" || TARGET_UUID="" - eend $RC fi } # }}} +identify_target_uuid() { + local device="$1" + + if ! [ -b "$device" ] ; then + return 1 + fi + + eval "$(blkid -o udev "$1" 2>/dev/null)" + + if [ -n "$ID_FS_UUID" ] ; then + echo "$ID_FS_UUID" + else + return 1 + fi +} + +mountpoint_to_blockdevice() { + TARGET_UUID='' + + TARGET_UUID=$(identify_target_uuid "$TARGET" 2>/dev/null || true) + if [ -n "$TARGET_UUID" ] ; then + einfo "Identified UUID $TARGET_UUID for $TARGET" + return 0 + fi + + # $TARGET might be a mountpoint and not a blockdevice, search for according entry + for file in /sys/block/*/*/dev ; do + if grep -q "^$(mountpoint -d "${TARGET}")$" "$file" ; then + local dev + dev="${file%/dev}" + dev="/dev/${dev##*/}" + TARGET_UUID=$(identify_target_uuid "$dev" 2>/dev/null || true) + + if [ -n "$TARGET_UUID" ] ; then + einfo "Identified UUID $TARGET_UUID for $TARGET (via $file)" + return 0 + fi + fi + done +} + # modify filesystem settings {{{ tunefs() { if [ -n "$TUNE2FS" ] && echo "$MKFS" | grep -q "mkfs.ext" ; then @@ -1164,8 +1279,8 @@ finalize_vm() { mount -t proc none "${MNTPOINT}"/proc mount -t sysfs none "${MNTPOINT}"/sys - mount --bind /dev "${MNTPOINT}"/dev - mount --bind /dev/pts "${MNTPOINT}"/dev/pts + mount -t devtmpfs udev "${MNTPOINT}"/dev + mount -t devpts devpts "${MNTPOINT}"/dev/pts # Has chroot-script installed GRUB to MBR using grub-install (successfully), already? # chroot-script skips installation for unset ${GRUB} @@ -1211,17 +1326,13 @@ fi ;; esac - case "$RELEASE" in - lenny|squeeze|wheezy) - 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." - else - einfo "Adjusting grub.cfg for successful boot sequence." - sed -i "s;root=[^ ]\+;root=UUID=$TARGET_UUID;" "${MNTPOINT}"/boot/grub/grub.cfg - fi - ;; - 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." + else + einfo "Adjusting grub.cfg for successful boot sequence." + sed -i "s;root=[^ ]\+;root=UUID=$TARGET_UUID;" "${MNTPOINT}"/boot/grub/grub.cfg + fi umount "${MNTPOINT}"/proc umount "${MNTPOINT}"/sys @@ -1293,6 +1404,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" @@ -1367,11 +1479,6 @@ preparechroot() { # make sure we can access network [relevant for cdebootstrap] [ -f "${MNTPOINT}"/etc/resolv.conf ] || cp $VERBOSE /etc/resolv.conf "${MNTPOINT}"/etc/resolv.conf - # provide system's /etc/hosts to the target: - if ! [ -f "$MNTPOINT/etc/hosts" ] ; then - cp $VERBOSE /etc/hosts "${MNTPOINT}"/etc/hosts - fi - # setup default locales [ -n "$LOCALES" ] && cp $VERBOSE "${CONFFILES}"/locale.gen "${MNTPOINT}"/etc/locale.gen @@ -1452,8 +1559,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/ @@ -1505,8 +1613,8 @@ chrootscript() { eend 1 else einfo "Executing chroot-script now" - mount --bind /dev "$MNTPOINT"/dev - mount --bind /dev/pts "$MNTPOINT"/dev/pts + 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 ; RC=$? else @@ -1590,7 +1698,8 @@ 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 mountpoint_to_blockdevice debootstrap_system \ preparechroot execute_pre_scripts chrootscript execute_post_scripts \ remove_configs umount_chroot finalize_vm fscktool ; do if stage "${i}" ; then