# waypoint vars WAYPOINTS="" NUM_STEPS=0 # progress bar vars export PB_POSITION=0 export PB_WAYPOINT_LENGTH=0 # used for setting up apt PROTOCOL= MIRROR= DIRECTORY= COMPONENTS= DISTRIBUTION= # used by kernel installation code KERNEL= KERNEL_LIST=/tmp/available_kernels.txt KERNEL_NAME=`udpkg --print-os` case $KERNEL_NAME in linux) KERNEL_MAJOR="$(uname -r | cut -d - -f 1 | cut -d . -f 1,2)" ;; kfreebsd) KERNEL_MAJOR="$(uname -r | cut -d . -f 1)" ;; hurd) KERNEL_NAME=gnumach ; KERNEL_MAJOR="$(uname -v | cut -d ' ' -f 2 | cut -d . -f 1)" ;; esac KERNEL_VERSION="$(uname -r | cut -d - -f 1)" KERNEL_ABI="$(uname -r | cut -d - -f 1,2)" KERNEL_FLAVOUR=$(uname -r | cut -d - -f 3-) MACHINE="$(uname -m)" NUMCPUS=$(cat /var/numcpus 2>/dev/null) || true CPUINFO=/proc/cpuinfo OFCPUS=/proc/device-tree/cpus/ # files and directories APT_SOURCES=/target/etc/apt/sources.list APT_CONFDIR=/target/etc/apt/apt.conf.d IT_CONFDIR=/target/etc/initramfs-tools/conf.d DPKG_CONFDIR=/target/etc/dpkg/dpkg.cfg.d IFS_ORIG="$IFS" NL=" " log() { logger -t base-installer "$@" } error() { log "error: $*" } warning() { log "warning: $*" } info() { log "info: $*" } exit_error() { error "exiting on error $1" db_progress stop db_input critical $1 || [ $? -eq 30 ] db_go exit 1 } waypoint () { WAYPOINTS="$WAYPOINTS $1:$2" NUM_STEPS=$(($NUM_STEPS + $1)) || true } run_waypoints () { db_progress START 0 $NUM_STEPS $1 for item in $WAYPOINTS; do PB_WAYPOINT_LENGTH=$(echo $item | cut -d: -f 1) WAYPOINT=$(echo $item | cut -d: -f 2) # Not all of the section headers need exist. db_progress INFO "base-installer/section/$WAYPOINT" || true eval $WAYPOINT PB_POSITION=$(($PB_POSITION + $PB_WAYPOINT_LENGTH)) || true db_progress SET $PB_POSITION done db_progress STOP } update_progress () { # Updates the progress bar to a new position within the space allocated # for the current waypoint. NW_POS=$(($PB_POSITION + $PB_WAYPOINT_LENGTH * $1 / $2)) db_progress SET $NW_POS } check_target () { # Make sure something is mounted on the target. # Partconf causes the latter format. if [ -e /proc/mounts ] && \ ! grep -q '/target ' /proc/mounts && \ ! grep -q '/target/ ' /proc/mounts; then exit_error base-installer/no_target_mounted fi # Warn about installation over an existing unix. if [ -e /target/bin/sh -o -L /target/bin/sh ]; then warning "attempting to install to unclean target" db_capb "" db_input high base-installer/use_unclean_target || true db_go || exit 10 db_capb backup db_get base-installer/use_unclean_target if [ "$RET" = false ]; then db_reset base-installer/use_unclean_target exit_error base-installer/unclean_target_cancel fi db_reset base-installer/use_unclean_target fi # Undo dev bind mounts for idempotency. if grep -qE '^[^ ]+ /target/dev' /proc/mounts; then umount /target/dev fi # Unmount /dev/.static/dev if mounted on same device as /target mp_stdev=$(grep -E '^[^ ]+ /dev/\.static/dev' /proc/mounts | \ cut -d" " -f1) if [ "$mp_stdev" ] && grep -q "^$mp_stdev /target " /proc/mounts; then umount /dev/.static/dev fi } setup_dev_linux () { # Ensure static device nodes created during install are preserved # Tests in MAKEDEV require this is done in the D-I environment mkdir -p /dev/.static/dev chmod 700 /dev/.static/ mount --bind /target/dev /dev/.static/dev # Mirror device nodes in D-I environment to target mount --bind /dev /target/dev/ } setup_dev_kfreebsd() { mount -t devfs devfs /target/dev } setup_dev() { case "$OS" in linux) setup_dev_linux ;; kfreebsd) setup_dev_kfreebsd ;; hurd) : ;; *) warning "setup_dev called for an unknown OS ($OS)." ;; esac } configure_apt_preferences () { [ ! -d "$APT_CONFDIR" ] && mkdir -p "$APT_CONFDIR" # Don't install Recommends during base-installer cat >$APT_CONFDIR/00InstallRecommends < $APT_CONFDIR/00trustcdrom < $APT_CONFDIR/00IgnoreTimeConflict << EOT Acquire::gpgv::Options { "--ignore-time-conflict"; }; EOT if db_get debian-installer/allow_unauthenticated && [ "$RET" = true ]; then # This file will be left in place until the end of the install. cat > $APT_CONFDIR/00AllowUnauthenticated << EOT APT::Get::AllowUnauthenticated "true"; Aptitude::CmdLine::Ignore-Trust-Violations "true"; EOT fi if [ "$PROTOCOL" = https ] && db_get debian-installer/allow_unauthenticated_ssl && [ "$RET" = true ]; then # This file will be left in place on the installed system. cat > $APT_CONFDIR/00AllowUnauthenticatedSSL << EOT Acquire::https::Verify-Host "false"; Acquire::https::Verify-Peer "false"; EOT fi [ ! -d "$DPKG_CONFDIR" ] && mkdir -p "$DPKG_CONFDIR" # Disable all syncing; it's unnecessary in an installation context, # and can slow things down quite a bit. # This file will be left in place until the end of the install. cat > $DPKG_CONFDIR/force-unsafe-io </dev/null`; do base=$(basename $script | sed 's/[0-9]*//') if ! db_progress INFO base-installer/progress/$base; then db_subst base-installer/progress/fallback SCRIPT "$base" db_progress INFO base-installer/progress/fallback fi if [ -x "$script" ] ; then # be careful to preserve exit code if log-output -t base-installer "$script"; then : else warning "$script returned error code $?" fi else error "Unable to execute $script" fi done fi } post_install_hooks () { # locales will now be installed, so unset unset IT_LANG_OVERRIDE partsdir="/usr/lib/post-base-installer.d" if [ -d "$partsdir" ]; then scriptcount=`ls "$partsdir"/* 2>/dev/null | wc -l` scriptcur=0 for script in "$partsdir"/*; do base="$(basename "$script" | sed 's/[0-9]*//')" if ! db_progress INFO base-installer/progress/$base && \ ! db_progress INFO finish-install/progress/$base; then db_subst base-installer/progress/fallback SCRIPT "$base" db_progress INFO base-installer/progress/fallback fi if [ -x "$script" ]; then # be careful to preserve exit code if log-output -t base-installer "$script"; then : else warning "$script returned error code $?" fi else error "Unable to execute $script" fi scriptcur="$(($scriptcur + 1))" update_progress "$scriptcur" "$scriptcount" done fi } get_mirror_info () { if [ -f /cdrom/.disk/base_installable ]; then if db_get cdrom/codename && [ "$RET" ] ; then DISTRIBUTION=$RET else exit_error base-installer/no_codename fi PROTOCOL=file MIRROR="" DIRECTORY="/cdrom/" if [ -s /cdrom/.disk/base_components ]; then COMPONENTS=`grep -v '^#' /cdrom/.disk/base_components | tr '\n' , | sed 's/,$//'` else COMPONENTS="*" fi # Sanity check: an error reading /cdrom/.disk/base_components can # cause ugly errors in debootstrap because $COMPONENTS will be empty if [ -z "$COMPONENTS" ]; then exit_error base-installer/cannot_install fi else if db_get mirror/codename && [ "$RET" ] ; then DISTRIBUTION=$RET else exit_error base-installer/no_codename fi mirror_error="" db_get mirror/protocol || mirror_error=1 PROTOCOL="$RET" db_get mirror/$PROTOCOL/hostname || mirror_error=1 MIRROR="$RET" db_get mirror/$PROTOCOL/directory || mirror_error=1 DIRECTORY="$RET" COMPONENTS="main" if [ "$mirror_error" = 1 ] || [ -z "$PROTOCOL" ] || [ -z "$MIRROR" ]; then exit_error base-installer/cannot_install fi fi } kernel_update_list () { # Use 'uniq' to avoid listing the same kernel more then once chroot /target apt-cache search "^(kernel|$KERNEL_NAME)-image" | \ cut -d" " -f1 | grep -v "linux-image-2.6" | uniq > "$KERNEL_LIST.unfiltered" kernels=`sort -r "$KERNEL_LIST.unfiltered" | tr '\n' ' ' | sed -e 's/ $//'` for candidate in $kernels; do if [ -n "$FLAVOUR" ]; then if arch_check_usable_kernel "$candidate" "$FLAVOUR"; then echo "$candidate" info "kernel $candidate usable on $FLAVOUR" else info "kernel $candidate not usable on $FLAVOUR" fi else info "could not determine kernel flavour" fi done > "$KERNEL_LIST" } kernel_present () { [ "$1" ] || return 1 grep -q "^$1\$" $KERNEL_LIST } pick_kernel () { kernel_update_list db_settitle debian-installer/bootstrap-base/title # For now, only present kernels we believe to be usable. We may have # to rethink this later, but if there are no usable kernels it # should be accompanied by an error message. The default must still # be usable if possible. kernels=$(sort "$KERNEL_LIST" | tr '\n' ',' | sed -e 's/,$//') info "Found kernels '$kernels'" if [ "$kernels" ]; then db_subst base-installer/kernel/image KERNELS "$kernels" else db_input high base-installer/kernel/skip-install || true db_go || true db_get base-installer/kernel/skip-install if [ "$RET" != true ]; then exit_error base-installer/kernel/no-kernels-found else db_set base-installer/kernel/image "none" KERNEL=none return fi fi # Allow for preseeding first, try to determine a default next. db_get base-installer/kernel/image if kernel_present "$RET" || [ "$RET" = none ]; then KERNEL="$RET" info "preseeded/current kernel: $KERNEL" else # Unset seen flag in case we had an incorrect preseeded value. db_fset base-installer/kernel/image seen false || true if [ -n "$FLAVOUR" ]; then arch_kernel="$(arch_get_kernel "$FLAVOUR")" # Hack to support selection of meta packages with a postfix # added to the normal name (for updated kernels in stable). if db_get base-installer/kernel/altmeta && [ "$RET" ]; then arch_kernel="$(echo "$arch_kernel" | \ sed "s/$/-$RET/"; \ echo "$arch_kernel")" fi else arch_kernel="" fi got_arch_kernel= if [ "$arch_kernel" ]; then info "arch_kernel candidates: $arch_kernel" # Walk through recommended list for this architecture in order. for candidate in $arch_kernel; do if kernel_present "$candidate"; then info "arch_kernel: $candidate (present)" KERNEL="$candidate" break else info "arch_kernel: $candidate (absent)" fi done fi fi KERNEL_PRIO=high if kernel_present "$KERNEL" || [ "$KERNEL" = none ]; then # Current selection is available KERNEL_PRIO=medium else # No recommendations available; try to guess. kernels="$(echo "$kernels" | sed 's/,/\n/g')" # Try to default to running kernel version. KVERS=$(uname -r | cut -d'-' -f 1) KERNEL="$(echo "$kernels" | grep -- "-$KVERS" | head -n 1)" if [ -z "$KERNEL" ]; then # If possible, find one with at least the same major number # as the currently running kernel. KERNEL="$(echo "$kernels" | grep -- "-$KERNEL_MAJOR" | head -n 1)" if [ -z "$KERNEL" ]; then # Take the first on the list. KERNEL=$(echo "$kernels" | head -n 1) fi fi fi if [ "$KERNEL" ]; then db_set base-installer/kernel/image "$KERNEL" else # We have no reasonable default at all. KERNEL_PRIO=critical fi db_input $KERNEL_PRIO base-installer/kernel/image || [ $? -eq 30 ] if ! db_go; then db_progress stop exit 10 fi db_get base-installer/kernel/image KERNEL=$RET info "Using kernel '$KERNEL'" } install_kernel_linux () { if [ "$KERNEL" = none ]; then info "Not installing any kernel" return fi target_kernel_major="$(echo "$KERNEL" | sed 's/^kernel-image-//; s/^linux-image-//; s/-.*//' | cut -d . -f 1,2)" case $target_kernel_major in 2.?) ;; [3-9].*) # As far as our debconf templates are concerned, # this is essentially 2.6. target_kernel_major=2.6 ;; *) # something went wrong; use major version of # installation kernel target_kernel_major="$(uname -r | cut -d . -f 1,2)" ;; esac do_initrd=no if db_get "base-installer/kernel/linux/initrd-$target_kernel_major"; then if [ "$RET" = true ]; then do_initrd=yes fi # Note: this template currently does not exist elif db_get base-installer/kernel/linux/initrd; then if [ "$RET" = true ]; then do_initrd=yes fi else warning "Failed to get debconf answer 'base-installer/kernel/linux/initrd'." do_initrd=yes fi if db_get base-installer/kernel/linux/link_in_boot ; then if [ "$RET" = "true" ]; then link_in_boot=yes else link_in_boot=no fi else warning "Failed to get debconf answer 'base-installer/kernel/linux/link_in_boot'." link_in_boot=no fi # Create configuration file for kernel-package if [ -f /target/etc/kernel-img.conf ]; then # Backup old kernel-img.conf mv /target/etc/kernel-img.conf /target/etc/kernel-img.conf.$$ fi info "Setting do_initrd='$do_initrd'." info "Setting link_in_boot='$link_in_boot'." cat > /target/etc/kernel-img.conf < $IT_CONFDIR/driver-policy < $resumeconf.new && mv $resumeconf.new $resumeconf else echo "RESUME=$resume" >> $resumeconf fi fi # Set PReP root partition if [ "$ARCH" = powerpc ] && [ "$SUBARCH" = prep ] && \ [ "$rd_generator" = initramfs-tools ]; then prepconf=$IT_CONFDIR/prep-root rootpart_devfs=$(mount | grep "on /target " | cut -d' ' -f1) rootpart=$(mapdevfs $rootpart_devfs) if [ -f $prepconf ] && grep -q "^#* *ROOT=" $prepconf; then sed -e "s@^#* *ROOT=.*@ROOT=$rootpart@" < $prepconf > $prepconf.new && mv $prepconf.new $prepconf else echo "ROOT=$rootpart" >> $prepconf fi fi fi # Advance progress bar to 30% of allocated space for install_kernel_linux update_progress 30 100 # We really should install Recommends by default here (see #929667) db_get base-installer/install-recommends if [ "$RET" = true ]; then KERNEL_INSTALL_OPTS=--with-recommends else KERNEL_INSTALL_OPTS= fi # Install the kernel db_subst base-installer/section/install_kernel_package SUBST0 "$KERNEL" db_progress INFO base-installer/section/install_kernel_package log-output -t base-installer apt-install $KERNEL_INSTALL_OPTS "$KERNEL" || kernel_install_failed=$? # Advance progress bar to 90% of allocated space for install_kernel_linux update_progress 90 100 if [ -f /target/etc/kernel-img.conf.$$ ]; then # Revert old kernel-img.conf mv /target/etc/kernel-img.conf.$$ /target/etc/kernel-img.conf fi if [ "$kernel_install_failed" ]; then db_subst base-installer/kernel/failed-install KERNEL "$KERNEL" exit_error base-installer/kernel/failed-install fi } get_resume_partition () { biggest_size=0 biggest_partition= while read filename type size other; do if [ "$type" != partition ]; then continue fi if [ ! -e "$filename" ]; then continue fi if [ "${filename#/dev/ramzswap}" != "$filename" ]; then continue fi if [ "$size" -gt "$biggest_size" ]; then biggest_size="$size" biggest_partition="$filename" fi done < /proc/swaps echo "$biggest_partition" } addmodule_easy () { if [ -f "$CFILE" ]; then if [ "$2" = 1 ]; then echo -e "\n# Added by Debian Installer" >>$CFILE fi echo "$1" >> $CFILE fi } addmodule_initramfs_tools () { CFILE='/target/etc/initramfs-tools/modules' addmodule_easy "$1" "$2" } install_kernel_kfreebsd() { if [ "$KERNEL" = none ]; then info "Not installing any kernel" return fi # Create configuration file for kernel-package if [ -f /target/etc/kernel-img.conf ]; then # Backup old kernel-img.conf mv /target/etc/kernel-img.conf /target/etc/kernel-img.conf.$$ fi cat > /target/etc/kernel-img.conf < /target/etc/kernel-img.conf </dev/null || true if [ ! -e $tdir ]; then mkdir -p $tdir fi # The bind mount is left mounted, for future apt-install # calls to use. case "$OS" in linux) if ! mount -o bind $DIRECTORY $tdir; then warning "failed to bind mount $tdir" fi ;; kfreebsd) if ! mount -t nullfs $DIRECTORY $tdir ; then warning "failed to bind mount $tdir" fi ;; hurd) if ! mount -t firmlink $DIRECTORY $tdir > /dev/null 2>&1 ; then warning "failed to bind mount $tdir" fi ;; *) warning "configure_apt called with unknown OS ($OS)." ;; esac # Define the mount point for apt-cdrom cat > $APT_CONFDIR/00CDMountPoint << EOT Acquire::cdrom { mount "/media/cdrom"; }; Dir::Media::MountPath "/media/cdrom"; EOT # Make apt-cdrom and apt not unmount/mount CD-ROMs; # needed to support CD images (hd-media installs). # This file will be left in place until the end of the # install for hd-media installs, but is removed again # during apt-setup for installs using real CD/DVDs. cat > $APT_CONFDIR/00NoMountCDROM << EOT APT::CDROM::NoMount "true"; Acquire::cdrom { "/media/cdrom/" { Mount "true"; UMount "true"; }; AutoDetect "false"; } EOT # Scan CD-ROM or CD image; start with clean sources.list # Prevent apt-cdrom from prompting : > $APT_SOURCES if ! log-output -t base-installer \ chroot /target apt-cdrom add $APT_SOURCES fi } cleanup () { rm -f "$KERNEL_LIST" "$KERNEL_LIST.unfiltered" } is_ports_architecture() { case "$1" in alpha|hppa|hurd-amd64|hurd-i386|ia64|kfreebsd-amd64|kfreebsd-i386|m68k|powerpc|ppc64|sh4|sparc64|x32) return 0 ;; *) return 1 ;; esac }