编写VirtualBox和VM映像目录?

时间:2013-12-26 00:24:36

标签: shell virtualbox

我从桌面运行一个脚本,根据需要创建虚拟机(如下所示)。

当脚本从我的桌面执行时(几乎总是如此),VM(<name>.vbox)保存到~/VirtualBox VMs/<name>但硬盘驱动器(<name>.vdi)保存到我的桌面。然后我必须移动硬盘并修复*.vbox文件中的位置。

VBoxManage showvminfo未提供目录位置(尽管可能会从相关字段中解析)。

VBoxManage有一个setproperty提供machinefolder,但它没有相应的getproperty。调用VBoxManage setproperty machinefolder(不带参数)会导致错误。

如何获取VBoxManage用于保存虚拟机的目录?

MEDIA=ubuntu-12.04.3-server-amd64.iso
VMNAME=openstack-swift-2
VMOSTYPE=Ubuntu_64

##########################################
# Public network vboxnet0 (10.1.0.0/16)
VBoxManage hostonlyif create
VBoxManage hostonlyif ipconfig vboxnet0 --ip 10.1.0.254 --netmask 255.255.0.0

##########################################
# Private network vboxnet1 (10.2.0.0/16)
VBoxManage hostonlyif create
VBoxManage hostonlyif ipconfig vboxnet1 --ip 10.2.0.254 --netmask 255.255.0.0

##########################################
# VirtualBox Machine
VBoxManage createvm --name "$VMNAME" --ostype "$VMOSTYPE" --register

# VirtualBox CPU and Memory
VBoxManage modifyvm "$VMNAME" --cpus 1 --cpuexecutioncap 80 --memory 2048

# VirtualBox Network
VBoxManage modifyvm "$VMNAME" --nic1 nat \
    --nic2 hostonly --hostonlyadapter2 vboxnet0 \
    --nic3 hostonly --hostonlyadapter3 vboxnet1

# VirtualBox DVD
VBoxManage storagectl "$VMNAME" --name "IDE Controller" \
    --add ide --controller PIIX4 --hostiocache on --bootable on
VBoxManage storageattach "$VMNAME" --storagectl "IDE Controller" \
    --type dvddrive --port 0 --device 0 --medium "$MEDIA"

# VirtualBox HDD
VBoxManage createhd --filename "$VMNAME".vdi --size 20480
VBoxManage storagectl "$VMNAME" --name "SATA Controller" \
    --add sata --controller IntelAHCI --hostiocache on --bootable on
VBoxManage storageattach "$VMNAME" --storagectl "SATA Controller" \
    --type hdd --port 0 --device 0 --medium "$VMNAME.vdi"

2 个答案:

答案 0 :(得分:5)

这是我为其他人徘徊在这个页面上的想法。首先,对list使用systemproperties。这会得到类似的东西:

$ VBoxManage list systemproperties
API version:                     4_2
Minimum guest RAM size:          4 Megabytes
Maximum guest RAM size:          2097152 Megabytes
Minimum video RAM size:          1 Megabytes
Maximum video RAM size:          256 Megabytes
Minimum guest CPU count:         1
Maximum guest CPU count:         32
...
Default machine folder:          /home/jwalton/VirtualBox VMs
VRDE auth library:               VBoxAuth
Webservice auth. library:        VBoxAuth

然后解析Default machine folderawk用于修剪前导空格(您必须小心,因为路径中有空格):

TPATH=`VBoxManage list systemproperties | grep -i "default machine folder:" \
    | cut -b 24- | awk '{gsub(/^ +| +$/,"")}1'`
VMPATH="$TPATH/$VMNAME"

然后,使用以下命令修改HDD创建:

VBoxManage createhd --filename "$VMPATH/$VMNAME.vdi" --size 20480
VBoxManage storagectl "$VMNAME" --name "SATA Controller" \
    --add sata --controller IntelAHCI --hostiocache on --bootable on
VBoxManage storageattach "$VMNAME" --storagectl "SATA Controller" \
    --type hdd --port 0 --device 0 --medium "$VMPATH/$VMNAME.vdi"

答案 1 :(得分:0)

我使用前面提到的解决方案已有一段时间:

VBoxManage list systemproperties | grep "Default machine folder"

但是有一天我的磁盘已满,所以我不得不将“默认计算机文件夹”更改为其他位置。

我无所事事的解决方案突然无法找到现有的磁盘映像!

所以我这样改变了:

MYPATH=`VBoxManage showvminfo "<machine name>" 2>/dev/null | grep -E "^Config file" | cut -d: -f2 | sed -s 's#^[[:space:]]*##g'`; echo "${MYPATH%/*}"

它读取现有的计算机文件夹并提取其路径。它仍然需要常用的Linux命令(sed,grep,cut)。最后一个“ echo”命令是特定于bash的。

这并不完美:我仍然必须区分新的和/或现有的VM计算机。 =>我将两种解决方案放在一起:

  • 打印现有的VM计算机文件夹
  • 不存在时,打印默认位置。

最后一线(只需替换“ VM机器名称”,在其中两次!):

VMPATH=`VBoxManage showvminfo "VM machine name" 2>/dev/null | grep -E "^Config file" | cut -d: -f2 | sed -s 's#^[[:space:]]*##g'`; VMDEFAULTPATH=`VBoxManage list systemproperties | grep "Default machine folder" | cut -d: -f2 | sed -s 's#^[[:space:]]*##g'`; if [ "$VMPATH" != "" ];then echo "${VMPATH%/*}"; else echo "${VMDEFAULTPATH}/VM machine name"; fi