VBoxManage

来自百合仙子's Wiki
跳转到导航 跳转到搜索

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 那边需要重新注册磁盘。)

参见

外部链接

参考资料