Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
54b6940
Fork: Make replay activation state safe
brandonpayton Jul 25, 2026
ae22e89
Host: Rebuild replay references in fresh workers
brandonpayton Jul 26, 2026
c122cb6
Packages: Bind replay artifacts and rollout to ABI 43
brandonpayton Jul 26, 2026
cec6aec
Host: Bound kernel scratch transfers
brandonpayton Jul 25, 2026
0e0422c
Build: Make cached toolchain sysroots portable
brandonpayton Jul 26, 2026
b8e6b4b
Build: Materialize browser memory64 fixtures
brandonpayton Jul 26, 2026
42c4ebd
Host: Complete kernel scratch ownership closure
brandonpayton Jul 27, 2026
7392484
Host: Publish and validate kernel scratch atomically
brandonpayton Jul 27, 2026
3a6155c
Host: Stop pumping relinquished TCP endpoints
brandonpayton Jul 27, 2026
c902725
Host: Run conformance on owned storage
brandonpayton Jul 28, 2026
5c61d96
Host: Reject shadowed session seeds
brandonpayton Jul 28, 2026
745fc9e
Host: Pin mutable executable bytes
brandonpayton Jul 28, 2026
97d1b56
Host: Reject saturated ordinary forks before cloning
brandonpayton Jul 31, 2026
c8e12e4
Host: Retain exact shared memory aliases
brandonpayton Jul 31, 2026
76a6c4e
Tests: Exercise fork admission through sealed authority
brandonpayton Aug 1, 2026
212ca76
Fork: Borrow replay workers across main and side modules
brandonpayton Jul 31, 2026
8120ee1
Performance: Record affordable-fork design and replay evidence
brandonpayton Jul 31, 2026
b294046
Host: Call fpcast-emulated pthread entries correctly
brandonpayton Jul 3, 2026
8863bc3
POSIX: Distinguish terminals from character devices
brandonpayton Jul 25, 2026
fa327d8
Host: Synthesize POSIX permissions for Windows mounts
mho22 Jul 15, 2026
415e401
Docs: Document fresh-worktree validation prerequisites
brandonpayton Jul 9, 2026
5d1cf8f
Docs: Require purpose-prefixed PRs and commits
brandonpayton Jul 20, 2026
d3736eb
Browser: Restrict reclaim handling to WebKit
brandonpayton Jun 11, 2026
ce71445
Performance: Avoid munmap mapping-vector churn
brandonpayton Jun 20, 2026
fa7d554
Kernel: Reject late reaped-process syscalls
brandonpayton Jun 22, 2026
4caaa43
Network: Deliver loopback UDP across processes
brandonpayton Jul 9, 2026
f54ca70
Kernel: Preserve descriptor identity through devfs aliases
brandonpayton Jul 11, 2026
5220e0b
SDK: Preserve executable linker input order
brandonpayton Jul 12, 2026
9995125
POSIX: Preserve directory streams when rewind fails
brandonpayton Jul 22, 2026
82da96d
Host: Reflect ABI 43 modules from admitted bytes
brandonpayton Aug 1, 2026
d7e23a7
Host: Deliver caught signals before retrying waits
brandonpayton Jul 29, 2026
3a08f14
Host: Ignore debug names while patching thread modules
brandonpayton Jul 11, 2026
9af930d
Host: Finalize readiness timeouts through the kernel
brandonpayton Jul 11, 2026
0b9e502
Host: Run Node service demos from shared dinit images
brandonpayton Jun 16, 2026
debf7f4
CI: Repair xtask fixtures and gate xtask tests
brandonpayton Jul 2, 2026
220e8ac
CI: Gate the Rust workspace as one contract
brandonpayton Jul 6, 2026
cf8b019
Host: Reuse one bundled source worker entry
brandonpayton Jun 25, 2026
1234934
Browser: Add image-owned file ingest
brandonpayton Jul 10, 2026
3490937
Build: Update mkrootfs esbuild security release
dependabot[bot] Jul 27, 2026
b31aede
Build: Refresh minor and patch npm dependencies
dependabot[bot] Jul 27, 2026
a961a45
Build: Adopt Node 26 type definitions
dependabot[bot] Jul 27, 2026
2b0b063
Threads: Move clear-TID metadata into Rust
brandonpayton May 28, 2026
d1c74b5
IPC: Move shared-memory attachment identity into Rust
brandonpayton May 28, 2026
2ace728
Network: Move TCP listener selection into Rust
brandonpayton May 28, 2026
3604a7c
Timers: Move cleanup identity into Rust
brandonpayton May 28, 2026
882eda0
Procfs: Record generated process snapshot schema
brandonpayton May 28, 2026
3f7fbaf
Readiness: Generate wakeup and multiplexing metadata
brandonpayton May 28, 2026
05f0f79
VFS: Generate ABI-bound host metadata
brandonpayton May 28, 2026
4a44431
Docs: Record the Rust and host ownership boundary
brandonpayton May 28, 2026
523a948
Audio: Provide process-safe OSS PCM across both hosts
brandonpayton Jul 13, 2026
3ae490e
Browser: Expose machine-level PCM activation
brandonpayton Jul 13, 2026
692b12b
Packages: Validate portable OSS consumers
brandonpayton Jul 13, 2026
716e302
ABI: Establish the pre-vfork ABI 43 foundation
brandonpayton Aug 1, 2026
36b3491
Vfork: Complete ABI 43 transaction readiness
brandonpayton Aug 1, 2026
806704b
Homebrew: Bind ABI-aware finalizer and launcher fixtures
brandonpayton Aug 7, 2026
62100cc
Vfork: Define and measure the production mechanism
brandonpayton Aug 10, 2026
fd5f5c4
Homebrew: Complete validated archive materialization
brandonpayton Aug 10, 2026
c9a7302
VFS: Default executable mounts to nosuid
brandonpayton Aug 11, 2026
341f72c
Homebrew: Isolate privileged product programs
brandonpayton Aug 11, 2026
5a8bdc8
POSIX: Make process credentials authoritative
brandonpayton Aug 11, 2026
92145af
ABI: Bind and launch exact prepared exec targets
brandonpayton Aug 11, 2026
7c2a1b6
POSIX: Order spawn credentials before file actions
brandonpayton Aug 11, 2026
aef278c
Libc: Enter secure startup for set-ID images
brandonpayton Aug 11, 2026
ad05f6b
VFS: Resolve create metadata from the parent route
brandonpayton Aug 11, 2026
9a82915
VFS: Preserve set-ID metadata semantics
brandonpayton Aug 11, 2026
ece8ea2
PTY: Preserve slave ownership and mode
brandonpayton Aug 11, 2026
ded8e4f
Docs: Clarify poll interruption semantics
brandonpayton Aug 11, 2026
8d1ec5b
POSIX: Preserve and restart signal-interrupted waits
brandonpayton Aug 11, 2026
54b6a34
POSIX: Add real login and sudo-lite programs
brandonpayton Aug 11, 2026
812775d
Browser: Supervise real login sessions per terminal
brandonpayton Aug 12, 2026
88ae101
Homebrew: Compose CI-owned ABI 43 login staging
brandonpayton Aug 12, 2026
f6ab020
ABI: Complete vfork readiness integration
brandonpayton Aug 12, 2026
134e4aa
Build: Pin native xtask archive tools
brandonpayton Aug 12, 2026
ea7115e
Host: Initialize Node VFS rootfs mounts
brandonpayton Aug 12, 2026
be14d3f
Host: Use reentrant Node pipe protocol
brandonpayton Aug 12, 2026
a941eb4
Homebrew: Parse original bottle descriptors
brandonpayton Aug 12, 2026
95fe6a4
Homebrew: Declare embedded ABI 43 login roots
brandonpayton Aug 12, 2026
5669d27
Homebrew: Derive flat-shell checks from the active ABI
brandonpayton Aug 12, 2026
ea91b7a
ABI: Integrate current staging authority into ABI 43
brandonpayton Aug 13, 2026
1b5293b
Packages: Refresh ABI 43 program identities
brandonpayton Aug 13, 2026
b334b78
Homebrew: Restore staging candidate ABI option
brandonpayton Aug 13, 2026
be52756
Homebrew: Reconcile ABI 43 integration fixtures
brandonpayton Aug 13, 2026
266edf6
Homebrew: Refresh final native compatibility drift
brandonpayton Aug 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 4 additions & 1 deletion .github/actions/detect-change-scope/ci-scope-paths.sh
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ binary_materialization_changed_files() {
grep -E \
-e '^packages/registry/program-packages\.json$' \
-e '^tools/xtask/src/(index_candidate|index_toml|package_archive_name|remote_fetch|util)\.rs$' \
-e '^scripts/browser-memory64-example-fixtures\.(sh|txt)$' \
-e '^scripts/(activate-local-shell-build-override|ci-homebrew-browser-mirror-state|fetch-binaries|install-local-binary|install-local-shell-artifact|materialize-ci-canonical-package-index|materialize-ci-publication-blockers|materialize-pr-overlays|materialize-resolver-binaries|pack-ci-test-workspace|resolve-binary|stage-portable-resolver-binaries|test-wasm-artifact-guards|validate-publication-blocker-report|wasm-artifact-guards)\.sh$' \
-e '^scripts/(build-resolve-binary-bundle|test-resolve-binary-bundle)\.sh$' \
-e '^scripts/resolve-binary\.(ts|bundle\.mjs|bundle\.LICENSES\.txt)$' \
Expand All @@ -112,7 +113,9 @@ kernel_runtime_changed_files() {
-e '^tests/vfs-products\.(toml|generated\.json)$' \
-e '^tools/xtask/src/abi_staging/' \
-e '^(Cargo\.(lock|toml)|flake\.(nix|lock)|rust-toolchain\.toml|\.gitmodules)$' \
-e '^scripts/(build-musl|build-libcxx|build-programs|check-abi-version|check-libcxx-toolchain-version|ci-run-test-suite|dev-shell|run-libc-tests|run-posix-tests|run-sortix-tests)\.sh$' \
-e '^scripts/browser-memory64-example-fixtures\.(sh|txt)$' \
-e '^scripts/check-browser-memory64-example-fixtures\.ts$' \
-e '^scripts/(build-musl|build-libcxx|build-programs|check-abi-version|check-libcxx-toolchain-version|ci-check-browser-assets|ci-run-test-suite|dev-shell|run-libc-tests|run-posix-tests|run-sortix-tests)\.sh$' \
-e '^scripts/(abi-staging-pages-(producer(-fixture)?|readiness)(\.test)?\.ts|abi-staging-product-(browser|node)-evidence(\.test)?\.ts|abi-staging-product-input-sources\.ts|check-pages-vfs-product-registry(\.test)?\.mjs|run-vfs-product-builder(\.test)?\.ts|test-abi-staging-(mini-lifecycle|pages-atomic|product-authority)\.sh|vfs-product-catalog(\.test)?\.mjs)$' \
-e '^examples/run-example\.ts$' \
|| true
Expand Down
16 changes: 16 additions & 0 deletions .github/actions/detect-change-scope/test-ci-scope-paths.sh
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,13 @@ for blocker_materialization_script in \
"$blocker_materialization_script" \
"$blocker_materialization_script"
done
for browser_memory64_fixture_input in \
scripts/browser-memory64-example-fixtures.sh \
scripts/browser-memory64-example-fixtures.txt; do
assert_matches binary_materialization_changed_files \
"$browser_memory64_fixture_input" \
"$browser_memory64_fixture_input"
done
assert_matches binary_materialization_changed_files \
"scripts/stage-portable-resolver-binaries.sh" \
"scripts/stage-portable-resolver-binaries.sh"
Expand Down Expand Up @@ -538,6 +545,15 @@ assert_matches kernel_runtime_changed_files \
assert_matches kernel_runtime_changed_files \
"scripts/ci-run-test-suite.sh" \
"scripts/ci-run-test-suite.sh"
for browser_memory64_fixture_input in \
scripts/browser-memory64-example-fixtures.sh \
scripts/browser-memory64-example-fixtures.txt \
scripts/check-browser-memory64-example-fixtures.ts \
scripts/ci-check-browser-assets.sh; do
assert_matches kernel_runtime_changed_files \
"$browser_memory64_fixture_input" \
"$browser_memory64_fixture_input"
done
assert_not_matches kernel_runtime_changed_files \
"tools/xtask/src/remote_fetch.rs" \
"tools/xtask/src/remote_fetch.rs"
Expand Down
47 changes: 43 additions & 4 deletions .github/actions/package-toolchain/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ runs:
run: |
set -euo pipefail
musl_gitlink="$(git rev-parse HEAD:libc/musl)"
KEY="musl-sysroot-v5-${{ runner.os }}-$musl_gitlink-${{ hashFiles('flake.nix', 'flake.lock', 'rust-toolchain.toml', 'scripts/dev-shell.sh', 'scripts/build-musl.sh', 'scripts/install-overlay-headers.sh', 'packages/registry/libcxx/**', 'libc/musl-overlay/**', 'libc/glue/**', 'sdk/activate.sh', 'sdk/bin/**', 'sdk/config.site', 'sdk/package.json', 'sdk/package-lock.json', 'sdk/src/**') }}"
KEY="musl-sysroot-v6-${{ runner.os }}-$musl_gitlink-${{ hashFiles('.github/actions/package-toolchain/**', 'flake.nix', 'flake.lock', 'rust-toolchain.toml', 'scripts/dev-shell.sh', 'scripts/build-musl.sh', 'scripts/install-overlay-headers.sh', 'packages/registry/libcxx/**', 'libc/musl-overlay/**', 'libc/glue/**', 'sdk/activate.sh', 'sdk/bin/**', 'sdk/config.site', 'sdk/package.json', 'sdk/package-lock.json', 'sdk/src/**') }}"
echo "value=$KEY" >> "$GITHUB_OUTPUT"
echo "toolchain-cache key: $KEY"

Expand Down Expand Up @@ -56,17 +56,56 @@ runs:
build-deps path libcxx --arch "$arch")"
if [ "$arch" = "wasm64" ]; then sysroot="sysroot64"; else sysroot="sysroot"; fi
mkdir -p "$sysroot/lib" "$sysroot/include/c++"
ln -sf "$prefix/lib/libc++.a" "$sysroot/lib/libc++.a"
ln -sf "$prefix/lib/libc++abi.a" "$sysroot/lib/libc++abi.a"
# WHY: the resolver prefix is runner-local and is neither cached nor
# packed below. Copy these inputs so downstream test shards receive
# a self-contained sysroot instead of dangling absolute symlinks.
rm -f "$sysroot/lib/libc++.a" "$sysroot/lib/libc++abi.a"
install -m 0644 "$prefix/lib/libc++.a" "$sysroot/lib/libc++.a"
install -m 0644 "$prefix/lib/libc++abi.a" "$sysroot/lib/libc++abi.a"
rm -rf "$sysroot/include/c++/v1"
ln -sfn "$prefix/include/c++/v1" "$sysroot/include/c++/v1"
cp -a "$prefix/include/c++/v1" "$sysroot/include/c++/v1"
done
'

- name: Build fork-instrument host tool
shell: bash
run: bash scripts/dev-shell.sh bash scripts/build-fork-instrument-tool.sh

- name: Validate portable toolchain sysroots
shell: bash
run: |
set -euo pipefail
for sysroot in sysroot sysroot64; do
for archive in libc++.a libc++abi.a; do
path="$sysroot/lib/$archive"
if [ ! -f "$path" ] || [ -L "$path" ]; then
echo "package-toolchain: non-portable libc++ archive: $path" >&2
exit 1
fi
done
headers="$sysroot/include/c++/v1"
if [ ! -d "$headers" ] || [ -L "$headers" ]; then
echo "package-toolchain: non-portable libc++ headers: $headers" >&2
exit 1
fi

# WHY: tar preserves symlinks, but it does not carry targets outside
# the archived sysroot. Reject any escaping or dangling link before
# publication so consumers cannot receive a locally valid artifact
# that becomes incomplete after extraction.
sysroot_root="$(realpath "$sysroot")"
while IFS= read -r -d '' link; do
target="$(realpath "$link" 2>/dev/null || true)"
case "$target" in
"$sysroot_root"/*) ;;
*)
echo "package-toolchain: sysroot link escapes archive: $link" >&2
exit 1
;;
esac
done < <(find "$sysroot" -type l -print0)
done

- name: Pack toolchain sysroots + host tools
shell: bash
run: |
Expand Down
4 changes: 4 additions & 0 deletions .github/scripts/test-merge-candidate-workflows.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1300,6 +1300,10 @@ for workflow in "$STAGING_WORKFLOW" "$PREPARE"; do
grep -Fq 'run: bash scripts/dev-shell.sh npm ci --no-audit --no-fund' \
<<<"$root_install_step" ||
fail "$(basename "$workflow") materialization validation must install the root esbuild dependency"
materialization_step="$(step_block "$workflow" "Test binary materialization flow")"
grep -Fq 'bash scripts/dev-shell.sh bash scripts/build-fork-instrument-tool.sh' \
<<<"$materialization_step" ||
fail "$(basename "$workflow") materialization validation must build the fork contract inventory tool"
done

grep -Fq 'cleanup-merge-candidates.sh' "$CLEANUP_WORKFLOW" || \
Expand Down
10 changes: 6 additions & 4 deletions .github/workflows/force-rebuild.yml
Original file line number Diff line number Diff line change
Expand Up @@ -818,14 +818,16 @@ jobs:
# remove serial work while `test-gate` still aggregates every cell.
matrix:
include:
- suite: cargo-kernel
label: cargo-kernel
- suite: cargo-workspace
label: cargo-workspace
group: all
# Cover every workspace crate except independently gated xtask.
# New crates are included without another matrix allow-list edit.
needs_submodules: false
needs_toolchain: false
needs_workspace: false
- suite: fork-instrument
label: fork-instrument
- suite: cargo-xtask
label: cargo-xtask
group: all
needs_submodules: false
needs_toolchain: false
Expand Down
22 changes: 17 additions & 5 deletions .github/workflows/prepare-merge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1687,6 +1687,10 @@ jobs:
- name: Test binary materialization flow
if: env.BINARY_MATERIALIZATION_CHANGED == 'true' && env.EXACT_ABI_STAGING_APPLICABLE != 'true'
run: |
# WHY: artifact-guard integration tests query the ABI 43 binary
# contract inventory. This source-only job does not download the
# package-toolchain artifact, so prepare its host tool explicitly.
bash scripts/dev-shell.sh bash scripts/build-fork-instrument-tool.sh
bash scripts/dev-shell.sh npx --prefix host vitest run --root . tests/package-system

test-suite-early:
Expand All @@ -1712,11 +1716,18 @@ jobs:
fail-fast: false
matrix:
include:
- suite: cargo-kernel
label: cargo-kernel
- suite: fork-instrument
label: fork-instrument
- suite: cargo-workspace
label: cargo-workspace
# Closed-by-default coverage for every workspace crate except
# independently gated xtask, including integration-test crates.
kernel_only: true
- suite: cargo-xtask
label: cargo-xtask
# Package-system automation is independent of kernel changes and
# needs neither the toolchain nor the prepared test workspace.
kernel_only: false
env:
KERNEL_ONLY: ${{ matrix.kernel_only }}
KERNEL_CHANGED: ${{ needs.change-scope.outputs.kernel }}
EXACT_ABI_STAGING_APPLICABLE: ${{ needs.change-scope.outputs.exact_abi_staging_applicable }}
SUITE: ${{ matrix.suite }}
Expand All @@ -1725,7 +1736,8 @@ jobs:
id: suite
run: |
set -euo pipefail
if [ "$KERNEL_CHANGED" != "true" ] && \
if [ "$KERNEL_ONLY" = "true" ] && \
[ "$KERNEL_CHANGED" != "true" ] && \
[ "$EXACT_ABI_STAGING_APPLICABLE" != "true" ]; then
echo "skip=true" >> "$GITHUB_OUTPUT"
echo "$SUITE is kernel-only and this diff does not require kernel suites."
Expand Down
22 changes: 17 additions & 5 deletions .github/workflows/staging-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -899,6 +899,10 @@ jobs:
- name: Test binary materialization flow
if: env.BINARY_MATERIALIZATION_CHANGED == 'true' && env.EXACT_ABI_STAGING_APPLICABLE != 'true'
run: |
# WHY: artifact-guard integration tests query the ABI 43 binary
# contract inventory. This source-only job does not download the
# package-toolchain artifact, so prepare its host tool explicitly.
bash scripts/dev-shell.sh bash scripts/build-fork-instrument-tool.sh
bash scripts/dev-shell.sh npx --prefix host vitest run --root . tests/package-system

test-suite-early:
Expand All @@ -920,11 +924,18 @@ jobs:
fail-fast: false
matrix:
include:
- suite: cargo-kernel
label: cargo-kernel
- suite: fork-instrument
label: fork-instrument
- suite: cargo-workspace
label: cargo-workspace
# Closed-by-default coverage for every workspace crate except
# independently gated xtask, including integration-test crates.
kernel_only: true
- suite: cargo-xtask
label: cargo-xtask
# Package-system automation is independent of kernel changes and
# needs neither the toolchain nor the prepared test workspace.
kernel_only: false
env:
KERNEL_ONLY: ${{ matrix.kernel_only }}
KERNEL_CHANGED: ${{ needs.change-scope.outputs.kernel }}
EXACT_ABI_STAGING_APPLICABLE: ${{ needs.change-scope.outputs.exact_abi_staging_applicable }}
SKIP_STAGING_TESTS: ${{ needs.change-scope.outputs.skip_staging_tests }}
Expand All @@ -940,7 +951,8 @@ jobs:
echo "skip-staging-tests label is present; $SUITE is deferred to prepare-merge."
exit 0
fi
if [ "$KERNEL_CHANGED" != "true" ] && \
if [ "$KERNEL_ONLY" = "true" ] && \
[ "$KERNEL_CHANGED" != "true" ] && \
[ "$EXACT_ABI_STAGING_APPLICABLE" != "true" ]; then
echo "skip=true" >> "$GITHUB_OUTPUT"
echo "$SUITE is kernel-only and this diff does not require kernel suites."
Expand Down
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
url = https://github.com/ifduyue/musl.git
[submodule "libc-test"]
path = tests/libc/libc-test
url = git@github.com:PocketCluster/libc-test.git
url = https://github.com/PocketCluster/libc-test.git
[submodule "os-test"]
path = tests/sortix/os-test
url = https://gitlab.com/sortix/os-test.git
10 changes: 7 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -285,9 +285,13 @@ pins current.
`libc/glue/channel_syscall.c`, run `scripts/build-musl.sh` before relying on
`build.sh`, Vitest, or conformance tests.

PR titles, PR descriptions, and commit messages should lead with the purpose of
the work: the platform contract, user-visible behavior, system invariant, or
project capability being changed or protected. Every PR description must put a
PR titles and commit subjects must begin with a concise purpose prefix in the
form `Area: Purpose`, such as `Homebrew:`, `Kernel:`, `POSIX:`, `CI:`,
`Browser:`, or `Docs:`. Choose the area that best identifies the contract or
capability a reader should notice; the prefix is a routing hint, not a substitute
for a purpose-led title. PR descriptions and commit messages should then lead
with the platform contract, user-visible behavior, system invariant, or project
capability being changed or protected. Every PR description must put a
plain-language `## Why` section before `## What changed`, implementation
details, or validation. Explain the current problem, who or what it affects,
and why fixing it matters before describing the mechanics.
Expand Down
12 changes: 10 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion MANIFEST
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
/etc/ssl/certs d 0755 0 0

# ── User home ──────────────────────────────────────────────────────
/home/user d 0755 1000 1000
/home/maker d 0755 1000 1000

# ── /etc content (source: images/rootfs/etc/*) ────────────────────────────
# passwd/group/hosts live in rootfs.vfs, which is the source of truth
Expand All @@ -53,6 +53,8 @@
/etc/os-release f 0644 0 0
/etc/profile f 0644 0 0
/etc/motd f 0644 0 0
/etc/motd.autologin f 0644 0 0
/etc/sudoers f 0440 0 0
# The rootfs file is the authoritative services database. Rootfs-derived
# images inherit it rather than rebuilding or synthesizing a second table.
/etc/services f 0644 0 0
Expand Down
Loading
Loading