# variables {{{
PN="$(basename $0)"
-VERSION='0.28'
+VERSION='0.31'
MNTPOINT="/mnt/debootstrap.$$"
# inside the chroot system locales might not be available, so use minimum:
\$TARGET in grub syntax, like hd0,0 for /dev/sda1.
--grub <device> Target for grub installation. Use grub syntax for
specifying, like hd0 for /dev/sda.
+ --arch <arch> Architecture to use. Currently only i386 is supported.
Configuration options:
[ "$_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" ] && {
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 \
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" \
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)
)
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)"
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 --no-floppy --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"
}
# }}}
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
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)"
# 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
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."
touch $CHROOT_VARIABLES
chmod 600 $CHROOT_VARIABLES # make sure nobody except root can read it
echo "# Configuration of ${PN}" > $CHROOT_VARIABLES
- [ -n "$ARCH" ] && echo "ARCH=$ARCH" >> $CHROOT_VARIABLES
- [ -n "$GROOT" ] && echo "GROOT=$GROOT" >> $CHROOT_VARIABLES
- [ -n "$GRUB" ] && echo "GRUB=$GRUB" >> $CHROOT_VARIABLES
- [ -n "$HOSTNAME" ] && echo "HOSTNAME=$HOSTNAME" >> $CHROOT_VARIABLES
- [ -n "$ISODIR" ] && echo "ISODIR=$ISO" >> $CHROOT_VARIABLES
- [ -n "$ISO" ] && echo "ISO=$ISO" >> $CHROOT_VARIABLES
- [ -n "$MIRROR" ] && echo "MIRROR=$MIRROR" >> $CHROOT_VARIABLES
+ [ -n "$ARCH" ] && echo "ARCH=$ARCH" >> $CHROOT_VARIABLES
+ [ -n "$GROOT" ] && echo "GROOT=$GROOT" >> $CHROOT_VARIABLES
+ [ -n "$GRUB" ] && echo "GRUB=$GRUB" >> $CHROOT_VARIABLES
+ [ -n "$HOSTNAME" ] && echo "HOSTNAME=$HOSTNAME" >> $CHROOT_VARIABLES
+ [ -n "$INSTALL_NOTES" ] && echo "INSTALL_NOTES=$INSTALL_NOTES" >> $CHROOT_VARIABLES
+ [ -n "$ISODIR" ] && echo "ISODIR=$ISO" >> $CHROOT_VARIABLES
+ [ -n "$ISO" ] && echo "ISO=$ISO" >> $CHROOT_VARIABLES
+ [ -n "$MIRROR" ] && echo "MIRROR=$MIRROR" >> $CHROOT_VARIABLES
[ -n "$KEEP_SRC_LIST" ] && echo "KEEP_SRC_LIST=$KEEP_SRC_LIST" >> $CHROOT_VARIABLES
- [ -n "$PACKAGES" ] && echo "PACKAGES=$PACKAGES" >> $CHROOT_VARIABLES
- [ -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 "$PACKAGES" ] && echo "PACKAGES=$PACKAGES" >> $CHROOT_VARIABLES
+ [ -n "$ROOTPASSWORD" ] && echo "ROOTPASSWORD=$ROOTPASSWORD" >> $CHROOT_VARIABLES
+ [ -n "$TARGET" ] && echo "TARGET=$TARGET" >> $CHROOT_VARIABLES
+ [ -n "$TARGET_UUID" ] && echo "TARGET_UUID=$TARGET_UUID" >> $CHROOT_VARIABLES
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/
sed -i "s#GRUB=.*#GRUB=\"$GRUB\"#" $MNTPOINT/etc/debootstrap/config
sed -i "s#GROOT=.*#GROOT=\"$GROOT\"#" $MNTPOINT/etc/debootstrap/config
+ # install notes:
+ if [ -n "$INSTALL_NOTES" ] ; then
+ [ -r "$INSTALL_NOTES" ] && cp "$INSTALL_NOTES" $MNTPOINT/etc/debootstrap/
+ fi
+
# package selection:
cp $VERBOSE ${_opt_packages:-$CONFFILES/packages} \
$MNTPOINT/etc/debootstrap/packages
}
# }}}
-# unmount $MNTPOINRT {{{
+# unmount $MNTPOINT {{{
umount_chroot() {
+
+ # display installation notes:
+ if [ -n "$INSTALL_NOTES" ] ; then
+ [ -r "${MNTPOINT}/${INSTALL_NOTES}" ] && cat "${MNTPOINT}/${INSTALL_NOTES}"
+ fi
+
if [ -n "$ISODIR" ] ; then
if grep -q "$ISODIR" /proc/mounts ; then
einfo "Unmount $MNTPOINT/$ISODIR"