Skip to content
This repository was archived by the owner on Feb 27, 2018. It is now read-only.

Commit d4d83dd

Browse files
committed
Merge pull request #79 from yacn/feature/basevmdk
Adds config option to specify a base disk image for persistence partition
2 parents a31132e + f28bedb commit d4d83dd

3 files changed

Lines changed: 42 additions & 4 deletions

File tree

cmds.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,18 @@ func cmdInit() int {
121121
return 1
122122
}
123123

124-
if err := makeDiskImage(diskImg, B2D.DiskSize); err != nil {
125-
logf("Failed to create disk image %q: %s", diskImg, err)
126-
return 1
127-
}
124+
if B2D.VMDK != "" {
125+
logf("Using %v as base VMDK", B2D.VMDK)
126+
if err := copyDiskImage(diskImg, B2D.VMDK); err != nil {
127+
logf("Failed to copy disk image %v from %v: %s", diskImg, B2D.VMDK, err)
128+
return 1
129+
}
130+
} else {
131+
if err := makeDiskImage(diskImg, B2D.DiskSize); err != nil {
132+
logf("Failed to create disk image %q: %s", diskImg, err)
133+
return 1
134+
}
135+
}
128136
}
129137

130138
if err := m.AttachStorage("SATA", vbx.StorageMedium{Port: 1, Device: 0, DriveType: vbx.DriveHDD, Medium: diskImg}); err != nil {

config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ var B2D struct {
2828
VM string // virtual machine name
2929
Dir string // boot2docker directory
3030
ISO string // boot2docker ISO image path
31+
VMDK string // base VMDK to use as persistent disk
3132
DiskSize uint // VM disk image size (MB)
3233
Memory uint // VM memory size (MB)
3334

@@ -106,6 +107,7 @@ func config() (*flag.FlagSet, error) {
106107
flags.StringVar(&B2D.VM, "vm", "boot2docker-vm", "virtual machine name.")
107108
flags.StringVarP(&B2D.Dir, "dir", "d", dir, "boot2docker config directory.")
108109
flags.StringVar(&B2D.ISO, "iso", filepath.Join(dir, "boot2docker.iso"), "path to boot2docker ISO image.")
110+
flags.StringVar(&B2D.VMDK, "basevmdk", "", "Path to VMDK to use as base for persistent partition")
109111
vbm := "VBoxManage"
110112
if p := os.Getenv("VBOX_INSTALL_PATH"); p != "" && runtime.GOOS == "windows" {
111113
vbm = filepath.Join(p, "VBoxManage.exe")

vbm.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package main
22

33
import (
44
"bytes"
5+
"io"
56
"os"
67
"path/filepath"
78

@@ -66,6 +67,33 @@ func getHostOnlyNetworkInterface() (string, error) {
6667
return hostonlyNet.Name, nil
6768
}
6869

70+
// Copy disk image from given source path to destination
71+
func copyDiskImage(dst, src string) (err error) {
72+
// Open source disk image
73+
srcImg, err := os.Open(src)
74+
if err != nil {
75+
return err
76+
}
77+
closeSrcImg := func() {
78+
if ee := srcImg.Close(); ee != nil {
79+
err = ee
80+
}
81+
}
82+
defer closeSrcImg()
83+
dstImg, err := os.Create(dst)
84+
if err != nil {
85+
return err
86+
}
87+
closeDstImg := func() {
88+
if ee := dstImg.Close(); ee != nil {
89+
err = ee
90+
}
91+
}
92+
defer closeDstImg()
93+
_, err = io.Copy(dstImg, srcImg)
94+
return err
95+
}
96+
6997
// Make a boot2docker VM disk image with the given size (in MB).
7098
func makeDiskImage(dest string, size uint) error {
7199
// Create the dest dir.

0 commit comments

Comments
 (0)