[PATCH v2 06/10] nixosfi: add the imageless NixOS bringup backend
Daniel Gomez <[email protected]> Fri, 12 Jun 2026 12:55:18 +0200
| Newsgroups | dev.linux.lists.kdevops |
|---|---|
| Message-ID | <[email protected]> |
From: Daniel Gomez <[email protected]> Add NIXOSFI, a "Node bring up method" that runs each guest imagelessly: a nixos-flake backends.imageless closure (tmpfs root, /nix/store and /lib/modules over virtiofs) booted via QEMU -kernel against a controller-built kernel (BOOTLINUX_DIRECT_BOOT), with no disk image. The backend is split from its runtime. The nixosfi role owns the nix work -- per-node imageless flakes, closure builds, and rebuild-boot / rebuild-test kernel iteration -- and drives the qsu runtime through include_role. The qsu role is the qemu-system-units runtime: it installs QEMU and virtiofsd, renders the systemd template units and per-VM env and drop-ins, and runs each guest as a systemd machine registered with systemd-machined (visible in machinectl). The QSU_* knobs (cpu, memory, NVMe, ssh, vsock) configure that runtime, and nixosfi reuses them the same way nixosfl reuses libvirt. Generated-by: Claude AI Signed-off-by: Daniel Gomez <[email protected]> --- MAINTAINERS | 26 + defconfigs/nixosfi-nvme-4kn-atomics | 24 + docs/nixos-flake-backends.md | 35 + docs/nixosfi.md | 51 + docs/qsu.md | 37 + kconfigs/Kconfig.ansible_provisioning | 6 +- kconfigs/Kconfig.bringup | 26 + kconfigs/Kconfig.bringup.goals | 6 +- kconfigs/Kconfig.kdevops | 2 +- kconfigs/Kconfig.nixos_flake | 25 +- kconfigs/Kconfig.qsu | 498 ++++ kconfigs/monitors/Kconfig | 13 +- kconfigs/workflows/Kconfig | 1 + playbooks/nixosfi.yml | 23 + playbooks/roles/bootlinux/tasks/config.yml | 7 + .../roles/bootlinux/templates/config-imageless | 2957 ++++++++++++++++++++ playbooks/roles/nixosfi/tasks/generate-configs.yml | 71 + .../roles/nixosfi/tasks/imageless-build-per-vm.yml | 40 + playbooks/roles/nixosfi/tasks/imageless-build.yml | 62 + playbooks/roles/nixosfi/tasks/main.yml | 87 + playbooks/roles/nixosfi/tasks/rebuild-boot.yml | 27 + playbooks/roles/nixosfi/tasks/rebuild-test.yml | 35 + playbooks/roles/nixosfi/templates/default.nix.j2 | 75 + playbooks/roles/nixosfi/templates/flake.nix.j2 | 41 + playbooks/roles/qsu/tasks/bringup.yml | 105 + playbooks/roles/qsu/tasks/console.yml | 23 + playbooks/roles/qsu/tasks/destroy.yml | 134 + playbooks/roles/qsu/tasks/install-deps.yml | 31 + playbooks/roles/qsu/tasks/render-per-vm.yml | 280 ++ playbooks/roles/qsu/tasks/render-units.yml | 55 + playbooks/roles/qsu/tasks/restart-vms.yml | 55 + playbooks/roles/qsu/tasks/start-vms.yml | 46 + playbooks/roles/qsu/tasks/stop-vms.yml | 25 + playbooks/roles/qsu/templates/debug-vars.yaml.j2 | 175 ++ playbooks/roles/qsu/vars/main.yml | 26 + scripts/nixosfi.Makefile | 125 + scripts/nixosfi_ssh_key_name.py | 55 + scripts/provision.Makefile | 4 + scripts/update_ssh_config_nixosfi.py | 216 ++ workflows/linux/Kconfig | 1 + 40 files changed, 5512 insertions(+), 19 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index f71da5de..f2af8b43 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -149,6 +149,7 @@ L: [email protected] S: Maintained T: git https://github.com/linux-kdevops/kdevops.git F: kconfigs/Kconfig.nixos_flake +F: docs/nixos-flake-backends.md F: docs/nixosfl.md F: playbooks/nixosfl.yml F: playbooks/roles/nixosfl/ @@ -167,6 +168,31 @@ T: git https://github.com/linux-kdevops/kdevops.git F: workflows/pynfs/ F: playbooks/roles/pynfs/ +NIXOSFI +M: Daniel Gomez <[email protected]> +L: [email protected] +S: Maintained +T: git https://github.com/linux-kdevops/kdevops.git +F: defconfigs/nixosfi-* +F: docs/nixosfi.md +F: playbooks/nixosfi.yml +F: playbooks/roles/nixosfi/ +F: scripts/nixosfi.Makefile +F: scripts/nixosfi_ssh_key_name.py +F: scripts/update_ssh_config_nixosfi.py +N: nixosfi + +QEMU SYSTEM UNITS (QSU) +M: Daniel Gomez <[email protected]> +L: [email protected] +S: Maintained +T: git https://github.com/linux-kdevops/kdevops.git +F: docs/qsu.md +F: kconfigs/Kconfig.qsu +F: playbooks/roles/qsu/ +F: scripts/qemu-system-units/ +N: qsu|QSU + KDEVOPS M: Luis Chamberlain <[email protected]> R: Daniel Gomez <[email protected]> diff --git a/defconfigs/nixosfi-nvme-4kn-atomics b/defconfigs/nixosfi-nvme-4kn-atomics new file mode 100644 index 00000000..337e53a7 --- /dev/null +++ b/defconfigs/nixosfi-nvme-4kn-atomics @@ -0,0 +1,24 @@ +CONFIG_NIXOSFI=y + +CONFIG_WORKFLOWS=y +CONFIG_WORKFLOW_LINUX_CUSTOM=y +CONFIG_BOOTLINUX=y +CONFIG_BOOTLINUX_DIRECT_BOOT=y + +# CONFIG_KDEVOPS_BASELINE_AND_DEV is not set + +CONFIG_QSU_NVME_DRIVE_COUNT=4 +CONFIG_QSU_NVME_DRIVE_SIZE_GB=20 +CONFIG_QSU_NVME_LOGICAL_BLOCK_SIZE="4096" +CONFIG_QSU_NVME_PHYSICAL_BLOCK_SIZE="4096" +CONFIG_QSU_NVME_MIN_IO_SIZE="4096" +CONFIG_QSU_NVME_OPT_IO_SIZE="4096" +CONFIG_QSU_NVME_DISCARD_GRANULARITY="4096" +CONFIG_QSU_NVME_MDTS="9" + +CONFIG_QSU_NVME_ATOMIC_AWUN="15" +CONFIG_QSU_NVME_ATOMIC_AWUPF="15" +CONFIG_QSU_NVME_ATOMIC_NAWUN="15" +CONFIG_QSU_NVME_ATOMIC_NAWUPF="15" + +CONFIG_ANSIBLE_CFG_CALLBACK_PLUGIN_LUCID=y diff --git a/docs/nixos-flake-backends.md b/docs/nixos-flake-backends.md new file mode 100644 index 00000000..a679a91d --- /dev/null +++ b/docs/nixos-flake-backends.md @@ -0,0 +1,35 @@ +# NixOS-flake bring-up backends + +kdevops can build guests declaratively from the **nixos-flake** library +(vendored at `scripts/nixos-flake/`) instead of from a distro image. Two +"Node bring up method" choices select which nixos-flake backend module to +build and how to run it: + +| Choice | nixos-flake module | Image | Runtime | Manager | +|---|---|---|---|---| +| `NIXOSFL` | `backends.libvirt` | qcow2 disk image | libvirtd | `virsh` | +| `NIXOSFI` | `backends.imageless` | system closure (virtiofs root) | qsu / systemd-machined | `machinectl` | + +`NIXOSFL` is the Nix counterpart of `GUESTFS`: the same libvirt runtime, +with the image built from a reproducible flake instead of by libguestfs. +`NIXOSFI` swaps that runtime for qemu-system-units (qsu) — no disk +image, no daemon — and boots a controller-built kernel directly +(`BOOTLINUX_DIRECT_BOOT`). + +## Layers + +- **library** — `scripts/nixos-flake/` (the flake: modules, overlays, + backend definitions), configured by the shared `Kconfig.nixos_flake` + menu (`NIXOS_FLAKE_*`: profiles, mounts, testSuites) and a one-time Nix + install on the controller (`make nixos-flake-runtime-deps-setup`). +- **backends** — `NIXOSFL` ([nixosfl.md](nixosfl.md)) and `NIXOSFI` + ([nixosfi.md](nixosfi.md)). +- **runtime** — libvirtd for `NIXOSFL`; qsu ([qsu.md](qsu.md)) for `NIXOSFI`. + +## Scope today + +Both backends gate off the test workflows (fstests, blktests, ...) and the +monitors. A nixos-flake guest is built declaratively, so once it boots +there is no per-guest Ansible step left for kdevops to run; wiring those +workflows needs a controller/guest setup separation that is not in place +yet. diff --git a/docs/nixosfi.md b/docs/nixosfi.md new file mode 100644 index 00000000..8815f833 --- /dev/null +++ b/docs/nixosfi.md @@ -0,0 +1,51 @@ +# NIXOSFI — nixos-flake imageless backend + +`NIXOSFI` runs each guest imagelessly: a nixos-flake `backends.imageless` +closure (tmpfs root; `/nix/store` and `/lib/modules` shared read-only over +virtiofs) booted via QEMU's `-kernel` against a kernel you build on the +controller. No disk image, no distro. Each guest runs on the qsu runtime +as a systemd-machined machine — see [qsu.md](qsu.md) — and +[nixos-flake-backends.md](nixos-flake-backends.md) for how it relates to +the libvirt `NIXOSFL` backend. + +## Enable + +``` +make menuconfig # Node bring up method -> NixOS imageless configuration with systemd-machined +``` + +or `CONFIG_NIXOSFI=y`. `BOOTLINUX_DIRECT_BOOT` is auto-selected: the guest +boots the controller-built kernel. Guest contents use the shared +`NIXOS_FLAKE_*` options; the VM runtime (cpu, memory, NVMe, ssh, vsock) +uses the `QSU_*` knobs. + +## Bring up + +``` +make +make bringup # build kernel + closures, render units, start machines, wait for SSH +ssh <guest> +``` + +`make bringup` builds the direct-boot kernel, then runs +`playbooks/nixosfi.yml`: it renders per-guest imageless flakes, +`nix build`s each `toplevel` closure, and drives the qsu runtime to render +the systemd units and start each guest. + +## Fast kernel iteration + +``` +make linux-direct-boot # build a new kernel on the controller +make nixosfi-rebuild-boot # reboot guests onto it, no image rebuild +``` + +## Inspect and tear down + +See [qsu.md](qsu.md) for `machinectl` / `systemctl --user`. Then +`make destroy`. + +## Prerequisites + +Nix on the controller (`make nixos-flake-runtime-deps-setup`) and the qsu +runtime dependencies (QEMU, virtiofsd, socat, systemd-container), installed +by the bringup itself. diff --git a/docs/qsu.md b/docs/qsu.md new file mode 100644 index 00000000..b4a11998 --- /dev/null +++ b/docs/qsu.md @@ -0,0 +1,37 @@ +# qsu runtime (qemu-system-units) + +The `NIXOSFI` backend runs each guest through **qsu**, the vendored +qemu-system-units project (`scripts/qemu-system-units/`): every guest is a +`qemu-system@<vm>` systemd **user** service registered with +systemd-machined, so it appears as a machine and is managed like one. This +is the systemd-vmspawn model — `machinectl` is to qsu what `virsh` is to +libvirt. + +## Inspect running guests + +``` +machinectl list # registered machines +systemctl --user status qemu-system@<vm> +systemctl --user list-units 'qemu-system@*' 'virtiofsd@*' +``` + +## Lifecycle (via kdevops) + +``` +make nixosfi-console VM=<vm> # serial console +make nixosfi-status # inventory + running state +make nixosfi-stop / nixosfi-start / nixosfi-restart +``` + +## Shipped configuration + +kdevops writes, per guest, under `~/.config/systemd/`: +`qemu-system/<vm>.env` (the QEMU command line), the +`qemu-system@<vm>.service.d/` and `virtiofsd@<vm>-<tag>.service.d/` +drop-ins, and a debug snapshot at `$QSU_VARS_DIR/<vm>.yaml`. Reading those +shows exactly what each machine boots with. The `QSU_*` Kconfig knobs (cpu, +ram, cpus, machine type, ssh/vsock, NVMe geometry) configure this runtime. + +For the qsu project itself — the systemd unit templates and the standalone +(non-Ansible) workflow — see the upstream docs under +`scripts/qemu-system-units/`. diff --git a/kconfigs/Kconfig.ansible_provisioning b/kconfigs/Kconfig.ansible_provisioning index 68b980b7..c3c31eea 100644 --- a/kconfigs/Kconfig.ansible_provisioning +++ b/kconfigs/Kconfig.ansible_provisioning @@ -131,7 +131,7 @@ config KDEVOPS_PYTHON_OLD_INTERPRETER config KDEVOPS_BASELINE_PYTHON_INTERPRETER string "Python interpreter for the [baseline] host group" output yaml - default "/run/current-system/sw/bin/python3" if NIXOSFL + default "/run/current-system/sw/bin/python3" if KDEVOPS_ENABLE_NIXOS_FLAKE default KDEVOPS_PYTHON_INTERPRETER help Python interpreter emitted under [baseline:vars] in the generated @@ -144,7 +144,7 @@ config KDEVOPS_BASELINE_PYTHON_INTERPRETER config KDEVOPS_DEV_PYTHON_INTERPRETER string "Python interpreter for the [dev] host group" output yaml - default "/run/current-system/sw/bin/python3" if NIXOSFL + default "/run/current-system/sw/bin/python3" if KDEVOPS_ENABLE_NIXOS_FLAKE default KDEVOPS_PYTHON_INTERPRETER help Python interpreter emitted under [dev:vars] in the generated @@ -153,7 +153,7 @@ config KDEVOPS_DEV_PYTHON_INTERPRETER config KDEVOPS_SERVICE_PYTHON_INTERPRETER string "Python interpreter for the [service] host group" output yaml - default "/run/current-system/sw/bin/python3" if NIXOSFL + default "/run/current-system/sw/bin/python3" if KDEVOPS_ENABLE_NIXOS_FLAKE default KDEVOPS_PYTHON_INTERPRETER help Python interpreter emitted under [service:vars] in the generated diff --git a/kconfigs/Kconfig.bringup b/kconfigs/Kconfig.bringup index 7d6c70ca..f1f1dfab 100644 --- a/kconfigs/Kconfig.bringup +++ b/kconfigs/Kconfig.bringup @@ -14,6 +14,10 @@ config KDEVOPS_ENABLE_NIXOSFL bool output yaml +config KDEVOPS_ENABLE_NIXOSFI + bool + output yaml + config CLOUD_INITIALIZED bool default $(shell, test -f .cloud.initialized && echo y || echo n) = "y" @@ -76,6 +80,27 @@ config NIXOSFL to produce a qcow2 disk image; kdevops stages it into the libvirt storage pool, defines and starts the domain, and waits for SSH. +config NIXOSFI + bool "qsu systemd-unit toolkit for QEMU VMs (nixos-flake imageless guests)" + select KDEVOPS_ENABLE_NIXOSFI + select KDEVOPS_ENABLE_NIXOS_FLAKE + select HAVE_CUSTOM_DISTRO_HOST_PREFIX + select HAVE_DISTRO_PREFERS_CUSTOM_HOST_PREFIX + select EXTRA_STORAGE_SUPPORTS_512 + select EXTRA_STORAGE_SUPPORTS_1K + select EXTRA_STORAGE_SUPPORTS_2K + select EXTRA_STORAGE_SUPPORTS_4K + help + Run each guest as a systemd machine: a qemu-system@<vm> + service registered with systemd-machined (visible in + machinectl, placed in machine.slice), the model + systemd-vmspawn uses, from the templates in + scripts/qemu-system-units/. The guest closure is the + nixos-flake backends.imageless NixOS module (tmpfs root, + /nix/store and /lib/modules shared in via virtiofs); the + kernel comes from BOOTLINUX_DIRECT_BOOT via qemu-system-* + -kernel. No libvirt daemon, no qcow2. + config SKIP_BRINGUP bool "Skip bring up - bare metal or existing nodes" select EXTRA_STORAGE_SUPPORTS_512 @@ -97,6 +122,7 @@ config LIBVIRT source "kconfigs/Kconfig.guestfs" source "kconfigs/Kconfig.nixos_flake" +source "kconfigs/Kconfig.qsu" source "terraform/Kconfig" source "kconfigs/Kconfig.declared_hosts" if LIBVIRT diff --git a/kconfigs/Kconfig.bringup.goals b/kconfigs/Kconfig.bringup.goals index 1f4741c4..69518f32 100644 --- a/kconfigs/Kconfig.bringup.goals +++ b/kconfigs/Kconfig.bringup.goals @@ -13,7 +13,7 @@ config HAVE_DISTRO_PREFERS_INSTALL_KDEVTOOLS config KDEVOPS_TRY_REFRESH_REPOS bool "Try to refresh repositories on bringup?" - depends on !NIXOSFL + depends on !KDEVOPS_ENABLE_NIXOS_FLAKE default n if !HAVE_DISTRO_PREFERS_REFRESH default y if HAVE_DISTRO_PREFERS_REFRESH help @@ -31,7 +31,7 @@ config KDEVOPS_TRY_REFRESH_REPOS config RHEL_REGISTER bool "Register the guests with Red Hat?" - depends on !NIXOSFL + depends on !KDEVOPS_ENABLE_NIXOS_FLAKE default n help Official RHEL installations require a subscription before you can download @@ -54,7 +54,7 @@ config RHEL_ACTIVATION_KEY config KDEVOPS_CUSTOM_YUM_REPOFILE string "Custom yum repo file" - depends on !NIXOSFL + depends on !KDEVOPS_ENABLE_NIXOS_FLAKE default "" help Add a custom yum repo file to /etc/yum.repos.d before updating? Leave blank to diff --git a/kconfigs/Kconfig.kdevops b/kconfigs/Kconfig.kdevops index 7b784a12..7f98d9a9 100644 --- a/kconfigs/Kconfig.kdevops +++ b/kconfigs/Kconfig.kdevops @@ -28,7 +28,7 @@ config CUSTOM_DISTRO_HOST_PREFIX depends on HAVE_CUSTOM_DISTRO_HOST_PREFIX default GUESTFS_FEDORA_BOX_SHORT if GUESTFS_FEDORA default GUESTFS_DEBIAN_BOX_SHORT if GUESTFS_DEBIAN - default "nixos" if NIXOSFL + default "nixos" if KDEVOPS_ENABLE_NIXOS_FLAKE config CUSTOM_SSH_KEXALGORITHMS string diff --git a/kconfigs/Kconfig.nixos_flake b/kconfigs/Kconfig.nixos_flake index ac7364df..7d1f867e 100644 --- a/kconfigs/Kconfig.nixos_flake +++ b/kconfigs/Kconfig.nixos_flake @@ -2,7 +2,7 @@ # # nixos_flake -- shared infrastructure feature for the Nix flake at # scripts/nixos-flake/. Consumed by the NIXOSFL bringup -# choice today and by the imageless backend (QSU) later. +# choice today and by the imageless backend (NIXOSFI) later. if KDEVOPS_ENABLE_NIXOS_FLAKE @@ -42,6 +42,22 @@ config NIXOSFL_STORAGE_DIR endif # NIXOSFL +if NIXOSFI + +config NIXOSFI_CONFIG_DIR + string + output yaml + default "$(TOPDIR_PATH)/nixos/generated" + help + Controller-side directory where the qsu role writes one + subdirectory per guest holding the rendered flake.nix and + default.nix for the imageless backend. Defaults to + nixos/generated/ at the kdevops topdir (same path the libvirt + backend uses; they're mutually exclusive bringup choices), + which is gitignored. + +endif # NIXOSFI + menu "Profiles" config NIXOS_FLAKE_PROFILE_DEVEL @@ -86,12 +102,13 @@ menu "Mounts" config NIXOS_FLAKE_MOUNT_SHARES bool "Enable virtiofs shares (mounts/shares.nix)" output yaml + default y if NIXOSFI default n help Imports nixos-flake.nixosModules.mounts.shares. Mounts named - virtiofs shares inside the guest. qsu pairs this with the - nixos-flake backends.imageless closure for /nix/store + - /lib/modules + data-* shares. + virtiofs shares inside the guest. The imageless backend + requires this (it sources /nix/store and /lib/modules over + virtiofs), so the knob auto-enables under NIXOSFI. config NIXOS_FLAKE_MOUNT_STORAGE bool "Enable block-device storage mounts (mounts/storage.nix)" diff --git a/kconfigs/Kconfig.qsu b/kconfigs/Kconfig.qsu new file mode 100644 index 00000000..7d5d4cb5 --- /dev/null +++ b/kconfigs/Kconfig.qsu @@ -0,0 +1,498 @@ +# SPDX-License-Identifier: copyleft-next-0.3.1 + +if NIXOSFI + +config QSU_VARS_DIR + string + output yaml + default "{{ topdir_path }}/scripts/qemu-system-units/vars" + help + Where kdevops renders per-VM qemu-system-units vars files. + qemu-system-units' own .gitignore already excludes everything + under vars/ except the upstream example, so kdevops-generated + artefacts there never leak back upstream through a subtree + push. + +config QSU_QEMU_BINARY + string "QEMU system emulator binary" + output yaml + default QEMU_BUILD_BIN_PATH if QEMU_BUILD + default "/usr/bin/qemu-system-x86_64" + help + Absolute path to the QEMU system emulator binary for the + guest architecture. The qsu templates invoke this as the + ExecStart= binary path. + + When QEMU_BUILD=y, this defaults to QEMU_BUILD_BIN_PATH so + the qsu service exec'd by systemd is the binary the + build_qemu role just installed under + KDEVOPS_CONTROLLER_DATA_PATH/qemu-destdir/bin/, with no + manual override needed in the defconfig. The Jinja2 + template resolves at Ansible-use time so changing the + controller data path or destdir path higher up propagates + here transitively. + +config QSU_CPU + string "Guest CPU model" + output yaml + default "host" + help + Passed to QEMU as -cpu. "host" passes host CPU features + through to the guest and requires KVM. Use "max" with TCG. + +config QSU_ACCEL + string "QEMU accelerator" + output yaml + default "kvm" + help + Passed to QEMU as -accel. "kvm" on Linux hosts with hardware + virtualization, "tcg" for pure software emulation. + +config QSU_RAM + int "Guest RAM (MB)" + output yaml + default 4096 + +config QSU_CPUS + int "Guest vCPU count" + output yaml + default 4 + +config QSU_MACHINE_TYPE + string "QEMU machine type" + output yaml + default "q35" + help + Passed to QEMU as -machine type=. q35 for modern x86 guests, + microvm for minimal boot, virt for aarch64. + +menu "SSH access" + +config QSU_SSH_PORT_BASE + int "SSH host port forwarding base" + output yaml + default 10022 + help + qsu uses QEMU user-mode networking, so each guest's port 22 + is forwarded to a unique host port. The role computes guest N's + host port as ssh_port_base + N from the inventory index. + +config QSU_VSOCK_CID_BASE + int "VSOCK Context ID base" + output yaml + default 100 + help + Each guest's vsock_cid is vsock_cid_base + N from the inventory + index. Valid range is 3 to 4294967295 (0 is the hypervisor, 1 + is local, 2 is the host). Used by qsu's graceful shutdown + ExecStop= which targets root@vsock/<cid>. + +choice + prompt "Default SSH transport for `ssh <vm>` alias" + default QSU_SSH_DEFAULT_VSOCK + help + kdevops renders three ssh_config stanzas per qsu VM: + <name>-vsock via systemd-ssh-proxy over AF_VSOCK, + <name>-net via TCP SLIRP hostfwd, and the bare <name> + which groups with one of them. This knob picks which. + + vsock has zero TCP/SLIRP overhead and uses the guest's + sshd-vsock.socket that systemd-ssh-generator emits when + CONFIG_VIRTIO_VSOCKETS is built in. + + tcp is the legacy path; prefer it when the host lacks + vhost-vsock, runs in a container that cannot create + AF_VSOCK, or when systemd-ssh-proxy's machine/* resolver + behaves poorly on the installed systemd version. + +config QSU_SSH_DEFAULT_VSOCK + bool "vsock" + output yaml + +config QSU_SSH_DEFAULT_TCP + bool "tcp" + output yaml + +endchoice + +endmenu # SSH access + + +menu "NVMe storage" + +config QSU_NVME_DRIVE_COUNT + int "Extra NVMe drives per guest" + output yaml + default 4 + help + Number of qemu-img qcow2 backing files to create per VM, each + attached as a separate NVMe controller with one namespace. + Guest device paths are /dev/nvme0n1 .. /dev/nvme<N-1>n1; + stable symlinks live under + /dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_nvme<N-1>_1. Set to 0 to + skip extra drive creation. The fstests workflow uses one + TEST_DEV plus eight SCRATCH_DEV_POOL devices by default, so + fstests defconfigs override this to 9. + +config QSU_NVME_DRIVE_SIZE_GB + int "Extra NVMe drive size (GB)" + output yaml + default 20 + help + Size in GiB passed to `qemu-img create -f qcow2`. qcow2 only + allocates host space on write, so large virtual sizes are + cheap at rest. + +config QSU_NVME_LOGICAL_BLOCK_SIZE + string "NVMe logical block size (bytes), per-drive list or global" + output yaml + default "" + help + Logical block size (LBA size in bytes) advertised by each + emulated NVMe namespace. Empty string leaves the value unset + on the QEMU command line so QEMU's built-in default applies + (512 bytes today). + + Two input forms are accepted: + - A single integer (e.g. "4096") applies the same value to + every extra storage drive provisioned for the VM. + - A comma-separated list of integers (e.g. "4096,512,512, + 512,512,512,512,512,4096") sets each drive by index. List + entries left empty (",,") fall back to no override for + that drive. Entries past the drive count are ignored; + drives past the list length get no override. + + Common values: 512 (legacy "512n"), 4096 (modern "4Kn" / + Advanced Format Native). + + Per-drive control lets a single VM mix shapes — e.g. TEST_DEV + at 4Kn while the SCRATCH_DEV_POOL stays at 512n — without + needing a separate VM per shape. + + See: <qemu_binary> -device nvme,help (logical_block_size) + +config QSU_NVME_PHYSICAL_BLOCK_SIZE + string "NVMe physical block size (bytes), per-drive list or global" + output yaml + default "" + help + Physical block size advertised by each emulated NVMe namespace, + in bytes. Must be >= logical block size on each drive. Empty + string leaves the value unset so QEMU defaults to logical block + size. + + Same input forms as the logical block size knob: a single + integer applies globally, a comma-separated list of length N + sets each drive by index. + + Common pairings (LBS / PBS): 512/4096 ("512e", classic + Advanced Format with 512-byte emulation), 4096/4096 ("4Kn", + native 4 KiB everywhere). + + See: <qemu_binary> -device nvme,help (physical_block_size) + +config QSU_NVME_MIN_IO_SIZE + string "NVMe min_io_size (bytes), per-drive list or global" + output yaml + default "" + help + Minimum I/O size hint advertised by each emulated NVMe + namespace, in bytes. Surfaces in NVMe Identify Namespace as + NPWG (Namespace Preferred Write Granularity) so the guest + block layer can align write allocations. Accepts plain + integers and QEMU SIZE32 suffixes ("4K", "1M"). Empty string + leaves the value unset; QEMU's default is 0, which the device + layer interprets as "fall back to logical_block_size". + + Same input forms as the block-size knobs: single value or + comma-separated list of length N. + + See: <qemu_binary> -device nvme,help (min_io_size), + hw/core/qdev-properties-system.c BlockConf. + +config QSU_NVME_OPT_IO_SIZE + string "NVMe opt_io_size (bytes), per-drive list or global" + output yaml + default "" + help + Optimal I/O size hint advertised by each emulated NVMe + namespace, in bytes. Surfaces in NVMe Identify Namespace as + NPWA (Namespace Preferred Write Alignment) so filesystem + mkfs and the kernel block layer can pick stripe-aligned + sizes for best throughput. Accepts plain integers and QEMU + SIZE32 suffixes. Empty string leaves the value unset; + QEMU's default is 0 which the device layer interprets as + "fall back to logical_block_size". + + Same input forms as the block-size knobs: single value or + comma-separated list of length N. + + See: <qemu_binary> -device nvme,help (opt_io_size), + hw/core/qdev-properties-system.c BlockConf. + +config QSU_NVME_DISCARD_GRANULARITY + string "NVMe discard_granularity (bytes), per-drive list or global" + output yaml + default "" + help + Minimum size of a single TRIM/DSM deallocate request the + emulated NVMe namespace advertises, in bytes. Surfaces in + NVMe DSM range descriptor accounting and is honored by the + guest block layer to coalesce small discards into the + granularity boundary. Accepts plain integers and QEMU + SIZE32 suffixes. Empty string leaves the value unset; QEMU + defaults to -1 which the block layer interprets as "inherit + from backend" (typically 4 KiB on qcow2). + + Same input forms as the block-size knobs: single value or + comma-separated list of length N. + + See: <qemu_binary> -device nvme,help (discard_granularity), + hw/core/qdev-properties-system.c BlockConf. + +config QSU_NVME_WRITE_CACHE + string "NVMe write cache mode, per-drive list or global" + output yaml + default "" + help + Volatile-write-cache (VWC) mode advertised by each emulated + NVMe namespace. Surfaces in NVMe Identify Controller VWC + and changes the guest block layer's flush behaviour: with + the cache reported present the kernel issues explicit FLUSH + / fsync to drain it, with the cache reported absent the + kernel skips the flush. + + Unlike the block-size knobs this is an ON_OFF_AUTO field + (BlockConf.wce, hw/core/qdev-properties-system.c) so the + values are "on", "off", or "auto" rather than integers: + + on - writeback cache present; FLUSH commands semantic. + off - writethrough; the device claims to never buffer + so the guest skips the explicit drain. Useful to + stress the no-cache path xfstests' fsync tests + poke at. + auto - inherit from the block backend (qcow2 typically + defaults to writeback). + + Empty string leaves the value unset and QEMU's BlockConf + defaults to auto. Same input forms as the block-size + knobs: single value applied globally, or a comma-separated + list of length N for per-drive control (e.g. + "off,off,off,off,off,off,off,off,on" to force every + scratch drive to writethrough while keeping the test + device on writeback). + + See: <qemu_binary> -device nvme,help (write-cache). + +config QSU_NVME_MDTS + string "NVMe Maximum Data Transfer Size (mdts), per-drive list or global" + output yaml + default "" + help + Controller-level Maximum Data Transfer Size (NVMe Identify + Controller MDTS field, offset 77). Encoded as a log2 + multiplier above the controller's minimum memory page size + (CAP.MPSMIN, 4 KiB on standard configurations), so mdts=N + means max transfer = (1 << N) * 4 KiB. The Linux nvme driver + reads this and surfaces it as + /sys/block/<dev>/queue/max_hw_sectors_kb + via nvme_mps_to_sectors (drivers/nvme/host/core.c + nvme_init_identify path), which the block layer caps every + request against. Useful for exercising small-MDTS paths + (where the kernel must split larger I/O into MDTS-sized + chunks) without changing real hardware, or for matching the + MDTS a particular SSD model advertises. + + Examples (with the default 4 KiB MPSMIN): + mdts=1 -> 8 KiB max transfer + mdts=4 -> 64 KiB + mdts=7 -> 512 KiB (QEMU default) + mdts=10 -> 4 MiB + + QEMU rejects mdts=0 (hw/nvme/ctrl.c:8628-8631: + "mdts exceeds IOV_MAX") and any value where + (1 << mdts) + 1 > IOV_MAX, so leave the knob empty for the + default 7 rather than setting 0. zoned.zasl, when set, + must be <= mdts (hw/nvme/ctrl.c:8634). + + Empty string leaves MDTS at QEMU's default. Same input + forms as the block-size knobs: a single value applied to + every drive, or a comma-separated list of length N for + per-drive control (e.g. "7,7,7,7,7,7,7,7,1" to keep the + first eight drives at 512 KiB and pin the last to 8 KiB + for a small-MDTS section). + + See: <qemu_binary> -device nvme,help (mdts); + hw/nvme/ctrl.c DEFINE_PROP_UINT8("mdts", ..., 7) at line 9383 + and id->mdts = n->params.mdts at line 9123; + NVMe Base Specification, Identify Controller Data Structure + (MDTS field). + +menu "Atomic writes" + +config QSU_NVME_ATOMIC_DN + string "NVMe atomic-write 'disable normal' (atomic.dn), per-drive list or global" + output yaml + default "" + help + When set to "on", the controller reports + AWUN == AWUPF (Atomic Write Unit Normal == ... Power Fail) + via NVMe Identify Controller — i.e. the "normal" atomic-write + unit is collapsed onto the power-fail value. This is the + shape the Linux block layer expects when the device offers a + single guaranteed-atomic write unit instead of separate + best-effort and persisted units. xfstests' atomic-write tests + read the resulting awu_min/awu_max from + /sys/block/<dev>/queue/atomic_write_unit_{min,max}_bytes (and + through statx via STATX_WRITE_ATOMIC). + + Values: "on" / "off" / "" (empty leaves the QEMU default). + Unlike the integer knobs this is a bool — comma-separated + per-drive lists are still accepted, but each entry must be + on/off (or empty for "leave default"). A single value applies + to every drive's controller. + + See: <qemu_binary> -device nvme,help (atomic.dn); + hw/nvme/ctrl.c DEFINE_PROP_BOOL("atomic.dn", ..., atomic_dn). + +config QSU_NVME_ATOMIC_AWUN + string "NVMe Atomic Write Unit Normal (atomic.awun), per-drive list or global" + output yaml + default "" + help + Controller-level Atomic Write Unit Normal (NVMe Identify + Controller AWUN field). The 0-based count of LBAs the + controller can write atomically under normal operation: + awun=N means (N+1) LBAs. With LBS=4096 and awun=63, the + controller advertises a 256 KiB atomic write unit at the + controller level. + + This knob alone does NOT make the kernel report a non-default + atomic_write_unit_max. drivers/nvme/host/core.c + (nvme_atomic_bs, ~line 2027) consumes only the per-namespace + NAWUPF when the namespace's NSFEAT_NSABP bit is set; absent + that, the kernel logs "AWUPF ignored, only NAWUPF accepted" + once and uses the logical block size as the atomic write unit. + To actually drive + /sys/block/<dev>/queue/atomic_write_unit_max_bytes + statx() STATX_WRITE_ATOMIC fields + to a non-trivial value, also set ATOMIC_NAWUN/ATOMIC_NAWUPF + (which QEMU's hw/nvme/ns.c sets NSABP for and writes to the + per-namespace NAWUN/NAWUPF). XFS bounds the per-file + atomic_write_unit_min by the filesystem block size, so + large-fsbs profiles (8/16/32/64 KiB) only satisfy tests whose + min gate is >= fsblock; the device-side capability is still + advertised for the kernel paths that read it directly. + + Empty string leaves AWUN at QEMU's default (0, no atomic + write capability advertised). Single value or comma-separated + per-drive list. + + See: <qemu_binary> -device nvme,help (atomic.awun); + hw/nvme/ctrl.c DEFINE_PROP_UINT16("atomic.awun", ...); + NVMe Base Specification, Identify Controller AWUN. + +config QSU_NVME_ATOMIC_AWUPF + string "NVMe Atomic Write Unit Power Fail (atomic.awupf), per-drive list or global" + output yaml + default "" + help + Controller-level Atomic Write Unit Power Fail (NVMe Identify + Controller AWUPF field). 0-based: awupf=N means (N+1) LBAs + guaranteed atomic across power-fail. Must be <= AWUN, and + per QEMU's hw/nvme/ns.c the per-namespace NAWUPF must be + >= AWUPF. + + Same caveat as ATOMIC_AWUN: the kernel does not derive + atomic_write_unit_max from controller-level AWUPF — it logs + "AWUPF ignored, only NAWUPF accepted" when only the + controller value is set. To actually drive the kernel's + per-namespace atomic write reporting set ATOMIC_NAWUPF + alongside this knob. + + Same input forms as the block-size knobs. + + See: <qemu_binary> -device nvme,help (atomic.awupf); + hw/nvme/ctrl.c DEFINE_PROP_UINT16("atomic.awupf", ...); + NVMe Base Specification, Identify Controller AWUPF. + +config QSU_NVME_ATOMIC_NAWUN + string "NVMe Namespace AWU Normal (atomic.nawun), per-drive list or global" + output yaml + default "" + help + Per-namespace override of AWUN, exposed in NVMe Identify + Namespace NAWUN. When set, the namespace reports its own + atomic-write capability that supersedes the controller-level + AWUN for I/O issued to this namespace. Same 0-based encoding: + nawun=N means (N+1) LBAs. + + QEMU's hw/nvme/ns.c rejects NAWUN values smaller than the + controller's AWUN, so set the controller's AWUN/AWUPF first + if you want NAWUN to take effect (or leave AWUN unset and + let NAWUN be the only source). + + Same input forms as the block-size knobs. + + See: <qemu_binary> -device nvme-ns,help (atomic.nawun); + hw/nvme/ns.c nvme_ns_set_nsabp. + +config QSU_NVME_ATOMIC_NAWUPF + string "NVMe Namespace AWU Power Fail (atomic.nawupf), per-drive list or global" + output yaml + default "" + help + Per-namespace override of AWUPF (NVMe Identify Namespace + NAWUPF). Must be <= NAWUN, and >= controller AWUPF (QEMU + enforces both). + + See: <qemu_binary> -device nvme-ns,help (atomic.nawupf). + +config QSU_NVME_ATOMIC_NABSN + string "NVMe Namespace Atomic Boundary Size Normal (atomic.nabsn)" + output yaml + default "" + help + Atomic-write boundary size (NVMe Identify Namespace NABSN), + in 0-based LBAs. Defines the granularity an atomic write + cannot cross during normal operation. Must be >= NAWUN. + + Most kernels treat NABSN > 0 as "this device has an atomic + boundary; align large atomic writes to it"; on cards that + honor a hard boundary (e.g. NVMe SSDs whose firmware can + only guarantee atomicity within a 16 KiB or 64 KiB stripe) + this is the field that surfaces. + + Empty leaves NABSN at QEMU's default (0, no boundary). Same + input forms as the other knobs. + + See: <qemu_binary> -device nvme-ns,help (atomic.nabsn); + hw/nvme/ns.c nvme_ns_atomic_configure_boundary. + +config QSU_NVME_ATOMIC_NABSPF + string "NVMe Namespace Atomic Boundary Size Power Fail (atomic.nabspf)" + output yaml + default "" + help + Atomic-write boundary size for power-fail (NVMe Identify + Namespace NABSPF). Must be >= NAWUPF. + + See: <qemu_binary> -device nvme-ns,help (atomic.nabspf). + +config QSU_NVME_ATOMIC_NABO + string "NVMe Namespace Atomic Boundary Offset (atomic.nabo)" + output yaml + default "" + help + Atomic-write boundary offset (NVMe Identify Namespace NABO). + Where the first atomic boundary starts in LBAs from LBA 0. + Must be <= min(NABSN, NABSPF). 0 means boundary aligned at + start of namespace. + + See: <qemu_binary> -device nvme-ns,help (atomic.nabo). + +endmenu # Atomic writes + +endmenu # NVMe storage + +endif # NIXOSFI diff --git a/kconfigs/monitors/Kconfig b/kconfigs/monitors/Kconfig index 14811dab..fcb25254 100644 --- a/kconfigs/monitors/Kconfig +++ b/kconfigs/monitors/Kconfig @@ -4,7 +4,7 @@ config ENABLE_MONITORING bool "Enable monitoring services during workflow execution" output yaml default n - depends on !NIXOSFL + depends on !KDEVOPS_ENABLE_NIXOS_FLAKE help Enable monitoring services to collect statistics during workflow execution. This allows collection of various system metrics while @@ -19,13 +19,10 @@ config ENABLE_MONITORING Currently supported workflows: - fstests - Not available under NIXOSFL: the kdevops monitoring - role's install-deps step uses apt/dnf without a NixOS branch, and - every consumer workflow (fstests, mmtests, sysbench, ai, minio) is - gated out under that backend anyway. The nixos-flake guest-side - monitoring profile (NIXOS_FLAKE_PROFILE_MONITORING) is the - Nix-native equivalent; the kdevops side needs an orchestrator that - drives those systemd template units, which is unscoped work. + Not available under nixos_flake guests: the kdevops monitoring + role's install-deps step uses apt/dnf without a NixOS branch. + The Nix-native equivalent is NIXOS_FLAKE_PROFILE_MONITORING on + the guest side. if ENABLE_MONITORING diff --git a/kconfigs/workflows/Kconfig b/kconfigs/workflows/Kconfig index 0b0c47ec..00751290 100644 --- a/kconfigs/workflows/Kconfig +++ b/kconfigs/workflows/Kconfig @@ -22,6 +22,7 @@ endmenu choice prompt "Target Linux kernel to use" default WORKFLOW_LINUX_DISTRO if NIXOSFL + default WORKFLOW_LINUX_CUSTOM if NIXOSFI default WORKFLOW_LINUX_DISTRO if !QEMU_ENABLE_EXTRA_DRIVE_LARGEIO default WORKFLOW_LINUX_CUSTOM if QEMU_ENABLE_EXTRA_DRIVE_LARGEIO diff --git a/playbooks/nixosfi.yml b/playbooks/nixosfi.yml new file mode 100644 index 00000000..8f0e1dec --- /dev/null +++ b/playbooks/nixosfi.yml @@ -0,0 +1,23 @@ +--- +- name: Manage imageless NixOS VMs with qemu-system-units + hosts: localhost + vars_files: + - "{{ playbook_dir }}/../extra_vars.yaml" + roles: + - role: nixosfi + +- name: Run nixos-rebuild test on running nixosfi guests + hosts: baseline:dev + gather_facts: false + vars_files: + - "{{ playbook_dir }}/../extra_vars.yaml" + tasks: + - name: Include nixosfi rebuild-test tasks + ansible.builtin.include_role: + name: nixosfi + tasks_from: rebuild-test + apply: + tags: + - rebuild-test + tags: + - rebuild-test diff --git a/playbooks/roles/bootlinux/tasks/config.yml b/playbooks/roles/bootlinux/tasks/config.yml index a54db514..c2288ac6 100644 --- a/playbooks/roles/bootlinux/tasks/config.yml +++ b/playbooks/roles/bootlinux/tasks/config.yml @@ -6,6 +6,13 @@ - "{{ role_path }}/templates/config-kdevops" - "{{ role_path }}/templates/{{ target_linux_config }}" +- name: Prefer the imageless preset under direct-boot + qsu + ansible.builtin.set_fact: + search_list: "{{ [role_path ~ '/templates/config-imageless'] + search_list }}" + when: + - bootlinux_direct_boot | default(false) | bool + - kdevops_enable_nixosfi | default(false) | bool + - name: Find all linux-next kernel config files delegate_to: localhost run_once: true diff --git a/playbooks/roles/bootlinux/templates/config-imageless b/playbooks/roles/bootlinux/templates/config-imageless new file mode 100644 index 00000000..3e5d46a9 --- /dev/null +++ b/playbooks/roles/bootlinux/templates/config-imageless @@ -0,0 +1,2957 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/x86 7.0.0-rc2 Kernel Configuration +# +CONFIG_CC_VERSION_TEXT="Debian clang version 21.1.8 (3+b1)" +CONFIG_GCC_VERSION=0 +CONFIG_CC_IS_CLANG=y +CONFIG_CLANG_VERSION=210108 +CONFIG_AS_IS_LLVM=y +CONFIG_AS_VERSION=210108 +CONFIG_LD_VERSION=0 +CONFIG_LD_IS_LLD=y +CONFIG_LLD_VERSION=210108 +CONFIG_RUSTC_VERSION=109101 +CONFIG_RUST_IS_AVAILABLE=y +CONFIG_RUSTC_LLVM_VERSION=210102 +CONFIG_CC_CAN_LINK=y +CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y +CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y +CONFIG_TOOLS_SUPPORT_RELR=y +CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_ASSUME=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_CC_HAS_COUNTED_BY=y +CONFIG_CC_HAS_BROKEN_COUNTED_BY_REF=y +CONFIG_CC_HAS_MULTIDIMENSIONAL_NONSTRING=y +CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY=y +CONFIG_RUSTC_HAS_SLICE_AS_FLATTENED=y +CONFIG_RUSTC_HAS_COERCE_POINTEE=y +CONFIG_RUSTC_HAS_SPAN_FILE=y +CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES=y +CONFIG_RUSTC_HAS_FILE_WITH_NUL=y +CONFIG_RUSTC_HAS_FILE_AS_C_STR=y +CONFIG_PAHOLE_VERSION=131 +CONFIG_IRQ_WORK=y +CONFIG_BUILDTIME_TABLE_SORT=y +CONFIG_THREAD_INFO_IN_TASK=y + +# +# General setup +# +CONFIG_INIT_ENV_ARG_LIMIT=32 +# CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set +CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION_AUTO=y +CONFIG_BUILD_SALT="" +CONFIG_HAVE_KERNEL_GZIP=y +CONFIG_HAVE_KERNEL_BZIP2=y +CONFIG_HAVE_KERNEL_LZMA=y +CONFIG_HAVE_KERNEL_XZ=y +CONFIG_HAVE_KERNEL_LZO=y +CONFIG_HAVE_KERNEL_LZ4=y +CONFIG_HAVE_KERNEL_ZSTD=y +CONFIG_KERNEL_GZIP=y +# CONFIG_KERNEL_BZIP2 is not set +# CONFIG_KERNEL_LZMA is not set +# CONFIG_KERNEL_XZ is not set +# CONFIG_KERNEL_LZO is not set +# CONFIG_KERNEL_LZ4 is not set +# CONFIG_KERNEL_ZSTD is not set +CONFIG_DEFAULT_INIT="" +CONFIG_DEFAULT_HOSTNAME="(none)" +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_WATCH_QUEUE is not set +CONFIG_CROSS_MEMORY_ATTACH=y +# CONFIG_AUDIT is not set +CONFIG_HAVE_ARCH_AUDITSYSCALL=y + +# +# IRQ subsystem +# +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_PENDING_IRQ=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y +CONFIG_GENERIC_IRQ_RESERVATION_MODE=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_SPARSE_IRQ=y +# CONFIG_GENERIC_IRQ_DEBUGFS is not set +# end of IRQ subsystem + +CONFIG_CLOCKSOURCE_WATCHDOG=y +CONFIG_ARCH_CLOCKSOURCE_INIT=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST_IDLE=y +CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y +CONFIG_GENERIC_CMOS_UPDATE=y +CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y + +# +# Timers subsystem +# +CONFIG_TICK_ONESHOT=y +CONFIG_HZ_PERIODIC=y +# CONFIG_NO_HZ_IDLE is not set +# CONFIG_NO_HZ_FULL is not set +# CONFIG_NO_HZ is not set +CONFIG_HIGH_RES_TIMERS=y +CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=125 +# CONFIG_POSIX_AUX_CLOCKS is not set +# end of Timers subsystem + +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +CONFIG_BPF_SYSCALL=y +CONFIG_BPF_JIT=y +CONFIG_BPF_JIT_ALWAYS_ON=y +CONFIG_BPF_JIT_DEFAULT_ON=y +# CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set +# CONFIG_BPF_PRELOAD is not set +CONFIG_BPF_LSM=y +# end of BPF subsystem + +CONFIG_PREEMPT_BUILD=y +CONFIG_ARCH_HAS_PREEMPT_LAZY=y +# CONFIG_PREEMPT is not set +CONFIG_PREEMPT_LAZY=y +# CONFIG_PREEMPT_RT is not set +CONFIG_PREEMPT_COUNT=y +CONFIG_PREEMPTION=y +# CONFIG_PREEMPT_DYNAMIC is not set +# CONFIG_SCHED_CORE is not set +# CONFIG_SCHED_CLASS_EXT is not set + +# +# CPU/Task time and stats accounting +# +CONFIG_TICK_CPU_ACCOUNTING=y +# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set +# CONFIG_IRQ_TIME_ACCOUNTING is not set +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_TASKSTATS is not set +CONFIG_PSI=y +# CONFIG_PSI_DEFAULT_DISABLED is not set +# end of CPU/Task time and stats accounting + +CONFIG_CPU_ISOLATION=y + +# +# RCU Subsystem +# +CONFIG_TREE_RCU=y +# CONFIG_RCU_EXPERT is not set +CONFIG_TREE_SRCU=y +CONFIG_TASKS_RCU_GENERIC=y +CONFIG_NEED_TASKS_RCU=y +CONFIG_TASKS_RCU=y +CONFIG_TASKS_RUDE_RCU=y +CONFIG_TASKS_TRACE_RCU=y +CONFIG_RCU_STALL_COMMON=y +CONFIG_RCU_NEED_SEGCBLIST=y +# end of RCU Subsystem + +# CONFIG_IKCONFIG is not set +CONFIG_IKHEADERS=y +CONFIG_LOG_BUF_SHIFT=17 +CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 +# CONFIG_PRINTK_INDEX is not set +CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y + +# +# Scheduler features +# +# CONFIG_SCHED_PROXY_EXEC is not set +# end of Scheduler features + +CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y +CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y +CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough" +CONFIG_GCC10_NO_ARRAY_BOUNDS=y +CONFIG_GCC_NO_STRINGOP_OVERFLOW=y +CONFIG_ARCH_SUPPORTS_INT128=y +CONFIG_SLAB_OBJ_EXT=y +CONFIG_CGROUPS=y +CONFIG_PAGE_COUNTER=y +# CONFIG_CGROUP_FAVOR_DYNMODS is not set +CONFIG_MEMCG=y +# CONFIG_MEMCG_V1 is not set +CONFIG_BLK_CGROUP=y +CONFIG_CGROUP_SCHED=y +CONFIG_GROUP_SCHED_WEIGHT=y +CONFIG_GROUP_SCHED_BANDWIDTH=y +CONFIG_FAIR_GROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +# CONFIG_RT_GROUP_SCHED is not set +# CONFIG_CGROUP_PIDS is not set +# CONFIG_CGROUP_RDMA is not set +# CONFIG_CGROUP_DMEM is not set +# CONFIG_CGROUP_FREEZER is not set +# CONFIG_CGROUP_HUGETLB is not set +# CONFIG_CPUSETS is not set +# CONFIG_CGROUP_DEVICE is not set +# CONFIG_CGROUP_CPUACCT is not set +# CONFIG_CGROUP_PERF is not set +CONFIG_CGROUP_BPF=y +# CONFIG_CGROUP_MISC is not set +# CONFIG_CGROUP_DEBUG is not set +CONFIG_SOCK_CGROUP_DATA=y +CONFIG_NAMESPACES=y +CONFIG_UTS_NS=y +CONFIG_TIME_NS=y +CONFIG_IPC_NS=y +CONFIG_USER_NS=y +CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_CHECKPOINT_RESTORE=y +# CONFIG_SCHED_AUTOGROUP is not set +# CONFIG_RELAY is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +# CONFIG_RD_GZIP is not set +# CONFIG_RD_BZIP2 is not set +# CONFIG_RD_LZMA is not set +# CONFIG_RD_XZ is not set +# CONFIG_RD_LZO is not set +# CONFIG_RD_LZ4 is not set +CONFIG_RD_ZSTD=y +# CONFIG_BOOT_CONFIG is not set +CONFIG_CMDLINE_LOG_WRAP_IDEAL_LEN=1021 +# CONFIG_INITRAMFS_PRESERVE_MTIME is not set +CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +CONFIG_LD_ORPHAN_WARN=y +CONFIG_LD_ORPHAN_WARN_LEVEL="warn" +CONFIG_SYSCTL=y +CONFIG_SYSCTL_EXCEPTION_TRACE=y +# CONFIG_SYSFS_SYSCALL is not set +CONFIG_HAVE_PCSPKR_PLATFORM=y +CONFIG_EXPERT=y +CONFIG_MULTIUSER=y +# CONFIG_SGETMASK_SYSCALL is not set +CONFIG_FHANDLE=y +CONFIG_POSIX_TIMERS=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +# CONFIG_PCSPKR_PLATFORM is not set +# CONFIG_BASE_SMALL is not set +CONFIG_FUTEX=y +CONFIG_FUTEX_PI=y +CONFIG_FUTEX_PRIVATE_HASH=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_IO_URING=y +# CONFIG_IO_URING_MOCK_FILE is not set +CONFIG_ADVISE_SYSCALLS=y +CONFIG_MEMBARRIER=y +CONFIG_KCMP=y +# CONFIG_RSEQ is not set +# CONFIG_CACHESTAT_SYSCALL is not set +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_SELFTEST is not set +# CONFIG_KALLSYMS_ALL is not set +CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_ARCH_SUPPORTS_MSEAL_SYSTEM_MAPPINGS=y +CONFIG_HAVE_PERF_EVENTS=y +CONFIG_GUEST_PERF_EVENTS=y +CONFIG_PERF_GUEST_MEDIATED_PMU=y + +# +# Kernel Performance Events And Counters +# +CONFIG_PERF_EVENTS=y +# CONFIG_DEBUG_PERF_USE_VMALLOC is not set +# end of Kernel Performance Events And Counters + +CONFIG_PROFILING=y +# CONFIG_RUST is not set +CONFIG_TRACEPOINTS=y + +# +# Kexec and crash features +# +# CONFIG_KEXEC is not set +# CONFIG_KEXEC_FILE is not set +# end of Kexec and crash features + +# +# Live Update and Kexec HandOver +# +# CONFIG_KEXEC_HANDOVER is not set +# end of Live Update and Kexec HandOver +# end of General setup + +CONFIG_64BIT=y +CONFIG_X86_64=y +CONFIG_X86=y +CONFIG_INSTRUCTION_DECODER=y +CONFIG_OUTPUT_FORMAT="elf64-x86-64" +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_MMU=y +CONFIG_ARCH_MMAP_RND_BITS_MIN=28 +CONFIG_ARCH_MMAP_RND_BITS_MAX=32 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_ARCH_HAS_CPU_RELAX=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_AUDIT_ARCH=y +CONFIG_ARCH_SUPPORTS_UPROBES=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_PGTABLE_LEVELS=5 + +# +# Processor type and features +# +CONFIG_SMP=y +# CONFIG_X86_X2APIC is not set +# CONFIG_X86_MPPARSE is not set +CONFIG_X86_FRED=y +# CONFIG_X86_EXTENDED_PLATFORM is not set +# CONFIG_X86_INTEL_LPSS is not set +# CONFIG_X86_AMD_PLATFORM_DEVICE is not set +# CONFIG_IOSF_MBI is not set +# CONFIG_SCHED_OMIT_FRAME_POINTER is not set +CONFIG_HYPERVISOR_GUEST=y +CONFIG_PARAVIRT=y +# CONFIG_PARAVIRT_SPINLOCKS is not set +CONFIG_X86_HV_CALLBACK_VECTOR=y +# CONFIG_XEN is not set +CONFIG_KVM_GUEST=y +CONFIG_ARCH_CPUIDLE_HALTPOLL=y +# CONFIG_PVH is not set +# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set +CONFIG_PARAVIRT_CLOCK=y +# CONFIG_JAILHOUSE_GUEST is not set +# CONFIG_ACRN_GUEST is not set +# CONFIG_BHYVE_GUEST is not set +CONFIG_CC_HAS_MARCH_NATIVE=y +# CONFIG_X86_NATIVE_CPU is not set +CONFIG_X86_INTERNODE_CACHE_SHIFT=6 +CONFIG_X86_L1_CACHE_SHIFT=6 +CONFIG_X86_TSC=y +CONFIG_X86_HAVE_PAE=y +CONFIG_X86_CX8=y +CONFIG_X86_CMOV=y +CONFIG_X86_MINIMUM_CPU_FAMILY=64 +CONFIG_X86_DEBUGCTLMSR=y +CONFIG_IA32_FEAT_CTL=y +CONFIG_X86_VMX_FEATURE_NAMES=y +# CONFIG_PROCESSOR_SELECT is not set +CONFIG_BROADCAST_TLB_FLUSH=y +CONFIG_CPU_SUP_INTEL=y +CONFIG_CPU_SUP_AMD=y +CONFIG_CPU_SUP_HYGON=y +CONFIG_CPU_SUP_CENTAUR=y +CONFIG_CPU_SUP_ZHAOXIN=y +CONFIG_HPET_TIMER=y +CONFIG_DMI=y +# CONFIG_GART_IOMMU is not set +# CONFIG_MAXSMP is not set +CONFIG_NR_CPUS_RANGE_BEGIN=2 +CONFIG_NR_CPUS_RANGE_END=512 +CONFIG_NR_CPUS_DEFAULT=64 +CONFIG_NR_CPUS=64 +CONFIG_X86_LOCAL_APIC=y +CONFIG_ACPI_MADT_WAKEUP=y +CONFIG_X86_IO_APIC=y +# CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set +# CONFIG_X86_MCE is not set + +# +# Performance monitoring +# +# CONFIG_PERF_EVENTS_INTEL_UNCORE is not set +# CONFIG_PERF_EVENTS_INTEL_RAPL is not set +# CONFIG_PERF_EVENTS_INTEL_CSTATE is not set +CONFIG_PERF_EVENTS_AMD_POWER=m +CONFIG_PERF_EVENTS_AMD_UNCORE=m +CONFIG_PERF_EVENTS_AMD_BRS=y +# end of Performance monitoring + +# CONFIG_X86_VSYSCALL_EMULATION is not set +# CONFIG_X86_IOPL_IOPERM is not set +CONFIG_MICROCODE=y +# CONFIG_MICROCODE_LATE_LOADING is not set +# CONFIG_MICROCODE_DBG is not set +# CONFIG_X86_MSR is not set +# CONFIG_X86_CPUID is not set +CONFIG_X86_DIRECT_GBPAGES=y +# CONFIG_X86_CPA_STATISTICS is not set +# CONFIG_NUMA is not set +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SPARSEMEM_DEFAULT=y +# CONFIG_ARCH_MEMORY_PROBE is not set +CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 +# CONFIG_X86_PMEM_LEGACY is not set +# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set +# CONFIG_MTRR is not set +# CONFIG_X86_UMIP is not set +CONFIG_CC_HAS_IBT=y +# CONFIG_X86_KERNEL_IBT is not set +# CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set +CONFIG_ARCH_PKEY_BITS=4 +# CONFIG_X86_INTEL_TSX_MODE_OFF is not set +# CONFIG_X86_INTEL_TSX_MODE_ON is not set +CONFIG_X86_INTEL_TSX_MODE_AUTO=y +# CONFIG_X86_USER_SHADOW_STACK is not set +# CONFIG_EFI is not set +# CONFIG_HZ_100 is not set +CONFIG_HZ_250=y +# CONFIG_HZ_300 is not set +# CONFIG_HZ_1000 is not set +CONFIG_HZ=250 +CONFIG_SCHED_HRTICK=y +CONFIG_ARCH_SUPPORTS_KEXEC=y +CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y +CONFIG_ARCH_SUPPORTS_KEXEC_PURGATORY=y +CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y +CONFIG_ARCH_SUPPORTS_KEXEC_SIG_FORCE=y +CONFIG_ARCH_SUPPORTS_KEXEC_BZIMAGE_VERIFY_SIG=y +CONFIG_ARCH_SUPPORTS_KEXEC_JUMP=y +CONFIG_ARCH_SUPPORTS_KEXEC_HANDOVER=y +CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y +CONFIG_ARCH_DEFAULT_CRASH_DUMP=y +CONFIG_ARCH_SUPPORTS_CRASH_HOTPLUG=y +CONFIG_PHYSICAL_START=0x1000000 +# CONFIG_RELOCATABLE is not set +CONFIG_PHYSICAL_ALIGN=0x200000 +# CONFIG_ADDRESS_MASKING is not set +CONFIG_HOTPLUG_CPU=y +CONFIG_LEGACY_VSYSCALL_XONLY=y +# CONFIG_LEGACY_VSYSCALL_NONE is not set +# CONFIG_CMDLINE_BOOL is not set +# CONFIG_MODIFY_LDT_SYSCALL is not set +# CONFIG_STRICT_SIGALTSTACK_SIZE is not set +CONFIG_HAVE_LIVEPATCH=y +CONFIG_HAVE_KLP_BUILD=y +# CONFIG_X86_BUS_LOCK_DETECT is not set +# end of Processor type and features + +CONFIG_CC_HAS_NAMED_AS_FIXED_SANITIZERS=y +CONFIG_CC_HAS_SLS=y +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_CC_HAS_ENTRY_PADDING=y +CONFIG_CC_HAS_KCFI_ARITY=y +CONFIG_FUNCTION_PADDING_CFI=11 +CONFIG_FUNCTION_PADDING_BYTES=16 +# CONFIG_CPU_MITIGATIONS is not set +CONFIG_ARCH_HAS_ADD_PAGES=y + +# +# Power management and ACPI options +# +# CONFIG_SUSPEND is not set +# CONFIG_PM is not set +CONFIG_ARCH_SUPPORTS_ACPI=y +CONFIG_ACPI=y +CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y +CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y +CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y +# CONFIG_ACPI_DEBUGGER is not set +# CONFIG_ACPI_SPCR_TABLE is not set +# CONFIG_ACPI_FPDT is not set +CONFIG_ACPI_LPIT=y +# CONFIG_ACPI_REV_OVERRIDE_POSSIBLE is not set +# CONFIG_ACPI_EC is not set +# CONFIG_ACPI_AC is not set +# CONFIG_ACPI_BATTERY is not set +# CONFIG_ACPI_BUTTON is not set +CONFIG_ACPI_TINY_POWER_BUTTON=y +CONFIG_ACPI_TINY_POWER_BUTTON_SIGNAL=38 +# CONFIG_ACPI_DOCK is not set +# CONFIG_ACPI_PROCESSOR is not set +CONFIG_ACPI_CUSTOM_DSDT_FILE="" +CONFIG_ARCH_HAS_ACPI_TABLE_UPGRADE=y +# CONFIG_ACPI_TABLE_UPGRADE is not set +# CONFIG_ACPI_DEBUG is not set +# CONFIG_ACPI_PCI_SLOT is not set +# CONFIG_ACPI_CONTAINER is not set +# CONFIG_ACPI_HOTPLUG_MEMORY is not set +CONFIG_ACPI_HOTPLUG_IOAPIC=y +# CONFIG_ACPI_HED is not set +# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set +# CONFIG_ACPI_NFIT is not set +CONFIG_HAVE_ACPI_APEI=y +CONFIG_HAVE_ACPI_APEI_NMI=y +# CONFIG_ACPI_APEI is not set +# CONFIG_ACPI_DPTF is not set +# CONFIG_ACPI_CONFIGFS is not set +# CONFIG_ACPI_PFRUT is not set +# CONFIG_ACPI_FFH is not set +CONFIG_ACPI_MRRM=y +# CONFIG_PMIC_OPREGION is not set +# CONFIG_X86_PM_TIMER is not set + +# +# CPU Frequency scaling +# +# CONFIG_CPU_FREQ is not set +# end of CPU Frequency scaling + +# +# CPU Idle +# +# CONFIG_CPU_IDLE is not set +# end of CPU Idle +# end of Power management and ACPI options + +# +# Bus options (PCI etc.) +# +CONFIG_PCI_DIRECT=y +# CONFIG_PCI_MMCONFIG is not set +# CONFIG_ISA_BUS is not set +# CONFIG_ISA_DMA_API is not set +CONFIG_AMD_NB=y +CONFIG_AMD_NODE=y +# end of Bus options (PCI etc.) + +# +# Binary Emulations +# +# CONFIG_IA32_EMULATION is not set +# end of Binary Emulations + +CONFIG_KVM_COMMON=y +CONFIG_HAVE_KVM_PFNCACHE=y +CONFIG_HAVE_KVM_IRQCHIP=y +CONFIG_HAVE_KVM_IRQ_ROUTING=y +CONFIG_HAVE_KVM_DIRTY_RING=y +CONFIG_HAVE_KVM_DIRTY_RING_TSO=y +CONFIG_HAVE_KVM_DIRTY_RING_ACQ_REL=y +CONFIG_KVM_MMIO=y +CONFIG_KVM_ASYNC_PF=y +CONFIG_HAVE_KVM_MSI=y +CONFIG_HAVE_KVM_READONLY_MEM=y +CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y +CONFIG_KVM_VFIO=y +CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y +CONFIG_KVM_GENERIC_PRE_FAULT_MEMORY=y +CONFIG_HAVE_KVM_IRQ_BYPASS=m +CONFIG_HAVE_KVM_NO_POLL=y +CONFIG_VIRT_XFER_TO_GUEST_WORK=y +CONFIG_KVM_GENERIC_HARDWARE_ENABLING=y +CONFIG_KVM_ELIDE_TLB_FLUSH_IF_YOUNG=y +CONFIG_KVM_MMU_LOCKLESS_AGING=y +CONFIG_KVM_GUEST_MEMFD=y +CONFIG_VIRTUALIZATION=y +CONFIG_KVM_X86=m +CONFIG_KVM=m +# CONFIG_KVM_WERROR is not set +# CONFIG_KVM_SW_PROTECTED_VM is not set +CONFIG_KVM_INTEL=m +# CONFIG_KVM_INTEL_PROVE_VE is not set +CONFIG_KVM_AMD=m +CONFIG_KVM_IOAPIC=y +CONFIG_KVM_SMM=y +# CONFIG_KVM_HYPERV is not set +# CONFIG_KVM_XEN is not set +# CONFIG_KVM_PROVE_MMU is not set +CONFIG_KVM_MAX_NR_VCPUS=1024 +CONFIG_X86_REQUIRED_FEATURE_ALWAYS=y +CONFIG_X86_REQUIRED_FEATURE_NOPL=y +CONFIG_X86_REQUIRED_FEATURE_CX8=y +CONFIG_X86_REQUIRED_FEATURE_CMOV=y +CONFIG_X86_REQUIRED_FEATURE_CPUID=y +CONFIG_X86_REQUIRED_FEATURE_FPU=y +CONFIG_X86_REQUIRED_FEATURE_PAE=y +CONFIG_X86_REQUIRED_FEATURE_PSE=y +CONFIG_X86_REQUIRED_FEATURE_PGE=y +CONFIG_X86_REQUIRED_FEATURE_MSR=y +CONFIG_X86_REQUIRED_FEATURE_FXSR=y +CONFIG_X86_REQUIRED_FEATURE_XMM=y +CONFIG_X86_REQUIRED_FEATURE_XMM2=y +CONFIG_X86_REQUIRED_FEATURE_LM=y +CONFIG_X86_DISABLED_FEATURE_UMIP=y +CONFIG_X86_DISABLED_FEATURE_VME=y +CONFIG_X86_DISABLED_FEATURE_K6_MTRR=y +CONFIG_X86_DISABLED_FEATURE_CYRIX_ARR=y +CONFIG_X86_DISABLED_FEATURE_CENTAUR_MCR=y +CONFIG_X86_DISABLED_FEATURE_PKU=y +CONFIG_X86_DISABLED_FEATURE_OSPKE=y +CONFIG_X86_DISABLED_FEATURE_PTI=y +CONFIG_X86_DISABLED_FEATURE_RETPOLINE=y +CONFIG_X86_DISABLED_FEATURE_RETPOLINE_LFENCE=y +CONFIG_X86_DISABLED_FEATURE_RETHUNK=y +CONFIG_X86_DISABLED_FEATURE_UNRET=y +CONFIG_X86_DISABLED_FEATURE_CALL_DEPTH=y +CONFIG_X86_DISABLED_FEATURE_LAM=y +CONFIG_X86_DISABLED_FEATURE_ENQCMD=y +CONFIG_X86_DISABLED_FEATURE_SGX=y +CONFIG_X86_DISABLED_FEATURE_XENPV=y +CONFIG_X86_DISABLED_FEATURE_TDX_GUEST=y +CONFIG_X86_DISABLED_FEATURE_USER_SHSTK=y +CONFIG_X86_DISABLED_FEATURE_IBT=y +CONFIG_X86_DISABLED_FEATURE_SEV_SNP=y +CONFIG_AS_WRUSS=y +CONFIG_ARCH_CONFIGURES_CPU_MITIGATIONS=y + +# +# General architecture-dependent options +# +CONFIG_HOTPLUG_SMT=y +CONFIG_ARCH_SUPPORTS_SCHED_SMT=y +CONFIG_ARCH_SUPPORTS_SCHED_CLUSTER=y +CONFIG_ARCH_SUPPORTS_SCHED_MC=y +CONFIG_SCHED_SMT=y +# CONFIG_SCHED_CLUSTER is not set +# CONFIG_SCHED_MC is not set +CONFIG_HOTPLUG_CORE_SYNC=y +CONFIG_HOTPLUG_CORE_SYNC_DEAD=y +CONFIG_HOTPLUG_CORE_SYNC_FULL=y +CONFIG_HOTPLUG_SPLIT_STARTUP=y +CONFIG_HOTPLUG_PARALLEL=y +CONFIG_GENERIC_IRQ_ENTRY=y +CONFIG_GENERIC_SYSCALL=y +CONFIG_GENERIC_ENTRY=y +CONFIG_KPROBES=y +# CONFIG_JUMP_LABEL is not set +# CONFIG_STATIC_CALL_SELFTEST is not set +CONFIG_OPTPROBES=y +CONFIG_KPROBES_ON_FTRACE=y +CONFIG_UPROBES=y +CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y +CONFIG_ARCH_USE_BUILTIN_BSWAP=y +CONFIG_KRETPROBES=y +CONFIG_KRETPROBE_ON_RETHOOK=y +CONFIG_USER_RETURN_NOTIFIER=y +CONFIG_HAVE_IOREMAP_PROT=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_OPTPROBES=y +CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y +CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y +CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_CONTIGUOUS=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_ARCH_HAS_FORTIFY_SOURCE=y +CONFIG_ARCH_HAS_SET_MEMORY=y +CONFIG_ARCH_HAS_SET_DIRECT_MAP=y +CONFIG_ARCH_HAS_CPU_FINALIZE_INIT=y +CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y +CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_ARCH_WANTS_NO_INSTR=y +CONFIG_HAVE_ASM_MODVERSIONS=y +CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_RUST=y +CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y +CONFIG_HAVE_HW_BREAKPOINT=y +CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y +CONFIG_HAVE_USER_RETURN_NOTIFIER=y +CONFIG_HAVE_PERF_EVENTS_NMI=y +CONFIG_HAVE_HARDLOCKUP_DETECTOR_PERF=y +CONFIG_UNWIND_USER=y +CONFIG_HAVE_UNWIND_USER_FP=y +CONFIG_HAVE_PERF_REGS=y +CONFIG_HAVE_PERF_USER_STACK_DUMP=y +CONFIG_HAVE_ARCH_JUMP_LABEL=y +CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_TABLE_FREE=y +CONFIG_MMU_GATHER_RCU_TABLE_FREE=y +CONFIG_MMU_GATHER_MERGE_VMAS=y +CONFIG_ARCH_WANT_IRQS_OFF_ACTIVATE_MM=y +CONFIG_MMU_LAZY_TLB_REFCOUNT=y +CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y +CONFIG_ARCH_HAVE_EXTRA_ELF_NOTES=y +CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS=y +CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y +CONFIG_HAVE_CMPXCHG_LOCAL=y +CONFIG_HAVE_CMPXCHG_DOUBLE=y +CONFIG_HAVE_ARCH_SECCOMP=y +CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +CONFIG_SECCOMP=y +CONFIG_SECCOMP_FILTER=y +# CONFIG_SECCOMP_CACHE_DEBUG is not set +CONFIG_HAVE_ARCH_KSTACK_ERASE=y +CONFIG_HAVE_STACKPROTECTOR=y +# CONFIG_STACKPROTECTOR is not set +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_HAS_LTO_CLANG=y +CONFIG_LTO_NONE=y +# CONFIG_LTO_CLANG_FULL is not set +# CONFIG_LTO_CLANG_THIN is not set +CONFIG_ARCH_SUPPORTS_AUTOFDO_CLANG=y +# CONFIG_AUTOFDO_CLANG is not set +CONFIG_ARCH_SUPPORTS_PROPELLER_CLANG=y +# CONFIG_PROPELLER_CLANG is not set +CONFIG_ARCH_SUPPORTS_CFI=y +# CONFIG_CFI is not set +CONFIG_HAVE_CFI_ICALL_NORMALIZE_INTEGERS=y +CONFIG_HAVE_CFI_ICALL_NORMALIZE_INTEGERS_RUSTC=y +CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y +CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y +CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_PV_STEAL_CLOCK_GEN=y +CONFIG_HAVE_MOVE_PUD=y +CONFIG_HAVE_MOVE_PMD=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y +CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y +CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y +CONFIG_ARCH_WANT_PMD_MKWRITE=y +CONFIG_HAVE_ARCH_SOFT_DIRTY=y +CONFIG_HAVE_MOD_ARCH_SPECIFIC=y +CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_ARCH_HAS_EXECMEM_ROX=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y +CONFIG_ARCH_HAS_ELF_RANDOMIZE=y +CONFIG_HAVE_ARCH_MMAP_RND_BITS=y +CONFIG_HAVE_EXIT_THREAD=y +CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_HAVE_PAGE_SIZE_4KB=y +CONFIG_PAGE_SIZE_4KB=y +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_PAGE_SHIFT=12 +CONFIG_HAVE_OBJTOOL=y +CONFIG_HAVE_JUMP_LABEL_HACK=y +CONFIG_HAVE_NOINSTR_HACK=y +CONFIG_HAVE_NOINSTR_VALIDATION=y +CONFIG_HAVE_UACCESS_VALIDATION=y +CONFIG_HAVE_STACK_VALIDATION=y +CONFIG_HAVE_RELIABLE_STACKTRACE=y +# CONFIG_COMPAT_32BIT_TIME is not set +CONFIG_ARCH_SUPPORTS_RT=y +CONFIG_HAVE_ARCH_VMAP_STACK=y +# CONFIG_VMAP_STACK is not set +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET is not set +CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y +CONFIG_STRICT_MODULE_RWX=y +CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y +# CONFIG_LOCK_EVENT_COUNTS is not set +CONFIG_ARCH_HAS_MEM_ENCRYPT=y +CONFIG_HAVE_STATIC_CALL=y +CONFIG_HAVE_STATIC_CALL_INLINE=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y +CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y +CONFIG_ARCH_HAS_ELFCORE_COMPAT=y +CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y +CONFIG_DYNAMIC_SIGFRAME=y +CONFIG_ARCH_HAS_HW_PTE_YOUNG=y +CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y +CONFIG_ARCH_HAS_KERNEL_FPU_SUPPORT=y +CONFIG_HAVE_GENERIC_TIF_BITS=y + +# +# GCOV-based kernel profiling +# +# CONFIG_GCOV_KERNEL is not set +CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y +# end of GCOV-based kernel profiling + +CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_FUNCTION_ALIGNMENT_4B=y +CONFIG_FUNCTION_ALIGNMENT_16B=y +CONFIG_FUNCTION_ALIGNMENT=16 +CONFIG_CC_HAS_SANE_FUNCTION_ALIGNMENT=y +# end of General architecture-dependent options + +CONFIG_RT_MUTEXES=y +CONFIG_MODULES=y +CONFIG_MODULE_DEBUGFS=y +# CONFIG_MODULE_DEBUG is not set +# CONFIG_MODULE_FORCE_LOAD is not set +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +CONFIG_MODULE_UNLOAD_TAINT_TRACKING=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +# CONFIG_MODULE_SIG is not set +# CONFIG_MODULE_COMPRESS is not set +# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set +CONFIG_MODPROBE_PATH="/sbin/modprobe" +# CONFIG_TRIM_UNUSED_KSYMS is not set +CONFIG_MODULES_TREE_LOOKUP=y +CONFIG_BLOCK=y +# CONFIG_BLOCK_LEGACY_AUTOLOAD is not set +CONFIG_BLK_DEV_BSG_COMMON=y +# CONFIG_BLK_DEV_BSGLIB is not set +# CONFIG_BLK_DEV_INTEGRITY is not set +# CONFIG_BLK_DEV_WRITE_MOUNTED is not set +CONFIG_BLK_DEV_ZONED=y +# CONFIG_BLK_WBT is not set +# CONFIG_BLK_DEBUG_FS is not set +CONFIG_BLK_INLINE_ENCRYPTION=y +CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +CONFIG_EFI_PARTITION=y +# end of Partition Types + +# +# IO Schedulers +# +# CONFIG_MQ_IOSCHED_DEADLINE is not set +# CONFIG_MQ_IOSCHED_KYBER is not set +# CONFIG_IOSCHED_BFQ is not set +# end of IO Schedulers + +CONFIG_PREEMPT_NOTIFIERS=y +CONFIG_PADATA=y +CONFIG_UNINLINE_SPIN_UNLOCK=y +CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y +CONFIG_QUEUED_SPINLOCKS=y +CONFIG_ARCH_USE_QUEUED_RWLOCKS=y +CONFIG_QUEUED_RWLOCKS=y +CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y +CONFIG_ARCH_HAS_SYNC_CORE_BEFORE_USERMODE=y +CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +CONFIG_ELFCORE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_BINFMT_SCRIPT=y +CONFIG_BINFMT_MISC=y +CONFIG_COREDUMP=y +# end of Executable file formats + +# +# Memory Management options +# +CONFIG_SWAP=y + +# +# Slab allocator options +# +CONFIG_SLUB=y +CONFIG_KVFREE_RCU_BATCHED=y +# CONFIG_SLUB_TINY is not set +# CONFIG_SLAB_MERGE_DEFAULT is not set +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLAB_BUCKETS is not set +# CONFIG_SLUB_STATS is not set +# CONFIG_RANDOM_KMALLOC_CACHES is not set +# end of Slab allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set +CONFIG_SPARSEMEM=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y +CONFIG_SPARSEMEM_VMEMMAP=y +CONFIG_SPARSEMEM_VMEMMAP_PREINIT=y +CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP=y +CONFIG_ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP=y +CONFIG_ARCH_WANT_HUGETLB_VMEMMAP_PREINIT=y +CONFIG_HAVE_GUP_FAST=y +CONFIG_MEMORY_ISOLATION=y +CONFIG_HAVE_BOOTMEM_INFO_NODE=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y +CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y +CONFIG_MEMORY_HOTPLUG=y +CONFIG_MHP_DEFAULT_ONLINE_TYPE_OFFLINE=y +# CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_AUTO is not set +# CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_KERNEL is not set +# CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_MOVABLE is not set +CONFIG_MEMORY_HOTREMOVE=y +CONFIG_MHP_MEMMAP_ON_MEMORY=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y +CONFIG_SPLIT_PTE_PTLOCKS=y +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_SPLIT_PMD_PTLOCKS=y +CONFIG_COMPACTION=y +CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 +# CONFIG_PAGE_REPORTING is not set +CONFIG_MIGRATION=y +CONFIG_DEVICE_MIGRATION=y +CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y +CONFIG_ARCH_ENABLE_THP_MIGRATION=y +CONFIG_CONTIG_ALLOC=y +CONFIG_PCP_BATCH_SCALE_MAX=5 +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_MMU_NOTIFIER=y +# CONFIG_KSM is not set +CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y +CONFIG_ARCH_WANTS_THP_SWAP=y +# CONFIG_PERSISTENT_HUGE_ZERO_FOLIO is not set +CONFIG_MM_ID=y +CONFIG_TRANSPARENT_HUGEPAGE=y +CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y +# CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set +# CONFIG_TRANSPARENT_HUGEPAGE_NEVER is not set +CONFIG_TRANSPARENT_HUGEPAGE_SHMEM_HUGE_NEVER=y +# CONFIG_TRANSPARENT_HUGEPAGE_SHMEM_HUGE_ALWAYS is not set +# CONFIG_TRANSPARENT_HUGEPAGE_SHMEM_HUGE_WITHIN_SIZE is not set +# CONFIG_TRANSPARENT_HUGEPAGE_SHMEM_HUGE_ADVISE is not set +CONFIG_TRANSPARENT_HUGEPAGE_TMPFS_HUGE_NEVER=y +# CONFIG_TRANSPARENT_HUGEPAGE_TMPFS_HUGE_ALWAYS is not set +# CONFIG_TRANSPARENT_HUGEPAGE_TMPFS_HUGE_WITHIN_SIZE is not set +# CONFIG_TRANSPARENT_HUGEPAGE_TMPFS_HUGE_ADVISE is not set +# CONFIG_READ_ONLY_THP_FOR_FS is not set +# CONFIG_NO_PAGE_MAPCOUNT is not set +CONFIG_PAGE_MAPCOUNT=y +CONFIG_PGTABLE_HAS_HUGE_LEAVES=y +CONFIG_HAVE_GIGANTIC_FOLIOS=y +CONFIG_ARCH_SUPPORTS_HUGE_PFNMAP=y +CONFIG_ARCH_SUPPORTS_PMD_PFNMAP=y +CONFIG_ARCH_SUPPORTS_PUD_PFNMAP=y +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y +CONFIG_CMA=y +# CONFIG_CMA_DEBUGFS is not set +CONFIG_CMA_SYSFS=y +CONFIG_CMA_AREAS=8 +CONFIG_PAGE_BLOCK_MAX_ORDER=10 +# CONFIG_MEM_SOFT_DIRTY is not set +CONFIG_GENERIC_EARLY_IOREMAP=y +# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set +CONFIG_PAGE_IDLE_FLAG=y +# CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +CONFIG_ZONE_DMA=y +CONFIG_ZONE_DMA32=y +CONFIG_ZONE_DEVICE=y +# CONFIG_DEVICE_PRIVATE is not set +CONFIG_VM_EVENT_COUNTERS=y +# CONFIG_PERCPU_STATS is not set +# CONFIG_GUP_TEST is not set +# CONFIG_DMAPOOL_TEST is not set +CONFIG_ARCH_HAS_PTE_SPECIAL=y +CONFIG_MEMFD_CREATE=y +# CONFIG_SECRETMEM is not set +# CONFIG_ANON_VMA_NAME is not set +# CONFIG_USERFAULTFD is not set +# CONFIG_LRU_GEN is not set +CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y +CONFIG_PER_VMA_LOCK=y +CONFIG_LOCK_MM_AND_FIND_VMA=y +CONFIG_EXECMEM=y +CONFIG_PT_RECLAIM=y + +# +# Data Access Monitoring +# +CONFIG_DAMON=y +CONFIG_DAMON_VADDR=y +CONFIG_DAMON_PADDR=y +CONFIG_DAMON_SYSFS=y +CONFIG_DAMON_RECLAIM=y +CONFIG_DAMON_LRU_SORT=y +CONFIG_DAMON_STAT=y +CONFIG_DAMON_STAT_ENABLED_DEFAULT=y +# end of Data Access Monitoring +# end of Memory Management options + +CONFIG_NET=y +CONFIG_NET_INGRESS=y +CONFIG_NET_EGRESS=y +CONFIG_NET_XGRESS=y + +# +# Networking options +# +CONFIG_PACKET=m +# CONFIG_PACKET_DIAG is not set +# CONFIG_INET_PSP is not set +CONFIG_UNIX=y +# CONFIG_AF_UNIX_OOB is not set +CONFIG_UNIX_DIAG=y +# CONFIG_TLS is not set +# CONFIG_XFRM_USER is not set +# CONFIG_NET_KEY is not set +# CONFIG_DIBS is not set +# CONFIG_XDP_SOCKETS is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +# CONFIG_IP_PNP_BOOTP is not set +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE_DEMUX is not set +CONFIG_NET_IP_TUNNEL=y +CONFIG_SYN_COOKIES=y +# CONFIG_NET_IPVTI is not set +CONFIG_NET_UDP_TUNNEL=y +# CONFIG_NET_FOU is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 +# CONFIG_INET_DIAG is not set +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +CONFIG_IPV6=m +# CONFIG_IPV6_ROUTER_PREF is not set +# CONFIG_IPV6_OPTIMISTIC_DAD is not set +# CONFIG_INET6_AH is not set +# CONFIG_INET6_ESP is not set +# CONFIG_INET6_IPCOMP is not set +# CONFIG_IPV6_MIP6 is not set +# CONFIG_IPV6_ILA is not set +# CONFIG_IPV6_VTI is not set +# CONFIG_IPV6_SIT is not set +# CONFIG_IPV6_TUNNEL is not set +CONFIG_IPV6_MULTIPLE_TABLES=y +# CONFIG_IPV6_SUBTREES is not set +# CONFIG_IPV6_MROUTE is not set +CONFIG_IPV6_SEG6_LWTUNNEL=y +# CONFIG_IPV6_SEG6_HMAC is not set +# CONFIG_IPV6_RPL_LWTUNNEL is not set +# CONFIG_IPV6_IOAM6_LWTUNNEL is not set +# CONFIG_NETLABEL is not set +# CONFIG_MPTCP is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETWORK_PHY_TIMESTAMPING is not set +CONFIG_NETFILTER=y +CONFIG_NETFILTER_ADVANCED=y + +# +# Core Netfilter Configuration +# +# CONFIG_NETFILTER_INGRESS is not set +# CONFIG_NETFILTER_EGRESS is not set +CONFIG_NETFILTER_BPF_LINK=y +# CONFIG_NETFILTER_NETLINK_ACCT is not set +# CONFIG_NETFILTER_NETLINK_QUEUE is not set +# CONFIG_NETFILTER_NETLINK_LOG is not set +# CONFIG_NETFILTER_NETLINK_OSF is not set +# CONFIG_NF_CONNTRACK is not set +# CONFIG_NF_LOG_SYSLOG is not set +# CONFIG_NF_TABLES is not set +CONFIG_NETFILTER_XTABLES=y +# CONFIG_NETFILTER_XTABLES_LEGACY is not set + +# +# Xtables combined modules +# +# CONFIG_NETFILTER_XT_MARK is not set + +# +# Xtables targets +# +# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set +# CONFIG_NETFILTER_XT_TARGET_HMARK is not set +# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set +# CONFIG_NETFILTER_XT_TARGET_LOG is not set +# CONFIG_NETFILTER_XT_TARGET_MARK is not set +# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set +# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set +# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set +# CONFIG_NETFILTER_XT_TARGET_TEE is not set +# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set + +# +# Xtables matches +# +# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set +CONFIG_NETFILTER_XT_MATCH_BPF=y +# CONFIG_NETFILTER_XT_MATCH_CGROUP is not set +# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set +# CONFIG_NETFILTER_XT_MATCH_CPU is not set +# CONFIG_NETFILTER_XT_MATCH_DCCP is not set +# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set +# CONFIG_NETFILTER_XT_MATCH_DSCP is not set +# CONFIG_NETFILTER_XT_MATCH_ECN is not set +# CONFIG_NETFILTER_XT_MATCH_ESP is not set +# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_HL is not set +# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set +# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set +# CONFIG_NETFILTER_XT_MATCH_L2TP is not set +# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set +# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_MAC is not set +# CONFIG_NETFILTER_XT_MATCH_MARK is not set +# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set +# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set +# CONFIG_NETFILTER_XT_MATCH_OSF is not set +# CONFIG_NETFILTER_XT_MATCH_OWNER is not set +# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set +# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set +# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set +# CONFIG_NETFILTER_XT_MATCH_REALM is not set +# CONFIG_NETFILTER_XT_MATCH_RECENT is not set +# CONFIG_NETFILTER_XT_MATCH_SCTP is not set +# CONFIG_NETFILTER_XT_MATCH_SOCKET is not set +# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set +# CONFIG_NETFILTER_XT_MATCH_STRING is not set +# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set +# CONFIG_NETFILTER_XT_MATCH_TIME is not set +# CONFIG_NETFILTER_XT_MATCH_U32 is not set +# end of Core Netfilter Configuration + +# CONFIG_IP_SET is not set +# CONFIG_IP_VS is not set + +# +# IP: Netfilter Configuration +# +# CONFIG_NF_SOCKET_IPV4 is not set +# CONFIG_NF_TPROXY_IPV4 is not set +# CONFIG_NF_DUP_IPV4 is not set +# CONFIG_NF_LOG_ARP is not set +# CONFIG_NF_LOG_IPV4 is not set +# CONFIG_NF_REJECT_IPV4 is not set +# CONFIG_IP_NF_IPTABLES is not set +# end of IP: Netfilter Configuration + +# +# IPv6: Netfilter Configuration +# +# CONFIG_NF_SOCKET_IPV6 is not set +# CONFIG_NF_TPROXY_IPV6 is not set +# CONFIG_NF_DUP_IPV6 is not set +# CONFIG_NF_REJECT_IPV6 is not set +# CONFIG_NF_LOG_IPV6 is not set +# CONFIG_IP6_NF_IPTABLES is not set +# end of IPv6: Netfilter Configuration + +# CONFIG_IP_SCTP is not set +# CONFIG_RDS is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_L2TP is not set +# CONFIG_BRIDGE is not set +# CONFIG_NET_DSA is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_LLC2 is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_PHONET is not set +# CONFIG_6LOWPAN is not set +# CONFIG_IEEE802154 is not set +CONFIG_NET_SCHED=y + +# +# Queueing/Scheduling +# +# CONFIG_NET_SCH_HTB is not set +# CONFIG_NET_SCH_HFSC is not set +# CONFIG_NET_SCH_PRIO is not set +# CONFIG_NET_SCH_MULTIQ is not set +# CONFIG_NET_SCH_RED is not set +# CONFIG_NET_SCH_SFB is not set +CONFIG_NET_SCH_SFQ=y +# CONFIG_NET_SCH_TEQL is not set +# CONFIG_NET_SCH_TBF is not set +# CONFIG_NET_SCH_CBS is not set +# CONFIG_NET_SCH_ETF is not set +# CONFIG_NET_SCH_TAPRIO is not set +# CONFIG_NET_SCH_GRED is not set +# CONFIG_NET_SCH_NETEM is not set +# CONFIG_NET_SCH_DRR is not set +# CONFIG_NET_SCH_MQPRIO is not set +# CONFIG_NET_SCH_SKBPRIO is not set +# CONFIG_NET_SCH_CHOKE is not set +# CONFIG_NET_SCH_QFQ is not set +# CONFIG_NET_SCH_CODEL is not set +# CONFIG_NET_SCH_FQ_CODEL is not set +# CONFIG_NET_SCH_CAKE is not set +# CONFIG_NET_SCH_FQ is not set +# CONFIG_NET_SCH_HHF is not set +# CONFIG_NET_SCH_PIE is not set +# CONFIG_NET_SCH_INGRESS is not set +# CONFIG_NET_SCH_PLUG is not set +# CONFIG_NET_SCH_ETS is not set +# CONFIG_NET_SCH_BPF is not set +# CONFIG_NET_SCH_DUALPI2 is not set +# CONFIG_NET_SCH_DEFAULT is not set + +# +# Classification +# +CONFIG_NET_CLS=y +# CONFIG_NET_CLS_BASIC is not set +# CONFIG_NET_CLS_ROUTE4 is not set +# CONFIG_NET_CLS_FW is not set +# CONFIG_NET_CLS_U32 is not set +# CONFIG_NET_CLS_FLOW is not set +# CONFIG_NET_CLS_CGROUP is not set +CONFIG_NET_CLS_BPF=y +# CONFIG_NET_CLS_FLOWER is not set +# CONFIG_NET_CLS_MATCHALL is not set +# CONFIG_NET_EMATCH is not set +CONFIG_NET_CLS_ACT=y +CONFIG_NET_ACT_POLICE=y +CONFIG_NET_ACT_GACT=y +# CONFIG_GACT_PROB is not set +# CONFIG_NET_ACT_MIRRED is not set +# CONFIG_NET_ACT_SAMPLE is not set +# CONFIG_NET_ACT_NAT is not set +# CONFIG_NET_ACT_PEDIT is not set +# CONFIG_NET_ACT_SIMP is not set +# CONFIG_NET_ACT_SKBEDIT is not set +# CONFIG_NET_ACT_CSUM is not set +# CONFIG_NET_ACT_MPLS is not set +# CONFIG_NET_ACT_VLAN is not set +CONFIG_NET_ACT_BPF=y +# CONFIG_NET_ACT_SKBMOD is not set +# CONFIG_NET_ACT_IFE is not set +# CONFIG_NET_ACT_TUNNEL_KEY is not set +# CONFIG_NET_ACT_GATE is not set +# CONFIG_NET_TC_SKB_EXT is not set +CONFIG_NET_SCH_FIFO=y +# CONFIG_DCB is not set +# CONFIG_BATMAN_ADV is not set +# CONFIG_OPENVSWITCH is not set +CONFIG_VSOCKETS=m +CONFIG_VSOCKETS_DIAG=m +CONFIG_VSOCKETS_LOOPBACK=m +CONFIG_VIRTIO_VSOCKETS=m +CONFIG_VIRTIO_VSOCKETS_COMMON=m +# CONFIG_NETLINK_DIAG is not set +# CONFIG_MPLS is not set +# CONFIG_NET_NSH is not set +# CONFIG_HSR is not set +# CONFIG_NET_SWITCHDEV is not set +# CONFIG_NET_L3_MASTER_DEV is not set +# CONFIG_QRTR is not set +# CONFIG_NET_NCSI is not set +# CONFIG_PCPU_DEV_REFCNT is not set +CONFIG_MAX_SKB_FRAGS=17 +# CONFIG_RPS is not set +CONFIG_SOCK_RX_QUEUE_MAPPING=y +CONFIG_XPS=y +# CONFIG_CGROUP_NET_PRIO is not set +# CONFIG_CGROUP_NET_CLASSID is not set +CONFIG_NET_RX_BUSY_POLL=y +# CONFIG_BQL is not set +CONFIG_BPF_STREAM_PARSER=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_NET_DROP_MONITOR is not set +# end of Network testing +# end of Networking options + +# CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set +# CONFIG_BT is not set +# CONFIG_AF_RXRPC is not set +# CONFIG_AF_KCM is not set +CONFIG_STREAM_PARSER=y +# CONFIG_MCTP is not set +CONFIG_FIB_RULES=y +# CONFIG_WIRELESS is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set +# CONFIG_CAIF is not set +# CONFIG_CEPH_LIB is not set +# CONFIG_NFC is not set +# CONFIG_PSAMPLE is not set +# CONFIG_NET_IFE is not set +CONFIG_LWTUNNEL=y +CONFIG_LWTUNNEL_BPF=y +CONFIG_DST_CACHE=y +CONFIG_GRO_CELLS=y +CONFIG_NET_SOCK_MSG=y +CONFIG_PAGE_POOL=y +# CONFIG_PAGE_POOL_STATS is not set +CONFIG_FAILOVER=m +# CONFIG_ETHTOOL_NETLINK is not set + +# +# Device Drivers +# +CONFIG_HAVE_PCI=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +# CONFIG_PCIEPORTBUS is not set +# CONFIG_PCIEASPM is not set +# CONFIG_PCIE_PTM is not set +CONFIG_PCI_MSI=y +# CONFIG_PCI_QUIRKS is not set +# CONFIG_PCI_DEBUG is not set +# CONFIG_PCI_STUB is not set +# CONFIG_PCI_TSM is not set +# CONFIG_PCI_DOE is not set +CONFIG_PCI_LOCKLESS_CONFIG=y +# CONFIG_PCI_IOV is not set +# CONFIG_PCI_PRI is not set +# CONFIG_PCI_PASID is not set +# CONFIG_PCIE_TPH is not set +# CONFIG_PCI_P2PDMA is not set +CONFIG_PCI_LABEL=y +# CONFIG_PCIE_BUS_TUNE_OFF is not set +CONFIG_PCIE_BUS_DEFAULT=y +# CONFIG_PCIE_BUS_SAFE is not set +# CONFIG_PCIE_BUS_PERFORMANCE is not set +# CONFIG_PCIE_BUS_PEER2PEER is not set +# CONFIG_VGA_ARB is not set +# CONFIG_HOTPLUG_PCI is not set + +# +# PCI controller drivers +# +# CONFIG_VMD is not set + +# +# Cadence-based PCIe controllers +# +# end of Cadence-based PCIe controllers + +# +# DesignWare-based PCIe controllers +# +# CONFIG_PCI_MESON is not set +# CONFIG_PCIE_DW_PLAT_HOST is not set +# end of DesignWare-based PCIe controllers + +# +# Mobiveil-based PCIe controllers +# +# end of Mobiveil-based PCIe controllers + +# +# PLDA-based PCIe controllers +# +# end of PLDA-based PCIe controllers +# end of PCI controller drivers + +# +# PCI Endpoint +# +# CONFIG_PCI_ENDPOINT is not set +# end of PCI Endpoint + +# +# PCI switch controller drivers +# +# CONFIG_PCI_SW_SWITCHTEC is not set +# end of PCI switch controller drivers + +# CONFIG_PCI_PWRCTRL_SLOT is not set +# CONFIG_CXL_BUS is not set +# CONFIG_PCCARD is not set +# CONFIG_RAPIDIO is not set +# CONFIG_PC104 is not set + +# +# Generic Driver Options +# +# CONFIG_UEVENT_HELPER is not set +CONFIG_DEVTMPFS=y +# CONFIG_DEVTMPFS_MOUNT is not set +# CONFIG_DEVTMPFS_SAFE is not set +# CONFIG_STANDALONE is not set +# CONFIG_PREVENT_FIRMWARE_BUILD is not set + +# +# Firmware loader +# +CONFIG_FW_LOADER=y +CONFIG_EXTRA_FIRMWARE="" +# CONFIG_FW_LOADER_USER_HELPER is not set +# CONFIG_FW_LOADER_COMPRESS is not set +# CONFIG_FW_UPLOAD is not set +# end of Firmware loader + +CONFIG_ALLOW_DEV_COREDUMP=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set +# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set +CONFIG_GENERIC_CPU_DEVICES=y +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +# CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set +# end of Generic Driver Options + +# +# Bus devices +# +# CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set +# end of Bus devices + +# CONFIG_CONNECTOR is not set + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +# end of ARM System Control and Management Interface Protocol + +# CONFIG_EDD is not set +# CONFIG_FIRMWARE_MEMMAP is not set +CONFIG_DMIID=y +# CONFIG_DMI_SYSFS is not set +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +# CONFIG_ISCSI_IBFT is not set +# CONFIG_FW_CFG_SYSFS is not set +# CONFIG_SYSFB_SIMPLEFB is not set +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# Qualcomm firmware drivers +# +# end of Qualcomm firmware drivers + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + +# CONFIG_FWCTL is not set +# CONFIG_GNSS is not set +# CONFIG_MTD is not set +# CONFIG_OF is not set +CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y +# CONFIG_PARPORT is not set +CONFIG_PNP=y +# CONFIG_PNP_DEBUG_MESSAGES is not set + +# +# Protocols +# +CONFIG_PNPACPI=y +CONFIG_BLK_DEV=y +CONFIG_BLK_DEV_NULL_BLK=m +# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set +# CONFIG_ZRAM is not set +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 +# CONFIG_BLK_DEV_DRBD is not set +# CONFIG_BLK_DEV_NBD is not set +CONFIG_BLK_DEV_RAM=m +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=4096 +# CONFIG_ATA_OVER_ETH is not set +CONFIG_VIRTIO_BLK=m +# CONFIG_BLK_DEV_RBD is not set +# CONFIG_BLK_DEV_UBLK is not set + +# +# NVME Support +# +CONFIG_NVME_CORE=m +CONFIG_BLK_DEV_NVME=m +# CONFIG_NVME_MULTIPATH is not set +CONFIG_NVME_VERBOSE_ERRORS=y +# CONFIG_NVME_HWMON is not set +# CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set +# CONFIG_NVME_HOST_AUTH is not set +# CONFIG_NVME_TARGET is not set +# end of NVME Support + +# +# Misc devices +# +# CONFIG_DUMMY_IRQ is not set +# CONFIG_IBM_ASM is not set +# CONFIG_PHANTOM is not set +# CONFIG_RPMB is not set +# CONFIG_TIFM_CORE is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_HP_ILO is not set +# CONFIG_SRAM is not set +# CONFIG_DW_XDATA_PCIE is not set +# CONFIG_PCI_ENDPOINT_TEST is not set +# CONFIG_XILINX_SDFEC is not set +# CONFIG_NTSYNC is not set +# CONFIG_NSM is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_93CX6 is not set +# end of EEPROM support + +# CONFIG_CB710_CORE is not set + +# +# Altera FPGA firmware download module (requires I2C) +# +# CONFIG_INTEL_MEI is not set +# CONFIG_VMWARE_VMCI is not set +# CONFIG_GENWQE is not set +# CONFIG_BCM_VK is not set +# CONFIG_MISC_ALCOR_PCI is not set +# CONFIG_MISC_RTSX_PCI is not set +# CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set +# end of Misc devices + +# +# SCSI device support +# +CONFIG_SCSI_MOD=y +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI_COMMON=y +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_PROC_FS is not set + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +# CONFIG_CHR_DEV_ST is not set +# CONFIG_BLK_DEV_SR is not set +CONFIG_CHR_DEV_SG=m +CONFIG_BLK_DEV_BSG=y +# CONFIG_CHR_DEV_SCH is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +# CONFIG_SCSI_SCAN_ASYNC is not set + +# +# SCSI Transports +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +# end of SCSI Transports + +CONFIG_SCSI_LOWLEVEL=y +# CONFIG_ISCSI_TCP is not set +# CONFIG_ISCSI_BOOT_SYSFS is not set +# CONFIG_SCSI_CXGB3_ISCSI is not set +# CONFIG_SCSI_BNX2_ISCSI is not set +# CONFIG_BE2ISCSI is not set +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_HPSA is not set +# CONFIG_SCSI_3W_9XXX is not set +# CONFIG_SCSI_3W_SAS is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_AIC94XX is not set +# CONFIG_SCSI_MVSAS is not set +# CONFIG_SCSI_MVUMI is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_ARCMSR is not set +# CONFIG_SCSI_ESAS2R is not set +# CONFIG_MEGARAID_NEWGEN is not set +# CONFIG_MEGARAID_LEGACY is not set +# CONFIG_MEGARAID_SAS is not set +# CONFIG_SCSI_MPT3SAS is not set +# CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_MPI3MR is not set +# CONFIG_SCSI_SMARTPQI is not set +# CONFIG_SCSI_HPTIOP is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_MYRB is not set +# CONFIG_SCSI_MYRS is not set +# CONFIG_VMWARE_PVSCSI is not set +# CONFIG_SCSI_SNIC is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_FDOMAIN_PCI is not set +# CONFIG_SCSI_ISCI is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_STEX is not set +# CONFIG_SCSI_SYM53C8XX_2 is not set +# CONFIG_SCSI_IPR is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_QLA_ISCSI is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_AM53C974 is not set +# CONFIG_SCSI_WD719X is not set +CONFIG_SCSI_DEBUG=m +# CONFIG_SCSI_PMCRAID is not set +# CONFIG_SCSI_PM8001 is not set +CONFIG_SCSI_VIRTIO=m +# CONFIG_SCSI_DH is not set +# end of SCSI device support + +# CONFIG_ATA is not set +CONFIG_MD=y +# CONFIG_BLK_DEV_MD is not set +CONFIG_BLK_DEV_DM=m +# CONFIG_DM_DEBUG is not set +CONFIG_DM_BUFIO=m +# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set +CONFIG_DM_BIO_PRISON=m +CONFIG_DM_PERSISTENT_DATA=m +# CONFIG_DM_UNSTRIPED is not set +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +# CONFIG_DM_CACHE is not set +# CONFIG_DM_WRITECACHE is not set +# CONFIG_DM_EBS is not set +# CONFIG_DM_ERA is not set +# CONFIG_DM_CLONE is not set +# CONFIG_DM_MIRROR is not set +CONFIG_DM_LOG_WRITES=m +# CONFIG_DM_RAID is not set +CONFIG_DM_ZERO=m +# CONFIG_DM_MULTIPATH is not set +CONFIG_DM_DELAY=m +# CONFIG_DM_DUST is not set +# CONFIG_DM_INIT is not set +# CONFIG_DM_UEVENT is not set +CONFIG_DM_FLAKEY=m +# CONFIG_DM_VERITY is not set +# CONFIG_DM_SWITCH is not set +# CONFIG_DM_INTEGRITY is not set +# CONFIG_DM_AUDIT is not set +# CONFIG_TARGET_CORE is not set +# CONFIG_FUSION is not set + +# +# IEEE 1394 (FireWire) support +# +# CONFIG_FIREWIRE is not set +# CONFIG_FIREWIRE_NOSY is not set +# end of IEEE 1394 (FireWire) support + +# CONFIG_MACINTOSH_DRIVERS is not set +CONFIG_NETDEVICES=y +CONFIG_NET_CORE=y +# CONFIG_BONDING is not set +CONFIG_DUMMY=y +# CONFIG_WIREGUARD is not set +# CONFIG_OVPN is not set +# CONFIG_EQUALIZER is not set +# CONFIG_NET_FC is not set +# CONFIG_NET_TEAM is not set +# CONFIG_MACVLAN is not set +# CONFIG_IPVLAN is not set +CONFIG_VXLAN=y +# CONFIG_GENEVE is not set +# CONFIG_BAREUDP is not set +# CONFIG_GTP is not set +# CONFIG_PFCP is not set +# CONFIG_MACSEC is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_TUN is not set +# CONFIG_TUN_VNET_CROSS_LE is not set +# CONFIG_VETH is not set +CONFIG_VIRTIO_NET=m +# CONFIG_NLMON is not set +# CONFIG_NETKIT is not set +# CONFIG_ARCNET is not set +# CONFIG_ETHERNET is not set +# CONFIG_FDDI is not set +# CONFIG_MDIO_BUS is not set +# CONFIG_PHYLIB is not set + +# +# PCS device drivers +# +# CONFIG_PCS_XPCS is not set +# end of PCS device drivers + +# CONFIG_PPP is not set +# CONFIG_SLIP is not set + +# +# Host-side USB support is needed for USB Network Adapter support +# +# CONFIG_WLAN is not set +# CONFIG_WAN is not set + +# +# Wireless WAN +# +# CONFIG_WWAN is not set +# end of Wireless WAN + +# CONFIG_VMXNET3 is not set +# CONFIG_FUJITSU_ES is not set +# CONFIG_NETDEVSIM is not set +CONFIG_NET_FAILOVER=m +# CONFIG_ISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +# CONFIG_INPUT_FF_MEMLESS is not set +# CONFIG_INPUT_SPARSEKMAP is not set +# CONFIG_INPUT_MATRIXKMAP is not set + +# +# Userland interfaces +# +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set + +# +# Input Device Drivers +# +# CONFIG_INPUT_KEYBOARD is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TABLET is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set +# CONFIG_RMI4_CORE is not set + +# +# Hardware I/O ports +# +# CONFIG_SERIO is not set +CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y +# CONFIG_GAMEPORT is not set +# end of Hardware I/O ports +# end of Input device support + +# +# Character devices +# +CONFIG_TTY=y +CONFIG_VT=y +# CONFIG_CONSOLE_TRANSLATIONS is not set +# CONFIG_VT_CONSOLE is not set +# CONFIG_VT_HW_CONSOLE_BINDING is not set +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +# CONFIG_LEGACY_TIOCSTI is not set +# CONFIG_LDISC_AUTOLOAD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_EARLYCON=y +CONFIG_SERIAL_8250=y +# CONFIG_SERIAL_8250_PNP is not set +# CONFIG_SERIAL_8250_16550A_VARIANTS is not set +# CONFIG_SERIAL_8250_FINTEK is not set +CONFIG_SERIAL_8250_CONSOLE=y +# CONFIG_SERIAL_8250_PCI is not set +# CONFIG_SERIAL_8250_EXAR is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_PCI1XXXX is not set +# CONFIG_SERIAL_8250_DW is not set +# CONFIG_SERIAL_8250_RT288X is not set +# CONFIG_SERIAL_8250_LPSS is not set +# CONFIG_SERIAL_8250_MID is not set +# CONFIG_SERIAL_8250_PERICOM is not set +# CONFIG_SERIAL_8250_NI is not set + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_UARTLITE is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_JSM is not set +# CONFIG_SERIAL_LANTIQ is not set +# CONFIG_SERIAL_SCCNXP is not set +# CONFIG_SERIAL_ALTERA_JTAGUART is not set +# CONFIG_SERIAL_ALTERA_UART is not set +# CONFIG_SERIAL_ARC is not set +# CONFIG_SERIAL_RP2 is not set +# CONFIG_SERIAL_FSL_LPUART is not set +# CONFIG_SERIAL_FSL_LINFLEXUART is not set +# end of Serial drivers + +# CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_N_GSM is not set +# CONFIG_NOZOMI is not set +# CONFIG_NULL_TTY is not set +CONFIG_HVC_DRIVER=y +# CONFIG_SERIAL_DEV_BUS is not set +# CONFIG_TTY_PRINTK is not set +CONFIG_VIRTIO_CONSOLE=m +# CONFIG_IPMI_HANDLER is not set +CONFIG_HW_RANDOM=y +# CONFIG_HW_RANDOM_TIMERIOMEM is not set +# CONFIG_HW_RANDOM_INTEL is not set +# CONFIG_HW_RANDOM_AMD is not set +# CONFIG_HW_RANDOM_BA431 is not set +# CONFIG_HW_RANDOM_VIA is not set +# CONFIG_HW_RANDOM_VIRTIO is not set +# CONFIG_HW_RANDOM_XIPHERA is not set +# CONFIG_APPLICOM is not set +CONFIG_DEVMEM=y +# CONFIG_NVRAM is not set +# CONFIG_DEVPORT is not set +# CONFIG_HPET is not set +# CONFIG_HANGCHECK_TIMER is not set +# CONFIG_TCG_TPM is not set +# CONFIG_TELCLOCK is not set +# CONFIG_XILLYBUS is not set +# end of Character devices + +# +# I2C support +# +# CONFIG_I2C is not set +# end of I2C support + +# CONFIG_I3C is not set +# CONFIG_SPI is not set +# CONFIG_SPMI is not set +# CONFIG_HSI is not set +# CONFIG_PPS is not set + +# +# PTP clock support +# +# CONFIG_PTP_1588_CLOCK is not set +CONFIG_PTP_1588_CLOCK_OPTIONAL=y + +# +# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. +# +# end of PTP clock support + +# +# DPLL device support +# +# end of DPLL device support + +# CONFIG_PINCTRL is not set +CONFIG_GPIOLIB_LEGACY=y +# CONFIG_GPIOLIB is not set +# CONFIG_W1 is not set +# CONFIG_POWER_RESET is not set +# CONFIG_POWER_SEQUENCING is not set +# CONFIG_POWER_SUPPLY is not set +CONFIG_HWMON=y +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Native drivers +# +# CONFIG_SENSORS_ABITUGURU is not set +# CONFIG_SENSORS_ABITUGURU3 is not set +# CONFIG_SENSORS_AS370 is not set +# CONFIG_SENSORS_AXI_FAN_CONTROL is not set +# CONFIG_SENSORS_K8TEMP is not set +# CONFIG_SENSORS_K10TEMP is not set +# CONFIG_SENSORS_FAM15H_POWER is not set +# CONFIG_SENSORS_APPLESMC is not set +# CONFIG_SENSORS_I5K_AMB is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_SENSORS_F71882FG is not set +# CONFIG_SENSORS_GPD is not set +# CONFIG_SENSORS_I5500 is not set +# CONFIG_SENSORS_CORETEMP is not set +# CONFIG_SENSORS_IT87 is not set +# CONFIG_SENSORS_LENOVO_EC is not set +# CONFIG_SENSORS_MAX197 is not set +# CONFIG_SENSORS_MR75203 is not set +# CONFIG_SENSORS_PC87360 is not set +# CONFIG_SENSORS_PC87427 is not set +# CONFIG_SENSORS_NCT6683 is not set +# CONFIG_SENSORS_NCT6775 is not set +# CONFIG_SENSORS_NPCM7XX is not set +# CONFIG_SENSORS_SIS5595 is not set +# CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47B397 is not set +# CONFIG_SENSORS_VIA_CPUTEMP is not set +# CONFIG_SENSORS_VIA686A is not set +# CONFIG_SENSORS_VT1211 is not set +# CONFIG_SENSORS_VT8231 is not set +# CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set + +# +# ACPI drivers +# +# CONFIG_SENSORS_ACPI_POWER is not set +# CONFIG_SENSORS_ATK0110 is not set +# CONFIG_THERMAL is not set +# CONFIG_WATCHDOG is not set +CONFIG_SSB_POSSIBLE=y +# CONFIG_SSB is not set +CONFIG_BCMA_POSSIBLE=y +# CONFIG_BCMA is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_CGBC is not set +# CONFIG_MFD_MADERA is not set +# CONFIG_LPC_ICH is not set +# CONFIG_LPC_SCH is not set +# CONFIG_MFD_INTEL_LPSS_ACPI is not set +# CONFIG_MFD_INTEL_LPSS_PCI is not set +# CONFIG_MFD_JANZ_CMODIO is not set +# CONFIG_MFD_KEMPLD is not set +# CONFIG_MFD_MT6397 is not set +# CONFIG_MFD_RDC321X is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_SYSCON is not set +# CONFIG_MFD_TQMX86 is not set +# CONFIG_MFD_VX855 is not set +# CONFIG_MFD_UPBOARD_FPGA is not set +# end of Multifunction device drivers + +# CONFIG_REGULATOR is not set +CONFIG_RC_CORE=y +CONFIG_BPF_LIRC_MODE2=y +CONFIG_LIRC=y +# CONFIG_RC_MAP is not set +# CONFIG_RC_DECODERS is not set +# CONFIG_RC_DEVICES is not set + +# +# CEC support +# +# CONFIG_MEDIA_CEC_SUPPORT is not set +# end of CEC support + +# CONFIG_MEDIA_SUPPORT is not set + +# +# Graphics support +# +# CONFIG_AUXDISPLAY is not set +# CONFIG_AGP is not set +# CONFIG_VGA_SWITCHEROO is not set +# CONFIG_DRM is not set + +# +# Frame buffer Devices +# +# CONFIG_FB is not set +# end of Frame buffer Devices + +# +# Backlight & LCD device support +# +# CONFIG_LCD_CLASS_DEVICE is not set +# CONFIG_BACKLIGHT_CLASS_DEVICE is not set +# end of Backlight & LCD device support + +# CONFIG_FIRMWARE_EDID is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_DUMMY_CONSOLE_COLUMNS=80 +CONFIG_DUMMY_CONSOLE_ROWS=25 +# end of Console display driver support + +# CONFIG_TRACE_GPU_MEM is not set +# end of Graphics support + +# CONFIG_SOUND is not set +# CONFIG_HID_SUPPORT is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_SUPPORT=y +# CONFIG_USB_ULPI_BUS is not set +CONFIG_USB_ARCH_HAS_HCD=y +# CONFIG_USB is not set +# CONFIG_USB_PCI is not set + +# +# USB dual-mode controller drivers +# + +# +# USB port drivers +# + +# +# USB Physical Layer drivers +# +# CONFIG_NOP_USB_XCEIV is not set +# end of USB Physical Layer drivers + +# CONFIG_USB_GADGET is not set +# CONFIG_TYPEC is not set +# CONFIG_USB_ROLE_SWITCH is not set +# CONFIG_MMC is not set +# CONFIG_SCSI_UFSHCD is not set +# CONFIG_MEMSTICK is not set +# CONFIG_NEW_LEDS is not set +# CONFIG_ACCESSIBILITY is not set +# CONFIG_INFINIBAND is not set +CONFIG_EDAC_ATOMIC_SCRUB=y +CONFIG_EDAC_SUPPORT=y +CONFIG_RTC_LIB=y +CONFIG_RTC_MC146818_LIB=y +# CONFIG_RTC_CLASS is not set +# CONFIG_DMADEVICES is not set + +# +# DMABUF options +# +# CONFIG_SYNC_FILE is not set +# CONFIG_DMABUF_HEAPS is not set +# end of DMABUF options + +# CONFIG_UIO is not set +# CONFIG_VFIO is not set +CONFIG_IRQ_BYPASS_MANAGER=m +# CONFIG_VIRT_DRIVERS is not set +CONFIG_VIRTIO_ANCHOR=y +CONFIG_VIRTIO=y +CONFIG_VIRTIO_PCI_LIB=y +CONFIG_VIRTIO_PCI_LIB_LEGACY=y +CONFIG_VIRTIO_MENU=y +CONFIG_VIRTIO_PCI=y +CONFIG_VIRTIO_PCI_ADMIN_LEGACY=y +CONFIG_VIRTIO_PCI_LEGACY=y +# CONFIG_VIRTIO_BALLOON is not set +# CONFIG_VIRTIO_INPUT is not set +# CONFIG_VIRTIO_MMIO is not set +# CONFIG_VIRTIO_DEBUG is not set +# CONFIG_VIRTIO_RTC is not set +# CONFIG_VDPA is not set +CONFIG_VHOST_TASK=y +# CONFIG_VHOST_MENU is not set + +# +# Microsoft Hyper-V guest support +# +# CONFIG_HYPERV is not set +# end of Microsoft Hyper-V guest support + +# CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set +# CONFIG_GPIB is not set +# CONFIG_STAGING is not set +# CONFIG_GOLDFISH is not set +# CONFIG_CHROME_PLATFORMS is not set +# CONFIG_MELLANOX_PLATFORM is not set +# CONFIG_SURFACE_PLATFORMS is not set +# CONFIG_X86_PLATFORM_DEVICES is not set +# CONFIG_ACPI_WMI is not set +# CONFIG_COMMON_CLK is not set +# CONFIG_HWSPINLOCK is not set + +# +# Clock Source drivers +# +CONFIG_CLKEVT_I8253=y +CONFIG_CLKBLD_I8253=y +# end of Clock Source drivers + +# CONFIG_MAILBOX is not set +CONFIG_IOMMU_IOVA=y +CONFIG_IOMMU_API=y +CONFIG_IOMMU_SUPPORT=y + +# +# Generic IOMMU Pagetable Support +# +# end of Generic IOMMU Pagetable Support + +# CONFIG_IOMMU_DEBUGFS is not set +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +CONFIG_IOMMU_DEFAULT_DMA_LAZY=y +# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +CONFIG_IOMMU_DMA=y +# CONFIG_AMD_IOMMU is not set +# CONFIG_INTEL_IOMMU is not set +# CONFIG_IOMMUFD is not set +# CONFIG_IRQ_REMAP is not set +# CONFIG_VIRTIO_IOMMU is not set + +# +# Remoteproc drivers +# +# CONFIG_REMOTEPROC is not set +# end of Remoteproc drivers + +# +# Rpmsg drivers +# +# CONFIG_RPMSG_VIRTIO is not set +# end of Rpmsg drivers + +# +# SOC (System On Chip) specific Drivers +# + +# +# Amlogic SoC drivers +# +# end of Amlogic SoC drivers + +# +# Broadcom SoC drivers +# +# end of Broadcom SoC drivers + +# +# NXP/Freescale QorIQ SoC drivers +# +# end of NXP/Freescale QorIQ SoC drivers + +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + +# +# i.MX SoC drivers +# +# end of i.MX SoC drivers + +# +# Enable LiteX SoC Builder specific drivers +# +# end of Enable LiteX SoC Builder specific drivers + +# CONFIG_WPCM450_SOC is not set + +# +# Qualcomm SoC drivers +# +# end of Qualcomm SoC drivers + +# CONFIG_SOC_TI is not set + +# +# Xilinx SoC drivers +# +# end of Xilinx SoC drivers +# end of SOC (System On Chip) specific Drivers + +# +# PM Domains +# + +# +# Amlogic PM Domains +# +# end of Amlogic PM Domains + +# +# Broadcom PM Domains +# +# end of Broadcom PM Domains + +# +# i.MX PM Domains +# +# end of i.MX PM Domains + +# +# Qualcomm PM Domains +# +# end of Qualcomm PM Domains +# end of PM Domains + +# CONFIG_PM_DEVFREQ is not set +# CONFIG_EXTCON is not set +# CONFIG_MEMORY is not set +# CONFIG_IIO is not set +# CONFIG_NTB is not set +# CONFIG_PWM is not set + +# +# IRQ chip support +# +# end of IRQ chip support + +# CONFIG_IPACK_BUS is not set +# CONFIG_RESET_CONTROLLER is not set + +# +# PHY Subsystem +# +# CONFIG_GENERIC_PHY is not set +# CONFIG_USB_LGM_PHY is not set +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# +# CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + +# CONFIG_PHY_PXA_28NM_HSIC is not set +# CONFIG_PHY_PXA_28NM_USB2 is not set +# CONFIG_PHY_INTEL_LGM_EMMC is not set +# end of PHY Subsystem + +# CONFIG_POWERCAP is not set +# CONFIG_MCB is not set + +# +# Performance monitor support +# +# CONFIG_DWC_PCIE_PMU is not set +# end of Performance monitor support + +# CONFIG_RAS is not set +# CONFIG_USB4 is not set + +# +# Android +# +# CONFIG_ANDROID_BINDER_IPC is not set +# end of Android + +# CONFIG_LIBNVDIMM is not set +CONFIG_DAX=y +# CONFIG_DEV_DAX is not set +# CONFIG_NVMEM is not set + +# +# HW tracing support +# +# CONFIG_STM is not set +# CONFIG_INTEL_TH is not set +# end of HW tracing support + +# CONFIG_FPGA is not set +# CONFIG_TEE is not set +# CONFIG_SIOX is not set +# CONFIG_SLIMBUS is not set +# CONFIG_INTERCONNECT is not set +# CONFIG_COUNTER is not set +# CONFIG_MOST is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set +# end of Device Drivers + +# +# File systems +# +CONFIG_DCACHE_WORD_ACCESS=y +# CONFIG_VALIDATE_FS_PARSER is not set +CONFIG_FS_IOMAP=y +CONFIG_FS_STACK=y +CONFIG_BUFFER_HEAD=y +# CONFIG_EXT2_FS is not set +CONFIG_EXT4_FS=m +CONFIG_EXT4_USE_FOR_EXT2=y +CONFIG_EXT4_FS_POSIX_ACL=y +# CONFIG_EXT4_FS_SECURITY is not set +# CONFIG_EXT4_DEBUG is not set +CONFIG_JBD2=m +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=m +# CONFIG_JFS_FS is not set +CONFIG_XFS_FS=m +CONFIG_XFS_SUPPORT_V4=y +CONFIG_XFS_SUPPORT_ASCII_CI=y +CONFIG_XFS_QUOTA=y +CONFIG_XFS_POSIX_ACL=y +CONFIG_XFS_RT=y +CONFIG_XFS_ONLINE_SCRUB=y +CONFIG_XFS_ONLINE_SCRUB_STATS=y +CONFIG_XFS_ONLINE_REPAIR=y +# CONFIG_XFS_WARN is not set +CONFIG_XFS_DEBUG=y +CONFIG_XFS_ASSERT_FATAL=y +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +# CONFIG_BTRFS_FS is not set +# CONFIG_NILFS2_FS is not set +# CONFIG_F2FS_FS is not set +CONFIG_FS_DAX=y +CONFIG_FS_DAX_PMD=y +CONFIG_FS_POSIX_ACL=y +CONFIG_EXPORTFS=y +# CONFIG_EXPORTFS_BLOCK_OPS is not set +CONFIG_FILE_LOCKING=y +CONFIG_FS_ENCRYPTION=y +CONFIG_FS_ENCRYPTION_ALGS=y +CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y +CONFIG_FS_VERITY=y +CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y +CONFIG_FSNOTIFY=y +# CONFIG_DNOTIFY is not set +CONFIG_INOTIFY_USER=y +CONFIG_FANOTIFY=y +CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y +CONFIG_QUOTA=y +# CONFIG_QUOTA_NETLINK_INTERFACE is not set +# CONFIG_QUOTA_DEBUG is not set +# CONFIG_QFMT_V1 is not set +# CONFIG_QFMT_V2 is not set +CONFIG_QUOTACTL=y +CONFIG_AUTOFS_FS=m +CONFIG_FUSE_FS=y +# CONFIG_CUSE is not set +CONFIG_VIRTIO_FS=y +CONFIG_FUSE_DAX=y +CONFIG_FUSE_PASSTHROUGH=y +CONFIG_FUSE_IO_URING=y +CONFIG_OVERLAY_FS=m +CONFIG_OVERLAY_FS_REDIRECT_DIR=y +CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y +CONFIG_OVERLAY_FS_INDEX=y +CONFIG_OVERLAY_FS_XINO_AUTO=y +CONFIG_OVERLAY_FS_METACOPY=y +# CONFIG_OVERLAY_FS_DEBUG is not set + +# +# Caches +# +# end of Caches + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set +# end of CD-ROM/DVD Filesystems + +# +# DOS/FAT/EXFAT/NT Filesystems +# +# CONFIG_MSDOS_FS is not set +# CONFIG_VFAT_FS is not set +# CONFIG_EXFAT_FS is not set +# CONFIG_NTFS3_FS is not set +# CONFIG_NTFS_FS is not set +# end of DOS/FAT/EXFAT/NT Filesystems + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +# CONFIG_PROC_KCORE is not set +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_PROC_CHILDREN=y +CONFIG_PROC_PID_ARCH_STATUS=y +CONFIG_KERNFS=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_TMPFS_XATTR=y +# CONFIG_TMPFS_INODE64 is not set +# CONFIG_TMPFS_QUOTA is not set +CONFIG_ARCH_SUPPORTS_HUGETLBFS=y +CONFIG_HUGETLBFS=y +# CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON is not set +CONFIG_HUGETLB_PAGE=y +CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y +CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING=y +CONFIG_ARCH_HAS_GIGANTIC_PAGE=y +CONFIG_CONFIGFS_FS=m +# end of Pseudo filesystems + +# CONFIG_MISC_FILESYSTEMS is not set +CONFIG_NETWORK_FILESYSTEMS=y +# CONFIG_NFS_FS is not set +# CONFIG_NFSD is not set +# CONFIG_CEPH_FS is not set +# CONFIG_CIFS is not set +# CONFIG_SMB_SERVER is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +# CONFIG_NLS_CODEPAGE_437 is not set +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +# CONFIG_NLS_ISO8859_1 is not set +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_MAC_ROMAN is not set +# CONFIG_NLS_MAC_CELTIC is not set +# CONFIG_NLS_MAC_CENTEURO is not set +# CONFIG_NLS_MAC_CROATIAN is not set +# CONFIG_NLS_MAC_CYRILLIC is not set +# CONFIG_NLS_MAC_GAELIC is not set +# CONFIG_NLS_MAC_GREEK is not set +# CONFIG_NLS_MAC_ICELAND is not set +# CONFIG_NLS_MAC_INUIT is not set +# CONFIG_NLS_MAC_ROMANIAN is not set +# CONFIG_NLS_MAC_TURKISH is not set +# CONFIG_NLS_UTF8 is not set +# CONFIG_DLM is not set +CONFIG_UNICODE=y +CONFIG_IO_WQ=y +# end of File systems + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY_DMESG_RESTRICT is not set +CONFIG_PROC_MEM_ALWAYS_FORCE=y +# CONFIG_PROC_MEM_FORCE_PTRACE is not set +# CONFIG_PROC_MEM_NO_FORCE is not set +CONFIG_SECURITY=y +CONFIG_SECURITYFS=y +# CONFIG_SECURITY_NETWORK is not set +# CONFIG_SECURITY_PATH is not set +# CONFIG_STATIC_USERMODEHELPER is not set +# CONFIG_SECURITY_SMACK is not set +# CONFIG_SECURITY_TOMOYO is not set +# CONFIG_SECURITY_APPARMOR is not set +# CONFIG_SECURITY_LOADPIN is not set +# CONFIG_SECURITY_YAMA is not set +# CONFIG_SECURITY_SAFESETID is not set +CONFIG_SECURITY_LOCKDOWN_LSM=y +# CONFIG_SECURITY_LOCKDOWN_LSM_EARLY is not set +CONFIG_LOCK_DOWN_KERNEL_FORCE_NONE=y +# CONFIG_LOCK_DOWN_KERNEL_FORCE_INTEGRITY is not set +# CONFIG_LOCK_DOWN_KERNEL_FORCE_CONFIDENTIALITY is not set +# CONFIG_SECURITY_LANDLOCK is not set +# CONFIG_INTEGRITY is not set +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_LSM="landlock,lockdown,yama,loadpin,safesetid,ipe,bpf" + +# +# Kernel hardening options +# + +# +# Memory initialization +# +CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y +CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y +CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y +# CONFIG_INIT_STACK_NONE is not set +# CONFIG_INIT_STACK_ALL_PATTERN is not set +CONFIG_INIT_STACK_ALL_ZERO=y +CONFIG_CC_HAS_SANCOV_STACK_DEPTH_CALLBACK=y +# CONFIG_KSTACK_ERASE is not set +# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set +# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set +CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y +# CONFIG_ZERO_CALL_USED_REGS is not set +# end of Memory initialization + +# +# Bounds checking +# +# CONFIG_FORTIFY_SOURCE is not set +# CONFIG_HARDENED_USERCOPY is not set +# end of Bounds checking + +# +# Hardening of kernel data structures +# +# CONFIG_LIST_HARDENED is not set +# CONFIG_BUG_ON_DATA_CORRUPTION is not set +# end of Hardening of kernel data structures + +CONFIG_CC_HAS_RANDSTRUCT=y +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# end of Kernel hardening options +# end of Security options + +# CONFIG_CRYPTO is not set +CONFIG_BINARY_PRINTF=y + +# +# Library routines +# +# CONFIG_PACKING is not set +CONFIG_BITREVERSE=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_NET_UTILS=y +# CONFIG_CORDIC is not set +# CONFIG_PRIME_NUMBERS is not set +CONFIG_GENERIC_IOMAP=y +CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y +CONFIG_ARCH_HAS_FAST_MULTIPLIER=y +CONFIG_ARCH_USE_SYM_ANNOTATIONS=y +CONFIG_CRC16=m +CONFIG_CRC32=y +# CONFIG_CRC_OPTIMIZATIONS is not set + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_BLAKE2S_ARCH=y +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +CONFIG_CRYPTO_LIB_SHA1=m +CONFIG_CRYPTO_LIB_SHA1_ARCH=y +CONFIG_CRYPTO_LIB_SHA256=y +CONFIG_CRYPTO_LIB_SHA256_ARCH=y +# end of Crypto library routines + +CONFIG_XXHASH=y +# CONFIG_RANDOM32_SELFTEST is not set +CONFIG_ZSTD_COMMON=y +CONFIG_ZSTD_DECOMPRESS=y +# CONFIG_XZ_DEC is not set +CONFIG_DECOMPRESS_ZSTD=y +CONFIG_INTERVAL_TREE=y +CONFIG_XARRAY_MULTI=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAS_DMA=y +CONFIG_DMA_OPS_HELPERS=y +CONFIG_NEED_SG_DMA_FLAGS=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_SWIOTLB=y +# CONFIG_SWIOTLB_DYNAMIC is not set +CONFIG_DMA_NEED_SYNC=y +# CONFIG_DMA_CMA is not set +# CONFIG_DMA_API_DEBUG is not set +# CONFIG_DMA_MAP_BENCHMARK is not set +CONFIG_GLOB=y +CONFIG_NLATTR=y +# CONFIG_IRQ_POLL is not set +CONFIG_DIMLIB=m +CONFIG_HAVE_GENERIC_VDSO=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_VDSO_OVERFLOW_PROTECT=y +CONFIG_VDSO_GETRANDOM=y +CONFIG_SG_POOL=y +CONFIG_ARCH_HAS_PMEM_API=y +CONFIG_ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION=y +CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y +CONFIG_ARCH_HAS_COPY_MC=y +CONFIG_ARCH_STACKWALK=y +CONFIG_SBITMAP=y +# CONFIG_LWQ_TEST is not set +# end of Library routines + +CONFIG_FIRMWARE_TABLE=y + +# +# Kernel hacking +# + +# +# printk and dmesg options +# +CONFIG_PRINTK_TIME=y +# CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set +CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 +CONFIG_CONSOLE_LOGLEVEL_QUIET=4 +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 +# CONFIG_BOOT_PRINTK_DELAY is not set +# CONFIG_DYNAMIC_DEBUG is not set +# CONFIG_DYNAMIC_DEBUG_CORE is not set +# CONFIG_SYMBOLIC_ERRNAME is not set +# CONFIG_DEBUG_BUGVERBOSE is not set +# end of printk and dmesg options + +CONFIG_DEBUG_KERNEL=y +CONFIG_DEBUG_MISC=y + +# +# Compile-time checks and compiler options +# +CONFIG_DEBUG_INFO=y +CONFIG_AS_HAS_NON_CONST_ULEB128=y +# CONFIG_DEBUG_INFO_NONE is not set +CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y +# CONFIG_DEBUG_INFO_DWARF4 is not set +# CONFIG_DEBUG_INFO_DWARF5 is not set +# CONFIG_DEBUG_INFO_REDUCED is not set +CONFIG_DEBUG_INFO_COMPRESSED_NONE=y +# CONFIG_DEBUG_INFO_COMPRESSED_ZLIB is not set +# CONFIG_DEBUG_INFO_COMPRESSED_ZSTD is not set +# CONFIG_DEBUG_INFO_SPLIT is not set +CONFIG_DEBUG_INFO_BTF=y +CONFIG_PAHOLE_HAS_BTF_TAG=y +CONFIG_PAHOLE_HAS_LANG_EXCLUDE=y +# CONFIG_DEBUG_INFO_BTF_MODULES is not set +# CONFIG_GDB_SCRIPTS is not set +CONFIG_FRAME_WARN=2048 +# CONFIG_STRIP_ASM_SYMS is not set +# CONFIG_HEADERS_INSTALL is not set +# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_OBJTOOL=y +# CONFIG_OBJTOOL_WERROR is not set +# CONFIG_VMLINUX_MAP is not set +# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set +# end of Compile-time checks and compiler options + +# +# Generic Kernel Debugging Instruments +# +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 +# CONFIG_MAGIC_SYSRQ_SERIAL is not set +CONFIG_DEBUG_FS=y +CONFIG_DEBUG_FS_ALLOW_ALL=y +# CONFIG_DEBUG_FS_ALLOW_NONE is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +CONFIG_ARCH_HAS_UBSAN=y +# CONFIG_UBSAN is not set +CONFIG_HAVE_ARCH_KCSAN=y +CONFIG_HAVE_KCSAN_COMPILER=y +# CONFIG_KCSAN is not set +# end of Generic Kernel Debugging Instruments + +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# CONFIG_DEBUG_NET_SMALL_RTNL is not set +# end of Networking Debugging + +# +# Memory Debugging +# +# CONFIG_PAGE_EXTENSION is not set +# CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_SLUB_DEBUG is not set +# CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_POISONING is not set +# CONFIG_DEBUG_PAGE_REF is not set +# CONFIG_DEBUG_RODATA_TEST is not set +CONFIG_ARCH_HAS_DEBUG_WX=y +# CONFIG_DEBUG_WX is not set +CONFIG_ARCH_HAS_PTDUMP=y +# CONFIG_PTDUMP_DEBUGFS is not set +CONFIG_HAVE_DEBUG_KMEMLEAK=y +# CONFIG_DEBUG_KMEMLEAK is not set +# CONFIG_PER_VMA_LOCK_STATS is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_SHRINKER_DEBUG is not set +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_SCHED_STACK_END_CHECK is not set +CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y +# CONFIG_DEBUG_VFS is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_VM_PGTABLE is not set +CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y +# CONFIG_DEBUG_VIRTUAL is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y +# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set +# CONFIG_MEM_ALLOC_PROFILING is not set +CONFIG_HAVE_ARCH_KASAN=y +CONFIG_HAVE_ARCH_KASAN_VMALLOC=y +CONFIG_CC_HAS_KASAN_GENERIC=y +CONFIG_CC_HAS_KASAN_SW_TAGS=y +CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y +# CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +CONFIG_HAVE_ARCH_KMSAN=y +CONFIG_HAVE_KMSAN_COMPILER=y +# CONFIG_KMSAN is not set +# end of Memory Debugging + +# CONFIG_DEBUG_SHIRQ is not set + +# +# Debug Oops, Lockups and Hangs +# +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PANIC_TIMEOUT=0 +# CONFIG_SOFTLOCKUP_DETECTOR is not set +CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y +# CONFIG_HARDLOCKUP_DETECTOR is not set +CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y +# CONFIG_DETECT_HUNG_TASK is not set +# CONFIG_WQ_WATCHDOG is not set +# CONFIG_WQ_CPU_INTENSIVE_REPORT is not set +# CONFIG_TEST_LOCKUP is not set +# end of Debug Oops, Lockups and Hangs + +# +# Scheduler Debugging +# +CONFIG_SCHED_INFO=y +# CONFIG_SCHEDSTATS is not set +# end of Scheduler Debugging + +# CONFIG_DEBUG_PREEMPT is not set +# CONFIG_DEBUG_ATOMIC is not set + +# +# Lock Debugging (spinlocks, mutexes, etc...) +# +CONFIG_LOCK_DEBUGGING_SUPPORT=y +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_DEBUG_ATOMIC_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_LOCK_TORTURE_TEST is not set +# CONFIG_WW_MUTEX_SELFTEST is not set +# CONFIG_SCF_TORTURE_TEST is not set +# CONFIG_CSD_LOCK_WAIT_DEBUG is not set +# end of Lock Debugging (spinlocks, mutexes, etc...) + +# CONFIG_NMI_CHECK_CPU is not set +# CONFIG_DEBUG_IRQFLAGS is not set +CONFIG_STACKTRACE=y +# CONFIG_DEBUG_KOBJECT is not set + +# +# Debug kernel data structures +# +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_PLIST is not set +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_DEBUG_MAPLE_TREE is not set +# end of Debug kernel data structures + +# +# RCU Debugging +# +# CONFIG_RCU_SCALE_TEST is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_REF_SCALE_TEST is not set +CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 +# CONFIG_RCU_CPU_STALL_CPUTIME is not set +# CONFIG_RCU_TRACE is not set +# CONFIG_RCU_EQS_DEBUG is not set +# end of RCU Debugging + +# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set +# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set +# CONFIG_LATENCYTOP is not set +# CONFIG_DEBUG_CGROUP_REF is not set +CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_NOP_TRACER=y +CONFIG_HAVE_RETHOOK=y +CONFIG_RETHOOK=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_FREGS=y +CONFIG_HAVE_FTRACE_GRAPH_FUNC=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_SINGLE_FTRACE_DIRECT_OPS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_FTRACE_REGS_HAVING_PT_REGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_JMP=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_OBJTOOL_MCOUNT=y +CONFIG_HAVE_OBJTOOL_NOP_MCOUNT=y +CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y +CONFIG_BUILDTIME_MCOUNT_SORT=y +CONFIG_TRACE_CLOCK=y +CONFIG_RING_BUFFER=y +CONFIG_EVENT_TRACING=y +CONFIG_CONTEXT_SWITCH_TRACER=y +CONFIG_TRACING=y +CONFIG_GENERIC_TRACER=y +CONFIG_TRACING_SUPPORT=y +CONFIG_FTRACE=y +# CONFIG_TRACEFS_AUTOMOUNT_DEPRECATED is not set +# CONFIG_BOOTTIME_TRACING is not set +CONFIG_FUNCTION_TRACER=y +CONFIG_FUNCTION_GRAPH_TRACER=y +# CONFIG_FUNCTION_GRAPH_RETVAL is not set +# CONFIG_FUNCTION_GRAPH_RETADDR is not set +CONFIG_DYNAMIC_FTRACE=y +CONFIG_DYNAMIC_FTRACE_WITH_REGS=y +CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_DYNAMIC_FTRACE_WITH_JMP=y +# CONFIG_FUNCTION_SELF_TRACING is not set +# CONFIG_FPROBE is not set +# CONFIG_FUNCTION_PROFILER is not set +CONFIG_STACK_TRACER=y +# CONFIG_IRQSOFF_TRACER is not set +# CONFIG_PREEMPT_TRACER is not set +# CONFIG_SCHED_TRACER is not set +# CONFIG_HWLAT_TRACER is not set +# CONFIG_OSNOISE_TRACER is not set +# CONFIG_TIMERLAT_TRACER is not set +# CONFIG_MMIOTRACE is not set +CONFIG_FTRACE_SYSCALLS=y +CONFIG_TRACE_SYSCALL_BUF_SIZE_DEFAULT=63 +# CONFIG_TRACER_SNAPSHOT is not set +CONFIG_BRANCH_PROFILE_NONE=y +# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set +# CONFIG_PROFILE_ALL_BRANCHES is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_PROBE_EVENTS_BTF_ARGS is not set +CONFIG_KPROBE_EVENTS=y +# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set +CONFIG_UPROBE_EVENTS=y +# CONFIG_EPROBE_EVENTS is not set +CONFIG_BPF_EVENTS=y +CONFIG_DYNAMIC_EVENTS=y +CONFIG_PROBE_EVENTS=y +CONFIG_BPF_KPROBE_OVERRIDE=y +CONFIG_FTRACE_MCOUNT_USE_OBJTOOL=y +# CONFIG_SYNTH_EVENTS is not set +# CONFIG_USER_EVENTS is not set +# CONFIG_HIST_TRIGGERS is not set +# CONFIG_TRACE_EVENT_INJECT is not set +# CONFIG_TRACEPOINT_BENCHMARK is not set +# CONFIG_RING_BUFFER_BENCHMARK is not set +# CONFIG_TRACE_EVAL_MAP_FILE is not set +# CONFIG_FTRACE_RECORD_RECURSION is not set +# CONFIG_FTRACE_VALIDATE_RCU_IS_WATCHING is not set +# CONFIG_FTRACE_STARTUP_TEST is not set +# CONFIG_FTRACE_SORT_STARTUP_TEST is not set +# CONFIG_RING_BUFFER_STARTUP_TEST is not set +# CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set +# CONFIG_PREEMPTIRQ_DELAY_TEST is not set +# CONFIG_KPROBE_EVENT_GEN_TEST is not set +# CONFIG_RV is not set +# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set +# CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y +CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y +# CONFIG_STRICT_DEVMEM is not set + +# +# x86 Debugging +# +# CONFIG_X86_VERBOSE_BOOTUP is not set +# CONFIG_EARLY_PRINTK is not set +# CONFIG_DEBUG_TLBFLUSH is not set +CONFIG_HAVE_MMIOTRACE_SUPPORT=y +# CONFIG_X86_DECODER_SELFTEST is not set +CONFIG_IO_DELAY_0X80=y +# CONFIG_IO_DELAY_0XED is not set +# CONFIG_IO_DELAY_UDELAY is not set +# CONFIG_IO_DELAY_NONE is not set +# CONFIG_DEBUG_BOOT_PARAMS is not set +# CONFIG_CPA_DEBUG is not set +# CONFIG_DEBUG_ENTRY is not set +# CONFIG_DEBUG_NMI_SELFTEST is not set +# CONFIG_X86_DEBUG_FPU is not set +# CONFIG_PUNIT_ATOM_DEBUG is not set +CONFIG_UNWINDER_ORC=y +# CONFIG_UNWINDER_FRAME_POINTER is not set +# CONFIG_UNWINDER_GUESS is not set +# end of x86 Debugging + +# +# Kernel Testing and Coverage +# +# CONFIG_KUNIT is not set +# CONFIG_NOTIFIER_ERROR_INJECTION is not set +CONFIG_FUNCTION_ERROR_INJECTION=y +CONFIG_FAULT_INJECTION=y +CONFIG_FAULT_INJECTION_DEBUG_FS=y +CONFIG_FAIL_MAKE_REQUEST=y +# CONFIG_FAIL_PAGE_ALLOC is not set +# CONFIG_FAULT_INJECTION_STACKTRACE_FILTER is not set +# CONFIG_FAILSLAB is not set +# CONFIG_FAIL_IO_TIMEOUT is not set +# CONFIG_FAIL_FUTEX is not set +# CONFIG_FAIL_FUNCTION is not set +# CONFIG_FAIL_MMC_REQUEST is not set +# CONFIG_FAIL_SUNRPC is not set +CONFIG_ARCH_HAS_KCOV=y +# CONFIG_KCOV is not set +# CONFIG_RUNTIME_TESTING_MENU is not set +CONFIG_ARCH_USE_MEMTEST=y +# CONFIG_MEMTEST is not set +# end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking +# end of Kernel hacking + +CONFIG_IO_URING_ZCRX=y +CONFIG_IO_URING_BPF=y diff --git a/playbooks/roles/nixosfi/tasks/generate-configs.yml b/playbooks/roles/nixosfi/tasks/generate-configs.yml new file mode 100644 index 00000000..7f4eaed8 --- /dev/null +++ b/playbooks/roles/nixosfi/tasks/generate-configs.yml @@ -0,0 +1,71 @@ +--- +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# Per-node imageless configuration generation. Creates one directory +# per guest under $NIXOSFI_CONFIG_DIR, seeds the SSH key, +# copies the upstream nixos-flake imageless template flake into it, +# rewrites the nixos-flake.url input to resolve at the checked-in +# subtree, and renders the per-node default.nix using the shared +# nixos-flake/templates/default.nix.j2 with the imageless backend +# fact set. + +- name: Localhost generate-configs + delegate_to: localhost + run_once: true + block: + - name: Create top-level qsu config directory + ansible.builtin.file: + path: "{{ nixosfi_config_dir }}" + state: directory + mode: "0755" + tags: do_install + + - name: Create per-node configuration directories + ansible.builtin.file: + path: "{{ nixosfi_config_dir }}/{{ item }}" + state: directory + mode: "0755" + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + tags: do_install + + - name: Determine SSH key path + ansible.builtin.command: python3 {{ playbook_dir }}/../scripts/nixosfi_ssh_key_name.py --path + register: nixosfi_ssh_key_path_result + changed_when: false + + - name: Set SSH key path fact + ansible.builtin.set_fact: + nixosfi_ssh_key_path: "{{ nixosfi_ssh_key_path_result.stdout | trim }}" + + - name: Generate SSH key for imageless VMs if not exists + community.crypto.openssh_keypair: + path: "{{ nixosfi_ssh_key_path }}" + type: rsa + size: 2048 + comment: "kdevops@qsu" + force: false + tags: do_install + + - name: Read SSH public key + ansible.builtin.slurp: + src: "{{ nixosfi_ssh_key_path }}.pub" + register: nixosfi_ssh_public_key + + - name: Render per-node imageless flake.nix + ansible.builtin.template: + src: "{{ playbook_dir }}/roles/nixosfi/templates/flake.nix.j2" + dest: "{{ nixosfi_config_dir }}/{{ item }}/flake.nix" + mode: "0644" + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + tags: do_install + + - name: Render per-node imageless default.nix + ansible.builtin.template: + src: "{{ playbook_dir }}/roles/nixosfi/templates/default.nix.j2" + dest: "{{ nixosfi_config_dir }}/{{ item }}/default.nix" + mode: "0644" + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + vars: + vm_name: "{{ item }}" + nixosfi_ssh_authorized_key: "{{ nixosfi_ssh_public_key['content'] | b64decode | trim }}" + tags: do_install diff --git a/playbooks/roles/nixosfi/tasks/imageless-build-per-vm.yml b/playbooks/roles/nixosfi/tasks/imageless-build-per-vm.yml new file mode 100644 index 00000000..e8adf18c --- /dev/null +++ b/playbooks/roles/nixosfi/tasks/imageless-build-per-vm.yml @@ -0,0 +1,40 @@ +--- +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# Per-VM imageless closure build: nix-build the toplevel, read the +# bootspec for init/initrd, then hand the boot artefacts to the qsu +# runtime to render this guest's env and unit drop-ins. Looped from +# imageless-build.yml with qsu_vm_name / qsu_vm_idx. + +- name: Build the imageless NixOS closure for {{ qsu_vm_name }} + ansible.builtin.command: + argv: + - nix + - build + - "path:{{ nixosfi_config_dir }}/{{ qsu_vm_name }}#toplevel" + - --out-link + - "{{ nixosfi_config_dir }}/{{ qsu_vm_name }}/result" + environment: + PATH: "/nix/var/nix/profiles/default/bin:{{ lookup('env', 'PATH') | default('/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin') }}" + changed_when: true + +- name: Read bootspec from the built closure for {{ qsu_vm_name }} + ansible.builtin.slurp: + src: "{{ nixosfi_config_dir }}/{{ qsu_vm_name }}/result/boot.json" + register: nixosfi_bootspec_raw + +- name: Extract init and initrd paths from bootspec for {{ qsu_vm_name }} + ansible.builtin.set_fact: + nixosfi_init: "{{ (nixosfi_bootspec_raw.content | b64decode | from_json)['org.nixos.bootspec.v1'].init }}" + nixosfi_initrd: "{{ (nixosfi_bootspec_raw.content | b64decode | from_json)['org.nixos.bootspec.v1'].initrd }}" + +- name: Render qsu runtime artefacts for {{ qsu_vm_name }} + ansible.builtin.include_role: + name: qsu + tasks_from: render-per-vm + vars: + qsu_kernel_release: "{{ nixosfi_kernel_release }}" + qsu_kernel_image: "{{ nixosfi_kernel_image }}" + qsu_modules_dir: "{{ nixosfi_modules_dir }}" + qsu_init: "{{ nixosfi_init }}" + qsu_initrd: "{{ nixosfi_initrd }}" diff --git a/playbooks/roles/nixosfi/tasks/imageless-build.yml b/playbooks/roles/nixosfi/tasks/imageless-build.yml new file mode 100644 index 00000000..560a8c1b --- /dev/null +++ b/playbooks/roles/nixosfi/tasks/imageless-build.yml @@ -0,0 +1,62 @@ +--- +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# Build the per-node imageless NixOS closure and render qsu's +# per-VM env files using its own upstream templates, so systemd +# can start each VM against a freshly built closure and the +# controller-installed kernel from bootlinux. + +- name: Resolve controller-built kernel release from the linux build tree + ansible.builtin.command: + chdir: "{{ bootlinux_direct_boot_tree_path }}" + argv: + - make + - --silent + - O={{ bootlinux_direct_boot_builddir }} + - kernelrelease + environment: + LOCALVERSION: "{{ target_linux_localversion | default('', true) }}" + register: nixosfi_kernelrelease_make + changed_when: false + +- name: Derive the controller-built kernel artefact paths + ansible.builtin.set_fact: + nixosfi_kernel_release: "{{ nixosfi_kernelrelease_make.stdout | trim }}" + nixosfi_kernel_image: "{{ bootlinux_direct_boot_destdir }}/boot/vmlinuz-{{ nixosfi_kernelrelease_make.stdout | trim }}" + nixosfi_modules_dir: "{{ bootlinux_direct_boot_destdir }}/lib/modules" + +- name: Ensure the qsu vars directory exists for debug snapshots + ansible.builtin.file: + path: "{{ qsu_vars_dir }}" + state: directory + mode: "0755" + +# `nix build path:<dir>` pins each input by narHash in flake.lock. +# A leftover flake.lock from a previous bringup keeps that pin +# pointed at the old nixos-flake source tree, so subsequent builds +# silently reuse a stale closure even after the in-tree subtree +# (modules, overlays, packages) changes — including changes that +# fix module-evaluation errors. `rebuild-boot.yml` already does +# this refresh on the kernel-rebuild path; bringup needs the +# same step for first-time and re-bringup runs after edits. +- name: Refresh nixos-flake flake input for each VM + ansible.builtin.command: + argv: + - nix + - flake + - update + - --flake + - "path:{{ nixosfi_config_dir }}/{{ item }}" + - nixos-flake + environment: + PATH: "/nix/var/nix/profiles/default/bin:{{ lookup('env', 'PATH') | default('/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin') }}" + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + changed_when: true + +- name: Prepare qsu imageless artefacts per VM + ansible.builtin.include_tasks: imageless-build-per-vm.yml + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + loop_control: + loop_var: qsu_vm_name + index_var: qsu_vm_idx + label: "{{ qsu_vm_name }}" diff --git a/playbooks/roles/nixosfi/tasks/main.yml b/playbooks/roles/nixosfi/tasks/main.yml new file mode 100644 index 00000000..a8cdafb0 --- /dev/null +++ b/playbooks/roles/nixosfi/tasks/main.yml @@ -0,0 +1,87 @@ +--- +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# nixosfi role entry point: the imageless NixOS backend. It owns the +# nix work (per-node flakes, closure build, kernel rebuild) and drives +# the qsu runtime (dependency install, systemd units, VM lifecycle) +# through include_role ... tasks_from. Each phase is tag-gated; the +# nixosfi Make targets pass the matching tag. + +- name: Install the qsu runtime dependencies + ansible.builtin.include_role: + name: qsu + tasks_from: install-deps + apply: + tags: [install-deps] + tags: [install-deps] + +- name: Render the shared qsu systemd units + ansible.builtin.include_role: + name: qsu + tasks_from: render-units + apply: + tags: [generate-configs] + tags: [generate-configs] + +- name: Generate the per-node imageless flakes + ansible.builtin.import_tasks: + file: "{{ role_path }}/tasks/generate-configs.yml" + tags: [generate-configs] + +- name: Build the imageless closures and render per-VM qsu artefacts + ansible.builtin.import_tasks: + file: "{{ role_path }}/tasks/imageless-build.yml" + tags: [build-vms] + +- name: Bring up the qsu machines + ansible.builtin.include_role: + name: qsu + tasks_from: bringup + apply: + tags: [bringup] + tags: [bringup] + +- name: Show the console access banner + ansible.builtin.include_role: + name: qsu + tasks_from: console + apply: + tags: [console] + tags: [console] + +- name: Stop the qsu machines + ansible.builtin.include_role: + name: qsu + tasks_from: stop-vms + apply: + tags: [stop-vms] + tags: [stop-vms] + +- name: Rebuild and reboot guests onto a freshly built kernel + ansible.builtin.import_tasks: + file: "{{ role_path }}/tasks/rebuild-boot.yml" + tags: [rebuild-boot] + +- name: Restart the qsu machines + ansible.builtin.include_role: + name: qsu + tasks_from: restart-vms + apply: + tags: [restart-vms] + tags: [restart-vms] + +- name: Start the qsu machines + ansible.builtin.include_role: + name: qsu + tasks_from: start-vms + apply: + tags: [start-vms] + tags: [start-vms] + +- name: Destroy the qsu machines + ansible.builtin.include_role: + name: qsu + tasks_from: destroy + apply: + tags: [destroy] + tags: [destroy, never] diff --git a/playbooks/roles/nixosfi/tasks/rebuild-boot.yml b/playbooks/roles/nixosfi/tasks/rebuild-boot.yml new file mode 100644 index 00000000..9b398b53 --- /dev/null +++ b/playbooks/roles/nixosfi/tasks/rebuild-boot.yml @@ -0,0 +1,27 @@ +--- +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# Re-render per-VM artefacts so the next start of +# qemu-system@<vm>.service boots from the latest closure. No +# hot activation. See README.md. +# +# Renders per-node default.nix first, in case the role's template +# vars (workflow toggles, monitoring opt-in, ssh key) changed +# since bringup. Without this step the closure built by +# imageless-build.yml would still reflect the bringup-time +# default.nix and skip new module imports or removed options. + +# Re-render per-node flake.nix and default.nix in case Kconfig +# toggles or template content changed since bringup. Imports +# generate-configs.yml because the default.nix template depends on +# the SSH key fact which generate-configs.yml sets — duplicating +# the fact resolution here would drift out of sync. +- name: Re-render per-node imageless configs for rebuild-boot + ansible.builtin.import_tasks: generate-configs.yml + +# The flake-input refreshes (nixos-flake plus any active +# per-package source-override) and the closure rebuild itself live +# in imageless-build.yml; both the bringup and rebuild-boot paths +# import it. +- name: Rebuild imageless toplevel closure for rebuild-boot + ansible.builtin.import_tasks: imageless-build.yml diff --git a/playbooks/roles/nixosfi/tasks/rebuild-test.yml b/playbooks/roles/nixosfi/tasks/rebuild-test.yml new file mode 100644 index 00000000..4a7b31ed --- /dev/null +++ b/playbooks/roles/nixosfi/tasks/rebuild-test.yml @@ -0,0 +1,35 @@ +--- +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# Rebuild the per-VM imageless NixOS closure on the controller +# and activate it on the running guest. See README.md. + +- name: Rebuild imageless NixOS toplevel on the controller for {{ inventory_hostname }} + delegate_to: localhost + ansible.builtin.command: + argv: + - nix + - build + - "path:{{ nixosfi_config_dir }}/{{ inventory_hostname }}#toplevel" + - --out-link + - "{{ nixosfi_config_dir }}/{{ inventory_hostname }}/result" + environment: + PATH: "/nix/var/nix/profiles/default/bin:{{ lookup('env', 'PATH') | default('/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin') }}" + changed_when: true + +- name: Resolve new toplevel store path for {{ inventory_hostname }} + delegate_to: localhost + ansible.builtin.command: + argv: + - readlink + - -f + - "{{ nixosfi_config_dir }}/{{ inventory_hostname }}/result" + register: nixosfi_new_toplevel + changed_when: false + +- name: Activate new toplevel on the running guest {{ inventory_hostname }} + ansible.builtin.command: + cmd: "{{ nixosfi_new_toplevel.stdout }}/bin/switch-to-configuration test" + register: nixosfi_activate_result + failed_when: nixosfi_activate_result.rc not in [0, 4, 100] + changed_when: nixosfi_activate_result.rc in [0, 4, 100] diff --git a/playbooks/roles/nixosfi/templates/default.nix.j2 b/playbooks/roles/nixosfi/templates/default.nix.j2 new file mode 100644 index 00000000..026275b2 --- /dev/null +++ b/playbooks/roles/nixosfi/templates/default.nix.j2 @@ -0,0 +1,75 @@ +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# Per-node overrides for {{ vm_name }}. Generated by kdevops. +# +# The flake that imports this module (copied from +# scripts/nixos-flake/templates/imageless/flake.nix) +# passes `nixos-flake` and the flake inputs through specialArgs, so +# backend, profile, mount, and testSuite modules are imported +# directly and mirror substituters attach to nixos-flake's overlay +# through plain nixpkgs config. +{ config, lib, pkgs, nixos-flake, inputs, ... }: { + imports = [ + nixos-flake.nixosModules.backends.imageless + nixos-flake.nixosModules.user +{% if nixos_flake_profile_devel is defined and nixos_flake_profile_devel %} + nixos-flake.nixosModules.profiles.devel +{% endif %} +{% if nixos_flake_profile_build_tools is defined and nixos_flake_profile_build_tools %} + nixos-flake.nixosModules.profiles.build-tools +{% endif %} +{% if nixos_flake_profile_monitoring is defined and nixos_flake_profile_monitoring %} + nixos-flake.nixosModules.profiles.monitoring +{% endif %} +{% if nixos_flake_mount_shares is defined and nixos_flake_mount_shares %} + nixos-flake.nixosModules.mounts.shares +{% endif %} +{% if nixos_flake_mount_storage is defined and nixos_flake_mount_storage %} + nixos-flake.nixosModules.mounts.storage +{% endif %} +{% if nixos_flake_testsuite_fstests is defined and nixos_flake_testsuite_fstests %} + nixos-flake.nixosModules.testSuites.fstests +{% endif %} +{% if nixos_flake_testsuite_blktests is defined and nixos_flake_testsuite_blktests %} + nixos-flake.nixosModules.testSuites.blktests +{% endif %} +{% if nixos_flake_testsuite_ltp is defined and nixos_flake_testsuite_ltp %} + nixos-flake.nixosModules.testSuites.ltp +{% endif %} +{% if nixos_flake_testsuite_mmtests is defined and nixos_flake_testsuite_mmtests %} + nixos-flake.nixosModules.testSuites.mmtests +{% endif %} +{% if nixos_flake_testsuite_pynfs is defined and nixos_flake_testsuite_pynfs %} + nixos-flake.nixosModules.testSuites.pynfs +{% endif %} +{% if nixos_flake_testsuite_gitr is defined and nixos_flake_testsuite_gitr %} + nixos-flake.nixosModules.testSuites.gitr +{% endif %} +{% if nixos_flake_testsuite_selftests is defined and nixos_flake_testsuite_selftests %} + nixos-flake.nixosModules.testSuites.selftests +{% endif %} +{% if nixos_flake_testsuite_sysbench is defined and nixos_flake_testsuite_sysbench %} + nixos-flake.nixosModules.testSuites.sysbench +{% endif %} + ]; + + networking.hostName = "{{ vm_name }}"; + + nixos-flake.user.name = "kdevops"; + +{% if nixosfi_ssh_authorized_key is defined %} + users.users.root.openssh.authorizedKeys.keys = [ "{{ nixosfi_ssh_authorized_key }}" ]; + users.users.kdevops.openssh.authorizedKeys.keys = [ "{{ nixosfi_ssh_authorized_key }}" ]; +{% endif %} + +{% if bootlinux_9p is defined and bootlinux_9p %} + # 9P mount for shared kernel source + boot.kernelModules = [ "9p" "9pnet_virtio" ]; + boot.initrd.kernelModules = [ "9p" "9pnet_virtio" ]; + fileSystems."/mnt/linux" = { + device = "linux_source"; + fsType = "9p"; + options = [ "trans=virtio" "version=9p2000.L" "cache=loose" ]; + }; +{% endif %} +} diff --git a/playbooks/roles/nixosfi/templates/flake.nix.j2 b/playbooks/roles/nixosfi/templates/flake.nix.j2 new file mode 100644 index 00000000..fce2fe68 --- /dev/null +++ b/playbooks/roles/nixosfi/templates/flake.nix.j2 @@ -0,0 +1,41 @@ +{# + SPDX-License-Identifier: copyleft-next-0.3.1 + + Per-VM imageless flake rendered by kdevops. Mirrors upstream's + starter at scripts/nixos-flake/templates/imageless/flake.nix and + resolves the nixos-flake input at the vendored subtree. Builds the + system toplevel closure (packages.<system>.toplevel) that qsu boots + imagelessly: tmpfs root with /nix/store and /lib/modules over + virtiofs, no disk image. +#} +{ + inputs = { + nixos-flake.url = "path:{{ topdir_path }}/scripts/nixos-flake"; + nixpkgs.follows = "nixos-flake/nixpkgs"; + }; + + outputs = + { + self, + nixpkgs, + nixos-flake, + ... + }@inputs: + let + system = "x86_64-linux"; + in + { + nixosConfigurations.vm = nixpkgs.lib.nixosSystem { + inherit system; + specialArgs = { inherit inputs nixos-flake; }; + modules = [ + nixos-flake.nixosModules.backends.imageless + nixos-flake.nixosModules.user + { nixpkgs.overlays = [ nixos-flake.overlays.default ]; } + ./default.nix + ]; + }; + + packages.${system}.toplevel = self.nixosConfigurations.vm.config.system.build.toplevel; + }; +} diff --git a/playbooks/roles/qsu/tasks/bringup.yml b/playbooks/roles/qsu/tasks/bringup.yml new file mode 100644 index 00000000..6d8de4a2 --- /dev/null +++ b/playbooks/roles/qsu/tasks/bringup.yml @@ -0,0 +1,105 @@ +--- +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# Start each imageless guest as a systemd machine (qemu-system@ +# service registered with machined), wait for +# sshd on the forwarded port, register it in ~/.ssh/config. + +- name: Reload user systemd so new unit files and drop-ins are visible + ansible.builtin.systemd_service: + daemon_reload: true + scope: user + +# daemon-reload does not restart running virtiofsd sockets, so a +# re-rendered template leaves a zombie listener that QEMU's later +# connect sees as refused. Restrict the per-share socket-restart +# set to env files that match our own inventory-VM x share-tag +# product; a blind glob would touch sockets serving live VMs in +# other kdevops trees on the same host. +- name: Compute expected per-share env paths for inventory VMs + ansible.builtin.set_fact: + qsu_owned_env_paths: >- + {{ + (groups['all'] | reject('equalto', 'localhost') | list) + | product(qsu_canonical_share_tags) + | map('join', '-') + | map('regex_replace', '^', + lookup('env', 'HOME') ~ '/.config/systemd/virtiofsd/') + | map('regex_replace', '$', '.env') + | list + }} + +- name: Locate deployed virtiofsd per-share env files + ansible.builtin.find: + paths: "{{ lookup('env', 'HOME') }}/.config/systemd/virtiofsd" + patterns: "*.env" + file_type: file + register: qsu_virtiofsd_envs_all + +- name: Restrict env list to exact-path matches owned by inventory VMs + ansible.builtin.set_fact: + qsu_virtiofsd_envs_owned: >- + {{ + qsu_virtiofsd_envs_all.files + | selectattr('path', 'in', qsu_owned_env_paths) + | list + }} + +- name: Restart virtiofsd sockets so QEMU connects to fresh listeners + ansible.builtin.systemd_service: + name: "virtiofsd@{{ item.path | basename | splitext | first }}.socket" + state: restarted + scope: user + loop: "{{ qsu_virtiofsd_envs_owned }}" + loop_control: + label: "virtiofsd@{{ item.path | basename | splitext | first }}.socket" + +- name: Start qemu-system@<vm> instances + ansible.builtin.systemd_service: + name: "qemu-system@{{ item }}.service" + state: started + scope: user + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + +- name: Determine SSH key path + ansible.builtin.command: python3 {{ playbook_dir }}/../scripts/nixosfi_ssh_key_name.py --path + register: qsu_ssh_key_path_result + changed_when: false + +- name: Wait for sshd to greet on each VM's forwarded port + ansible.builtin.wait_for: + host: 127.0.0.1 + port: "{{ qsu_ssh_port_base | int + qsu_vm_idx }}" + search_regex: "^SSH-2\\.0" + delay: 5 + timeout: 300 + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + loop_control: + loop_var: qsu_vm_name + index_var: qsu_vm_idx + label: "{{ qsu_vm_name }}:{{ qsu_ssh_port_base | int + qsu_vm_idx }}" + +- name: Update SSH config for qsu VMs + ansible.builtin.command: + argv: + - python3 + - "{{ playbook_dir }}/../scripts/update_ssh_config_nixosfi.py" + - update + - "{{ qsu_vm_name }}" + - 127.0.0.1 + - "{{ qsu_ssh_port_base | int + qsu_vm_idx }}" + - root + - "{{ lookup('env', 'HOME') }}/.ssh/config" + - "{{ qsu_ssh_key_path_result.stdout | trim }}" + - qsu imageless NixOS + - --vsock-cid + - "{{ qsu_vsock_cid_base | int + qsu_vm_idx }}" + - --default-transport + - "{{ 'tcp' if qsu_ssh_default_tcp | default(false) | bool else 'vsock' }}" + register: qsu_ssh_config_update + changed_when: qsu_ssh_config_update.rc == 0 + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + loop_control: + loop_var: qsu_vm_name + index_var: qsu_vm_idx + label: "{{ qsu_vm_name }}" diff --git a/playbooks/roles/qsu/tasks/console.yml b/playbooks/roles/qsu/tasks/console.yml new file mode 100644 index 00000000..9a88547d --- /dev/null +++ b/playbooks/roles/qsu/tasks/console.yml @@ -0,0 +1,23 @@ +--- +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# Final status banner listing SSH, VSOCK, and console access for +# each imageless VM plus the common systemctl and machinectl +# commands. + +- name: Display qsu VM access information + ansible.builtin.debug: + msg: | + qemu-system-units imageless NixOS VMs are running. + + {% for vm in groups['all'] | reject('equalto', 'localhost') | list %} + {% set idx = loop.index0 %} + {{ vm }}: + ssh: ssh {{ vm }} (or ssh -p {{ qsu_ssh_port_base | int + idx }} [email protected]) + vsock: ssh root@vsock/{{ qsu_vsock_cid_base | int + idx }} + console: socat -,raw,echo=0,escape=0x1d UNIX-CONNECT:$XDG_RUNTIME_DIR/qemu-system/{{ vm }}/console.sock + {% endfor %} + + Status: systemctl --user status qemu-system@<vm> + Logs: journalctl --user-unit=qemu-system@<vm>.service + List: machinectl --user list diff --git a/playbooks/roles/qsu/tasks/destroy.yml b/playbooks/roles/qsu/tasks/destroy.yml new file mode 100644 index 00000000..50849258 --- /dev/null +++ b/playbooks/roles/qsu/tasks/destroy.yml @@ -0,0 +1,134 @@ +--- +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# Stop any running qsu VMs and remove the shared units plus +# the QMP powerdown helper. + +# Each qemu-system stop uses QMP system_powerdown via ExecStop, +# falling back to SIGKILL after TimeoutStopSec=2min. Run all +# stops in parallel via async so wall time is max(per-VM) and +# not N * 2min worst-case. The 180s async cap leaves a small +# buffer past TimeoutStopSec for systemd's own teardown. +# +# systemctl(1) is used instead of the systemd_service module +# so a partially-cleaned tree (missing unit file, live cgroup) +# still stops cleanly; the module errors on LOAD=not-found +# even when ACTIVE=running. +- name: Stop qemu-system@<vm> instances (parallel) + ansible.builtin.command: + argv: + - systemctl + - --user + - stop + - "qemu-system@{{ item }}.service" + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + loop_control: + label: "qemu-system@{{ item }}" + async: 180 + poll: 0 + register: qsu_stop_jobs + changed_when: true + failed_when: false + +- name: Wait for qemu-system stops to complete + ansible.builtin.async_status: + jid: "{{ item.ansible_job_id }}" + loop: "{{ qsu_stop_jobs.results }}" + loop_control: + label: "qemu-system@{{ item.item }}" + register: qsu_stop_wait + until: qsu_stop_wait.finished + retries: 60 + delay: 3 + failed_when: false + when: item.ansible_job_id is defined + +- name: Remove SSH config entries for qsu VMs + ansible.builtin.command: + argv: + - python3 + - "{{ playbook_dir }}/../scripts/update_ssh_config_nixosfi.py" + - remove + - "{{ item }}" + - "" + - "" + - "" + - "{{ lookup('env', 'HOME') }}/.ssh/config" + - "" + - qsu imageless NixOS + register: qsu_ssh_config_remove + changed_when: qsu_ssh_config_remove.rc == 0 + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + failed_when: false + +- name: Clean up per-node generated imageless configurations + ansible.builtin.file: + path: "{{ nixosfi_config_dir }}/{{ item }}" + state: absent + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + +- name: Remove per-VM vm.env files + ansible.builtin.file: + path: "{{ lookup('env', 'HOME') }}/.config/systemd/qemu-system/{{ item }}.env" + state: absent + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + +- name: Remove per-VM service drop-in directories + ansible.builtin.file: + path: "{{ lookup('env', 'HOME') }}/.config/systemd/user/qemu-system@{{ item }}.service.d" + state: absent + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + +- name: Remove per-share virtiofsd env files + ansible.builtin.file: + path: "{{ lookup('env', 'HOME') }}/.config/systemd/virtiofsd/{{ item.0 }}-{{ item.1 }}.env" + state: absent + loop: "{{ (groups['all'] | reject('equalto', 'localhost') | list) | product(qsu_canonical_share_tags) | list }}" + loop_control: + label: "{{ item.0 }}-{{ item.1 }}" + +- name: Remove per-(VM, share) virtiofsd drop-in directories + ansible.builtin.file: + path: "{{ lookup('env', 'HOME') }}/.config/systemd/user/virtiofsd@{{ item.0 }}-{{ item.1 }}.service.d" + state: absent + loop: "{{ (groups['all'] | reject('equalto', 'localhost') | list) | product(qsu_canonical_share_tags) | list }}" + loop_control: + label: "virtiofsd@{{ item.0 }}-{{ item.1 }}.service.d" + +# `true` as the third default() arg so an empty XDG_STATE_HOME +# falls through to $HOME/.local/state rather than producing a +# bogus "/qemu-system/<vm>" path. +- name: Resolve systemd state root for destroy + ansible.builtin.set_fact: + qsu_state_root: "{{ lookup('env', 'XDG_STATE_HOME') | default(lookup('env', 'HOME') ~ '/.local/state', true) }}/qemu-system" + +# Workloads may leave entries with restrictive modes inside the +# per-VM /data tree. Restore owner traversal so the following +# state: absent task can finish. +- name: Make per-VM state directories traversable before removal + ansible.builtin.command: + cmd: "chmod -R u+rwX {{ qsu_state_root }}/{{ item }}" + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + failed_when: false + changed_when: false + +- name: Remove per-VM systemd state directories + ansible.builtin.file: + path: "{{ qsu_state_root }}/{{ item }}" + state: absent + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + +- name: Remove qsu shared units and helper + ansible.builtin.file: + path: "{{ item }}" + state: absent + loop: + - "{{ lookup('env', 'HOME') }}/.config/systemd/user/[email protected]" + - "{{ lookup('env', 'HOME') }}/.config/systemd/user/[email protected]" + - "{{ lookup('env', 'HOME') }}/.config/systemd/user/[email protected]" + - "{{ lookup('env', 'HOME') }}/.config/systemd/qemu-system/qmp-powerdown" + +- name: Reload user systemd after removal + ansible.builtin.systemd_service: + daemon_reload: true + scope: user diff --git a/playbooks/roles/qsu/tasks/install-deps.yml b/playbooks/roles/qsu/tasks/install-deps.yml new file mode 100644 index 00000000..1694a922 --- /dev/null +++ b/playbooks/roles/qsu/tasks/install-deps.yml @@ -0,0 +1,31 @@ +--- +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# Host dependencies for the qsu runtime (nixosfi backend): the +# QEMU system emulator, virtiofsd, socat for QMP graceful shutdown, +# and systemd-container for machinectl. Nix is handled by the +# existing nixos-flake path when the imageless guest image is built. + +- name: Ensure qsu dependencies are installed (Debian) + become: true + ansible.builtin.package: + name: + - qemu-system-x86 + - qemu-utils + - socat + - systemd-container + - virtiofsd + state: present + when: ansible_facts.os_family == "Debian" + +- name: Ensure qsu dependencies are installed (RedHat) + become: true + ansible.builtin.package: + name: + - qemu-kvm + - qemu-img + - socat + - systemd-container + - virtiofsd + state: present + when: ansible_facts.os_family == "RedHat" diff --git a/playbooks/roles/qsu/tasks/render-per-vm.yml b/playbooks/roles/qsu/tasks/render-per-vm.yml new file mode 100644 index 00000000..83895bda --- /dev/null +++ b/playbooks/roles/qsu/tasks/render-per-vm.yml @@ -0,0 +1,280 @@ +--- +# SPDX-License-Identifier: copyleft-next-0.3.1 + +# Mirrors [email protected] StateDirectory=qemu-system/%i so +# vm.env relative paths resolve against the service WorkingDirectory. +- name: Compute per-VM systemd state directory for {{ qsu_vm_name }} + ansible.builtin.set_fact: + qsu_state_dir: "{{ lookup('env', 'XDG_STATE_HOME') | default(lookup('env', 'HOME') ~ '/.local/state', true) }}/qemu-system/{{ qsu_vm_name }}" + +- name: Ensure qsu per-VM directories exist + ansible.builtin.file: + path: "{{ item }}" + state: directory + mode: "0755" + loop: "{{ qsu_per_vm_dirs }}" + vars: + qsu_per_vm_dirs_base: + - "{{ lookup('env', 'HOME') }}/.config/systemd/qemu-system" + - "{{ lookup('env', 'HOME') }}/.config/systemd/virtiofsd" + - "{{ lookup('env', 'HOME') }}/.config/systemd/user/qemu-system@{{ qsu_vm_name }}.service.d" + - "{{ qsu_state_dir }}" + - "{{ qsu_state_dir }}/data" + - "{{ qsu_state_dir }}/data/configs" + # data-results is per-(vm, kernel) so A/B kernel builds don't + # clobber each other and tooling can index runs by (vm, kernel). + qsu_per_vm_dirs_fstests: >- + {{ + [topdir_path ~ '/workflows/fstests/results/' ~ qsu_vm_name, + topdir_path ~ '/workflows/fstests/results/' ~ qsu_vm_name ~ '/' ~ qsu_kernel_release] + if (kdevops_workflow_enable_fstests | default(false) | bool) + else [] + }} + qsu_per_vm_dirs: "{{ qsu_per_vm_dirs_base + qsu_per_vm_dirs_fstests }}" + +# last-run points at the kernel vm.env is currently rendered for; +# rebuild-boot re-runs this task so the symlink follows. +- name: Update last-run symlink for {{ qsu_vm_name }} + ansible.builtin.file: + src: "{{ qsu_kernel_release }}" + dest: "{{ topdir_path }}/workflows/fstests/results/{{ qsu_vm_name }}/last-run" + state: link + force: true + when: + - kdevops_workflow_enable_fstests | default(false) | bool + +- name: Update last-kernel.txt for {{ qsu_vm_name }} + ansible.builtin.copy: + content: "{{ qsu_kernel_release }}\n" + dest: "{{ topdir_path }}/workflows/fstests/results/{{ qsu_vm_name }}/last-kernel.txt" + mode: "0644" + when: + - kdevops_workflow_enable_fstests | default(false) | bool + +- name: Create per-VM NVMe qcow2 backing files for {{ qsu_vm_name }} + ansible.builtin.command: + argv: + - qemu-img + - create + - -f + - qcow2 + - "{{ qsu_state_dir }}/nvme{{ item }}.qcow2" + - "{{ qsu_nvme_drive_size_gb }}G" + creates: "{{ qsu_state_dir }}/nvme{{ item }}.qcow2" + loop: "{{ range(qsu_nvme_drive_count | int) | list }}" + loop_control: + label: "{{ qsu_vm_name }}-nvme{{ item }}" + +- name: Reset per-VM nvme drives accumulator for {{ qsu_vm_name }} + ansible.builtin.set_fact: + qsu_nvme_drives: [] + +# `kdevops<N>` serial matches the libvirt bringup; by-id symlinks +# resolve the same on both backends. Each BlockConf knob takes a +# single value (global) or comma-list of length N (per-drive). +- name: Compose per-VM nvme drives for {{ qsu_vm_name }} + ansible.builtin.set_fact: + qsu_nvme_drives: "{{ qsu_nvme_drives + [composed_drive] }}" + vars: + base_drive: + file: "nvme{{ item }}.qcow2" + format: qcow2 + serial: "kdevops{{ item }}" + blockconf_knobs: + logical_block_size: "{{ qsu_nvme_logical_block_size | default('') | string }}" + physical_block_size: "{{ qsu_nvme_physical_block_size | default('') | string }}" + min_io_size: "{{ qsu_nvme_min_io_size | default('') | string }}" + opt_io_size: "{{ qsu_nvme_opt_io_size | default('') | string }}" + discard_granularity: "{{ qsu_nvme_discard_granularity | default('') | string }}" + write-cache: "{{ qsu_nvme_write_cache | default('') | string }}" + # MDTS encoded as log2 above CAP.MPSMIN (4 KiB): mdts=N -> + # (1 << N) * 4 KiB. QEMU defaults to 7 (= 512 KiB). + mdts: "{{ qsu_nvme_mdts | default('') | string }}" + # atomic.{dn,awun,awupf} are NvmeCtrl; atomic.{nawun,nawupf, + # nabsn,nabspf,nabo} are NvmeNamespace. The partition step + # below routes each to its device. Linux's nvme_atomic_bs + # reads NAWUPF, so the namespace fields drive + # /sys/block/<dev>/queue/atomic_write_unit_max_bytes. + "atomic.dn": "{{ qsu_nvme_atomic_dn | default('') | string }}" + "atomic.awun": "{{ qsu_nvme_atomic_awun | default('') | string }}" + "atomic.awupf": "{{ qsu_nvme_atomic_awupf | default('') | string }}" + "atomic.nawun": "{{ qsu_nvme_atomic_nawun | default('') | string }}" + "atomic.nawupf": "{{ qsu_nvme_atomic_nawupf | default('') | string }}" + "atomic.nabsn": "{{ qsu_nvme_atomic_nabsn | default('') | string }}" + "atomic.nabspf": "{{ qsu_nvme_atomic_nabspf | default('') | string }}" + "atomic.nabo": "{{ qsu_nvme_atomic_nabo | default('') | string }}" + drive_overrides: >- + {%- set out = {} -%} + {%- for key, raw in blockconf_knobs.items() -%} + {%- set parts = raw.split(',') -%} + {%- set value = parts[0] if (parts | length == 1) else (parts[item] if item < (parts | length) else '') -%} + {%- if (value | string | length) > 0 -%} + {%- set _ = out.update({key: value}) -%} + {%- endif -%} + {%- endfor -%} + {{ out }} + # Route each key to the device that accepts it; BlockConf lands + # on whichever device owns the drive backend (controller in + # simple mode, namespace in explicit mode). + nvme_ctrl_keys: ["mdts", "atomic.dn", "atomic.awun", "atomic.awupf"] + nvme_ns_keys: ["atomic.nawun", "atomic.nawupf", "atomic.nabsn", "atomic.nabspf", "atomic.nabo"] + nvme_blockconf_keys: ["logical_block_size", "physical_block_size", "min_io_size", "opt_io_size", "discard_granularity", "write-cache"] + ctrl_overrides: >- + {%- set out = {} -%} + {%- for k in nvme_ctrl_keys -%} + {%- if k in drive_overrides -%}{%- set _ = out.update({k: drive_overrides[k]}) -%}{%- endif -%} + {%- endfor -%} + {{ out }} + ns_overrides: >- + {%- set out = {} -%} + {%- for k in nvme_ns_keys -%} + {%- if k in drive_overrides -%}{%- set _ = out.update({k: drive_overrides[k]}) -%}{%- endif -%} + {%- endfor -%} + {{ out }} + blockconf_overrides: >- + {%- set out = {} -%} + {%- for k in nvme_blockconf_keys -%} + {%- if k in drive_overrides -%}{%- set _ = out.update({k: drive_overrides[k]}) -%}{%- endif -%} + {%- endfor -%} + {{ out }} + # Pivot to explicit-namespace mode when any per-namespace + # atomic.* is set; QEMU only accepts those on -device nvme-ns. + composed_drive: >- + {%- if (nvme_ns_keys | select('in', drive_overrides) | list | length) > 0 -%} + {%- set ns0 = {'file': base_drive.file, 'format': base_drive.format} | combine(blockconf_overrides) | combine(ns_overrides) -%} + {{ {'serial': base_drive.serial} | combine(ctrl_overrides) | combine({'namespaces': [ns0]}) }} + {%- else -%} + {{ base_drive | combine(ctrl_overrides) | combine(blockconf_overrides) }} + {%- endif -%} + loop: "{{ range(qsu_nvme_drive_count | int) | list }}" + loop_control: + label: "{{ qsu_vm_name }}-kdevops{{ item }}" + +- name: Compose per-VM virtiofs shares for {{ qsu_vm_name }} + ansible.builtin.set_fact: + qsu_shares: "{{ qsu_shares_base + qsu_shares_fstests }}" + vars: + qsu_shares_base: + - tag: store + dir: /nix/store + mount: /nix/store + - tag: modules + dir: "{{ qsu_modules_dir }}" + mount: /lib/modules + qsu_shares_fstests: >- + {{ + [ + {'tag': 'data-configs', + 'dir': qsu_state_dir ~ '/data/configs', + 'mount': '/data/configs'}, + {'tag': 'data-results', + 'dir': topdir_path ~ '/workflows/fstests/results/' ~ qsu_vm_name ~ '/' ~ qsu_kernel_release, + 'mount': '/data/results'}, + {'tag': 'kdevops-fstests', + 'dir': topdir_path ~ '/workflows/fstests', + 'mount': '/usr/local/lib/kdevops/fstests'} + ] + if (kdevops_workflow_enable_fstests | default(false) | bool) + else [] + }} + +- name: Render vm.env for {{ qsu_vm_name }} + ansible.builtin.template: + src: "{{ topdir_path }}/scripts/qemu-system-units/templates/vm.env.j2" + dest: "{{ lookup('env', 'HOME') }}/.config/systemd/qemu-system/{{ qsu_vm_name }}.env" + mode: "0644" + vars: + vm_name: "{{ qsu_vm_name }}" + qemu_binary: "{{ qsu_qemu_binary }}" + cpu: "{{ qsu_cpu }}" + accel: "{{ qsu_accel }}" + ram: "{{ qsu_ram }}" + cpus: "{{ qsu_cpus }}" + machine_type: "{{ qsu_machine_type }}" + ssh_port: "{{ qsu_ssh_port_base | int + qsu_vm_idx }}" + vsock_cid: "{{ qsu_vsock_cid_base | int + qsu_vm_idx }}" + kernel: + image: "{{ qsu_kernel_image }}" + initrd: "{{ qsu_initrd }}" + append: "root=tmpfs console=ttyS0,115200 console=hvc0 init={{ qsu_init }}" + shares: "{{ qsu_shares }}" + nvme: + drives: "{{ qsu_nvme_drives }}" + +- name: Render qsu debug vars snapshot for {{ qsu_vm_name }} + ansible.builtin.template: + src: debug-vars.yaml.j2 + dest: "{{ qsu_vars_dir }}/{{ qsu_vm_name }}.yaml" + mode: "0644" + vars: + vm_name: "{{ qsu_vm_name }}" + service_scope: user + qemu_binary: "{{ qsu_qemu_binary }}" + cpu: "{{ qsu_cpu }}" + accel: "{{ qsu_accel }}" + ram: "{{ qsu_ram }}" + cpus: "{{ qsu_cpus }}" + machine_type: "{{ qsu_machine_type }}" + ssh_port: "{{ qsu_ssh_port_base | int + qsu_vm_idx }}" + vsock_cid: "{{ qsu_vsock_cid_base | int + qsu_vm_idx }}" + kernel: + image: "{{ qsu_kernel_image }}" + initrd: "{{ qsu_initrd }}" + append: "root=tmpfs console=ttyS0,115200 console=hvc0 init={{ qsu_init }}" + shares: "{{ qsu_shares }}" + nvme: + drives: "{{ qsu_nvme_drives }}" + +- name: Render per-VM service drop-in override.conf for {{ qsu_vm_name }} + ansible.builtin.template: + src: "{{ topdir_path }}/scripts/qemu-system-units/templates/qemu-system-override.conf.j2" + dest: "{{ lookup('env', 'HOME') }}/.config/systemd/user/qemu-system@{{ qsu_vm_name }}.service.d/override.conf" + mode: "0644" + vars: + vm_name: "{{ qsu_vm_name }}" + service_scope: user + qemu_binary: "{{ qsu_qemu_binary }}" + ram: "{{ qsu_ram }}" + machine_type: "{{ qsu_machine_type }}" + vsock_cid: "{{ qsu_vsock_cid_base | int + qsu_vm_idx }}" + shares: "{{ qsu_shares }}" + +# Per-(VM, share) drop-in adding Before=qemu-system@<vm>.service so +# virtiofsd outlives qemu's ExecStop= graceful shutdown. Without it, +# virtiofsd tears down concurrently with the guest's poweroff and +# qemu hits TimeoutStopSec -> SIGKILL waiting on missing virtiofs +# responses. +- name: Ensure per-(VM, share) virtiofsd drop-in dirs exist for {{ qsu_vm_name }} + ansible.builtin.file: + path: "{{ lookup('env', 'HOME') }}/.config/systemd/user/virtiofsd@{{ qsu_vm_name }}-{{ item.tag }}.service.d" + state: directory + mode: "0755" + loop: "{{ qsu_shares }}" + loop_control: + label: "virtiofsd@{{ qsu_vm_name }}-{{ item.tag }}.service.d" + +- name: Render per-(VM, share) virtiofsd drop-in for {{ qsu_vm_name }} + ansible.builtin.template: + src: "{{ topdir_path }}/scripts/qemu-system-units/templates/virtiofsd-override.conf.j2" + dest: "{{ lookup('env', 'HOME') }}/.config/systemd/user/virtiofsd@{{ qsu_vm_name }}-{{ item.tag }}.service.d/override.conf" + mode: "0644" + vars: + vm_name: "{{ qsu_vm_name }}" + loop: "{{ qsu_shares }}" + loop_control: + label: "virtiofsd@{{ qsu_vm_name }}-{{ item.tag }}.service.d/override.conf" + +- name: Render virtiofsd env files for the imageless shares of {{ qsu_vm_name }} + ansible.builtin.template: + src: "{{ topdir_path }}/scripts/qemu-system-units/templates/virtiofsd.env.j2" + dest: "{{ lookup('env', 'HOME') }}/.config/systemd/virtiofsd/{{ qsu_vm_name }}-{{ item.tag }}.env" + mode: "0644" + vars: + vm_name: "{{ qsu_vm_name }}" + share_tag: "{{ item.tag }}" + shares: + - tag: "{{ item.tag }}" + dir: "{{ item.dir }}" + loop: "{{ qsu_shares }}" + loop_control: + label: "{{ qsu_vm_name }}-{{ item.tag }}" diff --git a/playbooks/roles/qsu/tasks/render-units.yml b/playbooks/roles/qsu/tasks/render-units.yml new file mode 100644 index 00000000..624b7301 --- /dev/null +++ b/playbooks/roles/qsu/tasks/render-units.yml @@ -0,0 +1,55 @@ +--- +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# Deploy the three qemu-system-units template units (qemu-system@, +# [email protected], [email protected]) and the QMP powerdown +# script that [email protected]'s ExecStop= pipes into the VM. +# These files are shared across all VMs on the host; per-VM state +# lives in %E/systemd/qemu-system/<vm>.env and is rendered in a +# later task file. + +- name: Ensure user systemd and qsu config directories exist + ansible.builtin.file: + path: "{{ item }}" + state: directory + mode: "0755" + loop: + - "{{ lookup('env', 'HOME') }}/.config/systemd/user" + - "{{ lookup('env', 'HOME') }}/.config/systemd/qemu-system" + +- name: Render [email protected] + ansible.builtin.template: + src: "{{ topdir_path }}/scripts/qemu-system-units/templates/[email protected]" + dest: "{{ lookup('env', 'HOME') }}/.config/systemd/user/[email protected]" + mode: "0644" + vars: + qemu_binary: "{{ qsu_qemu_binary }}" + service_scope: user + +- name: Render [email protected] + ansible.builtin.template: + src: "{{ topdir_path }}/scripts/qemu-system-units/templates/[email protected]" + dest: "{{ lookup('env', 'HOME') }}/.config/systemd/user/[email protected]" + mode: "0644" + vars: + service_scope: user + +- name: Render [email protected] + ansible.builtin.template: + src: "{{ topdir_path }}/scripts/qemu-system-units/templates/[email protected]" + dest: "{{ lookup('env', 'HOME') }}/.config/systemd/user/[email protected]" + mode: "0644" + vars: + service_scope: user + +- name: Install QMP powerdown helper for [email protected] ExecStop= + ansible.builtin.copy: + src: "{{ topdir_path }}/scripts/qemu-system-units/files/qmp-powerdown" + dest: "{{ lookup('env', 'HOME') }}/.config/systemd/qemu-system/qmp-powerdown" + remote_src: true + mode: "0644" + +- name: Reload user systemd so the rendered units are visible + ansible.builtin.systemd_service: + daemon_reload: true + scope: user diff --git a/playbooks/roles/qsu/tasks/restart-vms.yml b/playbooks/roles/qsu/tasks/restart-vms.yml new file mode 100644 index 00000000..5800e79c --- /dev/null +++ b/playbooks/roles/qsu/tasks/restart-vms.yml @@ -0,0 +1,55 @@ +--- +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# Native systemctl restart of every qemu-system@<vm>.service in +# the inventory, then wait for each guest's sshd to greet on its +# forwarded port. Used by `make restart-vms` and +# `make rebuild-restart`. +# +# JOB_RESTART works cleanly because qemu-system-override.conf +# uses Requires=virtiofsd@%i-<tag>.service rather than BindsTo=, +# which removes the UNIT_ATOM_CANNOT_BE_ACTIVE_WITHOUT death-link +# (src/core/unit.c:2233 unit_is_bound_by_inactive()) that +# previously raced the in-place JOB_RESTART -> JOB_START morph +# (src/core/job.c:1027). After the stop phase drops virtiofsd to +# inactive via vhost-user disconnect, the morphed JOB_START runs +# without the death-link tripping; QEMU connects to +# [email protected] and socket activation spawns a fresh +# [email protected]. See +# scripts/qemu-system-units/docs/design-decisions.md +# "virtiofsd dependency: Requires=, not BindsTo=" for the +# tradeoff (loss of automatic crash-kill propagation) and the +# revert path if that property must be re-acquired. + +- name: Restart qemu-system@<vm> instances + ansible.builtin.systemd_service: + name: "qemu-system@{{ item }}.service" + state: restarted + scope: user + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + +# After the restart QEMU re-execs and the guest goes through +# stage-1 + stage-2 boot before sshd is reachable. Without +# blocking on sshd-greeting, the next play (typically +# fstests-baseline) hits the guest while the proxy dialer's +# upstream socket is up but the guest hasn't bound port 22 yet, +# producing +# Failed to connect to the host via ssh: +# mm_receive_fd: recvmsg: expected received 1 got 0 +# proxy dialer did not pass back a connection +# in the very first ssh task. Mirror the same wait_for that +# bringup.yml runs after starting the qemu-system services so +# every restart path enforces the same readiness contract: sshd +# must answer before we declare the VM available. +- name: Wait for sshd to greet on each VM's forwarded port + ansible.builtin.wait_for: + host: 127.0.0.1 + port: "{{ qsu_ssh_port_base | int + qsu_vm_idx }}" + search_regex: "^SSH-2\\.0" + delay: 5 + timeout: 300 + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + loop_control: + loop_var: qsu_vm_name + index_var: qsu_vm_idx + label: "{{ qsu_vm_name }}:{{ qsu_ssh_port_base | int + qsu_vm_idx }}" diff --git a/playbooks/roles/qsu/tasks/start-vms.yml b/playbooks/roles/qsu/tasks/start-vms.yml new file mode 100644 index 00000000..5309995e --- /dev/null +++ b/playbooks/roles/qsu/tasks/start-vms.yml @@ -0,0 +1,46 @@ +--- +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# Start every qemu-system@<vm>.service in the inventory, then +# block until each guest's sshd answers on its forwarded port. +# Used by `make start-vms` and as a building block for +# higher-level lifecycle paths. +# +# The start transaction pulls in JOB_START on every Requires= +# dependency in the per-VM drop-in: virtiofsd@%i-<tag>.socket +# starts (or is already up via WantedBy=sockets.target), and +# qemu's first connection to that socket spawns +# virtiofsd@%i-<tag>.service via socket activation. + +- name: Start qemu-system@<vm> instances + ansible.builtin.systemd_service: + name: "qemu-system@{{ item }}.service" + state: started + scope: user + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + +# After the start QEMU re-execs and the guest goes through +# stage-1 + stage-2 boot before sshd is reachable. Without +# blocking on sshd-greeting, the next play (typically +# fstests-baseline) hits the guest while the proxy dialer's +# upstream socket is up but the guest hasn't bound port 22 yet, +# producing +# Failed to connect to the host via ssh: +# mm_receive_fd: recvmsg: expected received 1 got 0 +# proxy dialer did not pass back a connection +# in the very first ssh task. Mirror the same wait_for that +# bringup.yml runs after starting the qemu-system services so +# every start path enforces the same readiness contract: sshd +# must answer before we declare the VM available. +- name: Wait for sshd to greet on each VM's forwarded port + ansible.builtin.wait_for: + host: 127.0.0.1 + port: "{{ qsu_ssh_port_base | int + qsu_vm_idx }}" + search_regex: "^SSH-2\\.0" + delay: 5 + timeout: 300 + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" + loop_control: + loop_var: qsu_vm_name + index_var: qsu_vm_idx + label: "{{ qsu_vm_name }}:{{ qsu_ssh_port_base | int + qsu_vm_idx }}" diff --git a/playbooks/roles/qsu/tasks/stop-vms.yml b/playbooks/roles/qsu/tasks/stop-vms.yml new file mode 100644 index 00000000..33250066 --- /dev/null +++ b/playbooks/roles/qsu/tasks/stop-vms.yml @@ -0,0 +1,25 @@ +--- +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# Synchronous stop of every qemu-system@<vm>.service in the +# inventory. Used by `make stop-vms` and as a building block +# for higher-level lifecycle paths. +# +# state=stopped blocks until the qemu-system@<vm>.service unit +# itself reaches inactive. The per-VM drop-in's +# Requires=virtiofsd@%i-<tag>.service propagates the stop to +# virtiofsd via RequiredBy.PROPAGATE_STOP; the per-instance +# Before=qemu-system@<vm>.service drop-in on +# virtiofsd@<vm>-<tag>.service orders virtiofsd's stop AFTER +# qemu's ExecStop= completes, so the guest's ssh-driven +# poweroff has working virtiofs throughout. See +# scripts/qemu-system-units/docs/design-decisions.md +# ("virtiofsd dependency: Requires=, not BindsTo=") for the +# rationale and tradeoff. + +- name: Stop qemu-system@<vm> instances + ansible.builtin.systemd_service: + name: "qemu-system@{{ item }}.service" + state: stopped + scope: user + loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}" diff --git a/playbooks/roles/qsu/templates/debug-vars.yaml.j2 b/playbooks/roles/qsu/templates/debug-vars.yaml.j2 new file mode 100644 index 00000000..79b80067 --- /dev/null +++ b/playbooks/roles/qsu/templates/debug-vars.yaml.j2 @@ -0,0 +1,175 @@ +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# qemu-system-units vars snapshot for {{ vm_name }}. Generated by +# kdevops at bringup time (scripts/qemu-system-units/vars/ is +# gitignored). Render the standalone qsu templates with: +# +# minijinja-cli --trim-blocks templates/vm.env.j2 vars/{{ vm_name }}.yaml +# +# The YAML body below is a strict qsu vars file: every top-level +# key is documented in scripts/qemu-system-units/docs/vars.md and +# the file is intended to be hand-shareable. minijinja-cli reads +# only the YAML; the comment block immediately below preserves the +# kdevops Kconfig values and resolved per-VM facts that produced +# this snapshot, so the file can be read alongside .config and +# extra_vars.yaml without bouncing between files. +# +# Source kdevops Kconfig values +# (cross-reference with .config / extra_vars.yaml): +# +# CONFIG_QSU_NVME_DRIVE_COUNT="{{ qsu_nvme_drive_count | default('') }}" +# CONFIG_QSU_NVME_DRIVE_SIZE_GB="{{ qsu_nvme_drive_size_gb | default('') }}" +# CONFIG_QSU_NVME_LOGICAL_BLOCK_SIZE="{{ qsu_nvme_logical_block_size | default('') }}" +# CONFIG_QSU_NVME_PHYSICAL_BLOCK_SIZE="{{ qsu_nvme_physical_block_size | default('') }}" +# CONFIG_QSU_NVME_MIN_IO_SIZE="{{ qsu_nvme_min_io_size | default('') }}" +# CONFIG_QSU_NVME_OPT_IO_SIZE="{{ qsu_nvme_opt_io_size | default('') }}" +# CONFIG_QSU_NVME_DISCARD_GRANULARITY="{{ qsu_nvme_discard_granularity | default('') }}" +# CONFIG_QSU_NVME_WRITE_CACHE="{{ qsu_nvme_write_cache | default('') }}" +# CONFIG_QSU_NVME_MDTS="{{ qsu_nvme_mdts | default('') }}" +# CONFIG_QSU_NVME_ATOMIC_DN="{{ qsu_nvme_atomic_dn | default('') }}" +# CONFIG_QSU_NVME_ATOMIC_AWUN="{{ qsu_nvme_atomic_awun | default('') }}" +# CONFIG_QSU_NVME_ATOMIC_AWUPF="{{ qsu_nvme_atomic_awupf | default('') }}" +# CONFIG_QSU_NVME_ATOMIC_NAWUN="{{ qsu_nvme_atomic_nawun | default('') }}" +# CONFIG_QSU_NVME_ATOMIC_NAWUPF="{{ qsu_nvme_atomic_nawupf | default('') }}" +# CONFIG_QSU_NVME_ATOMIC_NABSN="{{ qsu_nvme_atomic_nabsn | default('') }}" +# CONFIG_QSU_NVME_ATOMIC_NABSPF="{{ qsu_nvme_atomic_nabspf | default('') }}" +# CONFIG_QSU_NVME_ATOMIC_NABO="{{ qsu_nvme_atomic_nabo | default('') }}" +# CONFIG_QSU_SSH_PORT_BASE={{ qsu_ssh_port_base | default('') }} +# CONFIG_QSU_VSOCK_CID_BASE={{ qsu_vsock_cid_base | default('') }} +# CONFIG_QSU_SSH_DEFAULT_VSOCK={{ 'y' if (qsu_ssh_default_vsock | default(false) | bool) else 'n' }} +# CONFIG_QSU_SSH_DEFAULT_TCP={{ 'y' if (qsu_ssh_default_tcp | default(false) | bool) else 'n' }} +# +# Resolved per-VM facts: +# vm_index={{ qsu_vm_idx | default('') }} +# state_dir={{ qsu_state_dir | default('') }} +# kernel_release={{ qsu_kernel_release | default('') }} +# kernel_image={{ qsu_kernel_image | default('') }} +# modules_dir={{ qsu_modules_dir | default('') }} +# init={{ qsu_init | default('') }} +# initrd={{ qsu_initrd | default('') }} + +vm_name: {{ vm_name }} +service_scope: {{ service_scope | default('user') }} + +# QEMU +qemu_binary: {{ qemu_binary }} +cpu: {{ cpu }} +accel: {{ accel }} +ram: {{ ram }} +cpus: {{ cpus }} +machine_type: {{ machine_type }} +{% if uuid is defined %} +uuid: {{ uuid }} +{% endif %} +{% if iommu is defined %} +iommu: {{ iommu }} +{% endif %} + +# Networking +ssh_port: {{ ssh_port }} +{% if vsock_cid is defined %} +vsock_cid: {{ vsock_cid }} +{% endif %} +{% if ssh_private_key is defined %} +ssh_private_key: {{ ssh_private_key }} +{% endif %} + +# Direct kernel boot +kernel: + image: {{ kernel.image }} + initrd: {{ kernel.initrd }} + append: {{ kernel.append }} + +{% if firmware is defined %} +# UEFI firmware (OVMF/AAVMF) +firmware: + code: {{ firmware.code }} + vars: {{ firmware.vars }} +{% if firmware.vars_format is defined %} + vars_format: {{ firmware.vars_format }} +{% endif %} + +{% endif %} +{% if image is defined %} +# Root disk image (qcow2/raw, attached via virtio-blk) +image: + file: {{ image.file }} + format: {{ image.format | default('raw') }} +{% if image.cache is defined %} + cache: {{ image.cache }} +{% endif %} +{% if image.aio is defined %} + aio: {{ image.aio }} +{% endif %} +{% if image.discard is defined %} + discard: {{ image.discard }} +{% endif %} + +{% endif %} +{% if cloud_init is defined and cloud_init.seed is defined %} +# cloud-init seed ISO (one-shot first boot) +cloud_init: + seed: {{ cloud_init.seed }} + +{% endif %} +{% if drives is defined and drives | length > 0 %} +# Extra plain block drives (virtio-blk, no NVMe) +drives: +{% for d in drives %} + - file: {{ d.file }} + format: {{ d.format | default('raw') }} +{% if d.cache is defined %} + cache: {{ d.cache }} +{% endif %} +{% if d.aio is defined %} + aio: {{ d.aio }} +{% endif %} +{% if d.discard is defined %} + discard: {{ d.discard }} +{% endif %} +{% endfor %} + +{% endif %} +{% if pci_passthrough is defined and pci_passthrough | length > 0 %} +# vfio-pci passthrough (host BDF -> guest) +pci_passthrough: +{% for dev in pci_passthrough %} + - addr: {{ dev.addr }} +{% if dev.opts is defined %} + opts: {{ dev.opts }} +{% endif %} +{% endfor %} + +{% endif %} +# virtiofs shares (host dir -> guest mount) +{% if share_transport is defined %} +share_transport: {{ share_transport }} +{% endif %} +shares: +{% for s in shares %} + - tag: {{ s.tag }} + dir: {{ s.dir }} + mount: {{ s.mount }} +{% endfor %} + +{% if nvme is defined and (nvme.drives | default([]) | length > 0 + or nvme.subsystems | default([]) | length > 0) %} +# NVMe drives. Each drive renders into one of two QEMU shapes: +# +# - Simple mode (no `namespaces` key): one `-device nvme,drive=` +# with implicit namespace, BlockConf and controller atomics +# inline. +# - Explicit-namespace mode (`namespaces[]` present): separate +# `-device nvme,id=` controller and one `-device nvme-ns` per +# entry. Per-namespace atomics (atomic.nawun, atomic.nawupf, +# atomic.nabsn, atomic.nabspf, atomic.nabo) only render in +# explicit mode because QEMU's hw/nvme/ns.c rejects them on +# the controller; drivers/nvme/host/core.c's nvme_atomic_bs +# also only consumes per-namespace NAWUPF for the kernel-side +# atomic_write_unit_max value. +# +# The resolved per-drive dicts below are dumped as-is so the +# shape of each drive (simple vs explicit) is visible at a glance. +{{ {'nvme': nvme} | to_nice_yaml(indent=2, width=120) -}} + +{% endif %} diff --git a/playbooks/roles/qsu/vars/main.yml b/playbooks/roles/qsu/vars/main.yml new file mode 100644 index 00000000..5ac02375 --- /dev/null +++ b/playbooks/roles/qsu/vars/main.yml @@ -0,0 +1,26 @@ +--- +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# Role-level constants for qsu. Auto-loaded +# whenever the role is imported or included via roles: / +# include_role: / import_role:. + +# Superset of every virtiofsd share tag the role can render an +# env file for. Active subset per inventory VM is computed in +# tasks/imageless-build-per-vm.yml as +# qsu_shares = qsu_shares_base + qsu_shares_fstests +# under the kdevops_workflow_enable_fstests gate. bringup.yml uses +# this list to validate that an env file +# in the host-shared ~/.config/systemd/virtiofsd/ directory really +# belongs to the role (i.e. matches `<inventory-vm>-<tag>.env`) +# before restarting its socket — without this filter, a global +# *.env glob touches sockets owned by VMs in other kdevops trees +# on the host. destroy.yml uses it to enumerate exactly which +# per-share env files to remove. Keep in sync with the shares +# block in imageless-build-per-vm.yml whenever a share is added. +qsu_canonical_share_tags: + - store + - modules + - data-configs + - data-results + - kdevops-fstests diff --git a/scripts/nixosfi.Makefile b/scripts/nixosfi.Makefile new file mode 100644 index 00000000..fc3ef394 --- /dev/null +++ b/scripts/nixosfi.Makefile @@ -0,0 +1,125 @@ +# SPDX-License-Identifier: copyleft-next-0.3.1 +# +# Bringup glue for CONFIG_NIXOSFI. +# +# User-facing entry points are the kdevops top-level targets: +# `make bringup`, `make destroy`, `make console`, `make rebuild-boot`, +# `make rebuild-test`. They dispatch through the +# KDEVOPS_PROVISION_*_METHOD variables below to the per-phase +# tag-gated targets in playbooks/nixosfi.yml. The nixosfi-* targets in this +# file are dispatch internals; users do not call them directly. + +KDEVOPS_NODES_TEMPLATE := $(KDEVOPS_NODES_ROLE_TEMPLATE_DIR)/guestfs_nodes.j2 +KDEVOPS_NODES := guestfs/kdevops_nodes.yaml + +export KDEVOPS_PROVISIONED_SSH := $(KDEVOPS_PROVISIONED_SSH_DEFAULT_GUARD) + +NIXOSFI_BRINGUP_DEPS := + +ifeq (y,$(CONFIG_BOOTLINUX_DIRECT_BOOT)) +NIXOSFI_BRINGUP_DEPS += linux-direct-boot +endif + +KDEVOPS_PROVISION_METHOD := bringup_nixosfi +KDEVOPS_PROVISION_DESTROY_METHOD := destroy_nixosfi +KDEVOPS_PROVISION_STATUS_METHOD := nixosfi-status +KDEVOPS_PROVISION_CONSOLE_METHOD := nixosfi-console +KDEVOPS_PROVISION_REBUILD_BOOT_METHOD := nixosfi-rebuild-boot +KDEVOPS_PROVISION_REBUILD_TEST_METHOD := nixosfi-rebuild-test + +$(KDEVOPS_PROVISIONED_SSH): $(KDEVOPS_HOSTS_PREFIX) + $(Q)touch $(KDEVOPS_PROVISIONED_SSH) + +bringup_nixosfi: $(NIXOSFI_BRINGUP_DEPS) + $(Q)$(MAKE) nixosfi-bringup +PHONY += bringup_nixosfi + +destroy_nixosfi: + $(Q)$(MAKE) nixosfi-destroy +PHONY += destroy_nixosfi + +PHONY += nixosfi-bringup +nixosfi-bringup: $(KDEVOPS_EXTRA_VARS) + $(Q)ansible-playbook $(KDEVOPS_PLAYBOOKS_DIR)/nixosfi.yml \ + --tags install-deps,generate-configs,build-vms,bringup,console \ + --extra-vars=@./extra_vars.yaml + +PHONY += nixosfi-destroy +nixosfi-destroy: $(KDEVOPS_EXTRA_VARS) + $(Q)ansible-playbook $(KDEVOPS_PLAYBOOKS_DIR)/nixosfi.yml \ + --tags destroy \ + --extra-vars=@./extra_vars.yaml + +PHONY += nixosfi-console +# Attach to a running qsu VM's serial console via socat. Defaults to +# the single running VM; pass VM=<name> when more than one is up. +nixosfi-console: + $(Q)set -e; \ + if [ -n "$$VM" ]; then \ + vm="$$VM"; \ + else \ + vms=$$(systemctl --user list-units 'qemu-system@*.service' \ + --no-legend --state=active 2>/dev/null \ + | awk '{sub(/qemu-system@/,"",$$1); sub(/\.service/,"",$$1); print $$1}'); \ + count=$$(printf '%s\n' "$$vms" | sed '/^$$/d' | wc -l); \ + case $$count in \ + 0) echo "no running qsu VM found"; exit 1 ;; \ + 1) vm="$$vms" ;; \ + *) echo "multiple qsu VMs running, pick one with VM=<name>:"; \ + printf ' %s\n' $$vms; exit 1 ;; \ + esac; \ + fi; \ + sock="$${XDG_RUNTIME_DIR}/qemu-system/$$vm/console.sock"; \ + [ -S "$$sock" ] || { echo "qsu console socket missing: $$sock"; exit 1; }; \ + command -v socat >/dev/null || { echo "socat is required"; exit 1; }; \ + echo "Attaching to $$vm (Ctrl-] then Q to detach)"; \ + exec socat -,raw,echo=0,escape=0x1d UNIX-CONNECT:"$$sock" + +PHONY += nixosfi-status +# Report the run-state and currently-booted kernel for every guest +# the active inventory declares. Running guests are probed over SSH; +# stopped guests show '-'. +nixosfi-status: + $(Q)set -e; \ + hosts=$$(ansible all --list-hosts 2>/dev/null \ + | tail -n +2 | awk '$$1 != "localhost" {print $$1}'); \ + if [ -z "$$hosts" ]; then \ + echo "no qsu hosts in inventory (run 'make' first?)"; \ + exit 0; \ + fi; \ + printf '%-20s %-10s %s\n' VM STATE KERNEL; \ + for vm in $$hosts; do \ + st=stopped; \ + k=-; \ + if systemctl --user is-active --quiet "qemu-system@$$vm.service"; then \ + st=running; \ + k=$$(ssh -o BatchMode=yes -o ConnectTimeout=3 \ + -o StrictHostKeyChecking=no \ + "$$vm" uname -r 2>/dev/null || echo "?"); \ + fi; \ + printf '%-20s %-10s %s\n' "$$vm" "$$st" "$$k"; \ + done + +PHONY += nixosfi-rebuild-boot +nixosfi-rebuild-boot: $(KDEVOPS_EXTRA_VARS) + $(Q)ansible-playbook $(KDEVOPS_PLAYBOOKS_DIR)/nixosfi.yml \ + --tags rebuild-boot,restart-vms \ + --extra-vars=@./extra_vars.yaml + +PHONY += nixosfi-rebuild-test +nixosfi-rebuild-test: $(KDEVOPS_EXTRA_VARS) + $(Q)ansible-playbook $(KDEVOPS_PLAYBOOKS_DIR)/nixosfi.yml \ + --tags rebuild-test \ + --extra-vars=@./extra_vars.yaml + +PHONY += nixosfi-stop +nixosfi-stop: $(KDEVOPS_EXTRA_VARS) + $(Q)ansible-playbook $(KDEVOPS_PLAYBOOKS_DIR)/nixosfi.yml \ + --tags stop-vms \ + --extra-vars=@./extra_vars.yaml + +PHONY += nixosfi-start +nixosfi-start: $(KDEVOPS_EXTRA_VARS) + $(Q)ansible-playbook $(KDEVOPS_PLAYBOOKS_DIR)/nixosfi.yml \ + --tags start-vms \ + --extra-vars=@./extra_vars.yaml diff --git a/scripts/nixosfi_ssh_key_name.py b/scripts/nixosfi_ssh_key_name.py new file mode 100755 index 00000000..8dffb993 --- /dev/null +++ b/scripts/nixosfi_ssh_key_name.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: copyleft-next-0.3.1 + +"""Generate SSH key name for NixOS VMs based on directory location.""" + +import os +import sys +import hashlib + + +def get_ssh_key_name(): + """Generate SSH key name based on kdevops project directory.""" + # Find the kdevops root directory + # Start from the script's location + script_dir = os.path.dirname(os.path.abspath(__file__)) + + # The script is in kdevops/scripts/, so go up one level + kdevops_root = os.path.dirname(script_dir) + + # Use the kdevops root directory for consistent key naming + # This ensures the same key is used regardless of where the script is called from + cwd = kdevops_root + + # Get the last two directory components for the key name + path_parts = cwd.split("/") + if len(path_parts) >= 2: + # Use last two directories + key_suffix = "-".join(path_parts[-2:]) + else: + # Use just the last directory + key_suffix = path_parts[-1] if path_parts else "kdevops" + + # Create a short hash to ensure uniqueness + path_hash = hashlib.sha256(cwd.encode()).hexdigest()[:8] + + # Construct the key name + key_name = f"kdevops-nixos-{key_suffix}-{path_hash}" + + return key_name + + +def main(): + """Main function.""" + if len(sys.argv) > 1 and sys.argv[1] == "--path": + # Return full path to key + key_name = get_ssh_key_name() + key_path = os.path.expanduser(f"~/.ssh/{key_name}") + print(key_path) + else: + # Return just the key name + print(get_ssh_key_name()) + + +if __name__ == "__main__": + main() diff --git a/scripts/provision.Makefile b/scripts/provision.Makefile index bf2f4d40..289d0f76 100644 --- a/scripts/provision.Makefile +++ b/scripts/provision.Makefile @@ -80,6 +80,10 @@ ifeq (y,$(CONFIG_NIXOSFL)) include scripts/nixosfl.Makefile endif +ifeq (y,$(CONFIG_NIXOSFI)) +include scripts/nixosfi.Makefile +endif + KDEVOPS_MRPROPER += $(KDEVOPS_PROVISIONED_SSH) KDEVOPS_MRPROPER += $(KDEVOPS_PROVISIONED_DEVCONFIG) diff --git a/scripts/update_ssh_config_nixosfi.py b/scripts/update_ssh_config_nixosfi.py new file mode 100755 index 00000000..bc9541e3 --- /dev/null +++ b/scripts/update_ssh_config_nixosfi.py @@ -0,0 +1,216 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: copyleft-next-0.3.1 + +"""Update SSH config for NixOS guests provisioned by kdevops. + +Manages SSH configuration entries for kdevops-deployed NixOS guests +provisioned through the nixos_flake libvirt backend, or driven by the +qsu systemd-machined VMs against a nixos-flake imageless closure. + +Usage: + update_ssh_config_nixosfi.py update <hostname> <host> <port> <user> + <ssh_config> <privkey> <tag> + [--vsock-cid <N>] [--default-transport vsock|tcp] + update_ssh_config_nixosfi.py remove <hostname> '' '' '' <ssh_config> + '' <tag> + +When --vsock-cid is given, emit three Host stanzas: + <hostname>-vsock : ProxyCommand systemd-ssh-proxy vsock/<cid> 22 + <hostname>-tcp : TCP via <host>:<port> + <hostname> : alias of whichever --default-transport picks + (defaults to vsock when --vsock-cid is set). + +Without --vsock-cid, one <hostname> stanza is emitted over TCP +(backward-compatible with the nixos_flake libvirt caller). +""" + +import argparse +import os +import re +import sys + +SYSTEMD_SSH_PROXY = "/usr/lib/systemd/systemd-ssh-proxy" + + +def render_vsock_stanza(host_tokens, user, key, cid): + return ( + f"Host {host_tokens}\n" + f" User {user}\n" + f" IdentityFile {key}\n" + f" ProxyCommand {SYSTEMD_SSH_PROXY} vsock/{cid} 22\n" + f" ProxyUseFdpass yes\n" + f" CheckHostIP no\n" + f" StrictHostKeyChecking no\n" + f" UserKnownHostsFile /dev/null\n" + f" LogLevel ERROR\n" + ) + + +def render_tcp_stanza(host_tokens, host_ip, port, user, key): + return ( + f"Host {host_tokens}\n" + f" HostName {host_ip}\n" + f" Port {port}\n" + f" User {user}\n" + f" IdentityFile {key}\n" + f" StrictHostKeyChecking no\n" + f" UserKnownHostsFile /dev/null\n" + f" LogLevel ERROR\n" + ) + + +def build_entries(hostname, host_ip, port, user, key, vsock_cid, default_transport): + """Return a list of (alias, block_body) pairs to write. + + Each block starts with its own `# kdevops-managed: {tag} - {alias}` + marker so remove-on-update can match and drop the old block via + regex. + """ + if vsock_cid is None: + # Legacy single-stanza form used by the nixos_flake libvirt path. + return [ + (hostname, render_tcp_stanza(hostname, host_ip, port, user, key)), + ] + + # Three-stanza form: default alias groups with either -vsock or -tcp. + if default_transport == "tcp": + default_alias = f"{hostname} {hostname}-tcp" + bare_stanza = render_tcp_stanza(default_alias, host_ip, port, user, key) + return [ + (hostname, bare_stanza), + ( + f"{hostname}-vsock", + render_vsock_stanza(f"{hostname}-vsock", user, key, vsock_cid), + ), + ] + + # default_transport == "vsock" + default_alias = f"{hostname} {hostname}-vsock" + bare_stanza = render_vsock_stanza(default_alias, user, key, vsock_cid) + return [ + (hostname, bare_stanza), + ( + f"{hostname}-tcp", + render_tcp_stanza(f"{hostname}-tcp", host_ip, port, user, key), + ), + ] + + +def managed_block_regex(tag, hostname): + """Match every `# kdevops-managed: {tag} - <alias>` block whose alias + is either the base hostname or starts with it followed by a dash. + Catches qsu, qsu-vsock, qsu-tcp in one sweep without disturbing + unrelated entries that share the tag prefix. + """ + return re.compile( + rf"^# kdevops-managed: {re.escape(tag)} - " + rf"{re.escape(hostname)}(?:-[\w-]+)?\n" + r"Host [^\n]+\n" + r"(?:[ \t]+[^\n]+\n)*", + re.MULTILINE, + ) + + +def update_ssh_config( + action, + hostname, + host_ip, + port, + username, + ssh_config_path, + ssh_key_path, + tag, + vsock_cid, + default_transport, +): + ssh_config_path = os.path.expanduser(ssh_config_path) + os.makedirs(os.path.dirname(ssh_config_path), exist_ok=True) + + config_content = "" + if os.path.exists(ssh_config_path): + with open(ssh_config_path, "r") as f: + config_content = f.read() + + entry_pattern = managed_block_regex(tag, hostname) + + # Always drop prior managed blocks for this base hostname. + config_content = entry_pattern.sub("", config_content) + + if action == "remove": + print(f"Removed SSH config entries for {hostname}") + elif action == "update": + blocks = [] + for alias, body in build_entries( + hostname, + host_ip, + port, + username, + ssh_key_path, + vsock_cid, + default_transport, + ): + blocks.append(f"# kdevops-managed: {tag} - {alias}\n{body}") + new_entries = "\n".join(blocks) + config_content = config_content.rstrip() + "\n\n" + new_entries + "\n" + if vsock_cid is None: + print(f"Updated SSH config entry for {hostname} (port {port})") + else: + print( + f"Updated SSH config entries for {hostname}, " + f"{hostname}-vsock, {hostname}-tcp " + f"(default={default_transport}, vsock CID={vsock_cid}, " + f"TCP port={port})" + ) + + with open(ssh_config_path, "w") as f: + f.write(config_content) + + +def main(): + parser = argparse.ArgumentParser( + description="Manage SSH config entries for kdevops-deployed NixOS guests.", + ) + parser.add_argument("action", choices=["update", "remove"]) + parser.add_argument("hostname") + parser.add_argument("host_ip", nargs="?", default="localhost") + parser.add_argument("port", nargs="?", default="22") + parser.add_argument("username", nargs="?", default="kdevops") + parser.add_argument("ssh_config_path") + parser.add_argument("ssh_key_path", nargs="?", default="") + parser.add_argument("tag", nargs="?", default="NixOS VM") + parser.add_argument( + "--vsock-cid", + type=int, + default=None, + help="VSOCK CID of the VM. When set, emit qsu-style three-stanza " + "layout (host, host-vsock, host-tcp).", + ) + parser.add_argument( + "--default-transport", + choices=["vsock", "tcp"], + default="vsock", + help="Which transport the bare <hostname> alias groups with. Only " + "meaningful when --vsock-cid is set.", + ) + args = parser.parse_args() + + try: + update_ssh_config( + args.action, + args.hostname, + args.host_ip or "localhost", + args.port or "22", + args.username or "kdevops", + args.ssh_config_path, + args.ssh_key_path, + args.tag, + args.vsock_cid, + args.default_transport, + ) + except Exception as e: + print(f"Error: {e}") + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/workflows/linux/Kconfig b/workflows/linux/Kconfig index 4f8694d9..317c2073 100644 --- a/workflows/linux/Kconfig +++ b/workflows/linux/Kconfig @@ -37,6 +37,7 @@ endif # HAVE_SUPPORTS_PURE_IOMAP choice prompt "Kernel build location" + default BOOTLINUX_DIRECT_BOOT if NIXOSFI default BOOTLINUX_TARGETS if !LIBVIRT || GUESTFS_LACKS_9P default BOOTLINUX_9P if LIBVIRT && !GUESTFS_LACKS_9P help -- 2.54.0