Package: debootstrap Version: 1.0.42 Severity: wishlist Tags: patch Dear Maintainer, I wonder if we could have debootstrap support the repository ftp.debian-ports.org. Please find the script attached as an illustration of the requested features, in the form of a script /usr/share/debootstrap/scripts/debian-ports. (A diff against the stock script for unstable is attached as from_unstable_to_debian-ports.diff.gz) ftp.debian-ports.org hosts unofficial architectures until they are integrated in the main Debian archive (currently alpha, hppa, m68k, powerpcspe, ppc64, sh4 and sparc64, and GNU/Hurd). It requires specific workarounds in debootstrap since the needed packages are sometimes not in the "unstable" suite of the repository. Thanks in advance ! J-H Chatenet -- System Information: Debian Release: wheezy/sid APT prefers unreleased APT policy: (500, 'unreleased'), (500, 'unstable') Architecture: alpha Kernel: Linux 3.2.0-4-alpha-generic Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages debootstrap depends on: ii wget 1.14-1 Versions of packages debootstrap recommends: ii debian-archive-keyring 2012.4 ii gnupg 1.4.12-4 debootstrap suggests no packages. -- debconf-show failed
# /usr/share/debootstrap/scripts/debian-ports
SUITE="unstable"
DEF_MIRROR="http://ftp.debian-ports.org/debian"
mirror_style release
download_style apt
finddebs_style from-indices
variants - buildd fakechroot minbase scratchbox
# use the debian-ports keyring if debian-ports-archive-keyring is installed
#keyring /usr/share/keyrings/debian-archive-keyring.gpg
keyring /usr/share/keyrings/debian-ports-archive-keyring.gpg
# or the one installed
keyring /etc/apt/trusted.gpg
# Install debian-ports-archive-keyring (priority: extra) along with the important packages on the target
if [ -z "$ADDITIONAL" ]; then
ADDITIONAL="debian-ports-archive-keyring"
elif $(echo "$ADDITIONAL" | fgrep -qv 'debian-ports-archive-keyring'); then
ADDITIONAL="${ADDITIONAL} debian-ports-archive-keyring"
fi
if doing_variant fakechroot; then
test "$FAKECHROOT" = "true" || error 1 FAKECHROOTREQ "This variant requires fakechroot environment to be started"
fi
case $ARCH in
alpha|ia64) LIBC="libc6.1" ;;
kfreebsd-*) LIBC="libc0.1" ;;
hurd-*) LIBC="libc0.3" ;;
*) LIBC="libc6" ;;
esac
# overload download_indices from /usr/share/debootstrap/functions
download_indices () {
local mem_suite
mk_download_dirs
"$DOWNLOAD_INDICES" $(echo "$@" | tr ' ' '\n' | sort)
mem_suite=$SUITE
SUITE="unreleased" "$DOWNLOAD_INDICES" $(echo "$@" | tr ' ' '\n' | sort)
SUITE=$mem_suite
}
# add unreleased
add_fake_component () {
local TEMP_COMPONENTS
local m2 c c1 path1 pkgdest1 path2 pkgdest2
components_wo_unreleased=$(echo $COMPONENTS|tr ' ' '\n'|\
sort|uniq|tr '\n' ' ')
TEMP_COMPONENTS="$components_wo_unreleased"
for m2 in $MIRRORS; do
for c in $components_wo_unreleased; do
path1="dists/unreleased/$c/binary-$ARCH/Packages"
pkgdest1="$TARGET/$($DLDEST pkg "unreleased" "$c" "$ARCH" "$m2" "$path1")"
# Fake component unreleased
c1="${c}unreleased"
path2="dists/$SUITE/$c1/binary-$ARCH/Packages"
pkgdest2="$TARGET/$($DLDEST pkg "$SUITE" "$c1" "$ARCH" "$m2" "$path2")"
ln -sf $(basename $pkgdest1) $pkgdest2
TEMP_COMPONENTS="${TEMP_COMPONENTS} ${c1}"
done
done
TEMP_COMPONENTS="$(echo $TEMP_COMPONENTS|tr ' ' '\n'|sort|uniq|tr '\n' ' ')"
if [ "$TEMP_COMPONENTS" != "$components_wo_unreleased" ] ; then
COMPONENTS="$TEMP_COMPONENTS"
fi
}
work_out_debs () {
# add a symlink for unreleased
add_fake_component
required="$(get_debs Priority: required)"
if doing_variant - || doing_variant fakechroot; then
#required="$required $(get_debs Priority: important)"
# ^^ should be getting debconf here somehow maybe
base="$(get_debs Priority: important)"
elif doing_variant buildd || doing_variant scratchbox; then
base="apt build-essential"
elif doing_variant minbase; then
base="apt"
fi
if doing_variant fakechroot; then
# ldd.fake needs binutils
required="$required binutils"
fi
}
# from /usr/share/debootstrap/scripts/sid unmodified
first_stage_install () {
extract $required
mkdir -p "$TARGET/var/lib/dpkg"
: >"$TARGET/var/lib/dpkg/status"
: >"$TARGET/var/lib/dpkg/available"
setup_etc
if [ ! -e "$TARGET/etc/fstab" ]; then
echo '# UNCONFIGURED FSTAB FOR BASE SYSTEM' > "$TARGET/etc/fstab"
chown 0:0 "$TARGET/etc/fstab"; chmod 644 "$TARGET/etc/fstab"
fi
x_feign_install () {
local pkg="$1"
local deb="$(debfor $pkg)"
local ver="$(extract_deb_field "$TARGET/$deb" Version)"
mkdir -p "$TARGET/var/lib/dpkg/info"
echo \
"Package: $pkg
Version: $ver
Maintainer: unknown
Status: install ok installed" >> "$TARGET/var/lib/dpkg/status"
touch "$TARGET/var/lib/dpkg/info/${pkg}.list"
}
x_feign_install dpkg
}
# Remove the symlinks to unreleased
clean_fake_component () {
local m2 c c1 path pkgdest
for m2 in $MIRRORS; do
for c in $components_wo_unreleased; do
c1="${c}unreleased"
path="dists/$SUITE/$c1/binary-$ARCH/Packages"
pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c1" "$ARCH" "$m2" "$path")"
if [ -h $pkgdest ] ; then
rm $pkgdest
fi
done
done
}
second_stage_install () {
setup_devices
x_core_install () {
smallyes '' | in_target dpkg --force-depends --install $(debfor "$@")
}
p () {
baseprog="$(($baseprog + ${1:-1}))"
}
if doing_variant fakechroot; then
setup_proc_fakechroot
elif doing_variant scratchbox; then
true
else
setup_proc
in_target /sbin/ldconfig
fi
DEBIAN_FRONTEND=noninteractive
DEBCONF_NONINTERACTIVE_SEEN=true
export DEBIAN_FRONTEND DEBCONF_NONINTERACTIVE_SEEN
baseprog=0
bases=7
p; progress $baseprog $bases INSTCORE "Installing core packages" #1
info INSTCORE "Installing core packages..."
p; progress $baseprog $bases INSTCORE "Installing core packages" #2
ln -sf mawk "$TARGET/usr/bin/awk"
x_core_install base-files base-passwd
p; progress $baseprog $bases INSTCORE "Installing core packages" #3
x_core_install dpkg
if [ ! -e "$TARGET/etc/localtime" ]; then
ln -sf /usr/share/zoneinfo/UTC "$TARGET/etc/localtime"
fi
if doing_variant fakechroot; then
install_fakechroot_tools
fi
p; progress $baseprog $bases INSTCORE "Installing core packages" #4
x_core_install $LIBC
p; progress $baseprog $bases INSTCORE "Installing core packages" #5
x_core_install perl-base
p; progress $baseprog $bases INSTCORE "Installing core packages" #6
rm "$TARGET/usr/bin/awk"
x_core_install mawk
p; progress $baseprog $bases INSTCORE "Installing core packages" #7
if doing_variant -; then
x_core_install debconf
fi
baseprog=0
bases=$(set -- $required; echo $#)
info UNPACKREQ "Unpacking required packages..."
exec 7>&1
smallyes '' |
(repeatn 5 in_target_failmsg UNPACK_REQ_FAIL_FIVE "Failure while unpacking required packages. This will be attempted up to five times." "" \
dpkg --status-fd 8 --force-depends --unpack $(debfor $required) 8>&1 1>&7 || echo EXITCODE $?) |
dpkg_progress $baseprog $bases UNPACKREQ "Unpacking required packages" UNPACKING
info CONFREQ "Configuring required packages..."
mv "$TARGET/sbin/start-stop-daemon" "$TARGET/sbin/start-stop-daemon.REAL"
echo \
"#!/bin/sh
echo
echo \"Warning: Fake start-stop-daemon called, doing nothing\"" > "$TARGET/sbin/start-stop-daemon"
chmod 755 "$TARGET/sbin/start-stop-daemon"
setup_dselect_method apt
smallyes '' |
(in_target_failmsg CONF_REQ_FAIL "Failure while configuring required packages." "" \
dpkg --status-fd 8 --configure --pending --force-configure-any --force-depends 8>&1 1>&7 || echo EXITCODE $?) |
dpkg_progress $baseprog $bases CONFREQ "Configuring required packages" CONFIGURING
baseprog=0
bases="$(set -- $base; echo $#)"
info UNPACKBASE "Unpacking the base system..."
setup_available $required $base
done_predeps=
while predep=$(get_next_predep); do
# We have to resolve dependencies of pre-dependencies manually because
# dpkg --predep-package doesn't handle this.
predep=$(without "$(without "$(resolve_deps $predep)" "$required")" "$done_predeps")
# XXX: progress is tricky due to how dpkg_progress works
# -- cjwatson 2009-07-29
p; smallyes '' |
in_target dpkg --force-overwrite --force-confold --skip-same-version --install $(debfor $predep)
base=$(without "$base" "$predep")
done_predeps="$done_predeps $predep"
done
smallyes '' |
(repeatn 5 in_target_failmsg INST_BASE_FAIL_FIVE "Failure while installing base packages. This will be re-attempted up to five times." "" \
dpkg --status-fd 8 --force-overwrite --force-confold --skip-same-version --unpack $(debfor $base) 8>&1 1>&7 || echo EXITCODE $?) |
dpkg_progress $baseprog $bases UNPACKBASE "Unpacking base system" UNPACKING
info CONFBASE "Configuring the base system..."
smallyes '' |
(repeatn 5 in_target_failmsg CONF_BASE_FAIL_FIVE "Failure while configuring base packages. This will be re-attempted up to five times." "" \
dpkg --status-fd 8 --force-confold --skip-same-version --configure -a 8>&1 1>&7 || echo EXITCODE $?) |
dpkg_progress $baseprog $bases CONFBASE "Configuring base system" CONFIGURING
mv "$TARGET/sbin/start-stop-daemon.REAL" "$TARGET/sbin/start-stop-daemon"
progress $bases $bases CONFBASE "Configuring base system"
info BASESUCCESS "Base system installed successfully."
# remove the symlink to unreleased
clean_fake_component
}
# overload setup_apt_sources from /usr/share/debootstrap/functions
setup_apt_sources () {
mkdir -p "$TARGET/etc/apt"
for m in "$@"; do
local cs=""
local cs1=""
for c in $components_wo_unreleased; do
local path="dists/$SUITE/$c/binary-$ARCH/Packages"
local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")"
if [ -e "$pkgdest" ]; then cs="$cs $c"; fi
# "unreleased" archive
local path1="dists/unreleased/$c/binary-$ARCH/Packages"
local pkgdest1="$TARGET/$($DLDEST pkg unreleased "$c" "$ARCH" "$m" "$path1")"
if [ -e "$pkgdest1" ]; then cs1="$cs1 $c"; fi
done
if [ "$cs" != "" ]; then echo "deb $m $SUITE$cs"; fi
if [ "$cs1" != "" ]; then echo "deb $m unreleased$cs1"; fi
done > "$TARGET/etc/apt/sources.list"
}
Attachment:
from_unstable_to_debian-ports.diff.gz
Description: Binary data
debootstrap and debian-ports ---------------------------- Usage ----- debootstrap debian-ports target-directory or debootstrap [ some options ] debian-ports target-directory [ a_debian-ports_mirror] Make sure that the script is installed as /usr/share/debootstrap/scripts/debian-ports. (If not, give the actual location of the script as the last argument of debootstrap, e.g. debootstrap unstable my_target_directory http://ftp.de.debian.org/debian-ports ./debian-ports using the mirror ftp.de.debian.org with a copy of the script in the current working directory.) Why a debootstrap script ? -------------------------- According to the description on http://www.debian-ports.org and http://www.debian-ports.org/archive : "The goal of this machine is to provide an infrastructure for unofficial architectures until they are integrated in the main Debian archive. " "The archive is currently shared between GNU/Linux alpha, hppa, m68k, powerpcspe, ppc64, sh4 and sparc64, and GNU/Hurd." There are 3 suites : unstable, unreleased and experimental. "The unreleased suite : this suite is used to upload packages which need hacks to build until the changes are integrated into Debian." It occurs that the needed files for an initial installation with debootstrap are spread among both suites unstable and unreleased. And the main code of debootstrap allows for one sole suite. Please note that no support for experimental packages is provided here. Under the hood -------------- The script symlinks unreleased as a (fake) component "mainunreleased" of unstable. The default mirror is changed to ftp.debian-ports.org and the default keyring to debian-ports-archive-keyring. debian-ports-archive-keyring (Prority : extra) is selected for installation in the target. A line for unreleased is added to sources.list.