mirror of
https://github.com/rancher/os.git
synced 2025-07-30 22:24:33 +00:00
Add tty and half way broken state handling
This commit is contained in:
parent
3ab1f76ef0
commit
925a847ccc
@ -41,7 +41,6 @@ type Config struct {
|
||||
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"`
|
||||
}
|
||||
@ -71,17 +70,16 @@ func LoadConfig() (*Config, error) {
|
||||
func NewConfig() *Config {
|
||||
return &Config{
|
||||
ConsoleContainer: "console",
|
||||
DockerBin: "/usr/bin/docker",
|
||||
Debug: true,
|
||||
DockerEndpoint: "unix:/var/run/docker.sock",
|
||||
Dns: []string{
|
||||
"8.8.8.8",
|
||||
"8.8.4.4",
|
||||
},
|
||||
ImagesPath: "/",
|
||||
ImagesPattern: "images*.tar",
|
||||
StateRequired: false,
|
||||
//StateDev: "/dev/sda",
|
||||
ImagesPath: "/",
|
||||
ImagesPattern: "images*.tar",
|
||||
StateRequired: false,
|
||||
StateDev: "/dev/sda",
|
||||
StateDevFSType: "ext4",
|
||||
SysInit: "/sbin/init-sys",
|
||||
SystemDockerArgs: []string{"docker", "-d", "-s", "overlay", "-b", "none"},
|
||||
@ -122,6 +120,7 @@ func NewConfig() *Config {
|
||||
"--name", "userdocker",
|
||||
"-d",
|
||||
"--restart", "always",
|
||||
"--pid", "host",
|
||||
"--net", "host",
|
||||
"--privileged",
|
||||
"--volume", "/lib/modules:/lib/modules:ro",
|
||||
@ -136,16 +135,15 @@ func NewConfig() *Config {
|
||||
"-d",
|
||||
"--rm",
|
||||
"--privileged",
|
||||
"--volume", "/:/host:ro",
|
||||
//"--volume", "/:/host:ro",
|
||||
"--volume", "/lib/modules:/lib/modules: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", "/var/run/docker.sock:/var/run/system-docker.sock:ro",
|
||||
"--volumes-from", "system-state",
|
||||
"--net", "host",
|
||||
"--pid", "host",
|
||||
"-it",
|
||||
"console",
|
||||
},
|
||||
},
|
||||
@ -153,15 +151,17 @@ func NewConfig() *Config {
|
||||
RescueContainer: ContainerConfig{
|
||||
Cmd: []string{
|
||||
"--name", "rescue",
|
||||
"-d",
|
||||
"--rm",
|
||||
"--privileged",
|
||||
"--volume", "/:/host",
|
||||
//"--volume", "/:/host",
|
||||
"--volume", "/lib/modules:/lib/modules: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",
|
||||
"--pid", "host",
|
||||
"-it",
|
||||
"rescue",
|
||||
},
|
||||
},
|
||||
|
@ -142,6 +142,10 @@ func (c *Container) Start() *Container {
|
||||
return c.start(false)
|
||||
}
|
||||
|
||||
func (c *Container) StartAndWait() *Container {
|
||||
return c.start(true)
|
||||
}
|
||||
|
||||
func (c *Container) Stage() *Container {
|
||||
c.Parse()
|
||||
|
||||
|
65
init/init.go
65
init/init.go
@ -5,7 +5,6 @@ import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
@ -16,23 +15,16 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
STATE string = "/var"
|
||||
STATE string = "/var"
|
||||
DOCKER string = "/usr/bin/docker"
|
||||
)
|
||||
|
||||
var (
|
||||
dirs []string = []string{
|
||||
"/bin",
|
||||
"/dev",
|
||||
"/dev/pts",
|
||||
"/etc/ssl/certs",
|
||||
"/proc",
|
||||
"/sbin",
|
||||
"/sys",
|
||||
"/usr/bin",
|
||||
"/var/run",
|
||||
}
|
||||
statedirs []string = []string{
|
||||
"/var/run",
|
||||
"/var",
|
||||
}
|
||||
mounts [][]string = [][]string{
|
||||
[]string{"none", "/etc/docker", "tmpfs", ""},
|
||||
@ -41,7 +33,7 @@ var (
|
||||
[]string{"none", "/sys", "sysfs", ""},
|
||||
[]string{"none", "/sys/fs/cgroup", "tmpfs", ""},
|
||||
[]string{"none", "/dev/pts", "devpts", ""},
|
||||
[]string{"none", "/var/run", "tmpfs", ""},
|
||||
[]string{"none", "/run", "tmpfs", ""},
|
||||
}
|
||||
cgroups []string = []string{
|
||||
"perf_event",
|
||||
@ -58,17 +50,16 @@ var (
|
||||
// so map[y] = x
|
||||
symlinks map[string]string = map[string]string{
|
||||
"/etc/ssl/certs/ca-certificates.crt": "/ca.crt",
|
||||
"/bin/busybox": "/busybox",
|
||||
"/sbin/init-sys": "/init",
|
||||
"/sbin/init-user": "/init",
|
||||
"/sbin/modprobe": "/bin/busybox",
|
||||
"/usr/bin/docker": "/docker",
|
||||
"/usr/bin/openvt": "/busybox",
|
||||
"/usr/bin/system-docker": "/init",
|
||||
"/sbin/modprobe": "/busybox",
|
||||
"/var/run": "/run",
|
||||
DOCKER: "/docker",
|
||||
}
|
||||
)
|
||||
|
||||
func createSymlinks(cfg *config.Config) error {
|
||||
log.Debug("Creating symlinking")
|
||||
for dest, src := range symlinks {
|
||||
if _, err := os.Stat(dest); os.IsNotExist(err) {
|
||||
log.Debugf("Symlinking %s => %s", src, dest)
|
||||
@ -196,7 +187,6 @@ func sysInit(cfg *config.Config) error {
|
||||
cmd.Stderr = os.Stderr
|
||||
cmd.Stdout = os.Stdout
|
||||
} else {
|
||||
args = append([]string{"openvt", "-s"}, args...)
|
||||
cmd = exec.Command(args[0], args[1:]...)
|
||||
}
|
||||
|
||||
@ -209,8 +199,10 @@ func sysInit(cfg *config.Config) error {
|
||||
|
||||
func execDocker(cfg *config.Config) error {
|
||||
log.Info("Launching Docker")
|
||||
os.Stdin.Close()
|
||||
return syscall.Exec(cfg.DockerBin, cfg.SystemDockerArgs, os.Environ())
|
||||
//os.Stdin.Close()
|
||||
//os.Stdout.Close()
|
||||
//os.Stderr.Close()
|
||||
return syscall.Exec(DOCKER, cfg.SystemDockerArgs, os.Environ())
|
||||
}
|
||||
|
||||
func MainInit() {
|
||||
@ -225,21 +217,21 @@ func mountState(cfg *config.Config) error {
|
||||
log.Debugf("State will not be persisted")
|
||||
err = util.Mount("none", STATE, "tmpfs", "")
|
||||
} 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, "")
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
//if err != nil {
|
||||
return err
|
||||
//}
|
||||
|
||||
for _, i := range []string{"docker", "images"} {
|
||||
dir := path.Join(STATE, i)
|
||||
err = os.MkdirAll(dir, 0755)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
//for _, i := range []string{"docker", "images"} {
|
||||
// dir := path.Join(STATE, i)
|
||||
// err = os.MkdirAll(dir, 0755)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
//}
|
||||
|
||||
//log.Debugf("Bind mounting %s to %s", path.Join(STATE, "docker"), DOCKER)
|
||||
//err = util.Mount(path.Join(STATE, "docker"), DOCKER, "", "bind")
|
||||
@ -271,9 +263,7 @@ func RunInit() error {
|
||||
func(cfg *config.Config) error {
|
||||
newCfg, err := config.LoadConfig()
|
||||
if err == nil {
|
||||
if newCfg.Debug {
|
||||
newCfg, err = config.LoadConfig()
|
||||
}
|
||||
newCfg, err = config.LoadConfig()
|
||||
}
|
||||
if err == nil {
|
||||
*cfg = *newCfg
|
||||
@ -285,16 +275,13 @@ func RunInit() error {
|
||||
|
||||
return err
|
||||
},
|
||||
createSymlinks,
|
||||
setResolvConf,
|
||||
extractModules,
|
||||
remountRo,
|
||||
mountCgroups,
|
||||
loadModules,
|
||||
mountState,
|
||||
func(cfg *config.Config) error {
|
||||
return createDirs(statedirs...)
|
||||
},
|
||||
createSymlinks,
|
||||
remountRo,
|
||||
sysInit,
|
||||
}
|
||||
|
||||
|
@ -37,6 +37,7 @@ func execute(line string, wait sync.WaitGroup) {
|
||||
cmd := exec.Command(args[0], args[1:]...)
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
cmd.Stdin = os.Stdin
|
||||
|
||||
err := cmd.Start()
|
||||
if err != nil {
|
||||
|
@ -13,6 +13,15 @@ mkdir -p ${BUILD} ${DIST}
|
||||
|
||||
busybox_install()
|
||||
{
|
||||
local conf=$1
|
||||
local bbconf=$2
|
||||
local target=$3
|
||||
|
||||
if [ "$#" = "2" ]; then
|
||||
target=$2
|
||||
bbconf=
|
||||
fi
|
||||
|
||||
apt-get update
|
||||
apt-get install -y build-essential wget libncurses5-dev unzip bc
|
||||
|
||||
@ -22,11 +31,14 @@ busybox_install()
|
||||
tar xvjf ${ARTIFACTS}/${BUILDROOT}
|
||||
cd ${BUILDROOT/.tar.bz2//}
|
||||
|
||||
cp $1 .config
|
||||
cp $conf .config
|
||||
if [ -n "$bbconf" ]; then
|
||||
cp $bbconf package/busybox/
|
||||
fi
|
||||
make oldconfig
|
||||
make
|
||||
|
||||
cp output/images/rootfs.tar $2
|
||||
cp output/images/rootfs.tar $target
|
||||
}
|
||||
|
||||
write_base()
|
||||
@ -74,6 +86,10 @@ run()
|
||||
echo -e "\nCOPY $1 /source/$1" >> ${DOCKER_FILE}
|
||||
echo -e "RUN /source/$1" >> ${DOCKER_FILE}
|
||||
fi
|
||||
|
||||
if [ "$RUN_EXEC" = "true" ]; then
|
||||
$1
|
||||
fi
|
||||
}
|
||||
|
||||
finish()
|
||||
|
@ -10,7 +10,7 @@ mkdir -p ${BUILD}/initrd ${DIST}/artifacts
|
||||
echo Extracting ${ARTIFACTS}/os-base.tar.xz
|
||||
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
|
||||
cp -rf ${BUILD}/dist/kernel/lib ${BUILD}/initrd
|
||||
|
@ -1,6 +1,9 @@
|
||||
#!/bin/sh
|
||||
|
||||
exec respawn << EOF
|
||||
#if [ -t 1 ]; then
|
||||
#exec /bin/sh
|
||||
#else
|
||||
exec respawn << EOF
|
||||
/sbin/getty 115200 tty1
|
||||
/sbin/getty 115200 tty2
|
||||
/sbin/getty 115200 tty3
|
||||
@ -8,3 +11,4 @@ exec respawn << EOF
|
||||
/sbin/getty 115200 tty5
|
||||
/sbin/getty 115200 tty6
|
||||
EOF
|
||||
#fi
|
||||
|
@ -4,5 +4,5 @@ cd $(dirname $0)/..
|
||||
|
||||
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
|
||||
|
@ -4,6 +4,7 @@ import (
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
"syscall"
|
||||
|
||||
log "github.com/Sirupsen/logrus"
|
||||
dockerClient "github.com/fsouza/go-dockerclient"
|
||||
@ -121,16 +122,28 @@ func runContainers(cfg *config.Config) error {
|
||||
}
|
||||
|
||||
for _, containerConfig := range containerConfigs {
|
||||
container := docker.NewContainer(cfg, &containerConfig)
|
||||
container.Parse()
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
if err != nil {
|
||||
log.Errorf("Failed to run %v: %v", containerConfig.Id, err)
|
||||
if container.Err != nil {
|
||||
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 {
|
||||
if !util.IsRunningInTty() {
|
||||
return nil
|
||||
}
|
||||
|
||||
log.Debugf("Attaching to console")
|
||||
cmd := exec.Command("docker", "attach", "console")
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stdin = os.Stdin
|
||||
@ -170,6 +187,10 @@ func sysInit() error {
|
||||
initFuncs := []config.InitFunc{
|
||||
loadImages,
|
||||
runContainers,
|
||||
func(cfg *config.Config) error {
|
||||
syscall.Sync()
|
||||
return nil
|
||||
},
|
||||
//launchConsole,
|
||||
}
|
||||
|
||||
|
@ -1,14 +1,7 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"github.com/kless/term"
|
||||
|
||||
log "github.com/Sirupsen/logrus"
|
||||
)
|
||||
import "github.com/kless/term"
|
||||
|
||||
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)
|
||||
}
|
||||
|
@ -105,8 +105,8 @@ func Contains(values []string, value string) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
for _, value := range values {
|
||||
if value == value {
|
||||
for _, i := range values {
|
||||
if i == value {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user