summaryrefslogtreecommitdiffstats
path: root/bootloader.py
diff options
context:
space:
mode:
authorJeremy Katz <katzj@redhat.com>2002-01-21 21:24:40 +0000
committerJeremy Katz <katzj@redhat.com>2002-01-21 21:24:40 +0000
commit8842f3f725af9dbfc41ce884da520f97a53d2a4f (patch)
tree64bc5c3ff1da2da1910f4b5dfe7254810448b685 /bootloader.py
parenta0908acbe832d7f76be25fe3fdd1288f25464d36 (diff)
downloadanaconda-8842f3f725af9dbfc41ce884da520f97a53d2a4f.tar.gz
anaconda-8842f3f725af9dbfc41ce884da520f97a53d2a4f.tar.xz
anaconda-8842f3f725af9dbfc41ce884da520f97a53d2a4f.zip
land boot loader changes to use booty backend infrastructure and switch
over to new screens. tagged as before_bootloader_merge and after_bootloader_merge appropriately
Diffstat (limited to 'bootloader.py')
-rw-r--r--bootloader.py935
1 files changed, 8 insertions, 927 deletions
diff --git a/bootloader.py b/bootloader.py
index c9f6fee07..f6b6a8e0c 100644
--- a/bootloader.py
+++ b/bootloader.py
@@ -1,10 +1,10 @@
#
-# bootloader.py: bootloader configuration data
+# bootloader.py: anaconda bootloader shims
#
# Erik Troan <ewt@redhat.com>
# Jeremy Katz <katzj@redhat.com>
#
-# Copyright 2001 Red Hat, Inc.
+# Copyright 2001-2002 Red Hat, Inc.
#
# This software may be freely redistributed under the terms of the GNU
# library public license.
@@ -22,884 +22,14 @@ import whrandom
import language
import iutil
import string
-if iutil.getArch() == "i386":
- import edd
from flags import flags
from log import log
from constants import *
-from lilo import LiloConfigFile
from translate import _
-## if 0:
-## if arch == "sparc":
-## errors = self.silo.install (self.fstab, instPath,
-## id.hdList, upgrade)
-## elif arch == "i386":
-## defaultlang = self.language.getLangNickByName(self.language.getDefault())
-## langlist = expandLangs(defaultlang)
-## errors = self.lilo.install (self.fstab, instPath,
-## id.hdList, upgrade, langlist)
-## elif arch == "ia64":
-## errors = self.eli.install (self.fstab, instPath,
-## id.hdList, upgrade)
-## elif arch == "alpha":
-## errors = self.milo.write ()
-## else:
-## raise RuntimeError, "What kind of machine is this, anyway?!"
+from booty import *
+from bootloaderInfo import *
-## if errors:
-## w.pop()
-## mess = _("An error occured while installing "
-## "the bootloader.\n\n"
-## "We HIGHLY recommend you make a recovery "
-## "boot floppy when prompted, otherwise you "
-## "may not be able to reboot into Red Hat Linux."
-## "\n\nThe error reported was:\n\n") + errors
-## intf.messageWindow(_("Bootloader Errors"), mess)
-
-## # make sure bootdisk window appears
-## if iutil.getArch () == "i386":
-## self.instClass.removeFromSkipList('bootdisk')
-## self.bootdisk = 1
-
-## w = apply(apply, createWindow)
-
-
-class KernelArguments:
-
- def get(self):
- return self.args
-
- def set(self, args):
- self.args = args
-
- def __init__(self):
- str = ""
-
- if iutil.getArch() == "s390":
- if os.environ.has_key("DASD"):
- str = str + "dasd=" + os.environ["DASD"]
-
- cdrw = isys.ideCdRwList()
- for device in cdrw:
- if str: str = str + " "
- str = str + ("%s=ide-scsi" % device)
-
- self.args = str
-
-class BootImages:
-
- # returns dictionary of (label, longlabel, devtype) pairs indexed by device
- def getImages(self):
- # return a copy so users can modify it w/o affecting us
-
- dict = {}
- for key in self.images.keys():
- dict[key] = self.images[key]
-
- return dict
-
- def setImageLabel(self, dev, label, setLong = 0):
- if setLong:
- self.images[dev] = (self.images[dev][0], label, self.images[dev][2])
- else:
- self.images[dev] = (label, self.images[dev][1], self.images[dev][2])
-
-
- # default is a device
- def setDefault(self, default):
- self.default = default
-
- def getDefault(self):
- return self.default
-
- def setup(self, diskSet, fsset):
- devices = {}
- devs = availableBootDevices(diskSet, fsset)
- for (dev, type) in devs:
- devices[dev] = 1
-
- # These partitions have disappeared
- for dev in self.images.keys():
- if not devices.has_key(dev): del self.images[dev]
-
- # These have appeared
- for (dev, type) in devs:
- if not self.images.has_key(dev):
- if type == "FAT":
- self.images[dev] = ("DOS", "DOS", type)
- else:
- self.images[dev] = (None, None, type)
-
- if not self.images.has_key(self.default):
- entry = fsset.getEntryByMountPoint('/')
- self.default = entry.device.getDevice()
- (label, longlabel, type) = self.images[self.default]
- if not label:
- self.images[self.default] = ("linux", "Red Hat Linux", type)
-
- def __init__(self):
- self.default = None
- self.images = {}
-
-
-class bootloaderInfo:
- def setUseGrub(self, val):
- pass
-
- def useGrub(self):
- return self.useGrubVal
-
- def setForceLBA(self, val):
- pass
-
- def setPassword(self, val, isCrypted = 1):
- pass
-
- def getPassword(self):
- pass
-
- def getDevice(self):
- return self.device
-
- def setDevice(self, device):
- self.device = device
-
- def getBootloaderConfig(self, instRoot, fsset, bl, langs, kernelList,
- chainList, defaultDev):
- images = bl.images.getImages()
-
- # on upgrade read in the lilo config file
- lilo = LiloConfigFile ()
- self.perms = 0644
- if os.access (instRoot + self.configfile, os.R_OK):
- self.perms = os.stat(instRoot + self.configfile)[0] & 0777
- lilo.read (instRoot + self.configfile)
- os.rename(instRoot + self.configfile,
- instRoot + self.configfile + '.rpmsave')
-
- # Remove any invalid entries that are in the file; we probably
- # just removed those kernels.
- for label in lilo.listImages():
- (fsType, sl) = lilo.getImage(label)
- if fsType == "other": continue
-
- if not os.access(instRoot + sl.getPath(), os.R_OK):
- lilo.delImage(label)
-
- lilo.addEntry("prompt", replace = 0)
- lilo.addEntry("timeout", "50", replace = 0)
-
- rootDev = fsset.getEntryByMountPoint("/").device.getDevice()
- if not rootDev:
- raise RuntimeError, "Installing lilo, but there is no root device"
-
- if rootDev == defaultDev:
- lilo.addEntry("default", kernelList[0][0])
- else:
- lilo.addEntry("default", chainList[0][0])
-
- for (label, longlabel, version) in kernelList:
- kernelTag = "-" + version
- kernelFile = self.kernelLocation + "vmlinuz" + kernelTag
-
- try:
- lilo.delImage(label)
- except IndexError, msg:
- pass
-
- sl = LiloConfigFile(imageType = "image", path = kernelFile)
-
- initrd = makeInitrd (kernelTag, instRoot)
-
- sl.addEntry("label", label)
- if os.access (instRoot + initrd, os.R_OK):
- sl.addEntry("initrd", "%sinitrd%s.img" %(self.kernelLocation, kernelTag))
-
- sl.addEntry("read-only")
- sl.addEntry("root", '/dev/' + rootDev)
-
- if self.args.get():
- sl.addEntry('append', '"%s"' % self.args.get())
-
- lilo.addImage (sl)
-
- for (label, longlabel, device) in chainList:
- if ((not label) or (label == "")):
- continue
- try:
- (fsType, sl) = lilo.getImage(label)
- lilo.delImage(label)
- except IndexError:
- sl = LiloConfigFile(imageType = "other", path = "/dev/%s" %(device))
- sl.addEntry("optional")
-
- sl.addEntry("label", label)
- lilo.addImage (sl)
-
- # Sanity check #1. There could be aliases in sections which conflict
- # with the new images we just created. If so, erase those aliases
- imageNames = {}
- for label in lilo.listImages():
- imageNames[label] = 1
-
- for label in lilo.listImages():
- (fsType, sl) = lilo.getImage(label)
- if sl.testEntry('alias'):
- alias = sl.getEntry('alias')
- if imageNames.has_key(alias):
- sl.delEntry('alias')
- imageNames[alias] = 1
-
- # Sanity check #2. If single-key is turned on, go through all of
- # the image names (including aliases) (we just built the list) and
- # see if single-key will still work.
- if lilo.testEntry('single-key'):
- singleKeys = {}
- turnOff = 0
- for label in imageNames.keys():
- l = label[0]
- if singleKeys.has_key(l):
- turnOff = 1
- singleKeys[l] = 1
- if turnOff:
- lilo.delEntry('single-key')
-
- return lilo
-
- def write(self, instRoot, fsset, bl, langs, kernelList, chainList,
- defaultDev, justConfig, intf):
- if len(kernelList) >= 1:
- config = self.getBootloaderConfig(instRoot, fsset, bl, langs,
- kernelList, chainList,
- defaultDev)
- config.write(instRoot + self.configfile, perms = self.perms)
- else:
- self.noKernelsWarn(intf)
-
- return ""
-
- # XXX in the future we also should do some validation on the config
- # file that's already there
- def noKernelsWarn(self, intf):
- intf.messageWindow(_("Warning"),
- _("No kernel packages were installed on your "
- "system. Your boot loader configuration "
- "will not be changed."))
-
- def getArgList(self):
- args = []
-
- if self.args.get():
- args.append("--append")
- args.append(self.args.get())
-
- return args
-
- def writeKS(self, f):
- f.write("bootloader")
- for arg in self.getArgList():
- f.write(" " + arg)
- f.write("\n")
-
- def __init__(self):
- self.args = KernelArguments()
- self.images = BootImages()
- self.device = None
- self.useLinear = 1 # only used for kickstart compatibility
- self.defaultDevice = None # XXX hack, used by kickstart
- self.useGrubVal = 0 # only used on x86
- self.configfile = None
- self.kernelLocation = "/boot/"
- self.forceLBA32 = 0
- self.password = None
- self.pure = None
- self.above1024 = 0
-
-class ia64BootloaderInfo(bootloaderInfo):
- # XXX wouldn't it be nice to have a real interface to use efibootmgr from?
- def removeOldEfiEntries(self, instRoot):
- p = os.pipe()
- iutil.execWithRedirect('/usr/sbin/efibootmgr', ["efibootmgr"],
- root = instRoot, stdout = p[1])
- os.close(p[1])
-
- c = os.read(p[0], 1)
- buf = c
- while (c):
- c = os.read(p[0], 1)
- buf = buf + c
- os.close(p[0])
- lines = string.split(buf, '\n')
- for line in lines:
- fields = string.split(line)
- if len(fields) < 4:
- continue
- if fields[1:4] == ["Red","Hat","Linux"]:
- entry = fields[0][4:8]
- iutil.execWithRedirect('/usr/sbin/efibootmgr',
- ["efibootmgr", "-b", entry, "-B"],
- root = instRoot,
- stdout="/dev/tty5", stderr="/dev/tty5")
-
-
- def writeLilo(self, instRoot, fsset, bl, langs, kernelList,
- chainList, defaultDev, justConfig):
- config = self.getBootloaderConfig(instRoot, fsset, bl, langs,
- kernelList, chainList, defaultDev)
- config.write(instRoot + self.configfile, perms = self.perms)
-
- return ""
-
- def write(self, instRoot, fsset, bl, langs, kernelList, chainList,
- defaultDev, justConfig, intf):
- if len(kernelList) >= 1:
- str = self.writeLilo(instRoot, fsset, bl, langs, kernelList,
- chainList, defaultDev, justConfig)
- else:
- self.noKernelsWarn(intf)
-
- bootdev = fsset.getEntryByMountPoint("/boot/efi").device.getDevice()
- if not bootdev:
- bootdev = fsset.getEntryByDeviceName("sda1").device.getDevice()
-
- ind = len(bootdev)
- try:
- while (bootdev[ind-1] in string.digits):
- ind = ind - 1
- except IndexError:
- ind = len(bootdev) - 1
-
- bootdisk = bootdev[:ind]
- bootpart = bootdev[ind:]
- if (bootdisk.startswith('ida/') or bootdisk.startswith('cciss/') or
- bootdisk.startswith('rd/')):
- bootdisk = bootdisk[:-1]
-
- self.removeOldEfiEntries(instRoot)
-
- argv = [ "/usr/sbin/efibootmgr", "-c" , "-w", "-L",
- "Red Hat Linux", "-d", "/dev/%s" % bootdisk, "-p", bootpart ]
- iutil.execWithRedirect(argv[0], argv, root = instRoot,
- stdout = "/dev/tty5",
- stderr = "/dev/tty5")
-
- def __init__(self):
- bootloaderInfo.__init__(self)
- self.useGrubVal = 1
- self.kernelLocation = ""
- self.configfile = "/boot/efi/elilo.conf"
-
-
-class x86BootloaderInfo(bootloaderInfo):
- def setPassword(self, val, isCrypted = 1):
- if not val:
- self.password = val
- self.pure = val
- return
-
- if isCrypted:
- self.password = val
- else:
- salt = "$1$"
- saltLen = 8
-
- for i in range(saltLen):
- salt = salt + whrandom.choice (string.letters +
- string.digits + './')
-
- self.password = crypt.crypt (val, salt)
- self.pure = val
-
- def getPassword (self):
- return self.pure
-
- def setForceLBA(self, val):
- self.forceLBA32 = val
-
- def setUseGrub(self, val):
- self.useGrubVal = val
-
- def writeGrub(self, instRoot, fsset, bl, langs, kernelList, chainList,
- defaultDev, justConfigFile):
- if len(kernelList) < 1:
- return ""
-
- images = bl.images.getImages()
- rootDev = fsset.getEntryByMountPoint("/").device.getDevice()
-
- if not os.path.isdir(instRoot + '/boot/grub/'):
- os.mkdir(instRoot + '/boot/grub', 0755)
-
- cf = '/boot/grub/grub.conf'
- self.perms = 0600
- if os.access (instRoot + cf, os.R_OK):
- self.perms = os.stat(instRoot + cf)[0] & 0777
- os.rename(instRoot + cf,
- instRoot + cf + '.rpmsave')
-
- grubTarget = bl.getDevice()
- # XXX wouldn't it be nice if grub really understood raid? :)
- if grubTarget.startswith('md'):
- device = fsset.getEntryByDeviceName(grubTarget).device.members[0]
- (grubTarget, None) = getDiskPart(device)
-
- f = open(instRoot + cf, "w+")
-
- f.write("# grub.conf generated by anaconda\n")
- f.write("#\n")
- f.write("# Note that you do not have to rerun grub "
- "after making changes to this file\n")
-
- bootDev = fsset.getEntryByMountPoint("/boot")
- grubPath = "/grub"
- cfPath = "/"
- if not bootDev:
- bootDev = fsset.getEntryByMountPoint("/")
- grubPath = "/boot/grub"
- cfPath = "/boot/"
- f.write ("# NOTICE: You do not have a /boot partition. This means that\n")
- f.write ("# all kernel and initrd paths are relative to /, eg.\n")
- else:
- f.write ("# NOTICE: You have a /boot partition. This means that\n")
- f.write ("# all kernel and initrd paths are relative to /boot/, eg.\n")
-
- bootDev = bootDev.device.getDevice(asBoot = 1)
-
- f.write ('# root %s\n' % grubbyPartitionName(bootDev))
- f.write ("# kernel %svmlinuz-version ro root=/dev/%s\n" % (cfPath, rootDev))
- f.write ("# initrd %sinitrd-version.img\n" % (cfPath))
- f.write("#boot=/dev/%s\n" % (grubTarget))
-
- # get the default image to boot... we have to walk and find it
- # since grub indexes by where it is in the config file
- if defaultDev == rootDev:
- default = 0
- else:
- # if the default isn't linux, it's the first thing in the
- # chain list
- default = len(kernelList)
-
- # keep track of which devices are used for the device.map
- usedDevs = {}
-
- f.write('default=%s\n' % (default))
- f.write('timeout=10\n')
- f.write('splashimage=%s%sgrub/splash.xpm.gz\n'
- % (grubbyPartitionName(bootDev), cfPath))
-
- usedDevs[bootDev] = 1
- usedDevs[grubTarget] = 1
-
- if self.password:
- f.write('password --md5 %s\n' %(self.password))
-
- for (label, longlabel, version) in kernelList:
- kernelTag = "-" + version
- kernelFile = "%svmlinuz%s" % (cfPath, kernelTag)
-
- initrd = makeInitrd (kernelTag, instRoot)
-
- f.write('title %s (%s)\n' % (longlabel, version))
- f.write('\troot %s\n' % grubbyPartitionName(bootDev))
- f.write('\tkernel %s ro root=/dev/%s' % (kernelFile, rootDev))
- if self.args.get():
- f.write(' %s' % self.args.get())
- f.write('\n')
-
- if os.access (instRoot + initrd, os.R_OK):
- f.write('\tinitrd %sinitrd%s.img\n' % (cfPath, kernelTag))
-
- for (label, longlabel, device) in chainList:
- if ((not longlabel) or (longlabel == "")):
- continue
- f.write('title %s\n' % (longlabel))
- f.write('\trootnoverify %s\n' % grubbyPartitionName(device))
-# f.write('\tmakeactive\n')
- f.write('\tchainloader +1')
- f.write('\n')
- usedDevs[device] = 1
-
- f.close()
- os.chmod(instRoot + "/boot/grub/grub.conf", self.perms)
-
- # make a symlink for menu.lst since it's the default config file name
- if os.access (instRoot + "/boot/grub/menu.lst", os.R_OK):
- os.rename(instRoot + "/boot/grub/menu.lst",
- instRoot + "/boot/grub/menu.lst.rpmsave")
- os.symlink("./grub.conf", instRoot + "/boot/grub/menu.lst")
-
- # make a symlink for /etc/grub.conf since config files belong in /etc
- if os.access (instRoot + "/etc/grub.conf", os.R_OK):
- os.rename(instRoot + "/etc/grub.conf",
- instRoot + "/etc/grub.conf.rpmsave")
- os.symlink("../boot/grub/grub.conf", instRoot + "/etc/grub.conf")
-
-
- if not os.access(instRoot + "/boot/grub/device.map", os.R_OK):
- f = open(instRoot + "/boot/grub/device.map", "w+")
- f.write("# this device map was generated by anaconda\n")
- f.write("(fd0) /dev/fd0\n")
- devs = usedDevs.keys()
- devs.sort()
- usedDevs = {}
- for dev in devs:
- drive = getDiskPart(dev)[0]
- if usedDevs.has_key(drive):
- continue
- f.write("(%s) /dev/%s\n" % (grubbyDiskName(drive), drive))
- usedDevs[drive] = 1
- f.close()
-
- if self.forceLBA32:
- forcelba = "--force-lba "
- else:
- forcelba = ""
-
- part = grubbyPartitionName(bootDev)
- prefix = "%s/%s" % (grubbyPartitionName(bootDev), grubPath)
- cmd = "root %s\ninstall %s%s/stage1 d %s %s/stage2 p %s%s/grub.conf" % \
- (part, forcelba, grubPath, grubbyPartitionName(grubTarget),
- grubPath, part, grubPath)
-
- if not justConfigFile:
- log("GRUB command %s", cmd)
-
- # copy the stage files over into /boot
- iutil.execWithRedirect( "/sbin/grub-install",
- ["/sbin/grub-install", "--just-copy"],
- stdout = "/dev/tty5", stderr = "/dev/tty5",
- root = instRoot)
-
-
- # really install the bootloader
- p = os.pipe()
- os.write(p[1], cmd + '\n')
- os.close(p[1])
- iutil.execWithRedirect('/sbin/grub' ,
- [ "grub", "--batch", "--no-floppy",
- "--device-map=/boot/grub/device.map" ],
- stdin = p[0],
- stdout = "/dev/tty5", stderr = "/dev/tty5",
- root = instRoot)
- os.close(p[0])
-
- return ""
-
- def getBootloaderConfig(self, instRoot, fsset, bl, langs, kernelList,
- chainList, defaultDev):
- config = bootloaderInfo.getBootloaderConfig(self, instRoot, fsset, bl, langs,
- kernelList, chainList,
- defaultDev)
-
- liloTarget = bl.getDevice()
-
- config.addEntry("boot", '/dev/' + liloTarget, replace = 0)
- config.addEntry("map", "/boot/map", replace = 0)
- config.addEntry("install", "/boot/boot.b", replace = 0)
- message = "/boot/message"
- for lang in language.expandLangs(langs.getDefault()):
- fn = "/boot/message." + lang
- if os.access(instRoot + fn, os.R_OK):
- message = fn
- break
-
- config.addEntry("message", message, replace = 0)
-
- if not config.testEntry('lba32') and not config.testEntry('linear'):
- if self.forceLBA32 or (bl.above1024 and edd.detect()):
- config.addEntry("lba32", replace = 0)
- elif self.useLinear:
- config.addEntry("linear", replace = 0)
- else:
- config.addEntry("nolinear", replace = 0)
-
- return config
-
- def writeLilo(self, instRoot, fsset, bl, langs, kernelList,
- chainList, defaultDev, justConfig):
- if len(kernelList) >= 1:
- config = self.getBootloaderConfig(instRoot, fsset, bl, langs,
- kernelList, chainList, defaultDev)
- config.write(instRoot + self.configfile, perms = self.perms)
-
- if not justConfig:
- # throw away stdout, catch stderr
- str = iutil.execWithCapture(instRoot + '/sbin/lilo' ,
- [ "lilo", "-r", instRoot ],
- catchfd = 2, closefd = 1)
- else:
- str = ""
-
- return str
-
- def write(self, instRoot, fsset, bl, langs, kernelList, chainList,
- defaultDev, justConfig, intf):
- if len(kernelList) < 1:
- self.noKernelsWarn(intf)
-
- str = self.writeLilo(instRoot, fsset, bl, langs, kernelList,
- chainList, defaultDev,
- justConfig | (self.useGrubVal))
- str = self.writeGrub(instRoot, fsset, bl, langs, kernelList,
- chainList, defaultDev,
- justConfig | (not self.useGrubVal))
- # XXX move the lilo.conf out of the way if they're using GRUB
- # so that /sbin/installkernel does a more correct thing
- if self.useGrubVal and os.access(instRoot + '/etc/lilo.conf', os.R_OK):
- os.rename(instRoot + "/etc/lilo.conf",
- instRoot + "/etc/lilo.conf.anaconda")
-
-
-
- def getArgList(self):
- args = bootloaderInfo.getArgList(self)
-
- if not self.useGrubVal:
- args.append("--useLilo")
- if self.forceLBA32:
- args.append("--lba32")
- if not self.useLinear:
- args.append("--nolinear")
- if self.password:
- args.append("--md5pass=%s" %(self.password))
-
-
- # XXX add location of bootloader here too
-
- return args
-
- def __init__(self):
- bootloaderInfo.__init__(self)
- self.useGrubVal = 1
- self.kernelLocation = "/boot/"
- self.configfile = "/etc/lilo.conf"
- self.password = None
- self.pure = None
-
-class s390BootloaderInfo(bootloaderInfo):
- def getBootloaderConfig(self, instRoot, fsset, bl, langs, kernelList,
- chainList, defaultDev):
- images = bl.images.getImages()
-
- # on upgrade read in the lilo config file
- lilo = LiloConfigFile ()
- self.perms = 0644
- if os.access (instRoot + self.configfile, os.R_OK):
- self.perms = os.stat(instRoot + self.configfile)[0] & 0777
- lilo.read (instRoot + self.configfile)
- os.rename(instRoot + self.configfile,
- instRoot + self.configfile + '.rpmsave')
-
- # Remove any invalid entries that are in the file; we probably
- # just removed those kernels.
- for label in lilo.listImages():
- (fsType, sl) = lilo.getImage(label)
- if fsType == "other": continue
-
- if not os.access(instRoot + sl.getPath(), os.R_OK):
- lilo.delImage(label)
-
- #lilo.addEntry("prompt", replace = 0)
- #lilo.addEntry("timeout", "50", replace = 0)
-
- rootDev = fsset.getEntryByMountPoint("/").device.getDevice()
- if not rootDev:
- raise RuntimeError, "Installing zilo, but there is no root device"
-
- if rootDev == defaultDev:
- lilo.addEntry("default", kernelList[0][0])
- else:
- lilo.addEntry("default", chainList[0][0])
-
- for (label, longlabel, version) in kernelList:
- kernelTag = "-" + version
- kernelFile = self.kernelLocation + "vmlinuz" + kernelTag
-
- try:
- lilo.delImage(label)
- except IndexError, msg:
- pass
-
- sl = LiloConfigFile(imageType = "image", path = kernelFile)
-
- initrd = makeInitrd (kernelTag, instRoot)
-
- sl.addEntry("label", label)
- if os.access (instRoot + initrd, os.R_OK):
- sl.addEntry("initrd",
- "%sinitrd%s.img" %(self.kernelLocation, kernelTag))
-
- sl.addEntry("read-only")
- sl.addEntry("root", '/dev/' + rootDev)
- sl.addEntry("ipldevice", '/dev/' + rootDev[:-1])
-
- if self.args.get():
- sl.addEntry('append', '"%s"' % self.args.get())
-
- lilo.addImage (sl)
-
- for (label, longlabel, device) in chainList:
- if ((not label) or (label == "")):
- continue
- try:
- (fsType, sl) = lilo.getImage(label)
- lilo.delImage(label)
- except IndexError:
- sl = LiloConfigFile(imageType = "other",
- path = "/dev/%s" %(device))
- sl.addEntry("optional")
-
- sl.addEntry("label", label)
- lilo.addImage (sl)
-
- # Sanity check #1. There could be aliases in sections which conflict
- # with the new images we just created. If so, erase those aliases
- imageNames = {}
- for label in lilo.listImages():
- imageNames[label] = 1
-
- for label in lilo.listImages():
- (fsType, sl) = lilo.getImage(label)
- if sl.testEntry('alias'):
- alias = sl.getEntry('alias')
- if imageNames.has_key(alias):
- sl.delEntry('alias')
- imageNames[alias] = 1
-
- # Sanity check #2. If single-key is turned on, go through all of
- # the image names (including aliases) (we just built the list) and
- # see if single-key will still work.
- if lilo.testEntry('single-key'):
- singleKeys = {}
- turnOff = 0
- for label in imageNames.keys():
- l = label[0]
- if singleKeys.has_key(l):
- turnOff = 1
- singleKeys[l] = 1
- if turnOff:
- lilo.delEntry('single-key')
-
- return lilo
-
- def writeChandevConf(self, instroot): # S/390 only
- cf = "/etc/chandev.conf"
- self.perms = 0644
- if os.environ.has_key("CHANDEV"):
- fd = os.open(instroot + "/etc/chandev.conf",
- os.O_WRONLY | os.O_CREAT)
- os.write(fd, os.environ["CHANDEV"])
- os.close(fd)
- return ""
-
-
- def writeZipl(self, instRoot, fsset, bl, langs, kernelList, chainList,
- defaultDev, justConfigFile):
- images = bl.images.getImages()
- rootDev = fsset.getEntryByMountPoint("/").device.getDevice()
-
- cf = '/etc/zipl.conf'
- self.perms = 0600
- if os.access (instRoot + cf, os.R_OK):
- self.perms = os.stat(instRoot + cf)[0] & 0777
- os.rename(instRoot + cf,
- instRoot + cf + '.rpmsave')
-
- f = open(instRoot + cf, "w+")
-
- f.write('[defaultboot]\n')
- f.write('default=' + kernelList[0][0] + '\n')
-
- cfPath = "/boot/"
- for (label, longlabel, version) in kernelList:
- kernelTag = "-" + version
- kernelFile = "%svmlinuz%s" % (cfPath, kernelTag)
-
- initrd = makeInitrd (kernelTag, instRoot)
- f.write('[%s]\n' % (label))
- f.write('\ttarget=%s\n' % (self.kernelLocation))
- f.write('\timage=%s\n' % (kernelFile))
- if os.access (instRoot + initrd, os.R_OK):
- f.write("ramdisk=%sinitrd%s.img\n" %(self.kernelLocation,
- kernelTag))
- if self.args.get():
- f.write('\tparameters="root=/dev/%s %s"\n' % (rootDev,
- self.args.get()))
- f.write('\n')
-
- f.close()
-
- if not justConfigFile:
- argv = [ "/sbin/zipl" ]
- iutil.execWithRedirect(argv[0], argv, root = instRoot,
- stdout = "/dev/tty5",
- stderr = "/dev/tty5")
-
- return ""
-
- def writeZilo(self, instRoot, fsset, bl, langs, kernelList,
- chainList, defaultDev, justConfig):
- config = self.getBootloaderConfig(instRoot, fsset, bl, langs,
- kernelList, chainList, defaultDev)
- config.write(instRoot + self.configfile, perms = self.perms)
-
- if not justConfig:
- # throw away stdout, catch stderr
- str = iutil.execWithCapture(instRoot + '/sbin/zilo' ,
- [ "zilo", "-r", instRoot ],
- catchfd = 2, closefd = 1)
- else:
- str = ""
-
- return str
-
- def write(self, instRoot, fsset, bl, langs, kernelList, chainList,
- defaultDev, justConfig, intf):
- str = self.writeZilo(instRoot, fsset, bl, langs, kernelList,
- chainList, defaultDev,
- justConfig | (self.useZiplVal))
- str = self.writeZipl(instRoot, fsset, bl, langs, kernelList,
- chainList, defaultDev,
- justConfig | (not self.useZiplVal))
- str = self.writeChandevConf(instRoot)
-
- def __init__(self):
- bootloaderInfo.__init__(self)
- self.useZiplVal = 1 # only used on s390
- self.kernelLocation = "/boot/"
- self.configfile = "/etc/zilo.conf"
-
-
-def availableBootDevices(diskSet, fsset):
- devs = []
- foundDos = 0
- for (dev, type) in diskSet.partitionTypes():
- # XXX do we boot fat on anything other than i386?
- if type == 'FAT' and not foundDos and iutil.getArch() == "i386":
- isys.makeDevInode(dev, '/tmp/' + dev)
- part = partitioning.get_partition_by_name(diskSet.disks, dev)
- if part.native_type not in partitioning.dosPartitionTypes:
- continue
-
- try:
- bootable = isys.checkBoot('/tmp/' + dev)
- devs.append((dev, type))
- foundDos = 1
- except:
- pass
- elif type == 'ntfs' or type =='hpfs':
- devs.append((dev, type))
-
- slash = fsset.getEntryByMountPoint('/')
- if not slash or not slash.device or not slash.fsystem:
- raise ValueError, ("Trying to pick boot devices but do not have a "
- "sane root partition. Aborting install.")
- devs.append((slash.device.getDevice(), slash.fsystem.getName()))
-
- devs.sort()
-
- return devs
def bootloaderSetupChoices(dispatch, bl, fsset, diskSet, dir):
if dir == DISPATCH_BACK:
@@ -929,7 +59,8 @@ def bootloaderSetupChoices(dispatch, bl, fsset, diskSet, dir):
bootDev = fsset.getEntryByMountPoint("/")
if not bootDev:
bootDev = fsset.getEntryByMountPoint("/boot")
- part = partitioning.get_partition_by_name(diskSet.disks, bootDev.device.getDevice())
+ part = partitioning.get_partition_by_name(diskSet.disks,
+ bootDev.device.getDevice())
if part and partitioning.end_sector_to_cyl(part.geom.disk.dev,
part.geom.end) >= 1024:
bl.above1024 = 1
@@ -982,57 +113,7 @@ def makeInitrd (kernelTag, instRoot):
return initrd
-# return (disk, partition number) eg ('hda', 1)
-def getDiskPart(dev):
- cut = len(dev)
- if (dev.startswith('rd/') or dev.startswith('ida/') or
- dev.startswith('cciss/')):
- if dev[-2] == 'p':
- cut = -1
- elif dev[-3] == 'p':
- cut = -2
- else:
- if dev[-2] in string.digits:
- cut = -2
- elif dev[-1] in string.digits:
- cut = -1
-
- name = dev[:cut]
-
- # hack off the trailing 'p' from /dev/cciss/*, for example
- if name[-1] == 'p':
- for letter in name:
- if letter not in string.letters and letter != "/":
- name = name[:-1]
- break
-
- if cut < 0:
- partNum = int(dev[cut:]) - 1
- else:
- partNum = None
-
- return (name, partNum)
-
-def grubbyDiskName(name):
- drives = isys.hardDriveDict().keys()
- drives.sort (isys.compareDrives)
-
- return "hd%d" % drives.index(name)
-
-def grubbyPartitionName(dev):
- (name, partNum) = getDiskPart(dev)
- if partNum != None:
- return "(%s,%d)" % (grubbyDiskName(name), partNum)
- else:
- return "(%s)" %(grubbyDiskName(name))
-
# return instance of the appropriate bootloader for our arch
def getBootloader():
- if iutil.getArch() == 'i386':
- return x86BootloaderInfo()
- elif iutil.getArch() == 'ia64':
- return ia64BootloaderInfo()
- elif iutil.getArch() == 's390':
- return s390BootloaderInfo()
- else:
- return bootloaderInfo()
+ import booty
+ return booty.getBootloader()