mirror of https://github.com/docker/docs.git
101 lines
2.7 KiB
Go
101 lines
2.7 KiB
Go
package virtualbox
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
|
|
"github.com/docker/machine/libmachine/log"
|
|
"golang.org/x/sys/windows/registry"
|
|
)
|
|
|
|
// IsVTXDisabled checks if VT-X is disabled in the BIOS. If it is, the vm will fail to start.
|
|
// If we can't be sure it is disabled, we carry on and will check the vm logs after it's started.
|
|
func (d *Driver) IsVTXDisabled() bool {
|
|
errmsg := "Couldn't check that VT-X/AMD-v is enabled. Will check that the vm is properly created: %v"
|
|
output, err := cmdOutput("wmic", "cpu", "get", "VirtualizationFirmwareEnabled")
|
|
if err != nil {
|
|
log.Debugf(errmsg, err)
|
|
return false
|
|
}
|
|
|
|
disabled := strings.Contains(output, "FALSE")
|
|
return disabled
|
|
}
|
|
|
|
// cmdOutput runs a shell command and returns its output.
|
|
func cmdOutput(name string, args ...string) (string, error) {
|
|
cmd := exec.Command(name, args...)
|
|
log.Debugf("COMMAND: %v %v", name, strings.Join(args, " "))
|
|
|
|
stdout, err := cmd.Output()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
log.Debugf("STDOUT:\n{\n%v}", string(stdout))
|
|
|
|
return string(stdout), nil
|
|
}
|
|
|
|
func detectVBoxManageCmd() string {
|
|
cmd := "VBoxManage"
|
|
if p := os.Getenv("VBOX_INSTALL_PATH"); p != "" {
|
|
if path, err := exec.LookPath(filepath.Join(p, cmd)); err == nil {
|
|
return path
|
|
}
|
|
}
|
|
|
|
if p := os.Getenv("VBOX_MSI_INSTALL_PATH"); p != "" {
|
|
if path, err := exec.LookPath(filepath.Join(p, cmd)); err == nil {
|
|
return path
|
|
}
|
|
}
|
|
|
|
// Look in default installation path for VirtualBox version > 5
|
|
if path, err := exec.LookPath(filepath.Join("C:\\Program Files\\Oracle\\VirtualBox", cmd)); err == nil {
|
|
return path
|
|
}
|
|
|
|
// Look in windows registry
|
|
if p, err := findVBoxInstallDirInRegistry(); err == nil {
|
|
if path, err := exec.LookPath(filepath.Join(p, cmd)); err == nil {
|
|
return path
|
|
}
|
|
}
|
|
|
|
return detectVBoxManageCmdInPath() //fallback to path
|
|
}
|
|
|
|
func findVBoxInstallDirInRegistry() (string, error) {
|
|
registryKey, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Oracle\VirtualBox`, registry.QUERY_VALUE)
|
|
if err != nil {
|
|
errorMessage := fmt.Sprintf("Can't find VirtualBox registry entries, is VirtualBox really installed properly? %s", err)
|
|
log.Debugf(errorMessage)
|
|
return "", fmt.Errorf(errorMessage)
|
|
}
|
|
|
|
defer registryKey.Close()
|
|
|
|
installDir, _, err := registryKey.GetStringValue("InstallDir")
|
|
if err != nil {
|
|
errorMessage := fmt.Sprintf("Can't find InstallDir registry key within VirtualBox registries entries, is VirtualBox really installed properly? %s", err)
|
|
log.Debugf(errorMessage)
|
|
return "", fmt.Errorf(errorMessage)
|
|
}
|
|
|
|
return installDir, nil
|
|
}
|
|
|
|
func getShareDriveAndName() (string, string) {
|
|
return "c/Users", "c:\\Users"
|
|
}
|
|
|
|
func isHyperVInstalled() bool {
|
|
_, err := exec.LookPath("vmms.exe")
|
|
return err == nil
|
|
}
|