mirror of
https://github.com/rancher/os.git
synced 2025-07-18 17:11:04 +00:00
Rebase on docker-from-scratch
This commit is contained in:
parent
889c80b682
commit
19f9a1b281
@ -9,15 +9,16 @@ import (
|
|||||||
const (
|
const (
|
||||||
CONSOLE_CONTAINER = "console"
|
CONSOLE_CONTAINER = "console"
|
||||||
DOCKER_BIN = "/usr/bin/docker"
|
DOCKER_BIN = "/usr/bin/docker"
|
||||||
|
ROS_BIN = "/usr/bin/ros"
|
||||||
|
SYSINIT_BIN = "/usr/bin/ros-sysinit"
|
||||||
DOCKER_SYSTEM_HOME = "/var/lib/system-docker"
|
DOCKER_SYSTEM_HOME = "/var/lib/system-docker"
|
||||||
DOCKER_SYSTEM_HOST = "unix:///var/run/system-docker.sock"
|
DOCKER_SYSTEM_HOST = "unix:///var/run/system-docker.sock"
|
||||||
DOCKER_HOST = "unix:///var/run/docker.sock"
|
DOCKER_HOST = "unix:///var/run/docker.sock"
|
||||||
IMAGES_PATH = "/"
|
IMAGES_PATH = "/usr/share/ros"
|
||||||
IMAGES_PATTERN = "images*.tar"
|
IMAGES_PATTERN = "images*.tar"
|
||||||
SYS_INIT = "/sbin/init-sys"
|
|
||||||
USER_INIT = "/sbin/init-user"
|
|
||||||
MODULES_ARCHIVE = "/modules.tar"
|
MODULES_ARCHIVE = "/modules.tar"
|
||||||
DEBUG = false
|
DEBUG = false
|
||||||
|
SYSTEM_DOCKER_LOG = "/var/log/system-docker.log"
|
||||||
|
|
||||||
LABEL = "label"
|
LABEL = "label"
|
||||||
HASH = "io.rancher.os.hash"
|
HASH = "io.rancher.os.hash"
|
||||||
|
@ -2,16 +2,17 @@ package init
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
log "github.com/Sirupsen/logrus"
|
log "github.com/Sirupsen/logrus"
|
||||||
|
"github.com/rancher/docker-from-scratch"
|
||||||
"github.com/rancherio/os/config"
|
"github.com/rancherio/os/config"
|
||||||
"github.com/rancherio/os/docker"
|
"github.com/rancherio/os/docker"
|
||||||
"github.com/rancherio/os/util"
|
"github.com/rancherio/os/util"
|
||||||
"github.com/rancherio/rancher-compose/librcompose/project"
|
"github.com/rancherio/rancher-compose/librcompose/project"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func autoformat(cfg *config.CloudConfig) error {
|
func autoformat(cfg *config.CloudConfig) error {
|
||||||
@ -31,20 +32,14 @@ func runBootstrapContainers(cfg *config.CloudConfig) error {
|
|||||||
return docker.RunServices("bootstrap", cfg, cfg.Rancher.BootstrapContainers)
|
return docker.RunServices("bootstrap", cfg, cfg.Rancher.BootstrapContainers)
|
||||||
}
|
}
|
||||||
|
|
||||||
func startDocker(cfg *config.CloudConfig) (chan interface{}, error) {
|
func startDocker(cfg *config.Config) (chan interface{}, error) {
|
||||||
for _, d := range []string{config.DOCKER_SYSTEM_HOST, "/var/run"} {
|
|
||||||
err := os.MkdirAll(d, 0700)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd := exec.Command(cfg.Rancher.BootstrapDocker.Args[0], cfg.Rancher.BootstrapDocker.Args[1:]...)
|
launchConfig, args := getLaunchConfig(cfg, &cfg.Rancher.BootstrapDocker)
|
||||||
if cfg.Rancher.Debug {
|
launchConfig.Fork = true
|
||||||
cmd.Stdout = os.Stdout
|
launchConfig.LogFile = ""
|
||||||
cmd.Stderr = os.Stderr
|
launchConfig.NoLog = true
|
||||||
}
|
|
||||||
err := cmd.Start()
|
cmd, err := dockerlaunch.LaunchDocker(launchConfig, config.DOCKER_BIN, args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
376
init/init.go
376
init/init.go
@ -3,203 +3,54 @@
|
|||||||
package init
|
package init
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
|
||||||
|
|
||||||
log "github.com/Sirupsen/logrus"
|
log "github.com/Sirupsen/logrus"
|
||||||
"github.com/rancherio/os/cmd/network"
|
"github.com/rancher/docker-from-scratch"
|
||||||
"github.com/rancherio/os/config"
|
"github.com/rancherio/os/config"
|
||||||
"github.com/rancherio/os/util"
|
"github.com/rancherio/os/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
STATE string = "/var"
|
STATE string = "/state"
|
||||||
SYSTEM_DOCKER string = "/usr/bin/system-docker"
|
|
||||||
DOCKER string = "/usr/bin/docker"
|
|
||||||
SYSINIT string = "/sbin/rancher-sysinit"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
dirs []string = []string{
|
mountConfig = dockerlaunch.Config{
|
||||||
"/etc/ssl/certs",
|
CgroupHierarchy: map[string]string{
|
||||||
"/sbin",
|
"cpu": "cpu",
|
||||||
"/usr/bin",
|
"cpuacct": "cpu",
|
||||||
"/usr/sbin",
|
"net_cls": "net_cls",
|
||||||
}
|
"net_prio": "net_cls",
|
||||||
postDirs []string = []string{
|
},
|
||||||
"/var/log",
|
|
||||||
"/var/lib/rancher/state/home",
|
|
||||||
"/var/lib/rancher/state/opt",
|
|
||||||
}
|
|
||||||
mounts [][]string = [][]string{
|
|
||||||
{"devtmpfs", "/dev", "devtmpfs", ""},
|
|
||||||
{"none", "/dev/pts", "devpts", ""},
|
|
||||||
{"none", "/etc/docker", "tmpfs", ""},
|
|
||||||
{"none", "/proc", "proc", ""},
|
|
||||||
{"none", "/run", "tmpfs", ""},
|
|
||||||
{"none", "/sys", "sysfs", ""},
|
|
||||||
{"none", "/sys/fs/cgroup", "tmpfs", ""},
|
|
||||||
}
|
|
||||||
postMounts [][]string = [][]string{
|
|
||||||
{"none", "/var/run", "tmpfs", ""},
|
|
||||||
}
|
|
||||||
cgroups []string = []string{
|
|
||||||
"blkio",
|
|
||||||
"cpu",
|
|
||||||
"cpuacct",
|
|
||||||
"cpuset",
|
|
||||||
"devices",
|
|
||||||
"freezer",
|
|
||||||
"memory",
|
|
||||||
"net_cls",
|
|
||||||
"perf_event",
|
|
||||||
}
|
|
||||||
// Notice this map is the reverse order of a "ln -s x y" command
|
|
||||||
// so map[y] = x
|
|
||||||
symlinks map[string]string = map[string]string{
|
|
||||||
"/etc/ssl/certs/ca-certificates.crt": "/ca.crt",
|
|
||||||
"/sbin/modprobe": "/busybox",
|
|
||||||
"/usr/sbin/iptables": "/xtables-multi",
|
|
||||||
DOCKER: "/docker",
|
|
||||||
SYSTEM_DOCKER: "/docker",
|
|
||||||
SYSINIT: "/init",
|
|
||||||
"/home": "/var/lib/rancher/state/home",
|
|
||||||
"/opt": "/var/lib/rancher/state/opt",
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func createSymlinks(cfg *config.CloudConfig, symlinks map[string]string) error {
|
func loadModules(cfg *config.Config) error {
|
||||||
log.Debug("Creating symlinking")
|
mounted := map[string]bool{}
|
||||||
for dest, src := range symlinks {
|
|
||||||
if _, err := os.Stat(dest); os.IsNotExist(err) {
|
|
||||||
log.Debugf("Symlinking %s => %s", src, dest)
|
|
||||||
if err = os.Symlink(src, dest); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
f, err := os.Open("/proc/modules")
|
||||||
}
|
|
||||||
|
|
||||||
func createDirs(dirs ...string) error {
|
|
||||||
for _, dir := range dirs {
|
|
||||||
if _, err := os.Stat(dir); os.IsNotExist(err) {
|
|
||||||
log.Debugf("Creating %s", dir)
|
|
||||||
err = os.MkdirAll(dir, 0755)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func createMounts(mounts ...[]string) error {
|
|
||||||
for _, mount := range mounts {
|
|
||||||
log.Debugf("Mounting %s %s %s %s", mount[0], mount[1], mount[2], mount[3])
|
|
||||||
err := util.Mount(mount[0], mount[1], mount[2], mount[3])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func remountRo(cfg *config.CloudConfig) error {
|
|
||||||
log.Info("Remouting root read only")
|
|
||||||
return util.Remount("/", "ro")
|
|
||||||
}
|
|
||||||
|
|
||||||
func mountCgroups(cfg *config.CloudConfig) error {
|
|
||||||
for _, cgroup := range cgroups {
|
|
||||||
err := createDirs("/sys/fs/cgroup/" + cgroup)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = createMounts([][]string{
|
|
||||||
{"none", "sys/fs/cgroup/" + cgroup, "cgroup", cgroup},
|
|
||||||
}...)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debug("Done mouting cgroupfs")
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func extractModules(cfg *config.CloudConfig) error {
|
|
||||||
if _, err := os.Stat(config.MODULES_ARCHIVE); os.IsNotExist(err) {
|
|
||||||
log.Debug("Modules do not exist")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debug("Extracting modules")
|
|
||||||
return util.ExtractTar(config.MODULES_ARCHIVE, "/")
|
|
||||||
}
|
|
||||||
|
|
||||||
func setResolvConf(cfg *config.CloudConfig) error {
|
|
||||||
log.Debug("Creating /etc/resolv.conf")
|
|
||||||
//f, err := os.OpenFile("/etc/resolv.conf", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
|
|
||||||
f, err := os.Create("/etc/resolv.conf")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
|
||||||
for _, dns := range cfg.Rancher.Network.Dns.Nameservers {
|
reader := bufio.NewScanner(f)
|
||||||
content := fmt.Sprintf("nameserver %s\n", dns)
|
for reader.Scan() {
|
||||||
if _, err = f.Write([]byte(content)); err != nil {
|
mounted[strings.SplitN(reader.Text(), " ", 2)[0]] = true
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
search := strings.Join(cfg.Rancher.Network.Dns.Search, " ")
|
for _, module := range cfg.Modules {
|
||||||
if search != "" {
|
if mounted[module] {
|
||||||
content := fmt.Sprintf("search %s\n", search)
|
continue
|
||||||
if _, err = f.Write([]byte(content)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg.Rancher.Network.Dns.Domain != "" {
|
|
||||||
content := fmt.Sprintf("domain %s\n", cfg.Rancher.Network.Dns.Domain)
|
|
||||||
if _, err = f.Write([]byte(content)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func loadModules(cfg *config.CloudConfig) error {
|
|
||||||
filesystems, err := ioutil.ReadFile("/proc/filesystems")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if !strings.Contains(string(filesystems), "nodev\toverlay\n") {
|
|
||||||
log.Debug("Loading overlay module")
|
|
||||||
err = exec.Command("/sbin/modprobe", "overlay").Run()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, module := range cfg.Rancher.Modules {
|
|
||||||
log.Debugf("Loading module %s", module)
|
log.Debugf("Loading module %s", module)
|
||||||
err = exec.Command("/sbin/modprobe", module).Run()
|
if err := exec.Command("modprobe", module).Run(); err != nil {
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Could not load module %s, err %v", module, err)
|
log.Errorf("Could not load module %s, err %v", module, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -207,18 +58,17 @@ func loadModules(cfg *config.CloudConfig) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func sysInit(cfg *config.CloudConfig) error {
|
func sysInit(cfg *config.Config) error {
|
||||||
args := append([]string{SYSINIT}, os.Args[1:]...)
|
args := append([]string{config.SYSINIT_BIN}, os.Args[1:]...)
|
||||||
|
|
||||||
|
cmd := &exec.Cmd{
|
||||||
|
Path: config.ROS_BIN,
|
||||||
|
Args: args,
|
||||||
|
}
|
||||||
|
|
||||||
var cmd *exec.Cmd
|
|
||||||
if util.IsRunningInTty() {
|
|
||||||
cmd = exec.Command(args[0], args[1:]...)
|
|
||||||
cmd.Stdin = os.Stdin
|
cmd.Stdin = os.Stdin
|
||||||
cmd.Stderr = os.Stderr
|
cmd.Stderr = os.Stderr
|
||||||
cmd.Stdout = os.Stdout
|
cmd.Stdout = os.Stdout
|
||||||
} else {
|
|
||||||
cmd = exec.Command(args[0], args[1:]...)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := cmd.Start(); err != nil {
|
if err := cmd.Start(); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -227,128 +77,88 @@ func sysInit(cfg *config.CloudConfig) error {
|
|||||||
return os.Stdin.Close()
|
return os.Stdin.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
func execDocker(cfg *config.CloudConfig) error {
|
|
||||||
log.Info("Launching System Docker")
|
|
||||||
if !cfg.Rancher.Debug {
|
|
||||||
output, err := os.Create("/var/log/system-docker.log")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
syscall.Dup2(int(output.Fd()), int(os.Stdout.Fd()))
|
|
||||||
syscall.Dup2(int(output.Fd()), int(os.Stderr.Fd()))
|
|
||||||
}
|
|
||||||
|
|
||||||
os.Stdin.Close()
|
|
||||||
return syscall.Exec(SYSTEM_DOCKER, cfg.Rancher.SystemDocker.Args, os.Environ())
|
|
||||||
}
|
|
||||||
|
|
||||||
func MainInit() {
|
func MainInit() {
|
||||||
if err := RunInit(); err != nil {
|
if err := RunInit(); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func mountStateTmpfs(cfg *config.CloudConfig) error {
|
func mountState(cfg *config.Config) error {
|
||||||
log.Debugf("State will not be persisted")
|
|
||||||
return util.Mount("none", STATE, "tmpfs", "")
|
|
||||||
}
|
|
||||||
|
|
||||||
func mountState(cfg *config.CloudConfig) error {
|
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
if cfg.Rancher.State.Dev != "" {
|
if cfg.State.Dev == "" {
|
||||||
dev := util.ResolveDevice(cfg.Rancher.State.Dev)
|
return nil
|
||||||
if dev == "" {
|
|
||||||
msg := fmt.Sprintf("Could not resolve device %q", cfg.Rancher.State.Dev)
|
|
||||||
log.Infof(msg)
|
|
||||||
return fmt.Errorf(msg)
|
|
||||||
}
|
}
|
||||||
log.Infof("Mounting state device %s to %s", dev, STATE)
|
|
||||||
|
|
||||||
fsType := cfg.Rancher.State.FsType
|
dev := util.ResolveDevice(cfg.State.Dev)
|
||||||
|
if dev == "" {
|
||||||
|
return fmt.Errorf("Could not resolve device %q", cfg.State.Dev)
|
||||||
|
}
|
||||||
|
fsType := cfg.State.FsType
|
||||||
if fsType == "auto" {
|
if fsType == "auto" {
|
||||||
fsType, err = util.GetFsType(dev)
|
fsType, err = util.GetFsType(dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err == nil {
|
|
||||||
log.Debugf("FsType has been set to %s", fsType)
|
|
||||||
err = util.Mount(dev, STATE, fsType, "")
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return mountStateTmpfs(cfg)
|
|
||||||
}
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func tryMountAndBootstrap(cfg *config.CloudConfig) error {
|
|
||||||
if err := mountState(cfg); err != nil {
|
|
||||||
if err := bootstrap(cfg); err != nil {
|
|
||||||
if cfg.Rancher.State.Required {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return mountStateTmpfs(cfg)
|
|
||||||
}
|
|
||||||
if err := mountState(cfg); err != nil {
|
|
||||||
if cfg.Rancher.State.Required {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return mountStateTmpfs(cfg)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func createGroups(cfg *config.CloudConfig) error {
|
|
||||||
return ioutil.WriteFile("/etc/group", []byte("root:x:0:\n"), 0644)
|
|
||||||
}
|
|
||||||
|
|
||||||
func touchSocket(cfg *config.CloudConfig) error {
|
|
||||||
for _, path := range []string{"/var/run/docker.sock", "/var/run/system-docker.sock"} {
|
|
||||||
if err := syscall.Unlink(path); err != nil && !os.IsNotExist(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err := ioutil.WriteFile(path, []byte{}, 0700)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
log.Debugf("FsType has been set to %s", fsType)
|
||||||
|
log.Infof("Mounting state device %s to %s", dev, STATE)
|
||||||
|
return util.Mount(dev, STATE, fsType, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
func setupSystemBridge(cfg *config.CloudConfig) error {
|
func tryMountState(cfg *config.Config) error {
|
||||||
bridge, cidr := cfg.Rancher.SystemDocker.BridgeConfig()
|
if mountState(cfg) == nil {
|
||||||
if bridge == "" {
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return network.ApplyNetworkConfigs(&config.NetworkConfig{
|
// If we failed to mount lets run bootstrap and try again
|
||||||
Interfaces: map[string]config.InterfaceConfig{
|
if err := bootstrap(cfg); err != nil {
|
||||||
bridge: {
|
return err
|
||||||
Bridge: true,
|
}
|
||||||
Address: cidr,
|
|
||||||
},
|
return mountState(cfg)
|
||||||
},
|
}
|
||||||
})
|
|
||||||
|
func tryMountAndBootstrap(cfg *config.Config) error {
|
||||||
|
if err := tryMountState(cfg); !cfg.State.Required && err != nil {
|
||||||
|
return nil
|
||||||
|
} else if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debugf("Switching to new root at %s", STATE)
|
||||||
|
return switchRoot(STATE)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getLaunchConfig(cfg *config.Config, dockerCfg *config.DockerConfig) (*dockerlaunch.Config, []string) {
|
||||||
|
var launchConfig dockerlaunch.Config
|
||||||
|
|
||||||
|
args := dockerlaunch.ParseConfig(&launchConfig, append(dockerCfg.Args, dockerCfg.ExtraArgs...)...)
|
||||||
|
|
||||||
|
launchConfig.DnsConfig.Nameservers = cfg.Network.Dns.Nameservers
|
||||||
|
launchConfig.DnsConfig.Search = cfg.Network.Dns.Search
|
||||||
|
|
||||||
|
if !cfg.Debug {
|
||||||
|
launchConfig.LogFile = config.SYSTEM_DOCKER_LOG
|
||||||
|
}
|
||||||
|
|
||||||
|
return &launchConfig, args
|
||||||
}
|
}
|
||||||
|
|
||||||
func RunInit() error {
|
func RunInit() error {
|
||||||
var cfg config.CloudConfig
|
var cfg config.Config
|
||||||
|
|
||||||
os.Setenv("PATH", "/sbin:/usr/sbin:/usr/bin")
|
os.Setenv("PATH", "/sbin:/usr/sbin:/usr/bin")
|
||||||
|
// Magic setting to tell Docker to do switch_root and not pivot_root
|
||||||
os.Setenv("DOCKER_RAMDISK", "true")
|
os.Setenv("DOCKER_RAMDISK", "true")
|
||||||
|
|
||||||
initFuncs := []config.InitFunc{
|
initFuncs := []config.InitFunc{
|
||||||
func(cfg *config.CloudConfig) error {
|
func(cfg *config.Config) error {
|
||||||
return createDirs(dirs...)
|
return dockerlaunch.PrepareFs(&mountConfig)
|
||||||
},
|
},
|
||||||
func(cfg *config.CloudConfig) error {
|
func(cfg *config.Config) error {
|
||||||
log.Info("Setting up mounts")
|
|
||||||
return createMounts(mounts...)
|
|
||||||
},
|
|
||||||
func(cfg *config.CloudConfig) error {
|
|
||||||
newCfg, err := config.LoadConfig()
|
newCfg, err := config.LoadConfig()
|
||||||
if err == nil {
|
if err == nil {
|
||||||
newCfg, err = config.LoadConfig()
|
newCfg, err = config.LoadConfig()
|
||||||
@ -357,37 +167,21 @@ func RunInit() error {
|
|||||||
*cfg = *newCfg
|
*cfg = *newCfg
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg.Rancher.Debug {
|
if cfg.Debug {
|
||||||
cfgString, _ := config.Dump(false, true)
|
cfgString, _ := config.Dump(false, true)
|
||||||
log.Debugf("os-config dump: \n%s", cfgString)
|
if cfgString != "" {
|
||||||
|
log.Debugf("Config: %s", cfgString)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return err
|
return err
|
||||||
},
|
},
|
||||||
mountCgroups,
|
|
||||||
func(cfg *config.CloudConfig) error {
|
|
||||||
return createSymlinks(cfg, symlinks)
|
|
||||||
},
|
|
||||||
createGroups,
|
|
||||||
extractModules,
|
|
||||||
loadModules,
|
loadModules,
|
||||||
setResolvConf,
|
|
||||||
setupSystemBridge,
|
|
||||||
tryMountAndBootstrap,
|
tryMountAndBootstrap,
|
||||||
func(cfg *config.CloudConfig) error {
|
func(cfg *config.Config) error {
|
||||||
return cfg.Reload()
|
return cfg.Reload()
|
||||||
},
|
},
|
||||||
loadModules,
|
loadModules,
|
||||||
setResolvConf,
|
|
||||||
func(cfg *config.CloudConfig) error {
|
|
||||||
return createDirs(postDirs...)
|
|
||||||
},
|
|
||||||
func(cfg *config.CloudConfig) error {
|
|
||||||
return createMounts(postMounts...)
|
|
||||||
},
|
|
||||||
touchSocket,
|
|
||||||
// Disable R/O root write now to support updating modules
|
|
||||||
//remountRo,
|
|
||||||
sysInit,
|
sysInit,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,5 +189,9 @@ func RunInit() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return execDocker(&cfg)
|
launchConfig, args := getLaunchConfig(&cfg, &cfg.SystemDocker)
|
||||||
|
|
||||||
|
log.Info("Launching System Docker")
|
||||||
|
_, err := dockerlaunch.LaunchDocker(launchConfig, config.DOCKER_BIN, args...)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
96
init/root.go
Normal file
96
init/root.go
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
package init
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
|
log "github.com/Sirupsen/logrus"
|
||||||
|
"github.com/docker/docker/pkg/archive"
|
||||||
|
"github.com/rancher/docker-from-scratch"
|
||||||
|
"github.com/rancherio/os/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
func prepareRoot(rootfs string) error {
|
||||||
|
usr := path.Join(rootfs, "usr")
|
||||||
|
if err := os.Remove(usr); err != nil && !os.IsNotExist(err) {
|
||||||
|
log.Errorf("Failed to delete %s, possibly invalid RancherOS state partition: %v", usr, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyMoveRoot(rootfs string) error {
|
||||||
|
usrVer := fmt.Sprintf("usr-%s", config.VERSION)
|
||||||
|
usr := path.Join(rootfs, usrVer)
|
||||||
|
|
||||||
|
if err := archive.CopyWithTar("/usr", usr); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := dockerlaunch.CreateSymlink(usrVer, path.Join(rootfs, "usr")); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
files, err := ioutil.ReadDir("/")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, file := range files {
|
||||||
|
filename := path.Join("/", file.Name())
|
||||||
|
|
||||||
|
if filename == rootfs {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debugf("Deleting %s", filename)
|
||||||
|
//if err := os.Remove(filename); err != nil {
|
||||||
|
if err := os.RemoveAll(filename); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func switchRoot(rootfs string) error {
|
||||||
|
for _, i := range []string{"/dev", "/sys", "/proc", "/run"} {
|
||||||
|
log.Debugf("Moving mount %s to %s", i, path.Join(rootfs, i))
|
||||||
|
if err := os.MkdirAll(path.Join(rootfs, i), 0755); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := syscall.Mount(i, path.Join(rootfs, i), "", syscall.MS_MOVE, ""); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := copyMoveRoot(rootfs); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := syscall.Chdir(rootfs); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := syscall.Mount(rootfs, "/", "", syscall.MS_MOVE, ""); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := syscall.Chroot("."); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := syscall.Chdir("/"); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debugf("Successfully moved to new root at %s", rootfs)
|
||||||
|
os.Setenv("DOCKER_RAMDISK", "false")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
3
main.go
3
main.go
@ -14,6 +14,7 @@ import (
|
|||||||
"github.com/rancherio/os/cmd/sysinit"
|
"github.com/rancherio/os/cmd/sysinit"
|
||||||
"github.com/rancherio/os/cmd/systemdocker"
|
"github.com/rancherio/os/cmd/systemdocker"
|
||||||
"github.com/rancherio/os/cmd/wait"
|
"github.com/rancherio/os/cmd/wait"
|
||||||
|
"github.com/rancherio/os/config"
|
||||||
osInit "github.com/rancherio/os/init"
|
osInit "github.com/rancherio/os/init"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -37,7 +38,7 @@ func registerCmd(cmd string, mainFunc func()) {
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
registerCmd("/init", osInit.MainInit)
|
registerCmd("/init", osInit.MainInit)
|
||||||
registerCmd(osInit.SYSINIT, sysinit.Main)
|
registerCmd(config.SYSINIT_BIN, sysinit.Main)
|
||||||
registerCmd("/usr/bin/system-docker", systemdocker.Main)
|
registerCmd("/usr/bin/system-docker", systemdocker.Main)
|
||||||
registerCmd("/sbin/poweroff", power.PowerOff)
|
registerCmd("/sbin/poweroff", power.PowerOff)
|
||||||
registerCmd("/sbin/reboot", power.Reboot)
|
registerCmd("/sbin/reboot", power.Reboot)
|
||||||
|
@ -38,8 +38,8 @@ rancher:
|
|||||||
- /lib/modules:/lib/modules
|
- /lib/modules:/lib/modules
|
||||||
- /lib/firmware:/lib/firmware
|
- /lib/firmware:/lib/firmware
|
||||||
bootstrap_docker:
|
bootstrap_docker:
|
||||||
args: [docker, -d, -s, overlay, -b, none, --restart=false, -g, /var/lib/system-docker,
|
args: [-d, -s, overlay, -b, none, --restart=false, -g, /var/lib/system-docker,
|
||||||
-G, root, -H, 'unix:///var/run/system-docker.sock']
|
-G, root, -H, 'unix:///var/run/system-docker.sock', --userland-proxy=false]
|
||||||
cloud_init:
|
cloud_init:
|
||||||
datasources:
|
datasources:
|
||||||
- configdrive:/media/config-2
|
- configdrive:/media/config-2
|
||||||
@ -90,6 +90,7 @@ rancher:
|
|||||||
io.rancher.os.reloadconfig: true
|
io.rancher.os.reloadconfig: true
|
||||||
io.rancher.os.scope: system
|
io.rancher.os.scope: system
|
||||||
links:
|
links:
|
||||||
|
- preload-user-images
|
||||||
- cloud-init-pre
|
- cloud-init-pre
|
||||||
- network
|
- network
|
||||||
net: host
|
net: host
|
||||||
@ -124,17 +125,17 @@ rancher:
|
|||||||
privileged: true
|
privileged: true
|
||||||
read_only: true
|
read_only: true
|
||||||
volumes:
|
volumes:
|
||||||
- /init:/sbin/halt:ro
|
- /usr/bin/ros:/sbin/halt:ro
|
||||||
- /init:/sbin/poweroff:ro
|
- /usr/bin/ros:/sbin/poweroff:ro
|
||||||
- /init:/sbin/reboot:ro
|
- /usr/bin/ros:/sbin/reboot:ro
|
||||||
- /init:/sbin/shutdown:ro
|
- /usr/bin/ros:/sbin/shutdown:ro
|
||||||
- /init:/sbin/netconf:ro
|
- /usr/bin/ros:/sbin/netconf:ro
|
||||||
- /init:/usr/bin/cloud-init:ro
|
- /usr/bin/ros:/usr/bin/cloud-init:ro
|
||||||
- /init:/usr/bin/rancherctl:ro
|
- /usr/bin/ros:/usr/bin/rancherctl:ro
|
||||||
- /init:/usr/bin/ros:ro
|
- /usr/bin/ros:/usr/bin/ros:ro
|
||||||
- /init:/usr/bin/respawn:ro
|
- /usr/bin/ros:/usr/bin/respawn:ro
|
||||||
- /init:/usr/bin/system-docker:ro
|
- /usr/bin/ros:/usr/bin/system-docker:ro
|
||||||
- /init:/usr/sbin/wait-for-docker:ro
|
- /usr/bin/ros:/usr/sbin/wait-for-docker:ro
|
||||||
- /lib/modules:/lib/modules
|
- /lib/modules:/lib/modules
|
||||||
- /usr/bin/docker:/usr/bin/docker:ro
|
- /usr/bin/docker:/usr/bin/docker:ro
|
||||||
console:
|
console:
|
||||||
@ -144,7 +145,6 @@ rancher:
|
|||||||
io.rancher.os.scope: system
|
io.rancher.os.scope: system
|
||||||
links:
|
links:
|
||||||
- cloud-init
|
- cloud-init
|
||||||
- dockerwait # because console runs `loud-init -execute`, which may need docker
|
|
||||||
net: host
|
net: host
|
||||||
uts: host
|
uts: host
|
||||||
pid: host
|
pid: host
|
||||||
@ -158,7 +158,6 @@ rancher:
|
|||||||
labels:
|
labels:
|
||||||
io.rancher.os.scope: system
|
io.rancher.os.scope: system
|
||||||
links:
|
links:
|
||||||
- cloud-init
|
|
||||||
- network
|
- network
|
||||||
net: host
|
net: host
|
||||||
uts: host
|
uts: host
|
||||||
@ -298,7 +297,7 @@ rancher:
|
|||||||
- /home:/home
|
- /home:/home
|
||||||
- /opt:/opt
|
- /opt:/opt
|
||||||
system_docker:
|
system_docker:
|
||||||
args: [docker, -d, --log-driver, syslog, -s, overlay, -b, docker-sys, --fixed-cidr,
|
args: [docker, -d, -s, overlay, -b, docker-sys, --fixed-cidr,
|
||||||
172.18.42.1/16, --restart=false, -g, /var/lib/system-docker, -G, root,
|
172.18.42.1/16, --restart=false, -g, /var/lib/system-docker, -G, root,
|
||||||
-H, 'unix:///var/run/system-docker.sock', --userland-proxy=false]
|
-H, 'unix:///var/run/system-docker.sock', --userland-proxy=false]
|
||||||
upgrade:
|
upgrade:
|
||||||
|
@ -64,10 +64,15 @@ if [ ! -d ${INITRD_TMP} ]; then
|
|||||||
popd
|
popd
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ -e ${INITRD_CURRENT} ]; then
|
||||||
|
rm -f ${INITRD_CURRENT}
|
||||||
|
fi
|
||||||
|
|
||||||
ln -sf ${INITRD_TMP} ${INITRD_CURRENT}
|
ln -sf ${INITRD_TMP} ${INITRD_CURRENT}
|
||||||
|
|
||||||
cp bin/rancheros ${INITRD_TMP}/init
|
mkdir -p ${INITRD_TMP}/usr/{bin,share/ros}
|
||||||
cp -f os-config.yml ${INITRD_TMP}/
|
cp bin/rancheros ${INITRD_TMP}/usr/bin/ros
|
||||||
|
cp -f os-config.yml ${INITRD_TMP}/usr/share/ros
|
||||||
cd ${INITRD_TMP}
|
cd ${INITRD_TMP}
|
||||||
|
|
||||||
find . | cpio -H newc -o > ${INITRD_TEST}
|
find . | cpio -H newc -o > ${INITRD_TEST}
|
||||||
|
Loading…
Reference in New Issue
Block a user