From: Daan De Meyer Date: Sun, 30 Apr 2023 20:41:54 +0000 (+0200) Subject: Do prebuilt initrds by default X-Git-Tag: v15~188^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f820b740730fe073d274181d3dd3843c96aa706;p=thirdparty%2Fmkosi.git Do prebuilt initrds by default Let's stop running kernel-install in favor of always doing prebuilt initrds by default. We reimplement the depmod hook of kernel-install ourselves (required for centos stream 8). If no initrd is provided by the user, we build a minimal one ourselves that's sufficient to boot in a qemu VM. If the default initrd is not sufficient, the upcoming preset support can be used to build a custom initrd instead. --- diff --git a/.github/mkosi.conf.d/10-common.conf b/.github/mkosi.conf.d/10-common.conf index 6d34d64ba..573ea8207 100644 --- a/.github/mkosi.conf.d/10-common.conf +++ b/.github/mkosi.conf.d/10-common.conf @@ -4,5 +4,8 @@ KernelCommandLine=systemd.unit=mkosi-check-and-shutdown.service systemd.log_target=console systemd.default_standard_output=journal+console +[Content] +Bootable=yes + [Host] Autologin=yes diff --git a/.github/mkosi.conf.d/20-alma.conf b/.github/mkosi.conf.d/20-alma.conf index 197f12c94..620ce5a4a 100644 --- a/.github/mkosi.conf.d/20-alma.conf +++ b/.github/mkosi.conf.d/20-alma.conf @@ -9,4 +9,3 @@ Packages=kernel-core systemd systemd-boot systemd-udev - dracut diff --git a/.github/mkosi.conf.d/20-arch.conf b/.github/mkosi.conf.d/20-arch.conf index fb8471f22..de760e4ca 100644 --- a/.github/mkosi.conf.d/20-arch.conf +++ b/.github/mkosi.conf.d/20-arch.conf @@ -4,4 +4,3 @@ Distribution=arch [Content] Packages=linux systemd - dracut diff --git a/.github/mkosi.conf.d/20-centos.conf b/.github/mkosi.conf.d/20-centos.conf index 9f9de2226..0033c61b9 100644 --- a/.github/mkosi.conf.d/20-centos.conf +++ b/.github/mkosi.conf.d/20-centos.conf @@ -6,4 +6,3 @@ Packages=kernel-core systemd systemd-boot systemd-udev - dracut diff --git a/.github/mkosi.conf.d/20-debian.conf b/.github/mkosi.conf.d/20-debian.conf index d7c358916..b6ec5f7a3 100644 --- a/.github/mkosi.conf.d/20-debian.conf +++ b/.github/mkosi.conf.d/20-debian.conf @@ -7,5 +7,4 @@ Packages=linux-image-cloud-amd64 systemd-boot systemd-sysv udev - dracut dbus diff --git a/.github/mkosi.conf.d/20-fedora.conf b/.github/mkosi.conf.d/20-fedora.conf index e9c1da6ba..cf1171439 100644 --- a/.github/mkosi.conf.d/20-fedora.conf +++ b/.github/mkosi.conf.d/20-fedora.conf @@ -6,5 +6,4 @@ Packages=kernel-core systemd systemd-boot systemd-udev - dracut util-linux diff --git a/.github/mkosi.conf.d/20-opensuse.conf b/.github/mkosi.conf.d/20-opensuse.conf index 829dc2ef9..9e811a699 100644 --- a/.github/mkosi.conf.d/20-opensuse.conf +++ b/.github/mkosi.conf.d/20-opensuse.conf @@ -3,6 +3,5 @@ Distribution=opensuse [Content] Packages=kernel-default - dracut systemd udev diff --git a/.github/mkosi.conf.d/20-rocky.conf b/.github/mkosi.conf.d/20-rocky.conf index 1ca46d7d5..72ad7f500 100644 --- a/.github/mkosi.conf.d/20-rocky.conf +++ b/.github/mkosi.conf.d/20-rocky.conf @@ -9,4 +9,3 @@ Packages=kernel-core systemd systemd-boot systemd-udev - dracut diff --git a/.github/mkosi.conf.d/20-ubuntu.conf b/.github/mkosi.conf.d/20-ubuntu.conf index 24c4fe507..d847a27b1 100644 --- a/.github/mkosi.conf.d/20-ubuntu.conf +++ b/.github/mkosi.conf.d/20-ubuntu.conf @@ -9,5 +9,4 @@ Packages=linux-virtual systemd systemd-sysv udev - dracut dbus diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ea93e425d..6be8bf09c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -102,7 +102,7 @@ jobs: runs-on: ubuntu-22.04 needs: unit-test concurrency: - group: ${{ github.workflow }}-${{ matrix.distro }}-${{ matrix.format }}-${{ matrix.prebuilt-initrd }}-${{ github.ref }} + group: ${{ github.workflow }}-${{ matrix.distro }}-${{ matrix.format }}-${{ github.ref }} cancel-in-progress: true defaults: run: @@ -118,19 +118,14 @@ jobs: - fedora - rocky - alma - - gentoo + # Disabled until gentoo supports prebuilt initrds. + # - gentoo - opensuse format: - directory - tar - cpio - disk - prebuilt-initrd: - - no - - yes - exclude: - - distro: gentoo - prebuilt-initrd: yes steps: - uses: actions/checkout@v3 @@ -173,12 +168,6 @@ jobs: - name: Install run: sudo python3 -m pip install .. - - name: Build ${{ matrix.distro }} initrd - if: matrix.prebuilt-initrd == 'yes' - # Run the build in .github/workflows/ so we don't pick up any of the configuration files in .github/ - run: python3 -m mkosi -d ${{ matrix.distro }} -t cpio -p systemd -p udev -p kmod --make-initrd -o $PWD/initrd build - working-directory: ./.github/workflows - - name: Configure ${{ matrix.distro }}/${{ matrix.format }} run: | tee mkosi.conf.d/00-ci.conf <<- EOF @@ -189,14 +178,6 @@ jobs: Format=${{ matrix.format }} EOF - - name: Configure ${{ matrix.distro }}/${{ matrix.format }} initrd - if: matrix.prebuilt-initrd == 'yes' - run: | - tee mkosi.conf.d/00-initrd.conf <<- EOF - [Distribution] - Initrds=workflows/initrd.zst - EOF - - name: Resolve Arch geo mirror location if: matrix.distro == 'arch' run: curl -I geo.mirror.pkgbuild.com diff --git a/docs/bootable.md b/docs/bootable.md index 43ed45be1..501d1c902 100644 --- a/docs/bootable.md +++ b/docs/bootable.md @@ -10,7 +10,6 @@ distributions: [Content] Packages=linux systemd - dracut ``` ## Fedora @@ -21,7 +20,6 @@ Packages=kernel systemd systemd-boot systemd-udev - dracut util-linux ``` @@ -33,7 +31,6 @@ Packages=kernel systemd systemd-boot systemd-udev - dracut ``` ## Debian @@ -45,7 +42,6 @@ Packages=linux-image-generic systemd-boot systemd-sysv udev - dracut dbus ``` @@ -58,7 +54,6 @@ Packages=linux-image-generic systemd systemd-sysv udev - dracut dbus ``` @@ -67,7 +62,6 @@ Packages=linux-image-generic ``` [Content] Packages=kernel-default - dracut systemd udev ``` diff --git a/mkosi.md b/mkosi.md index 356b94649..426340f77 100644 --- a/mkosi.md +++ b/mkosi.md @@ -1380,7 +1380,7 @@ required components and let `mkosi` call `qemu` with all the right options: ```console $ mkosi -d fedora \ --autologin \ - -p systemd-udev,systemd-boot,dracut,kernel-core \ + -p systemd-udev,systemd-boot,kernel-core \ build $ mkosi -d fedora qemu ... diff --git a/mkosi/__init__.py b/mkosi/__init__.py index ff923da46..bf82a5aba 100644 --- a/mkosi/__init__.py +++ b/mkosi/__init__.py @@ -23,9 +23,15 @@ from pathlib import Path from textwrap import dedent from typing import Callable, ContextManager, Optional, TextIO, TypeVar, Union, cast -from mkosi.config import GenericVersion, MkosiArgs, MkosiConfig, machine_name +from mkosi.config import ( + GenericVersion, + MkosiArgs, + MkosiConfig, + MkosiConfigParser, + machine_name, +) from mkosi.install import add_dropin_config_from_resource, copy_path, flock -from mkosi.log import ARG_DEBUG, Style, color_error, complete_step, die, log_step +from mkosi.log import Style, color_error, complete_step, die, log_step from mkosi.manifest import Manifest from mkosi.mounts import dissect_and_mount, mount_overlay, scandir_recursive from mkosi.pager import page @@ -701,6 +707,47 @@ def install_unified_kernel(state: MkosiState, roothash: Optional[str]) -> None: if state.config.output_format == OutputFormat.cpio and state.config.bootable is None: return + initrds = [] + + if state.config.initrds: + initrds = state.config.initrds + elif any(gen_kernel_images(state)): + # Default values are assigned via the parser so we go via the argument parser to construct + # the config for the initrd. + with complete_step("Building initrd"): + args, config = MkosiConfigParser().parse([ + "--directory", "", + "--distribution", str(state.config.distribution), + "--release", state.config.release, + "--architecture", state.config.architecture, + *(["--mirror", state.config.mirror] if state.config.mirror else []), + "--repository-key-check", yes_no(state.config.repository_key_check), + "--repositories", ",".join(state.config.repositories), + "--repo-dir", ",".join(str(p) for p in state.config.repo_dirs), + "--compress-output", str(state.config.compress_output), + "--with-network", yes_no(state.config.with_network), + "--cache-only", yes_no(state.config.cache_only), + *(["--output-dir", str(state.config.output_dir)] if state.config.output_dir else []), + *(["--workspace-dir", str(state.config.workspace_dir)] if state.config.workspace_dir else []), + "--cache-dir", str(state.cache.parent) if state.config.cache_dir else str(state.cache), + "--incremental", yes_no(state.config.incremental), + "--acl", yes_no(state.config.acl), + "--format", "cpio", + "--package", "systemd", + "--package", "udev", + "--package", "kmod", + "--output", "initrd", + "--make-initrd", "yes", + "--bootable", "no", + "--manifest-format", "", + "-f", + "build", + ]) + + build_stuff(state.uid, state.gid, args, config) + + initrds = [config.output_compressed] + for kver, kimg in gen_kernel_images(state): with complete_step(f"Generating unified kernel image for {kimg}"): image_id = state.config.image_id or f"mkosi-{state.config.distribution}" @@ -767,16 +814,7 @@ def install_unified_kernel(state: MkosiState, roothash: Optional[str]) -> None: "--pcr-banks", "sha1,sha256", ] - if state.config.initrds: - initrds = state.config.initrds + [gen_kernel_modules_initrd(state, kver)] - else: - initrd = state.root / state.installer.initrd_path(kver) - if not initrd.exists(): - die(f"Initrd not found at {initrd}") - - initrds = [initrd] - - cmd += [state.root / kimg] + initrds + cmd += [state.root / kimg] + initrds + [gen_kernel_modules_initrd(state, kver)] run(cmd) @@ -1289,49 +1327,13 @@ def configure_initrd(state: MkosiState) -> None: state.root.joinpath("etc/initrd-release").symlink_to("/etc/os-release") -def run_kernel_install(state: MkosiState) -> None: - if state.config.initrds: - return - +def run_depmod(state: MkosiState) -> None: if state.config.bootable is False: return - if state.config.bootable is None and state.config.output_format == OutputFormat.cpio: - return - - # CentOS Stream 8 has an old version of kernel-install that unconditionally writes initrds to - # /boot//, so let's detect that and move them to the correct location. - - if (p := state.root / "etc/machine-id").exists(): - machine_id = p.read_text().strip() - else: - machine_id = None - - # kernel-install on Debian/Ubuntu does not rebuild the dracut initrd, so we do it manually here. - if (state.root.joinpath("usr/bin/dracut").exists() and - state.config.distribution in (Distribution.ubuntu, Distribution.debian) and - not state.root.joinpath("usr/lib/kernel/install.d/50-dracut.install").exists() and - not state.root.joinpath("etc/kernel/install.d/50-dracut.install").exists()): - with complete_step("Running dpkg-reconfigure dracut…"): - run_workspace_command(state.root, ["dpkg-reconfigure", "dracut"], - env=dict(hostonly_l="no") | state.environment) - return - - with complete_step("Running kernel-install…"): - for kver, kimg in gen_kernel_images(state): - cmd: list[PathString] = ["kernel-install", "add", kver, Path("/") / kimg] - - if ARG_DEBUG.get(): - cmd.insert(1, "--verbose") - - # Make dracut think --no-host-only was passed via the CLI. - run_workspace_command(state.root, cmd, env=dict(hostonly_l="no") | state.environment) - - if machine_id and (p := state.root / "boot" / machine_id / kver / "initrd").exists(): - shutil.move(p, state.root / state.installer.initrd_path(kver)) - - if machine_id and (p := state.root / "boot" / machine_id).exists(): - shutil.rmtree(p) + for kver, _ in gen_kernel_images(state): + with complete_step(f"Running depmod for {kver}"): + run(["depmod", "--basedir", state.root, kver]) def run_sysusers(state: MkosiState) -> None: @@ -1497,12 +1499,12 @@ def build_image(state: MkosiState, *, for_cache: bool, manifest: Optional[Manife run_build_script(state) install_build_dest(state) install_extra_trees(state) - run_kernel_install(state) install_boot_loader(state) configure_ssh(state) run_postinst_script(state) run_sysusers(state) run_preset_all(state) + run_depmod(state) remove_packages(state) if manifest: diff --git a/mkosi/config.py b/mkosi/config.py index 939c365a7..261705982 100644 --- a/mkosi/config.py +++ b/mkosi/config.py @@ -1885,8 +1885,10 @@ def load_kernel_command_line_extra(args: argparse.Namespace) -> list[str]: def load_args(args: argparse.Namespace) -> MkosiArgs: - ARG_DEBUG.set(args.debug) - ARG_DEBUG_SHELL.set(args.debug_shell) + if args.debug: + ARG_DEBUG.set(args.debug) + if args.debug_shell: + ARG_DEBUG_SHELL.set(args.debug_shell) return MkosiArgs.from_namespace(args) diff --git a/mkosi/distributions/__init__.py b/mkosi/distributions/__init__.py index e690a0f9a..bdc1b6568 100644 --- a/mkosi/distributions/__init__.py +++ b/mkosi/distributions/__init__.py @@ -17,10 +17,6 @@ class DistributionInstaller: def kernel_image(kver: str, architecture: str) -> Path: return Path("usr/lib/modules") / kver / "vmlinuz" - @staticmethod - def initrd_path(kver: str) -> Path: - return Path("boot") / f"initramfs-{kver}.img" - @classmethod def install_packages(cls, state: "MkosiState", packages: Sequence[str]) -> None: raise NotImplementedError diff --git a/mkosi/distributions/debian.py b/mkosi/distributions/debian.py index f33924714..3d407f70f 100644 --- a/mkosi/distributions/debian.py +++ b/mkosi/distributions/debian.py @@ -21,10 +21,6 @@ class DebianInstaller(DistributionInstaller): def kernel_image(name: str, architecture: str) -> Path: return Path(f"boot/vmlinuz-{name}") - @staticmethod - def initrd_path(kver: str) -> Path: - return Path("boot") / f"initrd.img-{kver}" - @staticmethod def repositories(state: MkosiState, local: bool = True) -> list[str]: repos = ' '.join(("main", *state.config.repositories)) diff --git a/mkosi/distributions/opensuse.py b/mkosi/distributions/opensuse.py index 38cb6f824..1e973ddc7 100644 --- a/mkosi/distributions/opensuse.py +++ b/mkosi/distributions/opensuse.py @@ -1,7 +1,6 @@ # SPDX-License-Identifier: LGPL-2.1+ from collections.abc import Sequence -from pathlib import Path from textwrap import dedent from mkosi.distributions import DistributionInstaller @@ -52,10 +51,6 @@ class OpensuseInstaller(DistributionInstaller): def remove_packages(cls, state: MkosiState, packages: Sequence[str]) -> None: invoke_zypper(state, "remove", ["-y", "--clean-deps"], packages) - @staticmethod - def initrd_path(kver: str) -> Path: - return Path("boot") / f"initrd-{kver}" - def setup_zypper(state: MkosiState, repos: Sequence[tuple[str, str]] = ()) -> None: with state.workspace.joinpath("zypp.conf").open("w") as f: