/[smeserver]/rpms/booty/sme7/0001-Backport-RHEL5-boot-installer.patch
ViewVC logotype

Contents of /rpms/booty/sme7/0001-Backport-RHEL5-boot-installer.patch

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (show annotations) (download)
Tue Oct 27 04:23:18 2009 UTC (14 years, 7 months ago) by slords
Branch: MAIN
CVS Tags: HEAD
Updates

1 From 93fcd3224a342b905b31d40da2058d3ea910eb0c Mon Sep 17 00:00:00 2001
2 From: Shad L. Lords <slords@mail.com>
3 Date: Mon, 26 Oct 2009 22:16:17 -0600
4 Subject: [PATCH] Backport RHEL5 boot installer
5
6 ---
7 bootloaderInfo.py | 884 +++++++++++++++++++++++++++++-----------------------
8 checkbootloader.py | 85 ++++--
9 2 files changed, 559 insertions(+), 410 deletions(-)
10
11 diff --git a/bootloaderInfo.py b/bootloaderInfo.py
12 index 57caaf9..3668ee8 100644
13 --- a/bootloaderInfo.py
14 +++ b/bootloaderInfo.py
15 @@ -4,8 +4,9 @@
16 #
17 # Jeremy Katz <katzj@redhat.com>
18 # Erik Troan <ewt@redhat.com>
19 +# Peter Jones <pjones@redhat.com>
20 #
21 -# Copyright 2002 Red Hat, Inc.
22 +# Copyright 2005 Red Hat, Inc.
23 #
24 # This software may be freely redistributed under the terms of the GNU
25 # library public license.
26 @@ -76,10 +77,10 @@ class BootyNoKernelWarning:
27 class KernelArguments:
28
29 def get(self):
30 - return self.args
31 + return self.args
32
33 def set(self, args):
34 - self.args = args
35 + self.args = args
36
37 def chandevget(self):
38 return self.cargs
39 @@ -135,13 +136,13 @@ class KernelArguments:
40 class BootImages:
41 # returns dictionary of (label, longlabel, devtype) pairs indexed by device
42 def getImages(self):
43 - # return a copy so users can modify it w/o affecting us
44 + # return a copy so users can modify it w/o affecting us
45
46 - dict = {}
47 - for key in self.images.keys():
48 - dict[key] = self.images[key]
49 + dict = {}
50 + for key in self.images.keys():
51 + dict[key] = self.images[key]
52
53 - return dict
54 + return dict
55
56 def setImageLabel(self, dev, label, setLong = 0):
57 if setLong:
58 @@ -154,25 +155,25 @@ class BootImages:
59
60 # default is a device
61 def setDefault(self, default):
62 - self.default = default
63 + self.default = default
64
65 def getDefault(self):
66 - return self.default
67 + return self.default
68
69 # XXX this has internal anaconda-ish knowledge. ick
70 def setup(self, diskSet, fsset):
71 - devices = {}
72 - devs = self.availableBootDevices(diskSet, fsset)
73 - for (dev, type) in devs:
74 - devices[dev] = 1
75 -
76 - # These partitions have disappeared
77 - for dev in self.images.keys():
78 - if not devices.has_key(dev): del self.images[dev]
79 -
80 - # These have appeared
81 - for (dev, type) in devs:
82 - if not self.images.has_key(dev):
83 + devices = {}
84 + devs = self.availableBootDevices(diskSet, fsset)
85 + for (dev, type) in devs:
86 + devices[dev] = 1
87 +
88 + # These partitions have disappeared
89 + for dev in self.images.keys():
90 + if not devices.has_key(dev): del self.images[dev]
91 +
92 + # These have appeared
93 + for (dev, type) in devs:
94 + if not self.images.has_key(dev):
95 if type in dosFilesystems:
96 self.images[dev] = ("Other", "Other", type)
97 elif type in ("hfs", "hfs+") and butil.getPPCMachine() == "PMac":
98 @@ -181,12 +182,12 @@ class BootImages:
99 self.images[dev] = (None, None, type)
100
101
102 - if not self.images.has_key(self.default):
103 - entry = fsset.getEntryByMountPoint('/')
104 - self.default = entry.device.getDevice()
105 - (label, longlabel, type) = self.images[self.default]
106 - if not label:
107 - self.images[self.default] = ("linux",
108 + if not self.images.has_key(self.default):
109 + entry = fsset.getEntryByMountPoint('/')
110 + self.default = entry.device.getDevice()
111 + (label, longlabel, type) = self.images[self.default]
112 + if not label:
113 + self.images[self.default] = ("linux",
114 butil.getProductName(), type)
115
116 # XXX more internal anaconda knowledge
117 @@ -208,7 +209,7 @@ class BootImages:
118 devs.append((dev, type))
119 foundDos = 1
120 except Exception, e:
121 - log("exception checking %s: %s" %(dev, e))
122 + #log("exception checking %s: %s" %(dev, e))
123 pass
124 elif ((type == 'ntfs' or type =='hpfs') and not foundDos
125 and doesDualBoot()):
126 @@ -222,7 +223,7 @@ class BootImages:
127
128 part = partedUtils.get_partition_by_name(diskSet.disks, dev)
129 if partedUtils.get_flags(part) != "boot":
130 - devs.append((dev, type))
131 + devs.append((dev, type))
132
133 slash = fsset.getEntryByMountPoint('/')
134 if not slash or not slash.device or not slash.fsystem:
135 @@ -237,16 +238,16 @@ class BootImages:
136
137
138 def __init__(self):
139 - self.default = None
140 - self.images = {}
141 + self.default = None
142 + self.images = {}
143
144
145 class bootloaderInfo:
146 def setUseGrub(self, val):
147 - pass
148 + pass
149
150 def useGrub(self):
151 - return self.useGrubVal
152 + return self.useGrubVal
153
154 def setForceLBA(self, val):
155 pass
156 @@ -276,62 +277,62 @@ class bootloaderInfo:
157 # dictionary of mounted filesystems since that's what we care about
158 def getBootloaderConfig(self, instRoot, fsset, bl, langs, kernelList,
159 chainList, defaultDev):
160 - images = bl.images.getImages()
161 + images = bl.images.getImages()
162
163 # on upgrade read in the lilo config file
164 - lilo = LiloConfigFile ()
165 - self.perms = 0600
166 + lilo = LiloConfigFile ()
167 + self.perms = 0600
168 if os.access (instRoot + self.configfile, os.R_OK):
169 - self.perms = os.stat(instRoot + self.configfile)[0] & 0777
170 - lilo.read (instRoot + self.configfile)
171 - os.rename(instRoot + self.configfile,
172 - instRoot + self.configfile + '.rpmsave')
173 + self.perms = os.stat(instRoot + self.configfile)[0] & 0777
174 + lilo.read (instRoot + self.configfile)
175 + os.rename(instRoot + self.configfile,
176 + instRoot + self.configfile + '.rpmsave')
177 # if it's an absolute symlink, just get it out of our way
178 elif (os.path.islink(instRoot + self.configfile) and
179 os.readlink(instRoot + self.configfile)[0] == '/'):
180 os.rename(instRoot + self.configfile,
181 instRoot + self.configfile + '.rpmsave')
182
183 - # Remove any invalid entries that are in the file; we probably
184 - # just removed those kernels.
185 - for label in lilo.listImages():
186 - (fsType, sl, path, other) = lilo.getImage(label)
187 - if fsType == "other": continue
188 + # Remove any invalid entries that are in the file; we probably
189 + # just removed those kernels.
190 + for label in lilo.listImages():
191 + (fsType, sl, path, other) = lilo.getImage(label)
192 + if fsType == "other": continue
193
194 - if not os.access(instRoot + sl.getPath(), os.R_OK):
195 - lilo.delImage(label)
196 + if not os.access(instRoot + sl.getPath(), os.R_OK):
197 + lilo.delImage(label)
198
199 - lilo.addEntry("prompt", replace = 0)
200 - lilo.addEntry("timeout", "20", replace = 0)
201 + lilo.addEntry("prompt", replace = 0)
202 + lilo.addEntry("timeout", "20", replace = 0)
203
204 rootDev = fsset.getEntryByMountPoint("/").device.getDevice()
205 - if not rootDev:
206 + if not rootDev:
207 raise RuntimeError, "Installing lilo, but there is no root device"
208
209 - if rootDev == defaultDev:
210 - lilo.addEntry("default", kernelList[0][0])
211 - else:
212 - lilo.addEntry("default", chainList[0][0])
213 + if rootDev == defaultDev:
214 + lilo.addEntry("default", kernelList[0][0])
215 + else:
216 + lilo.addEntry("default", chainList[0][0])
217
218 - for (label, longlabel, version) in kernelList:
219 - kernelTag = "-" + version
220 - kernelFile = self.kernelLocation + "vmlinuz" + kernelTag
221 + for (label, longlabel, version) in kernelList:
222 + kernelTag = "-" + version
223 + kernelFile = self.kernelLocation + "vmlinuz" + kernelTag
224
225 - try:
226 - lilo.delImage(label)
227 - except IndexError, msg:
228 - pass
229 + try:
230 + lilo.delImage(label)
231 + except IndexError, msg:
232 + pass
233
234 - sl = LiloConfigFile(imageType = "image", path = kernelFile)
235 + sl = LiloConfigFile(imageType = "image", path = kernelFile)
236
237 - initrd = booty.makeInitrd (kernelTag, instRoot)
238 + initrd = booty.makeInitrd (kernelTag, instRoot)
239
240 - sl.addEntry("label", label)
241 - if os.access (instRoot + initrd, os.R_OK):
242 - sl.addEntry("initrd", "%sinitrd%s.img" %(self.kernelLocation,
243 + sl.addEntry("label", label)
244 + if os.access (instRoot + initrd, os.R_OK):
245 + sl.addEntry("initrd", "%sinitrd%s.img" %(self.kernelLocation,
246 kernelTag))
247
248 - sl.addEntry("read-only")
249 + sl.addEntry("read-only")
250
251 append = "%s" %(self.args.get(),)
252 realroot = getRootDevName(initrd, fsset, rootDev, instRoot)
253 @@ -343,57 +344,57 @@ class bootloaderInfo:
254 else:
255 append = "root=%s" %(realroot,)
256
257 - if len(append) > 0:
258 - sl.addEntry('append', '"%s"' % (append,))
259 -
260 - lilo.addImage (sl)
261 + if len(append) > 0:
262 + sl.addEntry('append', '"%s"' % (append,))
263
264 - for (label, longlabel, device) in chainList:
265 + lilo.addImage (sl)
266 +
267 + for (label, longlabel, device) in chainList:
268 if ((not label) or (label == "")):
269 continue
270 - try:
271 - (fsType, sl, path, other) = lilo.getImage(label)
272 - lilo.delImage(label)
273 - except IndexError:
274 - sl = LiloConfigFile(imageType = "other",
275 + try:
276 + (fsType, sl, path, other) = lilo.getImage(label)
277 + lilo.delImage(label)
278 + except IndexError:
279 + sl = LiloConfigFile(imageType = "other",
280 path = "/dev/%s" %(device))
281 - sl.addEntry("optional")
282 -
283 - sl.addEntry("label", label)
284 - lilo.addImage (sl)
285 -
286 - # Sanity check #1. There could be aliases in sections which conflict
287 - # with the new images we just created. If so, erase those aliases
288 - imageNames = {}
289 - for label in lilo.listImages():
290 - imageNames[label] = 1
291 -
292 - for label in lilo.listImages():
293 - (fsType, sl, path, other) = lilo.getImage(label)
294 - if sl.testEntry('alias'):
295 - alias = sl.getEntry('alias')
296 - if imageNames.has_key(alias):
297 - sl.delEntry('alias')
298 - imageNames[alias] = 1
299 -
300 - # Sanity check #2. If single-key is turned on, go through all of
301 - # the image names (including aliases) (we just built the list) and
302 - # see if single-key will still work.
303 - if lilo.testEntry('single-key'):
304 - singleKeys = {}
305 - turnOff = 0
306 - for label in imageNames.keys():
307 - l = label[0]
308 - if singleKeys.has_key(l):
309 - turnOff = 1
310 - singleKeys[l] = 1
311 - if turnOff:
312 - lilo.delEntry('single-key')
313 + sl.addEntry("optional")
314 +
315 + sl.addEntry("label", label)
316 + lilo.addImage (sl)
317 +
318 + # Sanity check #1. There could be aliases in sections which conflict
319 + # with the new images we just created. If so, erase those aliases
320 + imageNames = {}
321 + for label in lilo.listImages():
322 + imageNames[label] = 1
323 +
324 + for label in lilo.listImages():
325 + (fsType, sl, path, other) = lilo.getImage(label)
326 + if sl.testEntry('alias'):
327 + alias = sl.getEntry('alias')
328 + if imageNames.has_key(alias):
329 + sl.delEntry('alias')
330 + imageNames[alias] = 1
331 +
332 + # Sanity check #2. If single-key is turned on, go through all of
333 + # the image names (including aliases) (we just built the list) and
334 + # see if single-key will still work.
335 + if lilo.testEntry('single-key'):
336 + singleKeys = {}
337 + turnOff = 0
338 + for label in imageNames.keys():
339 + l = label[0]
340 + if singleKeys.has_key(l):
341 + turnOff = 1
342 + singleKeys[l] = 1
343 + if turnOff:
344 + lilo.delEntry('single-key')
345
346 return lilo
347
348 def write(self, instRoot, fsset, bl, langs, kernelList, chainList,
349 - defaultDev, justConfig, intf = None):
350 + defaultDev, justConfig, intf = None):
351 if len(kernelList) >= 1:
352 config = self.getBootloaderConfig(instRoot, fsset, bl, langs,
353 kernelList, chainList,
354 @@ -419,6 +420,7 @@ class bootloaderInfo:
355 return args
356
357 args.append("--location=%s" % (self.defaultDevice,))
358 + args.append("--driveorder=%s" % (",".join(self.drivelist)))
359
360 if self.args.get():
361 args.append("--append=\"%s\"" %(self.args.get()))
362 @@ -437,7 +439,7 @@ class bootloaderInfo:
363 import isys
364 import flags
365 drives = isys.hardDriveDict().keys()
366 - drives.sort (isys.compareDrives)
367 + drives.sort(isys.compareDrives)
368
369 # now filter out all of the removable media unless expert mode
370 rc = []
371 @@ -447,16 +449,16 @@ class bootloaderInfo:
372 return rc
373
374 def __init__(self):
375 - self.args = KernelArguments()
376 - self.images = BootImages()
377 - self.device = None
378 + self.args = KernelArguments()
379 + self.images = BootImages()
380 + self.device = None
381 self.useLinear = 1 # only used for kickstart compatibility
382 self.defaultDevice = None # XXX hack, used by kickstart
383 self.useGrubVal = 0 # only used on x86
384 self.configfile = None
385 self.kernelLocation = "/boot/"
386 self.forceLBA32 = 0
387 - self.password = None
388 + self.password = None
389 self.pure = None
390 self.above1024 = 0
391
392 @@ -559,12 +561,12 @@ class ia64BootloaderInfo(bootloaderInfo):
393 chainList, defaultDev, justConfig):
394 config = self.getBootloaderConfig(instRoot, fsset, bl, langs,
395 kernelList, chainList, defaultDev)
396 - config.write(instRoot + self.configfile, perms = self.perms)
397 + config.write(instRoot + self.configfile, perms = self.perms)
398
399 - return ""
400 + return ""
401
402 def write(self, instRoot, fsset, bl, langs, kernelList, chainList,
403 - defaultDev, justConfig, intf):
404 + defaultDev, justConfig, intf):
405 if len(kernelList) >= 1:
406 str = self.writeLilo(instRoot, fsset, bl, langs, kernelList,
407 chainList, defaultDev, justConfig)
408 @@ -603,11 +605,11 @@ class ia64BootloaderInfo(bootloaderInfo):
409
410 def __init__(self):
411 bootloaderInfo.__init__(self)
412 - self.useGrubVal = 1
413 + self.useGrubVal = 1
414 self.kernelLocation = ""
415 self.configfile = "/boot/efi/EFI/redhat/elilo.conf"
416
417 -
418 +
419 class x86BootloaderInfo(bootloaderInfo):
420 def setPassword(self, val, isCrypted = 1):
421 if not val:
422 @@ -616,7 +618,7 @@ class x86BootloaderInfo(bootloaderInfo):
423 return
424
425 if isCrypted and self.useGrubVal == 0:
426 - log("requested crypted password with lilo; ignoring")
427 + #log("requested crypted password with lilo; ignoring")
428 self.pure = None
429 return
430 elif isCrypted:
431 @@ -626,9 +628,9 @@ class x86BootloaderInfo(bootloaderInfo):
432 salt = "$1$"
433 saltLen = 8
434
435 - for i in range(saltLen):
436 + for i in range(saltLen):
437 salt = salt + whrandom.choice (string.letters +
438 - string.digits + './')
439 + string.digits + './')
440
441 self.password = crypt.crypt (val, salt)
442 self.pure = val
443 @@ -640,14 +642,36 @@ class x86BootloaderInfo(bootloaderInfo):
444 self.forceLBA32 = val
445
446 def setUseGrub(self, val):
447 - self.useGrubVal = val
448 + self.useGrubVal = val
449 +
450 + def getPhysicalDevices(self, device):
451 + # This finds a list of devices on which the given device name resides.
452 + # Accepted values for "device" are raid1 md devices (i.e. "md0"),
453 + # physical disks ("hda"), and real partitions on physical disks
454 + # ("hda1"). Volume groups/logical volumes are not accepted.
455 + #
456 + # XXX this has internal anaconda-ish knowledge. ick.
457 + import isys
458 + import lvm
459 +
460 + if string.split(device, '/', 1)[0] in map (lambda vg: vg[0],
461 + lvm.vglist()):
462 + return []
463 +
464 + if device.startswith('md'):
465 + bootable = 0
466 + parts = checkbootloader.getRaidDisks(device, 1, stripPart=0)
467 + parts.sort()
468 + return parts
469 +
470 + return [device]
471
472 def writeGrub(self, instRoot, fsset, bl, langs, kernelList, chainList,
473 - defaultDev, justConfigFile):
474 + defaultDev, justConfigFile):
475 if len(kernelList) < 1:
476 return ""
477
478 - images = bl.images.getImages()
479 + images = bl.images.getImages()
480 rootDev = fsset.getEntryByMountPoint("/").device.getDevice()
481
482 if not os.path.isdir(instRoot + '/boot/grub/'):
483 @@ -655,46 +679,54 @@ class x86BootloaderInfo(bootloaderInfo):
484
485 # XXX old config file should be read here for upgrade
486
487 - cf = '/boot/grub/grub.conf'
488 - self.perms = 0600
489 + cf = '/boot/grub/grub.conf'
490 + self.perms = 0600
491 if os.access (instRoot + cf, os.R_OK):
492 - self.perms = os.stat(instRoot + cf)[0] & 0777
493 - os.rename(instRoot + cf,
494 - instRoot + cf + '.rpmsave')
495 + self.perms = os.stat(instRoot + cf)[0] & 0777
496 + os.rename(instRoot + cf,
497 + instRoot + cf + '.rpmsave')
498
499 grubTarget = bl.getDevice()
500 - # XXX wouldn't it be nice if grub really understood raid? :)
501 - if grubTarget.startswith('md'):
502 - ent = fsset.getEntryByDeviceName(grubTarget)
503 - grubTarget = ent.device.members[0]
504 -
505 - f = open(instRoot + cf, "w+")
506 + target = "mbr"
507 + if (grubTarget.startswith('rd/') or grubTarget.startswith('ida/') or
508 + grubTarget.startswith('cciss/') or
509 + grubTarget.startswith('sx8/') or
510 + grubTarget.startswith('mapper/')):
511 + if grubTarget[-1].isdigit():
512 + if grubTarget[-2] == 'p' or \
513 + (grubTarget[-2].isdigit() and grubTarget[-3] == 'p'):
514 + target = "partition"
515 + elif grubTarget[-1].isdigit() and not grubTarget.startswith('md'):
516 + target = "partition"
517 +
518 + f = open(instRoot + cf, "w+")
519
520 f.write("# grub.conf generated by anaconda\n")
521 f.write("#\n")
522 f.write("# Note that you do not have to rerun grub "
523 "after making changes to this file\n")
524
525 - bootDev = fsset.getEntryByMountPoint("/boot")
526 - grubPath = "/grub"
527 - cfPath = "/"
528 - if not bootDev:
529 - bootDev = fsset.getEntryByMountPoint("/")
530 - grubPath = "/boot/grub"
531 - cfPath = "/boot/"
532 + bootDev = fsset.getEntryByMountPoint("/boot")
533 + grubPath = "/grub"
534 + cfPath = "/"
535 + if not bootDev:
536 + bootDev = fsset.getEntryByMountPoint("/")
537 + grubPath = "/boot/grub"
538 + cfPath = "/boot/"
539 f.write("# NOTICE: You do not have a /boot partition. "
540 "This means that\n")
541 f.write("# all kernel and initrd paths are relative "
542 "to /, eg.\n")
543 - else:
544 + else:
545 f.write("# NOTICE: You have a /boot partition. This means "
546 "that\n")
547 f.write("# all kernel and initrd paths are relative "
548 "to /boot/, eg.\n")
549
550 - bootDev = bootDev.device.getDevice(asBoot = 1)
551 + bootDevs = self.getPhysicalDevices(bootDev.device.getDevice())
552 + bootDev = bootDev.device.getDevice()
553
554 - f.write('# root %s\n' % self.grubbyPartitionName(bootDev))
555 + f.write('# root %s\n' % self.grubbyPartitionName(bootDevs[0]))
556 f.write("# kernel %svmlinuz-version ro "
557 "root=/dev/%s\n" % (cfPath, rootDev))
558 f.write("# initrd %sinitrd-version.img\n" % (cfPath))
559 @@ -741,46 +773,46 @@ class x86BootloaderInfo(bootloaderInfo):
560 # we only want splashimage if they're not using a serial console
561 if os.access("%s/boot/grub/splash.xpm.gz" %(instRoot,), os.R_OK):
562 f.write('splashimage=%s%sgrub/splash.xpm.gz\n'
563 - % (self.grubbyPartitionName(bootDev), cfPath))
564 + % (self.grubbyPartitionName(bootDevs[0]), cfPath))
565 f.write("hiddenmenu\n")
566
567 - usedDevs[bootDev] = 1
568 - usedDevs[grubTarget] = 1
569 -
570 + for dev in self.getPhysicalDevices(grubTarget):
571 + usedDevs[dev] = 1
572 +
573 if self.password:
574 f.write('password --md5 %s\n' %(self.password))
575
576 - for (label, longlabel, version) in kernelList:
577 - kernelTag = "-" + version
578 - kernelFile = "%svmlinuz%s" % (cfPath, kernelTag)
579 + for (label, longlabel, version) in kernelList:
580 + kernelTag = "-" + version
581 + kernelFile = "%svmlinuz%s" % (cfPath, kernelTag)
582
583 - initrd = booty.makeInitrd (kernelTag, instRoot)
584 + initrd = booty.makeInitrd (kernelTag, instRoot)
585
586 - f.write('title %s (%s)\n' % (longlabel, version))
587 - f.write('\troot %s\n' % self.grubbyPartitionName(bootDev))
588 + f.write('title %s (%s)\n' % (longlabel, version))
589 + f.write('\troot %s\n' % self.grubbyPartitionName(bootDevs[0]))
590
591 realroot = getRootDevName(initrd, fsset, rootDev, instRoot)
592 realroot = " root=%s" %(realroot,)
593
594 f.write('\tkernel %s ro%s' % (kernelFile, realroot))
595 - if self.args.get():
596 - f.write(' %s' % self.args.get())
597 - f.write('\n')
598 + if self.args.get():
599 + f.write(' %s' % self.args.get())
600 + f.write('\n')
601
602 - if os.access (instRoot + initrd, os.R_OK):
603 - f.write('\tinitrd %sinitrd%s.img\n' % (cfPath, kernelTag))
604 + if os.access (instRoot + initrd, os.R_OK):
605 + f.write('\tinitrd %sinitrd%s.img\n' % (cfPath, kernelTag))
606
607 - for (label, longlabel, device) in chainList:
608 + for (label, longlabel, device) in chainList:
609 if ((not longlabel) or (longlabel == "")):
610 continue
611 - f.write('title %s\n' % (longlabel))
612 - f.write('\trootnoverify %s\n' % self.grubbyPartitionName(device))
613 + f.write('title %s\n' % (longlabel))
614 + f.write('\trootnoverify %s\n' % self.grubbyPartitionName(device))
615 # f.write('\tmakeactive\n')
616 f.write('\tchainloader +1')
617 - f.write('\n')
618 + f.write('\n')
619 usedDevs[device] = 1
620
621 - f.close()
622 + f.close()
623 os.chmod(instRoot + "/boot/grub/grub.conf", self.perms)
624
625 try:
626 @@ -801,32 +833,39 @@ class x86BootloaderInfo(bootloaderInfo):
627 except:
628 pass
629
630 + for dev in self.getPhysicalDevices(rootDev) + bootDevs:
631 + usedDevs[dev] = 1
632
633 if not os.access(instRoot + "/boot/grub/device.map", os.R_OK):
634 f = open(instRoot + "/boot/grub/device.map", "w+")
635 f.write("# this device map was generated by anaconda\n")
636 - f.write("(fd0) /dev/fd0\n")
637 devs = usedDevs.keys()
638 - devs.sort()
639 usedDevs = {}
640 for dev in devs:
641 drive = getDiskPart(dev)[0]
642 if usedDevs.has_key(drive):
643 continue
644 - f.write("(%s) /dev/%s\n" % (self.grubbyDiskName(drive),
645 - drive))
646 usedDevs[drive] = 1
647 + devs = usedDevs.keys()
648 + devs.sort()
649 + for drive in devs:
650 + # XXX hack city. If they're not the sort of thing that'll
651 + # be in the device map, they shouldn't still be in the list.
652 + if not drive.startswith('md'):
653 + f.write("(%s) /dev/%s\n" % (self.grubbyDiskName(drive),
654 + drive))
655 f.close()
656
657 - args = "--stage2=/boot/grub/stage2 "
658 if self.forceLBA32:
659 - args = "%s--force-lba " % (args,)
660 + forcelba = "--force-lba "
661 + else:
662 + forcelba = ""
663
664 sysconf = '/etc/sysconfig/grub'
665 if os.access (instRoot + sysconf, os.R_OK):
666 - self.perms = os.stat(instRoot + sysconf)[0] & 0777
667 - os.rename(instRoot + sysconf,
668 - instRoot + sysconf + '.rpmsave')
669 + self.perms = os.stat(instRoot + sysconf)[0] & 0777
670 + os.rename(instRoot + sysconf,
671 + instRoot + sysconf + '.rpmsave')
672 # if it's an absolute symlink, just get it out of our way
673 elif (os.path.islink(instRoot + sysconf) and
674 os.readlink(instRoot + sysconf)[0] == '/'):
675 @@ -834,20 +873,33 @@ class x86BootloaderInfo(bootloaderInfo):
676 instRoot + sysconf + '.rpmsave')
677 f = open(instRoot + sysconf, 'w+')
678 f.write("boot=/dev/%s\n" %(grubTarget,))
679 + # XXX forcelba never gets read back...
680 if self.forceLBA32:
681 f.write("forcelba=1\n")
682 else:
683 f.write("forcelba=0\n")
684 f.close()
685
686 - part = self.grubbyPartitionName(bootDev)
687 - prefix = "%s/%s" % (self.grubbyPartitionName(bootDev), grubPath)
688 - cmd = "root %s\ninstall %s%s/stage1 d %s %s/stage2 p %s%s/grub.conf" % \
689 - (part, args, grubPath, self.grubbyPartitionName(grubTarget),
690 - grubPath, part, grubPath)
691 + cmds = []
692 + for bootDev in bootDevs:
693 + gtDisk = self.grubbyPartitionName(getDiskPart(bootDev)[0])
694 + bPart = self.grubbyPartitionName(bootDev)
695
696 + stage1Target = gtDisk
697 + if target == "partition":
698 + stage1Target = self.grubbyPartitionName(bootDev)
699 +
700 + cmd = "root %s\nsetup %s" % (bPart, stage1Target)
701 + cmds.append(cmd)
702 +
703 if not justConfigFile:
704 - log("GRUB command %s", cmd)
705 + #log("GRUB commands:")
706 + #for cmd in cmds:
707 + # log("\t%s\n", cmd)
708 + if cfPath == "/":
709 + syncDataToDisk(bootDev, "/boot", instRoot)
710 + else:
711 + syncDataToDisk(bootDev, "/", instRoot)
712
713 # copy the stage files over into /boot
714 rhpl.executil.execWithRedirect( "/sbin/grub-install",
715 @@ -855,27 +907,29 @@ class x86BootloaderInfo(bootloaderInfo):
716 stdout = "/dev/tty5", stderr = "/dev/tty5",
717 root = instRoot)
718
719 -
720 -
721 - # FIXME: hack to try to make sure everything is written to the disk
722 - if cfPath == "/":
723 - syncDataToDisk(bootDev, "/boot", instRoot)
724 - else:
725 - syncDataToDisk(bootDev, "/", instRoot)
726 -
727 # really install the bootloader
728 - p = os.pipe()
729 - os.write(p[1], cmd + '\n')
730 - os.close(p[1])
731 - rhpl.executil.execWithRedirect('/sbin/grub' ,
732 - [ "grub", "--batch", "--no-floppy",
733 + for cmd in cmds:
734 + p = os.pipe()
735 + os.write(p[1], cmd + '\n')
736 + os.close(p[1])
737 + import time
738 +
739 + # FIXME: hack to try to make sure everything is written
740 + # to the disk
741 + if cfPath == "/":
742 + syncDataToDisk(bootDev, "/boot", instRoot)
743 + else:
744 + syncDataToDisk(bootDev, "/", instRoot)
745 +
746 + rhpl.executil.execWithRedirect('/sbin/grub' ,
747 + [ "grub", "--batch", "--no-floppy",
748 "--device-map=/boot/grub/device.map" ],
749 stdin = p[0],
750 - stdout = "/dev/tty5", stderr = "/dev/tty5",
751 - root = instRoot)
752 - os.close(p[0])
753 + stdout = "/dev/tty5", stderr = "/dev/tty5",
754 + root = instRoot)
755 + os.close(p[0])
756
757 - return ""
758 + return ""
759
760 def grubbyDiskName(self, name):
761 return "hd%d" % self.drivelist.index(name)
762 @@ -895,11 +949,11 @@ class x86BootloaderInfo(bootloaderInfo):
763 kernelList, chainList,
764 defaultDev)
765
766 - liloTarget = bl.getDevice()
767 + liloTarget = bl.getDevice()
768
769 - config.addEntry("boot", '/dev/' + liloTarget, replace = 0)
770 - config.addEntry("map", "/boot/map", replace = 0)
771 - config.addEntry("install", "/boot/boot.b", replace = 0)
772 + config.addEntry("boot", '/dev/' + liloTarget, replace = 0)
773 + config.addEntry("map", "/boot/map", replace = 0)
774 + config.addEntry("install", "/boot/boot.b", replace = 0)
775 message = "/boot/message"
776
777 if self.pure is not None and not self.useGrubVal:
778 @@ -1013,7 +1067,6 @@ class x86BootloaderInfo(bootloaderInfo):
779 f.close()
780 for line in lines:
781 if line.startswith(stanza):
782 - import checkbootloader
783 theDev = checkbootloader.getBootDevString(line)
784 break
785 if theDev is not None:
786 @@ -1028,6 +1081,7 @@ class x86BootloaderInfo(bootloaderInfo):
787 if not os.access(instRoot + sysconf, os.R_OK):
788 f = open(instRoot + sysconf, "w+")
789 f.write("boot=%s\n" %(theDev,))
790 + # XXX forcelba never gets read back at all...
791 if self.forceLBA32:
792 f.write("forcelba=1\n")
793 else:
794 @@ -1037,54 +1091,77 @@ class x86BootloaderInfo(bootloaderInfo):
795 # more suckage. grub-install can't work without a valid /etc/mtab
796 # so we have to do shenanigans to get updated grub installed...
797 # steal some more code above
798 - bootDev = fsset.getEntryByMountPoint("/boot")
799 - grubPath = "/grub"
800 - cfPath = "/"
801 - if not bootDev:
802 - bootDev = fsset.getEntryByMountPoint("/")
803 - grubPath = "/boot/grub"
804 - cfPath = "/boot/"
805 - bootDev = bootDev.device.getDevice(asBoot = 1)
806 + bootDev = fsset.getEntryByMountPoint("/boot")
807 + grubPath = "/grub"
808 + cfPath = "/"
809 + if not bootDev:
810 + bootDev = fsset.getEntryByMountPoint("/")
811 + grubPath = "/boot/grub"
812 + cfPath = "/boot/"
813 +
814 + masterBootDev = bootDev.device.getDevice(asBoot = 0)
815 + if masterBootDev[0:2] == 'md':
816 + rootDevs = checkbootloader.getRaidDisks(masterBootDev, raidLevel=1,
817 + stripPart = 0)
818 + else:
819 + rootDevs = [masterBootDev]
820 +
821 + if theDev[5:7] == 'md':
822 + stage1Devs = checkbootloader.getRaidDisks(theDev[5:], raidLevel=1)
823 + else:
824 + stage1Devs = [theDev[5:]]
825
826 - part = self.grubbyPartitionName(bootDev)
827 - prefix = "%s/%s" % (self.grubbyPartitionName(bootDev), grubPath)
828 - args = "--stage2=/boot/grub/stage2 "
829 - cmd = "root %s\ninstall %s%s/stage1 d %s %s/stage2 p %s%s/grub.conf" % \
830 - (part, args, grubPath, self.grubbyPartitionName(theDev[5:]),
831 - grubPath, part, grubPath)
832 + for stage1Dev in stage1Devs:
833 + # cross fingers; if we can't find a root device on the same
834 + # hardware as this boot device, we just blindly hope the first
835 + # thing in the list works.
836 +
837 + grubbyStage1Dev = self.grubbyPartitionName(stage1Dev)
838 +
839 + grubbyRootPart = self.grubbyPartitionName(rootDevs[0])
840 +
841 + for rootDev in rootDevs:
842 + testGrubbyRootDev = getDiskPart(rootDev)[0]
843 + testGrubbyRootDev = self.grubbyPartitionName(testGrubbyRootDev)
844 +
845 + if grubbyStage1Dev == testGrubbyRootDev:
846 + grubbyRootPart = self.grubbyPartitionName(rootDev)
847 + break
848 +
849 + cmd = "root %s\nsetup %s" % (grubbyRootPart, grubbyStage1Dev)
850
851 - if not justConfigFile:
852 - log("GRUB command %s", cmd)
853 + if not justConfigFile:
854 + #log("GRUB command %s", cmd)
855
856 - # copy the stage files over into /boot
857 - rhpl.executil.execWithRedirect( "/sbin/grub-install",
858 + # copy the stage files over into /boot
859 + rhpl.executil.execWithRedirect( "/sbin/grub-install",
860 ["/sbin/grub-install", "--just-copy"],
861 stdout = "/dev/tty5", stderr = "/dev/tty5",
862 root = instRoot)
863
864 - # get the stage files synced to disk
865 - import isys
866 - isys.sync()
867 - isys.sync()
868 - isys.sync()
869 + # get the stage files synced to disk
870 + import isys
871 + isys.sync()
872 + isys.sync()
873 + isys.sync()
874
875 - # really install the bootloader
876 - p = os.pipe()
877 - os.write(p[1], cmd + '\n')
878 - os.close(p[1])
879 - rhpl.executil.execWithRedirect('/sbin/grub' ,
880 + # really install the bootloader
881 + p = os.pipe()
882 + os.write(p[1], cmd + '\n')
883 + os.close(p[1])
884 + rhpl.executil.execWithRedirect('/sbin/grub' ,
885 [ "grub", "--batch", "--no-floppy",
886 "--device-map=/boot/grub/device.map" ],
887 stdin = p[0],
888 stdout = "/dev/tty5", stderr = "/dev/tty5",
889 root = instRoot)
890 - os.close(p[0])
891 -
892 - return ""
893 + os.close(p[0])
894 +
895 + return ""
896
897
898 def write(self, instRoot, fsset, bl, langs, kernelList, chainList,
899 - defaultDev, justConfig, intf):
900 + defaultDev, justConfig, intf):
901 # XXX HACK ALERT - see declaration above
902 if self.doUpgradeOnly:
903 if not self.useGrubVal:
904 @@ -1098,7 +1175,7 @@ class x86BootloaderInfo(bootloaderInfo):
905
906 # and the hacks continue. with 2.6, ide-scsi isn't used
907 # anymore (#116622)
908 - import isys
909 + import isys
910 cdrw = isys.ideCdRwList()
911 torem = []
912 for device in cdrw:
913 @@ -1154,7 +1231,7 @@ class x86BootloaderInfo(bootloaderInfo):
914 def __init__(self):
915 bootloaderInfo.__init__(self)
916 # XXX use checkbootloader to determine what to default to
917 - self.useGrubVal = 1
918 + self.useGrubVal = 1
919 self.kernelLocation = "/boot/"
920 self.configfile = "/etc/lilo.conf"
921 self.password = None
922 @@ -1163,170 +1240,170 @@ class x86BootloaderInfo(bootloaderInfo):
923 class s390BootloaderInfo(bootloaderInfo):
924 def getBootloaderConfig(self, instRoot, fsset, bl, langs, kernelList,
925 chainList, defaultDev):
926 - images = bl.images.getImages()
927 + images = bl.images.getImages()
928
929 # on upgrade read in the lilo config file
930 - lilo = LiloConfigFile ()
931 - self.perms = 0600
932 + lilo = LiloConfigFile ()
933 + self.perms = 0600
934 if os.access (instRoot + self.configfile, os.R_OK):
935 - self.perms = os.stat(instRoot + self.configfile)[0] & 0777
936 - lilo.read (instRoot + self.configfile)
937 - os.rename(instRoot + self.configfile,
938 - instRoot + self.configfile + '.rpmsave')
939 + self.perms = os.stat(instRoot + self.configfile)[0] & 0777
940 + lilo.read (instRoot + self.configfile)
941 + os.rename(instRoot + self.configfile,
942 + instRoot + self.configfile + '.rpmsave')
943
944 - # Remove any invalid entries that are in the file; we probably
945 - # just removed those kernels.
946 - for label in lilo.listImages():
947 - (fsType, sl, path, other) = lilo.getImage(label)
948 - if fsType == "other": continue
949 + # Remove any invalid entries that are in the file; we probably
950 + # just removed those kernels.
951 + for label in lilo.listImages():
952 + (fsType, sl, path, other) = lilo.getImage(label)
953 + if fsType == "other": continue
954
955 - if not os.access(instRoot + sl.getPath(), os.R_OK):
956 - lilo.delImage(label)
957 + if not os.access(instRoot + sl.getPath(), os.R_OK):
958 + lilo.delImage(label)
959
960 rootDev = fsset.getEntryByMountPoint("/").device.getDevice()
961 - if not rootDev:
962 + if not rootDev:
963 raise RuntimeError, "Installing zipl, but there is no root device"
964
965 - if rootDev == defaultDev:
966 - lilo.addEntry("default", kernelList[0][0])
967 - else:
968 - lilo.addEntry("default", chainList[0][0])
969 + if rootDev == defaultDev:
970 + lilo.addEntry("default", kernelList[0][0])
971 + else:
972 + lilo.addEntry("default", chainList[0][0])
973
974 - for (label, longlabel, version) in kernelList:
975 - kernelTag = "-" + version
976 - kernelFile = self.kernelLocation + "vmlinuz" + kernelTag
977 + for (label, longlabel, version) in kernelList:
978 + kernelTag = "-" + version
979 + kernelFile = self.kernelLocation + "vmlinuz" + kernelTag
980
981 - try:
982 - lilo.delImage(label)
983 - except IndexError, msg:
984 - pass
985 + try:
986 + lilo.delImage(label)
987 + except IndexError, msg:
988 + pass
989
990 - sl = LiloConfigFile(imageType = "image", path = kernelFile)
991 + sl = LiloConfigFile(imageType = "image", path = kernelFile)
992
993 - initrd = booty.makeInitrd (kernelTag, instRoot)
994 + initrd = booty.makeInitrd (kernelTag, instRoot)
995
996 - sl.addEntry("label", label)
997 - if os.access (instRoot + initrd, os.R_OK):
998 - sl.addEntry("initrd",
999 + sl.addEntry("label", label)
1000 + if os.access (instRoot + initrd, os.R_OK):
1001 + sl.addEntry("initrd",
1002 "%sinitrd%s.img" %(self.kernelLocation, kernelTag))
1003
1004 - sl.addEntry("read-only")
1005 - sl.addEntry("root", '/dev/' + rootDev)
1006 + sl.addEntry("read-only")
1007 + sl.addEntry("root", '/dev/' + rootDev)
1008 sl.addEntry("ipldevice", '/dev/' + rootDev[:-1])
1009
1010 - if self.args.get():
1011 - sl.addEntry('append', '"%s"' % self.args.get())
1012 -
1013 - lilo.addImage (sl)
1014 + if self.args.get():
1015 + sl.addEntry('append', '"%s"' % self.args.get())
1016 +
1017 + lilo.addImage (sl)
1018
1019 - for (label, longlabel, device) in chainList:
1020 + for (label, longlabel, device) in chainList:
1021 if ((not label) or (label == "")):
1022 continue
1023 - try:
1024 - (fsType, sl, path, other) = lilo.getImage(label)
1025 - lilo.delImage(label)
1026 - except IndexError:
1027 - sl = LiloConfigFile(imageType = "other",
1028 + try:
1029 + (fsType, sl, path, other) = lilo.getImage(label)
1030 + lilo.delImage(label)
1031 + except IndexError:
1032 + sl = LiloConfigFile(imageType = "other",
1033 path = "/dev/%s" %(device))
1034 - sl.addEntry("optional")
1035 -
1036 - sl.addEntry("label", label)
1037 - lilo.addImage (sl)
1038 -
1039 - # Sanity check #1. There could be aliases in sections which conflict
1040 - # with the new images we just created. If so, erase those aliases
1041 - imageNames = {}
1042 - for label in lilo.listImages():
1043 - imageNames[label] = 1
1044 -
1045 - for label in lilo.listImages():
1046 - (fsType, sl, path, other) = lilo.getImage(label)
1047 - if sl.testEntry('alias'):
1048 - alias = sl.getEntry('alias')
1049 - if imageNames.has_key(alias):
1050 - sl.delEntry('alias')
1051 - imageNames[alias] = 1
1052 -
1053 - # Sanity check #2. If single-key is turned on, go through all of
1054 - # the image names (including aliases) (we just built the list) and
1055 - # see if single-key will still work.
1056 - if lilo.testEntry('single-key'):
1057 - singleKeys = {}
1058 - turnOff = 0
1059 - for label in imageNames.keys():
1060 - l = label[0]
1061 - if singleKeys.has_key(l):
1062 - turnOff = 1
1063 - singleKeys[l] = 1
1064 - if turnOff:
1065 - lilo.delEntry('single-key')
1066 + sl.addEntry("optional")
1067 +
1068 + sl.addEntry("label", label)
1069 + lilo.addImage (sl)
1070 +
1071 + # Sanity check #1. There could be aliases in sections which conflict
1072 + # with the new images we just created. If so, erase those aliases
1073 + imageNames = {}
1074 + for label in lilo.listImages():
1075 + imageNames[label] = 1
1076 +
1077 + for label in lilo.listImages():
1078 + (fsType, sl, path, other) = lilo.getImage(label)
1079 + if sl.testEntry('alias'):
1080 + alias = sl.getEntry('alias')
1081 + if imageNames.has_key(alias):
1082 + sl.delEntry('alias')
1083 + imageNames[alias] = 1
1084 +
1085 + # Sanity check #2. If single-key is turned on, go through all of
1086 + # the image names (including aliases) (we just built the list) and
1087 + # see if single-key will still work.
1088 + if lilo.testEntry('single-key'):
1089 + singleKeys = {}
1090 + turnOff = 0
1091 + for label in imageNames.keys():
1092 + l = label[0]
1093 + if singleKeys.has_key(l):
1094 + turnOff = 1
1095 + singleKeys[l] = 1
1096 + if turnOff:
1097 + lilo.delEntry('single-key')
1098
1099 return lilo
1100
1101 def writeChandevConf(self, bl, instroot): # S/390 only
1102 - cf = "/etc/chandev.conf"
1103 - self.perms = 0644
1104 + cf = "/etc/chandev.conf"
1105 + self.perms = 0644
1106 if bl.args.chandevget():
1107 - fd = os.open(instroot + "/etc/chandev.conf",
1108 + fd = os.open(instroot + "/etc/chandev.conf",
1109 os.O_WRONLY | os.O_CREAT)
1110 os.write(fd, "noauto\n")
1111 - for cdev in bl.args.chandevget():
1112 - os.write(fd,'%s\n' % cdev)
1113 - os.close(fd)
1114 - return ""
1115 -
1116 + for cdev in bl.args.chandevget():
1117 + os.write(fd,'%s\n' % cdev)
1118 + os.close(fd)
1119 + return ""
1120 +
1121
1122 def writeZipl(self, instRoot, fsset, bl, langs, kernelList, chainList,
1123 - defaultDev, justConfigFile):
1124 - images = bl.images.getImages()
1125 + defaultDev, justConfigFile):
1126 + images = bl.images.getImages()
1127 rootDev = fsset.getEntryByMountPoint("/").device.getDevice()
1128
1129 - cf = '/etc/zipl.conf'
1130 - self.perms = 0600
1131 + cf = '/etc/zipl.conf'
1132 + self.perms = 0600
1133 if os.access (instRoot + cf, os.R_OK):
1134 - self.perms = os.stat(instRoot + cf)[0] & 0777
1135 - os.rename(instRoot + cf,
1136 - instRoot + cf + '.rpmsave')
1137 + self.perms = os.stat(instRoot + cf)[0] & 0777
1138 + os.rename(instRoot + cf,
1139 + instRoot + cf + '.rpmsave')
1140
1141 - f = open(instRoot + cf, "w+")
1142 + f = open(instRoot + cf, "w+")
1143
1144 - f.write('[defaultboot]\n')
1145 - f.write('default=' + kernelList[0][0] + '\n')
1146 - f.write('target=%s\n' % (self.kernelLocation))
1147 + f.write('[defaultboot]\n')
1148 + f.write('default=' + kernelList[0][0] + '\n')
1149 + f.write('target=%s\n' % (self.kernelLocation))
1150
1151 cfPath = "/boot/"
1152 - for (label, longlabel, version) in kernelList:
1153 - kernelTag = "-" + version
1154 - kernelFile = "%svmlinuz%s" % (cfPath, kernelTag)
1155 -
1156 - initrd = booty.makeInitrd (kernelTag, instRoot)
1157 - f.write('[%s]\n' % (label))
1158 - f.write('\timage=%s\n' % (kernelFile))
1159 - if os.access (instRoot + initrd, os.R_OK):
1160 - f.write('\tramdisk=%sinitrd%s.img\n' %(self.kernelLocation,
1161 + for (label, longlabel, version) in kernelList:
1162 + kernelTag = "-" + version
1163 + kernelFile = "%svmlinuz%s" % (cfPath, kernelTag)
1164 +
1165 + initrd = booty.makeInitrd (kernelTag, instRoot)
1166 + f.write('[%s]\n' % (label))
1167 + f.write('\timage=%s\n' % (kernelFile))
1168 + if os.access (instRoot + initrd, os.R_OK):
1169 + f.write('\tramdisk=%sinitrd%s.img\n' %(self.kernelLocation,
1170 kernelTag))
1171 realroot = getRootDevName(initrd, fsset, rootDev, instRoot)
1172 - f.write('\tparameters="root=%s' %(realroot,))
1173 - if bl.args.get():
1174 - f.write(' %s' % (bl.args.get()))
1175 - f.write('"\n')
1176 + f.write('\tparameters="root=%s' %(realroot,))
1177 + if bl.args.get():
1178 + f.write(' %s' % (bl.args.get()))
1179 + f.write('"\n')
1180
1181 - f.close()
1182 + f.close()
1183
1184 - if not justConfigFile:
1185 + if not justConfigFile:
1186 argv = [ "/sbin/zipl" ]
1187 rhpl.executil.execWithRedirect(argv[0], argv, root = instRoot,
1188 stdout = "/dev/stdout",
1189 stderr = "/dev/stderr")
1190
1191 - return ""
1192 + return ""
1193
1194 def write(self, instRoot, fsset, bl, langs, kernelList, chainList,
1195 - defaultDev, justConfig, intf):
1196 + defaultDev, justConfig, intf):
1197 str = self.writeZipl(instRoot, fsset, bl, langs, kernelList,
1198 chainList, defaultDev,
1199 justConfig | (not self.useZiplVal))
1200 - str = self.writeChandevConf(bl, instRoot)
1201 + str = self.writeChandevConf(bl, instRoot)
1202
1203 def __init__(self):
1204 bootloaderInfo.__init__(self)
1205 @@ -1424,7 +1501,7 @@ class alphaBootloaderInfo(bootloaderInfo):
1206 # We get all the kernels we need to know about in kernelList.
1207
1208 for (kernel, tag, kernelTag) in kernelList:
1209 - kernelFile = "%svmlinuz-%s" %(kernelPath, kernelTag)
1210 + kernelFile = "%svmlinuz-%s" %(kernelPath, kernelTag)
1211
1212 f.write("%d:%d%s" %(lines, bpn, kernelFile))
1213
1214 @@ -1458,7 +1535,7 @@ class alphaBootloaderInfo(bootloaderInfo):
1215 # to and the second argument is a path to the bootstrap loader
1216 # file.
1217 args = ("swriteboot", ("/dev/%s" % wbd), "/boot/bootlx")
1218 - log("swriteboot command: %s" %(args,))
1219 + #log("swriteboot command: %s" %(args,))
1220 rhpl.executil.execWithRedirect ('/sbin/swriteboot', args,
1221 root = instRoot,
1222 stdout = "/dev/tty5",
1223 @@ -1470,7 +1547,7 @@ class alphaBootloaderInfo(bootloaderInfo):
1224 # It's always the boot partition whether it's / or /boot (with
1225 # the mount point being omitted.)
1226 args = ("abootconf", ("/dev/%s" % wbd), str (bdpn))
1227 - log("abootconf command: %s" %(args,))
1228 + #log("abootconf command: %s" %(args,))
1229 rhpl.executil.execWithRedirect ('/sbin/abootconf', args,
1230 root = instRoot,
1231 stdout = "/dev/tty5",
1232 @@ -1478,7 +1555,7 @@ class alphaBootloaderInfo(bootloaderInfo):
1233
1234
1235 def write(self, instRoot, fsset, bl, langs, kernelList, chainList,
1236 - defaultDev, justConfig, intf):
1237 + defaultDev, justConfig, intf):
1238 if len(kernelList) < 1:
1239 self.noKernelsWarn(intf)
1240
1241 @@ -1495,7 +1572,7 @@ class alphaBootloaderInfo(bootloaderInfo):
1242
1243 def __init__(self):
1244 bootloaderInfo.__init__(self)
1245 - self.useGrubVal = 0
1246 + self.useGrubVal = 0
1247 self.configfile = "/etc/aboot.conf"
1248 # self.kernelLocation is already set to what we need.
1249 self.password = None
1250 @@ -1526,10 +1603,11 @@ class ppcBootloaderInfo(bootloaderInfo):
1251
1252 return devs
1253
1254 +
1255 def writeYaboot(self, instRoot, fsset, bl, langs, kernelList,
1256 chainList, defaultDev, justConfigFile):
1257
1258 - from flags import flags
1259 + from flags import flags
1260
1261 yabootTarget = string.join(self.getBootDevs(fsset, bl))
1262
1263 @@ -1554,26 +1632,49 @@ class ppcBootloaderInfo(bootloaderInfo):
1264 %(butil.getProductName(),))
1265
1266 (name, partNum) = getDiskPart(bootDev)
1267 - partno = partNum + 1 # 1 based
1268 + if rhpl.getPPCMachine() == "Pegasos":
1269 + partno = partNum # Pegasos firmware is broken
1270 + else:
1271 + partno = partNum + 1 # 1 based
1272 f.write("partition=%s\n" %(partno,))
1273
1274 - f.write("timeout=20\n")
1275 + f.write("timeout=80\n")
1276 f.write("install=/usr/lib/yaboot/yaboot\n")
1277 f.write("delay=5\n")
1278 -
1279 - if butil.getPPCMachine() == "PMac":
1280 + f.write("enablecdboot\n")
1281 + f.write("enableofboot\n")
1282 + f.write("enablenetboot\n")
1283 +
1284 + yabootProg = "/sbin/mkofboot"
1285 + if rhpl.getPPCMachine() == "PMac":
1286 + # write out the first hfs/hfs+ partition as being macosx
1287 + for (label, longlabel, device) in chainList:
1288 + if ((not label) or (label == "")):
1289 + continue
1290 + f.write("macosx=/dev/%s\n" %(device,))
1291 + break
1292 +
1293 f.write("magicboot=/usr/lib/yaboot/ofboot\n")
1294
1295 - if butil.getPPCMachine() == "pSeries":
1296 + if rhpl.getPPCMachine() == "pSeries":
1297 f.write("nonvram\n")
1298 + f.write("fstype=raw\n")
1299 +
1300 + if rhpl.getPPCMachine() == "Pegasos":
1301 + f.write("nonvram\n")
1302 + f.write("mntpoint=/boot/yaboot\n")
1303 + f.write("usemount\n")
1304 + if not os.access(instRoot + "/boot/yaboot", os.R_OK):
1305 + os.mkdir(instRoot + "/boot/yaboot")
1306 + yabootProg = "/sbin/ybin"
1307
1308 if self.password:
1309 f.write("password=%s\n" %(self.password,))
1310 f.write("restricted\n")
1311 -
1312 +
1313 f.write("\n")
1314
1315 - rootDev = fsset.getEntryByMountPoint("/").device.getDevice()
1316 + rootDev = fsset.getEntryByMountPoint("/").device.getDevice()
1317
1318 for (label, longlabel, version) in kernelList:
1319 kernelTag = "-" + version
1320 @@ -1611,14 +1712,11 @@ class ppcBootloaderInfo(bootloaderInfo):
1321 isys.sync()
1322 isys.sync()
1323
1324 - ybinargs = [ "/sbin/mkofboot", "-f", "-C", cf ]
1325 - if butil.getPPCMachine() == "pSeries":
1326 - ybinargs.extend(["--filesystem", "raw"])
1327 + ybinargs = [ yabootProg, "-f", "-C", cf ]
1328
1329 -
1330 - log("running: %s" %(ybinargs,))
1331 - if not flags.test:
1332 - rhpl.executil.execWithRedirect(ybinargs[0],
1333 + #log("running: %s" %(ybinargs,))
1334 + if not flags.test:
1335 + rhpl.executil.execWithRedirect(ybinargs[0],
1336 ybinargs,
1337 stdout = "/dev/tty5",
1338 stderr = "/dev/tty5",
1339 @@ -1629,7 +1727,7 @@ class ppcBootloaderInfo(bootloaderInfo):
1340 os.symlink("../boot/etc/yaboot.conf",
1341 instRoot + "/etc/yaboot.conf")
1342
1343 - return ""
1344 + return ""
1345
1346 def setPassword(self, val, isCrypted = 1):
1347 # yaboot just handles the password and doesn't care if its crypted
1348 @@ -1637,7 +1735,7 @@ class ppcBootloaderInfo(bootloaderInfo):
1349 self.password = val
1350
1351 def write(self, instRoot, fsset, bl, langs, kernelList, chainList,
1352 - defaultDev, justConfig, intf):
1353 + defaultDev, justConfig, intf):
1354 if len(kernelList) >= 1:
1355 str = self.writeYaboot(instRoot, fsset, bl, langs, kernelList,
1356 chainList, defaultDev, justConfig)
1357 @@ -1673,10 +1771,10 @@ class iseriesBootloaderInfo(bootloaderInfo):
1358 if len(kernelList) < 1:
1359 self.noKernelsWarn(intf)
1360 return
1361 - if len(kernelList) > 1:
1362 - # FIXME: how can this happen?
1363 - log("more than one kernel on iSeries. bailing and just using "
1364 - "the first")
1365 + #if len(kernelList) > 1:
1366 + # # FIXME: how can this happen?
1367 + # log("more than one kernel on iSeries. bailing and just using "
1368 + # "the first")
1369
1370 # iseries is Weird (tm) -- here's the basic theory
1371 # a) have /boot/vmlinitrd-$(version)
1372 @@ -1709,23 +1807,24 @@ class iseriesBootloaderInfo(bootloaderInfo):
1373 # OS/400 will load as NWSSTG
1374 bootDev = bl.getDevice()
1375 if bootDev:
1376 - log("Writing kernel %s to PReP partition %s" %(kernelFile,
1377 - bootDev))
1378 + #log("Writing kernel %s to PReP partition %s" %(kernelFile, bootDev))
1379 try:
1380 self.ddFile(instRoot + kernelFile, "%s/dev/%s" %(instRoot,
1381 bootDev))
1382 except Exception, e:
1383 # FIXME: should this be more fatal
1384 - log("Failed to write kernel: %s" %(e,))
1385 + #log("Failed to write kernel: %s" %(e,))
1386 + pass
1387 else:
1388 - log("No PReP boot partition, not writing kernel for NWSSTG")
1389 + #log("No PReP boot partition, not writing kernel for NWSSTG")
1390 + pass
1391
1392
1393 # now, it's a lot faster to boot if we don't make people go back
1394 # into OS/400, so set up side C (used by default for NWSSTG) with
1395 # our current bits
1396 for side in ("C", "B"):
1397 - log("Writing kernel and cmdline to side %s" %(side,))
1398 + #log("Writing kernel and cmdline to side %s" %(side,))
1399 wrotekernel = 0
1400 try:
1401 self.ddFile(instRoot + kernelFile,
1402 @@ -1733,7 +1832,8 @@ class iseriesBootloaderInfo(bootloaderInfo):
1403 wrotekernel = 1
1404 except Exception, e:
1405 # FIXME: should this be more fatal?
1406 - log("Failed to write kernel to side %s: %s" %(side, e))
1407 + #log("Failed to write kernel to side %s: %s" %(side, e))
1408 + pass
1409
1410 if wrotekernel == 1:
1411 try:
1412 @@ -1749,10 +1849,11 @@ class iseriesBootloaderInfo(bootloaderInfo):
1413 "%s/proc/iSeries/mf/%s/cmdline" %(instRoot,
1414 side))
1415 except Exception, e:
1416 - log("Failed to write kernel command line to side %s: %s"
1417 - %(side, e))
1418 + #log("Failed to write kernel command line to side %s: %s"
1419 + # %(side, e))
1420 + pass
1421
1422 - log("Setting default side to C")
1423 + #log("Setting default side to C")
1424 f = open(instRoot + "/proc/iSeries/mf/side", "w")
1425 f.write("C")
1426 f.close()
1427 @@ -1770,7 +1871,8 @@ class iseriesBootloaderInfo(bootloaderInfo):
1428 def getDiskPart(dev):
1429 cut = len(dev)
1430 if (dev.startswith('rd/') or dev.startswith('ida/') or
1431 - dev.startswith('cciss/') or dev.startswith('sx8/')):
1432 + dev.startswith('cciss/') or dev.startswith('sx8/') or
1433 + dev.startswith('mapper/')):
1434 if dev[-2] == 'p':
1435 cut = -1
1436 elif dev[-3] == 'p':
1437 @@ -1785,10 +1887,10 @@ def getDiskPart(dev):
1438
1439 # hack off the trailing 'p' from /dev/cciss/*, for example
1440 if name[-1] == 'p':
1441 - for letter in name:
1442 - if letter not in string.letters and letter != "/":
1443 - name = name[:-1]
1444 - break
1445 + for letter in name:
1446 + if letter not in string.letters and letter != "/":
1447 + name = name[:-1]
1448 + break
1449
1450 if cut < 0:
1451 partNum = int(dev[cut:]) - 1
1452 diff --git a/checkbootloader.py b/checkbootloader.py
1453 index 604d3fd..4b51056 100644
1454 --- a/checkbootloader.py
1455 +++ b/checkbootloader.py
1456 @@ -4,8 +4,9 @@
1457 # being used on the system.
1458 #
1459 # Jeremy Katz <katzj@redhat.com>
1460 +# Peter Jones <pjones@redhat.com>
1461 #
1462 -# Copyright 2001 Red Hat, Inc.
1463 +# Copyright 2001,2005 Red Hat, Inc.
1464 #
1465 # This software may be freely redistributed under the terms of the GNU
1466 # library public license.
1467 @@ -14,12 +15,13 @@
1468 # along with this program; if not, write to the Free Software
1469 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
1470
1471 -import os,sys
1472 +import os
1473 import string
1474
1475 grubConfigFile = "/boot/grub/grub.conf"
1476 liloConfigFile = "/etc/lilo.conf"
1477 yabootConfigFile = "/etc/yaboot.conf"
1478 +siloConfigFile = "/etc/silo.conf"
1479
1480
1481 # XXX: this is cut and pasted directly from booty/bootloaderInfo.py
1482 @@ -43,10 +45,10 @@ def getDiskPart(dev):
1483
1484 # hack off the trailing 'p' from /dev/cciss/*, for example
1485 if name[-1] == 'p':
1486 - for letter in name:
1487 - if letter not in string.letters and letter != "/":
1488 - name = name[:-1]
1489 - break
1490 + for letter in name:
1491 + if letter not in string.letters and letter != "/":
1492 + name = name[:-1]
1493 + break
1494
1495 if cut < 0:
1496 partNum = int(dev[cut:]) - 1
1497 @@ -56,8 +58,13 @@ def getDiskPart(dev):
1498 return (name, partNum)
1499
1500
1501 -def getRaidDisks(raidDevice):
1502 +def getRaidDisks(raidDevice, raidLevel=None, stripPart=1):
1503 rc = []
1504 + if raidLevel is not None:
1505 + try:
1506 + raidLevel = "raid%d" % (int(raidLevel),)
1507 + except ValueError:
1508 + pass
1509
1510 try:
1511 f = open("/proc/mdstat", "r")
1512 @@ -69,19 +76,24 @@ def getRaidDisks(raidDevice):
1513 for line in lines:
1514 fields = string.split(line, ' ')
1515 if fields[0] == raidDevice:
1516 + if raidLevel is not None and fields[3] != raidLevel:
1517 + continue
1518 for field in fields[4:]:
1519 if string.find(field, "[") == -1:
1520 continue
1521 dev = string.split(field, '[')[0]
1522 if len(dev) == 0:
1523 continue
1524 - disk = getDiskPart(dev)[0]
1525 - rc.append(disk)
1526 + if stripPart:
1527 + disk = getDiskPart(dev)[0]
1528 + rc.append(disk)
1529 + else:
1530 + rc.append(dev)
1531
1532 return rc
1533
1534
1535 -def getBootBlock(bootDev, instRoot):
1536 +def getBootBlock(bootDev, instRoot, seekBlocks=0):
1537 """Get the boot block from bootDev. Return a 512 byte string."""
1538 block = " " * 512
1539 if bootDev is None:
1540 @@ -101,6 +113,8 @@ def getBootBlock(bootDev, instRoot):
1541 for dev in bootDevs:
1542 try:
1543 fd = os.open("%s/dev/%s" % (instRoot, dev), os.O_RDONLY)
1544 + if seekBlocks > 0:
1545 + os.lseek(fd, seekBlocks * 512, 0)
1546 block = os.read(fd, 512)
1547 os.close(fd)
1548 return block
1549 @@ -117,10 +131,19 @@ def getBootDevString(line):
1550 dev = string.replace(dev, "'", "")
1551 return dev
1552
1553 +def getBootDevList(line):
1554 + devs = string.split(line, '=')[1]
1555 + rets = []
1556 + for dev in devs:
1557 + dev = getBootDevString("=%s" % (dev,))
1558 + rets.append(dev)
1559 + return string.join(rets)
1560 +
1561 def getBootloaderTypeAndBoot(instRoot = "/"):
1562 haveGrubConf = 1
1563 haveLiloConf = 1
1564 haveYabootConf = 1
1565 + haveSiloConf = 1
1566
1567 bootDev = None
1568
1569 @@ -132,6 +155,8 @@ def getBootloaderTypeAndBoot(instRoot = "/"):
1570 haveLiloConf = 0
1571 if not os.access(instRoot + yabootConfigFile, os.R_OK):
1572 haveYabootConf = 0
1573 + if not os.access(instRoot + siloConfigFile, os.R_OK):
1574 + haveSiloConf = 0
1575
1576 if haveGrubConf:
1577 bootDev = None
1578 @@ -147,7 +172,6 @@ def getBootloaderTypeAndBoot(instRoot = "/"):
1579 f.close()
1580 for line in lines:
1581 if line.startswith(stanza):
1582 - import checkbootloader
1583 bootDev = getBootDevString(line)
1584 break
1585 if bootDev is not None:
1586 @@ -158,17 +182,13 @@ def getBootloaderTypeAndBoot(instRoot = "/"):
1587 # XXX I don't like this, but it's what the maintainer suggested :(
1588 if string.find(block, "GRUB") >= 0:
1589 return ("GRUB", bootDev)
1590 - elif instRoot != "/":
1591 - block = getBootBlock(bootDev, "/")
1592 - if string.find(block, "GRUB") >= 0:
1593 - return("GRUB", bootDev)
1594
1595 if haveLiloConf:
1596 f = open(instRoot + liloConfigFile, "r")
1597 lines = f.readlines()
1598 for line in lines:
1599 if line[0:5] == "boot=":
1600 - bootDev = getBootDevString(line)
1601 + bootDev = getBootDevString(line)
1602 break
1603
1604 block = getBootBlock(bootDev, instRoot)
1605 @@ -181,10 +201,37 @@ def getBootloaderTypeAndBoot(instRoot = "/"):
1606 lines = f.readlines()
1607 for line in lines:
1608 if line[0:5] == "boot=":
1609 - bootDev = getBootDevString(line)
1610 + bootDev = getBootDevList(line)
1611 +
1612 + if bootDev:
1613 + return ("YABOOT", bootDev)
1614
1615 - if bootDev:
1616 - return ("YABOOT", bootDev)
1617 + if haveSiloConf:
1618 + bootDev = None
1619 + # We've never done the /etc/sysconfig/silo thing, but maybe
1620 + # we should start...
1621 + for (fn, stanza) in [ ("/etc/sysconfig/silo", "boot="),
1622 + (grubConfigFile, "#boot=") ]:
1623 + try:
1624 + f = open(instRoot + fn, "r")
1625 + except:
1626 + continue
1627 +
1628 + lines = f.readlines()
1629 + f.close()
1630 + for line in lines:
1631 + if line.startswith(stanza):
1632 + bootDev = getBootDevString(line)
1633 + break
1634 + if bootDev is not None:
1635 + break
1636 +
1637 + if bootDev is not None:
1638 + # XXX SILO sucks just like grub.
1639 + if getDiskPart(bootDev)[1] != 3:
1640 + block = getBootBlock(bootDev, instRoot, 1)
1641 + if block[24:28] == "SILO":
1642 + return ("SILO", bootDev)
1643
1644 return (None, None)
1645
1646 --
1647 1.5.5.6
1648

admin@koozali.org
ViewVC Help
Powered by ViewVC 1.2.1 RSS 2.0 feed