VirtualBox下从命令行创建虚拟机
2013-05-07 15:56:48 阿炯

本文在debian 6.0 amd64 无 gui环境下操作,这些操作全部在命令行下完成,同样适用于windows平台(只需注意路径)。
---------------
虚拟机创建的详细步骤
创建一台名为'pde'的debian 64位虚拟机,存放于目录'/home/hto/data/vmos/'下。
VBoxManage createvm --name "pde" --ostype "Debian_64" --register --basefolder /home/hto/data/vmos/

#RedHat 64位系统
VBoxManage createvm --name "origsl" --ostype "RedHat_64" --register --basefolder /home/hto/data/vmos/

成功则会返回:
Virtual machine 'pde' is created and registered.
UUID: 49773fc2-5c72-415c-b911-c3e91faccd89
Settings file: '/home/hto/data/vmos/pde/pde.vbox'

现对其配置进行修改,使其具备基本'计算机'功能。
VBoxManage modifyvm "pde" --memory 1024 --vram 8 --acpi on --ioapic on --hwvirtex on --vtxvpid on --cpus 2 --cpuhotplug on --chipset ich9 --boot1 disk  --boot2 dvd --nic1 bridged --bridgeadapter1 eth0 --nictype1 virtio --nic2 bridged --bridgeadapter2 eth1 --nictype2 82543GC --mouse usb --keyboard usb --vrde on --vrdeport 3380
 
为其创建一块虚拟硬盘,分配固定大小,这样i/o性能最好。
VBoxManage createhd --filename /home/hto/data/vmos/pde/pde.vdi --size 20480 --format VDI --variant Fixed

为机器分配磁盘控制器,这里当然为其分配'stat'控制器了(不推荐使用ide控制器了)。
VBoxManage storagectl "pde" --name "SATA Controller" --add sata --hostiocache on --bootable on

在控制器上加磁盘,当然是刚才我们创建的那块虚拟硬盘。
VBoxManage storageattach "pde" --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium /home/hto/data/vmos/pde/pde.vdi

在控制器上加引导设备及镜像(即可传统意义上的光驱)。
VBoxManage storageattach "pde" --storagectl "SATA Controller" --port 1 --device 0 --type dvddrive --medium /home/hto/sf/os/debian-6.0-amd64-cd-1.iso

移除控制器上的存储设备
Storage Controller Name (0):IDE Controller
Storage Controller Type (0):PIIX4
Storage Controller Instance Number (0):0
Storage Controller Max Port Count (0):2
Storage Controller Port Count (0):2
Storage Controller Bootable (0):on
IDE Controller (0, 0): /home/freeoa/data/vmos/winxp/winxproxy.vdi (UUID: 54d85901-2cfd-426e-ae2d-20f5cd08fc7b)
IDE Controller (0, 1): /home/freeoa/data/vmos/disk/wxpdsk.vdi (UUID: a8109c6c-529b-484e-9fdf-a99b9f66ab97)
IDE Controller (1, 0): /usr/share/virtualbox/VBoxGuestAdditions.iso (UUID: dd5d9253-8f0d-4336-a290-9a7f3998e518)

移除从IDE的主盘(IDE Controller (1,0)),即iso设备
vbm storageattach winxp --storagectl 'IDE Controller' --port 1 --device 0 --type hdd --medium none

移除主IDE的从盘(IDE Controller (0, 1)),即第二块硬盘
vbm storageattach winxp --storagectl 'IDE Controller' --port 0 --device 1 --type hdd --medium none

这里type可以不用指定,要将设备的对应编号对好,再将medium指定为空(none),即可移除该存储设备了。


为机器配置网卡,使用其官方推荐的芯片组(但也要与本机所用的网卡芯片相近),INTEL 服务器 千兆网卡 82543GC PCI-X兼容PCI。
VBoxManage modifyvm "pde" --nictype1 82543GC
VBoxManage modifyvm "pde" --nictype2 Am79C973

注意:网卡编号是从'1'开始的。

---------------
简单的查看及配置调整

查看vbox支持哪些操作系统
VBoxManage list ostypes

查看已经注册的虚拟机
VBoxManage list vms

查看在运行的虚拟机
VBoxManage list runningvms

查看已有的虚拟机的信息
VBoxManage showvminfo vm_name

将'xdeb'的内存修改为512MB
VBoxManage modifyvm "xdeb" --memory "512"

将'xdeb'的显存修改为32MB
VBoxManage modifyvm "xdeb" --vram "32"

将其光驱控制器改为ICH6的驱动(中文环境)
VBoxManage storagectl "xdeb" --name "IDE 控制器" --controller ICH6

控制虚拟机
VBoxManage controlvm <uuid>|<name>
pause|resume|reset|poweroff|savestate|acpipowerbutton|
暂停|继续|重置|关机|保存此时状态关机|调用系统关机|

---------------
又一创建示例
在公司测试机上的使用vbox 4.1创建虚拟机的过程记录:
VBoxManage createvm --name ocentos --ostype RedHat --register --basefolder /data/vmos/

VBoxManage modifyvm ocentos --memory 512 --vram 8 --acpi on --ioapic on --boot1 disk --boot2 dvd --nic1 bridged --nictype1 Am79C973 --bridgeadapter1 eth0 --mouse usb --keyboard usb

VBoxManage storagectl ocentos --add sata --name "SATA Controller" --controller IntelAhci --bootable on

VBoxManage createhd --filename /data/vmos/ocentos/ocentos.vdi --size 20480 --format vdi --variant Fixed

0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Disk image created. UUID: f835f7a3-c503-40b8-b615-e24c831b2fc9

VBoxManage storageattach ocentos --storagectl  "SATA Controller" --port 0 --device 0 --type hdd --medium /data/vmos/ocentos/ocentos.vdi

VBoxManage storageattach ocentos --storagectl  "SATA Controller" --port 1 --device 0 --type dvddrive --medium /home/hto/sf/os/centos-5.8-i386-netinstall.iso

---------------
至此,一台能从光驱引导的虚拟机创建好了,只等'加电'引导了。

虚拟机的运行有两种方式:前台可视与后台隐藏。前者是默认的方法,后者多用于在宿主操作系统无gui(x window)或不需干预的情况下使用,因此这种方式也叫"无头"-'headless'。

vbox的gui展示需要qt或sdl图形库,这个在安装vbox时会看到相关的依赖提示。

在windows或有xwindow(gnome、kde、xfce桌面)用下面的指令开启(与用鼠标点击操作并无不同):
VBoxManage startvm vm_name

将开启新窗口并脱离终端或命令提示符,这样就可以安装系统了。

在无gui的命令行下:
VBoxManage startvm vm_name --type headless

VBoxHeadless  --startvm <name|uuid>

注意:在'startvm'参数后可跟虚拟机的别名或其uuid,有其一即可。通常使用其别名,这样更容易记住。

---------------
如何远程连接管理虚拟机

管理安装在另外一台机器上的虚拟机,这里所面临的情况是:远程Linux主机无gui的情况。从安装到最终使用时这段时间里,对虚拟机的配置都需要在gui环境下操作。配置好ip后,可以使用ssh或远程桌面对虚拟机进行控制。这里的所讨论的'远程连接管理'就是针对这段时间可用的操作方法。

1、为其安装桌面环境
安装基本的x-window及最小桌面,然后进行配置开启远程访问。

1.1、gnome、kde等都可以直接开启远程桌面(使用xdmcp协议),服务启动后侦听在'177'端口,在windows或linux下可以使用Xmanager等工具进行连接。

1.2、使用vnc进行远程访问,需要在宿主系统配置好vnc服务器,这样可以安装那些轻量级的桌面环境。

2、设置操作控制端
这可能需要修改远程宿主机的ssh服务的配置文件,开启如下配置选项:
AllowTcpForwarding yes
X11Forwarding yes


2.1、如果你使用的是安装有linux或bsd的桌面系统来控制,远程的宿主要就不需要安装桌面环境了,仅需要使用ssh的'-x'选项来开启两端的转发,在启动虚拟机时不要使用'headless'方式即可;这样就可以使用鼠标操作了,配置好后就不需要使用这种方式了。后面在启动时将其置于'headless'模式即可。

2.2、在windows下可以使用xshell+xmanager,但需要设置一下:
在xshell主机属性页中:Connection->SSH->Tunneling->'X11 Forwarding'

选中'Forward X11 connections to:'->'Xmanager'。

X-Deep工具也可用来实现此功能。

3、使用vrdp工具
vrdp全称为'VirtualBox Remote Desktop Protocol',兼容于远程桌面的rdp协议。它是'vbox-extpack'工具集系列中的一个,用于控制端连接虚拟的控制协议,这样就可以使用windows下的远程桌面或linux下的rdesktop命令来连接远程宿主机的某端口,这样就可以完全控制该端口对应的虚拟机。

使用该功能要首先安装'expapck'的扩展包,需要注意的是,该包从VirtualBox 4.0开始独立出来且其授权协议是有别于主体(VirtualBox是GPLv2)的,即'VirtualBox Personal Use and Evaluation License (PUEL)'。

将其vrdp远程桌面选项打开
VBoxManage modifyvm "xdeb" --vrdp on

将连接其的远程桌面端口改为3389
VBoxManage modifyvm "xdeb" --vrdpport 3389

修改后,只要该端口没有被占用,即可通过连接宿主机的3389端口来连接。可以安装操作系统、配置ip地址等操作,当然如果虚拟机是windows,可在其内部配置远程桌面,通过为其配置的ip地址(能与操作端互通)和相应端口进行连接控制了。

4、使用RemoteBox管理
RemoteBox 是一个图形化的工具,用来管理远程服务器或者本机的 VirtualBox 虚拟机,采用Perl及gtk开发。它的运行需要依赖vrdp工具。

---------------
虚拟机的克隆
从一台安装好的机器克隆出另外一台,省去安装过程,直接复制vdi文件是不行的,因为它们的uuid冲突了。在4.2版本前,需要经由其工具处理后,可以直接使用vdi来新建虚拟机。下面以创建第二台软路由器来示例。

VBoxManage createvm --name "pdebian" --ostype "Debian_64" --register --basefolder /data/vmos/

VBoxManage modifyvm "pdebian" --memory 1024 --vram 8 --acpi on --ioapic on --hwvirtex on --vtxvpid on --cpus 2 --cpuhotplug on --chipset ich9 --boot1 disk  --boot2 dvd --nic1 hostonly --hostonlyadapter1 vboxnet0 --nictype1 Am79C973 --mouse usb --keyboard usb

#注意:这里将原始的vdi文件克隆一份,这样它们的uuid就不会冲突了;但这种方式并不能解决其内部的网卡uuid的冲突,同时需要操作系统对设备管理要高级一些。
VBoxManage clonehd /data/vmos/odebian/odebian.vdi /data/vmos/pdebian/pdebian.vdi --format VDI --variant Fixed

VBoxManage storagectl "pdebian" --name "SATA Controller" --add sata --hostiocache on --bootable on

VBoxManage storageattach "pdebian" --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium /data/vmos/pdebian/pdebian.vdi

至此,第二台虚拟机'pdebian'就创建好了,可以对其启动,但要注意,它的网卡不能正常启动(除非在对原始机的网卡硬件的配置文件(/etc/udev/rules.d/70-persistent-net.rules)进行了删除,这个文件会在系统开机时自动建立),需要手动删除udev设备管理所生成的配置文件(同上),并重启让系统再生成正确的配置。

造成这种问题的原因是,机器在克隆时,虽然解决了磁盘的uuid值,确不能解决内部网卡的硬件信息,实际上网卡已经是新建的了,操作系统内部在这个过程中不能感知到。

当然也有网络设备的uuid无法重建,是因为操作系统的udev设备管理能力不强,比如在克隆基于vyatta这款软路由时,就不能解决这个问题(在4.2支持整机克隆的条件下也不行)。
VBoxManage unregistervm srouter --delete

VBoxManage clonevm prouter --mode machine --name srouter --basefolder /data/vmos/

这样只能老老实实地从iso进行重新安装了。