Mailing List Archive

[RFC] bootloader improvements - pygrub-kernel-config
# HG changeset patch
# User john.levon@sun.com
# Date 1163095800 28800
# Node ID 0da173ee886e13bd4116c7d085cd4a4704ffe279
# Parent 7c80aaffe16f5e4037d10660d262ed7b22894b01
Split out bootloader-derived parameters separately from config-file-specified
ones. This allows a config file to still specify kernel/ramdisk, even if a
bootloader is being used.

Signed-off-by: John Levon <john.levon@sun.com>

diff --git a/tools/pygrub/src/pygrub b/tools/pygrub/src/pygrub
--- a/tools/pygrub/src/pygrub
+++ b/tools/pygrub/src/pygrub
@@ -514,17 +514,17 @@ if __name__ == "__main__":
fs = fsimage.open(file, offset)

kernel = fs.open_file(img.kernel[1],).read()
- (tfd, fn) = tempfile.mkstemp(prefix="vmlinuz.", dir="/var/lib/xen")
+ (tfd, fn) = tempfile.mkstemp(prefix="boot_kernel.", dir="/var/lib/xen")
os.write(tfd, kernel)
os.close(tfd)
- sxp = "linux (kernel %s)" %(fn,)
+ sxp = "linux (boot_kernel %s)" %(fn,)

if img.initrd:
initrd = fs.open_file(img.initrd[1],).read()
- (tfd, fn) = tempfile.mkstemp(prefix="initrd.", dir="/var/lib/xen")
+ (tfd, fn) = tempfile.mkstemp(prefix="boot_ramdisk.", dir="/var/lib/xen")
os.write(tfd, initrd)
os.close(tfd)
- sxp += "(ramdisk %s)" %(fn,)
+ sxp += "(boot_ramdisk %s)" %(fn,)
else:
initrd = None
sxp += "(args '%s')" %(img.args,)
diff --git a/tools/python/xen/xend/image.py b/tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py
+++ b/tools/python/xen/xend/image.py
@@ -70,7 +70,9 @@ class ImageHandler:
self.vm = vm

self.kernel = None
+ self.boot_kernel = None
self.ramdisk = None
+ self.boot_ramdisk = None
self.cmdline = None

self.configure(imageConfig, deviceConfig)
@@ -82,6 +84,14 @@ class ImageHandler:
return sxp.child_value(imageConfig, name, default)

self.kernel = get_cfg("kernel")
+ self.ramdisk = get_cfg("ramdisk", '')
+ self.boot_kernel = get_cfg("boot_kernel")
+ if not self.boot_kernel:
+ self.boot_kernel = self.kernel
+ self.boot_ramdisk = get_cfg("boot_ramdisk")
+ if not self.boot_ramdisk:
+ self.boot_ramdisk = self.ramdisk
+
self.cmdline = ""
ip = get_cfg("ip")
if ip:
@@ -92,7 +102,7 @@ class ImageHandler:
args = get_cfg("args")
if args:
self.cmdline += " " + args
- self.ramdisk = get_cfg("ramdisk", '')
+

self.vm.storeVm(("image/ostype", self.ostype),
("image/kernel", self.kernel),
@@ -101,8 +111,8 @@ class ImageHandler:


def cleanupBootloading(self):
- self.unlink(self.kernel)
- self.unlink(self.ramdisk)
+ self.unlink(self.boot_kernel)
+ self.unlink(self.boot_ramdisk)


def unlink(self, f):
@@ -125,10 +135,11 @@ class ImageHandler:
"""
# Set params and call buildDomain().

- if not os.path.isfile(self.kernel):
- raise VmError('Kernel image does not exist: %s' % self.kernel)
- if self.ramdisk and not os.path.isfile(self.ramdisk):
- raise VmError('Kernel ramdisk does not exist: %s' % self.ramdisk)
+ if not os.path.isfile(self.boot_kernel):
+ raise VmError('Kernel image does not exist: %s' % self.boot_kernel)
+ if self.boot_ramdisk and not os.path.isfile(self.boot_ramdisk):
+ raise VmError('Kernel ramdisk does not exist: %s' %
+ self.boot_ramdisk)
if len(self.cmdline) >= MAX_GUEST_CMDLINE:
log.warning('kernel cmdline too long, domain %d',
self.vm.getDomid())
@@ -193,21 +204,21 @@ class LinuxImageHandler(ImageHandler):

log.debug("domid = %d", self.vm.getDomid())
log.debug("memsize = %d", mem_mb)
- log.debug("image = %s", self.kernel)
+ log.debug("image = %s", self.boot_kernel)
log.debug("store_evtchn = %d", store_evtchn)
log.debug("console_evtchn = %d", console_evtchn)
log.debug("cmdline = %s", self.cmdline)
- log.debug("ramdisk = %s", self.ramdisk)
+ log.debug("ramdisk = %s", self.boot_ramdisk)
log.debug("vcpus = %d", self.vm.getVCpuCount())
log.debug("features = %s", self.vm.getFeatures())

return xc.linux_build(domid = self.vm.getDomid(),
memsize = mem_mb,
- image = self.kernel,
+ image = self.boot_kernel,
store_evtchn = store_evtchn,
console_evtchn = console_evtchn,
cmdline = self.cmdline,
- ramdisk = self.ramdisk,
+ ramdisk = self.boot_ramdisk,
features = self.vm.getFeatures())

class PPC_LinuxImageHandler(LinuxImageHandler):
@@ -226,11 +237,11 @@ class PPC_LinuxImageHandler(LinuxImageHa

log.debug("domid = %d", self.vm.getDomid())
log.debug("memsize = %d", mem_mb)
- log.debug("image = %s", self.kernel)
+ log.debug("image = %s", self.boot_kernel)
log.debug("store_evtchn = %d", store_evtchn)
log.debug("console_evtchn = %d", console_evtchn)
log.debug("cmdline = %s", self.cmdline)
- log.debug("ramdisk = %s", self.ramdisk)
+ log.debug("ramdisk = %s", self.boot_ramdisk)
log.debug("vcpus = %d", self.vm.getVCpuCount())
log.debug("features = %s", self.vm.getFeatures())

@@ -238,11 +249,11 @@ class PPC_LinuxImageHandler(LinuxImageHa

return xc.linux_build(domid = self.vm.getDomid(),
memsize = mem_mb,
- image = self.kernel,
+ image = self.boot_kernel,
store_evtchn = store_evtchn,
console_evtchn = console_evtchn,
cmdline = self.cmdline,
- ramdisk = self.ramdisk,
+ ramdisk = self.boot_ramdisk,
features = self.vm.getFeatures(),
arch_args = devtree.to_bin())

@@ -287,7 +298,7 @@ class HVMImageHandler(ImageHandler):
mem_mb = self.getRequiredInitialReservation() / 1024

log.debug("domid = %d", self.vm.getDomid())
- log.debug("image = %s", self.kernel)
+ log.debug("image = %s", self.boot_kernel)
log.debug("store_evtchn = %d", store_evtchn)
log.debug("memsize = %d", mem_mb)
log.debug("vcpus = %d", self.vm.getVCpuCount())
@@ -297,7 +308,7 @@ class HVMImageHandler(ImageHandler):
self.register_shutdown_watch()

return xc.hvm_build(domid = self.vm.getDomid(),
- image = self.kernel,
+ image = self.boot_kernel,
store_evtchn = store_evtchn,
memsize = mem_mb,
vcpus = self.vm.getVCpuCount(),

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Re: [RFC] bootloader improvements - pygrub-kernel-config [ In reply to ]
On Thu, Nov 09, 2006 at 07:22:40PM +0000, John Levon wrote:
>
> # HG changeset patch
> # User john.levon@sun.com
> # Date 1163095800 28800
> # Node ID 0da173ee886e13bd4116c7d085cd4a4704ffe279
> # Parent 7c80aaffe16f5e4037d10660d262ed7b22894b01
> Split out bootloader-derived parameters separately from config-file-specified
> ones. This allows a config file to still specify kernel/ramdisk, even if a
> bootloader is being used.

I'm not sure this is a good idea - its essentially completely inverting
the current semantics for bootloader/kernel params in the config files.
Currently a 'kernel' parameter will always override a 'bootloader' param,
but with this change a 'bootloader' param will always override a 'kernel'
param. I can see that both approaches have their merits, I don't think
we can ever pick one prioritization rule which satisfies everyone here
and thus for sake of compatability we should keep the current semantics
for kernel/booloader prioritization in the configs.

> diff --git a/tools/python/xen/xend/image.py b/tools/python/xen/xend/image.py
> --- a/tools/python/xen/xend/image.py
> +++ b/tools/python/xen/xend/image.py
> @@ -70,7 +70,9 @@ class ImageHandler:
> self.vm = vm
>
> self.kernel = None
> + self.boot_kernel = None
> self.ramdisk = None
> + self.boot_ramdisk = None
> self.cmdline = None
>
> self.configure(imageConfig, deviceConfig)
> @@ -82,6 +84,14 @@ class ImageHandler:
> return sxp.child_value(imageConfig, name, default)
>
> self.kernel = get_cfg("kernel")
> + self.ramdisk = get_cfg("ramdisk", '')
> + self.boot_kernel = get_cfg("boot_kernel")
> + if not self.boot_kernel:
> + self.boot_kernel = self.kernel
> + self.boot_ramdisk = get_cfg("boot_ramdisk")
> + if not self.boot_ramdisk:
> + self.boot_ramdisk = self.ramdisk
> +

This is also changing the semantics of the SEXPR exposed by XenD - previously
the ('vmlinux') and ('initrd') parameters would refer to the live kernel
in the guest, but now you'd have to look at the boot_XXX variants instead.

If we did want to change the prioritzation such that bootloader overrides
any explicit kernel/initrd, then I think we should just have the values
from bootloader directly overwrite the existing named SXPR fields rather
than adding new boot_XX fields.

Regards,
Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules: http://search.cpan.org/~danberr/ -=|
|=- Projects: http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Re: [RFC] bootloader improvements - pygrub-kernel-config [ In reply to ]
On Fri, Nov 10, 2006 at 08:14:28PM +0000, Daniel P. Berrange wrote:

> I'm not sure this is a good idea - its essentially completely inverting
> the current semantics for bootloader/kernel params in the config files.
> Currently a 'kernel' parameter will always override a 'bootloader' param,
> but with this change a 'bootloader' param will always override a 'kernel'
> param. I can see that both approaches have their merits, I don't think
> we can ever pick one prioritization rule which satisfies everyone here
> and thus for sake of compatability we should keep the current semantics
> for kernel/booloader prioritization in the configs.

Taken in concert with the other patch, the 'kernel' choice will always
be respected if it's set.

> > self.kernel = get_cfg("kernel")
> > + self.ramdisk = get_cfg("ramdisk", '')
> > + self.boot_kernel = get_cfg("boot_kernel")
> > + if not self.boot_kernel:
> > + self.boot_kernel = self.kernel
> > + self.boot_ramdisk = get_cfg("boot_ramdisk")
> > + if not self.boot_ramdisk:
> > + self.boot_ramdisk = self.ramdisk
> > +
>
> This is also changing the semantics of the SEXPR exposed by XenD - previously
> the ('vmlinux') and ('initrd') parameters would refer to the live kernel
> in the guest, but now you'd have to look at the boot_XXX variants instead.
>
> If we did want to change the prioritzation such that bootloader overrides
> any explicit kernel/initrd, then I think we should just have the values
> from bootloader directly overwrite the existing named SXPR fields rather
> than adding new boot_XX fields.

See the other patch. We could make it so kernel/initrd are always the
'live' ones, than we have cfg_kernel/cfg_initrd or something, but I
don't really see the advantage in that, and the disadvantage is
reasonably obvious: if I want to lookup to see "what kernel is this",
I'd have to check first cfg_kernel then kernel. With boot_*, I can
always look in 'kernel' and know that this is the one that the .py
config chose.

regards
john

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel