mirror of
https://github.com/rancher/os.git
synced 2025-09-16 23:21:19 +00:00
add kexec previous
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
This commit is contained in:
@@ -538,16 +538,15 @@ func layDownOS(image, installType, cloudConfig, device, partition, statedir, kap
|
|||||||
install.PvGrubConfig(menu)
|
install.PvGrubConfig(menu)
|
||||||
}
|
}
|
||||||
log.Debugf("installRancher")
|
log.Debugf("installRancher")
|
||||||
currentCfg, err := installRancher(baseName, VERSION, DIST, kernelArgs+" "+kappend)
|
_, err := installRancher(baseName, VERSION, DIST, kernelArgs+" "+kappend)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("%s", err)
|
log.Errorf("%s", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
log.Debugf("installRancher done")
|
log.Debugf("installRancher done")
|
||||||
|
|
||||||
// Used by upgrade
|
|
||||||
if kexec {
|
if kexec {
|
||||||
power.Kexec(currentCfg, kernelArgs+" "+kappend)
|
power.Kexec(false, filepath.Join(baseName, install.BootDir), kernelArgs+" "+kappend)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@@ -13,6 +13,7 @@ import (
|
|||||||
"github.com/docker/engine-api/types"
|
"github.com/docker/engine-api/types"
|
||||||
"github.com/docker/engine-api/types/container"
|
"github.com/docker/engine-api/types/container"
|
||||||
"github.com/docker/engine-api/types/filters"
|
"github.com/docker/engine-api/types/filters"
|
||||||
|
"github.com/rancher/os/cmd/control/install"
|
||||||
"github.com/rancher/os/log"
|
"github.com/rancher/os/log"
|
||||||
|
|
||||||
"github.com/rancher/os/docker"
|
"github.com/rancher/os/docker"
|
||||||
@@ -108,10 +109,31 @@ func reboot(name string, force bool, code uint) {
|
|||||||
log.Fatalf("%s: Need to be root", os.Args[0])
|
log.Fatalf("%s: Need to be root", os.Args[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// reboot -f should work even when system-docker is having problems
|
||||||
if !force {
|
if !force {
|
||||||
|
if kexecFlag || previouskexecFlag || kexecAppendFlag != "" {
|
||||||
|
// pass through the cmdline args
|
||||||
|
name = ""
|
||||||
|
}
|
||||||
if err := runDocker(name); err != nil {
|
if err := runDocker(name); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if kexecFlag || previouskexecFlag || kexecAppendFlag != "" {
|
||||||
|
// need to mount boot dir, or `system-docker run -v /:/host -w /host/boot` ?
|
||||||
|
baseName := "/mnt/new_img"
|
||||||
|
_, _, err := install.MountDevice(baseName, "", "", false)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("ERROR: can't Kexec: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer util.Unmount(baseName)
|
||||||
|
Kexec(previouskexecFlag, filepath.Join(baseName, install.BootDir), kexecAppendFlag)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !force {
|
||||||
err := shutDownContainers()
|
err := shutDownContainers()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
|
@@ -11,7 +11,6 @@ import (
|
|||||||
"github.com/rancher/os/cmd/control/install"
|
"github.com/rancher/os/cmd/control/install"
|
||||||
"github.com/rancher/os/config"
|
"github.com/rancher/os/config"
|
||||||
"github.com/rancher/os/log"
|
"github.com/rancher/os/log"
|
||||||
"github.com/rancher/os/util"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -20,6 +19,8 @@ var (
|
|||||||
rebootFlag bool
|
rebootFlag bool
|
||||||
forceFlag bool
|
forceFlag bool
|
||||||
kexecFlag bool
|
kexecFlag bool
|
||||||
|
previouskexecFlag bool
|
||||||
|
kexecAppendFlag string
|
||||||
)
|
)
|
||||||
|
|
||||||
func Shutdown() {
|
func Shutdown() {
|
||||||
@@ -114,9 +115,19 @@ func Shutdown() {
|
|||||||
// OR? maybe implement it as a `kexec` cli tool?
|
// OR? maybe implement it as a `kexec` cli tool?
|
||||||
app.Flags = append(app.Flags, cli.BoolFlag{
|
app.Flags = append(app.Flags, cli.BoolFlag{
|
||||||
Name: "kexec",
|
Name: "kexec",
|
||||||
Usage: "kexec the default kernel",
|
Usage: "kexec the default RancherOS cfg",
|
||||||
Destination: &kexecFlag,
|
Destination: &kexecFlag,
|
||||||
})
|
})
|
||||||
|
app.Flags = append(app.Flags, cli.BoolFlag{
|
||||||
|
Name: "kexec-previous",
|
||||||
|
Usage: "kexec the previous RancherOS cfg",
|
||||||
|
Destination: &previouskexecFlag,
|
||||||
|
})
|
||||||
|
app.Flags = append(app.Flags, cli.StringFlag{
|
||||||
|
Name: "kexec-append",
|
||||||
|
Usage: "kexec using the specified kernel boot params (ignores global.cfg)",
|
||||||
|
Destination: &kexecAppendFlag,
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
app.Flags = append(app.Flags, cli.BoolFlag{
|
app.Flags = append(app.Flags, cli.BoolFlag{
|
||||||
Name: "r, reboot",
|
Name: "r, reboot",
|
||||||
@@ -128,8 +139,12 @@ func Shutdown() {
|
|||||||
app.Run(os.Args)
|
app.Run(os.Args)
|
||||||
}
|
}
|
||||||
|
|
||||||
func Kexec(bootDir, append string) error {
|
func Kexec(previous bool, bootDir, append string) error {
|
||||||
cfgFile := filepath.Join(bootDir, "linux-current.cfg")
|
cfg := "linux-current.cfg"
|
||||||
|
if previous {
|
||||||
|
cfg = "linux-previous.cfg"
|
||||||
|
}
|
||||||
|
cfgFile := filepath.Join(bootDir, cfg)
|
||||||
vmlinuzFile, initrdFile, err := install.ReadSyslinuxCfg(cfgFile)
|
vmlinuzFile, initrdFile, err := install.ReadSyslinuxCfg(cfgFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("%s", err)
|
log.Errorf("%s", err)
|
||||||
@@ -149,7 +164,7 @@ func Kexec(bootDir, append string) error {
|
|||||||
"kexec",
|
"kexec",
|
||||||
"-l", vmlinuzFile,
|
"-l", vmlinuzFile,
|
||||||
"--initrd", initrdFile,
|
"--initrd", initrdFile,
|
||||||
"--append", "'"+append+"'",
|
"--append", append,
|
||||||
"-f")
|
"-f")
|
||||||
log.Debugf("Run(%#v)", cmd)
|
log.Debugf("Run(%#v)", cmd)
|
||||||
cmd.Stderr = os.Stderr
|
cmd.Stderr = os.Stderr
|
||||||
@@ -168,21 +183,6 @@ func Reboot() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func shutdown(c *cli.Context) error {
|
func shutdown(c *cli.Context) error {
|
||||||
if kexecFlag {
|
|
||||||
if os.Geteuid() != 0 {
|
|
||||||
log.Fatalf("%s: Need to be root", os.Args[0])
|
|
||||||
}
|
|
||||||
|
|
||||||
// need to mount boot dir, or `system-docker run -v /:/host -w /host/boot` ?
|
|
||||||
baseName := "/mnt/new_img"
|
|
||||||
_, _, err := install.MountDevice(baseName, "", "", false)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("ERROR: can't Kexec: %s", err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
defer util.Unmount(baseName)
|
|
||||||
return Kexec(filepath.Join(baseName, install.BootDir), "")
|
|
||||||
}
|
|
||||||
// the shutdown command's default is poweroff
|
// the shutdown command's default is poweroff
|
||||||
var powerCmd uint
|
var powerCmd uint
|
||||||
powerCmd = syscall.LINUX_REBOOT_CMD_POWER_OFF
|
powerCmd = syscall.LINUX_REBOOT_CMD_POWER_OFF
|
||||||
|
@@ -64,6 +64,7 @@ func LoadConfigWithPrefix(dirPrefix string) *CloudConfig {
|
|||||||
cfg := &CloudConfig{}
|
cfg := &CloudConfig{}
|
||||||
if err := util.Convert(rawCfg, cfg); err != nil {
|
if err := util.Convert(rawCfg, cfg); err != nil {
|
||||||
log.Errorf("Failed to parse configuration: %s", err)
|
log.Errorf("Failed to parse configuration: %s", err)
|
||||||
|
log.Debugf("Bad cfg:\n%v\n", rawCfg)
|
||||||
return &CloudConfig{}
|
return &CloudConfig{}
|
||||||
}
|
}
|
||||||
cfg = amendNils(cfg)
|
cfg = amendNils(cfg)
|
||||||
|
Reference in New Issue
Block a user