1
0
mirror of https://github.com/rancher/os.git synced 2025-08-01 23:17:50 +00:00

Fixes for packet.net raid based upgrades

Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
This commit is contained in:
Sven Dowideit 2017-01-27 14:27:48 +00:00
parent 0d889ef9a8
commit 35afccefdf

View File

@ -470,7 +470,7 @@ func layDownOS(image, installType, cloudConfig, device, kappend string, kexec bo
if err != nil {
return err
}
installSyslinuxRaid(baseName, bootDir, diskType)
installSyslinux(device, baseName, bootDir, diskType)
case "bootstrap":
CONSOLE = "ttyS0"
var err error
@ -487,6 +487,7 @@ func layDownOS(image, installType, cloudConfig, device, kappend string, kexec bo
if err != nil {
return err
}
log.Infof("upgrading - %s, %s, %s, %s", device, baseName, bootDir, diskType)
// TODO: detect pv-grub, and don't kill it with syslinux
upgradeBootloader(device, baseName, bootDir, diskType)
default:
@ -716,8 +717,7 @@ func formatdevice(device, partition string) error {
}
func mountdevice(baseName, bootDir, partition string, raw bool) (string, string, error) {
log.Debugf("mountdevice %s, raw %v", partition, raw)
device := ""
log.Infof("mountdevice %s, raw %v", partition, raw)
if raw {
log.Debugf("util.Mount (raw) %s, %s", partition, baseName)
@ -725,6 +725,7 @@ func mountdevice(baseName, bootDir, partition string, raw bool) (string, string,
cmd := exec.Command("lsblk", "-no", "pkname", partition)
log.Debugf("Run(%v)", cmd)
cmd.Stderr = os.Stderr
device := ""
if out, err := cmd.Output(); err == nil {
device = "/dev/" + strings.TrimSpace(string(out))
}
@ -749,6 +750,7 @@ func mountdevice(baseName, bootDir, partition string, raw bool) (string, string,
partition = strings.TrimSpace(string(out))
}
}
device := ""
cmd = exec.Command("lsblk", "-no", "pkname", partition)
log.Debugf("Run(%v)", cmd)
cmd.Stderr = os.Stderr
@ -825,25 +827,21 @@ func upgradeBootloader(device, baseName, bootDir, diskType string) error {
// TODO: in v0.9.0, need to detect what version syslinux we have
return nil
}
if err := setBootable(device, diskType); err != nil {
log.Debugf("setBootable(%s, %s): %s", device, diskType, err)
//return err
}
if err := os.Rename(grubDir, filepath.Join(baseName, bootDir+"grub_backup")); err != nil {
log.Debugf("Rename(%s): %s", grubDir, err)
log.Errorf("Rename(%s): %s", grubDir, err)
return err
}
syslinuxDir := filepath.Join(baseName, bootDir+"syslinux")
backupSyslinuxDir := filepath.Join(baseName, bootDir+"syslinux_backup")
if err := os.Rename(syslinuxDir, backupSyslinuxDir); err != nil {
log.Debugf("Rename(%s, %s): %s", syslinuxDir, backupSyslinuxDir, err)
log.Errorf("Rename(%s, %s): %s", syslinuxDir, backupSyslinuxDir, err)
return err
}
//mv the old syslinux into linux-previous.cfg
oldSyslinux, err := ioutil.ReadFile(filepath.Join(backupSyslinuxDir, "syslinux.cfg"))
if err != nil {
log.Debugf("read(%s / syslinux.cfg): %s", backupSyslinuxDir, err)
log.Errorf("read(%s / syslinux.cfg): %s", backupSyslinuxDir, err)
return err
}
@ -854,16 +852,25 @@ func upgradeBootloader(device, baseName, bootDir, diskType string) error {
// LINUX ../vmlinuz-v0.7.1-rancheros
// APPEND rancher.state.dev=LABEL=RANCHER_STATE rancher.state.wait console=tty0 rancher.password=rancher
// INITRD ../initrd-v0.7.1-rancheros
cfg = strings.Replace(cfg, "current", "previous", -1)
cfg = strings.Replace(cfg, "../", "/boot/", -1)
// TODO consider removing the APPEND line - as the global.cfg should have the same result
ioutil.WriteFile(filepath.Join(baseName, bootDir, "linux-current.cfg"), []byte(cfg), 0644)
lines := strings.Split(cfg, "\n")
for _, line := range lines {
line = strings.TrimSpace(line)
if strings.HasPrefix(line, "APPEND") {
// TODO: need to append any extra's the user specified
ioutil.WriteFile(filepath.Join(baseName, bootDir, "global.cfg"), []byte(cfg), 0644)
break
}
}
return installSyslinux(device, baseName, bootDir, diskType)
}
func installSyslinux(device, baseName, bootDir, diskType string) error {
log.Debugf("installSyslinux")
mbrFile := "mbr.bin"
if diskType == "gpt" {
@ -873,12 +880,43 @@ func installSyslinux(device, baseName, bootDir, diskType string) error {
//dd bs=440 count=1 if=/usr/lib/syslinux/mbr/mbr.bin of=${device}
// ubuntu: /usr/lib/syslinux/mbr/mbr.bin
// alpine: /usr/share/syslinux/mbr.bin
cmd := exec.Command("dd", "bs=440", "count=1", "if=/usr/share/syslinux/"+mbrFile, "of="+device)
//cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
log.Debugf("Run(%v)", cmd)
if err := cmd.Run(); err != nil {
log.Errorf("dd: %s", err)
return err
if device == "/dev/" {
log.Infof("installSyslinuxRaid(%s)", device)
//RAID - assume sda&sdb
//TODO: fix this - not sure how to detect what disks should have mbr - perhaps we need a param
// perhaps just assume and use the devices that make up the raid - mdadm
device = "/dev/sda"
if err := setBootable(device, diskType); err != nil {
log.Errorf("setBootable(%s, %s): %s", device, diskType, err)
//return err
}
cmd := exec.Command("dd", "bs=440", "count=1", "if=/usr/share/syslinux/"+mbrFile, "of="+device)
if err := cmd.Run(); err != nil {
log.Errorf("%s", err)
return err
}
device = "/dev/sdb"
if err := setBootable(device, diskType); err != nil {
log.Errorf("setBootable(%s, %s): %s", device, diskType, err)
//return err
}
cmd = exec.Command("dd", "bs=440", "count=1", "if=/usr/share/syslinux/"+mbrFile, "of="+device)
if err := cmd.Run(); err != nil {
log.Errorf("%s", err)
return err
}
} else {
if err := setBootable(device, diskType); err != nil {
log.Errorf("setBootable(%s, %s): %s", device, diskType, err)
//return err
}
log.Infof("installSyslinux(%s)", device)
cmd := exec.Command("dd", "bs=440", "count=1", "if=/usr/share/syslinux/"+mbrFile, "of="+device)
log.Debugf("Run(%v)", cmd)
if err := cmd.Run(); err != nil {
log.Errorf("dd: %s", err)
return err
}
}
if err := os.MkdirAll(filepath.Join(baseName, bootDir+"syslinux"), 0755); err != nil {
return err
@ -897,55 +935,15 @@ func installSyslinux(device, baseName, bootDir, diskType string) error {
}
//extlinux --install ${baseName}/${bootDir}syslinux
cmd = exec.Command("extlinux", "--install", filepath.Join(baseName, bootDir+"syslinux"))
cmd := exec.Command("extlinux", "--install", filepath.Join(baseName, bootDir+"syslinux"))
if device == "/dev/" {
//extlinux --install --raid ${baseName}/${bootDir}syslinux
cmd = exec.Command("extlinux", "--install", "--raid", filepath.Join(baseName, bootDir+"syslinux"))
}
//cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
log.Debugf("Run(%v)", cmd)
if err := cmd.Run(); err != nil {
log.Errorf("extlinuux: %s", err)
return err
}
return nil
}
func installSyslinuxRaid(baseName, bootDir, diskType string) error {
log.Debugf("installSyslinuxRaid")
mbrFile := "mbr.bin"
if diskType == "gpt" {
mbrFile = "gptmbr.bin"
}
//dd bs=440 count=1 if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda
//dd bs=440 count=1 if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdb
//cp /usr/lib/syslinux/modules/bios/* ${baseName}/${bootDir}syslinux
//extlinux --install --raid ${baseName}/${bootDir}syslinux
cmd := exec.Command("dd", "bs=440", "count=1", "if=/usr/share/syslinux/"+mbrFile, "of=/dev/sda")
if err := cmd.Run(); err != nil {
log.Errorf("%s", err)
return err
}
cmd = exec.Command("dd", "bs=440", "count=1", "if=/usr/share/syslinux/"+mbrFile, "of=/dev/sdb")
if err := cmd.Run(); err != nil {
log.Errorf("%s", err)
return err
}
if err := os.MkdirAll(filepath.Join(baseName, bootDir+"syslinux"), 0755); err != nil {
return err
}
//cp /usr/lib/syslinux/modules/bios/* ${baseName}/${bootDir}syslinux
files, _ := ioutil.ReadDir("/usr/share/syslinux/")
for _, file := range files {
if file.IsDir() {
continue
}
if err := dfs.CopyFile(filepath.Join("/usr/share/syslinux/", file.Name()), filepath.Join(baseName, bootDir, "syslinux"), file.Name()); err != nil {
log.Errorf("copy syslinux: %s", err)
return err
}
}
cmd = exec.Command("extlinux", "--install", "--raid", filepath.Join(baseName, bootDir+"syslinux"))
if err := cmd.Run(); err != nil {
log.Errorf("%s", err)
log.Errorf("extlinux: %s", err)
return err
}
return nil