161 lines
5.5 KiB
Markdown
161 lines
5.5 KiB
Markdown
# Post-Phase-10: removed runtime dependence on `/tmp` Guile/Shepherd compatibility-prefix shims
|
|
|
|
Date: 2026-04-02
|
|
|
|
## Goal
|
|
|
|
After validating both the `rc.d` bridge path and the new Shepherd-as-PID-1 path, the next priority was the remaining runtime-artifact problem:
|
|
|
|
- the guest still carried activation-time `/tmp/...` compatibility symlinks for locally built Guile, guile-extra, and Shepherd prefixes
|
|
- those shims were compensating for baked-in historical paths in staged runtime artifacts
|
|
|
|
The goal of this subphase was narrower than fully rebuilding Guile/Shepherd in a store-native way. The immediate target was:
|
|
|
|
- remove the guest's *runtime dependence* on those `/tmp` compatibility-prefix symlinks,
|
|
- keep both validated boot modes working,
|
|
- and prove that Guile can still load the relevant modules from the store-backed runtime layout without those `/tmp` aliases.
|
|
|
|
## Result
|
|
|
|
This subphase succeeded.
|
|
|
|
The generated guest no longer needs activation to create:
|
|
|
|
- `/tmp/guile-freebsd-validate-install`
|
|
- `/tmp/guile-gnutls-freebsd-validate-install`
|
|
- `/tmp/shepherd-freebsd-validate-install`
|
|
|
|
Those shims are now absent in the booted guest, while both of these boot paths still pass on the real XCP-ng VM:
|
|
|
|
1. `freebsd-init+rc.d-shepherd`
|
|
2. `shepherd-pid1`
|
|
|
|
In both cases, the guest now also passes an explicit in-guest Guile module smoke test using the staged store paths and *without* the `/tmp` prefix aliases.
|
|
|
|
## What changed
|
|
|
|
### 1. Activation no longer creates `/tmp` compatibility-prefix symlinks
|
|
|
|
`modules/fruix/system/freebsd.scm` no longer emits activation logic that recreates the old `/tmp/...` prefix trees.
|
|
|
|
That means the guest is no longer depending on those aliases as part of ordinary first boot.
|
|
|
|
### 2. The staged runtime prefixes are sanitized as they are materialized into `/frx/store`
|
|
|
|
The prefix materializer now post-processes the copied runtime trees so the most relevant runtime-facing Scheme modules no longer require those `/tmp` prefix aliases.
|
|
|
|
This required a new prefix-materializer revision and deterministic post-copy sanitation.
|
|
|
|
### 3. Guile-extra runtime fixes
|
|
|
|
The staged guile-extra runtime now:
|
|
|
|
- patches `fibers/config.scm` so it can use `GUILE_EXTENSIONS_PATH` instead of falling back to the old `/tmp/guile-gnutls-freebsd-validate-install/...` path
|
|
- patches `gnutls.scm` so it can fall back to `GUILE_EXTENSIONS_PATH`
|
|
- removes stale compiled cache files that still embedded the old prefix values and would otherwise override the corrected source modules:
|
|
- `fibers/config.go`
|
|
- `gnutls.go`
|
|
|
|
### 4. Shepherd runtime fixes
|
|
|
|
The staged Shepherd runtime now:
|
|
|
|
- patches `share/guile/site/3.0/shepherd/config.scm` to use real runtime-facing paths instead of the old temporary install prefix:
|
|
- `Prefix-dir` => `/frx`
|
|
- `%localstatedir` => `/var`
|
|
- `%runstatedir` => `/var/run`
|
|
- `%sysconfdir` => `/etc`
|
|
- `%localedir` => `/usr/share/locale`
|
|
- `%pkglibdir` => `/usr/local/lib/shepherd`
|
|
- removes the stale compiled cache file that still embedded the old prefix values:
|
|
- `shepherd/config.go`
|
|
|
|
### 5. Real-VM validation harnesses now assert shim absence directly
|
|
|
|
The main real-VM validation scripts now check that the old `/tmp` compatibility-prefix trees are absent in the guest:
|
|
|
|
- `tests/system/run-phase9-xcpng-boot.sh`
|
|
- `tests/system/run-phase11-shepherd-pid1-xcpng.sh`
|
|
|
|
They also run an in-guest Guile module smoke test using the store-backed runtime environment and require:
|
|
|
|
- `guile_module_smoke=ok`
|
|
|
|
## Validation
|
|
|
|
### Real VM, `freebsd-init+rc.d-shepherd`
|
|
|
|
Passing run:
|
|
|
|
- `PASS phase9-xcpng-boot`
|
|
- workdir: `/tmp/noshim-phase9-smoke-1775143001`
|
|
|
|
Key metadata:
|
|
|
|
```text
|
|
compat_prefix_shims=absent
|
|
guile_module_smoke=ok
|
|
ready_marker=ready
|
|
shepherd_status=running
|
|
sshd_status=running
|
|
```
|
|
|
|
### Real VM, `shepherd-pid1`
|
|
|
|
Passing run:
|
|
|
|
- `PASS phase11-shepherd-pid1-xcpng`
|
|
- workdir: `/tmp/noshim-phase11-smoke-1775142712`
|
|
|
|
Key metadata:
|
|
|
|
```text
|
|
compat_prefix_shims=absent
|
|
guile_module_smoke=ok
|
|
ready_marker=ready
|
|
shepherd_pid=1
|
|
shepherd_status=running
|
|
sshd_status=running
|
|
```
|
|
|
|
### Manual guest confirmation
|
|
|
|
A direct SSH probe on the real guest confirmed that all three historical `/tmp` compatibility prefixes are absent while Guile can still load:
|
|
|
|
- `(fibers config)`
|
|
- `(gnutls)`
|
|
- `(shepherd config)`
|
|
|
|
with output including:
|
|
|
|
```text
|
|
ABSENT:/tmp/guile-freebsd-validate-install
|
|
ABSENT:/tmp/guile-gnutls-freebsd-validate-install
|
|
ABSENT:/tmp/shepherd-freebsd-validate-install
|
|
1.4.2
|
|
/var/run
|
|
```
|
|
|
|
## Assessment
|
|
|
|
This removes an important transitional runtime crutch.
|
|
|
|
Fruix is no longer merely *booting despite* historical `/tmp` prefix aliases; it now boots and runs Guile/Shepherd services from the staged store-backed runtime arrangement without those guest-side compatibility symlinks.
|
|
|
|
## Remaining limitation
|
|
|
|
This does **not** mean every historical prefix string has disappeared from every staged artifact.
|
|
|
|
Some compiled binaries and libraries still contain old build/install strings internally, especially in places such as:
|
|
|
|
- `libguile`
|
|
- libtool metadata
|
|
- pkg-config metadata
|
|
- extension shared objects built upstream with the original prefixes
|
|
|
|
However, the important practical milestone is that the guest no longer depends on `/tmp` compatibility-prefix symlinks at runtime.
|
|
|
|
## Recommended next step
|
|
|
|
The next, deeper cleanup would be to eliminate the remaining baked prefix strings from the runtime artifacts themselves by moving the local Guile/guile-extra/Shepherd build/install flow closer to a genuinely store-native prefix from the start, rather than relying on post-copy sanitation.
|