cmd: Unify disk command line options for local hypervisors

- '-disk-size' is now defaults to MB (but can be GB when appending 'G')
- The disk will be created if it doesn't exist (didn't happen in qemu)

Update the documentation.

Signed-off-by: Rolf Neugebauer <rolf.neugebauer@docker.com>
This commit is contained in:
Rolf Neugebauer
2017-05-24 12:06:21 +01:00
parent bd43e35846
commit f90fde5a6f
5 changed files with 58 additions and 36 deletions

View File

@@ -27,8 +27,8 @@ func runHyperKit(args []string) {
hyperkitPath := flags.String("hyperkit", "", "Path to hyperkit binary (if not in default location)")
cpus := flags.Int("cpus", 1, "Number of CPUs")
mem := flags.Int("mem", 1024, "Amount of memory in MB")
diskSz := flags.Int("disk-size", 0, "Size of Disk in MB")
disk := flags.String("disk", "", "Path to disk image to used")
diskSzFlag := flags.String("disk-size", "", "Size of Disk in MB (or GB if 'G' is appended)")
disk := flags.String("disk", "", "Path to disk image to use")
data := flags.String("data", "", "Metadata to pass to VM (either a path to a file or a string)")
ipStr := flags.String("ip", "", "IP address for the VM")
state := flags.String("state", "", "Path to directory to keep VM state in")
@@ -52,6 +52,11 @@ func runHyperKit(args []string) {
log.Fatalf("Could not create state directory: %v", err)
}
diskSz, err := getDiskSizeMB(*diskSzFlag)
if err != nil {
log.Fatalf("Could parse disk-size %s: %v", *diskSzFlag, err)
}
isoPath := ""
if *data != "" {
var d []byte
@@ -92,7 +97,7 @@ func runHyperKit(args []string) {
log.Fatalf("Cannot open cmdline file: %v", err)
}
if *diskSz != 0 && *disk == "" {
if diskSz != 0 && *disk == "" {
*disk = filepath.Join(*state, "disk.img")
}
@@ -114,7 +119,7 @@ func runHyperKit(args []string) {
h.VSock = true
h.CPUs = *cpus
h.Memory = *mem
h.DiskSize = *diskSz
h.DiskSize = diskSz
err = h.Run(string(cmdline))
if err != nil {

View File

@@ -58,8 +58,8 @@ func runQemu(args []string) {
kernelBoot := flags.Bool("kernel", false, "Boot image is kernel+initrd+cmdline 'path'-kernel/-initrd/-cmdline")
// Paths and settings for disks
diskSzFlag := flags.String("disk-size", "", "Size of Disk in MB (or GB if 'G' is appended)")
disk := flags.String("disk", "", "Path to disk image to use")
diskSz := flags.String("disk-size", "", "Size of disk to create, only created if it doesn't exist")
diskFmt := flags.String("disk-format", "qcow2", "Format of disk: raw, qcow2 etc")
// Paths and settings for UEFI firware
@@ -87,6 +87,7 @@ func runQemu(args []string) {
os.Exit(1)
}
path := remArgs[0]
prefix := path
_, err := os.Stat(path)
stat := err == nil
@@ -103,13 +104,23 @@ func runQemu(args []string) {
// if path ends in .iso they meant an ISO
if strings.HasSuffix(path, ".iso") {
*isoBoot = true
prefix = strings.TrimSuffix(path, ".iso")
}
// autodetect EFI ISO from our default naming
if strings.HasSuffix(path, "-efi.iso") {
*uefiBoot = true
prefix = strings.TrimSuffix(path, "-efi.iso")
}
}
diskSz, err := getDiskSizeMB(*diskSzFlag)
if err != nil {
log.Fatalf("Could parse disk-size %s: %v", *diskSzFlag, err)
}
if diskSz != 0 && *disk == "" {
*disk = prefix + "-disk.img"
}
// user not trying to boot off ISO or kernel, so assume booting from a disk image
if !*kernelBoot && !*isoBoot {
if *disk != "" {
@@ -126,7 +137,7 @@ func runQemu(args []string) {
Kernel: *kernelBoot,
GUI: *enableGUI,
DiskPath: *disk,
DiskSize: *diskSz,
DiskSize: fmt.Sprintf("%dM", diskSz),
DiskFormat: *diskFmt,
FWPath: *fw,
Arch: *arch,

View File

@@ -76,8 +76,8 @@ func runVMware(args []string) {
}
cpus := flags.Int("cpus", 1, "Number of CPUs")
mem := flags.Int("mem", 1024, "Amount of memory in MB")
diskSzFlag := flags.String("disk-size", "", "Size of Disk in MB (or GB if 'G' is appended)")
disk := flags.String("disk", "", "Path to disk image to use")
diskSz := flags.String("disk-size", "", "Size of the disk to create, only created if it doesn't exist")
state := flags.String("state", "", "Path to directory to keep VM state in")
if err := flags.Parse(args); err != nil {
@@ -99,6 +99,11 @@ func runVMware(args []string) {
log.Fatalf("Could not create state directory: %v", err)
}
diskSz, err := getDiskSizeMB(*diskSzFlag)
if err != nil {
log.Fatalf("Could parse disk-size %s: %v", *diskSzFlag, err)
}
var vmrunPath, vmDiskManagerPath string
var vmrunArgs []string
@@ -131,7 +136,7 @@ func runVMware(args []string) {
log.Fatalf("ERROR VMware executables can not be found, ensure software is installed")
}
if *disk == "" && *diskSz != "" {
if diskSz != 0 && *disk == "" {
*disk = filepath.Join(*state, "disk.vmdk")
}
if *disk != "" {
@@ -147,7 +152,7 @@ func runVMware(args []string) {
}
if os.IsNotExist(err) {
log.Infof("Creating new VMware disk [%s]", *disk)
vmDiskCmd := exec.Command(vmDiskManagerPath, "-c", "-s", *diskSz, "-a", "lsilogic", "-t", "0", *disk)
vmDiskCmd := exec.Command(vmDiskManagerPath, "-c", "-s", fmt.Sprintf("%dMB", diskSz), "-a", "lsilogic", "-t", "0", *disk)
if err = vmDiskCmd.Run(); err != nil {
log.Fatalf("Error creating disk [%s]: %v", *disk, err)
}
@@ -165,7 +170,7 @@ func runVMware(args []string) {
// Create the .vmx file
vmxPath := filepath.Join(*state, "linuxkit.vmx")
err := ioutil.WriteFile(vmxPath, []byte(vmx), 0644)
err = ioutil.WriteFile(vmxPath, []byte(vmx), 0644)
if err != nil {
log.Fatalf("Error writing .vmx file: %v", err)
}

View File

@@ -97,3 +97,24 @@ func stringToIntArray(l string, sep string) ([]int, error) {
}
return i, nil
}
// Parse a string which is either a number in MB, or a number with
// either M (for Megabytes) or G (for GigaBytes) as a suffix and
// returns the number in MB. Return 0 if string is empty.
func getDiskSizeMB(s string) (int, error) {
if s == "" {
return 0, nil
}
sz := len(s)
if strings.HasSuffix(s, "G") {
i, err := strconv.Atoi(s[:sz-1])
if err != nil {
return 0, err
}
return i * 1024, nil
}
if strings.HasSuffix(s, "M") {
s = s[:sz-1]
}
return strconv.Atoi(s)
}