X-Git-Url: https://git.grml.org/?p=grml-debootstrap.git;a=blobdiff_plain;f=grml-debootstrap;h=cb98aeb85c5f3f6eb236f9c20922220497912ddb;hp=bfe750430ca7fc0e1d99d75ce2c67f77daa0b11d;hb=010a354042db32706c74ee821cbcf8233b1471e5;hpb=d31f8780d6962eb7d18a23ef3958cbb06ec8db69 diff --git a/grml-debootstrap b/grml-debootstrap index bfe7504..cb98aeb 100755 --- a/grml-debootstrap +++ b/grml-debootstrap @@ -20,12 +20,13 @@ DEBCONF='yes' DEBIAN_FRONTEND='noninteractive' DEBOOTSTRAP='debootstrap' EXTRAPACKAGES='yes' +FALLBACK_MIRROR='http://cdn.debian.net/debian' FORCE='' HOSTNAME='grml' INITRD='yes' INSTALL_NOTES='/etc/debootstrap/install_notes' LOCALES='yes' -MIRROR='http://cdn.debian.net/debian' +MIRROR="$FALLBACK_MIRROR" MKFS='mkfs.ext3' PACKAGES='yes' PRE_SCRIPTS='yes' @@ -71,7 +72,6 @@ Bootstrap options: --arch Set target architecture, use for installing i386 on amd64. --filesystem Filesystem that should be used when target is a partition or Virtual Machine (see --vmfile). - --insecure Do not download and check Release file signatures. --force Do not prompt for user acknowledgement. Options for Virtual Machine deployment: @@ -143,7 +143,7 @@ einfon() { eerror() { [ "${RC_ENDCOL}" != "yes" ] && [ "${LAST_E_CMD}" = "ebegin" ] && echo - printf " ${BAD}*${NORMAL} $*\n" + printf " ${BAD}*${NORMAL} $*\n" >&2 LAST_E_CMD=eerror return 0 } @@ -199,12 +199,12 @@ cleanup() { [ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount -a >/dev/null 2>&1 - # ugly, but make sure we really don't leave anything (/proc /proc is intended) - for ARG in /sys /proc /proc ; do + # 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 /dev ; do [ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount $ARG >/dev/null 2>&1 umount "$MNTPOINT"/$ARG >/dev/null 2>&1 done - umount "$MNTPOINT"/dev >/dev/null 2>&1 if [ -n "$ISODIR" ] ; then [ -d "$MNTPOINT/$ISODIR" ] && umount "$MNTPOINT/$ISODIR" >/dev/null 2>&1 @@ -327,7 +327,7 @@ fi [ "$_opt_bootappend" ] && BOOT_APPEND=$_opt_bootappend [ "$_opt_grub" ] && GRUB=$_opt_grub [ "$_opt_arch" ] && ARCH=$_opt_arch -[ "$_opt_insecure" ] && SECURE='false' +[ "$_opt_insecure" ] && echo "Warning: --insecure is deprecated, continuing anyway." [ "$_opt_force" ] && FORCE=$_opt_force [ "$_opt_verbose" ] && VERBOSE="-v" @@ -354,7 +354,7 @@ fi # make sure we have what we need {{{ if [ -n "$VIRTUAL" ] ; then - check4progs kpartx mksh qemu-img || bailout 1 + check4progs kpartx mksh parted qemu-img || bailout 1 fi # }}} @@ -690,11 +690,13 @@ elif [ -n "$INTERACTIVE" ] ; then [ -n "$RELEASE" ] && INFOTEXT="$INFOTEXT Using release: $RELEASE" [ -n "$HOSTNAME" ] && INFOTEXT="$INFOTEXT - Using hostname $HOSTNAME" + Using hostname: $HOSTNAME" [ -n "$MIRROR" ] && INFOTEXT="$INFOTEXT Using mirror: $MIRROR" [ -n "$ISO" ] && INFOTEXT="$INFOTEXT Using ISO: $ISO" + [ -n "$ARCH" ] && INFOTEXT="$INFOTEXT + Using arch: $ARCH" INFOTEXT="$INFOTEXT @@ -705,7 +707,7 @@ Is this ok for you? Notice: selecting 'No' will exit ${PN}." [ $? -eq 0 ] || bailout 0 else # if not running automatic installation display configuration and prompt for execution: - einfo "$PN - Please recheck configuration before execution:" + einfo "$PN [${VERSION}] - Please recheck configuration before execution:" echo echo " Target: $TARGET" @@ -719,9 +721,10 @@ else # if not running automatic installation display configuration and prompt fo fi [ -n "$RELEASE" ] && echo " Using release: $RELEASE" - [ -n "$MIRROR" ] && echo " Using mirror: $MIRROR" [ -n "$HOSTNAME" ] && echo " Using hostname: $HOSTNAME" + [ -n "$MIRROR" ] && echo " Using mirror: $MIRROR" [ -n "$ISO" ] && echo " Using ISO: $ISO" + [ -n "$ARCH" ] && echo " Using arch: $ARCH" if [ -n "$VIRTUAL" ] ; then echo " Deploying as Virtual Machine." [ -n "$VMSIZE" ] && echo " Using Virtual Disk file with size of ${VMSIZE}." @@ -775,6 +778,17 @@ if [ -z "$TARGET" -o -n "$INTERACTIVE" ] ; then fi # }}} +# architecture setup {{{ +if [ -n "$ARCH" ] ; then + ARCHCMD="--arch $ARCH" + ARCHINFO=" (${ARCH})" +else + ARCH="$(dpkg --print-architecture)" + ARCHCMD="--arch $ARCH" + ARCHINFO=" (${ARCH})" +fi +# }}} + checkconfiguration # finally make sure at least $TARGET is set [the partition for the new system] {{{ @@ -826,37 +840,13 @@ else fi # }}} -# architecture setup {{{ -if [ -n "$ARCH" ] ; then - ARCHCMD="--arch $ARCH" - ARCHINFO=" (${ARCH})" -else - ARCH="$(dpkg --print-architecture)" - ARCHCMD="--arch $ARCH" - ARCHINFO=" (${ARCH})" -fi -# }}} - -# keyring setupt {{{ -KEYRING="" -if [ "$SECURE" = 'yes' ] ; then - if [ -e '/etc/apt/trusted.gpg' ] ; then - KEYRING="--keyring /etc/apt/trusted.gpg" - else - eerror "Could not find /etc/apt/trusted.gpg." - fi -else - ewarn "Not checking Release signatures!" -fi -# }}} - # make sure we have the right syntax when using an iso image {{{ if [ -n "$ISO" ] ; then case $ISO in file*) # do nothing ;; *) - ISO=file:$1 + ISO=file:$ISO ;; esac fi @@ -864,6 +854,12 @@ ISODIR=${ISO##file:} ISODIR=${ISODIR%%/} # }}} +# Debian ISOs do not contain signed Release files {{{ +if [ -n "$ISO" ] ; then + DEBOOTSTRAP_OPT="$DEBOOTSTRAP_OPT --no-check-gpg" +fi +# }}} + # create filesystem {{{ mkfs() { if [ -n "$DIRECTORY" ] ; then @@ -954,6 +950,25 @@ prepare_vm() { dd if=/dev/zero bs=1 conv=notrunc count=64 seek=446 of="$TARGET" parted -s "${TARGET}" 'mkpart primary ext3 2M -1' + # if dm-mod isn't available then kpartx will fail with + # "Is device-mapper driver missing from kernel? [...]" + if ! kpartx -av $TARGET >/dev/null 2>&1 || ! grep -q device-mapper /proc/misc >/dev/null 2>&1 ; then + einfo "Device-mapper not ready yet, trying to load dm-mod module." + modprobe dm-mod ; eend $? + fi + + # make sure loop module is present + if ! losetup -f >/dev/null 2>&1; then + einfo "Can not find a usable loop device, retrying after loading loop module." + modprobe loop + if losetup -f >/dev/null 2>&1; then + einfo "Found a usable loop device now, continuing." + else + eerror "Error finding usable loop device" ; eend 1 + bailout 1 + fi + fi + DEVINFO=$(kpartx -av $TARGET) # 'add map loop1p1 (253:0): 0 6289408 linear /dev/loop1 2048' if [ -z "${DEVINFO}" ] ; then eerror "Error setting up loopback device." ; eend 1 @@ -1012,7 +1027,7 @@ finalize_vm() { einfo "Adjusting grub.cfg for successful boot sequence." # ugly but needed to boot grub acordingly sed -i "s;set root=.*;set root='(hd0,msdos1)';" "${MNTPOINT}"/boot/grub/grub.cfg - sed -i "s; root=/dev/.*; root=/dev/sda1;" "${MNTPOINT}"/boot/grub/grub.cfg + sed -i "s;root=[^ ]\+;root=/dev/sda1;" "${MNTPOINT}"/boot/grub/grub.cfg umount "${MNTPOINT}" kpartx -d "${ORIG_TARGET}" >/dev/null @@ -1027,19 +1042,34 @@ debootstrap_system() { fi 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 $? + : else - eerror "Error: $MNTPOINT not mounted, can not continue." - eend 1 + eerror "Error: $MNTPOINT not mounted, can not continue." + eend 1 ; exit 1 fi + + if [ -n "$ISO" ] ; then + einfo "Running $DEBOOTSTRAP $DEBOOTSTRAP_OPT for release ${RELEASE}${ARCHINFO} using ${ISO}" + einfo "Executing: $DEBOOTSTRAP $ARCHCMD $KEYRING $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $ISO" + $DEBOOTSTRAP $ARCHCMD $KEYRING $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $ISO + RC=$? + else + einfo "Running $DEBOOTSTRAP $DEBOOTSTRAP_OPT for release ${RELEASE}${ARCHINFO} using ${MIRROR}" + einfo "Executing: $DEBOOTSTRAP $ARCHCMD $KEYRING $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $MIRROR" + $DEBOOTSTRAP $ARCHCMD $KEYRING $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $MIRROR + RC=$? + fi + + if [ $RC -ne 0 ] ; then + if [ -r "$MNTPOINT/debootstrap/debootstrap.log" ] && \ + [ -s "$MNTPOINT/debootstrap/debootstrap.log" ] ; then + einfo "Presenting last ten lines of debootstrap.log:" + tail -10 $MNTPOINT/debootstrap/debootstrap.log + einfo "End of debootstrap.log" + fi + fi + + eend $RC } # }}} @@ -1059,6 +1089,7 @@ preparechroot() { [ -n "$DEBIAN_FRONTEND" ] && echo "DEBIAN_FRONTEND=\"$DEBIAN_FRONTEND\"" >> $CHROOT_VARIABLES [ -n "$DEBOOTSTRAP" ] && echo "DEBOOTSTRAP=\"$DEBOOTSTRAP\"" >> $CHROOT_VARIABLES [ -n "$EXTRAPACKAGES" ] && echo "EXTRAPACKAGES=\"$EXTRAPACKAGES\"" >> $CHROOT_VARIABLES + [ -n "$FALLBACK_MIRROR" ] && echo "FALLBACK_MIRROR=\"$FALLBACK_MIRROR\"" >> $CHROOT_VARIABLES [ -n "$FORCE" ] && echo "FORCE=\"$FORCE\"" >> $CHROOT_VARIABLES [ -n "$GRMLREPOS" ] && echo "GRMLREPOS=\"$GRMLREPOS\"" >> $CHROOT_VARIABLES [ -n "$GRUB" ] && echo "GRUB=\"$GRUB\"" >> $CHROOT_VARIABLES @@ -1198,18 +1229,29 @@ execute_scripts() { # execute chroot-script {{{ chrootscript() { if ! [ -r "$MNTPOINT/bin/chroot-script" ] ; then - mount_target + mount_target fi - if [ -x "$MNTPOINT/bin/chroot-script" ] ; then - einfo "Executing chroot-script now" - mount --bind /dev "$MNTPOINT"/dev - chroot "$MNTPOINT" /bin/chroot-script ; RC=$? - umount "$MNTPOINT"/dev - eend $RC + if ! [ -x "$MNTPOINT/bin/chroot-script" ] ; then + eerror "Fatal: $MNTPOINT/bin/chroot-script could not be found." + eend 1 else - eerror "Fatal: $MNTPOINT/bin/chroot-script could not be found." - eend 1 + einfo "Executing chroot-script now" + mount --bind /dev "$MNTPOINT"/dev + chroot "$MNTPOINT" /bin/chroot-script ; RC=$? + umount "$MNTPOINT"/dev + eend $RC + fi + + # finally get rid of chroot-script again, there's no good reason to + # keep it on the installed system + if grep -q GRML_CHROOT_SCRIPT_MARKER "${MNTPOINT}/bin/chroot-script" ; then + einfo "Removing chroot-script again" + rm -f "${MNTPOINT}/bin/chroot-script" + eend $? + else + einfo "Keeping chroot-script as string GRML_CHROOT_SCRIPT_MARKER could not be found" + eend 0 fi } # }}}