X-Git-Url: https://git.grml.org/?p=grml-debootstrap.git;a=blobdiff_plain;f=grml-debootstrap;h=8c063cd65a114ef27a462fd593420ac05a793b3d;hp=2544c8542fab181c58114c3c54b611a161b002b7;hb=a4ee665bdec580898a288b9cb7a8e03f3c035a37;hpb=7614eb950deb2b036bc22b328929d79065f63153 diff --git a/grml-debootstrap b/grml-debootstrap index 2544c85..8c063cd 100755 --- a/grml-debootstrap +++ b/grml-debootstrap @@ -11,7 +11,7 @@ set -e # exit on any error # variables {{{ PN="$(basename $0)" -VERSION='0.33-pre1' +VERSION='0.36' MNTPOINT="/mnt/debootstrap.$$" # inside the chroot system locales might not be available, so use minimum: @@ -49,6 +49,7 @@ Bootstrap options: --nodebootstrap Skip debootstrap, only do configuration to the target. --grub Target for grub installation. Usage example: /dev/sda --arch Architecture to use. Currently only i386 is supported. + --filesystem Filesystem that should be used when target is a partition. --insecure Do not download and check Release file signatures. Configuration options: @@ -58,13 +59,16 @@ Configuration options: -d, --confdir Place of config files for debootstrap, defaults to /etc/debootstrap --packages Install packages defined in specified list file. + --nopackages Skip installation of packages defined in + /etc/debootstrap/packages --debconf Pre-seed packages using specified pre-seed db file. --keep_src_list Do not overwrite user provided apt sources.list. --hostname Hostname of Debian system. --password Use specified password as password for user root. --bootappend Add specified appendline to kernel whilst booting. --chroot-scripts Execute chroot scripts from specified directory. - --scripts Execute scripts from specified directory. + --pre-scripts Execute scripts from specified directory (before chroot-scripts). + --scripts Execute scripts from specified directory (after chroot-scripts). Other options: @@ -104,10 +108,10 @@ fi # cmdline handling {{{ # source external command line parameter-processing script -if [ -r /usr/share/grml-debootstrap/functions/cmdlineopts.clp ] ; then - . /usr/share/grml-debootstrap/functions/cmdlineopts.clp -elif [ -r ./cmdlineopts.clp ] ; then +if [ -r ./cmdlineopts.clp ] ; then . ./cmdlineopts.clp +elif [ -r /usr/share/grml-debootstrap/functions/cmdlineopts.clp ] ; then + . /usr/share/grml-debootstrap/functions/cmdlineopts.clp else echo "Error: cmdline function file not found, exiting.">&2 exit 1 @@ -138,9 +142,12 @@ fi [ "$_opt_debopt" ] && DEBOOTSTRAP_OPT=$_opt_debopt [ "$_opt_interactive" ] && INTERACTIVE=1 [ "$_opt_config" ] && CONFIGFILE=$_opt_config +[ "$_opt_filesystem" ] && MKFS="mkfs.$_opt_filesystem" [ "$_opt_packages_set" ] && PACKAGES='yes' +[ "$_opt_nopackages" ] && PACKAGES='' [ "$_opt_debconf_set" ] && DEBCONF='yes' [ "$_opt_scripts_set" ] && SCRIPTS='yes' +[ "$_opt_pre_scripts_set" ] && PRE_SCRIPTS='yes' [ "$_opt_chroot_scripts_set" ] && CHROOT_SCRIPTS='yes' [ "$_opt_keep_src_list" ] && KEEP_SRC_LIST='yes' [ "$_opt_hostname" ] && HOSTNAME=$_opt_hostname @@ -205,7 +212,7 @@ prompt_for_target() fi PARTITION_LIST=$(for i in $(echo $AVAILABLE_PARTITIONS) ; do - echo "$i $(vol_id --type $i 2>/dev/null || echo [no_filesystem_yet])" + echo "$i $(blkid -s TYPE -o value $i 2>/dev/null || echo [no_filesystem_yet])" done) TARGET=$(dialog --title "$PN" --single-quoted --stdout \ @@ -235,7 +242,7 @@ prompt_for_bootmanager() MBRDISK=$(readlink -f $MBRDISK) else # fall back to old behaviour - MBRDISK=$(echo ${TARGET} | sed -e 's/[0-9][0-9]*$/') + MBRDISK=$(echo ${TARGET} | sed -e 's/[0-9][0-9]*$//') fi MBRPART="MBR of $MBRDISK" @@ -386,7 +393,7 @@ AVAILABLE_PARTITIONS=$(LANG=C fdisk -l 2>/dev/null | \ 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" + echo "$i $(blkid -s TYPE -o value $i 2>/dev/null || echo [no_filesystem_yet]) off" done) dialog --title "$PN" --separate-output \ @@ -404,7 +411,7 @@ 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 + --raid-devices="${NUM_PARTITIONS}" ${SELECTED_PARTITIONS} >/dev/null 2>$ERRORFILE RC=$? set -e @@ -574,15 +581,17 @@ set_target_directory(){ TUNE2FS='' FSCK='' GRUB='' + # make sure we normalise the path to an absolute directory name so something like: + # mkdir -p foo/a bar/a; (cd foo; grml-debootstrap -t a)&; (cd bar; grml-debootstrap -t a)&; wait + # works + TARGET="$(readlink -f $TARGET)" } -case $TARGET in - /dev/shm/*) set_target_directory ;; - /dev/*) +if [ -b "$TARGET" ] ; then PARTITION=1 - ;; - *) set_target_directory ;; -esac +else + set_target_directory +fi # }}} # architecture setup {{{ @@ -632,18 +641,18 @@ bailout(){ # make sure nothing is left inside chroot so we can unmount it [ -x "$MNTPOINT"/etc/init.d/ssh ] && "$MNTPOINT"/etc/init.d/ssh stop [ -x "$MNTPOINT"/etc/init.d/mdadm ] && "$MNTPOINT"/etc/init.d/mdadm stop - # ugly, but make sure we really don't leav anything (/proc /proc is intended) + # ugly, but make sure we really don't leave anything (/proc /proc is intended) for ARG in /sys -a /proc /proc ; do - [ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount $ARG 1>/dev/null 2>&1 || true + [ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount $ARG >/dev/null 2>&1 || true done - umount "$MNTPOINT"/dev 1>/dev/null 2>&1 || true + umount "$MNTPOINT"/dev >/dev/null 2>&1 || true - [ -d "$MNTPOINT/$ISODIR" ] && umount "$MNTPOINT/$ISODIR" 1>/dev/null 2>&1 || true + [ -d "$MNTPOINT/$ISODIR" ] && umount "$MNTPOINT/$ISODIR" >/dev/null 2>&1 || true if [ -n "$DIRECTORY" ] ; then einfo "Not unmounting $MNTPOINT as you requested me to install into a directory of your own choice." ; eend 0 else - einfo "Unmounting $MNTPOINT" ; umount "$MNTPOINT" ; eend $? + einfo "Unmounting $MNTPOINT" ; umount "$MNTPOINT" ; eend $? fi if [ -n "$STAGES" ] ; then @@ -713,7 +722,7 @@ mkfs() { # modify filesystem settings {{{ tunefs() { - if [ -n "$TUNE2FS" ] ; then + if [ -n "$TUNE2FS" ] && echo "$MKFS" | grep -q "mkfs.ext" ; then einfo "Disabling automatic filesystem check on $TARGET via tune2fs" $TUNE2FS $TARGET eend $? @@ -754,8 +763,10 @@ debootstrap_system() { if grep -q "$MNTPOINT" /proc/mounts || [ -n "$DIRECTORY" ] ; then einfo "Running $DEBOOTSTRAP $DEBOOTSTRAP_OPT for release ${RELEASE}${ARCHINFO} using ${MIRROR}${ISO}" if [ -n "$MIRROR" ] ; then + einfo "Executing: $DEBOOTSTRAP $ARCHCMD $KEYRING $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $MIRROR" $DEBOOTSTRAP $ARCHCMD $KEYRING $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $MIRROR else + einfo "Executing: $DEBOOTSTRAP $ARCHCMD $KEYRING $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $ISO" $DEBOOTSTRAP $ARCHCMD $KEYRING $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $ISO fi eend $? @@ -787,6 +798,7 @@ preparechroot() { [ -n "$ROOTPASSWORD" ] && echo "ROOTPASSWORD=$ROOTPASSWORD" >> $CHROOT_VARIABLES [ -n "$TARGET" ] && echo "TARGET=$TARGET" >> $CHROOT_VARIABLES [ -n "$TARGET_UUID" ] && echo "TARGET_UUID=$TARGET_UUID" >> $CHROOT_VARIABLES + [ -n "$RM_APTCACHE" ] && echo "RM_APTCACHE=$RM_APTCACHE" >> $CHROOT_VARIABLES cp $VERBOSE $CONFFILES/chroot-script $MNTPOINT/bin/chroot-script chmod 755 $MNTPOINT/bin/chroot-script @@ -854,10 +866,31 @@ preparechroot() { cp $VERBOSE /etc/network/interfaces $MNTPOINT/etc/network/interfaces fi + # install config file providing some example entries + if [ -r /etc/network/interfaces.examples -a ! -r "$MNTPOINT/etc/network/interfaces.examples" ] ; then + cp /etc/network/interfaces.examples "$MNTPOINT/etc/network/interfaces.examples" + fi + eend 0 } # }}} +# execute all scripts in /etc/debootstrap/pre-scripts/ {{{ +execute_pre_scripts() { + # make sure we have $MNTPOINT available for our scripts + export MNTPOINT + if [ -d "$_opt_pre_scripts" ] || [ "$PRE_SCRIPTS" = 'yes' ] ; then + [ -d "$_opt_pre_scripts" ] && pre_scripts="$_opt_pre_scripts" || pre_scripts="$CONFFILES/pre-scripts/" + for script in ${pre_scripts}/* ; do + if [ -x "$script" ] ; then + einfo "Executing pre-script $script" + $script ; eend $? + fi + done + fi +} +# }}} + # execute all scripts in /etc/debootstrap/scripts/ {{{ execute_scripts() { # make sure we have $MNTPOINT available for our scripts @@ -900,18 +933,21 @@ grub_install() { return 0 fi + if ! [ -x "$(which grub-install)" ] ; then + echo "Error: grub-install not available. (Error while installing grub package?)" + return 1 + fi + if [ -n "$SELECTED_PARTITIONS" ] ; then # using sw-raid for device in $SELECTED_PARTITIONS ; do GRUB="${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" + grub-install --no-floppy --root-directory="$MNTPOINT" "$GRUB" eend $? done else 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" + grub-install --no-floppy --root-directory="$MNTPOINT" "$GRUB" eend $? fi } @@ -956,7 +992,7 @@ fscktool() { # now execute all the functions {{{ for i in mkfs tunefs mount_target debootstrap_system preparechroot \ - chrootscript execute_scripts grub_install umount_chroot \ + execute_pre_scripts chrootscript execute_scripts grub_install umount_chroot \ fscktool ; do if stage "${i}" ; then $i && ( stage "${i}" done && rm -f "${STAGES}/${i}" ) || bailout 2 "i" @@ -965,6 +1001,12 @@ done # }}} # finalize {{{ +if [ -n "$ISODIR" ] ; then + einfo "Unmounting Debian image loopback from $MNTPOINT/$ISODIR." + umount "$MNTPOINT/$ISODIR" + eend $? +fi + einfo "Removing ${CHROOT_VARIABLES}" ; rm "$CHROOT_VARIABLES" ; eend $? einfo "Removing ${STAGES}" ; rmdir "$STAGES" ; eend $?