VBoxManageDisk.cpp revision e48239695d41f806ff02d8a60b97dc20d4822d7a
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * VBoxManage - The disk delated commands.
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * Copyright (C) 2006-2010 Oracle Corporation
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * available from http://www.virtualbox.org. This file is free software;
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * you can redistribute it and/or modify it under the terms of the GNU
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * General Public License (GPL) as published by the Free Software
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync/*******************************************************************************
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync* Header Files *
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync*******************************************************************************/
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncusing namespace com;
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync///////////////////////////////////////////////////////////////////////////////
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncstatic DECLCALLBACK(void) handleVDError(void *pvUser, int rc, RT_SRC_POS_DECL, const char *pszFormat, va_list va)
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync RTPrintf("Error code %Rrc at %s(%u) in function %s\n", rc, RT_SRC_POS_ARGS);
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncstatic int parseDiskVariant(const char *psz, MediumVariant_T *pDiskVariant)
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync // Parsing is intentionally inconsistent: "standard" resets the
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync // variant, whereas the other flags are cumulative.
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncstatic int parseDiskType(const char *psz, MediumType_T *pDiskType)
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync/** @todo move this into getopt, as getting bool values is generic */
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncstatic const RTGETOPTDEF g_aCreateHardDiskOptions[] =
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync { "-filename", 'f', RTGETOPT_REQ_STRING }, // deprecated
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync { "-size", 's', RTGETOPT_REQ_UINT64 }, // deprecated
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync { "-format", 'o', RTGETOPT_REQ_STRING }, // deprecated
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync { "-static", 'F', RTGETOPT_REQ_NOTHING }, // deprecated
12767477bc2dbc7815e4784576a15c990f5590d3vboxsync { "-variant", 'm', RTGETOPT_REQ_STRING }, // deprecated
12767477bc2dbc7815e4784576a15c990f5590d3vboxsync { "-type", 't', RTGETOPT_REQ_STRING }, // deprecated
12767477bc2dbc7815e4784576a15c990f5590d3vboxsync { "-comment", 'c', RTGETOPT_REQ_STRING }, // deprecated
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync { "-remember", 'r', RTGETOPT_REQ_NOTHING }, // deprecated
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync { "--register", 'r', RTGETOPT_REQ_NOTHING }, // deprecated (inofficial)
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync { "-register", 'r', RTGETOPT_REQ_NOTHING }, // deprecated
12767477bc2dbc7815e4784576a15c990f5590d3vboxsync MediumVariant_T DiskVariant = MediumVariant_Standard;
12767477bc2dbc7815e4784576a15c990f5590d3vboxsync bool fRemember = false;
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync // start at 0 because main() has hacked both the argc and argv given to us
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync RTGetOptInit(&GetState, a->argc, a->argv, g_aCreateHardDiskOptions, RT_ELEMENTS(g_aCreateHardDiskOptions),
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync vrc = parseDiskVariant(ValueUnion.psz, &DiskVariant);
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync return errorArgument("Invalid hard disk variant '%s'", ValueUnion.psz);
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync return errorArgument("Invalid hard disk type '%s'", ValueUnion.psz);
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync return errorSyntax(USAGE_CREATEHD, "Invalid parameter '%s'", ValueUnion.psz);
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync return errorSyntax(USAGE_CREATEHD, "Invalid option -%c", c);
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync return errorSyntax(USAGE_CREATEHD, "Invalid option case %i", c);
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync return errorSyntax(USAGE_CREATEHD, "unknown option: %s\n", ValueUnion.psz);
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync return errorSyntax(USAGE_CREATEHD, "%s: %Rrs", ValueUnion.pDef->pszLong, c);
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync return errorSyntax(USAGE_CREATEHD, "error: %Rrs", c);
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync /* check the outcome */
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync return errorSyntax(USAGE_CREATEHD, "Parameters --filename and --size are required");
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync /* check for filename extension */
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync if (strFormat.compare("vmdk", iprt::MiniString::CaseInsensitive) == 0)
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync else if (strFormat.compare("vhd", iprt::MiniString::CaseInsensitive) == 0)
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync CHECK_ERROR(a->virtualBox, CreateHardDisk(format, filename, hardDisk.asOutParam()));
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync /* we will close the hard disk after the storage has been successfully
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * created unless fRemember is set */
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync bool doClose = false;
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync CHECK_ERROR(hardDisk,COMSETTER(Description)(comment));
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync CHECK_ERROR(hardDisk, CreateBaseStorage(sizeMB, DiskVariant, progress.asOutParam()));
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync RTPrintf("Error: failed to create hard disk. Error message: %lS\n", info.getText().raw());
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync RTPrintf("Error: failed to create hard disk. No error message available!\n");
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync CHECK_ERROR(hardDisk, COMGETTER(Id)(uuid.asOutParam()));
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync RTPrintf("Disk image created. UUID: %s\n", Utf8Str(uuid).c_str());
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#if 0 /* disabled until disk shrinking is implemented based on VBoxHDD */
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncstatic DECLCALLBACK(int) hardDiskProgressCallback(PVM pVM, unsigned uPercent, void *pvUser)
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncstatic const RTGETOPTDEF g_aModifyHardDiskOptions[] =
int vrc;
bool AutoReset = false;
RTGetOptInit(&GetState, a->argc, a->argv, g_aModifyHardDiskOptions, RT_ELEMENTS(g_aModifyHardDiskOptions),
fModifyDiskType = true;
fModifyAutoReset = true;
fModifyCompact = true;
case VINF_GETOPT_NOT_OPTION:
if (!FilenameOrUuid)
if (RT_C_IS_PRINT(c))
else if (c == VERR_GETOPT_UNKNOWN_OPTION)
if (!FilenameOrUuid)
if (!hardDisk)
if (fModifyDiskType)
if (fModifyAutoReset)
if (fModifyCompact)
bool unknown = false;
if (!hardDisk)
unknown = true;
rc = a->virtualBox->OpenHardDisk(Bstr(FilenameOrUuid), AccessMode_ReadWrite, false, Bstr(""), false, Bstr(""), hardDisk.asOutParam());
CHECK_ERROR(a->virtualBox, OpenHardDisk(Bstr(szFilenameAbs), AccessMode_ReadWrite, false, Bstr(""), false, Bstr(""), hardDisk.asOutParam()));
CHECK_ERROR(a->virtualBox, OpenHardDisk(Bstr(FilenameOrUuid), AccessMode_ReadWrite, false, Bstr(""), false, Bstr(""), hardDisk.asOutParam()));
if (unknown)
int vrc;
bool fExisting = false;
bool fRemember = false;
bool fSetDiskType = false;
RTGetOptInit(&GetState, a->argc, a->argv, g_aCloneHardDiskOptions, RT_ELEMENTS(g_aCloneHardDiskOptions),
fExisting = true;
fRemember = true;
fSetDiskType = true;
case VINF_GETOPT_NOT_OPTION:
if (RT_C_IS_GRAPH(c))
else if (c == VERR_GETOPT_UNKNOWN_OPTION)
bool fSrcUnknown = false;
bool fDstUnknown = false;
rc = a->virtualBox->OpenHardDisk(src, AccessMode_ReadWrite, false, Bstr(""), false, Bstr(""), srcDisk.asOutParam());
CHECK_ERROR(a->virtualBox, OpenHardDisk(Bstr(szFilenameAbs), AccessMode_ReadWrite, false, Bstr(""), false, Bstr(""), srcDisk.asOutParam()));
CHECK_ERROR(a->virtualBox, OpenHardDisk(src, AccessMode_ReadWrite, false, Bstr(""), false, Bstr(""), srcDisk.asOutParam()));
fSrcUnknown = true;
if (fExisting)
rc = a->virtualBox->OpenHardDisk(dst, AccessMode_ReadWrite, false, Bstr(""), false, Bstr(""), dstDisk.asOutParam());
CHECK_ERROR_BREAK(a->virtualBox, OpenHardDisk(Bstr(szFilenameAbs), AccessMode_ReadWrite, false, Bstr(""), false, Bstr(""), dstDisk.asOutParam()));
CHECK_ERROR_BREAK(a->virtualBox, OpenHardDisk(dst, AccessMode_ReadWrite, false, Bstr(""), false, Bstr(""), dstDisk.asOutParam()));
fDstUnknown = true;
fRemember = true;
else if (fSetDiskType)
if (fSrcUnknown)
bool fReadFromStdIn = false;
RTGetOptInit(&GetState, argc, argv, g_aConvertFromRawHardDiskOptions, RT_ELEMENTS(g_aConvertFromRawHardDiskOptions),
case VINF_GETOPT_NOT_OPTION:
if (!srcfilename)
else if (!dstfilename)
if (fReadFromStdIn)
File = 0;
goto out;
if (fReadFromStdIn)
goto out;
RTPrintf("Creating %s image with size %RU64 bytes (%RU64MB)...\n", (uImageFlags & VD_IMAGE_FLAGS_FIXED) ? "fixed" : "dynamic", cbFile, (cbFile + _1M - 1) / _1M);
goto out;
goto out;
if (!pvBuf)
goto out;
offFile = 0;
cbRead = 0;
goto out;
out:
if (pvBuf)
if (pDisk)
int vrc;
bool fIntNet = false;
RTGetOptInit(&GetState, a->argc, a->argv, g_aAddiSCSIDiskOptions, RT_ELEMENTS(g_aAddiSCSIDiskOptions),
fIntNet = true;
case VINF_GETOPT_NOT_OPTION:
if (RT_C_IS_PRINT(c))
else if (c == VERR_GETOPT_UNKNOWN_OPTION)
// Bstr ("iqn.2008-04.com.sun.virtualbox.initiator").detachTo (values.appendedRaw());
if (fIntNet)
RTGetOptInit(&GetState, a->argc, a->argv, g_aShowHardDiskInfoOptions, RT_ELEMENTS(g_aShowHardDiskInfoOptions),
case VINF_GETOPT_NOT_OPTION:
if (!FilenameOrUuid)
if (RT_C_IS_PRINT(c))
else if (c == VERR_GETOPT_UNKNOWN_OPTION)
if (!FilenameOrUuid)
bool unknown = false;
rc = a->virtualBox->OpenHardDisk(Bstr(FilenameOrUuid), AccessMode_ReadWrite, false, Bstr(""), false, Bstr(""), hardDisk.asOutParam());
CHECK_ERROR(a->virtualBox, OpenHardDisk(Bstr(szFilenameAbs), AccessMode_ReadWrite, false, Bstr(""), false, Bstr(""), hardDisk.asOutParam()));
CHECK_ERROR(a->virtualBox, OpenHardDisk(Bstr(FilenameOrUuid), AccessMode_ReadWrite, false, Bstr(""), false, Bstr(""), hardDisk.asOutParam()));
unknown = true;
if (description)
switch (type)
case MediumType_Normal:
case MediumType_Immutable:
case MediumType_Writethrough:
case MediumType_Shareable:
if (!unknown)
if (unknown)
int vrc;
bool fDiskType = false;
bool fSetImageId = false;
bool fSetParentId = false;
fDiskType = true;
fSetImageId = true;
fSetParentId = true;
case VINF_GETOPT_NOT_OPTION:
if (!Filename)
if (RT_C_IS_PRINT(c))
else if (c == VERR_GETOPT_UNKNOWN_OPTION)
if (!Filename)
rc = a->virtualBox->OpenHardDisk(Bstr(Filename), AccessMode_ReadWrite, fSetImageId, ImageIdStr, fSetParentId, ParentIdStr, hardDisk.asOutParam());
CHECK_ERROR(a->virtualBox, OpenHardDisk(Bstr(szFilenameAbs), AccessMode_ReadWrite, fSetImageId, ImageIdStr, fSetParentId, ParentIdStr, hardDisk.asOutParam()));
CHECK_ERROR(a->virtualBox, OpenHardDisk(Bstr(Filename), AccessMode_ReadWrite, fSetImageId, ImageIdStr, fSetParentId, ParentIdStr, hardDisk.asOutParam()));
CHECK_ERROR(a->virtualBox, OpenFloppyImage(Bstr(szFilenameAbs), ImageIdStr, floppyImage.asOutParam()));
bool fDelete = false;
RTGetOptInit(&GetState, a->argc, a->argv, g_aCloseMediumOptions, RT_ELEMENTS(g_aCloseMediumOptions),
fDelete = true;
case VINF_GETOPT_NOT_OPTION:
if (!FilenameOrUuid)
if (RT_C_IS_PRINT(c))
else if (c == VERR_GETOPT_UNKNOWN_OPTION)
if (!FilenameOrUuid)
if (!medium)
if (!medium)
if (!medium)
if (fDelete)