Hello everyone!
When pygub failed, we could not get the detail log.
So I'd like the feature of putting the detail log of pygrub
to logfile and user console.
I created a fifo file shared by XendBootloader.py and pygrub to output
some messages from the pygrub into the user console.
I can't think out of any other easy way to realize it.
If you have a better idea,
could you tell me some details about it?
Regards.
Sun Shuchun
diff --git a/pygrub.bak b/pygrub
index 3a44846..3fd370d 100755
--- a/pygrub.bak
+++ b/pygrub
@@ -25,8 +25,20 @@ import fsimage
import grub.GrubConf
import grub.LiloConf
+import traceback
+
PYGRUB_VER = 0.6
+def pipe_file_w(str):
+ fd_kiharu = os.open(output_kiharu, os.O_RDWR)
+ try:
+ buf = os.write(fd_kiharu, "\n"+str)
+ os.close(fd_kiharu)
+ except:
+ logging.error("pipe file IO: %s", traceback.format_exc())
+ return False
+ return True
+
def enable_cursor(ison):
if ison:
val = 2
@@ -39,21 +51,43 @@ def enable_cursor(ison):
pass
def is_disk_image(file):
- fd = os.open(file, os.O_RDONLY)
- buf = os.read(fd, 512)
- os.close(fd)
+ #return False
+ try:
+ fd = os.open(file, os.O_RDONLY)
+ buf = os.read(fd, 512)
+ os.close(fd)
+ except IOError, msg:
+ logging.error("[is_disk_image]: %s", msg)
+
+ flag1=(len(buf) >= 512)
+ flag2=(struct.unpack("H", buf[0x1fe: 0x200]) == (0xaa55,))
- if len(buf) >= 512 and \
- struct.unpack("H", buf[0x1fe: 0x200]) == (0xaa55,):
+ if flag1 and flag2:
return True
+
+ if not flag1 and flag2:
+ str="[is_disk_image]: boot image file size > 512Byte"
+ logging.error(str)
+ elif not flag2 and flag1:
+ str="[is_disk_image]: boot image file is not end with '0xaa55'"
+ logging.error(str)
+ else:
+ str="[is_disk_image]: file("+file+")is not a correct disk image format"
+ logging.error(str)
+ pipe_file_w(str)
return False
def get_active_partition(file):
"""Find the offset for the start of the first active partition "
"in the disk image file."""
-
- fd = os.open(file, os.O_RDONLY)
- buf = os.read(fd, 512)
+ try:
+ fd = os.open(file, os.O_RDONLY)
+ buf = os.read(fd, 512)
+ except IOError. msg:
+ str="[get_active_partition]: %s"+msg
+ pipe_file_w(str)
+ logging.error(str)
+
for poff in (446, 462, 478, 494): # partition offsets
# active partition has 0x80 as the first byte
if struct.unpack("<c", buf[poff:poff+1]) == ('\x80',):
@@ -70,11 +104,13 @@ V_ROOT=0x2
def get_solaris_slice(file, offset):
"""Find the root slice in a Solaris VTOC."""
-
fd = os.open(file, os.O_RDONLY)
os.lseek(fd, offset + (DK_LABEL_LOC * SECTOR_SIZE), 0)
buf = os.read(fd, 512)
if struct.unpack("<H", buf[508:510])[0] != DKL_MAGIC:
+ str="[get_solaris_slice]: A suitable root slice does not exist at
file(%s)"+file
+ pipe_file_w(str)
+ logging.error(str)
raise RuntimeError, "Invalid disklabel magic"
nslices = struct.unpack("<H", buf[30:32])[0]
@@ -85,7 +121,9 @@ def get_solaris_slice(file, offset):
slicesect = struct.unpack("<L", buf[sliceoff+4:sliceoff+8])[0]
if slicetag == V_ROOT:
return slicesect * SECTOR_SIZE
-
+ str="[get_solaris_slice]: A root slice does not exist at file(%s)"+file
+ pipe_file_w(str)
+ logging.error(str)
raise RuntimeError, "No root slice found"
def get_fs_offset_gpt(file):
@@ -101,10 +139,16 @@ FDISK_PART_GPT=0xee
def get_fs_offset(file):
if not is_disk_image(file):
+ str="[get_fs_offset]: is_disk_image(file)=0, return 0"
+ pipe_file_w(str)
+ logging.error(str)
return 0
partbuf = get_active_partition(file)
- if len(partbuf) == 0:
+ if len(partbuf) == 0:
+ str="[get_fs_offset]: Unable to find active partition on disk"
+ pipe_file_w(str)
+ logging.error(str)
raise RuntimeError, "Unable to find active partition on disk"
offset = struct.unpack("<L", partbuf[8:12])[0] * SECTOR_SIZE
@@ -368,6 +412,9 @@ class Grub:
we're being given a raw config file rather than a disk image."""
if not os.access(fn, os.R_OK):
+ str="Unable to access %s"+fn
+ pipe_file_w(str)
+ logging.error(str)
raise RuntimeError, "Unable to access %s" %(fn,)
if platform.machine() == 'ia64':
@@ -398,6 +445,9 @@ class Grub:
self.cf.filename = f
break
if self.__dict__.get('cf', None) is None:
+ str="couldn't find bootloader config file in the image provided."
+ pipe_file_w(str)
+ logging.error(str)
raise RuntimeError, "couldn't find bootloader config file in the
image provided."
f = fs.open_file(self.cf.filename)
buf = f.read()
@@ -552,6 +602,9 @@ def run_grub(file, entry, fs, arg):
if sel == -1:
print "No kernel image selected!"
+ str="[run_grub]: No kernel image selected"
+ pipe_file_w(str)
+ logging.error(str)
sys.exit(1)
try:
@@ -571,7 +624,7 @@ def run_grub(file, entry, fs, arg):
# If nothing has been specified, look for a Solaris domU. If found, perform the
# necessary tweaks.
-def sniff_solaris(fs, cfg):
+def sniff_solaris(fs, cfg):
if not fs.file_exists("/platform/i86xpv/kernel/unix"):
return cfg
@@ -620,8 +673,13 @@ def sniff_netware(fs, cfg):
return cfg
if __name__ == "__main__":
- sel = None
+ logging.basicConfig(level=logging.DEBUG,
+ format='%(asctime)s %(levelname)s %(message)s',
+ datefmt='%a,%d %b %Y %H:%M:%S',
+ filename='/var/log/xen/pygrub.log',
+ filemode='w')
+
def usage():
print >> sys.stderr, "Usage: %s [-q|--quiet] [-i|--interactive]
[--output=] [--kernel=] [--ramdisk=] [--args=] [--entry=] <image>"
%(sys.argv[0],)
@@ -677,8 +735,10 @@ if __name__ == "__main__":
if output is None or output == "-":
fd = sys.stdout.fileno()
else:
- fd = os.open(output, os.O_WRONLY)
-
+ fd = os.open(output, os.O_WRONLY)
+ output_kiharu = output + "kiharu"
+
# debug
if isconfig:
chosencfg = run_grub(file, entry, fs, incfg["args"])
@@ -690,11 +750,21 @@ if __name__ == "__main__":
# if boot filesystem is set then pass to fsimage.open
bootfsargs = '"%s"' % incfg["args"]
- bootfsgroup = re.findall('zfs-bootfs=(.*?)[\s\,\"]', bootfsargs)
+ bootfsgroup = re.findall('zfs-bootfs=(.*?)[\s\,\"]', bootfsargs)
if bootfsgroup:
- fs = fsimage.open(file, get_fs_offset(file), bootfsgroup[0])
+ try:
+ fs = fsimage.open(file, get_fs_offset(file), bootfsgroup[0])
+ except:
+ str="__main_\:%s"+traceback.format_exc()
+ pipe_file_w(str)
+ logging.error(str)
else:
- fs = fsimage.open(file, get_fs_offset(file))
+ try:
+ fs = fsimage.open(file, get_fs_offset(file))
+ except:
+ str="__main__:%s"+traceback.format_exc()
+ pipe_file_w(str)
+ logging.error(str)
chosencfg = sniff_solaris(fs, incfg)
@@ -704,34 +774,50 @@ if __name__ == "__main__":
if not chosencfg["kernel"]:
chosencfg = run_grub(file, entry, fs, incfg["args"])
- data = fs.open_file(chosencfg["kernel"]).read()
- (tfd, bootcfg["kernel"]) = tempfile.mkstemp(prefix="boot_kernel.",
- dir="/var/run/xend/boot")
- os.write(tfd, data)
- os.close(tfd)
-
- if chosencfg["ramdisk"]:
- data = fs.open_file(chosencfg["ramdisk"],).read()
- (tfd, bootcfg["ramdisk"]) = tempfile.mkstemp(prefix="boot_ramdisk.",
- dir="/var/run/xend/boot")
+ try:
+ data = fs.open_file(chosencfg["kernel"]).read()
+ (tfd, bootcfg["kernel"]) = tempfile.mkstemp(prefix="boot_kernel.",
+ dir="/var/run/xend/boot")
os.write(tfd, data)
os.close(tfd)
- else:
- initrd = None
-
- sxp = "linux (kernel %s)" % bootcfg["kernel"]
- if bootcfg["ramdisk"]:
- sxp += "(ramdisk %s)" % bootcfg["ramdisk"]
- if chosencfg["args"]:
- zfsinfo = fsimage.getbootstring(fs)
- if zfsinfo is None:
- sxp += "(args \"%s\")" % chosencfg["args"]
+ except:
+ str="__main__: %s"+traceback.format_exc()
+ pipe_file_w(str)
+ logging.error(str)
+
+ try:
+ if chosencfg["ramdisk"]:
+ data = fs.open_file(chosencfg["ramdisk"],).read()
+ (tfd, bootcfg["ramdisk"]) =
tempfile.mkstemp(prefix="boot_ramdisk.",
+ dir="/var/run/xend/boot")
+ os.write(tfd, data)
+ os.close(tfd)
else:
- e = re.compile("zfs-bootfs=[\w\-\.\:@/]+" )
- (chosencfg["args"],count) = e.subn(zfsinfo, chosencfg["args"])
- if count == 0:
- chosencfg["args"] += " -B %s" % zfsinfo
- sxp += "(args \"%s\")" % (chosencfg["args"])
+ initrd = None
+ except:
+ str="__main__: %s"+traceback.format_exc()
+ pipe_file_w(str)
+ logging.error(str)
+
+ try:
+ sxp = "linux (kernel %s)" % bootcfg["kernel"]
+
+ if bootcfg["ramdisk"]:
+ sxp += "(ramdisk %s)" % bootcfg["ramdisk"]
+ if chosencfg["args"]:
+ zfsinfo = fsimage.getbootstring(fs)
+ if zfsinfo is None:
+ sxp += "(args \"%s\")" % chosencfg["args"]
+ else:
+ e = re.compile("zfs-bootfs=[\w\-\.\:@/]+" )
+ (chosencfg["args"],count) = e.subn(zfsinfo, chosencfg["args"])
+ if count == 0:
+ chosencfg["args"] += " -B %s" % zfsinfo
+ sxp += "(args \"%s\")" % (chosencfg["args"])
+ except:
+ str="__main__: %s"+traceback.format_exc()
+ pipe_file_w(str)
+ logging.error(str)
sys.stdout.flush()
os.write(fd, sxp)
diff --git a/XendBootloader.py.bak b/XendBootloader.py
index 20bade2..6137b94 100644
--- a/XendBootloader.py.bak
+++ b/XendBootloader.py
@@ -52,6 +52,10 @@ def bootloader(blexec, disk, dom, quiet = False, blargs =
'', kernel = '',
fifo = "/var/run/xend/boot/xenbl.%s" %(random.randint(0, 32000),)
try:
os.mkfifo(fifo, 0600)
+ kiharu_fifo=fifo+"kiharu"
+ os.mkfifo(kiharu_fifo, 0600)
+
except OSError, e:
if (e.errno != errno.EEXIST):
raise
@@ -116,7 +120,7 @@ def bootloader(blexec, disk, dom, quiet = False, blargs =
'', kernel = '',
oshelp.close_fds()
os.execvpe(args[0], args, env)
except OSError, e:
- print e
+ print e
pass
os._exit(1)
@@ -132,12 +136,17 @@ def bootloader(blexec, disk, dom, quiet = False, blargs =
'', kernel = '',
while True:
try:
r = os.open(fifo, os.O_RDONLY)
+ r_kiharu = os.open(kiharu_fifo, os.O_RDONLY)
except OSError, e:
if e.errno == errno.EINTR:
continue
break
fcntl.fcntl(r, fcntl.F_SETFL, os.O_NDELAY);
+ fcntl.fcntl(r_kiharu, fcntl.F_SETFL, os.O_NDELAY)
+ ret_kiharu = ""
ret = ""
inbuf=""; outbuf="";
@@ -162,7 +171,9 @@ def bootloader(blexec, disk, dom, quiet = False, blargs =
'', kernel = '',
wsel = wsel + [m1]
if len(inbuf) != 0:
wsel = wsel + [m2]
- sel = select.select([r, m1, m2], wsel, [])
+ #sel = select.select([r, m1, m2], wsel, [])
+ sel = select.select([r,r_kiharu,m1,m2], wsel, [])
try:
if m1 in sel[0]:
s = os.read(m1, 16)
@@ -186,6 +197,10 @@ def bootloader(blexec, disk, dom, quiet = False, blargs =
'', kernel = '',
if r in sel[0]:
s = os.read(r, 128)
ret = ret + s
+ s_kiharu = os.read(r_kiharu, 1024)
+ ret_kiharu = ret_kiharu + s_kiharu
+
if len(s) == 0:
break
del inbuf
@@ -194,6 +209,8 @@ def bootloader(blexec, disk, dom, quiet = False, blargs =
'', kernel = '',
os.close(r)
os.close(m2)
os.close(m1)
+ os.close(r_kiharu)
if os.uname()[0] == 'SunOS' or os.uname()[0] == 'NetBSD':
os.close(s1)
os.unlink(fifo)
@@ -210,7 +227,9 @@ def bootloader(blexec, disk, dom, quiet = False, blargs =
'', kernel = '',
dom.bootloader_pid = None
if len(ret) == 0:
- msg = "Boot loader didn't return any data!kiharu test1"
+ msg = "Boot loader didn't return any data!"
+ msg = msg + ret_kiharu
log.error(msg)
raise VmError, msg
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|