Merge branch 'ubuntu/master' of git+ssh://git.launchpad.net/livecd-rootfs into canary-as-default

canary-as-default
Łukasz 'sil2100' Zemczak 1 year ago
commit 9b33f085c1

116
debian/changelog vendored

@ -1,3 +1,119 @@
livecd-rootfs (23.10.30) mantic; urgency=medium
* Fix unminimize to correctly list packages. (LP: #1996489)
-- Utkarsh Gupta <utkarsh@ubuntu.com> Sat, 02 Sep 2023 02:16:03 +0530
livecd-rootfs (23.10.29) mantic; urgency=medium
* canary: switch to use the live task, try to use KERNEL_FLAVOURS instead
of a manual kernel add_package.
-- Łukasz 'sil2100' Zemczak <lukasz.zemczak@ubuntu.com> Wed, 31 Aug 2023 11:57:11 +0200
livecd-rootfs (23.10.28) mantic; urgency=medium
* Allow stderr in the autopkgtest.
-- Steve Langasek <steve.langasek@ubuntu.com> Wed, 30 Aug 2023 08:28:57 -0700
livecd-rootfs (23.10.27) mantic; urgency=medium
* Add ubuntu to the list of targets we autopkgtest for on amd64, to ensure
coverage of the lb_chroot_layered behavior.
* lb_chroot_layered: if the unmount of the chroot mountpoint fails, dump
mount information for debugging.
-- Steve Langasek <steve.langasek@ubuntu.com> Tue, 29 Aug 2023 10:39:23 -0700
livecd-rootfs (23.10.26) mantic; urgency=medium
[ Łukasz 'sil2100' Zemczak ]
* Update the enhanced-sb layer model to not preinstall the printing snaps,
per changes to seeds. Live layer model not changed as it will go away
soon per our staged changes.
[ Michael Hudson-Doyle ]
* Use a traditional seed.yaml style seed for the canary installer's live
-- Łukasz 'sil2100' Zemczak <lukasz.zemczak@ubuntu.com> Mon, 28 Aug 2023 12:13:38 +0200
livecd-rootfs (23.10.25) mantic; urgency=medium
* snap-seed-parse.py: fix builds with no snaps.
-- Michael Hudson-Doyle <michael.hudson@ubuntu.com> Mon, 28 Aug 2023 14:02:56 +1200
livecd-rootfs (23.10.24) mantic; urgency=medium
* update-source-catalog: Fix case where a variaton does not point at the
base layer (i.e. most builds) (LP: #2033168)
* Configure universe sources in canary ISO. (LP: #2033109)
* snap-seed-parse.py: Update to allow parsing uc20-style seeds.
(LP: #2028984)
-- Michael Hudson-Doyle <michael.hudson@ubuntu.com> Mon, 28 Aug 2023 12:48:53 +1200
livecd-rootfs (23.10.23) mantic; urgency=medium
* i386 foreign-arch support was added for the canary image before 23.04
released, but by mistake it was only added to the squashfs for the live
session, and not the squashfs layer used as the source for installation.
split the chroot hooks to add this to the standard.squashfs.
LP: #2033170.
* Drop mke2fs.conf override, no longer needed.
-- Steve Langasek <steve.langasek@ubuntu.com> Sat, 26 Aug 2023 16:34:27 -0700
livecd-rootfs (23.10.22) mantic; urgency=medium
* Undo preseeding in reset_snapd_state.
* update-source-catalog: work better when we want a variation to point
at the base layer.
* Stop launching a gnome-terminal at startup of the canary live session.
(LP: #2032647)
-- Michael Hudson-Doyle <michael.hudson@ubuntu.com> Fri, 25 Aug 2023 18:45:03 +1200
livecd-rootfs (23.10.21) mantic; urgency=medium
* Deduplicate the layers just before creating the squashfs, to enable
deduplication of the result of binary hooks as well.
[ Steve Langasek ]
* Deduplicate snaps between squashfs layers on classic:
- Consolidate canary layers to merge 'classic' back into 'standard'
- Reset /var/lib/snapd in the upper layers before calling snap
prepare-image
- No need to use rsync in hooks now to avoid file duplication since layer
handling as a whole now uses rsync.
-- Steve Langasek <steve.langasek@ubuntu.com> Wed, 23 Aug 2023 10:31:42 -0700
livecd-rootfs (23.10.20) mantic; urgency=medium
* Update canary model assertions to include all the regular seeded snaps,
using the right channels for all of them.
-- Łukasz 'sil2100' Zemczak <lukasz.zemczak@ubuntu.com> Tue, 22 Aug 2023 17:14:38 +0200
livecd-rootfs (23.10.19) mantic; urgency=medium
* Add python3-systemd to CPC's minimized builds.
-- Utkarsh Gupta <utkarsh@ubuntu.com> Tue, 22 Aug 2023 14:54:57 +0530
livecd-rootfs (23.10.18) mantic; urgency=medium
* Refresh the canary model assertions. The live model now includes all the
snaps of the standard installation (including firefox), as we want to offer
the same experience in the livefs as in the target installation. We also
track other, proper channels for the seeded snaps.
* Fix the 020-canary-* hooks referencing the wrong layer names after changes
introduced in 23.10.17.
-- Łukasz 'sil2100' Zemczak <lukasz.zemczak@ubuntu.com> Fri, 18 Aug 2023 17:58:54 +0200
livecd-rootfs (23.10.17) mantic; urgency=medium livecd-rootfs (23.10.17) mantic; urgency=medium
* Merge the minimal and standard layers on the Ubuntu Desktop images * Merge the minimal and standard layers on the Ubuntu Desktop images

@ -1,6 +1,6 @@
Tests: default-bootstraps Tests: default-bootstraps
Depends: @, lsb-release Depends: @, lsb-release
Restrictions: needs-root isolation-machine Restrictions: needs-root isolation-machine allow-stderr
Tests: minimized Tests: minimized
Depends: @, lsb-release Depends: @, lsb-release

@ -43,11 +43,17 @@ ALL_TRIPLETS="
xubuntu:: xubuntu::
xubuntu:minimal:" xubuntu:minimal:"
ARCH=$(dpkg --print-architecture)
if [ -z "$SELECTED_TRIPLETS" ]; then if [ -z "$SELECTED_TRIPLETS" ]; then
SELECTED_TRIPLETS=" SELECTED_TRIPLETS="
ubuntu-base:: ubuntu-base::
ubuntu-cpc::ubuntu-cpc ubuntu-cpc::ubuntu-cpc
" "
if [ "$ARCH" = amd64 ]; then
SELECTED_TRIPLETS="$SELECTED_TRIPLETS
ubuntu::"
fi
fi fi
live_build_rootfs() { live_build_rootfs() {
@ -55,7 +61,6 @@ live_build_rootfs() {
local SUBPROJECT_TMP=${1%:*} local SUBPROJECT_TMP=${1%:*}
SUBPROJECT=${SUBPROJECT_TMP#*:} SUBPROJECT=${SUBPROJECT_TMP#*:}
TEMPLATE=${1##*:} TEMPLATE=${1##*:}
ARCH=$(dpkg --print-architecture)
echo "Building rootfs for project: '$PROJECT' subproject: '$SUBPROJECT' template: '$TEMPLATE' in $PWD" echo "Building rootfs for project: '$PROJECT' subproject: '$SUBPROJECT' template: '$TEMPLATE' in $PWD"
cp -a /usr/share/livecd-rootfs/live-build/auto . cp -a /usr/share/livecd-rootfs/live-build/auto .
if [ -n "$TEMPLATE" ]; then if [ -n "$TEMPLATE" ]; then

@ -252,18 +252,18 @@ if [ -f /etc/dpkg/dpkg.cfg.d/excludes ] || [ -f /etc/dpkg/dpkg.cfg.d/excludes.dp
dpkg -S /usr/share/man/ |sed 's|, |\n|g;s|: [^:]*$||' | DEBIAN_FRONTEND=noninteractive xargs apt-get install --reinstall -y dpkg -S /usr/share/man/ |sed 's|, |\n|g;s|: [^:]*$||' | DEBIAN_FRONTEND=noninteractive xargs apt-get install --reinstall -y
echo "Reinstalling packages with system documentation in /usr/share/doc/ .." echo "Reinstalling packages with system documentation in /usr/share/doc/ .."
# This step processes the packages which still have missing documentation # This step processes the packages which still have missing documentation
dpkg --verify --verify-format rpm | awk '/..5...... \/usr\/share\/doc/ {print $2}' | sed 's|/[^/]*$||' | sort |uniq \ dpkg --verify --verify-format rpm | awk '$2 ~ /\/usr\/share\/doc/ {print $2}' | sed 's|/[^/]*$||' | sort | uniq \
| xargs dpkg -S | sed 's|, |\n|g;s|: [^:]*$||' | uniq | DEBIAN_FRONTEND=noninteractive xargs apt-get install --reinstall -y | xargs dpkg -S | sed 's|, |\n|g;s|: [^:]*$||' | uniq | DEBIAN_FRONTEND=noninteractive xargs apt-get install --reinstall -y
echo "Restoring system translations..." echo "Restoring system translations..."
# This step processes the packages which still have missing translations # This step processes the packages which still have missing translations
dpkg --verify --verify-format rpm | awk '/..5...... \/usr\/share\/locale/ {print $2}' | sed 's|/[^/]*$||' | sort |uniq \ dpkg --verify --verify-format rpm | awk '$2 ~ /\/usr\/share\/locale/ {print $2}' | sed 's|/[^/]*$||' | sort | uniq \
| xargs dpkg -S | sed 's|, |\n|g;s|: [^:]*$||' | uniq | DEBIAN_FRONTEND=noninteractive xargs apt-get install --reinstall -y | xargs dpkg -S | sed 's|, |\n|g;s|: [^:]*$||' | uniq | DEBIAN_FRONTEND=noninteractive xargs apt-get install --reinstall -y
if dpkg --verify --verify-format rpm | awk '/..5...... \/usr\/share\/doc/ {exit 1}'; then if dpkg --verify --verify-format rpm | awk '$2 ~ /\/usr\/share\/doc/ {exit 1}'; then
echo "Documentation has been restored successfully." echo "Documentation has been restored successfully."
rm /etc/dpkg/dpkg.cfg.d/excludes.dpkg-tmp rm /etc/dpkg/dpkg.cfg.d/excludes.dpkg-tmp
else else
echo "There are still files missing from /usr/share/doc/:" echo "There are still files missing from /usr/share/doc/:"
dpkg --verify --verify-format rpm | awk '/..5...... \/usr\/share\/doc/ {print " " $2}' dpkg --verify --verify-format rpm | awk '$2 ~ /\/usr\/share\/doc/ {print " " $2}'
echo "You may want to try running this script again or you can remove" echo "You may want to try running this script again or you can remove"
echo "/etc/dpkg/dpkg.cfg.d/excludes.dpkg-tmp and restore the files manually." echo "/etc/dpkg/dpkg.cfg.d/excludes.dpkg-tmp and restore the files manually."
fi fi

@ -722,27 +722,23 @@ case $PROJECT in
esac esac
;; ;;
*) *)
touch config/universe-enabled
PASSES_TO_LAYERS="true" PASSES_TO_LAYERS="true"
# the standard layer, contains all base common packages for later layers (we're splitting out the snaps) KERNEL_FLAVOURS='generic-hwe-22.04'
# the standard layer, contains all base common packages for later layers
add_task standard minimal standard ubuntu-desktop ubuntu-desktop-default-languages add_task standard minimal standard ubuntu-desktop ubuntu-desktop-default-languages
add_package standard cloud-init add_package standard cloud-init
# the classic layer, basically only contains snaps from the standard and minimal tasks
add_pass standard.classic
if [ -e "config/package-lists/livecd-rootfs.snaplist.chroot_standard.full" ]; then
cat config/package-lists/livecd-rootfs.snaplist.chroot_standard.full >>config/package-lists/livecd-rootfs.snaplist.chroot_standard.classic.full
rm config/package-lists/livecd-rootfs.snaplist.chroot_standard.full
fi
# the live layer, contains all packages for the live session installer # the live layer, contains all packages for the live session installer
# TODO: we should probably add the kernel per KERNEL_FLAVOURS add_task standard.live ubuntu-live
add_package standard.live linux-generic casper lvm2 mdadm cryptsetup dctrl-tools
remove_package standard.live ubiquity-frontend-gtk remove_package standard.live ubiquity-frontend-gtk
add_snap standard.live ubuntu-desktop-installer/classic
# the enhanced-secureboot layer, contains all packages for the enhanced secureboot install # the enhanced-secureboot layer, contains all packages for the enhanced secureboot install
add_package standard.enhanced-secureboot cryptsetup boot-managed-by-snapd add_package standard.enhanced-secureboot cryptsetup boot-managed-by-snapd
# language support # language support
seeded_langs="$(get_seeded_languages desktop)" seeded_langs="$(get_seeded_languages desktop)"
echo "$seeded_langs" | tr ' ' ',' > config/seeded-languages echo "$seeded_langs" | tr ' ' ',' > config/seeded-languages
derive_language_layers standard.classic desktop desktop-default-languages "$seeded_langs" derive_language_layers standard desktop desktop-default-languages "$seeded_langs"
derive_language_layers standard.enhanced-secureboot desktop desktop-default-languages "$seeded_langs" derive_language_layers standard.enhanced-secureboot desktop desktop-default-languages "$seeded_langs"
# now let's create the neccessary catalog files # now let's create the neccessary catalog files
@ -755,12 +751,9 @@ case $PROJECT in
variant: desktop variant: desktop
locale_support: langpack locale_support: langpack
default: yes default: yes
EOF
cat <<-EOF > config/standard.classic.catalog-in.yaml
id: ubuntu-desktop
variations: variations:
classic: standard:
path: standard.classic.squashfs path: standard.squashfs
EOF EOF
cat <<-EOF > config/standard.enhanced-secureboot.catalog-in.yaml cat <<-EOF > config/standard.enhanced-secureboot.catalog-in.yaml
id: ubuntu-desktop id: ubuntu-desktop
@ -1076,8 +1069,15 @@ case $PROJECT in
# or by passing --no-install-recommends to apt-get install. # or by passing --no-install-recommends to apt-get install.
# Apt config is set using `APT_OPTIONS` variable in this script. # Apt config is set using `APT_OPTIONS` variable in this script.
# This fixes LP: #2031640 # This fixes LP: #2031640
#
# We're also installing python3-systemd for now because it's needed by
# ubuntu-advantage-tools. This will eventually be dropped in the next
# release of u-a-t. This is being discussed and tracked at
# https://github.com/canonical/ubuntu-pro-client/issues/2692.
# Once python3-systemd is dropped from u-a-t, we can remove it
# from here, too.
APT_OPTIONS="${APT_OPTIONS:+$APT_OPTIONS }--no-install-recommends" APT_OPTIONS="${APT_OPTIONS:+$APT_OPTIONS }--no-install-recommends"
add_package install ubuntu-cloud-minimal add_package install ubuntu-cloud-minimal python3-systemd
else else
add_task install minimal standard cloud-image add_task install minimal standard cloud-image
add_package install ubuntu-minimal add_package install ubuntu-minimal
@ -1272,7 +1272,7 @@ case "$ARCH${SUBARCH:++$SUBARCH}" in
esac esac
case $PROJECT:${SUBPROJECT:-} in case $PROJECT:${SUBPROJECT:-} in
ubuntu-server:*|ubuntu-base:*|ubuntu-oci:*|ubuntu:) ubuntu-server:*|ubuntu-base:*|ubuntu-oci:*)
OPTS="${OPTS:+$OPTS }--linux-packages=none --initramfs=none" OPTS="${OPTS:+$OPTS }--linux-packages=none --initramfs=none"
KERNEL_FLAVOURS=none KERNEL_FLAVOURS=none
BINARY_REMOVE_LINUX=false BINARY_REMOVE_LINUX=false

@ -1230,3 +1230,15 @@ EOF
undivert_grub "${mountpoint}" undivert_grub "${mountpoint}"
fi fi
} }
# find all files under /var/lib/snapd in the target directory that aren't
# shipped by the snapd package itself, and remove them
reset_snapd_state() {
rootdir="$1"
/usr/lib/snapd/snap-preseed --reset $(realpath "$rootdir") || true
rm -rf "$rootdir/var/lib/snapd"
setup_mountpoint "$rootdir"
chroot "$rootdir" apt-get install --reinstall -y snapd
teardown_mountpoint "$rootdir"
}

@ -142,7 +142,39 @@ build_layered_squashfs () {
cp "${squashfs_f_manifest}.full" "${prefix}.manifest" cp "${squashfs_f_manifest}.full" "${prefix}.manifest"
fi fi
create_squashfs "overlay.${pass}/" ${squashfs_f} if [ -n "$lowerdirs" ]; then
# Although the current chroot was created as an overlay over
# the previous layer, many operations can result in redundant
# files in the upperdir. Rather than trying to minimize the
# overlay by hand, we rsync the chroot into a fresh overlay,
# rely on rsyncs ability to avoid redundant file operations,
# and take _that_ overlay's upperdir as the content of the
# layer.
mkdir -p chroot-2 "$overlay_dir-2"
mount_overlay "$lowerdirs" "$overlay_dir-2" chroot-2
# rsync takes many, many options. The subset
# we pass here is quite important:
# -a is standard to operate in the basic way required here.
# -X to preserve xattrs
# -H to preserve hardlinks
# -A to preserve ACLs
# -S to preserve sparseness
# --checksum to skip copies based on the content of the file
# (rather than the default which is to skip copies based
# on size + mtime)
# --no-times to not copy mtimes from source to dest (we
# don't care about mtime in the image and want to
# deduplicate files that have indentical contents but
# different mtimes)
# --del because we want to remove files that have been
# deleted in this layer.
rsync -aXHAS --checksum --no-times --del chroot/ chroot-2/
umount chroot-2
rmdir chroot-2
overlay_dir="$overlay_dir-2"
fi
create_squashfs "${overlay_dir}" ${squashfs_f}
if [ -f config/$pass.catalog-in.yaml ]; then if [ -f config/$pass.catalog-in.yaml ]; then
echo "Expanding catalog entry template for $pass" echo "Expanding catalog entry template for $pass"

@ -131,8 +131,8 @@ create_chroot_pass () {
mkdir -p "$overlay_dir/" mkdir -p "$overlay_dir/"
lowerdirs=$(get_lowerdirs_for_pass $pass) lowerdirs=$(get_lowerdirs_for_pass $pass)
if [ -n "$lowerdirs" ]; then if [ -n "$lowerdirs" ]; then
mkdir -p chroot "${overlay_dir}-initial" mkdir -p chroot/
mount_overlay "$lowerdirs" "${overlay_dir}-initial" chroot/ mount_overlay "$lowerdirs" "$overlay_dir" chroot/
else else
ln -s "$overlay_dir/" chroot ln -s "$overlay_dir/" chroot
fi fi
@ -268,19 +268,14 @@ create_chroot_pass () {
lb chroot_devpts remove ${*} lb chroot_devpts remove ${*}
if [ -n "$lowerdirs" ]; then if [ -n "$lowerdirs" ]; then
# Although the current chroot was created as an overlay over res=0
# the previous layer, many operations can result in redundant umount chroot || res=$?
# files in the upperdir. Rather than trying to minimize the if [ $res -ne 0 ]; then
# overlay by hand, we rsync the chroot into a fresh overlay, Echo_message "Unmount failed, current mounts: "
# rely on rsyncs ability to avoid redundant file operations, cat /proc/$$/mounts
# and take _that_ overlay's upperdir as the content of the exit $res
# layer. fi
mkdir chroot-2 rmdir chroot
mount_overlay "$lowerdirs" "$overlay_dir" chroot-2/
rsync -aXHAS --del chroot/ chroot-2/
umount chroot chroot-2
rmdir chroot chroot-2
rm -rf ${overlay_dir}-initial
else else
rm chroot rm chroot
fi fi

@ -10,6 +10,7 @@ The $chroot_dir argument is optional and will default to the empty string.
""" """
import argparse import argparse
import glob
import os.path import os.path
import re import re
import yaml import yaml
@ -32,29 +33,25 @@ CHROOT_ROOT = ARGS.chroot
FNAME = ARGS.file FNAME = ARGS.file
# Trim any trailing slashes for correct appending # Trim any trailing slashes for correct appending
CHROOT_ROOT = CHROOT_ROOT.rstrip('/')
log("CHROOT_ROOT: {}".format(CHROOT_ROOT)) log("CHROOT_ROOT: {}".format(CHROOT_ROOT))
if len(CHROOT_ROOT) > 0 and CHROOT_ROOT[-1] == '/':
CHROOT_ROOT = CHROOT_ROOT[:-1]
# This is where we expect to find the seed.yaml file
YAML_PATH = CHROOT_ROOT + '/var/lib/snapd/seed/seed.yaml'
# Snaps are prepended with this string in the manifest # Snaps are prepended with this string in the manifest
LINE_PREFIX = 'snap:' LINE_PREFIX = 'snap:'
# This is where we expect to find the seed.yaml file
YAML_PATH = CHROOT_ROOT + '/var/lib/snapd/seed/seed.yaml'
log("yaml path: {}".format(YAML_PATH)) log("yaml path: {}".format(YAML_PATH))
if not os.path.isfile(YAML_PATH):
log("WARNING: yaml path not found; no seeded snaps found.")
exit(0)
else:
log("yaml path found.")
with open(YAML_PATH, 'r') as fh:
def make_manifest_from_seed_yaml(path):
with open(YAML_PATH, 'r') as fh:
yaml_lines = yaml.safe_load(fh)['snaps'] yaml_lines = yaml.safe_load(fh)['snaps']
log('Writing manifest to {}'.format(FNAME)) log('Writing manifest to {}'.format(FNAME))
with open(FNAME, 'a+') as fh: with open(FNAME, 'a+') as fh:
for item in yaml_lines: for item in yaml_lines:
filestring = item['file'] filestring = item['file']
# Pull the revision number off the file name # Pull the revision number off the file name
@ -65,4 +62,100 @@ with open(FNAME, 'a+') as fh:
item['channel'], item['channel'],
revision, revision,
)) ))
def look_for_uc20_model(chroot):
systems_dir = f"{chroot}/var/lib/snapd/seed/systems"
if not os.path.isdir(systems_dir):
log("no systems directory found")
return None
modeenv = f"{chroot}/var/lib/snapd/modeenv"
system_name = None
if os.path.isfile(modeenv):
log(f"found modeenv file at {modeenv}")
with open(modeenv) as fh:
for line in fh:
if line.startswith("recovery_system="):
system_name = line.split('=', 1)[1].strip()
log(f"read system name {system_name!r} from modeenv")
break
if system_name is None:
system_names = os.listdir(systems_dir)
if len(system_names) == 0:
log("no systems found")
return None
elif len(system_names) > 1:
log("multiple systems found, refusing to guess which to parse")
return None
else:
system_name = system_names[0]
log(f"parsing only system found {system_name}")
system_dir = f"{chroot}/var/lib/snapd/seed/systems/{system_name}"
if not os.path.isdir(system_dir):
log(f"could not find system called {system_name}")
return None
return system_dir
def parse_assertion_file(asserts, filename):
# Parse the snapd assertions file 'filename' and store the
# assertions found in 'asserts'.
with open(filename) as fp:
text = fp.read()
k = ''
for block in text.split('\n\n'):
if block.startswith('type:'):
this_assert = {}
for line in block.split('\n'):
if line.startswith(' '):
this_assert[k.strip()] += '\n' + line
continue
k, v = line.split(':', 1)
this_assert[k.strip()] = v.strip()
asserts.setdefault(this_assert['type'], []).append(this_assert)
def make_manifest_from_system(system_dir):
files = [f"{system_dir}/model"] + glob.glob(f"{system_dir}/assertions/*")
asserts = {}
for filename in files:
parse_assertion_file(asserts, filename)
[model] = asserts['model']
snaps = yaml.safe_load(model['snaps'])
snap_names = []
for snap in snaps:
snap_names.append(snap['name'])
snap_names.sort()
snap_name_to_id = {}
snap_id_to_rev = {}
for decl in asserts['snap-declaration']:
snap_name_to_id[decl['snap-name']] = decl['snap-id']
for rev in asserts['snap-revision']:
snap_id_to_rev[rev['snap-id']] = rev['snap-revision']
log('Writing manifest to {}'.format(FNAME))
with open(FNAME, 'a+') as fh:
for snap_name in snap_names:
channel = snap['default-channel']
rev = snap_id_to_rev[snap_name_to_id[snap_name]]
fh.write(f"{LINE_PREFIX}{snap_name}\t{channel}\t{rev}\n")
if os.path.isfile(YAML_PATH):
log(f"seed.yaml found at {YAML_PATH}")
make_manifest_from_seed_yaml(YAML_PATH)
else:
system_dir = look_for_uc20_model(CHROOT_ROOT)
if system_dir is None:
log("WARNING: could not find seed.yaml or uc20-style seed")
exit(0)
make_manifest_from_system(system_dir)
log('Manifest output finished.') log('Manifest output finished.')

@ -0,0 +1,18 @@
#! /bin/sh
set -eu
case ${PASS:-} in
standard)
;;
*)
exit 0
;;
esac
if [ "$(dpkg --print-architecture)" = amd64 ]; then
echo "I: Enabling amd64 multiarch support on amd64"
dpkg --add-architecture i386
apt-get -y update
fi

@ -3,7 +3,7 @@
set -eux set -eux
case ${PASS:-} in case ${PASS:-} in
minimal.standard.enhanced-secureboot) standard.enhanced-secureboot)
;; ;;
*) *)
exit 0 exit 0
@ -16,11 +16,13 @@ if [ -n "${SUBPROJECT:-}" ]; then
fi fi
. config/binary . config/binary
. config/functions
# env SNAPPY_STORE_NO_CDN=1 snap known --remote model series=16 brand-id=canonical model=ubuntu-classic-2310-amd64 > config/classic-model.model # env SNAPPY_STORE_NO_CDN=1 snap known --remote model series=16 brand-id=canonical model=ubuntu-classic-2310-amd64 > config/classic-model.model
cat <<EOF > config/classic-model.model cat <<EOF > config/classic-model.model
type: model type: model
authority-id: canonical authority-id: canonical
revision: 4
series: 16 series: 16
brand-id: canonical brand-id: canonical
model: ubuntu-classic-2310-amd64 model: ubuntu-classic-2310-amd64
@ -36,7 +38,7 @@ snaps:
name: pc name: pc
type: gadget type: gadget
- -
default-channel: 24-hwe/stable default-channel: 23.10/stable
id: pYVQrBcKmBa0mZ4CCN7ExT6jH8rY1hza id: pYVQrBcKmBa0mZ4CCN7ExT6jH8rY1hza
name: pc-kernel name: pc-kernel
type: kernel type: kernel
@ -50,67 +52,60 @@ snaps:
id: PMrrV4ml8uWuEUDBT8dSGnKUYbevVhc4 id: PMrrV4ml8uWuEUDBT8dSGnKUYbevVhc4
name: snapd name: snapd
type: snapd type: snapd
-
default-channel: latest/stable
id: DLqre5XGLbDqg9jPtiAhRRjDuPVa5X1q
name: core20
type: base
- -
default-channel: latest/stable default-channel: latest/stable
id: EISPgh06mRh1vordZY9OZ34QHdd7OrdR id: EISPgh06mRh1vordZY9OZ34QHdd7OrdR
name: bare name: bare
type: base type: base
- -
default-channel: latest/stable default-channel: latest/stable/ubuntu-23.10
id: 3wdHCAVyZEmYsCMFDE9qt92UV8rC8Wdk id: 3wdHCAVyZEmYsCMFDE9qt92UV8rC8Wdk
name: firefox name: firefox
type: app type: app
- -
default-channel: latest/stable default-channel: latest/stable/ubuntu-23.10
id: rw36mkAjdIKl13dzfwyxP87cejpyIcct
name: gnome-3-38-2004
type: app
-
default-channel: latest/stable
id: lATO8HzwVvrAPrlZRAWpfyrJKlAJrZS3 id: lATO8HzwVvrAPrlZRAWpfyrJKlAJrZS3
name: gnome-42-2204 name: gnome-42-2204
type: app type: app
- -
default-channel: latest/stable default-channel: latest/stable/ubuntu-23.10
id: jZLfBRzf1cYlYysIjD2bwSzNtngY0qit id: jZLfBRzf1cYlYysIjD2bwSzNtngY0qit
name: gtk-common-themes name: gtk-common-themes
type: app type: app
- -
default-channel: latest/stable default-channel: latest/stable/ubuntu-23.10
id: gjf3IPXoRiipCu9K0kVu52f0H56fIksg id: gjf3IPXoRiipCu9K0kVu52f0H56fIksg
name: snap-store name: snap-store
type: app type: app
- -
default-channel: latest/stable default-channel: latest/stable/ubuntu-23.10
id: IrwRHakqtzhFRHJOOPxKVPU0Kk7Erhcu id: IrwRHakqtzhFRHJOOPxKVPU0Kk7Erhcu
name: snapd-desktop-integration name: snapd-desktop-integration
type: app type: app
timestamp: 2023-07-18T12:00:00.0Z timestamp: 2023-08-24T12:00:00.0Z
sign-key-sha3-384: 9tydnLa6MTJ-jaQTFUXEwHl1yRx7ZS4K5cyFDhYDcPzhS7uyEkDxdUjg9g08BtNn sign-key-sha3-384: 9tydnLa6MTJ-jaQTFUXEwHl1yRx7ZS4K5cyFDhYDcPzhS7uyEkDxdUjg9g08BtNn
AcLBXAQAAQoABgUCZLa6ewAKCRDgT5vottzAEu9jD/9dfuMX8kDWrEaaiv+3g6GB/xEuhHkVStOU AcLBXAQAAQoABgUCZOjUagAKCRDgT5vottzAEgUCD/9ZjBDGZZv7cbIvPWUpqx42XeespLf6xJK6
5c+7M9wB19BQrIhKCbYnNNGLJrIJj1DDThwCK+/L43NiiuolEDaTAGbKPxw7BhCMitnX9i3fxkFm iadXGNJD910+RkzMPrxAtoo8tmYYIrrbw2Q9lbNOcMfl2akxV+TJzYez2J6V/6wvaPraCFbIdKhr
WaAsc667Fi9QVTb7XFKrzUiU7cwmqCI0ZjAn1fx8zXutRPISKw8fQaL8Acv80lNSWL5dyyJ1gtvC d+bI3e1QTxdlejfc3Nu4ImhKlFEsYrYJZIwAcm7btvmoidoQBXSoUxc7lDt5vdv4mN+bVvVOhew9
jMGVbD8R45pF+n8u5sNQaRweYayNv+TFAJDquGxP3Cuu0DYiO3SzsBpg8BV9siqByOshO+93DCaM /FG7U+G5w4yZzkW5rH1lhBGIZX76D6+/3AVlC/R69mBUPDNDeGj48IUT8iV58cYYprchMbw4LIU6
8Vl3RFPGdY+M+kJsoI3GBHlZ3K+Hl1biVPpfm74T5DXQiLAxzs7iPgfqGC0QwRdzxHsNCETZrVAn l92wqbhl3uQveoWUqirHbQYa8q7D85XnvlukaPb3LQL6rJzuAU1G1jmLPkMz5mqQsRBBuhC9skR4
PzRDiagJSQWgAB1/zUVDgHIOw52OmHrTavwK7/p983na/HhVfU0rV3vZ/Ve6XsTryoOZ6Z31ygc4 UWHK7TWsKSlWmCfZAVn9wZezPZ4M+dQv8QNb7JpCmVNZ4GL/uMOds213FTeNJhowVfqgT1sMv9LP
NiAtm8z7rRSsehR3JdykrtJziaE26lph9gl3QgdSYnfOGB+IOUt/Y6jf9hcAEIXqCMVKoiL2ynlp H8mPIB1COn50+6XpZPUj49i2yiVN+BeuhRG9BDdstDie8gNOMvJgyvh0WmfgmIQcCuRgzheqj/co
G+nrcV25FfId+FDjezbfvPGe71fsjVZyL4ReQPCZRyCBujcASsn7sitZTuiZzYX8L9Uwl4baO6/a 0a8WuqYLsmyQCERP1fhuR/27d5+Dxg7DuiwocZwgXjtRkhUJrCnNWJnY//03sVXilFitEdlLVPt7
dRTqQ4onOgta0LnuGFoIg4ifs7OLcyZmuQUoVR8a8IwNvq9/acYZ/uoYBUwWpzkqF2i1Wc8t+zvx WVhBSGHlrIaayLiOmCshvLqKZN5Cum9hXZ+wxWI/liG27eXOwaMDKPg/KeyxsHWNrXyuT5ZrTL7w
uqvrEaWLoj9oa4E+956QJLGfn+qwSNeURdfkjAoPnA== eAEuriz8mNgmJtzImEkhymjuAuSTL284F1WpeW/cIg==
EOF EOF
channel="" channel=""
if [ -n "${CHANNEL:-}" ]; then if [ -n "${CHANNEL:-}" ]; then
channel="--channel $CHANNEL" channel="--channel $CHANNEL"
fi fi
reset_snapd_state chroot
env SNAPPY_STORE_NO_CDN=1 snap prepare-image \ env SNAPPY_STORE_NO_CDN=1 snap prepare-image \
--classic config/classic-model.model $channel chroot --classic config/classic-model.model $channel chroot
mv chroot/system-seed/systems/* chroot/system-seed/systems/enhanced-secureboot-desktop mv chroot/system-seed/systems/* chroot/system-seed/systems/enhanced-secureboot-desktop
rsync -a chroot/system-seed/ chroot/var/lib/snapd/seed rm -rf chroot/var/lib/snapd/seed
rm -rf chroot/system-seed/ mv chroot/system-seed chroot/var/lib/snapd/seed

@ -1,99 +0,0 @@
#! /bin/sh
set -eux
case ${PASS:-} in
minimal.standard.live)
;;
*)
exit 0
;;
esac
if [ -n "${SUBPROJECT:-}" ]; then
echo "We don't run Ubuntu Desktop hooks for this project."
exit 0
fi
. config/binary
# env SNAPPY_STORE_NO_CDN=1 snap known --remote model series=16 brand-id=canonical model=ubuntu-installer-classic-2310-amd64 > config/classic-model-installer.model
cat <<EOF > config/classic-model-installer.model
type: model
authority-id: canonical
series: 16
brand-id: canonical
model: ubuntu-installer-classic-2310-amd64
architecture: amd64
base: core22
classic: true
distribution: ubuntu
grade: signed
snaps:
-
default-channel: latest/stable
id: amcUKQILKXHHTlmSa7NMdnXSx02dNeeT
name: core22
type: base
-
default-channel: latest/stable
id: PMrrV4ml8uWuEUDBT8dSGnKUYbevVhc4
name: snapd
type: snapd
-
classic: true
default-channel: latest/stable/canary-23.10
id: rQm0TtMOYOtEslvEXgxQDhgy1JNn38Wz
name: ubuntu-desktop-installer
type: app
timestamp: 2023-07-18T12:00:00.0Z
sign-key-sha3-384: 9tydnLa6MTJ-jaQTFUXEwHl1yRx7ZS4K5cyFDhYDcPzhS7uyEkDxdUjg9g08BtNn
AcLBXAQAAQoABgUCZLa6iQAKCRDgT5vottzAEh+hEACxb8nNg/2yznOanHsCY69miFDHvxLf2AGB
qeE+XJ9pyN05/JkvrDhODL0DCknFuvgo5kl+FhrS+mPdviytc3Ppm3kHSnPuwfzuO4t8PM1mRMOZ
8djtgzbStKAzwKyYiK/pon4/Wtu1+6/tTp8Ji/pH12aRoFBub6mtQD81hC/xVxdcKz8KvzGsD5co
H1TLfhKACVQJHZp7ErShkB6Ka6nVQy1c8/4sDPadKb2mqraIVMJmmHlYAHMfGl6f1dElheAjWXmz
0Roz4fh4lvjM0GmYTlsmhEj10F0pdwY/C2jB+6VFBJEZax65mRjs6Jaqxa150a26sOVFcMkS0ifO
pkB+KHrnilJ0/PyXZCoQcL65wTBEnfI0X/nzhvuE+9dXz5EUlusWeMvEhJ4QNOacCPARSd76M7QB
gUhMrz4Vf68V6tlfbXxgoEJFoVJo4i7gymMPnZDg0uAGQFYK+SSVEO/VtLDQvwRBU80IdA0kaIsn
afaqwYP8ACNPWpTztVYd/X6mvpdDz8MsW9pAEmJ4EN6JWcEu4ii5qXlzLK3s3HaCS5XNj+TpPEU+
9Nh9ePmCfE+KxR0cgfTbxP3KerYSd/xQHxgMLcMAGq20+1i/FmksKD6cSNYJRoqwTPwP+D9p42wF
3qGR3KEYbIij4hk/fZMCNzUEWt41OLLUVKm81oOixg==
EOF
channel=""
if [ -n "${CHANNEL:-}" ]; then
channel="--channel $CHANNEL"
fi
env SNAPPY_STORE_NO_CDN=1 snap prepare-image \
--classic config/classic-model-installer.model $channel chroot
mv chroot/system-seed/systems/* chroot/system-seed/systems/classic-installer
rsync -a chroot/system-seed/ chroot/var/lib/snapd/seed
rm -rf chroot/system-seed/
cat <<EOF > chroot/var/lib/snapd/modeenv
mode=run
recovery_system=classic-installer
EOF
# Temporary while we still use the subiquity TUI for the live system
cat > chroot/usr/lib/systemd/user/subiquity-tui.service << EOF
[Unit]
Description=subiquity tui
PartOf=graphical-session.target
After=graphical-session.target
# Never run in GDM
Conflicts=gnome-session@gnome-login.target
[Service]
Type=simple
ExecStart=/usr/bin/gnome-terminal --wait -- sudo sh -c 'echo waiting for snapd; snap wait system seed.loaded; sleep 5; snap run subiquity'
Restart=no
EOF
mkdir chroot/etc/systemd/user/graphical-session.target.wants/
ln -vs /usr/lib/systemd/user/subiquity-tui.service chroot/etc/systemd/user/graphical-session.target.wants/
mv chroot/boot/initrd.img-* ${PWD}/livecd.${PROJECT}.initrd-generic
mv chroot/boot/vmlinu?-* ${PWD}/livecd.${PROJECT}.kernel-generic
chmod a+r ${PWD}/livecd.${PROJECT}.initrd-generic ${PWD}/livecd.${PROJECT}.kernel-generic

@ -3,18 +3,13 @@
set -eu set -eu
case ${PASS:-} in case ${PASS:-} in
minimal.standard.live) standard.live)
;; ;;
*) *)
exit 0 exit 0
;; ;;
esac esac
# As described in LP: #2025339, an initrd built from a jammy userspace
# (which is what we use for Ubuntu Desktop builds currently) cannot fsck a
# mantic root filesystem created with the default options.
sed -i -e 's/,orphan_file//' /etc/mke2fs.conf
cat <<EOF > /etc/initramfs-tools/conf.d/casperize.conf cat <<EOF > /etc/initramfs-tools/conf.d/casperize.conf
export CASPER_GENERATE_UUID=1 export CASPER_GENERATE_UUID=1
EOF EOF
@ -22,10 +17,3 @@ EOF
cat <<EOF > /etc/initramfs-tools/conf.d/default-layer.conf cat <<EOF > /etc/initramfs-tools/conf.d/default-layer.conf
LAYERFS_PATH=${PASS}.squashfs LAYERFS_PATH=${PASS}.squashfs
EOF EOF
if [ "$(dpkg --print-architecture)" = amd64 ]; then
echo "I: Enabling amd64 multiarch support on amd64"
dpkg --add-architecture i386
apt-get -y update
fi

@ -37,12 +37,18 @@ for entry in output:
if 'variations' not in template: if 'variations' not in template:
print("Non unique id in source catalog but no variations!") print("Non unique id in source catalog but no variations!")
sys.exit(1) sys.exit(1)
for k, variation in template['variations'].items(): for variation in template['variations'].values():
variation['size'] = int(opts.size) variation['size'] = int(opts.size)
entry.setdefault('variations', {}).update(template['variations']) entry.setdefault('variations', {}).update(template['variations'])
break break
else: else:
# No entry with this id found, so add a new one. # No entry with this id found, so add a new one.
if 'variations' in template:
for variation in template['variations'].values():
if variation['path'] == opts.squashfs:
variation['size'] = int(opts.size)
template['size'] = int(opts.size) template['size'] = int(opts.size)
template['path'] = opts.squashfs template['path'] = opts.squashfs

Loading…
Cancel
Save