forked from rosa/hakurei
hst: support ephemeral overlay mounts
This is useful for reusing a readonly template without autoroot. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
+27
-9
@@ -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())},
|
||||
|
||||
Reference in New Issue
Block a user