diff --git a/go.mod b/go.mod index d3ce444..82138ef 100644 --- a/go.mod +++ b/go.mod @@ -30,11 +30,9 @@ require ( github.com/ghodss/yaml v1.0.0 // indirect github.com/go-logr/logr v1.2.3 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/go-cmp v0.5.9 // indirect - github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/gookit/color v1.5.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect @@ -63,7 +61,6 @@ require ( golang.org/x/sys v0.5.0 // indirect golang.org/x/term v0.5.0 // indirect golang.org/x/text v0.7.0 // indirect - golang.org/x/tools v0.6.0 // indirect gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index b81bded..1aa303f 100644 --- a/go.sum +++ b/go.sum @@ -164,8 +164,6 @@ github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09Zvgq github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/containerd v1.6.17 h1:XDnJIeJW0cLf6v7/+N+6L9kGrChHeXekZp2VHu6OpiY= -github.com/containerd/containerd v1.6.17/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns= github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= @@ -323,8 +321,6 @@ github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dp github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= @@ -395,8 +391,6 @@ github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -438,7 +432,6 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= @@ -562,8 +555,6 @@ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo/v2 v2.8.0 h1:pAM+oBNPrpXRs+E/8spkeGx9QgekbRVyr74EUvRVOUI= -github.com/onsi/ginkgo/v2 v2.8.0/go.mod h1:6JsQiECmxCa3V5st74AL/AmsV482EDdVrGaVW6z3oYU= github.com/onsi/ginkgo/v2 v2.8.1 h1:xFTEVwOFa1D/Ty24Ws1npBWkDYEV9BqZrsDxVrVkrrU= github.com/onsi/ginkgo/v2 v2.8.1/go.mod h1:N1/NbDngAFcSLdyZ+/aYTYGSlq9qMCS/cNKGJjy+csc= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= @@ -573,8 +564,6 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= -github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= github.com/onsi/gomega v1.27.0 h1:QLidEla4bXUuZVFa4KX6JHCsuGgbi85LC/pCHrt/O08= github.com/onsi/gomega v1.27.0/go.mod h1:i189pavgK95OSIipFBa74gC2V4qrQuvjuyGEr3GmbXA= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -728,8 +717,6 @@ github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.24.3 h1:7Q1w8VN8yE0MJEHP06bv89PjYsN4IHWED2s1v/Zlfm0= -github.com/urfave/cli/v2 v2.24.3/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= github.com/urfave/cli/v2 v2.24.4 h1:0gyJJEBYtCV87zI/x2nZCPyDxD51K6xM8SkwjHFCNEU= github.com/urfave/cli/v2 v2.24.4/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= @@ -859,8 +846,6 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0 h1:L4ZwwTvKW9gr0ZMS1yrHD9GZhIuVjOBBnaKH+SPQK0Q= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -953,16 +938,12 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.4.0 h1:O7UWfv5+A2qiuulQk30kVinPoMtoIPeVaKLEgLpVkvg= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -973,8 +954,6 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1027,9 +1006,6 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.5.0 h1:+bSpV5HIeWkuvgaMfI3UmKRThoTA5ODJTUd8T17NO+4= -golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/internal/cmd/commands.go b/internal/cmd/commands.go index 22b0b37..f832890 100644 --- a/internal/cmd/commands.go +++ b/internal/cmd/commands.go @@ -48,21 +48,21 @@ Sends a generic event payload with the configuration found in the scanned direct g := herd.DAG(herd.EnableInit) // Get targets and state - targetLabel, targetDevice := utils.GetTarget(c.Bool("dry-run")) + targetImage, targetDevice := utils.GetTarget(c.Bool("dry-run")) s := &mount.State{ Logger: log.Logger, Rootdir: utils.GetRootDir(), - TargetLabel: targetDevice, - TargetImage: targetLabel, + TargetDevice: targetDevice, + TargetImage: targetImage, RootMountMode: utils.RootRW(), } if utils.DisableImmucore() { - log.Logger.Info().Msg("Stanza rd.cos.disable on the cmdline or booting from CDROM/Netboot/recovery. Disabling immucore.") + log.Logger.Info().Msg("Stanza rd.cos.disable on the cmdline or booting from CDROM/Netboot/Squash recovery. Disabling immucore.") err = s.RegisterLiveMedia(g) } else { - log.Logger.Info().Msg("Booting on active/passive.") + log.Logger.Info().Msg("Booting on active/passive/recovery.") err = s.RegisterNormalBoot(g) } diff --git a/internal/utils/common.go b/internal/utils/common.go index ebc276b..3557154 100644 --- a/internal/utils/common.go +++ b/internal/utils/common.go @@ -5,39 +5,28 @@ import ( "github.com/kairos-io/kairos/sdk/state" "github.com/rs/zerolog/log" "os" + "path/filepath" "strings" ) -// BootStateToLabel lets us know the label we need to mount sysroot on -func BootStateToLabel() string { +// BootStateToLabelDevice lets us know the device we need to mount sysroot on based on labels +func BootStateToLabelDevice() string { runtime, err := state.NewRuntime() if err != nil { return "" } switch runtime.BootState { - case "active_boot": - return "COS_ACTIVE" - case "passive_boot": - return "COS_PASSIVE" + case state.Active: + return filepath.Join("/dev/disk/by-label", "COS_ACTIVE") + case state.Passive: + return filepath.Join("/dev/disk/by-label", "COS_PASSIVE") + case state.Recovery: + return filepath.Join("/dev/disk/by-label", "COS_SYSTEM") default: return "" } } -// IsRecovery lets us know if we are in the recovery -func IsRecovery() bool { - runtime, err := state.NewRuntime() - if err != nil { - return false - } - switch runtime.BootState { - case "recovery_boot": - return true - default: - return false - } -} - // GetRootDir returns the proper dir to mount all the stuff // Useful if we want to move to a no-pivot boot func GetRootDir() string { @@ -112,7 +101,7 @@ func CleanupSlice(slice []string) []string { func GetTarget(dryRun bool) (string, string) { var img, label string - label = BootStateToLabel() + label = BootStateToLabelDevice() // If dry run, or we are disabled return whatever values, we won't go much further if dryRun || DisableImmucore() { @@ -132,7 +121,7 @@ func GetTarget(dryRun bool) (string, string) { } // DisableImmucore identifies if we need to be disabled -// We disable if we boot from CD, netboot, recovery or have the rd.cos.disable stanza in cmdline +// We disable if we boot from CD, netboot, squashfs recovery or have the rd.cos.disable stanza in cmdline func DisableImmucore() bool { cmdline, _ := os.ReadFile("/proc/cmdline") cmdlineS := string(cmdline) @@ -148,3 +137,21 @@ func RootRW() string { } return "ro" } + +// GetState returns the disk-by-label of the state partition to mount +// This is only valid for either active/passive or normal recovery +func GetState() string { + var label string + runtime, err := state.NewRuntime() + if err != nil { + return label + } + switch runtime.BootState { + case state.Active, state.Passive: + label = filepath.Join("/dev/disk/by-label/", runtime.State.Label) + case state.Recovery: + label = filepath.Join("/dev/disk/by-label/", runtime.Recovery.Label) + } + log.Logger.Debug().Str("what", label).Msg("Get state label") + return label +} diff --git a/internal/utils/mounts.go b/internal/utils/mounts.go index ebac750..7538d1c 100644 --- a/internal/utils/mounts.go +++ b/internal/utils/mounts.go @@ -5,6 +5,7 @@ import ( "github.com/containerd/containerd/mount" "github.com/deniswernert/go-fstab" "github.com/kairos-io/kairos/pkg/utils" + "github.com/rs/zerolog/log" "os" "os/exec" "strings" @@ -51,17 +52,22 @@ func ReadCMDLineArg(arg string) []string { return res } -// IsMountedByLabel lets us know if the given label is currently mounted -func IsMountedByLabel(label string) bool { - _, err := utils.SH(fmt.Sprintf("findmnt /dev/disk/by-label/%s", label)) +// IsMounted lets us know if the given device is currently mounted +func IsMounted(dev string) bool { + _, err := utils.SH(fmt.Sprintf("findmnt %s", dev)) return err == nil } // DiskFSType will return the FS type for a given disk -// Needs to be mounted +// Does NOT need to be mounted // Needs full path so either /dev/sda1 or /dev/disk/by-{label,uuid}/{label,uuid} func DiskFSType(s string) string { - out, _ := utils.SH(fmt.Sprintf("findmnt -rno FSTYPE %s", s)) + out, e := utils.SH(fmt.Sprintf("blkid %s -s TYPE -o value", s)) + if e != nil { + log.Logger.Err(e).Msg("blkid") + } + out = strings.Trim(strings.Trim(out, " "), "\n") + log.Logger.Debug().Str("what", s).Str("type", out).Msg("Partition FS type") return out } diff --git a/pkg/mount/dag_steps.go b/pkg/mount/dag_steps.go index 7240cf6..9e8e72a 100644 --- a/pkg/mount/dag_steps.go +++ b/pkg/mount/dag_steps.go @@ -29,18 +29,14 @@ func (s *State) MountTmpfsDagStep(g *herd.Graph) error { // 3 - Mount the labels as /sysroot func (s *State) MountRootDagStep(g *herd.Graph) error { var err error - runtime, err := state.NewRuntime() - if err != nil { - s.Logger.Debug().Err(err).Msg("runtime") - } // 1 - mount the state partition to find the images (active/passive/recovery) err = g.Add(cnst.OpMountState, herd.WithCallback( s.MountOP( - runtime.State.Name, + internalUtils.GetState(), s.path("/run/initramfs/cos-state"), - runtime.State.Type, + internalUtils.DiskFSType(internalUtils.GetState()), []string{ s.RootMountMode, }, 60*time.Second), @@ -55,9 +51,9 @@ func (s *State) MountRootDagStep(g *herd.Graph) error { herd.WithDeps(cnst.OpMountState), herd.WithCallback( func(ctx context.Context) error { - // Check if loop device is mounted by checking the existance of the target label - if internalUtils.IsMountedByLabel(s.TargetLabel) { - log.Logger.Debug().Str("targetImage", s.TargetImage).Str("path", s.Rootdir).Str("TargetLabel", s.TargetLabel).Msg("Not mounting loop, already mounted") + // Check if loop device is mounted already + if internalUtils.IsMounted(s.TargetDevice) { + log.Logger.Debug().Str("targetImage", s.TargetImage).Str("path", s.Rootdir).Str("TargetDevice", s.TargetDevice).Msg("Not mounting loop, already mounted") return nil } // TODO: squashfs recovery image? @@ -70,7 +66,7 @@ func (s *State) MountRootDagStep(g *herd.Graph) error { // the block device by the target label. Make sure we run this after mounting so we refresh the devices. sh, _ := utils.SH("udevadm trigger") s.Logger.Debug().Str("output", sh).Msg("udevadm trigger") - log.Logger.Debug().Str("targetImage", s.TargetImage).Str("path", s.Rootdir).Str("TargetLabel", s.TargetLabel).Msg("mount done") + log.Logger.Debug().Str("targetImage", s.TargetImage).Str("path", s.Rootdir).Str("TargetDevice", s.TargetDevice).Msg("mount done") return err }, )) @@ -83,10 +79,9 @@ func (s *State) MountRootDagStep(g *herd.Graph) error { herd.WithDeps(cnst.OpDiscoverState), herd.WithCallback( s.MountOP( - // Using /dev/disk/by-label here allows us to not have to deal with loop devices to identify where was the image mounted - fmt.Sprintf("/dev/disk/by-label/%s", s.TargetLabel), + s.TargetDevice, s.Rootdir, - "ext4", // are images always ext2? + "ext4", // TODO: Get this just in time? Currently if using DiskFSType is run immediately which is bad becuase its not mounted []string{ s.RootMountMode, "suid", diff --git a/pkg/mount/state.go b/pkg/mount/state.go index cd3df5e..fd7115b 100644 --- a/pkg/mount/state.go +++ b/pkg/mount/state.go @@ -22,7 +22,7 @@ type State struct { Logger zerolog.Logger Rootdir string // where to mount the root partition e.g. /sysroot inside initrd with pivot, / with nopivot TargetImage string // image from the state partition to mount as loop device e.g. /cOS/active.img - TargetLabel string // e.g. COS_ACTIVE + TargetDevice string // e.g. /dev/disk/by-label/COS_ACTIVE RootMountMode string // How to mount the root partition e.g. ro or rw // /run/cos-layout.env (different!) @@ -126,8 +126,7 @@ func (s *State) MountOP(what, where, t string, options []string, timeout time.Du // only continue the loop if it's an error and not an already mounted error if err != nil && !errors.Is(err, constants.ErrAlreadyMounted) { - out, _ := utils.SH("blkid") - s.Logger.Debug().Msg(out) + s.Logger.Err(err).Send() continue } log.Logger.Debug().Msg("mount done") diff --git a/pkg/mount/state_test.go b/pkg/mount/state_test.go index 651a086..aabf815 100644 --- a/pkg/mount/state_test.go +++ b/pkg/mount/state_test.go @@ -24,10 +24,10 @@ var _ = Describe("mounting immutable setup", func() { Context("simple invocation", func() { It("generates normal dag", func() { s := &mount.State{ - Logger: log.Output(zerolog.ConsoleWriter{Out: os.Stderr}).With().Logger(), - Rootdir: "/", - TargetImage: "/cOS/myimage.img", - TargetLabel: "COS_LABEL", + Logger: log.Output(zerolog.ConsoleWriter{Out: os.Stderr}).With().Logger(), + Rootdir: "/", + TargetImage: "/cOS/myimage.img", + TargetDevice: "/dev/disk/by-label/COS_LABEL", } err := s.RegisterNormalBoot(g)