On Wed, 2013-08-14 at 14:12 -0400, Will Woods wrote:
pSeries-style systems can have multiple PReP partitions, as long as there's only one per disk. It's kind of like the x86 MBR that way.
The current code in booty and platform.py *always* picks the first PReP partition, which will fail if if you have (e.g.) an OS already installed on /dev/sda and you're doing a new install onto /dev/sdb.
This patch adds ppcBootloaderInfo.pickPReP(), which tries to find the best PReP partition to use according to the following rules:
- If we're creating a new PReP partition, use that;
- Otherwise, if there's a PReP partition already on the disk that contains /boot, use that;
- Failing that, use the first available PReP partition (as before).
This should make mkofboot actually install yaboot into the correct PReP partition.
IPSeriesPPC.bootDevice() has been changed to use this same algorithm, so the two of them will agree about what the boot device is.
booty/ppc.py | 37 ++++++++++++++++++++++++++++++++----- platform.py | 11 ++--------- 2 files changed, 34 insertions(+), 14 deletions(-)
diff --git a/booty/ppc.py b/booty/ppc.py index 6f62071..401f505 100644 --- a/booty/ppc.py +++ b/booty/ppc.py @@ -7,6 +7,35 @@ from bootloaderInfo import * import iutil
class ppcBootloaderInfo(bootloaderInfo):
- def pickPReP(self):
# if we created a new PReP partition, pick thatfor a in self.storage.findActions(type="create", obj="format"):if a.format.type == "prepboot":return a.device# otherwise, look at the existing PReP partitions.prepdevs = []for dev in self.storage.fsset.devices:if (dev.format.type == "prepboot" anddev.partedPartition.getFlag(parted.PARTITION_BOOT)):prepdevs.append(dev)# we'd prefer a PReP partition that's on the same disk as /boot.try:bootdisk = self.storage.mountpoints["/boot"].diskexcept KeyError:bootdisk = self.storage.rootDevice.diskfor dev in prepdevs:if dev.disk == bootdisk:return dev
I think this needs to account for either /boot or / being on md, so something like this:
bootDevice = self.storage.mountpoints.get("/boot", self.storage.rootDevice) if hasattr(bootDevice, "disk"): bootdisks = [bootDevice.disk] else: bootdisks = list(set([p.disk for p in bootDevice.parents]))
for dev in prepdevs: if dev.disk in bootdisks: return dev
The rest looks okay to me. Is there a corresponding blivet patch for master?