# HG changeset patch
# User smh22@xxxxxxxxxxxxxxxxxxxx
# Node ID 0301cccd14f1d89fd62fddd25abf276735636e83
# Parent 706733e1ecdf4b2bb3ff7a31bd0c2d9ae4ae2849
The attached patch adds the support that was only stubbed in to be able
to support having reading the boot loader config when you're using a
whole disk (eg, file:/root/disk.img,xvda,w) as opposed to just a
partition.
This reads the partition table in the MBR to find the active partition
and then passes that offset down into the filesystem reading code.
Signed-off-by: Jeremy Katz <katzj@xxxxxxxxxx>
diff -r 706733e1ecdf -r 0301cccd14f1 tools/pygrub/setup.py
--- a/tools/pygrub/setup.py Tue Aug 2 09:29:56 2005
+++ b/tools/pygrub/setup.py Tue Aug 2 09:31:47 2005
@@ -23,7 +23,7 @@
fsys_pkgs.append("grub.fsys.reiser")
setup(name='pygrub',
- version='0.2',
+ version='0.3',
description='Boot loader that looks a lot like grub for Xen',
author='Jeremy Katz',
author_email='katzj@xxxxxxxxxx',
diff -r 706733e1ecdf -r 0301cccd14f1 tools/pygrub/src/fsys/ext2/__init__.py
--- a/tools/pygrub/src/fsys/ext2/__init__.py Tue Aug 2 09:29:56 2005
+++ b/tools/pygrub/src/fsys/ext2/__init__.py Tue Aug 2 09:31:47 2005
@@ -32,7 +32,7 @@
def open_fs(self, fn, offset = 0):
if not self.sniff_magic(fn, offset):
raise ValueError, "Not an ext2 filesystem"
- return Ext2Fs(fn)
+ return Ext2Fs(fn, offset = offset)
register_fstype(Ext2FileSystemType())
diff -r 706733e1ecdf -r 0301cccd14f1 tools/pygrub/src/fsys/ext2/ext2module.c
--- a/tools/pygrub/src/fsys/ext2/ext2module.c Tue Aug 2 09:29:56 2005
+++ b/tools/pygrub/src/fsys/ext2/ext2module.c Tue Aug 2 09:31:47 2005
@@ -208,22 +208,28 @@
ext2_fs_open (Ext2Fs *fs, PyObject *args, PyObject *kwargs)
{
static char *kwlist[] = { "name", "flags", "superblock",
- "block_size", NULL };
+ "block_size", "offset", NULL };
char * name;
- int flags = 0, superblock = 0, err;
+ int flags = 0, superblock = 0, offset = 0, err;
unsigned int block_size = 0;
ext2_filsys efs;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|iii", kwlist,
- &name, &flags, &superblock, &block_size))
- return NULL;
+ char offsetopt[30];
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|iiii", kwlist,
+ &name, &flags, &superblock,
+ &block_size, &offset))
+ return NULL;
if (fs->fs != NULL) {
PyErr_SetString(PyExc_ValueError, "already have an fs object");
return NULL;
}
- err = ext2fs_open(name, flags, superblock, block_size,
+ if (offset != 0) {
+ snprintf(offsetopt, 29, "offset=%d", offset);
+ }
+
+ err = ext2fs_open2(name, offsetopt, flags, superblock, block_size,
unix_io_manager, &efs);
if (err) {
PyErr_SetString(PyExc_ValueError, "unable to open file");
@@ -323,14 +329,15 @@
ext2_fs_new(PyObject *o, PyObject *args, PyObject *kwargs)
{
static char *kwlist[] = { "name", "flags", "superblock",
- "block_size", NULL };
+ "block_size", "offset", NULL };
char * name;
- int flags = 0, superblock = 0;
+ int flags = 0, superblock = 0, offset;
unsigned int block_size = 0;
Ext2Fs *pfs;
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|iii", kwlist,
- &name, &flags, &superblock, &block_size))
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|iiii", kwlist,
+ &name, &flags, &superblock, &block_size,
+ &offset))
return NULL;
pfs = (Ext2Fs *) PyObject_NEW(Ext2Fs, &Ext2FsType);
@@ -339,8 +346,8 @@
pfs->fs = NULL;
if (!ext2_fs_open(pfs,
- Py_BuildValue("siii", name, flags, superblock,
block_size),
- NULL))
+ Py_BuildValue("siiii", name, flags, superblock,
+ block_size, offset), NULL))
return NULL;
return (PyObject *)pfs;
diff -r 706733e1ecdf -r 0301cccd14f1 tools/pygrub/src/pygrub
--- a/tools/pygrub/src/pygrub Tue Aug 2 09:29:56 2005
+++ b/tools/pygrub/src/pygrub Tue Aug 2 09:31:47 2005
@@ -24,7 +24,7 @@
import grub.GrubConf
import grub.fsys
-PYGRUB_VER = 0.02
+PYGRUB_VER = 0.3
def draw_window():
@@ -77,9 +77,21 @@
buf = os.read(fd, 512)
os.close(fd)
- if len(buf) >= 512 and struct.unpack("H", buf[0x1fe: 0x200]) == (0xaaff):
+ if len(buf) >= 512 and struct.unpack("H", buf[0x1fe: 0x200]) == (0xaa55,):
return True
return False
+
+SECTOR_SIZE=512
+def get_active_offset(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)
+ for poff in (446, 462, 478, 494): # partition offsets
+ # active partition has 0x80 as the first byte
+ if struct.unpack("<c", buf[p:p+1]) == ('\x80',):
+ return struct.unpack("<", buf[p+8:p+12])[0] * SECTOR_SIZE
+ return -1
def get_config(fn):
if not os.access(fn, os.R_OK):
@@ -87,14 +99,17 @@
cf = grub.GrubConf.GrubConfigFile()
+ offset = 0
if is_disk_image(fn):
- raise RuntimeError, "appears to be a full disk image... unable to
handle this yet"
+ offset = get_active_offset(fn)
+ if offset == -1:
+ raise RuntimeError, "Unable to find active partition on disk"
# open the image and read the grub config
fs = None
for fstype in grub.fsys.fstypes.values():
- if fstype.sniff_magic(fn):
- fs = fstype.open_fs(fn)
+ if fstype.sniff_magic(fn, offset):
+ fs = fstype.open_fs(fn, offset)
break
if fs is not None:
@@ -244,14 +259,17 @@
if img.initrd:
print " initrd: %s" %(img.initrd[1],)
+ offset = 0
if is_disk_image(file):
- raise RuntimeError, "unable to handle full disk images yet"
+ offset = get_active_offset(fn)
+ if offset == -1:
+ raise RuntimeError, "Unable to find active partition on disk"
# read the kernel and initrd onto the hostfs
fs = None
for fstype in grub.fsys.fstypes.values():
- if fstype.sniff_magic(file):
- fs = fstype.open_fs(file)
+ if fstype.sniff_magic(file, offset):
+ fs = fstype.open_fs(file, offset)
break
if fs is None:
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|