diff --git a/config/config.go b/config/config.go index a8dab6fa..0ecf17ed 100644 --- a/config/config.go +++ b/config/config.go @@ -12,6 +12,19 @@ import ( "github.com/rancherio/os/util" ) +const ( + CONSOLE_CONTAINER = "console" + DOCKER_BIN = "/usr/bin/docker" + DOCKER_SYSTEM_HOST = "unix:///var/run/system-docker.sock" + DOCKER_HOST = "unix:///var/run/docker.sock" + IMAGES_PATH = "/" + IMAGES_PATTERN = "images*.tar" + SYS_INIT = "/sbin/init-sys" + USER_INIT = "/sbin/init-user" + MODULES_ARCHIVE = "/modules.tar" + DEBUG = true +) + type InitFunc func(*Config) error type ContainerConfig struct { @@ -23,27 +36,23 @@ type ContainerConfig struct { type Config struct { //BootstrapContainers []ContainerConfig `json:"bootstrapContainers,omitempty"` + //UserContainers []ContainerConfig `json:"userContainser,omitempty"` ConsoleContainer string `json:"consoleContainer,omitempty"` Debug bool `json:"debug,omitempty"` Disable []string `json:"disable,omitempty"` - DockerEndpoint string `json:"dockerEndpoint,omitempty"` Dns []string `json:"dns,omitempty"` - ImagesPath string `json:"ImagesPath,omitempty"` - ImagesPattern string `json:"ImagesPattern,omitempty"` - ModulesArchive string `json:"modulesArchive,omitempty"` Rescue bool `json:"rescue,omitempty"` RescueContainer ContainerConfig `json:"rescueContainer,omitempty"` - StateDevFSType string `json:"stateDevFsType,omitempty"` - StateDev string `json:"stateDev,omitempty"` - StateRequired bool `json:"stateRequired,omitempty"` - SysInit string `json:"sysInit,omitempty"` + State ConfigState `json:"state,omitempty"` SystemContainers []ContainerConfig `json:"systemContainers,omitempty"` SystemDockerArgs []string `json:"systemDockerArgs,omitempty"` - UserContainers []ContainerConfig `json:"userContainser,omitempty"` - UserInit string `json:"userInit,omitempty"` - DockerBin string `json:"dockerBin,omitempty"` Modules []string `json:"modules,omitempty"` - Respawn []string `json:"respawn,omitempty"` +} + +type ConfigState struct { + FsType string `json:"fsType,omitempty"` + Dev string `json:"dev,omitempty"` + Required bool `json:"required,omitempty"` } func (c *Config) Dump() string { diff --git a/config/default.go b/config/default.go index 29912e01..bb0910e6 100644 --- a/config/default.go +++ b/config/default.go @@ -2,24 +2,18 @@ package config func NewConfig() *Config { return &Config{ - ConsoleContainer: "console", - DockerBin: "/usr/bin/docker", - Debug: true, - DockerEndpoint: "unix:/var/run/docker.sock", + Debug: DEBUG, Dns: []string{ "8.8.8.8", "8.8.4.4", }, - ImagesPath: "/", - ImagesPattern: "images*.tar", - StateRequired: false, - StateDev: "LABEL=RANCHER_STATE", - StateDevFSType: "auto", - SysInit: "/sbin/init-sys", + State: ConfigState{ + Required: false, + Dev: "LABEL=RANCHER_STATE", + FsType: "auto", + }, SystemDockerArgs: []string{"docker", "-d", "-s", "overlay", "-b", "none"}, - UserInit: "/sbin/init-user", Modules: []string{}, - ModulesArchive: "/modules.tar", SystemContainers: []ContainerConfig{ { Cmd: []string{ diff --git a/docker/client.go b/docker/client.go index ef078859..5bcc3e46 100644 --- a/docker/client.go +++ b/docker/client.go @@ -12,11 +12,15 @@ const ( INTERVAL = 100 ) -func NewClient(cfg *config.Config) (*dockerClient.Client, error) { - endpoint := "unix:///var/run/docker.sock" - if cfg != nil { - endpoint = cfg.DockerEndpoint - } +func NewSystemClient() (*dockerClient.Client, error) { + return NewClient(config.DOCKER_SYSTEM_HOST) +} + +func NewDefaultClient() (*dockerClient.Client, error) { + return NewClient(config.DOCKER_HOST) +} + +func NewClient(endpoint string) (*dockerClient.Client, error) { client, err := dockerClient.NewClient(endpoint) if err != nil { return nil, err diff --git a/docker/container.go b/docker/container.go index e8583221..7b61e796 100644 --- a/docker/container.go +++ b/docker/container.go @@ -28,7 +28,7 @@ type Container struct { detach bool Config *runconfig.Config HostConfig *runconfig.HostConfig - cfg *config.Config + dockerHost string container *dockerClient.Container containerCfg *config.ContainerConfig } @@ -47,16 +47,17 @@ func getHash(containerCfg *config.ContainerConfig) (string, error) { return hex.EncodeToString(hash.Sum([]byte{})), nil } -func StartAndWait(cfg *config.Config, containerCfg *config.ContainerConfig) error { - container := NewContainer(cfg, containerCfg).start(true) +func StartAndWait(dockerHost string, containerCfg *config.ContainerConfig) error { + container := NewContainer(dockerHost, containerCfg).start(true) return container.Err } -func NewContainer(cfg *config.Config, containerCfg *config.ContainerConfig) *Container { - return &Container{ - cfg: cfg, +func NewContainer(dockerHost string, containerCfg *config.ContainerConfig) *Container { + c := &Container{ + dockerHost: dockerHost, containerCfg: containerCfg, } + return c.Parse() } func (c *Container) returnErr(err error) *Container { @@ -76,7 +77,7 @@ func (c *Container) Lookup() *Container { return c.returnErr(err) } - client, err := NewClient(c.cfg) + client, err := NewClient(c.dockerHost) if err != nil { return c.returnErr(err) } @@ -153,7 +154,7 @@ func (c *Container) Stage() *Container { return c } - client, err := NewClient(c.cfg) + client, err := NewClient(c.dockerHost) if err != nil { c.Err = err return c @@ -185,7 +186,7 @@ func (c *Container) Delete() *Container { return c } - client, err := NewClient(c.cfg) + client, err := NewClient(c.dockerHost) if err != nil { return c.returnErr(err) } @@ -235,7 +236,7 @@ func (c *Container) start(wait bool) *Container { return c.returnErr(err) } - client, err := NewClient(c.cfg) + client, err := NewClient(c.dockerHost) if err != nil { return c.returnErr(err) } diff --git a/init/init.go b/init/init.go index f52d82b8..4b44e65b 100644 --- a/init/init.go +++ b/init/init.go @@ -7,7 +7,6 @@ import ( "os/exec" "strings" "syscall" - "time" log "github.com/Sirupsen/logrus" "github.com/rancherio/os/config" @@ -123,13 +122,13 @@ func mountCgroups(cfg *config.Config) error { } func extractModules(cfg *config.Config) error { - if _, err := os.Stat(cfg.ModulesArchive); os.IsNotExist(err) { + 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(cfg.ModulesArchive, "/") + return util.ExtractTar(config.MODULES_ARCHIVE, "/") } func setResolvConf(cfg *config.Config) error { @@ -214,62 +213,37 @@ func MainInit() { func mountState(cfg *config.Config) error { var err error - dev := util.ResolveDevice(cfg.StateDev) - log.Debugf("Mounting state device %s", dev) + if cfg.State.Dev != "" { + dev := util.ResolveDevice(cfg.State.Dev) + log.Debugf("Mounting state device %s to %s", dev, STATE) - fsType := cfg.StateDevFSType - log.Debugf("FsType has been set to %s", fsType) - if fsType == "auto" { - actualFsType, fsErr := util.GetFsType(dev) - if fsErr != nil { - return fsErr + fsType := cfg.State.FsType + if fsType == "auto" { + fsType, err = util.GetFsType(dev) } - fsType = actualFsType - } - err = util.Mount(dev, STATE, fsType, "") - if err != nil { - if cfg.StateRequired { - return err - } else { - log.Debugf("State will not be persisted") - err = util.Mount("none", STATE, "tmpfs", "") - if err != nil { - return err - } + if err == nil { + log.Debugf("FsType has been set to %s", fsType) + err = util.Mount(dev, STATE, fsType, "") } } - if err != nil { + if err != nil && cfg.State.Required { return err } - //for _, i := range []string{"docker", "images"} { - // dir := path.Join(STATE, i) - // err = os.MkdirAll(dir, 0755) - // if err != nil { - // return err - // } - //} + if err != nil || cfg.State.Dev == "" { + log.Debugf("State will not be persisted") + err = util.Mount("none", STATE, "tmpfs", "") + } - //log.Debugf("Bind mounting %s to %s", path.Join(STATE, "docker"), DOCKER) - //err = util.Mount(path.Join(STATE, "docker"), DOCKER, "", "bind") - //if err != nil && cfg.StateRequired { - // return err - //} - - return nil -} - -func pause(cfg *config.Config) error { - time.Sleep(5 + time.Minute) - return nil + return err } func RunInit() error { var cfg config.Config - os.Setenv("PATH", "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin") + os.Setenv("PATH", "/sbin:/usr/bin") os.Setenv("DOCKER_RAMDISK", "true") initFuncs := []config.InitFunc{ diff --git a/scripts/build-common b/scripts/build-common index f12f45f0..e0ee07c4 100644 --- a/scripts/build-common +++ b/scripts/build-common @@ -131,6 +131,7 @@ download() local hash=$1 if ! check $hash $file; then + echo Downloading $url to $file curl -sL $url > $file fi diff --git a/scripts/dockerimages/05-console b/scripts/dockerimages/05-console index 8f37affb..2137dc50 100644 --- a/scripts/dockerimages/05-console +++ b/scripts/dockerimages/05-console @@ -1,4 +1,6 @@ FROM base RUN rm /sbin/poweroff /sbin/reboot /sbin/halt +RUN sed -i '/^root/s!/bin/sh!/bin/bash!' /etc/passwd +RUN echo -e 'RancherOS\n' > /etc/issue COPY scripts/dockerimages/scripts/console.sh / CMD ["/console.sh"] diff --git a/scripts/run b/scripts/run index 67fa7724..6b95a0df 100755 --- a/scripts/run +++ b/scripts/run @@ -41,6 +41,6 @@ else zcat ${HD_GZ} > ${HD} fi - qemu-system-x86_64 -kernel ${KERNEL} -initrd ${INITRD_TEST} -m 1024 -net nic,vlan=0,model=virtio -net user,vlan=0,hostfwd=tcp::2222-:22,hostname=rancher -drive if=virtio,file=${HD} -machine accel=kvm -cpu host -smp 4 -append "x $@" + qemu-system-x86_64 -serial stdio -kernel ${KERNEL} -initrd ${INITRD_TEST} -m 1024 -net nic,vlan=0,model=virtio -net user,vlan=0,hostfwd=tcp::2222-:22,hostname=rancher -drive if=virtio,file=${HD} -machine accel=kvm -cpu host -smp 4 -append "console=ttyS0 $@" fi diff --git a/sysinit/sysinit.go b/sysinit/sysinit.go index 03671877..cafdc902 100644 --- a/sysinit/sysinit.go +++ b/sysinit/sysinit.go @@ -47,11 +47,11 @@ func hasImage(name string) bool { } func findImages(cfg *config.Config) ([]string, error) { - log.Debugf("Looking for images at %s", cfg.ImagesPath) + log.Debugf("Looking for images at %s", config.IMAGES_PATH) result := []string{} - dir, err := os.Open(cfg.ImagesPath) + dir, err := os.Open(config.IMAGES_PATH) if os.IsNotExist(err) { log.Debugf("Not loading images, %s does not exist") return result, nil @@ -68,7 +68,7 @@ func findImages(cfg *config.Config) ([]string, error) { } for _, fileName := range files { - if ok, _ := path.Match(cfg.ImagesPattern, fileName); ok { + if ok, _ := path.Match(config.IMAGES_PATTERN, fileName); ok { log.Debugf("Found %s", fileName) result = append(result, fileName) } @@ -83,7 +83,7 @@ func loadImages(cfg *config.Config) error { return err } - client, err := docker.NewClient(cfg) + client, err := docker.NewDefaultClient() if err != nil { return err } @@ -93,7 +93,7 @@ func loadImages(cfg *config.Config) error { continue } - inputFileName := path.Join(cfg.ImagesPath, image) + inputFileName := path.Join(config.IMAGES_PATH, image) input, err := os.Open(inputFileName) if err != nil { return err @@ -122,7 +122,7 @@ func runContainers(cfg *config.Config) error { } for _, containerConfig := range containerConfigs { - container := docker.NewContainer(cfg, &containerConfig) + container := docker.NewContainer(config.DOCKER_HOST, &containerConfig) container.Parse() if util.Contains(cfg.Disable, containerConfig.Id) {