# Authors: grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
# Bug-Reports: see http://grml.org/bugs/
# License: This file is licensed under the GPL v2.
-# Latest change: Wed Aug 27 01:46:13 CEST 2008 [mika]
################################################################################
# http://www.debian.org/releases/stable/i386/index.html.en
-c|--config <configfile> Use specified configuration file,
defaults to /etc/debootstrap/config
+ --hostname <hostname> Hostname of Debian system
-i|--iso <mnt> Mountpoint where a Debian ISO is mounted to,
for use instead of fetching packages from a mirror
-m|--mirror <URL> Mirror which should be used for apt-get/aptitude.
"
}
-if [ "$1" = '-h' ] || [ "$1" == '-help' ] ; then
+if [ "$1" = '-h' ] || [ "$1" = '-help' ] ; then
usage
echo 'Please notice that this script requires root permissions!'
exit 0
eend 0
exit 0
;;
+ --hostname)
+ shift
+ HOSTNAME=$1
+ ;;
--interactive)
INTERACTIVE=1
;;
done
# }}}
+# welcome screen {{{
+welcome_dialog()
+{
+ dialog --title "$PN" --yesno "Welcome to the interactive configuration of ${PN}.
+Do you want to continue installing Debian using this frontend?" 0 0
+}
+# }}}
+
# ask for target {{{
prompt_for_target()
{
OIFS="$IFS"; IFS=:
- [[ $TARGET == *md* ]] && MBRPART=$TARGET || MBRPART="${TARGET%[0-9]}"
+ if echo $TARGET | grep -q "/dev/md" ; then
+ MBRPART="all disks of Software RAID $TARGET"
+ else
+ MBRPART="MBR of ${TARGET%[0-9]}"
+ fi
GETMBR=$(dialog --stdout --title "$PN" --default-item mbr \
--menu "Where do you want to install the bootmanager grub?" 0 0 0 \
- mbr "install bootmanager into MBR of $MBRPART" \
+ mbr "install bootmanager into $MBRPART" \
partition "install bootmanager into partition $TARGET" \
- nowhere "do NOT install bootmanager at all" \
+ nowhere "do not install bootmanager at all" \
${ADDITIONAL_PARAMS})
[ $? -eq 0 ] || bailout 3
IFS="$OIFS"
case "$GETMBR" in
mbr)
- USE_MBR=1
# /dev/md0: has to be installed in MBR of /dev/md0 and not in /dev/md:
- if [[ $TARGET == *md* ]] ; then
- BOOT_PARTITION=${TARGET}
+ if echo $TARGET | grep -q "*md*" ; then
+ BOOT_PARTITION="${TARGET}"
else
- BOOT_PARTITION=${TARGET%[0-9]}
+ BOOT_PARTITION="${TARGET%[0-9]}"
fi
;;
partition)
BOOT_PARTITION="$TARGET"
;;
hda)
- USE_MBR=1
BOOT_PARTITION="/dev/hda"
;;
sda)
- USE_MBR=1
BOOT_PARTITION="/dev/sda"
;;
- none)
+ nowhere)
BOOT_PARTITION=''
;;
- *)
- BOOT_PARTITION="$GETMBR"
- ;;
esac
}
# }}}
+# ask for Debian release {{{
+prompt_for_release()
+{
+ RELEASE="$(dialog --stdout --title "${PN}" --default-item etch --menu \
+ "Please enter the Debian release you would like to use for installation:" \
+ 0 50 3 \
+ etch Debian/stable \
+ lenny Debian/testing \
+ sid Debian/unstable)"
+}
+# }}}
+
+# ask for hostname {{{
+prompt_for_hostname()
+{
+ HOSTNAME="$(dialog --stdout --title "${PN}" --inputbox \
+ "Please enter the hostname you would like to use for installation:" \
+ 0 0 grml)"
+}
+# }}}
+
# ask for Debian mirror {{{
prompt_for_mirror()
{
}
# }}}
-# get grub's syntax for /dev/ice
-# usage example: 'grubdevice /dev/hda2' returns '(hd0,1)'
+# get grub's syntax for /dev/ice {{{
+# usage example: 'grubdevice /dev/sda2' returns 'hd0,1'
grubdevice() {
if [ -z "$1" ] ; then
echo "Usage: grubdevice <device>">&2
echo 'quit' | grub --device-map="$device_map" 1>/dev/null 2>&1
fi
- # taken from d-i's trunk/packages/arch/i386/grub-installer/grub-installer:
+ # based on code from d-i's trunk/packages/arch/i386/grub-installer/grub-installer:
tmp_disk=`echo "$device" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' \
-e 's%\(fd[0-9]*\)$%\1%' \
-e 's%/part[0-9]*$%/disc%' \
-e 's%.*/\(disc\|part\([0-9]*\)\)$%\2%' \
-e 's%.*c[0-7]d[0-9]*p*%%'`
tmp_drive=$(grep -v '^#' $device_map | grep "$tmp_disk *$" | sed 's%.*\([hf]d[0-9][a-g0-9,]*\).*%\1%')
- GRUB="$(echo "$tmp_drive")"
case $1 in
/dev/[sh]d[a-z]) # we expect something like 'hd0'
- GROOT="$(echo "$tmp_drive")"
+ echo "$tmp_drive"
;;
*) # we expect something like 'hd0,0'
- # make sure we don't install into MBR if $USE_MBR is not set
- if [ -z "$USE_MBR" ] ; then
- GROOT="$(echo "$tmp_drive" | sed "s%)$%,`expr $tmp_part - 1`)%")"
- else
- GROOT="$(echo "$tmp_drive" | sed "s%,[0-9]%%")"
- fi
+ echo "$tmp_drive" | sed "s%$%,`expr $tmp_part - 1`%" # FIXME => md0
;;
esac
}
+# }}}
+
+# software raid setup {{{
+config_swraid_setup()
+{
+TMPFILE=$(mktemp)
+RAIDLEVEL=$(dialog --stdout --title "$PN" --default-item raid1 \
+ --menu "Which RAID level do you want to use?" 0 0 0 \
+ raid1 "Software RAID level 1" \
+ raid5 "Software RAID level 5")
+[ $? -eq 0 ] || bailout 20
+
+MD_LIST=$(for i in $(seq 0 9) ; do
+ awk '{print $4}' /proc/partitions | grep -q md$i || \
+ echo "/dev/md$i /dev/md$i"
+ done)
+
+TARGET=$(dialog --stdout --title "$PN" --default-item /dev/md0 \
+--menu "Which device do you want to use for ${RAIDLEVEL}?
+
+Notice: activated devices will not be listed for security reasons. Anyway, please make sure the selected device is not in use already!" 0 0 0 \
+$MD_LIST)
+[ $? -eq 0 ] || bailout 20
+
+AVAILABLE_PARTITIONS=$(LANG=C fdisk -l 2>/dev/null | \
+ sed 's/*//' | \
+ grep -v 'Extended$' | \
+ gawk -v num=0 -v ORS=' ' '/^\/dev\// {print $1}')
+[ -n "$AVAILABLE_PARTITIONS" ] || echo "FIXME: no partitions available?"
+PARTITION_LIST=$(for i in $(echo $AVAILABLE_PARTITIONS) ; do
+ echo "$i $(vol_id --type $i 2>/dev/null || echo [no_filesystem_yet]) off"
+ done)
+
+dialog --title "$PN" \
+ --single-quoted \
+ --checklist "Please select the partitions you would like to use for your $RAIDLEVEL on ${TARGET}:" 0 0 0 \
+ $PARTITION_LIST 2>$TMPFILE
+RETVAL=$?
+SELECTED_PARTITIONS="$(cat $TMPFILE)"
+
+NUM_PARTITIONS=0
+for i in $(cat $TMPFILE) ; do
+ NUM_PARTITIONS=$((${NUM_PARTITIONS}+1))
+done
+
+ERRORFILE=$(mktemp)
+set +e
+# TODO: better error handling?
+yes | mdadm --create "${TARGET}" --level="${RAIDLEVEL}" \
+ --raid-devices="${NUM_PARTITIONS}" ${SELECTED_PARTITIONS} 1>/dev/null 2>$ERRORFILE
+RC=$?
+set -e
+
+if [ "$RC" = 0 ] ; then
+ dialog --title "$PN" --msgbox \
+ "Creating $TARGET was successful." 0 0
+ rm -f "$TMPFILE" "$ERRORFILE"
+else
+ dialog --title "$PN" --msgbox \
+ "There was an error setting up $TARGET:
+
+$(cat $ERRORFILE)
+
+Exiting." 0 0
+ rm -f "$TMPFILE" "$ERRORFILE"
+ exit 1
+fi
+
+}
+
+prompt_for_swraid()
+{
+if dialog --stdout --title "$PN" \
+ --defaultno --yesno "Do you want to configure Software RAID?
+
+Please notice that currently only RAID levels 1 and 5 are supported by ${PN}. Configuration will take place using mdadm." 0 0 ; then
+ config_swraid_setup
+fi
+}
+# }}}
+
+# make sure the user is aware of the used configuration {{{
+checkconfiguration()
+{
+if [ -n "$AUTOINSTALL" ] ; then
+ if checkforrun ; then
+ eerror "Exiting as requested" ; eend 0
+ exit 1
+ fi
+elif [ -n "$INTERACTIVE" ] ; then
+
+ INFOTEXT="Please recheck configuration before execution:
+ "
+ [ -n "$TARGET" ] && INFOTEXT="$INFOTEXT
+ Target: $TARGET"
+ [ -n "$GRUB" ] && INFOTEXT="$INFOTEXT
+ Install grub: $GRUB"
+ [ -n "$RELEASE" ] && INFOTEXT="$INFOTEXT
+ Using release: $RELEASE"
+ [ -n "$MIRROR" ] && INFOTEXT="$INFOTEXT
+ Using mirror: $MIRROR"
+
+ INFOTEXT="$INFOTEXT
+
+Is this ok for you? Notice: selecting 'No' will exit ${PN}."
+
+ dialog --title "$PN" --no-collapse \
+ --yesno "$INFOTEXT" 0 0
+
+else # if not running automatic installation display configuration and prompt for execution:
+ einfo "$PN - Please recheck configuration before execution:"
+ echo
+ echo " Target: $TARGET"
+ case "$MNTPOINT" in "$TARGET") ;; *) echo " Mount point: $MNTPOINT" ;; esac
+ [ -n "$GRUB" ] && echo " Install grub: $GRUB" || echo " Install grub: no"
+ [ -n "$RELEASE" ] && echo " Using release: $RELEASE"
+ [ -n "$MIRROR" ] && echo " Using mirror: $MIRROR"
+ [ -n "$ISO" ] && echo " Using iso: $ISO"
+ case "$MNTPOINT" in "$TARGET") ;; *) echo " Important! Continuing will delete all data from ${TARGET}!" ;; esac
+ echo
+ einfon "Is this ok for you? [y/N] "
+ read a
+ if ! [ "$a" = 'y' -o "$a" = 'Y' ] ; then
+ eerror "Exiting as requested." ; eend 1
+ exit 1
+ fi
+fi
+}
+# }}}
# interactive mode {{{
interactive_mode()
{
- prompt_for_target
+ welcome_dialog
+
+ prompt_for_swraid
+
+ # do not prompt for partition dialog if swraid has been configured already
+ [ -n "$TARGET" ] || prompt_for_target
+
prompt_for_bootmanager
+
+ prompt_for_release
+
+ prompt_for_hostname
+
+ # use first disk of sw-raid for grub by default, install grub on
+ # all involved disks later on
+ if echo "$TARGET" | grep -q '/dev/md' ; then
+ if [ -n "$SELECTED_PARTITIONS" ] ; then # using sw-raid
+ # use hdX and not hdX,Y for $GRUB
+ TMPDEVICE=$(echo ${SELECTED_PARTITIONS} | awk '{print $1}') # use first disk only
+ GRUB="$(grubdevice ${TMPDEVICE%%[0-9]})" # like: hd0
+ GROOT="$(grubdevice ${TMPDEVICE})" # like: hd0,0
+ echo "debug: GRUB = $GRUB - GROOT = $GROOT" >/tmp/debug # FIXME
+ fi
+ else
+ [ -n "$BOOT_PARTITION" ] && GRUB="$(grubdevice $BOOT_PARTITION)"
+ [ -n "$TARGET" ] && GROOT="$(grubdevice $TARGET)"
+ fi
+
prompt_for_mirror
- grubdevice $TARGET
-
- # FIXME
- echo "debug: BOOT_PARTITION=$BOOT_PARTITION"
- echo "debug: TARGET=$TARGET"
- echo "debug: MIRROR=$MIRROR"
- echo "debug: GROOT=$GROOT"
- # ask for raid
- # ask for lvm
+
+ checkconfiguration
}
# run interactive mode if we didn't get the according configuration yet
if [ -z "$TARGET" -o -n "$INTERACTIVE" ] ; then
+ # only target might be unset, so make sure the INTERACTIVE flag is set as well
+ INTERACTIVE=1
interactive_mode
fi
# }}}
# stages setup {{{
if [ -z "$STAGES" ] ; then
- STAGES="/etc/debootstrap/stages_${SHORT_TARGET}"
+ STAGES="/var/cache/grml-debootstrap/stages_${SHORT_TARGET}"
[ -d "$STAGES" ] || mkdir -p "$STAGES"
fi
# }}}
# provide variables to chroot system {{{
-CHROOT_VARIABLES="/etc/debootstrap/variables_${SHORT_TARGET}"
+CHROOT_VARIABLES="/var/cache/grml-debootstrap/variables_${SHORT_TARGET}"
touch $CHROOT_VARIABLES
chmod 600 $CHROOT_VARIABLES # make sure nobody except root can read it
[ -n "$ARCH" ] && echo "ARCH=$ARCH" > $CHROOT_VARIABLES
[ -d "$MNTPOINT/$ISODIR" ] && umount "$MNTPOINT/$ISODIR" 1>/dev/null 2>&1
einfo "Unmounting $MNTPOINT" ; umount "$MNTPOINT" ; eend $?
+ if [ -n "$STAGES" ] ; then
+ echo -n "Removing stages directory ${STAGES}: "
+ rm -rf "$STAGES" && echo done
+ fi
+
# remove directory only if we used the default with process id inside the name
if echo "$MNTPOINT" | grep -q '/mnt/debootstrap\.' ; then
einfo "Removing directory ${MNTPOINT}" ; rmdir $MNTPOINT ; eend $?
exit "$EXIT"
}
-trap bailout 1 2 3 15
+trap bailout HUP INT QUIT TERM
# we want to execute all the functions only once, simple check for it:
stage() {
dialog --timeout 10 --title "$PN" \
--yesno "Do you want to stop at this stage?
-Notice: you are running grml-debootstrap in non-interactive mode.
-grml-debootstrap will install Debian ${RELEASE} on ${TARGET}.
+Notice: you are running ${PN} in non-interactive mode.
+${PN} will install Debian ${RELEASE} on ${TARGET}.
Last chance to quit. Timeout of 10 seconds running....
Do you want to stop now?" 0 0 2>/dev/null
}
-if [ -n "$AUTOINSTALL" ] ; then
- if checkforrun ; then
- eerror "Exiting as requested" ; eend 0
- exit 1
- fi
-else # if not running automatic installation display configuration and prompt for execution:
- einfo "$PN - Please recheck configuration before execution:"
- echo
- echo " Target: $TARGET"
- case "$MNTPOINT" in "$TARGET") ;; *) echo " Mount point: $MNTPOINT" ;; esac
- [ -n "$GRUB" ] && echo " Install grub to: $GRUB"
- [ -n "$GROOT" ] && echo " Use root partition in grub: $GROOT"
- [ -n "$RELEASE" ] && echo " Using release: $RELEASE"
- [ -n "$MIRROR" ] && echo " Using mirror: $MIRROR"
- [ -n "$ISO" ] && echo " Using iso: $ISO"
- case "$MNTPOINT" in "$TARGET") ;; *) echo " Important! Continuing will delete all data from ${TARGET}!" ;; esac
- echo
- einfon "Is this ok for you? [y/N] "
- read a
- if ! [ "$a" = 'y' -o "$a" = 'Y' ] ; then
- eerror "Exiting as requested." ; eend 1
- exit 1
- fi
-fi
-# }}}
-
# create filesystem {{{
mkfs() {
if [ -n "$MKFS" ] ; then
# make sure we have our files for later use via chroot-script
cp /etc/debootstrap/config $MNTPOINT/etc/debootstrap/
+ # make sure we adjust the configuration variables accordingly:
+ sed -i "s/RELEASE=.*/RELEASE=\"$RELEASE\"/" $MNTPOINT/etc/debootstrap/config
+ sed -i "s/TARGET=.*/TARGET=\"$TARGET\"/" $MNTPOINT/etc/debootstrap/config
+ sed -i "s/GRUB=.*/GRUB=\"$GRUB\"/" $MNTPOINT/etc/debootstrap/config
+ sed -i "s/GROOT=.*/GROOT=\"$GROOT\"/" $MNTPOINT/etc/debootstrap/config
+
cp /etc/debootstrap/packages $MNTPOINT/etc/debootstrap/packages
- cp $CHROOT_VARIABLES $MNTPOINT/etc/debootstrap/variables # do NOT use $CHROOT_VARIABLES inside chroot!
+
+ # notice: do NOT use $CHROOT_VARIABLES inside chroot but statically file instead!
+ cp $CHROOT_VARIABLES $MNTPOINT/etc/debootstrap/variables
cp -a /etc/debootstrap/extrapackages/ $MNTPOINT/etc/debootstrap/
# make sure we can access network [relevant for cdebootstrap]
[ -f "$MNTPOINT/etc/resolv.conf" ] || cp /etc/resolv.conf $MNTPOINT/etc/resolv.conf
+ # provide system's /etc/hosts to the target:
+ if ! [ -f "$MNTPOINT/etc/hosts" ] ; then
+ cp /etc/hosts $MNTPOINT/etc/hosts
+ sed -i "s/127.0.0.1 .*/127.0.0.1 localhost $HOSTNAME/" /etc/hosts
+ fi
+
# setup default locales
[ -n "$LOCALES" ] && cp /etc/debootstrap/locale.gen $MNTPOINT/etc/locale.gen
+ # MAKEDEV is just a forking bomb crap, let's do it on our own instead :)
+ ( cd $MNTPOINT/dev && tar zxf /etc/debootstrap/devices.tar.gz )
+
# copy any existing existing files to chroot
[ -d /etc/debootstrap/boot ] && cp -a /etc/debootstrap/boot/* $MNTPOINT/boot/
[ -d /etc/debootstrap/etc ] && cp -a /etc/debootstrap/etc/* $MNTPOINT/etc/
grub_install() {
if [ -z "$GRUB" -o -z "$GROOT" ] ; then
echo "Notice: \$GRUB or \$GROOT not defined, will not install grub therefor."
+ elif [ -n "$SELECTED_PARTITIONS" ] ; then # using sw-raid
+ for device in $SELECTED_PARTITIONS ; do
+ # TMPDEVICE=$(echo ${SELECTED_PARTITIONS} | awk '{print $1}')
+ # GRUB="$(grubdevice ${TMPDEVICE})"
+ # GRUB="$(grubdevice ${TMPDEVICE%%[0-9]})"
+ # GRUB=$(grubdevice $device)
+ GRUB="$(grubdevice ${device%%[0-9]})"
+ einfo "Installing grub on ${GRUB}:"
+ [ -x /usr/sbin/grub-install ] && GRUBINSTALL="/usr/sbin/grub-install --no-floppy" || GRUBINSTALL="/sbin/grub-install --no-floppy"
+ $GRUBINSTALL --root-directory="$MNTPOINT" "(${GRUB})"
+ eend $?
+ done
else
einfo "Installing grub on ${GRUB}:"
- [ -x /usr/sbin/grub-install ] && GRUBINSTALL=/usr/sbin/grub-install || GRUBINSTALL=/sbin/grub-install
+ [ -x /usr/sbin/grub-install ] && GRUBINSTALL="/usr/sbin/grub-install --no-floppy" || GRUBINSTALL="/sbin/grub-install --no-floppy"
$GRUBINSTALL --root-directory="$MNTPOINT" "(${GRUB})"
eend $?
fi
for i in mkfs tunefs mount_target debootstrap_system preparechroot \
chrootscript grub_install umount_chroot fscktool ; do
if stage "${i}" ; then
- $i && stage "${i}" done || bailout 2 "i"
+ $i && ( stage "${i}" done && rm -f "${STAGES}/${i}" ) || bailout 2 "i"
fi
done
# }}}
-# stages {{{
- echo done > $STAGES/grml-debootstrap
+# finalize {{{
+einfo "Removing ${CHROOT_VARIABLES}" ; rm "$CHROOT_VARIABLES" ; eend $?
+einfo "Removing ${STAGES}" ; rmdir "$STAGES" ; eend $?
+
+# Remove temporary mountpoint again
+if echo "$MNTPOINT" | grep -q '/mnt/debootstrap\.' ; then
+ einfo "Removing directory ${MNTPOINT}" ; rmdir "$MNTPOINT" ; eend $?
+fi
# }}}
# end dialog of autoinstallation {{{
if [ -n "$AUTOINSTALL" ] ; then
dialog --title "$PN" --msgbox \
- "Finished execution of ${0}.
-Enjoy your Debian system." 6 60
+ "Finished execution of ${PN}. Enjoy your Debian system." 0 0
else
- einfo "Finished execution of $PN - enjoy your Debian system." ; eend 0
+ einfo "Finished execution of ${PN}. Enjoy your Debian system." ; eend 0
fi
# }}}