aboutsummaryrefslogtreecommitdiffhomepage
path: root/hst/fsoverlay.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-06-17 02:16:57 +0900
committerOphestra <cat@gensokyo.uk>2026-06-17 02:16:57 +0900
commit92b61889a6db7e5e351cade9c871a9d670917ee9 (patch)
tree57ab12560490ab4adc48dad94665646660087aac /hst/fsoverlay.go
parent28e133c298c2e9d45c57ab570e35936248d86ddf (diff)
hst: support ephemeral overlay mounts
This is useful for reusing a readonly template without autoroot. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'hst/fsoverlay.go')
-rw-r--r--hst/fsoverlay.go36
1 files changed, 27 insertions, 9 deletions
diff --git a/hst/fsoverlay.go b/hst/fsoverlay.go
index b06c1e7e..16a5e335 100644
--- a/hst/fsoverlay.go
+++ b/hst/fsoverlay.go
@@ -2,6 +2,7 @@ package hst
import (
"encoding/gob"
+ "slices"
"strings"
"hakurei.app/check"
@@ -40,7 +41,7 @@ func (o *FSOverlay) Valid() bool {
}
if o.Upper != nil { // rw
- return o.Work != nil && len(o.Lower) > 0
+ return o.Work != nil || len(o.Lower) > 0
} else { // ro
return len(o.Lower) >= 2
}
@@ -58,8 +59,11 @@ func (o *FSOverlay) Host() []*check.Absolute {
return nil
}
p := make([]*check.Absolute, 0, 2+len(o.Lower))
- if o.Upper != nil && o.Work != nil {
- p = append(p, o.Upper, o.Work)
+ if o.Upper != nil {
+ p = append(p, o.Upper)
+ if o.Work != nil {
+ p = append(p, o.Work)
+ }
}
p = append(p, o.Lower...)
return p
@@ -70,11 +74,18 @@ func (o *FSOverlay) Apply(z *ApplyState) {
return
}
- if o.Upper != nil && o.Work != nil {
- z.Overlay(o.Target, o.Upper, o.Work, o.Lower...)
+ if o.Upper != nil {
if o.Target.Is(fhs.AbsRoot) {
z.NoRemountRoot = true
}
+ if o.Work != nil {
+ z.Overlay(o.Target, o.Upper, o.Work, o.Lower...)
+ } else {
+ z.OverlayEphemeral(o.Target, slices.Concat(
+ o.Lower,
+ []*check.Absolute{o.Upper})...,
+ )
+ }
} else {
z.OverlayReadonly(o.Target, o.Lower...)
}
@@ -90,12 +101,19 @@ func (o *FSOverlay) String() string {
lower[i] = check.EscapeOverlayDataSegment(a.String())
}
- if o.Upper != nil && o.Work != nil {
- return "w*" + strings.Join(append([]string{
+ if o.Upper != nil {
+ if o.Work != nil {
+ return "w*" + strings.Join(append([]string{
+ check.EscapeOverlayDataSegment(o.Target.String()),
+ check.EscapeOverlayDataSegment(o.Upper.String()),
+ check.EscapeOverlayDataSegment(o.Work.String())},
+ lower...), check.SpecialOverlayPath)
+ }
+ return "e*" + strings.Join(append([]string{
check.EscapeOverlayDataSegment(o.Target.String()),
- check.EscapeOverlayDataSegment(o.Upper.String()),
- check.EscapeOverlayDataSegment(o.Work.String())},
+ check.EscapeOverlayDataSegment(o.Upper.String())},
lower...), check.SpecialOverlayPath)
+
} else {
return "*" + strings.Join(append([]string{
check.EscapeOverlayDataSegment(o.Target.String())},