* Renamed vmdkheader to vmdkimage and changed it to create a full image
by default (new option "-H" will create the header only). Option "-c" will clear the image. * Adjusted build_haiku_image accordingly. vmdkimage is way faster and more portable than the former vmdkheader+dd combo. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24784 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -531,7 +531,7 @@ AddTargetVariableToScript $(script) : <build>makebootable ;
|
|||||||
AddTargetVariableToScript $(script) : <build>rc ;
|
AddTargetVariableToScript $(script) : <build>rc ;
|
||||||
AddTargetVariableToScript $(script) : <build>resattr ;
|
AddTargetVariableToScript $(script) : <build>resattr ;
|
||||||
AddTargetVariableToScript $(script) : <build>unzip ;
|
AddTargetVariableToScript $(script) : <build>unzip ;
|
||||||
AddTargetVariableToScript $(script) : <build>vmdkheader ;
|
AddTargetVariableToScript $(script) : <build>vmdkimage ;
|
||||||
if $(HOST_RM_ATTRS_TARGET) {
|
if $(HOST_RM_ATTRS_TARGET) {
|
||||||
AddTargetVariableToScript $(script) : $(HOST_RM_ATTRS_TARGET) : rmAttrs ;
|
AddTargetVariableToScript $(script) : $(HOST_RM_ATTRS_TARGET) : rmAttrs ;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
# rc
|
# rc
|
||||||
# rmAttrs
|
# rmAttrs
|
||||||
# unzip
|
# unzip
|
||||||
# vmdkheader
|
# vmdkimage
|
||||||
#
|
#
|
||||||
if [ $# -gt 0 ]; then
|
if [ $# -gt 0 ]; then
|
||||||
. $1
|
. $1
|
||||||
@@ -93,17 +93,19 @@ if [ $isImage ]; then
|
|||||||
if [ ! $updateOnly ]; then
|
if [ ! $updateOnly ]; then
|
||||||
echo "Creating image ..."
|
echo "Creating image ..."
|
||||||
|
|
||||||
ddFlags=
|
ddFlags=
|
||||||
if [ $isVMwareImage ]; then
|
if [ $isVMwareImage ]; then
|
||||||
rm -f "$imagePath"
|
vmdkImageFlags=
|
||||||
$vmdkheader -h 64k -i${imageSize}M "$imagePath" || exit 1
|
if [ ! "$dontClearImage" ]; then
|
||||||
ddFlags="conv=notrunc oflag=append"
|
vmdkImageFlags="-c"
|
||||||
dontClearImage=
|
fi
|
||||||
|
$vmdkimage -h 64k -i${imageSize}M $vmdkImageFlags "$imagePath" \
|
||||||
|
|| exit 1
|
||||||
|
elif [ ! -e "$imagePath" -o ! "$dontClearImage" ]; then
|
||||||
|
dd if=/dev/zero of="$imagePath" bs=1048576 count=$imageSize \
|
||||||
|
|| exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -e "$imagePath" -o ! "$dontClearImage" ]; then
|
|
||||||
dd if=/dev/zero of="$imagePath" bs=1048576 count=$imageSize $ddFlags
|
|
||||||
fi
|
|
||||||
$bfsShell --initialize $imageOffsetFlags "$imagePath" Haiku \
|
$bfsShell --initialize $imageOffsetFlags "$imagePath" Haiku \
|
||||||
"block_size 2048" || exit 1
|
"block_size 2048" || exit 1
|
||||||
$makebootable $imageOffsetFlags "$imagePath"
|
$makebootable $imageOffsetFlags "$imagePath"
|
||||||
|
|||||||
+1
-1
@@ -104,6 +104,6 @@ SubInclude HAIKU_TOP src tools resattr ;
|
|||||||
SubInclude HAIKU_TOP src tools rman ;
|
SubInclude HAIKU_TOP src tools rman ;
|
||||||
SubInclude HAIKU_TOP src tools translation ;
|
SubInclude HAIKU_TOP src tools translation ;
|
||||||
SubInclude HAIKU_TOP src tools unzip ;
|
SubInclude HAIKU_TOP src tools unzip ;
|
||||||
SubInclude HAIKU_TOP src tools vmdkheader ;
|
SubInclude HAIKU_TOP src tools vmdkimage ;
|
||||||
SubInclude HAIKU_TOP src tools unflatten ;
|
SubInclude HAIKU_TOP src tools unflatten ;
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
SubDir HAIKU_TOP src tools vmdkheader ;
|
|
||||||
|
|
||||||
UsePrivateHeaders kernel ;
|
|
||||||
|
|
||||||
BuildPlatformMain <build>vmdkheader
|
|
||||||
: vmdkheader.cpp
|
|
||||||
: $(HOST_LIBSUPC++)
|
|
||||||
;
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
SubDir HAIKU_TOP src tools vmdkimage ;
|
||||||
|
|
||||||
|
UsePrivateHeaders kernel ;
|
||||||
|
|
||||||
|
BuildPlatformMain <build>vmdkimage
|
||||||
|
: vmdkimage.cpp
|
||||||
|
: $(HOST_LIBSUPC++)
|
||||||
|
;
|
||||||
@@ -13,19 +13,22 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "vmdkheader.h"
|
#include "vmdkimage.h"
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_usage()
|
print_usage()
|
||||||
{
|
{
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("vmdkheader\n");
|
printf("vmdkimage\n");
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("usage: vmdkheader -i <imagesize> -h <headersize> [-f] <file>\n");
|
printf("usage: vmdkimage -i <imagesize> -h <headersize> [-c] [-H] [-f] "
|
||||||
|
"<file>\n");
|
||||||
printf(" -i, --imagesize size of raw partition image file\n");
|
printf(" -i, --imagesize size of raw partition image file\n");
|
||||||
printf(" -h, --headersize size of the vmdk header to write\n");
|
printf(" -h, --headersize size of the vmdk header to write\n");
|
||||||
printf(" -f, --file the raw partition image file\n");
|
printf(" -f, --file the raw partition image file\n");
|
||||||
|
printf(" -c, --clear-image set the image content to zero\n");
|
||||||
|
printf(" -H, --header-only write only the header\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,10 +39,12 @@ main(int argc, char *argv[])
|
|||||||
uint64 headersize = 0;
|
uint64 headersize = 0;
|
||||||
uint64 imagesize = 0;
|
uint64 imagesize = 0;
|
||||||
const char *file = NULL;
|
const char *file = NULL;
|
||||||
|
bool headerOnly = false;
|
||||||
|
bool clearImage = false;
|
||||||
|
|
||||||
if (sizeof(SparseExtentHeader) != 512) {
|
if (sizeof(SparseExtentHeader) != 512) {
|
||||||
fprintf(stderr, "compilation error: struct size is %lu byte\n",
|
fprintf(stderr, "compilation error: struct size is %u byte\n",
|
||||||
sizeof(SparseExtentHeader));
|
(unsigned)sizeof(SparseExtentHeader));
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,11 +55,13 @@ main(int argc, char *argv[])
|
|||||||
{"headersize", required_argument, 0, 'h'},
|
{"headersize", required_argument, 0, 'h'},
|
||||||
{"imagesize", required_argument, 0, 'i'},
|
{"imagesize", required_argument, 0, 'i'},
|
||||||
{"file", required_argument, 0, 'f'},
|
{"file", required_argument, 0, 'f'},
|
||||||
|
{"clear-image", no_argument, 0, 'c'},
|
||||||
|
{"header-only", no_argument, 0, 'H'},
|
||||||
{0, 0, 0, 0}
|
{0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
opterr = 0; /* don't print errors */
|
opterr = 0; /* don't print errors */
|
||||||
c = getopt_long(argc, argv, "h:i:f:", long_options, NULL);
|
c = getopt_long(argc, argv, "h:i:c:H:f:", long_options, NULL);
|
||||||
if (c == -1)
|
if (c == -1)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -83,6 +90,14 @@ main(int argc, char *argv[])
|
|||||||
file = optarg;
|
file = optarg;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'c':
|
||||||
|
clearImage = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'H':
|
||||||
|
headerOnly = true;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
print_usage();
|
print_usage();
|
||||||
}
|
}
|
||||||
@@ -98,8 +113,8 @@ main(int argc, char *argv[])
|
|||||||
SparseExtentHeader header;
|
SparseExtentHeader header;
|
||||||
|
|
||||||
if (headersize < sizeof(desc) + sizeof(header)) {
|
if (headersize < sizeof(desc) + sizeof(header)) {
|
||||||
fprintf(stderr, "Error: header size must be at least %lu byte\n",
|
fprintf(stderr, "Error: header size must be at least %u byte\n",
|
||||||
sizeof(desc) + sizeof(header));
|
(unsigned)(sizeof(desc) + sizeof(header)));
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,6 +159,7 @@ main(int argc, char *argv[])
|
|||||||
cylinders /= 2;
|
cylinders /= 2;
|
||||||
heads *= 2;
|
heads *= 2;
|
||||||
}
|
}
|
||||||
|
off_t actualImageSize = (off_t)cylinders * sectors * heads * 512;
|
||||||
|
|
||||||
memset(desc, 0, sizeof(desc));
|
memset(desc, 0, sizeof(desc));
|
||||||
memset(&header, 0, sizeof(header));
|
memset(&header, 0, sizeof(header));
|
||||||
@@ -204,6 +220,15 @@ main(int argc, char *argv[])
|
|||||||
if (1 != write(fd, "", 1))
|
if (1 != write(fd, "", 1))
|
||||||
goto write_err;
|
goto write_err;
|
||||||
|
|
||||||
|
if (!headerOnly) {
|
||||||
|
if (clearImage && ftruncate(fd, headersize) != 0
|
||||||
|
|| ftruncate(fd, actualImageSize) != 0) {
|
||||||
|
fprintf(stderr, "Error: resizing file %s failed (%s)\n", file,
|
||||||
|
strerror(errno));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
* Copyright 2007, Marcus Overhagen. All Rights Reserved.
|
* Copyright 2007, Marcus Overhagen. All Rights Reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
#ifndef _VMDKHEADER_H
|
#ifndef _VMDKIMAGE_H
|
||||||
#define _VMDKHEADER_H
|
#define _VMDKIMAGE_H
|
||||||
|
|
||||||
typedef unsigned char uint8;
|
typedef unsigned char uint8;
|
||||||
typedef unsigned int uint32;
|
typedef unsigned int uint32;
|
||||||
Reference in New Issue
Block a user