Bug#885878: Bug #885878: net-retriever : backports support
Hi again,
I tested (once) in qemu emulation on amd64 two netboot images
built with stretch-backports and the two patches [1] and [2] below (and
#885866 which shouldn't be necessary). The installation
finished successfully (however, it doesn't install automatically
the kernel from stretch-backports under /target).
It is to illustrate the two use cases 1 (backported kernel only) and 2
(everything from backports - this case requires di-sort-packages).
[1] is mostly taken from commits c420f259627f5639c00cad35ebb260ee58983ce9,
106138a028d487ea7fb8cbdb713cc7df60c237c0 and faf64b03a5509e0997fa5637c3cef0a8b8c51423
(https://mraw.org/git/?p=debian-installer.git;a=shortlog;h=refs/heads/wheezy-backports-v3)
To build a netboot image with udeb packages from stretch-backports
and a 4.13.0 kernel :
$ cd debian-installer-20170615+deb9u2/build
$ make build_netboot USE_UDEBS_FROM=stretch USE_BACKPORTS_FROM=stretch-backports LINUX_KERNEL_ABI=4.13.0-0.bpo.1
To build a netboot image with a 4.13.0 kernel and no other packages from stretch-backports :
$ cd debian-installer-20170615+deb9u2/build
$ make build_netboot USE_UDEBS_FROM=stretch USE_BACKPORTS_FROM=stretch-backports \
LINUX_KERNEL_ABI=4.13.0-0.bpo.1 BACKPORT_KERNEL_ONLY=1
I hope it will help.
Regards,
JH Chatenet
[1] : debian-installer
diff -Naur a/build/config/common b/build/config/common
--- a/build/config/common
+++ b/build/config/common
@@ -60,6 +60,9 @@
# Archive components from which to fetch debian-installer modules.
UDEB_COMPONENTS ?= main/debian-installer
+# Whether to enable <suite>-proposed-updates:
+USE_PROPOSED_UPDATES ?= 0
+
# The date the installer is built.
BUILD_DATE ?= $(shell date -u '+%Y%m%d-%H:%M')
# The date the installer source was last changed; we prefer that the
diff -Naur a/build/Makefile b/build/Makefile
--- a/build/Makefile
+++ b/build/Makefile
@@ -121,6 +121,15 @@
ROOTCMD ?= fakeroot
endif
+# netboot with backported udebs : include di-sort-packages
+ifneq ($(USE_BACKPORTS_FROM),)
+ifeq ($(MEDIUM),netboot)
+ifeq ($(BACKPORT_KERNEL_ONLY),)
+ TYPE := $(TYPE)/backports
+endif
+endif
+endif
+
# Useful command sequences
define submake
$(ROOTCMD) $(MAKE) --no-print-directory -j1
@@ -256,6 +265,7 @@
rm -rf $(APTDIR) $(APTDIR).udeb $(APTDIR).deb $(BASE_DEST) $(BASE_TMP) $(SOURCEDIR) $(DEBUGUDEBDIR)
rm -f sources.list sources.list.udeb $(LOCALUDEBDIR)/Packages.gz $(LOCALUDEBDIR)/Packages
rm -rf $(UDEBDIR) $(STAMPS)
+ if [ -f preferences.udeb.local.generated ]; then rm -f preferences.udeb.local.generated preferences.udeb.local; fi
# For manual invocation, we provide a generic clean rule.
.PHONY: clean_%
@@ -486,6 +496,12 @@
mkdir -p $(TREE)/etc/
echo $(DEBIAN_RELEASE) >$(TREE)/etc/default-release
echo $(USE_UDEBS_FROM) >$(TREE)/etc/udebs-source
+ if [ -n "$(USE_BACKPORTS_FROM)" ]; then \
+ echo $(USE_BACKPORTS_FROM) >$(TREE)/etc/udebs-backports-source; \
+ fi
+ if [ -n "$(BACKPORT_KERNEL_ONLY)" ]; then \
+ touch $(TREE)/etc/backport-kernel-only; \
+ fi
endif
# Create a dev tree.
@@ -643,11 +659,14 @@
echo "deb [trusted=yes] copy:$(shell pwd)/ $(LOCALUDEBDIR)/"; \
if [ "$(MIRROR)x" != "x" ]; then \
echo "deb $(MIRROR) $(USE_UDEBS_FROM) $(UDEB_COMPONENTS)"; \
+ if [ -n "$(USE_BACKPORTS_FROM)" ] && [ "$(USE_BACKPORTS_FROM)" != "$(USE_UDEBS_FROM)" ]; then \
+ echo "deb $(MIRROR) $(USE_BACKPORTS_FROM) $(UDEB_COMPONENTS)"; \
+ fi; \
if [ "$(USE_UNRELEASED)" = 1 ]; then \
echo "deb $(MIRROR) unreleased $(UDEB_COMPONENTS)"; \
fi \
else \
- gen-sources.list.udeb "$(SYSTEM_SOURCES_LIST)" $(USE_UDEBS_FROM) $(UDEB_COMPONENTS) $(USE_PROPOSED_UPDATES); \
+ gen-sources.list.udeb "$(SYSTEM_SOURCES_LIST)" $(USE_UDEBS_FROM) $(UDEB_COMPONENTS) $(USE_PROPOSED_UPDATES) $(USE_BACKPORTS_FROM); \
if [ "$(USE_UNRELEASED)" = 1 ]; then \
gen-sources.list.udeb "$(SYSTEM_SOURCES_LIST)" unreleased $(UDEB_COMPONENTS); \
fi \
@@ -663,6 +682,18 @@
echo "ERROR: no valid source for $(USE_UDEBS_FROM)-proposed-updates"; \
exit 1; \
fi
+ @if [ ! -z "$(USE_BACKPORTS_FROM)" ] && ! grep -q "$(USE_BACKPORTS_FROM)" $@; then \
+ echo "ERROR: no valid source for backports ($(USE_BACKPORTS_FROM))"; \
+ exit 1; \
+ fi
+ @if [ ! -z "$(USE_BACKPORTS_FROM)" ] && [ -z "$(BACKPORT_KERNEL_ONLY)" ] && \
+ [ ! -f preferences.udeb.local ]; then \
+ echo "Using backported udebs"; \
+ echo 'Package: *' > preferences.udeb.local; \
+ echo "Pin: release n=$(USE_BACKPORTS_FROM)" >> preferences.udeb.local; \
+ echo 'Pin-Priority: 990' >> preferences.udeb.local; \
+ touch preferences.udeb.local.generated; \
+ fi
# Font generation.
#
diff -Naur a/build/pkg-lists/netboot/backports/common b/build/pkg-lists/netboot/backports/common
--- a/build/pkg-lists/netboot/backports/common
+++ b/build/pkg-lists/netboot/backports/common
@@ -0,0 +1 @@
+di-sort-packages
diff -Naur a/build/README b/build/README
--- a/build/README
+++ b/build/README
@@ -363,6 +363,18 @@
make USE_PROPOSED_UPDATES=1 all_build
If no valid source for proposed updates is found, the build will fail.
+USE_BACKPORTS_FROM
+ Set to <suite>-backports if it shall be used as a complementary suite when
+ building an image. The resulting image should be able to install some
+ components from backports (e.g. a newer kernel). Defaults to an empty string
+ meaning no backports support.
+ Included in /etc/udebs-backports-source in most initrds.
+
+BACKPORT_KERNEL_ONLY
+ Set to 1 to suppress the inclusion of udeb packages from backports
+ except kernel modules. LINUX_KERNEL_ABI and USE_BACKPORTS_FROM should be
+ set the relevant values. This may be overriden in preferences.udeb.local.
+
OMIT_RELEASE_INFO
Can be used to suppress the inclusion of the files /etc/default-release and
/etc/udebs-source in some targets (like boot floppies).
diff -Naur a/build/util/gen-sources.list.udeb b/build/util/gen-sources.list.udeb
--- a/build/util/gen-sources.list.udeb
+++ b/build/util/gen-sources.list.udeb
@@ -8,7 +8,8 @@
SOURCES_LIST=$1
SUITE=$2
UDEB_COMPONENTS=$3
-USE_PROPOSED_UPDATES=$4 # optional
+USE_PROPOSED_UPDATES=$4
+USE_BACKPORTS_FROM=$5 # optional
# Set to 1 or 2 to see increasing debug info about mirror tests
# Use 0 for quiet (normal) operation
@@ -84,6 +85,12 @@
echo "$mirror $SUITE-proposed-updates $UDEB_COMPONENTS"
echo "INFO: using '$tmirror' for $SUITE-proposed-updates" >&2
fi
+ if [ ! -z "$USE_BACKPORTS_FROM" ] &&
+ test_url $tmirror/dists/$USE_BACKPORTS_FROM/Release; then
+ echo "$mirror $USE_BACKPORTS_FROM $UDEB_COMPONENTS"
+ echo "INFO: using '$tmirror' for backports ($USE_BACKPORTS_FROM)" >&2
+ fi
+
else
echo "$mirror $SUITE $UDEB_COMPONENTS"
if [ "$USE_PROPOSED_UPDATES" = 1 ]; then
diff -Naur a/debian/rules b/debian/rules
--- a/debian/rules
+++ b/debian/rules
@@ -25,6 +25,10 @@
USE_UDEBS_FROM=unstable
endif
+ifneq (,$(filter %-backports,$(SUITE)))
+ USE_BACKPORTS_FROM=$(SUITE)
+endif
+
ARCHIVEDIR=debian/tmp/installer-$(ARCH)
DESTDIR=$(ARCHIVEDIR)/$(DATE)
IMAGEDIR=$(DESTDIR)/images
@@ -45,6 +49,7 @@
$(MAKE) -C build all_build stats release \
USE_UDEBS_FROM=$(USE_UDEBS_FROM) BUILD_DATE=$(DATE) \
USE_PROPOSED_UPDATES=$(USE_PROPOSED_UPDATES) \
+ USE_BACKPORTS_FROM=$(USE_BACKPORTS_FROM) \
USE_UNRELEASED=$(USE_UNRELEASED) \
TRANSSTATUS=$(TRANSSTATUS) BOOTMENU_BEEP=$(BOOTMENU_BEEP)
[2] : net-retriever
diff -Naur a/net-retriever b/net-retriever
--- a/net-retriever
+++ b/net-retriever
@@ -84,31 +84,9 @@
exit 1
}
-cmd="$1"
-shift
-
-case "$cmd" in
- retrieve)
- fetch "$@"
- exit $?
- ;;
-
- packages)
- rm -f "$1"
- touch "$1"
-
- # Setting codename to a suite is not very nice, but can do no harm
- if ! db_get mirror/udeb/suite || [ -z "$RET" ]; then
- if [ -f /etc/udebs-source ]; then
- RET=$(cat /etc/udebs-source)
- else
- db_get mirror/codename
- fi
- fi
- codename="$RET"
-
+get_packages () {
Release="/tmp/net-retriever-$$-Release"
- fetch "dists/$codename/Release" "$Release" || exit $?
+ fetch "dists/$codename/Release" "$Release" || return $?
# If gpgv and a keyring are installed, authentication is
# mandatory by default.
if type gpgv >/dev/null && [ -f "$keyring" ]; then
@@ -157,6 +135,71 @@
break
done
done
+
+ return $ret;
+}
+
+cmd="$1"
+shift
+
+case "$cmd" in
+ retrieve)
+ fetch "$@"
+ exit $?
+ ;;
+
+ packages)
+ rm -f "$1"
+ touch "$1"
+
+ # Setting codename to a suite is not very nice, but can do no harm
+ if ! db_get mirror/udeb/suite || [ -z "$RET" ]; then
+ if [ -f /etc/udebs-source ]; then
+ RET=$(cat /etc/udebs-source)
+ else
+ db_get mirror/codename
+ fi
+ fi
+ codename="$RET"
+
+ get_packages "$1" || exit $ret
+
+ if [ -e /etc/udebs-backports-source ]; then
+ if [ -e /etc/backport-kernel-only ] || \
+ [ -e /usr/lib/di-sort-packages/di_sort_pkgs ]; then
+ # We append the 'Packages' file from 'backports'
+ # We require the availability of 'backports'
+ codename=$(cat /etc/udebs-backports-source)
+ get_packages "$1" || exit $ret
+
+ if [ -e /etc/backport-kernel-only ]; then
+ # We suppress backported packages but kernel modules
+ sed -i -n -e '
+# unconditionally append to the hold space
+H
+# stanza end : test for a suitable package
+/^$/ {
+g
+# command H added a '\n' at the begining
+s/^\n//
+# is this a non backported package ?
+/^Package: .*\nVersion: [-.+:~A-Za-z0-9]*bpo/!p
+# is this a backported kernel module ?
+/^Package: .*\nVersion: [-.+:~A-Za-z0-9]*bpo.*\nKernel-Version:/p
+# prepare for next stanza
+s/^.*$//
+h
+}' "$1"
+ else
+ # We keep the newest version of each package
+ /usr/lib/di-sort-packages/di_sort_pkgs "$1" prune_versions > "${1}.temp"
+ mv -f "${1}.temp" "$1"
+ fi
+ else
+ log "No package from backports included: di-sort-packages not available"
+ fi
+ fi
+
exit $ret
;;
Reply to: