2015-07-13 14:14:24 +00:00
|
|
|
// +build linux
|
|
|
|
|
2015-02-09 04:38:37 +00:00
|
|
|
package init
|
|
|
|
|
|
|
|
import (
|
2015-07-29 07:51:49 +00:00
|
|
|
"bufio"
|
2015-02-09 04:38:37 +00:00
|
|
|
"fmt"
|
2016-11-09 19:08:30 +00:00
|
|
|
"io/ioutil"
|
2015-02-09 04:38:37 +00:00
|
|
|
"os"
|
|
|
|
"os/exec"
|
2017-03-08 23:59:47 +00:00
|
|
|
"path/filepath"
|
2015-02-09 04:38:37 +00:00
|
|
|
"strings"
|
2016-01-15 13:18:30 +00:00
|
|
|
"syscall"
|
2015-02-09 04:38:37 +00:00
|
|
|
|
2016-06-15 23:41:42 +00:00
|
|
|
"github.com/docker/docker/pkg/mount"
|
2017-07-11 01:57:02 +00:00
|
|
|
"github.com/rancher/os/cmd/control/service"
|
2015-10-12 11:50:17 +00:00
|
|
|
"github.com/rancher/os/config"
|
2016-10-19 23:21:35 +00:00
|
|
|
"github.com/rancher/os/dfs"
|
2016-11-23 10:49:35 +00:00
|
|
|
"github.com/rancher/os/log"
|
2015-10-12 11:50:17 +00:00
|
|
|
"github.com/rancher/os/util"
|
2016-05-06 23:25:07 +00:00
|
|
|
"github.com/rancher/os/util/network"
|
2017-05-30 02:09:17 +00:00
|
|
|
|
|
|
|
"github.com/SvenDowideit/cpuid"
|
2015-02-09 04:38:37 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
2016-11-28 08:06:00 +00:00
|
|
|
state string = "/state"
|
|
|
|
boot2DockerMagic string = "boot2docker, please format-me"
|
2016-01-15 13:18:30 +00:00
|
|
|
|
2016-11-28 08:06:00 +00:00
|
|
|
tmpfsMagic int64 = 0x01021994
|
|
|
|
ramfsMagic int64 = 0x858458f6
|
2015-02-09 04:38:37 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
2016-10-19 23:21:35 +00:00
|
|
|
mountConfig = dfs.Config{
|
2015-07-29 07:51:49 +00:00
|
|
|
CgroupHierarchy: map[string]string{
|
|
|
|
"cpu": "cpu",
|
|
|
|
"cpuacct": "cpu",
|
|
|
|
"net_cls": "net_cls",
|
|
|
|
"net_prio": "net_cls",
|
|
|
|
},
|
2015-03-18 13:21:32 +00:00
|
|
|
}
|
2015-02-09 04:38:37 +00:00
|
|
|
)
|
|
|
|
|
2015-09-23 11:36:28 +00:00
|
|
|
func loadModules(cfg *config.CloudConfig) (*config.CloudConfig, error) {
|
2015-07-29 07:51:49 +00:00
|
|
|
mounted := map[string]bool{}
|
2015-02-09 04:38:37 +00:00
|
|
|
|
2015-07-29 07:51:49 +00:00
|
|
|
f, err := os.Open("/proc/modules")
|
2015-02-09 04:38:37 +00:00
|
|
|
if err != nil {
|
2015-09-23 11:36:28 +00:00
|
|
|
return cfg, err
|
2015-02-09 04:38:37 +00:00
|
|
|
}
|
|
|
|
defer f.Close()
|
|
|
|
|
2015-07-29 07:51:49 +00:00
|
|
|
reader := bufio.NewScanner(f)
|
|
|
|
for reader.Scan() {
|
|
|
|
mounted[strings.SplitN(reader.Text(), " ", 2)[0]] = true
|
2015-03-18 13:21:32 +00:00
|
|
|
}
|
|
|
|
|
2015-08-04 21:45:38 +00:00
|
|
|
for _, module := range cfg.Rancher.Modules {
|
2015-07-29 07:51:49 +00:00
|
|
|
if mounted[module] {
|
|
|
|
continue
|
2015-03-18 13:21:32 +00:00
|
|
|
}
|
|
|
|
|
2015-02-09 04:38:37 +00:00
|
|
|
log.Debugf("Loading module %s", module)
|
2016-12-01 19:16:53 +00:00
|
|
|
cmd := exec.Command("modprobe", module)
|
|
|
|
cmd.Stdout = os.Stdout
|
|
|
|
cmd.Stderr = os.Stderr
|
|
|
|
if err := cmd.Run(); err != nil {
|
2015-04-29 10:13:59 +00:00
|
|
|
log.Errorf("Could not load module %s, err %v", module, err)
|
2015-02-09 04:38:37 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-09-23 11:36:28 +00:00
|
|
|
return cfg, nil
|
2015-02-09 04:38:37 +00:00
|
|
|
}
|
|
|
|
|
2015-09-23 11:36:28 +00:00
|
|
|
func sysInit(c *config.CloudConfig) (*config.CloudConfig, error) {
|
2016-11-28 08:06:00 +00:00
|
|
|
args := append([]string{config.SysInitBin}, os.Args[1:]...)
|
2015-07-29 07:51:49 +00:00
|
|
|
|
|
|
|
cmd := &exec.Cmd{
|
2016-11-28 08:06:00 +00:00
|
|
|
Path: config.RosBin,
|
2015-07-29 07:51:49 +00:00
|
|
|
Args: args,
|
2015-02-14 16:35:12 +00:00
|
|
|
}
|
|
|
|
|
2015-07-29 07:51:49 +00:00
|
|
|
cmd.Stdin = os.Stdin
|
|
|
|
cmd.Stderr = os.Stderr
|
|
|
|
cmd.Stdout = os.Stdout
|
|
|
|
|
2015-02-09 04:38:37 +00:00
|
|
|
if err := cmd.Start(); err != nil {
|
2015-09-23 11:36:28 +00:00
|
|
|
return c, err
|
2015-02-09 04:38:37 +00:00
|
|
|
}
|
|
|
|
|
2015-09-23 11:36:28 +00:00
|
|
|
return c, os.Stdin.Close()
|
2015-02-09 04:38:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func MainInit() {
|
2017-07-12 04:18:02 +00:00
|
|
|
log.InitDeferedLogger()
|
2017-07-12 05:17:03 +00:00
|
|
|
|
2015-02-09 04:38:37 +00:00
|
|
|
if err := RunInit(); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-20 05:34:07 +00:00
|
|
|
func mountConfigured(display, dev, fsType, target string) error {
|
2015-02-09 04:38:37 +00:00
|
|
|
var err error
|
2015-02-12 22:34:16 +00:00
|
|
|
|
2015-12-20 05:34:07 +00:00
|
|
|
if dev == "" {
|
2015-07-29 07:51:49 +00:00
|
|
|
return nil
|
|
|
|
}
|
2015-02-12 22:34:16 +00:00
|
|
|
|
2015-12-20 05:34:07 +00:00
|
|
|
dev = util.ResolveDevice(dev)
|
2015-07-29 07:51:49 +00:00
|
|
|
if dev == "" {
|
2015-12-20 05:34:07 +00:00
|
|
|
return fmt.Errorf("Could not resolve device %q", dev)
|
2015-07-29 07:51:49 +00:00
|
|
|
}
|
|
|
|
if fsType == "auto" {
|
|
|
|
fsType, err = util.GetFsType(dev)
|
|
|
|
}
|
2015-02-12 22:34:16 +00:00
|
|
|
|
2015-07-29 07:51:49 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
2015-02-09 04:38:37 +00:00
|
|
|
}
|
|
|
|
|
2015-07-29 07:51:49 +00:00
|
|
|
log.Debugf("FsType has been set to %s", fsType)
|
2015-12-20 05:34:07 +00:00
|
|
|
log.Infof("Mounting %s device %s to %s", display, dev, target)
|
|
|
|
return util.Mount(dev, target, fsType, "")
|
|
|
|
}
|
|
|
|
|
|
|
|
func mountState(cfg *config.CloudConfig) error {
|
2016-11-28 08:06:00 +00:00
|
|
|
return mountConfigured("state", cfg.Rancher.State.Dev, cfg.Rancher.State.FsType, state)
|
2015-07-22 16:14:39 +00:00
|
|
|
}
|
2015-02-09 04:38:37 +00:00
|
|
|
|
2015-12-20 05:26:09 +00:00
|
|
|
func mountOem(cfg *config.CloudConfig) (*config.CloudConfig, error) {
|
|
|
|
if cfg == nil {
|
2016-06-02 01:41:55 +00:00
|
|
|
cfg = config.LoadConfig()
|
2015-12-20 05:26:09 +00:00
|
|
|
}
|
|
|
|
if err := mountConfigured("oem", cfg.Rancher.State.OemDev, cfg.Rancher.State.OemFsType, config.OEM); err != nil {
|
2016-02-04 15:44:08 +00:00
|
|
|
log.Debugf("Not mounting OEM: %v", err)
|
|
|
|
} else {
|
|
|
|
log.Infof("Mounted OEM: %s", cfg.Rancher.State.OemDev)
|
2015-12-20 05:26:09 +00:00
|
|
|
}
|
|
|
|
return cfg, nil
|
|
|
|
}
|
|
|
|
|
2015-08-04 21:45:38 +00:00
|
|
|
func tryMountState(cfg *config.CloudConfig) error {
|
2015-07-29 07:51:49 +00:00
|
|
|
if mountState(cfg) == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// If we failed to mount lets run bootstrap and try again
|
|
|
|
if err := bootstrap(cfg); err != nil {
|
|
|
|
return err
|
2015-02-17 08:18:48 +00:00
|
|
|
}
|
2015-02-09 04:38:37 +00:00
|
|
|
|
2015-07-29 07:51:49 +00:00
|
|
|
return mountState(cfg)
|
2015-04-03 21:59:24 +00:00
|
|
|
}
|
|
|
|
|
2016-11-09 19:08:30 +00:00
|
|
|
func tryMountAndBootstrap(cfg *config.CloudConfig) (*config.CloudConfig, bool, error) {
|
2016-07-28 06:25:08 +00:00
|
|
|
if !isInitrd() || cfg.Rancher.State.Dev == "" {
|
2016-11-09 19:08:30 +00:00
|
|
|
return cfg, false, nil
|
2016-07-28 06:25:08 +00:00
|
|
|
}
|
2015-04-03 21:59:24 +00:00
|
|
|
|
2016-07-28 06:25:08 +00:00
|
|
|
if err := tryMountState(cfg); !cfg.Rancher.State.Required && err != nil {
|
2016-11-09 19:08:30 +00:00
|
|
|
return cfg, false, nil
|
2016-07-28 06:25:08 +00:00
|
|
|
} else if err != nil {
|
2016-11-09 19:08:30 +00:00
|
|
|
return cfg, false, err
|
2016-07-28 06:25:08 +00:00
|
|
|
}
|
|
|
|
|
2016-11-09 19:08:30 +00:00
|
|
|
return cfg, true, nil
|
2015-04-03 21:59:24 +00:00
|
|
|
}
|
|
|
|
|
2016-10-19 23:21:35 +00:00
|
|
|
func getLaunchConfig(cfg *config.CloudConfig, dockerCfg *config.DockerConfig) (*dfs.Config, []string) {
|
|
|
|
var launchConfig dfs.Config
|
2015-07-29 07:51:49 +00:00
|
|
|
|
2016-10-19 23:21:35 +00:00
|
|
|
args := dfs.ParseConfig(&launchConfig, dockerCfg.FullArgs()...)
|
2015-07-29 07:51:49 +00:00
|
|
|
|
2016-11-28 08:06:00 +00:00
|
|
|
launchConfig.DNSConfig.Nameservers = cfg.Rancher.Defaults.Network.DNS.Nameservers
|
|
|
|
launchConfig.DNSConfig.Search = cfg.Rancher.Defaults.Network.DNS.Search
|
2015-08-27 19:24:26 +00:00
|
|
|
launchConfig.Environment = dockerCfg.Environment
|
2015-07-29 07:51:49 +00:00
|
|
|
|
2015-08-04 21:45:38 +00:00
|
|
|
if !cfg.Rancher.Debug {
|
2016-11-28 08:06:00 +00:00
|
|
|
launchConfig.LogFile = config.SystemDockerLog
|
2015-04-03 21:59:24 +00:00
|
|
|
}
|
|
|
|
|
2015-07-29 07:51:49 +00:00
|
|
|
return &launchConfig, args
|
2015-04-03 21:59:24 +00:00
|
|
|
}
|
|
|
|
|
2016-01-15 13:18:30 +00:00
|
|
|
func isInitrd() bool {
|
|
|
|
var stat syscall.Statfs_t
|
|
|
|
syscall.Statfs("/", &stat)
|
2016-11-28 08:06:00 +00:00
|
|
|
return int64(stat.Type) == tmpfsMagic || int64(stat.Type) == ramfsMagic
|
2016-01-15 13:18:30 +00:00
|
|
|
}
|
|
|
|
|
2016-06-15 23:41:42 +00:00
|
|
|
func setupSharedRoot(c *config.CloudConfig) (*config.CloudConfig, error) {
|
|
|
|
if c.Rancher.NoSharedRoot {
|
|
|
|
return c, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
if isInitrd() {
|
2016-09-09 16:06:23 +00:00
|
|
|
for _, i := range []string{"/mnt", "/media", "/var/lib/system-docker"} {
|
2016-09-26 03:37:55 +00:00
|
|
|
if err := os.MkdirAll(i, 0755); err != nil {
|
2016-06-15 23:41:42 +00:00
|
|
|
return c, err
|
|
|
|
}
|
|
|
|
if err := mount.Mount("tmpfs", i, "tmpfs", "rw"); err != nil {
|
|
|
|
return c, err
|
|
|
|
}
|
2016-06-17 15:04:35 +00:00
|
|
|
if err := mount.MakeShared(i); err != nil {
|
2016-06-15 23:41:42 +00:00
|
|
|
return c, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return c, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return c, mount.MakeShared("/")
|
|
|
|
}
|
|
|
|
|
2015-02-09 04:38:37 +00:00
|
|
|
func RunInit() error {
|
2015-04-03 21:59:24 +00:00
|
|
|
os.Setenv("PATH", "/sbin:/usr/sbin:/usr/bin")
|
2016-01-15 13:18:30 +00:00
|
|
|
if isInitrd() {
|
|
|
|
log.Debug("Booting off an in-memory filesystem")
|
|
|
|
// Magic setting to tell Docker to do switch_root and not pivot_root
|
|
|
|
os.Setenv("DOCKER_RAMDISK", "true")
|
|
|
|
} else {
|
|
|
|
log.Debug("Booting off a persistent filesystem")
|
|
|
|
}
|
2015-02-09 04:38:37 +00:00
|
|
|
|
2016-07-28 06:25:08 +00:00
|
|
|
boot2DockerEnvironment := false
|
2016-11-09 19:08:30 +00:00
|
|
|
var shouldSwitchRoot bool
|
2017-07-11 08:03:38 +00:00
|
|
|
hypervisor := ""
|
2017-03-08 23:59:47 +00:00
|
|
|
|
|
|
|
configFiles := make(map[string][]byte)
|
|
|
|
|
2017-05-02 23:45:58 +00:00
|
|
|
initFuncs := []config.CfgFuncData{
|
2017-07-12 13:58:38 +00:00
|
|
|
config.CfgFuncData{"preparefs", func(c *config.CloudConfig) (*config.CloudConfig, error) {
|
|
|
|
return c, dfs.PrepareFs(&mountConfig)
|
2017-05-02 23:45:58 +00:00
|
|
|
}},
|
2017-07-12 13:58:38 +00:00
|
|
|
config.CfgFuncData{"save init cmdline", func(c *config.CloudConfig) (*config.CloudConfig, error) {
|
2017-03-10 14:23:22 +00:00
|
|
|
// will this be passed to cloud-init-save?
|
|
|
|
cmdLineArgs := strings.Join(os.Args, " ")
|
|
|
|
config.SaveInitCmdline(cmdLineArgs)
|
|
|
|
|
2017-07-12 13:58:38 +00:00
|
|
|
cfg := config.LoadConfig()
|
|
|
|
log.Debugf("Cmdline debug = %s", cfg.Rancher.Debug)
|
|
|
|
if cfg.Rancher.Debug {
|
|
|
|
log.SetLevel(log.DebugLevel)
|
|
|
|
} else {
|
|
|
|
log.SetLevel(log.InfoLevel)
|
|
|
|
}
|
|
|
|
|
2017-07-11 08:03:38 +00:00
|
|
|
return cfg, nil
|
2017-05-02 23:45:58 +00:00
|
|
|
}},
|
|
|
|
config.CfgFuncData{"mount OEM", mountOem},
|
|
|
|
config.CfgFuncData{"debug save cfg", func(_ *config.CloudConfig) (*config.CloudConfig, error) {
|
2016-06-02 01:41:55 +00:00
|
|
|
cfg := config.LoadConfig()
|
2015-02-14 16:34:11 +00:00
|
|
|
|
2015-08-04 21:45:38 +00:00
|
|
|
if cfg.Rancher.Debug {
|
2016-05-31 21:34:04 +00:00
|
|
|
cfgString, err := config.Export(false, true)
|
2015-08-20 13:06:48 +00:00
|
|
|
if err != nil {
|
|
|
|
log.WithFields(log.Fields{"err": err}).Error("Error serializing config")
|
|
|
|
} else {
|
2015-07-29 07:51:49 +00:00
|
|
|
log.Debugf("Config: %s", cfgString)
|
|
|
|
}
|
2015-02-14 16:34:11 +00:00
|
|
|
}
|
|
|
|
|
2015-09-23 11:36:28 +00:00
|
|
|
return cfg, nil
|
2017-05-02 23:45:58 +00:00
|
|
|
}},
|
|
|
|
config.CfgFuncData{"load modules", loadModules},
|
|
|
|
config.CfgFuncData{"b2d env", func(cfg *config.CloudConfig) (*config.CloudConfig, error) {
|
2017-07-12 13:58:38 +00:00
|
|
|
if dev := util.ResolveDevice("LABEL=B2D_STATE"); dev != "" {
|
2016-07-28 06:25:08 +00:00
|
|
|
boot2DockerEnvironment = true
|
|
|
|
cfg.Rancher.State.Dev = "LABEL=B2D_STATE"
|
2017-07-12 13:58:38 +00:00
|
|
|
log.Infof("boot2DockerEnvironment %s: %s", cfg.Rancher.State.Dev, dev)
|
2016-07-28 06:25:08 +00:00
|
|
|
return cfg, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
devices := []string{"/dev/sda", "/dev/vda"}
|
2016-11-28 08:06:00 +00:00
|
|
|
data := make([]byte, len(boot2DockerMagic))
|
2016-07-28 06:25:08 +00:00
|
|
|
|
|
|
|
for _, device := range devices {
|
|
|
|
f, err := os.Open(device)
|
|
|
|
if err == nil {
|
|
|
|
defer f.Close()
|
|
|
|
|
|
|
|
_, err = f.Read(data)
|
2016-11-28 08:06:00 +00:00
|
|
|
if err == nil && string(data) == boot2DockerMagic {
|
2016-07-28 06:25:08 +00:00
|
|
|
boot2DockerEnvironment = true
|
|
|
|
cfg.Rancher.State.Dev = "LABEL=B2D_STATE"
|
|
|
|
cfg.Rancher.State.Autoformat = []string{device}
|
2017-07-12 13:58:38 +00:00
|
|
|
log.Infof("boot2DockerEnvironment %s: Autoformat %s", cfg.Rancher.State.Dev, cfg.Rancher.State.Autoformat[0])
|
|
|
|
|
2016-07-28 06:25:08 +00:00
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-20 07:02:48 +00:00
|
|
|
// save here so the bootstrap service can see it (when booting from iso, its very early)
|
|
|
|
if boot2DockerEnvironment {
|
|
|
|
if err := config.Set("rancher.state.dev", cfg.Rancher.State.Dev); err != nil {
|
|
|
|
log.Errorf("Failed to update rancher.state.dev: %v", err)
|
|
|
|
}
|
|
|
|
if err := config.Set("rancher.state.autoformat", cfg.Rancher.State.Autoformat); err != nil {
|
|
|
|
log.Errorf("Failed to update rancher.state.autoformat: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return config.LoadConfig(), nil
|
2017-05-02 23:45:58 +00:00
|
|
|
}},
|
|
|
|
config.CfgFuncData{"mount and bootstrap", func(cfg *config.CloudConfig) (*config.CloudConfig, error) {
|
2016-11-09 19:08:30 +00:00
|
|
|
var err error
|
|
|
|
cfg, shouldSwitchRoot, err = tryMountAndBootstrap(cfg)
|
2017-07-11 08:03:38 +00:00
|
|
|
|
2016-11-09 19:08:30 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return cfg, nil
|
2017-05-02 23:45:58 +00:00
|
|
|
}},
|
|
|
|
config.CfgFuncData{"cloud-init", func(cfg *config.CloudConfig) (*config.CloudConfig, error) {
|
2016-11-28 08:06:00 +00:00
|
|
|
cfg.Rancher.CloudInit.Datasources = config.LoadConfigWithPrefix(state).Rancher.CloudInit.Datasources
|
2017-07-11 08:03:38 +00:00
|
|
|
hypervisor = checkHypervisor(cfg)
|
2017-06-17 12:56:25 +00:00
|
|
|
if hypervisor == "vmware" {
|
|
|
|
// add vmware to the end - we don't want to over-ride an choices the user has made
|
|
|
|
cfg.Rancher.CloudInit.Datasources = append(cfg.Rancher.CloudInit.Datasources, hypervisor)
|
2017-07-11 01:57:02 +00:00
|
|
|
if err := config.Set("rancher.cloud_init.datasources", cfg.Rancher.CloudInit.Datasources); err != nil {
|
|
|
|
log.Error(err)
|
|
|
|
}
|
2016-11-09 19:08:30 +00:00
|
|
|
}
|
|
|
|
|
2017-05-02 23:45:58 +00:00
|
|
|
log.Debug("init, runCloudInitServices()")
|
2017-03-01 05:12:56 +00:00
|
|
|
if err := runCloudInitServices(cfg); err != nil {
|
|
|
|
log.Error(err)
|
2016-11-09 19:08:30 +00:00
|
|
|
}
|
|
|
|
|
2017-07-12 13:58:38 +00:00
|
|
|
return config.LoadConfig(), nil
|
2017-05-02 23:45:58 +00:00
|
|
|
}},
|
|
|
|
config.CfgFuncData{"read cfg files", func(cfg *config.CloudConfig) (*config.CloudConfig, error) {
|
2017-03-08 23:59:47 +00:00
|
|
|
filesToCopy := []string{
|
2017-03-10 14:23:22 +00:00
|
|
|
config.CloudConfigInitFile,
|
2017-03-08 23:59:47 +00:00
|
|
|
config.CloudConfigBootFile,
|
|
|
|
config.CloudConfigNetworkFile,
|
|
|
|
config.MetaDataFile,
|
2016-11-09 19:08:30 +00:00
|
|
|
}
|
2017-03-08 23:59:47 +00:00
|
|
|
for _, name := range filesToCopy {
|
2017-05-10 04:05:31 +00:00
|
|
|
if _, err := os.Lstat(name); !os.IsNotExist(err) {
|
|
|
|
content, err := ioutil.ReadFile(name)
|
|
|
|
if err != nil {
|
|
|
|
log.Errorf("read cfg file (%s) %s", name, err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
configFiles[name] = content
|
2017-03-08 23:59:47 +00:00
|
|
|
}
|
2016-11-09 19:08:30 +00:00
|
|
|
}
|
|
|
|
return cfg, nil
|
2017-05-02 23:45:58 +00:00
|
|
|
}},
|
|
|
|
config.CfgFuncData{"switchroot", func(cfg *config.CloudConfig) (*config.CloudConfig, error) {
|
2016-11-09 19:08:30 +00:00
|
|
|
if !shouldSwitchRoot {
|
|
|
|
return cfg, nil
|
|
|
|
}
|
2016-11-28 08:06:00 +00:00
|
|
|
log.Debugf("Switching to new root at %s %s", state, cfg.Rancher.State.Directory)
|
|
|
|
if err := switchRoot(state, cfg.Rancher.State.Directory, cfg.Rancher.RmUsr); err != nil {
|
2016-11-09 19:08:30 +00:00
|
|
|
return cfg, err
|
|
|
|
}
|
|
|
|
return cfg, nil
|
2017-05-02 23:45:58 +00:00
|
|
|
}},
|
|
|
|
config.CfgFuncData{"mount OEM2", mountOem},
|
|
|
|
config.CfgFuncData{"write cfg files", func(cfg *config.CloudConfig) (*config.CloudConfig, error) {
|
2017-07-12 13:58:38 +00:00
|
|
|
log.FsReady()
|
2017-03-08 23:59:47 +00:00
|
|
|
for name, content := range configFiles {
|
2017-03-13 07:17:15 +00:00
|
|
|
if err := os.MkdirAll(filepath.Dir(name), os.ModeDir|0700); err != nil {
|
2017-03-08 23:59:47 +00:00
|
|
|
log.Error(err)
|
|
|
|
}
|
|
|
|
if err := util.WriteFileAtomic(name, content, 400); err != nil {
|
|
|
|
log.Error(err)
|
|
|
|
}
|
2016-11-09 19:08:30 +00:00
|
|
|
}
|
2017-03-13 07:17:15 +00:00
|
|
|
if err := os.MkdirAll(config.VarRancherDir, os.ModeDir|0755); err != nil {
|
|
|
|
log.Error(err)
|
|
|
|
}
|
|
|
|
if err := os.Chmod(config.VarRancherDir, os.ModeDir|0755); err != nil {
|
|
|
|
log.Error(err)
|
|
|
|
}
|
2017-06-15 13:37:44 +00:00
|
|
|
|
2016-11-09 19:08:30 +00:00
|
|
|
return cfg, nil
|
2017-05-02 23:45:58 +00:00
|
|
|
}},
|
|
|
|
config.CfgFuncData{"b2d Env", func(cfg *config.CloudConfig) (*config.CloudConfig, error) {
|
2016-07-28 06:25:08 +00:00
|
|
|
if boot2DockerEnvironment {
|
|
|
|
if err := config.Set("rancher.state.dev", cfg.Rancher.State.Dev); err != nil {
|
|
|
|
log.Errorf("Failed to update rancher.state.dev: %v", err)
|
|
|
|
}
|
|
|
|
if err := config.Set("rancher.state.autoformat", cfg.Rancher.State.Autoformat); err != nil {
|
|
|
|
log.Errorf("Failed to update rancher.state.autoformat: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-06-02 01:41:55 +00:00
|
|
|
return config.LoadConfig(), nil
|
2017-05-02 23:45:58 +00:00
|
|
|
}},
|
2017-07-12 13:58:38 +00:00
|
|
|
config.CfgFuncData{"hypervisor tools", func(cfg *config.CloudConfig) (*config.CloudConfig, error) {
|
|
|
|
// Maybe we could set `rancher.hypervisor_service`, and defer this further?
|
|
|
|
enableHypervisorService(cfg, hypervisor)
|
|
|
|
return config.LoadConfig(), nil
|
|
|
|
}},
|
2017-07-11 08:03:38 +00:00
|
|
|
config.CfgFuncData{"preparefs2", func(cfg *config.CloudConfig) (*config.CloudConfig, error) {
|
|
|
|
return cfg, dfs.PrepareFs(&mountConfig)
|
2017-05-02 23:45:58 +00:00
|
|
|
}},
|
|
|
|
config.CfgFuncData{"load modules2", loadModules},
|
2017-07-11 08:03:38 +00:00
|
|
|
config.CfgFuncData{"set proxy env", func(cfg *config.CloudConfig) (*config.CloudConfig, error) {
|
|
|
|
network.SetProxyEnvironmentVariables(cfg)
|
|
|
|
return cfg, nil
|
2017-05-02 23:45:58 +00:00
|
|
|
}},
|
|
|
|
config.CfgFuncData{"init SELinux", initializeSelinux},
|
|
|
|
config.CfgFuncData{"setupSharedRoot", setupSharedRoot},
|
|
|
|
config.CfgFuncData{"sysinit", sysInit},
|
2015-02-09 04:38:37 +00:00
|
|
|
}
|
|
|
|
|
2017-05-02 23:45:58 +00:00
|
|
|
cfg, err := config.ChainCfgFuncs(nil, initFuncs)
|
2015-09-23 11:36:28 +00:00
|
|
|
if err != nil {
|
2015-02-09 04:38:37 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2015-09-23 11:36:28 +00:00
|
|
|
launchConfig, args := getLaunchConfig(cfg, &cfg.Rancher.SystemDocker)
|
2015-12-22 22:14:51 +00:00
|
|
|
launchConfig.Fork = !cfg.Rancher.SystemDocker.Exec
|
2017-07-12 13:58:38 +00:00
|
|
|
//launchConfig.NoLog = true
|
2015-07-29 07:51:49 +00:00
|
|
|
|
|
|
|
log.Info("Launching System Docker")
|
2016-11-28 08:06:00 +00:00
|
|
|
_, err = dfs.LaunchDocker(launchConfig, config.SystemDockerBin, args...)
|
2015-12-22 22:14:51 +00:00
|
|
|
if err != nil {
|
2017-07-12 13:58:38 +00:00
|
|
|
log.Errorf("Error Launching System Docker: %s", err)
|
2015-12-22 22:14:51 +00:00
|
|
|
return err
|
|
|
|
}
|
2017-07-12 13:58:38 +00:00
|
|
|
// Code never gets here - rancher.system_docker.exec=true
|
2017-07-12 04:18:02 +00:00
|
|
|
|
2015-12-22 22:14:51 +00:00
|
|
|
return pidOne()
|
2015-02-09 04:38:37 +00:00
|
|
|
}
|
2017-06-15 13:37:44 +00:00
|
|
|
|
2017-06-17 12:56:25 +00:00
|
|
|
func checkHypervisor(cfg *config.CloudConfig) string {
|
2017-07-11 08:03:38 +00:00
|
|
|
if cpuid.CPU.HypervisorName == "" {
|
2017-07-11 01:57:02 +00:00
|
|
|
log.Infof("ros init: No Detected Hypervisor")
|
|
|
|
} else {
|
|
|
|
log.Infof("ros init: Detected Hypervisor: %s", cpuid.CPU.HypervisorName)
|
2017-06-15 13:37:44 +00:00
|
|
|
}
|
2017-06-17 12:56:25 +00:00
|
|
|
return cpuid.CPU.HypervisorName
|
2017-06-15 13:37:44 +00:00
|
|
|
}
|
2017-07-11 08:03:38 +00:00
|
|
|
|
2017-07-12 13:58:38 +00:00
|
|
|
func enableHypervisorService(cfg *config.CloudConfig, hypervisorName string) {
|
2017-07-11 08:03:38 +00:00
|
|
|
if hypervisorName == "" {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if hypervisorName == "vmware" {
|
|
|
|
hypervisorName = "open"
|
|
|
|
}
|
|
|
|
serviceName := hypervisorName + "-vm-tools"
|
|
|
|
// check quickly to see if there is a yml file available
|
|
|
|
if service.ValidService(serviceName, cfg) {
|
|
|
|
log.Infof("Setting rancher.services_include. %s=true", serviceName)
|
|
|
|
if err := config.Set("rancher.services_include."+serviceName, "true"); err != nil {
|
|
|
|
log.Error(err)
|
|
|
|
}
|
|
|
|
} else {
|
2017-07-11 11:12:48 +00:00
|
|
|
log.Infof("Skipping %s, can't get %s.yml file", serviceName, serviceName)
|
2017-07-11 08:03:38 +00:00
|
|
|
}
|
|
|
|
}
|