From: Aaron Mason <absorbentshoulderman@gmail.com>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] Patch: Adding ability for qemu-img to create SCSI VMware disk images
Date: Fri, 22 May 2009 20:29:57 +1000 [thread overview]
Message-ID: <e869674d0905220329u72641f86le1a6dc3c8029d6cc@mail.gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 10990 bytes --]
Hi,
I needed to create a heap of virtual hard drives to practice creating RAID
arrays. Since qemu-img only creates IDE images, creating a large number of
images for this was a very cumbersome excercise. I compared a SCSI image to
an IDE image, and the only difference is the adapter type. This patch adds
command line parameters to qemu-img to specify either a BusLogic or LSI
Logic image for 'create' and 'convert', and extends the 'info' command to
show the adapter type. I have also updated the file qemu-img.text and the
help output to display the new parameters, and put in a parameter that was
missing.
The patch is as follows, and can be applied to 0.10.5 stable (and latest
snapshot if qemu-img hasn't changed) with patch -Np1:
diff -Naur qemu-0.10.5.orig/block-vmdk.c qemu-0.10.5/block-vmdk.c
--- qemu-0.10.5.orig/block-vmdk.c Thu May 21 06:46:58 2009
+++ qemu-0.10.5/block-vmdk.c Fri May 22 20:09:44 2009
@@ -692,6 +692,7 @@
int fd, i;
VMDK4Header header;
uint32_t tmp, magic, grains, gd_size, gt_size, gt_count;
+
static const char desc_template[] =
"# Disk DescriptorFile\n"
"version=1\n"
@@ -709,10 +710,19 @@
"ddb.geometry.cylinders = \"%" PRId64 "\"\n"
"ddb.geometry.heads = \"16\"\n"
"ddb.geometry.sectors = \"63\"\n"
- "ddb.adapterType = \"ide\"\n";
+ "ddb.adapterType = \"%s\"\n";
char desc[1024];
+ char adaptType[10];
const char *real_filename, *temp_str;
+ /* If neither BusLogic or LSI logic is requested, default to IDE -
thirdwheel, 17/04/2009 */
+ if (flags & BLOCK_FLAG_BUSLOGIC)
+ strcpy(adaptType, "buslogic");
+ else if (flags & BLOCK_FLAG_LSILOGIC)
+ strcpy(adaptType, "lsilogic");
+ else
+ strcpy(adaptType, "ide");
+
/* XXX: add support for backing file */
if (backing_file) {
return vmdk_snapshot_create(filename, backing_file);
@@ -784,7 +794,8 @@
snprintf(desc, sizeof(desc), desc_template, (unsigned int)time(NULL),
total_size, real_filename,
(flags & BLOCK_FLAG_COMPAT6 ? 6 : 4),
- total_size / (int64_t)(63 * 16));
+ total_size / (int64_t)(63 * 16),
+ adaptType);
/* write the descriptor */
lseek(fd, le64_to_cpu(header.desc_offset) << 9, SEEK_SET);
diff -Naur qemu-0.10.5.orig/block_int.h qemu-0.10.5/block_int.h
--- qemu-0.10.5.orig/block_int.h Thu May 21 06:46:58 2009
+++ qemu-0.10.5/block_int.h Fri May 22 20:09:44 2009
@@ -36,6 +36,10 @@
BlockDriverAIOCB *free_aiocb;
} AIOPool;
+/* Added by thirdwheel to support BusLogic and LSI logic based VMDKs -
17/04/09 */
+#define BLOCK_FLAG_BUSLOGIC 8
+#define BLOCK_FLAG_LSILOGIC 16
+
struct BlockDriver {
const char *format_name;
int instance_size;
diff -Naur qemu-0.10.5.orig/qemu-img.c qemu-0.10.5/qemu-img.c
--- qemu-0.10.5.orig/qemu-img.c Thu May 21 06:47:00 2009
+++ qemu-0.10.5/qemu-img.c Fri May 22 20:09:44 2009
@@ -58,9 +58,9 @@
"QEMU disk image utility\n"
"\n"
"Command syntax:\n"
- " create [-e] [-6] [-b base_image] [-f fmt] filename [size]\n"
+ " create [-e] [-6] [-S] [-L] [-b base_image] [-f fmt] filename
[size]\n"
" commit [-f fmt] filename\n"
- " convert [-c] [-e] [-6] [-f fmt] [-O output_fmt] [-B
output_base_image] filename [filename2 [...]] output_filename\n"
+ " convert [-c] [-e] [-6] [-S] [-L] [-f fmt] [-O output_fmt] [-B
output_base_image] filename [filename2 [...]] output_filename\n"
" info [-f fmt] filename\n"
" snapshot [-l | -a snapshot | -c snapshot | -d snapshot]
filename\n"
"\n"
@@ -81,6 +81,8 @@
" '-c' indicates that target image must be compressed (qcow
format only)\n"
" '-e' indicates that the target image must be encrypted (qcow
format only)\n"
" '-6' indicates that the target image must use compatibility
level 6 (vmdk format only)\n"
+ " '-S' indicates that the target image must be a BusLogic SCSI
virtual disk (vmdk format only)\n"
+ " '-L' indicates that the target image must be a LSI Logic SCSI
virtual disk (vmdk format only)\n"
" '-h' with or without a command shows this help and lists the
supported formats\n"
"\n"
"Parameters to snapshot subcommand:\n"
@@ -226,7 +228,7 @@
flags = 0;
for(;;) {
- c = getopt(argc, argv, "b:f:he6");
+ c = getopt(argc, argv, "b:f:he6SL");
if (c == -1)
break;
switch(c) {
@@ -245,6 +247,12 @@
case '6':
flags |= BLOCK_FLAG_COMPAT6;
break;
+ case 'S':
+ flags |= BLOCK_FLAG_BUSLOGIC;
+ break;
+ case 'L':
+ flags |= BLOCK_FLAG_LSILOGIC;
+ break;
}
}
if (optind >= argc)
@@ -275,12 +283,23 @@
drv = bdrv_find_format(fmt);
if (!drv)
error("Unknown file format '%s'", fmt);
+ if (flags & BLOCK_FLAG_BUSLOGIC && drv != &bdrv_vmdk)
+ error("BusLogic images not supported for this file format");
+ if (flags & BLOCK_FLAG_LSILOGIC && drv != &bdrv_vmdk)
+ error("LSI Logic images not supported for this file format");
+ if (flags & BLOCK_FLAG_LSILOGIC && flags & BLOCK_FLAG_BUSLOGIC)
+ error("Please select either LSI Logic or BusLogic, not both");
+
printf("Formatting '%s', fmt=%s",
filename, fmt);
if (flags & BLOCK_FLAG_ENCRYPT)
printf(", encrypted");
if (flags & BLOCK_FLAG_COMPAT6)
printf(", compatibility level=6");
+ if (flags & BLOCK_FLAG_BUSLOGIC)
+ printf(", in BusLogic mode");
+ if (flags & BLOCK_FLAG_LSILOGIC)
+ printf(", in LSI Logic mode");
if (base_filename) {
printf(", backing_file=%s",
base_filename);
@@ -415,7 +434,7 @@
out_baseimg = NULL;
flags = 0;
for(;;) {
- c = getopt(argc, argv, "f:O:B:hce6");
+ c = getopt(argc, argv, "f:O:B:hce6SL");
if (c == -1)
break;
switch(c) {
@@ -440,6 +459,12 @@
case '6':
flags |= BLOCK_FLAG_COMPAT6;
break;
+ case 'S':
+ flags |= BLOCK_FLAG_BUSLOGIC;
+ break;
+ case 'L':
+ flags |= BLOCK_FLAG_LSILOGIC;
+ break;
}
}
@@ -473,6 +498,15 @@
error("Encryption not supported for this file format");
if (flags & BLOCK_FLAG_COMPAT6 && drv != &bdrv_vmdk)
error("Alternative compatibility level not supported for this file
format");
+ if (flags & BLOCK_FLAG_BUSLOGIC && drv != &bdrv_vmdk)
+ error("BusLogic images not supported for this file format");
+ if (flags & BLOCK_FLAG_LSILOGIC && drv != &bdrv_vmdk)
+ error("LSI Logic images not supported for this file format");
+ if (flags & BLOCK_FLAG_LSILOGIC && flags & BLOCK_FLAG_BUSLOGIC)
+ error("Please select either LSI Logic or BusLogic, not both");
+ /* I'm not sure if buslogic and/or lsi logic images are supported at
compatibility level 6 - if not, uncomment this until it can be tested */
+ /*if ((flags & BLOCK_FLAG_LSILOGIC || flags & BLOCK_FLAG_BUSLOGIC) &&
BLOCK_FLAG_COMPAT6) */
+ /*error("SCSI VMDK images are not currently supported in
compatibilty level 6");*/
if (flags & BLOCK_FLAG_ENCRYPT && flags & BLOCK_FLAG_COMPRESS)
error("Compression and encryption not supported at the same time");
@@ -681,6 +715,10 @@
char backing_filename[1024];
char backing_filename2[1024];
BlockDriverInfo bdi;
+
+ /* Added this to show what kind of adapter a vmdk image is - thirdwheel
17/04/2009 */
+ char line[1024];
+ FILE *vmdk;
fmt = NULL;
for(;;) {
@@ -729,6 +767,22 @@
filename, fmt_name, size_buf,
(total_sectors * 512),
dsize_buf);
+
+ if (strcmp(fmt_name, "vmdk") == 0) {
+ /* Now we find out what adapter type it is! - thirdwheel,
17/04/2009 */
+ vmdk = fopen(filename, "r");
+ fseek(vmdk, 512, SEEK_SET);
+
+ while (fgets(line, 1024, vmdk) != NULL) {
+
+ if (strcmp(strtok(line, "\""), "ddb.adapterType = ") == 0) {
+
+ printf("Adapter type: %s\n", strtok(NULL, "\""));
+ break;
+ }
+ }
+ fclose(vmdk);
+ }
if (bdrv_is_encrypted(bs))
printf("encrypted: yes\n");
if (bdrv_get_info(bs, &bdi) >= 0) {
diff -Naur qemu-0.10.5.orig/qemu-img.texi qemu-0.10.5/qemu-img.texi
--- qemu-0.10.5.orig/qemu-img.texi Thu May 21 06:47:00 2009
+++ qemu-0.10.5/qemu-img.texi Fri May 22 20:16:30 2009
@@ -52,7 +52,7 @@
image format in QEMU. It is supported only for compatibility with
previous versions. It does not work on win32.
@item vmdk
-VMware 3 and 4 compatible image format.
+VMware 3 and 4 compatible image format. Supports IDE and SCSI (BusLogic
and LSI Logic) adapters
@item cloop
Linux Compressed Loop image, useful only to reuse directly compressed
CD-ROM images present for example in the Knoppix CD-ROMs.
@@ -98,7 +98,7 @@
Command description:
@table @option
-@item create [-6] [-e] [-b @var{base_image}] [-f @var{fmt}] @var{filename}
[@var{size}]
+@item create [-S] [-L] [-6] [-e] [-b @var{base_image}] [-f @var{fmt}]
@var{filename} [@var{size}]
Create the new disk image @var{filename} of size @var{size} and format
@var{fmt}.
@@ -108,11 +108,15 @@
this case. @var{base_image} will never be modified unless you use the
@code{commit} monitor command.
+If the format is @code{vmdk}, the @code{-S} option will create a BusLogic
image,
+whereas the @code{-L} will create an LSI Logic image. Specifying neither
option
+creates an IDE image.
+
@item commit [-f @var{fmt}] @var{filename}
Commit the changes recorded in @var{filename} in its base image.
-@item convert [-c] [-e] [-f @var{fmt}] @var{filename} [-O @var{output_fmt}]
@var{output_filename}
+@item convert [-c] [-e] [-6] [-S] [-L] [-f @var{fmt}] @var{filename} [-O
@var{output_fmt}] @var{output_filename}
Convert the disk image @var{filename} to disk image @var{output_filename}
using format @var{output_fmt}. It can be optionally encrypted
@@ -129,12 +133,17 @@
growable format such as @code{qcow} or @code{cow}: the empty sectors
are detected and suppressed from the destination image.
+As with the create command, if the format is @code{vmdk}, the @code{-S}
+option will create a BusLogic image, whereas the @code{-L} will create
+an LSI Logic image. Specifying neither option creates an IDE image.
+
@item info [-f @var{fmt}] @var{filename}
Give information about the disk image @var{filename}. Use it in
particular to know the size reserved on disk which can be different
from the displayed size. If VM snapshots are stored in the disk image,
-they are displayed too.
+they are displayed too. For the @code{vmdk} format, the adapter type of
+the image is displayed as well.
@item snapshot [-l | -a @var{snapshot} | -c @var{snapshot} | -d
@var{snapshot} ] @var{filename}
[-- Attachment #2: Type: text/html, Size: 12899 bytes --]
next reply other threads:[~2009-05-22 10:30 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-22 10:29 Aaron Mason [this message]
2009-05-22 16:41 ` [Qemu-devel] Patch: Adding ability for qemu-img to create SCSI VMware disk images Anthony Liguori
[not found] ` <e869674d0905240116n3245c5bdxf66552984a4037f5@mail.gmail.com>
2009-05-26 8:02 ` Anthony Liguori
2009-05-26 9:09 ` Kevin Wolf
2009-05-26 19:52 ` Anthony Liguori
2009-05-26 19:58 ` Daniel P. Berrange
2009-05-26 20:01 ` Anthony Liguori
2009-05-27 7:29 ` Kevin Wolf
2009-05-27 7:40 ` Christoph Hellwig
2009-05-27 8:23 ` Anthony Liguori
2009-05-26 18:17 ` Robert Riebisch
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e869674d0905220329u72641f86le1a6dc3c8029d6cc@mail.gmail.com \
--to=absorbentshoulderman@gmail.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).