[ -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'
-m, --mirror <URL> Mirror which should be used for apt-get/aptitude.
-i, --iso <mnt> Mountpoint where a Debian ISO is mounted to, for use
instead of fetching packages from a mirror.
- -r, --release <name> Release of new Debian system (default: jessie).
+ -r, --release <name> Release of new Debian system (default: stretch).
-t, --target <target> Target partition (/dev/...) or directory where the
system should be installed to.
-p, --mntpoint <mnt> Mountpoint used for mounting the target system,
--interactive Use interactive mode (frontend).
--nodebootstrap Skip debootstrap, only do configuration to the target.
--grub <device> Target for grub installation. Usage example: /dev/sda
+ --efi <device> Target for EFI installation. Usage example: /dev/sda1
--arch <arch> Set target architecture, use for installing i386 on amd64.
--filesystem <fs> Filesystem that should be used when target is a partition
or Virtual Machine (see --vmfile).
[ "$_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
# 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
# }}}
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"
# 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 \
}
# }}}
+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
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
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"
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
# 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
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}
;;
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
[ -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"
# 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
# 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/
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
# }}}
# 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