From 4011c3f41cacffa490777553b9ea92a35647e843 Mon Sep 17 00:00:00 2001 From: mudler Date: Mon, 6 Feb 2023 15:28:22 +0100 Subject: [PATCH 1/3] Cleanup --- pkg/mount/fs.go | 3 +- pkg/mount/mount.go | 6 ++-- pkg/{profile/profile.go => mount/schema.go} | 2 +- pkg/prepare/overlay.go | 32 --------------------- pkg/profile/loader.go | 7 ----- pkg/profile/mount.go | 4 --- 6 files changed, 5 insertions(+), 49 deletions(-) rename pkg/{profile/profile.go => mount/schema.go} (96%) delete mode 100644 pkg/prepare/overlay.go delete mode 100644 pkg/profile/loader.go delete mode 100644 pkg/profile/mount.go diff --git a/pkg/mount/fs.go b/pkg/mount/fs.go index e2b7d24..32d726a 100644 --- a/pkg/mount/fs.go +++ b/pkg/mount/fs.go @@ -9,7 +9,6 @@ import ( "github.com/containerd/containerd/mount" "github.com/deniswernert/go-fstab" - "github.com/kairos-io/immucore/pkg/profile" "github.com/kairos-io/kairos/pkg/utils" "github.com/moby/sys/mountinfo" ) @@ -35,7 +34,7 @@ func appendSlash(path string) string { } // https://github.com/kairos-io/packages/blob/94aa3bef3d1330cb6c6905ae164f5004b6a58b8c/packages/system/dracut/immutable-rootfs/30cos-immutable-rootfs/cos-mount-layout.sh#L129 -func baseOverlay(overlay profile.Overlay) (mountOperation, error) { +func baseOverlay(overlay Overlay) (mountOperation, error) { if err := os.MkdirAll(overlay.Base, 0700); err != nil { return mountOperation{}, err } diff --git a/pkg/mount/mount.go b/pkg/mount/mount.go index 1ded830..33933d7 100644 --- a/pkg/mount/mount.go +++ b/pkg/mount/mount.go @@ -3,17 +3,17 @@ package mount import ( "context" "fmt" - "github.com/rs/zerolog" "os" "path/filepath" "strings" "time" + "github.com/rs/zerolog" + "github.com/containerd/containerd/mount" "github.com/deniswernert/go-fstab" "github.com/hashicorp/go-multierror" "github.com/joho/godotenv" - "github.com/kairos-io/immucore/pkg/profile" "github.com/kairos-io/kairos/pkg/utils" "github.com/spectrocloud-labs/herd" ) @@ -274,7 +274,7 @@ func (s *State) Register(g *herd.Graph) error { err = g.Add(opMountBaseOverlay, herd.WithCallback( func(ctx context.Context) error { - op, err := baseOverlay(profile.Overlay{ + op, err := baseOverlay(Overlay{ Base: "/run/overlay", BackingBase: "tmpfs:20%", }) diff --git a/pkg/profile/profile.go b/pkg/mount/schema.go similarity index 96% rename from pkg/profile/profile.go rename to pkg/mount/schema.go index 3e55768..74b7fc9 100644 --- a/pkg/profile/profile.go +++ b/pkg/mount/schema.go @@ -1,4 +1,4 @@ -package profile +package mount type Layout struct { Overlay Overlay diff --git a/pkg/prepare/overlay.go b/pkg/prepare/overlay.go deleted file mode 100644 index 214c45a..0000000 --- a/pkg/prepare/overlay.go +++ /dev/null @@ -1,32 +0,0 @@ -package prepare - -/* -func hasMountpoint(path string, mounts []string) bool { - for _, mount := range mounts { - if strings.HasSuffix(mount, path) { - return true - } - } - return false -} - -func getStateMountpoints(statePaths []string, mountpoints []string) string { - var stateMounts string - for _, path := range statePaths { - if !hasMountpoint(path, mountpoints) { - stateMounts += path + " " - } - } - return stateMounts -} -func getOverlayMountpoints(rwPaths []string, mounts []string) string { - var mountpoints string - - for _, path := range rwPaths { - if !hasMountpoint(path, mounts) { - mountpoints += path + ":overlay " - } - } - return mountpoints -} -*/ diff --git a/pkg/profile/loader.go b/pkg/profile/loader.go deleted file mode 100644 index 2a4cf11..0000000 --- a/pkg/profile/loader.go +++ /dev/null @@ -1,7 +0,0 @@ -package profile - -func Apply() { - // Load all profiles - // Apply mounts - // Apply configurations to sysroot (/) or (/sysroot) -} diff --git a/pkg/profile/mount.go b/pkg/profile/mount.go deleted file mode 100644 index 8f9f22a..0000000 --- a/pkg/profile/mount.go +++ /dev/null @@ -1,4 +0,0 @@ -package profile - -// profile.Mount mounts a profile to the system. -func Mount() {} From 67aea02ba76724efb7d947fc41a5f8a16ffa1e9a Mon Sep 17 00:00:00 2001 From: mudler Date: Mon, 6 Feb 2023 15:41:52 +0100 Subject: [PATCH 2/3] Read mountpoint from env file --- internal/utils/mounts.go | 23 +++++++++++++++++++++++ pkg/mount/mount.go | 26 ++++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 internal/utils/mounts.go diff --git a/internal/utils/mounts.go b/internal/utils/mounts.go new file mode 100644 index 0000000..9c537d2 --- /dev/null +++ b/internal/utils/mounts.go @@ -0,0 +1,23 @@ +package utils + +import ( + "fmt" + "strings" +) + +// https://github.com/kairos-io/packages/blob/7c3581a8ba6371e5ce10c3a98bae54fde6a505af/packages/system/dracut/immutable-rootfs/30cos-immutable-rootfs/cos-mount-layout.sh#L58 + +// input: LABEL=FOO:/mount +// output: /dev/disk...:/mount +func ParseMount(s string) string { + switch { + case strings.Contains(s, "UUID="): + dat := strings.Split(s, "UUID=") + return fmt.Sprintf("/dev/disk/by-uuid/%s", dat[1]) + case strings.Contains(s, "LABEL="): + dat := strings.Split(s, "LABEL=") + return fmt.Sprintf("/dev/disk/by-label/%s", dat[1]) + default: + return s + } +} diff --git a/pkg/mount/mount.go b/pkg/mount/mount.go index 33933d7..f3c4c40 100644 --- a/pkg/mount/mount.go +++ b/pkg/mount/mount.go @@ -14,6 +14,8 @@ import ( "github.com/deniswernert/go-fstab" "github.com/hashicorp/go-multierror" "github.com/joho/godotenv" + internalUtils "github.com/kairos-io/immucore/internal/utils" + "github.com/kairos-io/kairos/pkg/utils" "github.com/spectrocloud-labs/herd" ) @@ -259,8 +261,28 @@ func (s *State) Register(g *herd.Graph) error { // TODO: PERSISTENT_STATE_TARGET /usr/local/.state s.BindMounts = strings.Split(env["PERSISTENT_STATE_PATHS"], " ") - // TODO: this needs to be parsed - // s.CustomMounts = strings.Split(env["VOLUMES"], " ") + s.StateDir = env["PERSISTENT_STATE_TARGET"] + if s.StateDir == "" { + s.StateDir = "/usr/local/.state" + } + + // s.CustomMounts is special: + // It gets parsed by the cmdline (TODO) + // and from the env var + // https://github.com/kairos-io/packages/blob/7c3581a8ba6371e5ce10c3a98bae54fde6a505af/packages/system/dracut/immutable-rootfs/30cos-immutable-rootfs/cos-generator.sh#L71 + // https://github.com/kairos-io/packages/blob/7c3581a8ba6371e5ce10c3a98bae54fde6a505af/packages/system/dracut/immutable-rootfs/30cos-immutable-rootfs/cos-mount-layout.sh#L80 + + for _, v := range strings.Split(env["VOLUMES"], " ") { + mountLine := internalUtils.ParseMount(v) + dat := strings.Split(mountLine, ":") + if len(dat) == 2 { + disk := dat[0] + path := dat[1] + s.CustomMounts[disk] = path + } + } + // TODO CMDLINE + return nil })) if err != nil { From 8f3a43861bf5b5a229655dbc4e3f825bb01d801a Mon Sep 17 00:00:00 2001 From: mudler Date: Mon, 6 Feb 2023 16:02:18 +0100 Subject: [PATCH 3/3] Read cmdline mount args --- internal/utils/mounts.go | 17 +++++++++++++++++ pkg/mount/mount.go | 9 +++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/internal/utils/mounts.go b/internal/utils/mounts.go index 9c537d2..892a0fa 100644 --- a/internal/utils/mounts.go +++ b/internal/utils/mounts.go @@ -2,6 +2,7 @@ package utils import ( "fmt" + "os" "strings" ) @@ -21,3 +22,19 @@ func ParseMount(s string) string { return s } } + +func ReadCMDLineArg(arg string) []string { + cmdLine, err := os.ReadFile("/proc/cmdline") + if err != nil { + return []string{} + } + res := []string{} + fields := strings.Fields(string(cmdLine)) + for _, f := range fields { + if strings.HasPrefix(f, arg) { + dat := strings.Split(f, arg) + res = append(res, dat[1]) + } + } + return res +} diff --git a/pkg/mount/mount.go b/pkg/mount/mount.go index f3c4c40..bfe724b 100644 --- a/pkg/mount/mount.go +++ b/pkg/mount/mount.go @@ -272,16 +272,17 @@ func (s *State) Register(g *herd.Graph) error { // https://github.com/kairos-io/packages/blob/7c3581a8ba6371e5ce10c3a98bae54fde6a505af/packages/system/dracut/immutable-rootfs/30cos-immutable-rootfs/cos-generator.sh#L71 // https://github.com/kairos-io/packages/blob/7c3581a8ba6371e5ce10c3a98bae54fde6a505af/packages/system/dracut/immutable-rootfs/30cos-immutable-rootfs/cos-mount-layout.sh#L80 - for _, v := range strings.Split(env["VOLUMES"], " ") { - mountLine := internalUtils.ParseMount(v) - dat := strings.Split(mountLine, ":") + addLine := func(d string) { + dat := strings.Split(d, ":") if len(dat) == 2 { disk := dat[0] path := dat[1] s.CustomMounts[disk] = path } } - // TODO CMDLINE + for _, v := range append(internalUtils.ReadCMDLineArg("rd.cos.mount="), strings.Split(env["VOLUMES"], " ")...) { + addLine(internalUtils.ParseMount(v)) + } return nil }))