diff --git a/cmd/control/install.go b/cmd/control/install.go index 03976bef..ef08e9f5 100644 --- a/cmd/control/install.go +++ b/cmd/control/install.go @@ -606,12 +606,42 @@ func seedData(baseName, cloudData string, files []string) error { return err } - if err = os.MkdirAll(filepath.Join(baseName, "/var/lib/rancher/conf/cloud-config.d"), 0700); err != nil { + stateSeedDir := "state_seed" + cloudConfigBase := "/var/lib/rancher/conf/cloud-config.d" + cloudConfigDir := "" + + // If there is a separate boot partition, cloud-config should be written to RANCHER_STATE partition. + bootPartition, _, err := util.Blkid("RANCHER_BOOT") + if err != nil { + log.Errorf("Failed to run blkid: %s", err) + } + if bootPartition != "" { + stateSeedFullPath := filepath.Join(baseName, stateSeedDir) + if err = os.MkdirAll(stateSeedFullPath, 0700); err != nil { + return err + } + + defer util.Unmount(stateSeedFullPath) + + statePartition := install.GetStatePartition() + cmd := exec.Command("mount", statePartition, stateSeedFullPath) + //cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + log.Debugf("seedData: mount %s to %s", statePartition, stateSeedFullPath) + if err = cmd.Run(); err != nil { + return err + } + + cloudConfigDir = filepath.Join(baseName, stateSeedDir, cloudConfigBase) + } else { + cloudConfigDir = filepath.Join(baseName, cloudConfigBase) + } + + if err = os.MkdirAll(cloudConfigDir, 0700); err != nil { return err } if !strings.HasSuffix(cloudData, "empty.yml") { - if err = dfs.CopyFile(cloudData, baseName+"/var/lib/rancher/conf/cloud-config.d/", filepath.Base(cloudData)); err != nil { + if err = dfs.CopyFile(cloudData, cloudConfigDir, filepath.Base(cloudData)); err != nil { return err } } diff --git a/cmd/control/install/install.go b/cmd/control/install/install.go index 125c2203..db9422a5 100644 --- a/cmd/control/install/install.go +++ b/cmd/control/install/install.go @@ -44,7 +44,6 @@ func MountDevice(baseName, device, partition string, raw bool) (string, string, //rootfs := partition // Don't use ResolveDevice - it can fail, whereas `blkid -L LABEL` works more often - cfg := config.LoadConfig() d, _, err := util.Blkid("RANCHER_BOOT") if err != nil { log.Errorf("Failed to run blkid: %s", err) @@ -53,18 +52,7 @@ func MountDevice(baseName, device, partition string, raw bool) (string, string, partition = d baseName = filepath.Join(baseName, config.BootDir) } else { - if dev := util.ResolveDevice(cfg.Rancher.State.Dev); dev != "" { - // try the rancher.state.dev setting - partition = dev - } else { - d, _, err := util.Blkid("RANCHER_STATE") - if err != nil { - log.Errorf("Failed to run blkid: %s", err) - } - if d != "" { - partition = d - } - } + partition = GetStatePartition() } cmd := exec.Command("lsblk", "-no", "pkname", partition) log.Debugf("Run(%v)", cmd) @@ -80,3 +68,17 @@ func MountDevice(baseName, device, partition string, raw bool) (string, string, log.Debugf("mountdevice return2 -> d: %s, p: %s", device, partition) return device, partition, cmd.Run() } + +func GetStatePartition() string { + cfg := config.LoadConfig() + + if dev := util.ResolveDevice(cfg.Rancher.State.Dev); dev != "" { + // try the rancher.state.dev setting + return dev + } + d, _, err := util.Blkid("RANCHER_STATE") + if err != nil { + log.Errorf("Failed to run blkid: %s", err) + } + return d +}