// Make a boot2docker VM disk image. func (d *Driver) generateDiskImage(size int) error { tarBuf, err := mcnutils.MakeDiskImage(d.publicSSHKeyPath()) if err != nil { return err } minSizeBytes := int64(minDiskSize) << 20 // usually won't fit in 32-bit int (max 2GB) //Expand the initial image if needed if bufLen := int64(tarBuf.Len()); bufLen > minSizeBytes { bufLenMBytes := bufLen>>20 + 1 if err := prldisktool("resize", "--hdd", d.diskPath(), "--size", fmt.Sprintf("%d", bufLenMBytes)); err != nil { return err } } // Find hds file hdsList, err := filepath.Glob(d.diskPath() + "/*.hds") if err != nil { return err } if len(hdsList) == 0 { return fmt.Errorf("Could not find *.hds image in %s", d.diskPath()) } hdsPath := hdsList[0] log.Debugf("HDS image path: %s", hdsPath) // Write tar to the hds file hds, err := os.OpenFile(hdsPath, os.O_WRONLY, 0644) if err != nil { return err } defer hds.Close() hds.Seek(0, os.SEEK_SET) _, err = hds.Write(tarBuf.Bytes()) if err != nil { return err } hds.Close() // Convert image to expanding type and resize it if err := prldisktool("convert", "--expanding", "--hdd", d.diskPath()); err != nil { return err } if err := prldisktool("resize", "--hdd", d.diskPath(), "--size", fmt.Sprintf("%d", size)); err != nil { return err } return nil }
// Make a boot2docker VM disk image. func (d *Driver) generateDiskImage(size int) error { log.Debugf("Creating %d MB hard disk image...", size) tarBuf, err := mcnutils.MakeDiskImage(d.publicSSHKeyPath()) if err != nil { return err } log.Debug("Calling inner createDiskImage") return createDiskImage(d.diskPath(), size, tarBuf) }
// Make a boot2docker VM disk image. func (c *defaultDiskCreator) Create(size int, publicSSHKeyPath, diskPath string) error { log.Debugf("Creating %d MB hard disk image...", size) tarBuf, err := mcnutils.MakeDiskImage(publicSSHKeyPath) if err != nil { return err } log.Debug("Calling inner createDiskImage") return createDiskImage(diskPath, size, tarBuf) }
// generateDiskImage creates a small fixed vhd, put the tar in, convert to dynamic, then resize func (d *Driver) generateDiskImage() (string, error) { diskImage := d.ResolveStorePath("disk.vhd") fixed := d.ResolveStorePath("fixed.vhd") // Resizing vhds requires administrator priviledges // incase the user is only a hyper-v admin then create the disk at the target size to avoid resizing. isWindowsAdmin, err := isWindowsAdministrator() if err != nil { return "", err } fixedDiskSize := "10MB" if !isWindowsAdmin { fixedDiskSize = toMb(d.DiskSize) } log.Infof("Creating VHD") if err := cmd("New-VHD", "-Path", quote(fixed), "-SizeBytes", fixedDiskSize, "-Fixed"); err != nil { return "", err } tarBuf, err := mcnutils.MakeDiskImage(d.publicSSHKeyPath()) if err != nil { return "", err } file, err := os.OpenFile(fixed, os.O_WRONLY, 0644) if err != nil { return "", err } defer file.Close() file.Seek(0, os.SEEK_SET) _, err = file.Write(tarBuf.Bytes()) if err != nil { return "", err } file.Close() if err := cmd("Convert-VHD", "-Path", quote(fixed), "-DestinationPath", quote(diskImage), "-VHDType", "Dynamic", "-DeleteSource"); err != nil { return "", err } if isWindowsAdmin { if err := cmd("Resize-VHD", "-Path", quote(diskImage), "-SizeBytes", toMb(d.DiskSize)); err != nil { return "", err } } return diskImage, nil }
// generateDiskImage creates a small fixed vhd, put the tar in, convert to dynamic, then resize func (d *Driver) generateDiskImage() (string, error) { diskImage := d.ResolveStorePath("disk.vhd") fixed := d.ResolveStorePath("fixed.vhd") log.Infof("Creating VHD") if err := cmd("New-VHD", "-Path", quote(fixed), "-SizeBytes", "10MB", "-Fixed"); err != nil { return "", err } tarBuf, err := mcnutils.MakeDiskImage(d.publicSSHKeyPath()) if err != nil { return "", err } file, err := os.OpenFile(fixed, os.O_WRONLY, 0644) if err != nil { return "", err } defer file.Close() file.Seek(0, os.SEEK_SET) _, err = file.Write(tarBuf.Bytes()) if err != nil { return "", err } file.Close() if err := cmd("Convert-VHD", "-Path", quote(fixed), "-DestinationPath", quote(diskImage), "-VHDType", "Dynamic"); err != nil { return "", err } if err := cmd("Resize-VHD", "-Path", quote(diskImage), "-SizeBytes", toMb(d.DiskSize)); err != nil { return "", err } return diskImage, nil }