1
0
mirror of https://github.com/rancher/os.git synced 2025-08-09 10:38:25 +00:00

Add tty and half way broken state handling

This commit is contained in:
Darren Shepherd 2015-02-16 16:38:49 -07:00
parent 3ab1f76ef0
commit 925a847ccc
11 changed files with 96 additions and 70 deletions

View File

@ -41,7 +41,6 @@ type Config struct {
SystemDockerArgs []string `json:"systemDockerArgs,omitempty"` SystemDockerArgs []string `json:"systemDockerArgs,omitempty"`
UserContainers []ContainerConfig `json:"userContainser,omitempty"` UserContainers []ContainerConfig `json:"userContainser,omitempty"`
UserInit string `json:"userInit,omitempty"` UserInit string `json:"userInit,omitempty"`
DockerBin string `json:"dockerBin,omitempty"`
Modules []string `json:"modules,omitempty"` Modules []string `json:"modules,omitempty"`
Respawn []string `json:"respawn,omitempty"` Respawn []string `json:"respawn,omitempty"`
} }
@ -71,17 +70,16 @@ func LoadConfig() (*Config, error) {
func NewConfig() *Config { func NewConfig() *Config {
return &Config{ return &Config{
ConsoleContainer: "console", ConsoleContainer: "console",
DockerBin: "/usr/bin/docker",
Debug: true, Debug: true,
DockerEndpoint: "unix:/var/run/docker.sock", DockerEndpoint: "unix:/var/run/docker.sock",
Dns: []string{ Dns: []string{
"8.8.8.8", "8.8.8.8",
"8.8.4.4", "8.8.4.4",
}, },
ImagesPath: "/", ImagesPath: "/",
ImagesPattern: "images*.tar", ImagesPattern: "images*.tar",
StateRequired: false, StateRequired: false,
//StateDev: "/dev/sda", StateDev: "/dev/sda",
StateDevFSType: "ext4", StateDevFSType: "ext4",
SysInit: "/sbin/init-sys", SysInit: "/sbin/init-sys",
SystemDockerArgs: []string{"docker", "-d", "-s", "overlay", "-b", "none"}, SystemDockerArgs: []string{"docker", "-d", "-s", "overlay", "-b", "none"},
@ -122,6 +120,7 @@ func NewConfig() *Config {
"--name", "userdocker", "--name", "userdocker",
"-d", "-d",
"--restart", "always", "--restart", "always",
"--pid", "host",
"--net", "host", "--net", "host",
"--privileged", "--privileged",
"--volume", "/lib/modules:/lib/modules:ro", "--volume", "/lib/modules:/lib/modules:ro",
@ -136,16 +135,15 @@ func NewConfig() *Config {
"-d", "-d",
"--rm", "--rm",
"--privileged", "--privileged",
"--volume", "/:/host:ro", //"--volume", "/:/host:ro",
"--volume", "/lib/modules:/lib/modules:ro", "--volume", "/lib/modules:/lib/modules:ro",
"--volume", "/usr/bin/docker:/usr/bin/docker:ro", "--volume", "/usr/bin/docker:/usr/bin/docker:ro",
"--volume", "/usr/bin/system-docker:/usr/bin/system-docker:ro", "--volume", "/init:/usr/bin/system-docker:ro",
"--volume", "/init:/usr/bin/respawn:ro", "--volume", "/init:/usr/bin/respawn:ro",
"--volume", "/var/run/docker.sock:/var/run/system-docker.sock:ro", "--volume", "/var/run/docker.sock:/var/run/system-docker.sock:ro",
"--volumes-from", "system-state", "--volumes-from", "system-state",
"--net", "host", "--net", "host",
"--pid", "host", "--pid", "host",
"-it",
"console", "console",
}, },
}, },
@ -153,15 +151,17 @@ func NewConfig() *Config {
RescueContainer: ContainerConfig{ RescueContainer: ContainerConfig{
Cmd: []string{ Cmd: []string{
"--name", "rescue", "--name", "rescue",
"-d",
"--rm", "--rm",
"--privileged", "--privileged",
"--volume", "/:/host", //"--volume", "/:/host",
"--volume", "/lib/modules:/lib/modules:ro", "--volume", "/lib/modules:/lib/modules:ro",
"--volume", "/usr/bin/docker:/usr/bin/docker:ro", "--volume", "/usr/bin/docker:/usr/bin/docker:ro",
"--volume", "/var/run/docker.sock:/var/run/docker.sock:ro", "--volume", "/init:/usr/bin/system-docker:ro",
"--volume", "/init:/usr/bin/respawn:ro",
"--volume", "/var/run/docker.sock:/var/run/system-docker.sock:ro",
"--net", "host", "--net", "host",
"--pid", "host", "--pid", "host",
"-it",
"rescue", "rescue",
}, },
}, },

View File

@ -142,6 +142,10 @@ func (c *Container) Start() *Container {
return c.start(false) return c.start(false)
} }
func (c *Container) StartAndWait() *Container {
return c.start(true)
}
func (c *Container) Stage() *Container { func (c *Container) Stage() *Container {
c.Parse() c.Parse()

View File

@ -5,7 +5,6 @@ import (
"io/ioutil" "io/ioutil"
"os" "os"
"os/exec" "os/exec"
"path"
"strings" "strings"
"syscall" "syscall"
"time" "time"
@ -16,23 +15,16 @@ import (
) )
const ( const (
STATE string = "/var" STATE string = "/var"
DOCKER string = "/usr/bin/docker"
) )
var ( var (
dirs []string = []string{ dirs []string = []string{
"/bin",
"/dev",
"/dev/pts",
"/etc/ssl/certs", "/etc/ssl/certs",
"/proc",
"/sbin", "/sbin",
"/sys",
"/usr/bin", "/usr/bin",
"/var/run", "/var",
}
statedirs []string = []string{
"/var/run",
} }
mounts [][]string = [][]string{ mounts [][]string = [][]string{
[]string{"none", "/etc/docker", "tmpfs", ""}, []string{"none", "/etc/docker", "tmpfs", ""},
@ -41,7 +33,7 @@ var (
[]string{"none", "/sys", "sysfs", ""}, []string{"none", "/sys", "sysfs", ""},
[]string{"none", "/sys/fs/cgroup", "tmpfs", ""}, []string{"none", "/sys/fs/cgroup", "tmpfs", ""},
[]string{"none", "/dev/pts", "devpts", ""}, []string{"none", "/dev/pts", "devpts", ""},
[]string{"none", "/var/run", "tmpfs", ""}, []string{"none", "/run", "tmpfs", ""},
} }
cgroups []string = []string{ cgroups []string = []string{
"perf_event", "perf_event",
@ -58,17 +50,16 @@ var (
// so map[y] = x // so map[y] = x
symlinks map[string]string = map[string]string{ symlinks map[string]string = map[string]string{
"/etc/ssl/certs/ca-certificates.crt": "/ca.crt", "/etc/ssl/certs/ca-certificates.crt": "/ca.crt",
"/bin/busybox": "/busybox",
"/sbin/init-sys": "/init", "/sbin/init-sys": "/init",
"/sbin/init-user": "/init", "/sbin/init-user": "/init",
"/sbin/modprobe": "/bin/busybox", "/sbin/modprobe": "/busybox",
"/usr/bin/docker": "/docker", "/var/run": "/run",
"/usr/bin/openvt": "/busybox", DOCKER: "/docker",
"/usr/bin/system-docker": "/init",
} }
) )
func createSymlinks(cfg *config.Config) error { func createSymlinks(cfg *config.Config) error {
log.Debug("Creating symlinking")
for dest, src := range symlinks { for dest, src := range symlinks {
if _, err := os.Stat(dest); os.IsNotExist(err) { if _, err := os.Stat(dest); os.IsNotExist(err) {
log.Debugf("Symlinking %s => %s", src, dest) log.Debugf("Symlinking %s => %s", src, dest)
@ -196,7 +187,6 @@ func sysInit(cfg *config.Config) error {
cmd.Stderr = os.Stderr cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout cmd.Stdout = os.Stdout
} else { } else {
args = append([]string{"openvt", "-s"}, args...)
cmd = exec.Command(args[0], args[1:]...) cmd = exec.Command(args[0], args[1:]...)
} }
@ -209,8 +199,10 @@ func sysInit(cfg *config.Config) error {
func execDocker(cfg *config.Config) error { func execDocker(cfg *config.Config) error {
log.Info("Launching Docker") log.Info("Launching Docker")
os.Stdin.Close() //os.Stdin.Close()
return syscall.Exec(cfg.DockerBin, cfg.SystemDockerArgs, os.Environ()) //os.Stdout.Close()
//os.Stderr.Close()
return syscall.Exec(DOCKER, cfg.SystemDockerArgs, os.Environ())
} }
func MainInit() { func MainInit() {
@ -225,21 +217,21 @@ func mountState(cfg *config.Config) error {
log.Debugf("State will not be persisted") log.Debugf("State will not be persisted")
err = util.Mount("none", STATE, "tmpfs", "") err = util.Mount("none", STATE, "tmpfs", "")
} else { } else {
log.Debugf("Mounting state device %s", cfg.StateDev) log.Debugf("Mounting state device %s to %s", cfg.StateDev, STATE)
err = util.Mount(cfg.StateDev, STATE, cfg.StateDevFSType, "") err = util.Mount(cfg.StateDev, STATE, cfg.StateDevFSType, "")
} }
if err != nil { //if err != nil {
return err return err
} //}
for _, i := range []string{"docker", "images"} { //for _, i := range []string{"docker", "images"} {
dir := path.Join(STATE, i) // dir := path.Join(STATE, i)
err = os.MkdirAll(dir, 0755) // err = os.MkdirAll(dir, 0755)
if err != nil { // if err != nil {
return err // return err
} // }
} //}
//log.Debugf("Bind mounting %s to %s", path.Join(STATE, "docker"), DOCKER) //log.Debugf("Bind mounting %s to %s", path.Join(STATE, "docker"), DOCKER)
//err = util.Mount(path.Join(STATE, "docker"), DOCKER, "", "bind") //err = util.Mount(path.Join(STATE, "docker"), DOCKER, "", "bind")
@ -271,9 +263,7 @@ func RunInit() error {
func(cfg *config.Config) error { func(cfg *config.Config) error {
newCfg, err := config.LoadConfig() newCfg, err := config.LoadConfig()
if err == nil { if err == nil {
if newCfg.Debug { newCfg, err = config.LoadConfig()
newCfg, err = config.LoadConfig()
}
} }
if err == nil { if err == nil {
*cfg = *newCfg *cfg = *newCfg
@ -285,16 +275,13 @@ func RunInit() error {
return err return err
}, },
createSymlinks,
setResolvConf, setResolvConf,
extractModules, extractModules,
remountRo,
mountCgroups, mountCgroups,
loadModules, loadModules,
mountState, mountState,
func(cfg *config.Config) error { createSymlinks,
return createDirs(statedirs...) remountRo,
},
sysInit, sysInit,
} }

View File

@ -37,6 +37,7 @@ func execute(line string, wait sync.WaitGroup) {
cmd := exec.Command(args[0], args[1:]...) cmd := exec.Command(args[0], args[1:]...)
cmd.Stdout = os.Stdout cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr cmd.Stderr = os.Stderr
cmd.Stdin = os.Stdin
err := cmd.Start() err := cmd.Start()
if err != nil { if err != nil {

View File

@ -13,6 +13,15 @@ mkdir -p ${BUILD} ${DIST}
busybox_install() busybox_install()
{ {
local conf=$1
local bbconf=$2
local target=$3
if [ "$#" = "2" ]; then
target=$2
bbconf=
fi
apt-get update apt-get update
apt-get install -y build-essential wget libncurses5-dev unzip bc apt-get install -y build-essential wget libncurses5-dev unzip bc
@ -22,11 +31,14 @@ busybox_install()
tar xvjf ${ARTIFACTS}/${BUILDROOT} tar xvjf ${ARTIFACTS}/${BUILDROOT}
cd ${BUILDROOT/.tar.bz2//} cd ${BUILDROOT/.tar.bz2//}
cp $1 .config cp $conf .config
if [ -n "$bbconf" ]; then
cp $bbconf package/busybox/
fi
make oldconfig make oldconfig
make make
cp output/images/rootfs.tar $2 cp output/images/rootfs.tar $target
} }
write_base() write_base()
@ -74,6 +86,10 @@ run()
echo -e "\nCOPY $1 /source/$1" >> ${DOCKER_FILE} echo -e "\nCOPY $1 /source/$1" >> ${DOCKER_FILE}
echo -e "RUN /source/$1" >> ${DOCKER_FILE} echo -e "RUN /source/$1" >> ${DOCKER_FILE}
fi fi
if [ "$RUN_EXEC" = "true" ]; then
$1
fi
} }
finish() finish()

View File

@ -10,7 +10,7 @@ mkdir -p ${BUILD}/initrd ${DIST}/artifacts
echo Extracting ${ARTIFACTS}/os-base.tar.xz echo Extracting ${ARTIFACTS}/os-base.tar.xz
tar xJf ${ARTIFACTS}/os-base.tar.xz -C ${BUILD} tar xJf ${ARTIFACTS}/os-base.tar.xz -C ${BUILD}
cp /etc/ssl/certs/ca-certificates.crt ${BUILD}/ca.crt cp /etc/ssl/certs/ca-certificates.crt ${BUILD}/initrd/ca.crt
rm -rf ${BUILD}/initrd/lib rm -rf ${BUILD}/initrd/lib
cp -rf ${BUILD}/dist/kernel/lib ${BUILD}/initrd cp -rf ${BUILD}/dist/kernel/lib ${BUILD}/initrd

View File

@ -1,6 +1,9 @@
#!/bin/sh #!/bin/sh
exec respawn << EOF #if [ -t 1 ]; then
#exec /bin/sh
#else
exec respawn << EOF
/sbin/getty 115200 tty1 /sbin/getty 115200 tty1
/sbin/getty 115200 tty2 /sbin/getty 115200 tty2
/sbin/getty 115200 tty3 /sbin/getty 115200 tty3
@ -8,3 +11,4 @@ exec respawn << EOF
/sbin/getty 115200 tty5 /sbin/getty 115200 tty5
/sbin/getty 115200 tty6 /sbin/getty 115200 tty6
EOF EOF
#fi

View File

@ -4,5 +4,5 @@ cd $(dirname $0)/..
source scripts/build-common source scripts/build-common
download a8e5925eab10a472af4b9326dc3ff1068fd56886 https://github.com/rancherio/os-base/releases/download/v0.0.1/os-base.tar.xz download 71d4f44964a23418715274729dce30f79f1914c5 https://github.com/rancherio/os-base/releases/download/v0.0.3/os-base.tar.xz
download 1acbe869b32869bca5788373e8624a2957cbb380 https://github.com/ibuildthecloud/docker/releases/download/v1.5.0-rancher-2/docker-1.5.0 download 1acbe869b32869bca5788373e8624a2957cbb380 https://github.com/ibuildthecloud/docker/releases/download/v1.5.0-rancher-2/docker-1.5.0

View File

@ -4,6 +4,7 @@ import (
"os" "os"
"os/exec" "os/exec"
"path" "path"
"syscall"
log "github.com/Sirupsen/logrus" log "github.com/Sirupsen/logrus"
dockerClient "github.com/fsouza/go-dockerclient" dockerClient "github.com/fsouza/go-dockerclient"
@ -121,16 +122,28 @@ func runContainers(cfg *config.Config) error {
} }
for _, containerConfig := range containerConfigs { for _, containerConfig := range containerConfigs {
container := docker.NewContainer(cfg, &containerConfig)
container.Parse()
if util.Contains(cfg.Disable, containerConfig.Id) { if util.Contains(cfg.Disable, containerConfig.Id) {
log.Debugf("%s is disabled", containerConfig.Id) log.Debugf("%s is disabled : %v", containerConfig.Id, cfg.Disable)
continue continue
} }
err := docker.StartAndWait(cfg, &containerConfig) if containerConfig.Id == cfg.ConsoleContainer {
if util.IsRunningInTty() {
container.Config.Tty = true
container.Config.AttachStdin = true
container.Config.AttachStdout = true
container.Config.AttachStderr = true
}
}
container.StartAndWait()
log.Debugf("Running %s", containerConfig.Id) log.Debugf("Running %s", containerConfig.Id)
if err != nil { if container.Err != nil {
log.Errorf("Failed to run %v: %v", containerConfig.Id, err) log.Errorf("Failed to run %v: %v", containerConfig.Id, container.Err)
} }
} }
@ -138,7 +151,11 @@ func runContainers(cfg *config.Config) error {
} }
func launchConsole(cfg *config.Config) error { func launchConsole(cfg *config.Config) error {
if !util.IsRunningInTty() {
return nil
}
log.Debugf("Attaching to console")
cmd := exec.Command("docker", "attach", "console") cmd := exec.Command("docker", "attach", "console")
cmd.Stdout = os.Stdout cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin cmd.Stdin = os.Stdin
@ -170,6 +187,10 @@ func sysInit() error {
initFuncs := []config.InitFunc{ initFuncs := []config.InitFunc{
loadImages, loadImages,
runContainers, runContainers,
func(cfg *config.Config) error {
syscall.Sync()
return nil
},
//launchConsole, //launchConsole,
} }

View File

@ -1,14 +1,7 @@
package util package util
import ( import "github.com/kless/term"
"github.com/kless/term"
log "github.com/Sirupsen/logrus"
)
func IsRunningInTty() bool { func IsRunningInTty() bool {
log.Infof("Is a tty : %v", term.IsTerminal(0))
log.Infof("Is a tty : %v", term.IsTerminal(1))
log.Infof("Is a tty : %v", term.IsTerminal(2))
return term.IsTerminal(1) return term.IsTerminal(1)
} }

View File

@ -105,8 +105,8 @@ func Contains(values []string, value string) bool {
return false return false
} }
for _, value := range values { for _, i := range values {
if value == value { if i == value {
return true return true
} }
} }