. /etc/debootstrap/variables || exit 1
[ -r /proc/1 ] || mount -t proc none /proc
+[ -r /sys/kernel ] || mount -t sysfs none /sys
# variable checks {{{
echo "${TARGET} / auto defaults,errors=remount-ro 0 1" > /etc/fstab
fi
+if [ -n "$EFI" ] ; then
+ echo "UUID=$(blkid -o value -s UUID $EFI) /boot/efi vfat umask=0077 0 1" >> /etc/fstab
+fi
+
cat >> /etc/fstab << EOF
proc /proc proc defaults 0 0
/dev/cdrom /mnt/cdrom0 iso9660 ro,user,noauto 0 0
}
# }}}
+efi_setup() {
+ if [ -z "$EFI" ] ; then
+ return 0
+ fi
+
+ if ! dpkg --list efibootmgr 2>/dev/null | grep -q '^ii' ; then
+ echo "Notice: efi option set but no efibootmgr package, installing it therefore."
+ DEBIAN_FRONTEND=$DEBIAN_FRONTEND $APTINSTALL efibootmgr
+ fi
+
+ mkdir -p /boot/efi
+ echo "Mounting $EFI on /boot/efi"
+ mount "$EFI" /boot/efi || return 1
+
+ echo "Invoking efibootmgr"
+ efibootmgr || return 1
+}
+
# grub configuration/installation {{{
grub_install() {
return 0
fi
+ efi_setup || return 1
+
+ if [ -n "$EFI" ] ; then
+ GRUB_PACKAGE=grub-efi-amd64
+ else
+ GRUB_PACKAGE=grub-pc
+ fi
+
# 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
- echo "Setting grub-pc debconf configuration for install device to $GRUB"
- echo "grub-pc grub-pc/install_devices multiselect $GRUB" | debconf-set-selections
+ echo "Setting ${GRUB_PACKAGE} debconf configuration for install device to $GRUB"
+ echo "${GRUB_PACKAGE} ${GRUB_PACKAGE}/install_devices multiselect $GRUB" | debconf-set-selections
- if ! dpkg --list grub-pc 2>/dev/null | grep -q '^ii' ; then
- echo "Notice: grub option set but no grub-pc package, installing it therefore."
- DEBIAN_FRONTEND=$DEBIAN_FRONTEND $APTINSTALL grub-pc
+ 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."
+ DEBIAN_FRONTEND=$DEBIAN_FRONTEND $APTINSTALL ${GRUB_PACKAGE}
fi
if ! [ -x "$(which grub-install)" ] ; then
return 1
fi
+ mountpoint /boot/efi >/dev/null && umount /boot/efi
+
$UPDATEGRUB
}
# }}}
[ -n "$POLICYRCD" ] && rm -f /usr/sbin/policy-rc.d
+ umount /sys >/dev/null 2>/dev/null || true
umount /proc >/dev/null 2>/dev/null || true
}
# }}}
# should be handled in the main script, where it belongs.
################################################################################
-CMDLINE_OPTS=mirror:,iso:,release:,target:,mntpoint:,debopt:,defaultinterfaces,interactive,nodebootstrap,nointerfaces,nokernel,nopackages,filesystem:,config:,confdir:,packages:,chroot-scripts:,scripts:,post-scripts:,pre-scripts:,debconf:,vm,vmfile,vmsize:,keep_src_list,hostname:,password:,nopassword,grmlrepos,backportrepos,bootappend:,grub:,arch:,insecure,verbose,help,version,force,debug,contrib,non-free,remove-configs
+CMDLINE_OPTS=mirror:,iso:,release:,target:,mntpoint:,debopt:,defaultinterfaces,interactive,nodebootstrap,nointerfaces,nokernel,nopackages,filesystem:,config:,confdir:,packages:,chroot-scripts:,scripts:,post-scripts:,pre-scripts:,debconf:,vm,vmfile,vmsize:,keep_src_list,hostname:,password:,nopassword,grmlrepos,backportrepos,bootappend:,grub:,efi:,arch:,insecure,verbose,help,version,force,debug,contrib,non-free,remove-configs
_opt_temp=`getopt --name grml-debootstrap -o +m:i:r:t:p:c:d:vhV --long \
$CMDLINE_OPTS -- "$@"`
--grub) # Target for grub installation. Use grub syntax for specifying
shift; _opt_grub="$1"
;;
+ --efi) # Target for EFI boot installation
+ shift; _opt_efi="$1"
+ ;;
--contrib) # Add 'contrib' to list of components
_opt_contrib=T
;;
--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
}
# }}}
+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 ; 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"
[ -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"
# }}}
# 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
Execute in very verbose way. Useful for debugging possible problems
with grml-debootstrap or identify what's actually executed.
+*--efi* _device_::
+
+ Partition where EFI boot manager should be installed to. If the
+ specified device doesn't use a FAT filesystem yet grml-debootstrap
+ automatically creates the filesystem. If a FAT filesystem is already
+ present the filesystem creation is skipped. Please ensure that it's
+ a valid FAT32 filesystem and the partition has the 'boot' and 'esp'
+ flags enabled. This option requires EFI support on the running system
+ and the option is NOT supported for Virtual Machine deployments.
+
*--filesystem* _filesystem_::
Filesystem that should be created when installing to a partition.