# Filename: grml-debootstrap
# Purpose: wrapper around debootstrap for installing plain Debian via Grml
# Authors: grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
-# Bug-Reports: see http://grml.org/bugs/
+# Bug-Reports: see https://grml.org/bugs/
# License: This file is licensed under the GPL v2+
################################################################################
[ -n "$POST_SCRIPTS" ] || POST_SCRIPTS='yes'
[ -n "$PRE_SCRIPTS" ] || PRE_SCRIPTS='yes'
[ -n "$RECONFIGURE" ] || RECONFIGURE='console-data'
-[ -n "$RELEASE" ] || RELEASE='stretch'
+[ -n "$RELEASE" ] || RELEASE='buster'
[ -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: stretch).
+ -r, --release <name> Release of new Debian system (default: buster).
-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,
--hostname <name> Hostname of Debian system.
--nopassword Do not prompt for the root password.
--password <pwd> Use specified password as password for user root.
+ --sshcopyid Use locally available public keys to authorise root login on the target system.
--bootappend <line> Add specified appendline to kernel whilst booting.
--chroot-scripts <d> Execute chroot scripts from specified directory.
--pre-scripts <dir> Execute scripts from specified directory (before chroot-scripts).
-V, --version Show summary of options and exit.
Usage examples can be found in the grml-debootstrap manpage.
-Send bugreports to the grml-team: bugs (at) grml.org || http://grml.org/bugs/
+Send bugreports to the grml-team: bugs (at) grml.org || https://grml.org/bugs/
"
}
# ugly, but make sure we really don't leave anything (/proc /proc and
# /dev /dev are intended, trying to work around timing issues, see #657023)
- for ARG in /sys /proc /proc /dev/pts /dev/pts /dev /dev ; do
+ for ARG in /run/udev /sys /proc /proc /dev/pts /dev/pts /dev /dev ; do
[ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount $ARG >/dev/null 2>&1
umount "$MNTPOINT"/$ARG >/dev/null 2>&1
done
# }}}
# make sure we have what we need {{{
-check4progs debootstrap || bailout 1
+check4progs "${DEBOOTSTRAP}" || bailout 1
# }}}
# source main configuration file {{{
# }}}
# cmdline handling {{{
-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
+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,sshcopyid
_opt_temp=$(getopt --name grml-debootstrap -o +m:i:r:t:p:c:d:vhV --long \
$CMDLINE_OPTS -- "$@")
--nopassword) # Skip password dialog
_opt_nopassword=T
;;
+ --sshcopyid) # Use locally available public keys to authorise root login on the target system
+ _opt_sshcopyid=T
+ ;;
--grmlrepos) # Enable Grml repository
_opt_grmlrepos=T
;;
[ "$_opt_defaultinterfaces" ] && USE_DEFAULT_INTERFACES="true"
[ "$_opt_nointerfaces" ] && NOINTERFACES="true"
[ "$_opt_nokernel" ] && NOKERNEL="true"
+[ "$_opt_sshcopyid" ] && SSHCOPYID="true"
[ "$_opt_bootappend" ] && BOOT_APPEND=$_opt_bootappend
[ "$_opt_grub" ] && GRUB=$_opt_grub
[ "$_opt_efi" ] && EFI=$_opt_efi
bailout 1
fi
+if [ -n "$ISO" ] && [[ "$DEBOOTSTRAP" =~ mmdebstrap$ ]] ; then
+ eerror "The ISO option is incompatible with usage of mmdebstrap for bootstrapping."
+ eerror "Either drop the --iso ... option or use plain debootstrap instead."
+ eend 1
+ bailout 1
+fi
if [ "$DEBUG" = "true" ] ; then
set -x
[ "$_opt_version" ] && {
einfo "$PN - version $VERSION"
- einfo "Send bug reports to bugs@grml.org or http://grml.org/bugs/"
+ einfo "Report bugs via https://github.com/grml/grml-debootstrap/ or https://grml.org/bugs/"
eend 0
exit 0
}
# ask for Debian release {{{
prompt_for_release()
{
- [ -n "$RELEASE" ] && DEFAULT_RELEASE="$RELEASE" || DEFAULT_RELEASE='stretch'
+ [ -n "$RELEASE" ] && DEFAULT_RELEASE="$RELEASE" || DEFAULT_RELEASE='buster'
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 \
+ 0 50 8 \
lenny Debian/5.0 \
squeeze Debian/6.0 \
wheezy Debian/7.0 \
jessie Debian/8.0 \
stretch Debian/9.0 \
+ buster Debian/10.0 \
+ bullseye Debian/11.0 \
sid Debian/unstable)"
[ $? -eq 0 ] || bailout
}
# Support for generic release codenames is unavailable. {{{
if [ "$RELEASE" = "stable" ] || [ "$RELEASE" = "testing" ] ; then
eerror "Generic release codenames (stable, testing) are unsupported. \
-Please use specific codenames such as lenny, squeeze, wheezy, jessie or stretch." ; eend 1
+Please use specific codenames such as stretch or buster." ; eend 1
bailout 1
fi
# }}}
if [ -b "$TARGET" ] || [ -n "$VIRTUAL" ] ; then
PARTITION=1
else
+ # $TARGET was not detected as block device, but we do not want to create target directory in /dev/
+ if [[ $TARGET == "/dev/"* ]]; then
+ eerror "Error: Will not create target directory $TARGET in /dev."
+ eerror " Please check the partition(s) of the blockdevice."; eend 1
+ bailout 1
+ fi
set_target_directory
fi
# }}}
fi
einfo "Updating grub configuration file."
- if [ -n "$BOOT_APPEND" ] ; then
- sed -i "/GRUB_CMDLINE_LINUX_DEFAULT/ s#\"\$# ${BOOT_APPEND}\"#" "${MNTPOINT}"/etc/default/grub
- fi
chroot "${MNTPOINT}" update-grub
case "$RELEASE" in
# e.g. not with 4.2.37(1)-release (a.k.a 4.2+dfsg-0.1+deb7u3) of Debian wheezy
[ -n "$ARCH" ] && echo "ARCH='$(sed "s,','\\\\'',g" <<<"${ARCH}")'" >> "$CHROOT_VARIABLES"
[ -n "$BACKPORTREPOS" ] && echo "BACKPORTREPOS='$(sed "s,','\\\\'',g" <<<"${BACKPORTREPOS}")'" >> "$CHROOT_VARIABLES"
+ [ -n "$BOOT_APPEND" ] && echo "BOOT_APPEND='$(sed "s,','\\\\'',g" <<<"${BOOT_APPEND}")'" >> "$CHROOT_VARIABLES"
[ -n "$CHROOT_SCRIPTS" ] && echo "CHROOT_SCRIPTS='$(sed "s,','\\\\'',g" <<<"${CHROOT_SCRIPTS}")'" >> "$CHROOT_VARIABLES"
[ -n "$COMPONENTS" ] && echo "COMPONENTS='$(sed "s,','\\\\'',g" <<<"${COMPONENTS}")'" >> "$CHROOT_VARIABLES"
[ -n "$CONFFILES" ] && echo "CONFFILES='$(sed "s,','\\\\'',g" <<<"${CONFFILES}")'" >> "$CHROOT_VARIABLES"
cp $VERBOSE -a -L "${CONFFILES}"/extrapackages/ "${MNTPOINT}"/etc/debootstrap/
- # make sure we can access network [relevant for cdebootstrap]
+ # make sure we can access network [relevant for cdebootstrap/mmdebstrap]
[ -f "${MNTPOINT}"/etc/resolv.conf ] || cp $VERBOSE /etc/resolv.conf "${MNTPOINT}"/etc/resolv.conf
# setup default locales
iface eth0 inet dhcp
"
+ # add dhcp setting for Predictable Network Interface Names
+ if [ -x /bin/udevadm ]; then
+ tmpfile=$(mktemp)
+ for interface in /sys/class/net/*; do
+ udevadm info --query=all --path="${interface}" > "${tmpfile}"
+ # skip virtual devices, like bridges, vboxnet,...
+ if grep -q 'P: /devices/virtual/net/' "${tmpfile}" ; then
+ continue
+ fi
+
+ # iterate over possible naming policies by precedence (see udev/net/link-config.c),
+ # use and stop on first match to have same behavior as udev's link_config_apply()
+ for property in ID_NET_NAME_FROM_DATABASE ID_NET_NAME_ONBOARD ID_NET_NAME_SLOT ID_NET_NAME_PATH ID_NET_NAME_MAC ; do
+ if grep -q "${property}" "${tmpfile}" ; then
+ interface=$(grep "${property}" "${tmpfile}" | sed -n -e "s/E: ${property}=\([^\$*]\)/\1/p")
+ DEFAULT_INTERFACES="${DEFAULT_INTERFACES}
+allow-hotplug ${interface}
+iface ${interface} inet dhcp
+"
+ break
+ fi
+ done
+ done
+ rm -f "${tmpfile}"
+ fi
+
if [ -n "$NOINTERFACES" ] ; then
einfo "Not installing /etc/network/interfaces as requested via --nointerfaces option" ; eend 0
elif [ -n "$USE_DEFAULT_INTERFACES" ] ; then
einfo "Installing default /etc/network/interfaces as requested via --defaultinterfaces options."
+ mkdir -p "${MNTPOINT}/etc/network"
echo "$DEFAULT_INTERFACES" > "${MNTPOINT}/etc/network/interfaces"
eend $?
elif [ -n "$VIRTUAL" ] ; then
einfo "Setting up Virtual Machine, installing default /etc/network/interfaces"
+ mkdir -p "${MNTPOINT}/etc/network"
echo "$DEFAULT_INTERFACES" > "${MNTPOINT}/etc/network/interfaces"
eend $?
elif [ -r /etc/network/interfaces ] ; then
einfo "Copying /etc/network/interfaces from host to target system"
+ mkdir -p "${MNTPOINT}/etc/network"
cp $VERBOSE /etc/network/interfaces "${MNTPOINT}/etc/network/interfaces"
eend $?
else
ewarn "Couldn't read /etc/network/interfaces, installing default /etc/network/interfaces"
+ mkdir -p "${MNTPOINT}/etc/network"
echo "$DEFAULT_INTERFACES" > "${MNTPOINT}/etc/network/interfaces"
eend $?
fi
# install config file providing some example entries
if [ -r /etc/network/interfaces.examples ] && [ ! -r "$MNTPOINT/etc/network/interfaces.examples" ] ; then
- cp /etc/network/interfaces.examples "$MNTPOINT/etc/network/interfaces.examples"
+ mkdir -p "${MNTPOINT}/etc/network"
+ cp /etc/network/interfaces.examples "$MNTPOINT/etc/network/interfaces.examples"
+ fi
+
+ if [ -n "${SSHCOPYID}" ] ; then
+ if ssh-add -L >/dev/null 2>&1 ; then
+ einfo "Use locally available public keys to authorise root login on the target system as requested via --sshcopyid option."
+ mkdir -p "${MNTPOINT}"/root/.ssh
+ chmod 0700 "${MNTPOINT}"/root/.ssh
+ if ssh-add -L >> "${MNTPOINT}"/root/.ssh/authorized_keys ; then
+ eend 0
+ else
+ eerror "Error: executing 'ssh-add -L' failed."
+ eend 1
+ bailout 1
+ fi
+ else
+ eerror "Could not open a connection to your authentication agent or the agent has no identites."
+ eend 1
+ bailout 1
+ fi
+ fi
+
+ if [ -d /run/udev ] ; then
+ einfo "Setting up bind-mount /run/udev"
+ mkdir -p "${MNTPOINT}"/run/udev
+ mount --bind /run/udev "${MNTPOINT}"/run/udev
+ eend $?
fi
eend 0
fi
if grep -q "$MNTPOINT" /proc/mounts ; then
+ if mountpoint "${MNTPOINT}"/run/udev &>/dev/null ; then
+ einfo "Unmounting bind-mount /run/udev"
+ umount "${MNTPOINT}"/run/udev
+ eend $?
+ fi
+
if [ -n "$PARTITION" ] ; then
einfo "Unmount $MNTPOINT"
umount "$MNTPOINT"