Repository navigation
guest: delete the Alpine one-shot container helpers (SL7.8c) - #1536
Merged
Pedro Henrique Penna (ppenna) merged 1 commit intoNov 12, 2026
Merged
Pedro Henrique Penna (ppenna) merged 1 commit into
Pedro Henrique Penna (ppenna) merged 1 commit into
Conversation
Contributor
This pull request changes existing testsIt modifies or removes 6 existing test asset(s), listed below. Review each with care: a change to a test can hide a regression that the test caught. See doc/contribute.md#changes-to-existing-tests. Test code
CI test wiring
Relocated unchanged: 0; added: 0. Compared the merge base |
Contributor
There was a problem hiding this comment.
🟢 Approval recommended
No active review issues remain for the removal of the unused Alpine container helpers and their associated references.
No open issues 🎉
What changed in this PR
Removes the unused Alpine one-shot container helpers after #1534 removed their only caller, completing SL7.8c of the NVX slimming workstream. The changes remove the helpers and their inventory references while preserving retained guest behavior.
Changes:
- Deletes both Alpine container helpers and their build installation steps.
- Updates source inventories, release checks, cache inputs, and shell-check lists.
- Aligns test fixtures and documentation with the removed files.
| File | Description |
|---|---|
SOURCE-MANIFEST.json |
Removes guest/alpine from Alpine source inputs. |
scripts/test_nvx_tools.py |
Updates the release fixture and removes a deleted-file classification case. |
scripts/nvx_tools/release.py |
Stops requiring the deleted entry helper. |
scripts/nvx_tools/build.py |
Removes helper installation and customization inputs; preserves bashrc installation. |
scripts/nvx_tools/build_constants.py |
Removes the Alpine-specific guest directory constant and source entry. |
guest/alpine/nvx-container-launch |
Deletes the unused container launcher. |
guest/alpine/nvx-container-enter |
Deletes the unused container entry helper. |
doc/setup.md |
Removes deleted helpers from lint and formatting commands. |
doc/project-structure.md |
Removes obsolete directory and helper descriptions. |
.github/actions/check-quality/action.yml |
Removes deleted helpers from ShellCheck and shfmt lists. |
.github/actions/build-guest-artifacts/action.yml |
Removes guest/alpine/** from Alpine cache inputs. |
Review effort: Balanced
Pedro Henrique Penna (ppenna)
force-pushed
the
agents/slim-sl7-8b-old-init
branch
from
November 12, 2026 13:18
0034154 to
a873028
Compare
Base automatically changed from
agents/slim-sl7-8b-old-init
to
feature/nvx-refactor
November 12, 2026 13:40
Pedro Henrique Penna (ppenna)
force-pushed
the
agents/slim-sl7-8c-alpine-helpers
branch
from
November 12, 2026 13:42
bd1ead5 to
321bd2b
Compare
This was referenced Nov 12, 2026
SL7.8b deleted the old layered init, whose container launcher was the only caller of the Alpine one-shot container helpers: nvx-container-launch ran a workload's container through nvx-container-enter, which staged Alpine's musl loader and setpriv in the container's root. The shell /init now runs only nvx-init for a layered root, or the managed agent with its own root, so nothing runs them any more. Delete guest/alpine/nvx-container-enter and nvx-container-launch, and so guest/alpine, which held nothing else, with every inventory that names them or the directory: - build.py no longer installs them in the Alpine initramfs, nor lists guest/alpine among the Alpine guest's customization files; - the Alpine guest's source directories are guest/common alone, as Azure Linux's are, in build_constants.py and in the guest_sources of SOURCE-MANIFEST.json, which release.py checks against them; - release.py's source-tree check no longer requires the entry helper; - the Alpine artifacts' CI cache key no longer hashes guest/alpine; - check-quality's ShellCheck and shfmt lists, and their copies in the setup guide, no longer name them; - the project structure no longer describes guest/alpine, nor, since SL7.8b deleted the init agent, an agent among guest/common's scripts. Tests: the fixture manifest of test_nvx_tools.py's release tests drops guest/alpine from the Alpine guest_sources, and the CI change-detection test drops its case of guest/alpine/nvx-container-enter, a deleted file; its guest/common/init case still covers the guests' inputs. Part of #1123 (SL7.8c). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pedro Henrique Penna (ppenna)
force-pushed
the
agents/slim-sl7-8c-alpine-helpers
branch
from
November 12, 2026 14:34
321bd2b to
bf2c816
Compare
Pedro Henrique Penna (ppenna)
marked this pull request as ready for review
November 12, 2026 14:34
Pedro Henrique Penna (ppenna)
merged commit Nov 12, 2026
04fbbd4
into
feature/nvx-refactor
83 of 84 checks passed
Pedro Henrique Penna (ppenna)
deleted the
agents/slim-sl7-8c-alpine-helpers
branch
November 12, 2026 14:57
Pedro Henrique Penna (ppenna)
added a commit
that referenced
this pull request
Nov 12, 2026
SL7.8b (#1534) deleted the old layered init, nvx-init-agent, with the managed agent's sandbox mode, and SL7.8c (#1536) deleted the Alpine one-shot container helpers. The build guide still said that the Alpine initramfs includes "the sandbox PID-1 bootstrap and its container namespace scripts", that the kernel checks cover what "the sandbox bootstrap" needs, and that the APK manifest records the tools "used by the bootstrap". The Ubuntu guest still named "the Alpine control initramfs and its init agent" as the boot supervisor of the distro layer, and the cgroups and namespaces "that the sandbox uses". The project structure still credited the common scripts with shutdown and the time ABI, which the Rust guest binaries took over. Say instead what the code does now: - the Alpine initramfs is the one that nvx-rs sandbox boots, and with nvx_sandbox=1 the common /init hands PID 1 to nvx-init (exec /sbin/nvx-init in guest/common/init), which initializes the sandbox's layered root and serves its managed control session; - the APK manifest records every package of the image, among them the five that AlpineBuildConstants.PACKAGES adds to the minirootfs; - nvx-init supervises the Ubuntu distro layer, and the kernel provides the memory and process-count cgroups and the PID, mount, UTS and network namespaces for the guest's programs, without claiming that the sandbox uses them; - the common scripts mount the host share (nvx-hostmount), prepare the guest for a snapshot and repair its restores (nvx-snapshot), and probe for the tests and benchmarks; the Rust binaries provide PID 1, the time ABI's guest side, shutdown and the rest. The kernel inventory and its checks table keep their text: SL6.11b (#1542) rewrites them. Part of #1131 (SL6.10e). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pedro Henrique Penna (ppenna)
added a commit
that referenced
this pull request
Nov 13, 2026
SL7.8b (#1534) deleted the old layered init, nvx-init-agent, with the managed agent's sandbox mode, and SL7.8c (#1536) deleted the Alpine one-shot container helpers. The build guide still said that the Alpine initramfs includes "the sandbox PID-1 bootstrap and its container namespace scripts", that the kernel checks cover what "the sandbox bootstrap" needs, and that the APK manifest records the tools "used by the bootstrap". The Ubuntu guest still named "the Alpine control initramfs and its init agent" as the boot supervisor of the distro layer, and the cgroups and namespaces "that the sandbox uses". The project structure still credited the common scripts with shutdown and the time ABI, which the Rust guest binaries took over. Say instead what the code does now: - the Alpine initramfs is the one that nvx-rs sandbox boots, and with nvx_sandbox=1 the common /init hands PID 1 to nvx-init (exec /sbin/nvx-init in guest/common/init), which initializes the sandbox's layered root and serves its managed control session; - the APK manifest records every package of the image, among them the five that AlpineBuildConstants.PACKAGES adds to the minirootfs; - nvx-init supervises the Ubuntu distro layer, and the kernel provides the memory and process-count cgroups and the PID, mount, UTS and network namespaces for the guest's programs, without claiming that the sandbox uses them; - the common scripts mount the host share (nvx-hostmount), prepare the guest for a snapshot and repair its restores (nvx-snapshot), and probe for the tests and benchmarks; the Rust binaries provide PID 1, the time ABI's guest side, shutdown and the rest. The kernel inventory and its checks table keep the text that SL6.11b (#1542) gave them. Part of #1131 (SL6.10e). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pedro Henrique Penna (ppenna)
added a commit
that referenced
this pull request
Nov 13, 2026
SL7.8b (#1534) deleted the old layered init, nvx-init-agent, with the managed agent's sandbox mode, and SL7.8c (#1536) deleted the Alpine one-shot container helpers. The build guide still said that the Alpine initramfs includes "the sandbox PID-1 bootstrap and its container namespace scripts", that the kernel checks cover what "the sandbox bootstrap" needs, and that the APK manifest records the tools "used by the bootstrap". The Ubuntu guest still named "the Alpine control initramfs and its init agent" as the boot supervisor of the distro layer, and the cgroups and namespaces "that the sandbox uses". The project structure still credited the common scripts with shutdown and the time ABI, which the Rust guest binaries took over. Say instead what the code does now: - the Alpine initramfs is the one that nvx-rs sandbox boots, and with nvx_sandbox=1 the common /init hands PID 1 to nvx-init (exec /sbin/nvx-init in guest/common/init), which initializes the sandbox's layered root and serves its managed control session; - the APK manifest records every package of the image, among them the five that AlpineBuildConstants.PACKAGES adds to the minirootfs; - nvx-init supervises the Ubuntu distro layer, and the kernel provides the memory and process-count cgroups and the PID, mount, UTS and network namespaces for the guest's programs, without claiming that the sandbox uses them; - the common scripts mount the host share (nvx-hostmount), prepare the guest for a snapshot and repair its restores (nvx-snapshot), and probe for the tests and benchmarks; the Rust binaries provide PID 1, the time ABI's guest side, shutdown and the rest. The kernel inventory and its checks table keep the text that SL6.11b (#1542) gave them. Part of #1131 (SL6.10e). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pedro Henrique Penna (ppenna)
added a commit
that referenced
this pull request
Nov 13, 2026
SL7.8b (#1534) deleted the old layered init, nvx-init-agent, with the managed agent's sandbox mode, and SL7.8c (#1536) deleted the Alpine one-shot container helpers. The build guide still said that the Alpine initramfs includes "the sandbox PID-1 bootstrap and its container namespace scripts", that the kernel checks cover what "the sandbox bootstrap" needs, and that the APK manifest records the tools "used by the bootstrap". The Ubuntu guest still named "the Alpine control initramfs and its init agent" as the boot supervisor of the distro layer, and the cgroups and namespaces "that the sandbox uses". The project structure still credited the common scripts with shutdown and the time ABI, which the Rust guest binaries took over. Say instead what the code does now: - the Alpine initramfs is the one that nvx-rs sandbox boots, and with nvx_sandbox=1 the common /init hands PID 1 to nvx-init (exec /sbin/nvx-init in guest/common/init), which initializes the sandbox's layered root and serves its managed control session; - the APK manifest records every package of the image, among them the five that AlpineBuildConstants.PACKAGES adds to the minirootfs; - nvx-init supervises the Ubuntu distro layer, and the kernel provides the memory and process-count cgroups and the PID, mount, UTS and network namespaces for the guest's programs, without claiming that the sandbox uses them; - the common scripts mount the host share (nvx-hostmount), prepare the guest for a snapshot and repair its restores (nvx-snapshot), and probe for the tests and benchmarks; the Rust binaries provide PID 1, the time ABI's guest side, shutdown and the rest. The kernel inventory and its checks table keep the text that SL6.11b (#1542) gave them. Part of #1131 (SL6.10e). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pedro Henrique Penna (ppenna)
added a commit
that referenced
this pull request
Nov 13, 2026
SL7.8b (#1534) deleted the old layered init, nvx-init-agent, with the managed agent's sandbox mode, and SL7.8c (#1536) deleted the Alpine one-shot container helpers. The build guide still said that the Alpine initramfs includes "the sandbox PID-1 bootstrap and its container namespace scripts", that the kernel checks cover what "the sandbox bootstrap" needs, and that the APK manifest records the tools "used by the bootstrap". The Ubuntu guest still named "the Alpine control initramfs and its init agent" as the boot supervisor of the distro layer, and the cgroups and namespaces "that the sandbox uses". The project structure still credited the common scripts with shutdown and the time ABI, which the Rust guest binaries took over. Say instead what the code does now: - the Alpine initramfs is the one that nvx-rs sandbox boots, and with nvx_sandbox=1 the common /init hands PID 1 to nvx-init (exec /sbin/nvx-init in guest/common/init), which initializes the sandbox's layered root and serves its managed control session; - the APK manifest records every package of the image, among them the five that AlpineBuildConstants.PACKAGES adds to the minirootfs; - nvx-init supervises the Ubuntu distro layer, and the kernel provides the memory and process-count cgroups and the PID, mount, UTS and network namespaces for the guest's programs, without claiming that the sandbox uses them; - the common scripts mount the host share (nvx-hostmount), prepare the guest for a snapshot and repair its restores (nvx-snapshot), and probe for the tests and benchmarks; the Rust binaries provide PID 1, the time ABI's guest side, shutdown and the rest. The kernel inventory and its checks table keep the text that SL6.11b (#1542) gave them. Part of #1131 (SL6.10e). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Leaving code only. This PR changes only code that this effort removes from NVX: the Alpine one-shot container helpers (
guest/alpine/nvx-container-launchandguest/alpine/nvx-container-enter), and soguest/alpine, with the edits that remove references to them. Nothing that stays changes, and no later PR uses what it changes, so the size limits for kept code don't apply.Part of #1123 (SL7.8c, "the Alpine one-shot container helpers are gone"). Parent #1087, umbrella #1076.
Stacked on #1534 (SL7.8b).
What and why
#1534 (SL7.8b) deletes the old layered init,
nvx-init-agent, which was the only caller of the Alpine one-shot container helpers:nvx-container-launchran a workload's container throughnvx-container-enter, which staged Alpine's musl loader andsetprivin the container's root. With #1534, the shell/inithands every layered root to/sbin/nvx-init, and a managed blockless boot tonvx-managed-agentwith its own root, so nothing runs them any more.This PR deletes both, and so
guest/alpine, which held nothing else, with every inventory that names them or the directory:build.pyno longer installs them in the Alpine initramfs (its_install_guest_fileskeeps installing/etc/nvx-bashrcfor the guests without sandbox control, as before), nor listsguest/alpineamong the Alpine guest's customization files.guest/commonalone, as Azure Linux's are:AlpineBuildConstantslosesGUEST_DIRECTORY, andSOURCE-MANIFEST.json's Alpineguest_sources, whichrelease.pychecks against those constants, dropsguest/alpine.release.py's source-tree check no longer requires the entry helper.build-guest-artifacts) no longer hashesguest/alpine/**, andcheck-quality's ShellCheck and shfmt lists no longer name the helpers.guest/alpinenor, since guest: delete the old layered init and the managed agent's sandbox mode (SL7.8b) #1534 deletes the init agent, an agent amongguest/common's scripts.Nothing else used them. On #1534's head,
00341544, I searched the tree, outsideopenvmm/and build outputs, for the helpers' names,guest/alpine,AlpineBuildConstants.GUEST_DIRECTORY,/.nvx-agent, and prose about container launch or entry scripts:docker/Dockerfileand.dockerignoredon't;/initnames neither; no host code or scenario passes either asnvx_exec=, the initramfs program that/initwould run; and no code innvx-rsnames them;microvm_tests.py, its scripts and the benchmark harness don't name them;ci.pyselects jobs by theguest/prefix, so the deleted directory needs no rule of its own;Left on purpose:
scripts/nvx_tools/kernel_features.pystill namesnvx-container-launch, andnvx-init-agent, among the consumers of a kernel feature: nvx-rs slimming 4.2.4: the exec engine, the process modules and the old layered init are gone #1123's follow-up K1 edits that file once, after SL6.11b, since any edit changes the kernel cache key./.nvx-agentmapping-target reservation (protocol::share, the mapper'sReserved::container_root, the host's checks, anddoc/run.mdanddoc/usage.md): the entry helper staged its tools there, and nothing does now, but dropping the reservation changes the targets that NVX accepts, which isn't leaving code.guest/common/nvx-sandbox-smoke'slimitscheck, which no scenario or test runs, still explains its process count by the deleted launcher'sunshareparent and the init agent.setprivandunsharestill serveinit,nvx-identity-probeandnvx-snapshot.test_package_rejects_tampered_source_metadata_without_replacing_outputkeeps["guest/common", "guest/alpine"]as a tampered Alpineguest_sources, which the release check still refuses.Size
Measured as #1076 defines them, against #1534's head:
build.py, the condition of thenvx-bashrcinstall (if not descriptor.sandbox_control:) and the customization files'return; inbuild_constants.py,AlpineBuildConstants.GUEST_SOURCE_DIRECTORIES; the Alpine cache key's line inbuild-guest-artifacts; and the twoguest/common/init \lines ofcheck-quality's lists. The rest are deletions.scripts/nvx_tools/build.py,build_constants.pyandrelease.py,.github/actions/build-guest-artifacts/action.ymland.github/actions/check-quality/action.yml. The two deleted helpers,SOURCE-MANIFEST.json, the docs and the test don't count.Old tests of the area
check-quality.Test changes
python scripts/check_test_changes.py --base 00341544(#1534's head) lists 6 changes to existing tests, hencetests-modified:scripts/test_nvx_tools.py's_write_release_fixture, the manifest that the release tests package, dropsguest/alpinefrom the Alpineguest_sources, as the real manifest does, whichrelease.pyrequires.CiConfigurationTests.test_ci_change_classification_selects_suites_by_inputdrops its case ofguest/alpine/nvx-container-enter, a deleted file. Itsguest/common/initcase still checks that a guest input selects the microVM tests and the benchmarks, by the sameguest/rule..github/actions/check-quality/action.yml: 4 changed lines of CI test wiring, the ShellCheck and shfmt lists, which no longer name the helpers.Validation
local_gates.py --files(fromdev) selectstest-changes,markdown-links,test-layout,quality-code,nvx-cli(validate-nvx) andopenvmm-cion both systems; no Rust changes. I ran them from this branch's action definitions, onbd1ead5e, butopenvmm-ci, which checks the unchangedopenvmmpin and is left to CI.Windows, this workstation:
python scripts/nvx.py verifyruff check scripts .github/specula,ruff format --check ...,compileall,pyright --pythonplatform Linux,--pythonplatform Windowsvalidate-nvx's unittest list,test_adversarial.py,test_hosts.pyandnvx.py's--helpcommandstest_adversarial.py(11 skipped) andtest_hosts.pypassrelease.verify_source_tree()on this tree, and the realSOURCE-MANIFEST.json's Alpine section against the build pin thatrelease.pycheckscheck_test_layout.py,check_markdown_links.py, SL5.2'scheck_matrix.py <worktree> 99d2022085fcheck_test_changes.py --base 00341544Linux,
nvx-kvm-test(Azure Linux 3, kernel 6.6, KVM, virtual machine), in a worktree of this branch with its own target directory, every signal at its default disposition:python3 scripts/nvx.py build-initramfs --guest alpinea2e82b0b…. Its/sbinholds nonvx-container-*, and keepsnvx-init,nvx-managed-agent,nvx-snapshotand the other helpers; none of its 154 provenance inputs is underguest/alpinepython3 scripts/nvx.py build-initramfs --guest ubuntu52ae53c7…, byte for byte the image that #1534's head builds, with/etc/nvx-bashrcrelease.verify_source_tree()check-quality's ShellCheck and shfmt commands, with its pinned images and the new listsvalidate-nvx's unittest list,test_adversarial.py,test_hosts.pyNVX_AUTO_DOWNLOAD=0guest-boot,lifecycle,managed-lifecycleandconsole-snapshot; the publicmanaged-exec-config,sandbox-lifecycleandsnapshot-core, which boot layered roots (nvx_sandbox=1 nvx_mode=managed,nvx_layer=distro,...) through nvx-init in the new Alpine imageNot run, left to CI:
openvmm-ci;build-guest --guest allandverify-guest-determinism; the other backends and scenarios. #1534 ran the full set on KVM, MSHV and WHP with images that still held the helpers, which nothing ran.