This commit is contained in:
committed by
Git OBS Bridge
parent
241ee9df04
commit
d7002a96b9
@@ -1,18 +1,89 @@
|
||||
Index: xen-3.0.3-testing/tools/python/xen/xm/create.py
|
||||
Index: xen-3.0.4-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||
===================================================================
|
||||
--- xen-3.0.3-testing.orig/tools/python/xen/xm/create.py
|
||||
+++ xen-3.0.3-testing/tools/python/xen/xm/create.py
|
||||
@@ -126,7 +126,7 @@ gopts.var('bootloader', val='FILE',
|
||||
use="Path to bootloader.")
|
||||
--- xen-3.0.4-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||
+++ xen-3.0.4-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||
@@ -41,7 +41,7 @@ from xen.xend import balloon, sxp, uuid,
|
||||
from xen.xend import XendRoot, XendNode, XendConfig
|
||||
|
||||
gopts.var('bootargs', val='NAME',
|
||||
- fn=set_value, default=None,
|
||||
+ fn=set_value, default='',
|
||||
use="Arguments to pass to boot loader")
|
||||
from xen.xend.XendConfig import scrub_password
|
||||
-from xen.xend.XendBootloader import bootloader
|
||||
+from xen.xend.XendBootloader import bootloader, bootfilter
|
||||
from xen.xend.XendError import XendError, VmError
|
||||
from xen.xend.XendDevices import XendDevices
|
||||
from xen.xend.xenstore.xstransact import xstransact, complete
|
||||
@@ -1556,13 +1556,17 @@ class XendDomainInfo:
|
||||
if not devtype or not devinfo or devtype not in ('vbd', 'tap'):
|
||||
continue
|
||||
disk = None
|
||||
+ vdisk = None
|
||||
for param in devinfo:
|
||||
if param[0] == 'uname':
|
||||
disk = param[1]
|
||||
- break
|
||||
+ elif param[0] == 'dev':
|
||||
+ vdisk = param[1]
|
||||
|
||||
gopts.var('bootentry', val='NAME',
|
||||
@@ -649,16 +649,17 @@ def run_bootloader(vals, config_image):
|
||||
err("Bootloader isn't executable")
|
||||
if disk is None:
|
||||
continue
|
||||
+ if not bootfilter(blexec, bootloader_args, vdisk):
|
||||
+ continue
|
||||
fn = blkdev_uname_to_file(disk)
|
||||
mounted = devtype == 'tap' and not os.stat(fn).st_rdev
|
||||
if mounted:
|
||||
Index: xen-3.0.4-testing/tools/python/xen/xend/XendBootloader.py
|
||||
===================================================================
|
||||
--- xen-3.0.4-testing.orig/tools/python/xen/xend/XendBootloader.py
|
||||
+++ xen-3.0.4-testing/tools/python/xen/xend/XendBootloader.py
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
import os, select, errno, stat
|
||||
import random
|
||||
+import re
|
||||
import shlex
|
||||
from xen.xend import sxp
|
||||
|
||||
@@ -97,3 +98,26 @@ def bootloader(blexec, disk, quiet = Fal
|
||||
pin.input_eof()
|
||||
blcfg = pin.val
|
||||
return blcfg
|
||||
+
|
||||
+def bootfilter(bootloader, bootloader_args, vdisk):
|
||||
+ """Is this virtual disk ok to boot from?"""
|
||||
+ if vdisk.endswith(':disk'):
|
||||
+ vdisk = vdisk[:-5] # temporary work-around for bug 237414
|
||||
+ if bootloader.endswith('domUloader.py'):
|
||||
+ for arg in bootloader_args.split():
|
||||
+ if arg.startswith('--entry='):
|
||||
+ m = re.match(r'^([hsx]v?d[a-z])[0-9]*:[^,]*(,[^,]*)?$', arg[8:])
|
||||
+ if m:
|
||||
+ return vdisk == m.group(1) or vdisk == m.group(2)
|
||||
+ return True
|
||||
+
|
||||
+def bootselector(bootloader, bootloader_args, disks):
|
||||
+ """Returns the desired disk to boot from.
|
||||
+ @param disks List of (pdev, vdev, ...) tuples.
|
||||
+ """
|
||||
+ if bootloader.endswith('domUloader.py'):
|
||||
+ for disk in disks:
|
||||
+ if bootfilter(bootloader, bootloader_args, disk[1]):
|
||||
+ return disk
|
||||
+ return disks[0]
|
||||
+
|
||||
Index: xen-3.0.4-testing/tools/python/xen/xm/create.py
|
||||
===================================================================
|
||||
--- xen-3.0.4-testing.orig/tools/python/xen/xm/create.py
|
||||
+++ xen-3.0.4-testing/tools/python/xen/xm/create.py
|
||||
@@ -29,7 +29,7 @@ import xmlrpclib
|
||||
from xen.xend import sxp
|
||||
from xen.xend import PrettyPrint
|
||||
import xen.xend.XendClient
|
||||
-from xen.xend.XendBootloader import bootloader
|
||||
+from xen.xend.XendBootloader import bootloader, bootselector
|
||||
from xen.util import blkif
|
||||
from xen.util import security
|
||||
|
||||
@@ -710,14 +710,15 @@ def run_bootloader(vals, config_image):
|
||||
err("Bootloader '%s' isn't executable" % vals.bootloader)
|
||||
if len(vals.disk) < 1:
|
||||
err("No disks configured and boot loader requested")
|
||||
- (uname, dev, mode, backend) = vals.disk[0]
|
||||
@@ -22,102 +93,10 @@ Index: xen-3.0.3-testing/tools/python/xen/xm/create.py
|
||||
warn("The bootentry option is deprecated. Use bootargs and pass "
|
||||
"--entry= directly.")
|
||||
vals.bootargs = "--entry=%s" %(vals.bootentry,)
|
||||
+ if vals.root:
|
||||
+ vals.bootargs += " --root=%s" % vals.root.split()[0]
|
||||
+ vals.bootargs += " --disks=\"%s\"" % str(vals.disk)
|
||||
|
||||
- return bootloader(vals.bootloader, file, not vals.console_autoconnect,
|
||||
- vals.bootargs, config_image)
|
||||
+ return bootloader(vals.bootloader, not vals.console_autoconnect,
|
||||
+ vals.dryrun, vals.bootargs, config_image)
|
||||
+ bootdisk = bootselector(vals.bootloader, vals.bootargs, vals.disk)
|
||||
+ uname = bootdisk[0]
|
||||
+ file = blkif.blkdev_uname_to_file(uname)
|
||||
return bootloader(vals.bootloader, file, not vals.console_autoconnect,
|
||||
vals.bootargs, config_image)
|
||||
|
||||
def make_config(vals):
|
||||
"""Create the domain configuration.
|
||||
Index: xen-3.0.3-testing/tools/python/xen/xend/XendBootloader.py
|
||||
===================================================================
|
||||
--- xen-3.0.3-testing.orig/tools/python/xen/xend/XendBootloader.py
|
||||
+++ xen-3.0.3-testing/tools/python/xen/xend/XendBootloader.py
|
||||
@@ -20,11 +20,9 @@ import shlex
|
||||
from XendLogging import log
|
||||
from XendError import VmError
|
||||
|
||||
-def bootloader(blexec, disk, quiet = 0, blargs = None, imgcfg = None):
|
||||
- """Run the boot loader executable on the given disk and return a
|
||||
- config image.
|
||||
+def bootloader(blexec, quiet = 0, dryrun = 0, blargs = None, imgcfg = None):
|
||||
+ """Run the boot loader executable and return a config image.
|
||||
@param blexec Binary to use as the boot loader
|
||||
- @param disk Disk to run the boot loader on.
|
||||
@param quiet Run in non-interactive mode, just booting the default.
|
||||
@param blargs Arguments to pass to the bootloader."""
|
||||
|
||||
@@ -32,10 +30,6 @@ def bootloader(blexec, disk, quiet = 0,
|
||||
msg = "Bootloader isn't executable"
|
||||
log.error(msg)
|
||||
raise VmError(msg)
|
||||
- if not os.access(disk, os.R_OK):
|
||||
- msg = "Disk isn't accessible"
|
||||
- log.error(msg)
|
||||
- raise VmError(msg)
|
||||
|
||||
while True:
|
||||
fifo = "/var/lib/xen/xenbl.%s" %(random.randint(0, 32000),)
|
||||
@@ -48,10 +42,11 @@ def bootloader(blexec, disk, quiet = 0,
|
||||
args = [ blexec ]
|
||||
if quiet:
|
||||
args.append("-q")
|
||||
+ if dryrun:
|
||||
+ args.append("--dryrun")
|
||||
args.append("--output=%s" %(fifo,))
|
||||
if blargs is not None:
|
||||
args.extend(shlex.split(blargs))
|
||||
- args.append(disk)
|
||||
|
||||
try:
|
||||
os.execvp(args[0], args)
|
||||
@@ -68,6 +63,7 @@ def bootloader(blexec, disk, quiet = 0,
|
||||
continue
|
||||
break
|
||||
ret = ""
|
||||
+ # TODO: Add timeout, cleanup and raise VmError if it occurs
|
||||
while 1:
|
||||
select.select([r], [], [])
|
||||
s = os.read(r, 1024)
|
||||
Index: xen-3.0.3-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||
===================================================================
|
||||
--- xen-3.0.3-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||
+++ xen-3.0.3-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||
@@ -1743,18 +1743,27 @@ class XendDomainInfo:
|
||||
if not self.info['bootloader']:
|
||||
return
|
||||
blcfg = None
|
||||
- # FIXME: this assumes that we want to use the first disk device
|
||||
+ """This code is currently unneeded, but will be used
|
||||
+ again when boot device selection is more dynamic.
|
||||
+ vbds = []
|
||||
for (n,c) in self.info['device']:
|
||||
if not n or not c or not(n in ["vbd", "tap"]):
|
||||
continue
|
||||
disk = sxp.child_value(c, "uname")
|
||||
if disk is None:
|
||||
continue
|
||||
- fn = blkdev_uname_to_file(disk)
|
||||
- blcfg = bootloader(self.info['bootloader'], fn, 1,
|
||||
- self.info['bootloader_args'],
|
||||
- self.info['image'])
|
||||
- break
|
||||
+ vbds.append([sxp.child_value(c, "uname"),
|
||||
+ sxp.child_value(c, "dev"),
|
||||
+ sxp.child_value(c, "mode"),
|
||||
+ sxp.child_value(c, "backend")])
|
||||
+ if vbds:
|
||||
+ bootargs = self.info['bootloader_args'] + \
|
||||
+ " --disks=\"%s\"" % str(vbds)
|
||||
+ if self.info['root']:
|
||||
+ bootargs += " --root=%s" % self.info['root'].split()[0]
|
||||
+ """
|
||||
+ blcfg = bootloader(self.info['bootloader'], 1, 0,
|
||||
+ self.info['bootloader_args'], self.info['image'])
|
||||
if blcfg is None:
|
||||
msg = "Had a bootloader specified, but can't find disk"
|
||||
log.error(msg)
|
||||
|
Reference in New Issue
Block a user