Merge feature/re-enable-noble-hyperv-desktop-builds-noble into ubuntu/noble [a=philroche] [r=mwhudson,utkarsh]

feat: Re-enable ability to build HyperV desktop images (LP: #2064280)

We have not built Hyperv desktop images since Jammy and with the re-introduction of
HyperV for Noble we have encountered build issues caused by refactoring and removals
of code assumed to be redundant but the HyperV desktop images were actually using
these code paths.

This is a backport/SRU from oracular.

MP: https://code.launchpad.net/~philroche/livecd-rootfs/+git/livecd-rootfs/+merge/466385

# Conflicts:
#	debian/changelog
ubuntu/noble
Philip Roche 7 months ago
commit 639f04b7b9

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (cpc-sbom) (2)" project-jdk-type="Python SDK" />
</project>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/livecd-rootfs.iml" filepath="$PROJECT_DIR$/.idea/livecd-rootfs.iml" />
</modules>
</component>
</project>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
<mapping directory="$PROJECT_DIR$/livecd-rootfs" vcs="Git" />
</component>
</project>

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="8b53e4fe-d06b-4120-bca1-09aab0c0e0b8" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/debian/changelog" beforeDir="false" afterPath="$PROJECT_DIR$/debian/changelog" afterDir="false" />
<change beforePath="$PROJECT_DIR$/live-build/ubuntu-cpc/hooks.d/base/disk-image-uefi.binary" beforeDir="false" afterPath="$PROJECT_DIR$/live-build/ubuntu-cpc/hooks.d/base/disk-image-uefi.binary" afterDir="false" />
<change beforePath="$PROJECT_DIR$/livecd-rootfs/debian/changelog" beforeDir="false" afterPath="$PROJECT_DIR$/livecd-rootfs/debian/changelog" afterDir="false" />
<change beforePath="$PROJECT_DIR$/livecd-rootfs/live-build/ubuntu-cpc/hooks.d/base/disk-image-uefi.binary" beforeDir="false" afterPath="$PROJECT_DIR$/livecd-rootfs/live-build/ubuntu-cpc/hooks.d/base/disk-image-uefi.binary" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="ProjectColorInfo"><![CDATA[{
"associatedIndex": 3
}]]></component>
<component name="ProjectId" id="2VtkQwj0NQBRHE5uOcNk4KgQ7sF" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"WebServerToolWindowFactoryState": "false",
"last_opened_file_path": "/home/philroche/Working/livecd-rootfs",
"vue.rearranger.settings.migration": "true"
}
}]]></component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="8b53e4fe-d06b-4120-bca1-09aab0c0e0b8" name="Changes" comment="" />
<created>1695662751675</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1695662751675</updated>
<workItem from="1695662752677" duration="2000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
</project>

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/livecd-rootfs.iml" filepath="$PROJECT_DIR$/.idea/livecd-rootfs.iml" />
</modules>
</component>
</project>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
</project>

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/livecd-rootfs.iml" filepath="$PROJECT_DIR$/.idea/livecd-rootfs.iml" />
</modules>
</component>
</project>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
</project>

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/livecd-rootfs.iml" filepath="$PROJECT_DIR$/.idea/livecd-rootfs.iml" />
</modules>
</component>
</project>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
</project>

@ -0,0 +1,40 @@
diff --git a/live-build/auto/config b/live-build/auto/config
index 20d28139..8f188b5d 100755
--- a/live-build/auto/config
+++ b/live-build/auto/config
@@ -1048,12 +1048,13 @@ case $PROJECT in
add_task install ubuntu-server-raspi
;;
armhf*)
- add_package install flash-kernel
+ if [ "${SUBPROJECT:-}" != minimized ]; then
+ add_package install flash-kernel
+ fi
;;
arm64*)
- add_package install flash-kernel
- if [ "${SUBARCH:-}" = "generic" ]; then
- KERNEL_FLAVOURS=generic
+ if [ "${SUBPROJECT:-}" != minimized ]; then
+ add_package install flash-kernel
fi
;;
amd64*)
diff --git a/live-build/ubuntu-cpc/hooks.d/base/disk-image-uefi.binary b/live-build/ubuntu-cpc/hooks.d/base/disk-image-uefi.binary
index 3685e464..4602267c 100755
--- a/live-build/ubuntu-cpc/hooks.d/base/disk-image-uefi.binary
+++ b/live-build/ubuntu-cpc/hooks.d/base/disk-image-uefi.binary
@@ -112,11 +112,11 @@ install_grub() {
# please file a bug against grub2 to include the affected module.
case $ARCH in
arm64)
- chroot mountpoint apt-get -qqy install --no-install-recommends shim-signed grub-efi-arm64-signed
+ chroot mountpoint apt-get install -qqy shim-signed
efi_target=arm64-efi
;;
armhf)
- chroot mountpoint apt-get -qqy install --no-install-recommends grub-efi-arm grub-efi-arm-bin
+ chroot mountpoint apt-get -qqy install grub-efi-arm grub-efi-arm-bin
efi_target=arm-efi
;;
amd64)

@ -0,0 +1,63 @@
diff --git a/live-build/buildd/hooks/02-disk-image-uefi.binary b/live-build/buildd/hooks/02-disk-image-uefi.binary
index 44a7ff42..a90f19c7 100755
--- a/live-build/buildd/hooks/02-disk-image-uefi.binary
+++ b/live-build/buildd/hooks/02-disk-image-uefi.binary
@@ -53,6 +53,26 @@ LABEL=UEFI /boot/efi vfat defaults 0 1
EOF
}
+
+divert_lsb_release() {
+ CHROOT_ROOT="$1"
+ chroot "$CHROOT_ROOT" dpkg-divert --local \
+ --divert /usr/bin/lsb_release.dpkg-divert \
+ --rename /usr/bin/lsb_release
+ echo "echo Ubuntu" > "$CHROOT_ROOT"/usr/bin/lsb_release
+ chmod +x "$CHROOT_ROOT"/usr/bin/lsb_release
+
+}
+
+undivert_lsb_release() {
+ CHROOT_ROOT="$1"
+ if grep -q "^echo Ubuntu$" "$CHROOT_ROOT"/usr/bin/lsb_release; then
+ rm "$CHROOT_ROOT"/usr/bin/lsb_release
+ fi
+ chroot "$CHROOT_ROOT" dpkg-divert --remove --local \
+ --rename /usr/bin/lsb_release
+}
+
install_grub() {
mkdir mountpoint
mount_partition "${rootfs_dev_mapper}" mountpoint
@@ -69,7 +89,8 @@ install_grub() {
fi
chroot mountpoint apt-get -y update
-
+ divert_lsb_release mountpoint
+ chroot mountpoint lsb_release
# UEFI GRUB modules are meant to be used equally by Secure Boot and
# non-Secure Boot systems. If you need an extra module not already
# provided or run into "Secure Boot policy forbids loading X" problems,
@@ -84,7 +105,7 @@ install_grub() {
efi_target=arm-efi
;;
amd64)
- chroot mountpoint apt-get install -qqy grub-pc shim-signed
+ chroot mountpoint apt-get install -qqy grub-pc shim-signed python3-apt
efi_target=x86_64-efi
;;
esac
@@ -121,10 +142,12 @@ GRUB_RECORDFAIL_TIMEOUT=0
GRUB_TERMINAL=console
EOF
+
divert_grub mountpoint
chroot mountpoint update-grub
replace_grub_root_with_label mountpoint
undivert_grub mountpoint
+ undivert_lsb_release mountpoint
chroot mountpoint apt-get -y clean

6
debian/changelog vendored

@ -1,3 +1,9 @@
livecd-rootfs (24.04.71) noble; urgency=medium
* Re-enable ability to build HyperV desktop images (LP: #2064280)
-- Philip Roche <phil.roche@canonical.com> Fri, 24 May 2024 15:47:48 +0100
livecd-rootfs (24.04.70) noble; urgency=medium
[ Łukasz 'sil2100' Zemczak ]

1
debian/files vendored

@ -0,0 +1 @@
livecd-rootfs_2.765.30_source.buildinfo devel optional

@ -0,0 +1,43 @@
#!/usr/bin/python3
import apt
import os
import platform
import datetime
from datetime import datetime, timezone
# Get the current date and time in UTC timezone aware
utc_now = datetime.now(timezone.utc)
def get_system_architecture():
arch = platform.machine()
if arch == 'x86_64':
return 'amd64'
elif arch == 'aarch64':
return 'arm64'
else:
return f"Unknown architecture: {arch}"
print("Format: 1.0")
print("Build-Origin: Ubuntu")
print(f"Build-Architecture: {get_system_architecture()}")
print(f"Build-Date: {utc_now}")
# Using python-apt to gather installed packages
try:
package_cache = apt.Cache()
print("List of installed packages:")
for package in package_cache:
if package.is_installed:
print(f" {package.name} (= {package.installed.version}),")
except Exception as e:
print(f"An error occurred while fetching installed packages: {e}")
# Using os module to list all environment variables
try:
print("\nEnvironment variables:")
for param, value in os.environ.items():
print(f" {param}={value}")
except Exception as e:
print(f"An error occurred while fetching environment variables: {e}")

@ -9,21 +9,6 @@ case $ARCH in
;;
esac
case ${PROJECT:-}:${SUBPROJECT:-} in
ubuntu:)
echo "We don't create EFI images for Ubuntu Desktop."
exit 0
;;
ubuntu)
IMAGE_STR="# DESKTOP_IMG: This file was created/modified by the Desktop Image build process"
FS_LABEL="desktop-rootfs"
IMAGE_SIZE=12884901888 # 12G
;;
*)
IMAGE_STR="# CLOUD_IMG: This file was created/modified by the Cloud Image build process"
FS_LABEL="cloudimg-rootfs"
;;
esac
if [ "$ARCH" = "amd64" ]; then
IMAGE_SIZE=3758096384 # bump to 3.5G (3584*1024**2); Since Kinetic amd64 need more then the default 2.2G
@ -44,6 +29,22 @@ if [ "$ARCH" = "riscv64" ]; then
IMAGE_SIZE=4831838208 # bump to 4.5G (4608*1024**2); initrd creation fails with "No space left" with 3.5G
fi
case ${PROJECT:-}:${SUBPROJECT:-} in
ubuntu:)
echo "We don't create EFI images for Ubuntu Desktop."
exit 0
;;
ubuntu:desktop-preinstalled)
IMAGE_STR="# DESKTOP_IMG: This file was created/modified by the Desktop Image build process"
FS_LABEL="desktop-rootfs"
IMAGE_SIZE=12884901888 # 12G
;;
*)
IMAGE_STR="# CLOUD_IMG: This file was created/modified by the Cloud Image build process"
FS_LABEL="cloudimg-rootfs"
;;
esac
. config/binary
. config/functions

@ -39,8 +39,14 @@ trap cleanup_hyperv EXIT
# Perform customisations
# For Ubuntu 24.04 and later cloud-init is included in desktop images. This is not applicable for Hyperv images so
# we can disable cloud-init. This leaves the cloud-init package installed but disabled so users can still
# use it if they want.
touch "${scratch_d}/etc/cloud/cloud-init.disabled"
chroot "${scratch_d}" apt-get update -y
chroot "${scratch_d}" apt-get -y install xrdp linux-azure linux-tools-azure linux-cloud-tools-azure
chroot "${scratch_d}" apt-get -y install xrdp linux-azure linux-tools-azure linux-cloud-tools-azure polkitd-pkla oem-config-gtk language-pack-en-base oem-config-slideshow-ubuntu
cat > ${scratch_d}/etc/modules-load.d/hyperv.conf << EOF
${IMAGE_STR}
@ -124,20 +130,19 @@ touch "${scratch_d}/var/lib/oem-config/run"
chroot "${scratch_d}" apt-get clean
raw_img=binary/boot/disk-hyperv-uefi.ext4
vhd_img=livecd.ubuntu-desktop-hyperv.vhdx
create_manifest "${scratch_d}" "$vhd_img.zip.manifest"
# End customisations
cleanup_hyperv
trap - EXIT
raw_img=binary/boot/disk-hyperv-uefi.ext4
vhd_img=livecd.ubuntu-desktop-hyperv.vhdx
qemu-img convert -O vhdx "$raw_img" "$vhd_img"
rm "$raw_img"
apt-get install -y zip
create_manifest chroot "$vhd_img.zip.manifest"
zip "$vhd_img.zip" "$vhd_img"
rm "$vhd_img"

@ -0,0 +1 @@
/home/philroche/Working/livecd-rootfs
Loading…
Cancel
Save