X-Git-Url: https://git.grml.org/?p=grml-debootstrap.git;a=blobdiff_plain;f=grml-debootstrap;h=dbf975943f8a0544018a041cfbe0f26ee30f08bc;hp=23cf187cee819644f6cddd869f333bebdfdbd1e0;hb=a3c10e584dd26528ca76e201ab8a0e6b061db3ac;hpb=1c65ca6d6854e48535f9b18a5d6f3e82606c433f diff --git a/grml-debootstrap b/grml-debootstrap index 23cf187..dbf9759 100755 --- a/grml-debootstrap +++ b/grml-debootstrap @@ -11,7 +11,7 @@ set -e # exit on any error # variables {{{ PN="$(basename $0)" -VERSION='0.28' +VERSION='0.30' MNTPOINT="/mnt/debootstrap.$$" # inside the chroot system locales might not be available, so use minimum: @@ -39,9 +39,11 @@ Bootstrap options: -m, --mirror Mirror which should be used for apt-get/aptitude. -i, --iso Mountpoint where a Debian ISO is mounted to, for use instead of fetching packages from a mirror. - -r, --release Release of new Debian system (default: stable). - -t, --target Target partition (/dev/...) or directory. - -p, --mntpoint Mountpoint used for mounting the target system. + -r, --release Release of new Debian system (default: lenny). + -t, --target Target partition (/dev/...) or directory where the + system should be installed to. + -p, --mntpoint Mountpoint used for mounting the target system, + has no effect if -t is given and represents a directory. --debopt Extra parameters passed to the debootstrap command. --interactive Use interactive mode (frontend). --nodebootstrap Skip debootstrap, only do configuration to the target. @@ -49,6 +51,7 @@ Bootstrap options: \$TARGET in grub syntax, like hd0,0 for /dev/sda1. --grub Target for grub installation. Use grub syntax for specifying, like hd0 for /dev/sda. + --arch Architecture to use. Currently only i386 is supported. Configuration options: @@ -147,6 +150,7 @@ fi [ "$_opt_bootappend" ] && BOOT_APPEND=$_opt_bootappend [ "$_opt_groot" ] && GROOT=$_opt_groot [ "$_opt_grub" ] && GRUB=$_opt_grub +[ "$_opt_arch" ] && ARCH=$_opt_arch [ "$_opt_verbose" ] && VERBOSE="-v" [ "$_opt_help" ] && { @@ -177,7 +181,7 @@ prompt_for_target() AVAILABLE_PARTITIONS=$(LANG=C fdisk -l 2>/dev/null | \ sed 's/*//' | \ grep -v 'Extended$' | \ - gawk -v num=0 -v ORS=' ' '/^\/dev\// {print $1}'; echo /dev/md*); + gawk -v num=0 -v ORS=' ' '/^\/dev\// {print $1}'; ls /dev/md* 2>/dev/null || true); if [ -z "$AVAILABLE_PARTITIONS" ] ; then dialog --title "$PN" --trim \ @@ -201,22 +205,39 @@ prompt_for_target() prompt_for_bootmanager() { ADDITIONAL_PARAMS="" - for device in sda hda; do - if [ /dev/$device != ${TARGET%[0-9]} ]; then + + if echo "$TARGET" | grep -q "/dev/md" ; then + MBRPART="all disks of Software RAID $TARGET" + else + # figure out whole disk device + found= + for device in /dev/disk/by-id/* + do + [ $(readlink -f $device) = ${TARGET} ] || continue + found=1 + break + done + [ -n "$found" ] && MBRDISK=$(echo ${device}|sed -e 's/-part[0-9][0-9]*$//') + if [ -e "$MBRDISK" ]; then + MBRDISK=$(readlink -f $MBRDISK) + else + # fall back to old behaviour + MBRDISK=$(echo ${TARGET} | sed -e 's/[0-9][0-9]*$/') + fi + + MBRPART="MBR of $MBRDISK" + fi + + for device in cciss/c0d0 sda hda; do + if [ /dev/$device != ${MBRDISK} ]; then grep -q $device /proc/partitions && \ - ADDITIONAL_PARAMS=:$device:"install bootmanager grub into MBR of /dev/${device}" + ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS:$device:install bootmanager grub into MBR of /dev/$device" fi done ADDITIONAL_PARAMS=${ADDITIONAL_PARAMS#:} OIFS="$IFS"; IFS=: - 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 $MBRPART" \ @@ -229,10 +250,10 @@ prompt_for_bootmanager() case "$GETMBR" in mbr) # /dev/md0: has to be installed in MBR of /dev/md0 and not in /dev/md: - if echo $TARGET | grep -q "*md*" ; then - BOOT_PARTITION="${TARGET}" + if echo "$TARGET" | grep -q "/dev/md" ; then + BOOT_PARTITION="$TARGET" else - BOOT_PARTITION="${TARGET%[0-9]}" + BOOT_PARTITION="$MBRDISK" fi ;; partition) @@ -307,7 +328,7 @@ prompt_for_mirror() ) if [ "$CHOOSE_MIRROR" = 'net' ] ; then - [ -n "$MIRROR" ] || MIRROR='ftp://ftp.de.debian.org/debian' + [ -n "$MIRROR" ] || MIRROR='http://cdn.debian.net/debian' MIRROR="$(dialog --stdout --title "${PN}" --inputbox \ "Please enter Debian mirror you would like to use for installing packages." \ 0 0 $MIRROR)" @@ -329,33 +350,48 @@ grubdevice() { fi device="$1" - device_map=/boot/grub/device.map + device_map=$(mktemp) # create device.map - if ! [ -f "$device_map" ] ; then - echo 'quit' | grub --device-map="$device_map" 1>/dev/null 2>&1 + if which grub >/dev/null 2>&1 ; then + echo 'quit' | grub --device-map="$device_map" >/dev/null 2>&1 + elif which grub-mkdevicemap >/dev/null 2>&1 ; then + grub-mkdevicemap --device-map="$device_map" >/dev/null 2>&1 + else + echo "Error: neither grub nor grub-mkdevicemap command found." >&2 + return 1 fi # 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%' \ + tmp_disk=$(echo "$device" | sed -e 's%\(\(s\|h\|v\|xv\)d[a-z]\)[0-9]*$%\1%' \ -e 's%\(fd[0-9]*\)$%\1%' \ -e 's%/part[0-9]*$%/disc%' \ - -e 's%\(c[0-7]d[0-9]*\).*$%\1%'` - tmp_part=`echo "$device" | sed -e 's%.*/[sh]d[a-z]\([0-9]*\)$%\1%' \ + -e 's%\(c[0-7]d[0-9]*\).*$%\1%' \ + -e 's%\(mmcblk[0-9]d[0-9]*\).*$%\1%' \ + -e 's%\(/mapper/mpath[0-9]\+\)-part[0-9]\+$%\1%') + tmp_part=$(echo "$device" | sed -e 's%.*/\(s\|h\|v\|xv\)d[a-z]\([0-9]*\)$%\2%' \ -e 's%.*/fd[0-9]*$%%' \ -e 's%.*/floppy/[0-9]*$%%' \ -e 's%.*/\(disc\|part\([0-9]*\)\)$%\2%' \ - -e 's%.*c[0-7]d[0-9]*p*%%'` + -e 's%.*c[0-7]d[0-9]*p*%%' \ + -e 's%.*mmcblk[0-9]d[0-9]*p%%' \ + -e 's%.*/mapper/mpath[0-9]\+-part\([0-9]\+\)%\1%') tmp_drive=$(grep -v '^#' $device_map | grep "$tmp_disk *$" | sed 's%.*\([hf]d[0-9][a-g0-9,]*\).*%\1%') + if [ -z "$tmp_drive" ]; then + echo "Error: $device does not have any corresponding BIOS drive." >&2 + return 1 + fi + case $1 in /dev/[sh]d[a-z]) # we expect something like 'hd0' echo "$tmp_drive" ;; *) # we expect something like 'hd0,0' - echo "$tmp_drive" | sed "s%$%,`expr $tmp_part - 1`%" # FIXME => md0 + echo "$tmp_drive" | sed "s%$%,$(expr $tmp_part - 1)%" # FIXME => md0 ;; esac + rm -f "$device_map" } # }}} @@ -490,13 +526,19 @@ else # if not running automatic installation display configuration and prompt fo 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 + + # do not display if MNTPOINT is the default one + case "$MNTPOINT" in /mnt/debootstrap*) ;; *) 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 "$HOSTNAME" ] && echo " Using hostname: $HOSTNAME" + [ -n "$ISO" ] && echo " Using ISO: $ISO" + + echo " Important! Continuing will delete all data from ${TARGET}!" + + echo einfon "Is this ok for you? [y/N] " read a if ! [ "$a" = 'y' -o "$a" = 'Y' ] ; then @@ -532,7 +574,6 @@ interactive_mode() 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)" @@ -637,7 +678,12 @@ bailout(){ [ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount /proc 1>/dev/null 2>&1 [ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount /proc 1>/dev/null 2>&1 [ -d "$MNTPOINT/$ISODIR" ] && umount "$MNTPOINT/$ISODIR" 1>/dev/null 2>&1 - einfo "Unmounting $MNTPOINT" ; umount "$MNTPOINT" ; eend $? + + 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 $? + fi if [ -n "$STAGES" ] ; then echo -n "Removing stages directory ${STAGES}: " @@ -675,16 +721,21 @@ stage() { # create filesystem {{{ mkfs() { - if grep -q $TARGET /proc/mounts ; then - eerror "$TARGET already mounted, exiting to avoid possible damage. (Manually unmount $TARGET)" ; eend 1 - exit 1 - fi + if [ -n "$DIRECTORY" ] ; then + einfo "Running grml-debootstrap on a directory, skipping mkfs stage." + else + if grep -q "$TARGET" /proc/mounts ; then + eerror "$TARGET already mounted, exiting to avoid possible damage. (Manually unmount $TARGET)" ; eend 1 + exit 1 + fi + + if [ -n "$MKFS" ] ; then + einfo "Running $MKFS on $TARGET" + $MKFS $TARGET + TARGET_UUID="$(vol_id -u $TARGET 2>/dev/null || echo '')" + eend $? + fi - if [ -n "$MKFS" ] ; then - einfo "Running $MKFS on $TARGET" - $MKFS $TARGET - TARGET_UUID="$(vol_id -u $TARGET 2>/dev/null || echo '')" - eend $? fi } # }}} @@ -724,17 +775,18 @@ mount_target() { # install main chroot {{{ debootstrap_system() { - if ! grep -q $MNTPOINT /proc/mounts ; then - mount_target - fi if [ "$_opt_nodebootstrap" ]; then einfo "Skipping debootstrap as requested." return fi - if grep -q $MNTPOINT /proc/mounts || [ -n "$DIRECTORY" ] ; then + + if grep -q "$MNTPOINT" /proc/mounts || [ -n "$DIRECTORY" ] ; then einfo "Running $DEBOOTSTRAP $DEBOOTSTRAP_OPT for release ${RELEASE}${ARCHINFO} using ${MIRROR}${ISO}" - [ -n "$MIRROR" ] && $DEBOOTSTRAP $ARCHCMD $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $MIRROR || \ - $DEBOOTSTRAP $ARCHCMD $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $ISO + if [ -n "$MIRROR" ] ; then + $DEBOOTSTRAP $ARCHCMD $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $MIRROR + else + $DEBOOTSTRAP $ARCHCMD $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $ISO + fi eend $? else eerror "Error: $MNTPOINT not mounted, can not continue." @@ -767,7 +819,7 @@ preparechroot() { cp $VERBOSE $CONFFILES/chroot-script $MNTPOINT/bin/chroot-script chmod 755 $MNTPOINT/bin/chroot-script - mkdir $MNTPOINT/etc/debootstrap/ + [ -d "$MNTPOINT"/etc/debootstrap/ ] || mkdir "$MNTPOINT"/etc/debootstrap/ # make sure we have our files for later use via chroot-script cp $VERBOSE $CONFFILES/config $MNTPOINT/etc/debootstrap/ @@ -897,6 +949,7 @@ umount_chroot() { eend $? fi fi + if grep -q "$MNTPOINT" /proc/mounts ; then if [ -n "$PARTITION" ] ; then einfo "Unmount $MNTPOINT"