mirror of
https://github.com/rancher/os.git
synced 2025-08-12 12:02:22 +00:00
Fixes for packet.net raid based upgrades
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
This commit is contained in:
parent
0d889ef9a8
commit
35afccefdf
@ -470,7 +470,7 @@ func layDownOS(image, installType, cloudConfig, device, kappend string, kexec bo
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
installSyslinuxRaid(baseName, bootDir, diskType)
|
installSyslinux(device, baseName, bootDir, diskType)
|
||||||
case "bootstrap":
|
case "bootstrap":
|
||||||
CONSOLE = "ttyS0"
|
CONSOLE = "ttyS0"
|
||||||
var err error
|
var err error
|
||||||
@ -487,6 +487,7 @@ func layDownOS(image, installType, cloudConfig, device, kappend string, kexec bo
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
log.Infof("upgrading - %s, %s, %s, %s", device, baseName, bootDir, diskType)
|
||||||
// TODO: detect pv-grub, and don't kill it with syslinux
|
// TODO: detect pv-grub, and don't kill it with syslinux
|
||||||
upgradeBootloader(device, baseName, bootDir, diskType)
|
upgradeBootloader(device, baseName, bootDir, diskType)
|
||||||
default:
|
default:
|
||||||
@ -716,8 +717,7 @@ func formatdevice(device, partition string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func mountdevice(baseName, bootDir, partition string, raw bool) (string, string, error) {
|
func mountdevice(baseName, bootDir, partition string, raw bool) (string, string, error) {
|
||||||
log.Debugf("mountdevice %s, raw %v", partition, raw)
|
log.Infof("mountdevice %s, raw %v", partition, raw)
|
||||||
device := ""
|
|
||||||
|
|
||||||
if raw {
|
if raw {
|
||||||
log.Debugf("util.Mount (raw) %s, %s", partition, baseName)
|
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)
|
cmd := exec.Command("lsblk", "-no", "pkname", partition)
|
||||||
log.Debugf("Run(%v)", cmd)
|
log.Debugf("Run(%v)", cmd)
|
||||||
cmd.Stderr = os.Stderr
|
cmd.Stderr = os.Stderr
|
||||||
|
device := ""
|
||||||
if out, err := cmd.Output(); err == nil {
|
if out, err := cmd.Output(); err == nil {
|
||||||
device = "/dev/" + strings.TrimSpace(string(out))
|
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))
|
partition = strings.TrimSpace(string(out))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
device := ""
|
||||||
cmd = exec.Command("lsblk", "-no", "pkname", partition)
|
cmd = exec.Command("lsblk", "-no", "pkname", partition)
|
||||||
log.Debugf("Run(%v)", cmd)
|
log.Debugf("Run(%v)", cmd)
|
||||||
cmd.Stderr = os.Stderr
|
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
|
// TODO: in v0.9.0, need to detect what version syslinux we have
|
||||||
return nil
|
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 {
|
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
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
syslinuxDir := filepath.Join(baseName, bootDir+"syslinux")
|
syslinuxDir := filepath.Join(baseName, bootDir+"syslinux")
|
||||||
backupSyslinuxDir := filepath.Join(baseName, bootDir+"syslinux_backup")
|
backupSyslinuxDir := filepath.Join(baseName, bootDir+"syslinux_backup")
|
||||||
if err := os.Rename(syslinuxDir, backupSyslinuxDir); err != nil {
|
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
|
return err
|
||||||
}
|
}
|
||||||
//mv the old syslinux into linux-previous.cfg
|
//mv the old syslinux into linux-previous.cfg
|
||||||
oldSyslinux, err := ioutil.ReadFile(filepath.Join(backupSyslinuxDir, "syslinux.cfg"))
|
oldSyslinux, err := ioutil.ReadFile(filepath.Join(backupSyslinuxDir, "syslinux.cfg"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Debugf("read(%s / syslinux.cfg): %s", backupSyslinuxDir, err)
|
log.Errorf("read(%s / syslinux.cfg): %s", backupSyslinuxDir, err)
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -854,16 +852,25 @@ func upgradeBootloader(device, baseName, bootDir, diskType string) error {
|
|||||||
// LINUX ../vmlinuz-v0.7.1-rancheros
|
// LINUX ../vmlinuz-v0.7.1-rancheros
|
||||||
// APPEND rancher.state.dev=LABEL=RANCHER_STATE rancher.state.wait console=tty0 rancher.password=rancher
|
// APPEND rancher.state.dev=LABEL=RANCHER_STATE rancher.state.wait console=tty0 rancher.password=rancher
|
||||||
// INITRD ../initrd-v0.7.1-rancheros
|
// INITRD ../initrd-v0.7.1-rancheros
|
||||||
|
|
||||||
cfg = strings.Replace(cfg, "current", "previous", -1)
|
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
|
// 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)
|
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)
|
return installSyslinux(device, baseName, bootDir, diskType)
|
||||||
}
|
}
|
||||||
|
|
||||||
func installSyslinux(device, baseName, bootDir, diskType string) error {
|
func installSyslinux(device, baseName, bootDir, diskType string) error {
|
||||||
log.Debugf("installSyslinux")
|
|
||||||
|
|
||||||
mbrFile := "mbr.bin"
|
mbrFile := "mbr.bin"
|
||||||
if diskType == "gpt" {
|
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}
|
//dd bs=440 count=1 if=/usr/lib/syslinux/mbr/mbr.bin of=${device}
|
||||||
// ubuntu: /usr/lib/syslinux/mbr/mbr.bin
|
// ubuntu: /usr/lib/syslinux/mbr/mbr.bin
|
||||||
// alpine: /usr/share/syslinux/mbr.bin
|
// alpine: /usr/share/syslinux/mbr.bin
|
||||||
cmd := exec.Command("dd", "bs=440", "count=1", "if=/usr/share/syslinux/"+mbrFile, "of="+device)
|
if device == "/dev/" {
|
||||||
//cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
|
log.Infof("installSyslinuxRaid(%s)", device)
|
||||||
log.Debugf("Run(%v)", cmd)
|
//RAID - assume sda&sdb
|
||||||
if err := cmd.Run(); err != nil {
|
//TODO: fix this - not sure how to detect what disks should have mbr - perhaps we need a param
|
||||||
log.Errorf("dd: %s", err)
|
// perhaps just assume and use the devices that make up the raid - mdadm
|
||||||
return err
|
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 {
|
if err := os.MkdirAll(filepath.Join(baseName, bootDir+"syslinux"), 0755); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -897,55 +935,15 @@ func installSyslinux(device, baseName, bootDir, diskType string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//extlinux --install ${baseName}/${bootDir}syslinux
|
//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
|
//cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
|
||||||
log.Debugf("Run(%v)", cmd)
|
log.Debugf("Run(%v)", cmd)
|
||||||
if err := cmd.Run(); err != nil {
|
if err := cmd.Run(); err != nil {
|
||||||
log.Errorf("extlinuux: %s", err)
|
log.Errorf("extlinux: %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)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
Loading…
Reference in New Issue
Block a user