From 0ac6fc2917704e1bddedde95cf1e899811e5f581 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Wed, 16 Apr 2025 14:20:41 +0200 Subject: [PATCH 1/2] mkosi: Make sure coreutils is installed in initrd/exitrd This is already installed but Fedora/CentOS systems are nudged towards installing coreutils-single which then later causes issues when we try to install coreutils as a dependency of systemd so let's make sure we pick coreutils from the beginning. --- mkosi/mkosi.images/exitrd/mkosi.conf | 1 + mkosi/mkosi.images/initrd/mkosi.conf | 1 + 2 files changed, 2 insertions(+) diff --git a/mkosi/mkosi.images/exitrd/mkosi.conf b/mkosi/mkosi.images/exitrd/mkosi.conf index f1e8e45dcd..8d8b7e9761 100644 --- a/mkosi/mkosi.images/exitrd/mkosi.conf +++ b/mkosi/mkosi.images/exitrd/mkosi.conf @@ -11,6 +11,7 @@ CleanPackageMetadata=yes MakeInitrd=yes Packages= + coreutils bash [Include] diff --git a/mkosi/mkosi.images/initrd/mkosi.conf b/mkosi/mkosi.images/initrd/mkosi.conf index bee0911fc9..b54fe2daf4 100644 --- a/mkosi/mkosi.images/initrd/mkosi.conf +++ b/mkosi/mkosi.images/initrd/mkosi.conf @@ -10,6 +10,7 @@ Include= ExtraTrees=%D/mkosi/mkosi.extra.common Packages= + coreutils findutils grep sed From 52a82bcfc9ea627c12ae32f3065b1582dfbf864b Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Wed, 16 Apr 2025 14:04:33 +0200 Subject: [PATCH 2/2] mkosi: Reuse main image prepare scripts in subimages In the subimages we also want to make sure all dependencies of the systemd packages are cached so reuse the same prepare scripts from the main image to do that. We only want required dependencies in the subimages, not recommended or suggested dependendencies, so add an environment variable $SYSTEMD_REQUIRED_DEPS_ONLY which the prepare scripts can check for and enable it for the subimages. --- mkosi/mkosi.conf.d/arch/mkosi.prepare | 18 ++++++++++-------- mkosi/mkosi.conf.d/centos-fedora/mkosi.prepare | 7 ++++++- mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare | 9 +++++++-- mkosi/mkosi.conf.d/opensuse/mkosi.prepare | 6 +++++- mkosi/mkosi.images/exitrd/mkosi.conf | 3 +++ .../mkosi.images/exitrd/mkosi.conf.d/arch.conf | 1 + .../exitrd/mkosi.conf.d/centos-fedora.conf | 1 + .../exitrd/mkosi.conf.d/debian.conf | 1 + .../exitrd/mkosi.conf.d/opensuse.conf | 1 + .../exitrd/mkosi.conf.d/ubuntu.conf | 1 + mkosi/mkosi.images/initrd/mkosi.conf | 3 +++ .../mkosi.images/initrd/mkosi.conf.d/arch.conf | 1 + .../initrd/mkosi.conf.d/centos-fedora.conf | 1 + .../initrd/mkosi.conf.d/debian-ubuntu.conf | 1 + .../initrd/mkosi.conf.d/opensuse.conf | 1 + mkosi/mkosi.images/minimal-base/mkosi.conf | 3 +++ .../minimal-base/mkosi.conf.d/arch.conf | 1 + .../mkosi.conf.d/centos-fedora.conf | 1 + .../mkosi.conf.d/debian-ubuntu.conf | 1 + .../minimal-base/mkosi.conf.d/opensuse.conf | 1 + 20 files changed, 50 insertions(+), 12 deletions(-) diff --git a/mkosi/mkosi.conf.d/arch/mkosi.prepare b/mkosi/mkosi.conf.d/arch/mkosi.prepare index 76f67c14e5..052ce92865 100755 --- a/mkosi/mkosi.conf.d/arch/mkosi.prepare +++ b/mkosi/mkosi.conf.d/arch/mkosi.prepare @@ -17,14 +17,16 @@ for PACKAGE in "${PACKAGES[@]}"; do sed --quiet 's/^Depends On *: //p' # Filter out everything except "Depends On:" line and fetch dependencies from it. )" - DEPS="$DEPS $( - pacman --sync --info "$PACKAGE" | - sed '1,/^$/d' | # Only keep result from first repository (delete everything after first blank line). - sed --quiet '/Optional Deps/,/Conflicts With/{/Conflicts With/!p}' | # Get every line from "Optional Deps" (inclusive) until "Conflicts With" (exclusive). - sed 's/Optional Deps *: //' | # Drop "Optional Deps :" from first line. - sed 's/ *\(.*\):.*/\1/' | # Drop descriptions (everything after first colon for all lines). - tr '\n' ' ' # Transform newlines to whitespace. - )" + if ! ((SYSTEMD_REQUIRED_DEPS_ONLY)); then + DEPS="$DEPS $( + pacman --sync --info "$PACKAGE" | + sed '1,/^$/d' | # Only keep result from first repository (delete everything after first blank line). + sed --quiet '/Optional Deps/,/Conflicts With/{/Conflicts With/!p}' | # Get every line from "Optional Deps" (inclusive) until "Conflicts With" (exclusive). + sed 's/Optional Deps *: //' | # Drop "Optional Deps :" from first line. + sed 's/ *\(.*\):.*/\1/' | # Drop descriptions (everything after first colon for all lines). + tr '\n' ' ' # Transform newlines to whitespace. + )" + fi done echo "$DEPS" | diff --git a/mkosi/mkosi.conf.d/centos-fedora/mkosi.prepare b/mkosi/mkosi.conf.d/centos-fedora/mkosi.prepare index 1e5bd21995..9e5185bbc6 100755 --- a/mkosi/mkosi.conf.d/centos-fedora/mkosi.prepare +++ b/mkosi/mkosi.conf.d/centos-fedora/mkosi.prepare @@ -8,7 +8,12 @@ fi mapfile -t PACKAGES < <(jq --raw-output .VolatilePackages[] <"$MKOSI_CONFIG") -for DEPS in --requires --recommends --suggests; do +DEP_TYPES=(--requires) +if ! ((SYSTEMD_REQUIRED_DEPS_ONLY)); then + DEP_TYPES+=(--recommends --suggests) +fi + +for DEPS in "${DEP_TYPES[@]}"; do # We need --latest-limit=1 to only consider the newest version of the packages. # --latest-limit=1 is per . so we have to pass --arch= explicitly to make sure i686 packages # are not considered on x86-64. diff --git a/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare b/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare index bf2c5eb91f..22be35f823 100755 --- a/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare +++ b/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare @@ -22,9 +22,14 @@ for PACKAGE in "${PACKAGES[@]}"; do # Get all the dependencies of the systemd packages including recommended and suggested dependencies. PATTERNS+=( "?and(?reverse-depends(?exact-name($PACKAGE)), $COMMON)" - "?and(?reverse-recommends(?exact-name($PACKAGE)), $COMMON)" - "?and(?reverse-suggests(?exact-name($PACKAGE)), $COMMON)" ) + + if ! ((SYSTEMD_REQUIRED_DEPS_ONLY)); then + PATTERNS+=( + "?and(?reverse-recommends(?exact-name($PACKAGE)), $COMMON)" + "?and(?reverse-suggests(?exact-name($PACKAGE)), $COMMON)" + ) + fi done mkosi-install "${PATTERNS[@]}" diff --git a/mkosi/mkosi.conf.d/opensuse/mkosi.prepare b/mkosi/mkosi.conf.d/opensuse/mkosi.prepare index 728b502b13..32a9312d29 100755 --- a/mkosi/mkosi.conf.d/opensuse/mkosi.prepare +++ b/mkosi/mkosi.conf.d/opensuse/mkosi.prepare @@ -9,11 +9,15 @@ fi mapfile -t PACKAGES < <(jq --raw-output .VolatilePackages[] <"$MKOSI_CONFIG") DEPS="" +DEP_TYPES=(--requires) +if ! ((SYSTEMD_REQUIRED_DEPS_ONLY)); then + DEP_TYPES+=(--recommends --suggests) +fi for PACKAGE in "${PACKAGES[@]}"; do # zypper's output is not machine readable so we make do with sed instead. DEPS="$DEPS\n$( - zypper info --requires --recommends --suggests "$PACKAGE" | + zypper info "${DEP_TYPES[@]}" "$PACKAGE" | sed '/Requires/,$!d' | # Remove everything before Requires line sed --quiet 's/^ //p' # All indented lines have dependencies )" diff --git a/mkosi/mkosi.images/exitrd/mkosi.conf b/mkosi/mkosi.images/exitrd/mkosi.conf index 8d8b7e9761..4a811e15e2 100644 --- a/mkosi/mkosi.images/exitrd/mkosi.conf +++ b/mkosi/mkosi.images/exitrd/mkosi.conf @@ -3,6 +3,9 @@ [Output] Format=directory +[Build] +Environment=SYSTEMD_REQUIRED_DEPS_ONLY=1 + [Content] Bootable=no Locale=C.UTF-8 diff --git a/mkosi/mkosi.images/exitrd/mkosi.conf.d/arch.conf b/mkosi/mkosi.images/exitrd/mkosi.conf.d/arch.conf index b5f3194a84..8ccf722238 100644 --- a/mkosi/mkosi.images/exitrd/mkosi.conf.d/arch.conf +++ b/mkosi/mkosi.images/exitrd/mkosi.conf.d/arch.conf @@ -4,6 +4,7 @@ Distribution=arch [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/arch/mkosi.prepare VolatilePackages= systemd systemd-libs diff --git a/mkosi/mkosi.images/exitrd/mkosi.conf.d/centos-fedora.conf b/mkosi/mkosi.images/exitrd/mkosi.conf.d/centos-fedora.conf index a1fa32b786..1665f8b471 100644 --- a/mkosi/mkosi.images/exitrd/mkosi.conf.d/centos-fedora.conf +++ b/mkosi/mkosi.images/exitrd/mkosi.conf.d/centos-fedora.conf @@ -5,5 +5,6 @@ Distribution=|centos Distribution=|fedora [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/centos-fedora/mkosi.prepare VolatilePackages= systemd-standalone-shutdown diff --git a/mkosi/mkosi.images/exitrd/mkosi.conf.d/debian.conf b/mkosi/mkosi.images/exitrd/mkosi.conf.d/debian.conf index 6ca310cbc2..c745a1a1d3 100644 --- a/mkosi/mkosi.images/exitrd/mkosi.conf.d/debian.conf +++ b/mkosi/mkosi.images/exitrd/mkosi.conf.d/debian.conf @@ -4,5 +4,6 @@ Distribution=debian [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare VolatilePackages= systemd-standalone-shutdown diff --git a/mkosi/mkosi.images/exitrd/mkosi.conf.d/opensuse.conf b/mkosi/mkosi.images/exitrd/mkosi.conf.d/opensuse.conf index 37f6220ea0..7acc481389 100644 --- a/mkosi/mkosi.images/exitrd/mkosi.conf.d/opensuse.conf +++ b/mkosi/mkosi.images/exitrd/mkosi.conf.d/opensuse.conf @@ -4,6 +4,7 @@ Distribution=opensuse [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/opensuse/mkosi.prepare Packages= diffutils grep diff --git a/mkosi/mkosi.images/exitrd/mkosi.conf.d/ubuntu.conf b/mkosi/mkosi.images/exitrd/mkosi.conf.d/ubuntu.conf index 9a7e1d8cbb..742d998504 100644 --- a/mkosi/mkosi.images/exitrd/mkosi.conf.d/ubuntu.conf +++ b/mkosi/mkosi.images/exitrd/mkosi.conf.d/ubuntu.conf @@ -4,6 +4,7 @@ Distribution=ubuntu [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare VolatilePackages= libsystemd-shared libsystemd0 diff --git a/mkosi/mkosi.images/initrd/mkosi.conf b/mkosi/mkosi.images/initrd/mkosi.conf index b54fe2daf4..2b731d4397 100644 --- a/mkosi/mkosi.images/initrd/mkosi.conf +++ b/mkosi/mkosi.images/initrd/mkosi.conf @@ -6,6 +6,9 @@ Include= %D/mkosi/mkosi.sanitizers %D/mkosi/mkosi.coverage +[Build] +Environment=SYSTEMD_REQUIRED_DEPS_ONLY=1 + [Content] ExtraTrees=%D/mkosi/mkosi.extra.common diff --git a/mkosi/mkosi.images/initrd/mkosi.conf.d/arch.conf b/mkosi/mkosi.images/initrd/mkosi.conf.d/arch.conf index 99e039d1dc..74f4bee9c9 100644 --- a/mkosi/mkosi.images/initrd/mkosi.conf.d/arch.conf +++ b/mkosi/mkosi.images/initrd/mkosi.conf.d/arch.conf @@ -4,6 +4,7 @@ Distribution=arch [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/arch/mkosi.prepare Packages= btrfs-progs tpm2-tools diff --git a/mkosi/mkosi.images/initrd/mkosi.conf.d/centos-fedora.conf b/mkosi/mkosi.images/initrd/mkosi.conf.d/centos-fedora.conf index 5c84cc4cd4..de1c8947a2 100644 --- a/mkosi/mkosi.images/initrd/mkosi.conf.d/centos-fedora.conf +++ b/mkosi/mkosi.images/initrd/mkosi.conf.d/centos-fedora.conf @@ -5,6 +5,7 @@ Distribution=|centos Distribution=|fedora [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/centos-fedora/mkosi.prepare Packages= tpm2-tools diff --git a/mkosi/mkosi.images/initrd/mkosi.conf.d/debian-ubuntu.conf b/mkosi/mkosi.images/initrd/mkosi.conf.d/debian-ubuntu.conf index 577bf8f59f..b2fb3a06cb 100644 --- a/mkosi/mkosi.images/initrd/mkosi.conf.d/debian-ubuntu.conf +++ b/mkosi/mkosi.images/initrd/mkosi.conf.d/debian-ubuntu.conf @@ -5,6 +5,7 @@ Distribution=|debian Distribution=|ubuntu [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare Packages= btrfs-progs tpm2-tools diff --git a/mkosi/mkosi.images/initrd/mkosi.conf.d/opensuse.conf b/mkosi/mkosi.images/initrd/mkosi.conf.d/opensuse.conf index deaa273b4d..18142a6dbd 100644 --- a/mkosi/mkosi.images/initrd/mkosi.conf.d/opensuse.conf +++ b/mkosi/mkosi.images/initrd/mkosi.conf.d/opensuse.conf @@ -4,6 +4,7 @@ Distribution=opensuse [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/opensuse/mkosi.prepare Packages= btrfs-progs kmod diff --git a/mkosi/mkosi.images/minimal-base/mkosi.conf b/mkosi/mkosi.images/minimal-base/mkosi.conf index b51ac638d6..be80db6cc1 100644 --- a/mkosi/mkosi.images/minimal-base/mkosi.conf +++ b/mkosi/mkosi.images/minimal-base/mkosi.conf @@ -3,6 +3,9 @@ [Output] Format=directory +[Build] +Environment=SYSTEMD_REQUIRED_DEPS_ONLY=1 + [Content] Bootable=no Locale=C.UTF-8 diff --git a/mkosi/mkosi.images/minimal-base/mkosi.conf.d/arch.conf b/mkosi/mkosi.images/minimal-base/mkosi.conf.d/arch.conf index 044199a6c1..070506b8f5 100644 --- a/mkosi/mkosi.images/minimal-base/mkosi.conf.d/arch.conf +++ b/mkosi/mkosi.images/minimal-base/mkosi.conf.d/arch.conf @@ -4,6 +4,7 @@ Distribution=arch [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/arch/mkosi.prepare Packages= inetutils iproute diff --git a/mkosi/mkosi.images/minimal-base/mkosi.conf.d/centos-fedora.conf b/mkosi/mkosi.images/minimal-base/mkosi.conf.d/centos-fedora.conf index e9893ad989..6d4caebef4 100644 --- a/mkosi/mkosi.images/minimal-base/mkosi.conf.d/centos-fedora.conf +++ b/mkosi/mkosi.images/minimal-base/mkosi.conf.d/centos-fedora.conf @@ -5,6 +5,7 @@ Distribution=|centos Distribution=|fedora [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/centos-fedora/mkosi.prepare Packages= hostname iproute diff --git a/mkosi/mkosi.images/minimal-base/mkosi.conf.d/debian-ubuntu.conf b/mkosi/mkosi.images/minimal-base/mkosi.conf.d/debian-ubuntu.conf index d524ec17fe..ddf1a18807 100644 --- a/mkosi/mkosi.images/minimal-base/mkosi.conf.d/debian-ubuntu.conf +++ b/mkosi/mkosi.images/minimal-base/mkosi.conf.d/debian-ubuntu.conf @@ -5,6 +5,7 @@ Distribution=|debian Distribution=|ubuntu [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/debian-ubuntu/mkosi.prepare Packages= hostname iproute2 diff --git a/mkosi/mkosi.images/minimal-base/mkosi.conf.d/opensuse.conf b/mkosi/mkosi.images/minimal-base/mkosi.conf.d/opensuse.conf index 3d891b8ed0..4f96c7d34b 100644 --- a/mkosi/mkosi.images/minimal-base/mkosi.conf.d/opensuse.conf +++ b/mkosi/mkosi.images/minimal-base/mkosi.conf.d/opensuse.conf @@ -4,6 +4,7 @@ Distribution=opensuse [Content] +PrepareScripts=%D/mkosi/mkosi.conf.d/opensuse/mkosi.prepare Packages= diffutils grep