# variables {{{
PN="$(basename $0)"
-VERSION='0.19'
+prog_real=`readlink -f -- $0`
+VERSION='0.23'
MNTPOINT="/mnt/debootstrap.$$"
# inside the chroot system locales might not be available, so use minimum:
Usage: $PN [options]
- -h|--help Print this usage information and exit.
- -v|--version Show summary of options and exit.
-
- -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.
- -p|--mntpoint <mnt> Mountpoint used for mounting the target system.
- -r|--release <release> Release of new Debian system (default: stable)
- -t|--target <target> Target partition (/dev/...) or directory.
-
- --boot_append <appendline> Add specified appendline to kernel whilst booting
- --groot <device> Root device for usage in grub, corresponds with
- \$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
- --interactive Use interactive mode (frontend)
- --password <pwd> Use specified password as password for user root.
+Bootstrap options:
+
+ -m, --mirror=URL Mirror which should be used for apt-get/aptitude.
+ -i, --iso=mnt Mountpoint where a Debian ISO is mounted to, for use
+ instead of fetching packages from a mirror.
+ -r, --release=name Release of new Debian system (default: stable).
+ -t, --target=target Target partition (/dev/...) or directory.
+ -p, --mntpoint=mnt Mountpoint used for mounting the target system.
+ --debopt=params Extra parameters passed to the debootstrap.
+ --interactive Use interactive mode (frontend).
+
+Configuration options:
+
+
+ -d, --confdir=path Place of config files for debootstrap, defaults to
+ /etc/debootstrap
+ -c, --config=file Use specified configuration file, defaults to
+ <confdir>/config
+ --packages[=f] Install packages defined in <confdir>/packages. Option
+ arg: alternative package list file.
+ --debconf[=f] Pre-seed packages using <confdir>/debconf-selections.
+ Option arg: alternative pre-seed db file.
+ --keep_src_list Do not overwrite user provided apt sources.list.
+ --hostname=name Hostname of Debian system.
+ --password=pwd Use specified password as password for user root.
+
+ --bootappend=line Add specified appendline to kernel whilst booting.
+ --groot=device Root device for usage in grub, corresponds with
+ $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.
+
+Other options:
+
+ -h, --help Print this usage information and exit.
+ -v, --version Show summary of options and exit.
Send bugreports to the grml-team: bugs@grml.org || http://grml.org/bugs/
"
# }}}
# cmdline handling {{{
+# source external command line parameter-processing script
+. $prog_real.clp
+
+# business-logic of command line parameter-processing
+[ "$_opt_mirror" ] && MIRROR=$_opt_mirror
+[ "$_opt_iso" ] && ISO=$_opt_iso
+[ "$_opt_release" ] && RELEASE=$_opt_release
+[ "$_opt_target" ] && TARGET=$_opt_target
+[ "$_opt_mntpoint" ] && MNTPOINT=$_opt_mntpoint
+[ "$_opt_debopt" ] && DEBOOTSTRAP_OPT=$_opt_debopt
+[ "$_opt_interactive" ] && INTERACTIVE=1
+[ "$_opt_confdir" ] && CONFFILES=$_opt_confdir
+[ "$_opt_config" ] && CONFIGFILE=$_opt_config
+[ "$_opt_packages_set" ] && PACKAGES='yes'
+[ "$_opt_debconf_set" ] && DEBCONF='yes'
+[ "$_opt_keep_src_list" ] && KEEP_SRC_LIST='yes'
+[ "$_opt_hostname" ] && HOSTNAME=$_opt_hostname
+[ "$_opt_password" ] && ROOTPASSWORD=$_opt_password
+[ "$_opt_bootappend" ] && BOOT_APPEND=$_opt_bootappend
+[ "$_opt_groot" ] && GROOT=$_opt_groot
+[ "$_opt_grub" ] && GRUB=$_opt_grub
+
+[ "$_opt_help" ] && {
+ usage ; eend 0
+ eend 0
+ exit 0
+}
-while [ "$#" -gt "0" ] ; do
- case $1 in
- -c|--config)
- shift
- CONFIGFILE=$1
- ;;
- --grub)
- shift
- GRUB=$1
- ;;
- --groot)
- shift
- GROOT=$1
- ;;
- -h|--help)
- usage ; eend 0
- eend 0
- exit 0
- ;;
- --hostname)
- shift
- HOSTNAME=$1
- ;;
- --interactive)
- INTERACTIVE=1
- ;;
- -i|--iso)
- shift
- [ -n "$MIRROR" ] && unset MIRROR
- ISO=$1
- ;;
- -m|--mirror)
- shift
- MIRROR=$1
- CHROOTMIRROR=$1
- ;;
- -p|--mntpoint)
- shift
- MNTPOINT=$1
- ;;
- --password)
- shift
- ROOTPASSWORD=$1
- ;;
- -r|--release)
- shift
- RELEASE=$1
- ;;
- -t|--target)
- shift
- TARGET=$1
- ;;
- -v|--version)
- einfo "$PN - version $VERSION"
- einfo "Send bug reports to bugs@grml.org or http://grml.org/bugs/"
- eend 0
- exit 0
- ;;
- *)
- eerror "Syntax error."
- usage ; eend 1
- exit 1
- ;;
- esac
- shift
-done
+[ "$_opt_version" ] && {
+ einfo "$PN - version $VERSION"
+ einfo "Send bug reports to bugs@grml.org or http://grml.org/bugs/"
+ eend 0
+ exit 0
+}
# }}}
# welcome screen {{{
grep -v 'Extended$' | \
gawk -v num=0 -v ORS=' ' '/^\/dev\// {print $1}')
- [ -n "$AVAILABLE_PARTITIONS" ] || echo "FIXME: no partitions available?"
+ if [ -z "$AVAILABLE_PARTITIONS" ] ; then
+ dialog --title "$PN" --trim \
+ --msgbox "Sorry, no partitions found. Please configure your
+ harddisks (see /proc/partitions) using a tool like fdisk,
+ cfdisk, gpart, gparted,..." 0 0
+ exit 0
+ fi
+
PARTITION_LIST=$(for i in $(echo $AVAILABLE_PARTITIONS) ; do
echo "$i $(vol_id --type $i 2>/dev/null || echo [no_filesystem_yet])"
done)
}
# }}}
+# ask for password {{{
+prompt_for_password()
+{
+ ROOTPW1='PW1'
+ ROOTPW2='PW2'
+ while [ "$ROOTPW1" != "$ROOTPW2" ]; do
+ ROOTPW1=$(dialog --insecure --stdout --title "${PN}" --passwordbox \
+ "Please enter the password for the root account:" 10 60)
+ ROOTPW2=$(dialog --insecure --stdout --title "${PN}" --passwordbox \
+ "Please enter the password for the root account again for \
+ confirmation:" 10 60)
+
+ if [ "$ROOTPW1" != "$ROOTPW2" ]; then
+ $(dialog --stdout --title "${PN}" --ok-label \
+ "Retry" --msgbox "Passwords do not match!" 10 60)
+ fi
+ done
+ ROOTPASSWORD="$ROOTPW1"
+}
+# }}}
+
# ask for Debian mirror {{{
prompt_for_mirror()
{
prompt_for_hostname
+ prompt_for_password
+
# 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
ISODIR=${ISODIR%%/}
# }}}
-# provide variables to chroot system {{{
-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
-[ -n "$GRUB" ] && echo "GRUB=$GRUB" >> $CHROOT_VARIABLES
-[ -n "$GROOT" ] && echo "GROOT=$GROOT" >> $CHROOT_VARIABLES
-[ -n "$TARGET" ] && echo "TARGET=$TARGET" >> $CHROOT_VARIABLES
-[ -n "$ISO" ] && echo "ISO=$ISO" >> $CHROOT_VARIABLES
-[ -n "$ISODIR" ] && echo "ISODIR=$ISO" >> $CHROOT_VARIABLES
-[ -n "$MIRROR" ] && echo "MIRROR=$MIRROR" >> $CHROOT_VARIABLES
-[ -n "$MIRROR" ] && echo "CHROOTMIRROR=$MIRROR" >> $CHROOT_VARIABLES
-[ -n "$ROOTPASSWORD" ] && echo "ROOTPASSWORD=$ROOTPASSWORD" >> $CHROOT_VARIABLES
-# }}}
-
# helper functions {{{
# we want to exit smoothly and clean:
bailout(){
if [ -n "$MKFS" ] ; then
einfo "Running $MKFS on $TARGET"
$MKFS $TARGET
+ TARGET_UUID="$(vol_id -u $TARGET 2>/dev/null || echo '')"
eend $?
fi
}
if ! grep -q $MNTPOINT /proc/mounts ; then
mount_target
fi
- if grep -q $MNTPOINT /proc/mounts ; then
- einfo "Running $DEBOOTSTRAP for release ${RELEASE}${ARCHINFO} using ${MIRROR}${ISO}"
- [ -n "$MIRROR" ] && $DEBOOTSTRAP $ARCHCMD $RELEASE $MNTPOINT $MIRROR || \
- $DEBOOTSTRAP $ARCHCMD $RELEASE $MNTPOINT $ISO
+ 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
eend $?
else
eerror "Error: $MNTPOINT not mounted, can not continue."
# prepare chroot via chroot-script {{{
preparechroot() {
einfo "Preparing chroot system"
+
+ # provide variables to chroot system
+ CHROOT_VARIABLES="/var/cache/grml-debootstrap/variables_${SHORT_TARGET}"
+ 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 "CHROOTMIRROR=$MIRROR" >> $CHROOT_VARIABLES
+ [ -n "$MIRROR" ] && echo "MIRROR=$MIRROR" >> $CHROOT_VARIABLES
+ [ -n "$KEEP_SRC_LIST" ] && echo "KEEP_SRC_LIST=$KEEP_SRC_LIST" >> $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 $CONFFILES/chroot-script $MNTPOINT/bin/chroot-script
chmod 755 $MNTPOINT/bin/chroot-script
mkdir $MNTPOINT/etc/debootstrap/
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 ${_opt_packages:-/etc/debootstrap/packages} \
+ $MNTPOINT/etc/debootstrap/packages
+ _opt_debconf=${_opt_debconf:-/etc/debootstrap/debconf-selections}
+ [ -f $_opt_debconf -a "$DEBCONF" = 'yes' ] && \
+ cp $_opt_debconf $MNTPOINT/etc/debootstrap/debconf-selections
# 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/
+ cp -a -L /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
# 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/
- [ -d /etc/debootstrap/share ] && cp -a /etc/debootstrap/share/* $MNTPOINT/share/
- [ -d /etc/debootstrap/usr ] && cp -a /etc/debootstrap/usr/* $MNTPOINT/usr/
- [ -d /etc/debootstrap/var ] && cp -a /etc/debootstrap/var/* $MNTPOINT/var/
+ # copy any existing files to chroot
+ [ -d /etc/debootstrap/bin ] && cp -a -L /etc/debootstrap/bin/* $MNTPOINT/bin/
+ [ -d /etc/debootstrap/boot ] && cp -a -L /etc/debootstrap/boot/* $MNTPOINT/boot/
+ [ -d /etc/debootstrap/etc ] && cp -a -L /etc/debootstrap/etc/* $MNTPOINT/etc/
+ [ -d /etc/debootstrap/sbin ] && cp -a -L /etc/debootstrap/sbin/* $MNTPOINT/sbin/
+ [ -d /etc/debootstrap/share ] && cp -a -L /etc/debootstrap/share/* $MNTPOINT/share/
+ [ -d /etc/debootstrap/usr ] && cp -a -L /etc/debootstrap/usr/* $MNTPOINT/usr/
+ [ -d /etc/debootstrap/var ] && cp -a -L /etc/debootstrap/var/* $MNTPOINT/var/
# copy local network setup to chroot
if [ -r /etc/network/interfaces -a ! -r "${MNTPOINT}"/etc/network/interfaces ] ; then