VBoxManage
跳转到导航
跳转到搜索
VBoxManage命令及其它一些高级操作。另参见VirtualBox。
对虚拟机
list
显示所有虚拟机:
VBoxManage list vms
VirtualBox Command Line Management Interface Version 3.0.12 (C) 2005-2009 Sun Microsystems, Inc. All rights reserved. "WinXP" {d7f3f801-4c06-4e6c-a4f7-f687408c8ca2} "WinXP_2" {ea047f03-6af0-4e9e-999e-b284da257a1e} "CentOS" {632a921c-0e73-4fa2-8bb0-59827136f956} "Win7" {9d9007d5-36dc-4ecf-a22b-7ab370102418}
显示正在运行的虚拟机:
VBoxManage list runningvms
显示格式同上。
操纵虚拟机
启动虚拟机:
VBoxManage startvm CentOS
保存状态后退出虚拟机(休眠):
VBoxManage controlvm CentOS savestate
磁盘文件
克隆虚拟磁盘
VBoxManage clonehd SRC NEW
注意文件会被放到默认虚拟磁盘目录(至少目标中不写路径时是这样)
更新 UUID
比如通过 cp --reflink=always
复制过之后,需要更新 vdi 文件的 UUID。[1]
VBoxManage internalcommands sethduuid xxx.vdi
格式转换
从 img 转换为 vdi:
VBoxManage convertfromraw -format VDI filename.img filename.vdi
挂载虚拟磁盘
Test if your VDI image is fixed-size:
od -j76 -N4 -td4 image.vdi | awk 'NR==1{print $2;}'
返回2是固定分配的,1是动态分配的。
Find out where virtual disk exactly starts:
od -j344 -N4 -td4 image.vdi | awk 'NR==1{print $2;}'
读取分区表(16896 是上一步的结果)
dd if=image.vdi bs=1b count=1 skip=$((16896/512)) 2>/dev/null|file -
使用 mount 挂载
sudo mount -o loop,offset=$((16896+$((63*512)))) -t ntfs image.vdi /mnt
在已知虚拟磁盘是固定分配的并且确定文件系统类型之后一步到位:(zsh)
file=image.vdi
start=$(od -j344 -N4 -td4 $file | awk 'NR==1{print $2;}')
offset=$(dd if=$file bs=1b count=1 skip=$(($start/512)) 2>/dev/null|file -|grep -m1 -oP '(?<=startsector )\d+')
sudo mount -o loop,offset=$(($start+$(($offset*512)))) -t ntfs $file /mnt
使用本机磁盘作为虚拟磁盘
使用整个磁盘:[2]
VBoxManage internalcommands createrawvmdk -filename raw.vmdk -rawdisk /dev/sdb
使用指定分区(其它分区将读为零、写入忽略):[3]
VBoxManage internalcommands createrawvmdk -filename hostdisk2.vmdk -rawdisk /dev/sda -partitions 1,6
其中 MBR 是独立的(*-pt.vmdk 文件),所以在启动虚拟机之后可以更新引导器。比如对于 Windows 系统,使用管理员权限执行:
bootsect /nt60 c: /mbr
然后关闭虚拟机。备份 *-pt.vmdk 后重新创建不含启动分区的 vmdk 文件,再将 *-pt.vmdk 覆盖回去。(vbox 那边需要重新注册磁盘。)