Virtualbox 的建立與設定

下載 PDF 文本下載 PDF 文本

最後更新: 31-12-11


目錄:

 

 


 

介紹:

Virtualbox 現在共分為兩個版本, 一個是 GNU 的, 而另一在則是由 orcale 所管理

分別在於一個是 OpenSource 的, 而另一個是 non-free 的

在 Debain 上當然是用 OSE(OpenSourceEdition) 啦, 現在的版本為 VirtualBox-OSE 3.2.10
(Debian Squeeze)

OSE 是沒有 VRDP 的, 這是因為它並不是 OpenSource 的 !!!

以下內容圍繞著 vboxheadless 而寫的,

完成此文後, 我才明白有 "介面" 是如何幸福的一件事 !!

 


 

查看 VT

 

在 32bit 的 host 上是不能建立 64bit 的 VM 的, 除非 CPU 支持 VT 功能(Virtualization Technology)

不同的 cpu 生產商對此功能有不同稱呼

  • vmx – intel
  • svm – amd

查看 CPU 是否支援 VT

egrep --color '(vmx|svm)' /proc/cpuinfo

flags           :   ... vmx ....

 


 

安裝:

apt-get isntall virtualbox-ose virtualbox-ose-dkms virtualbox-ose-fuse

  • virtualbox-ose: 主要程式(vboxmanage, vboxheadless)
  • virtualbox-ose-dkms: 提供系統所須要的 kernel module - "vboxdrv"
  • virtualbox-ose-fuse: 提供掛載 VM Image 工具 (vdfuse)

 

追求新視物的朋友, 可選用 V4.0 的 squeeze-backports

apt-get install  -t squeeze-backports virtualbox-ose virtualbox-ose-fuse virtualbox-dkms

/etc/init.d/virtualbox start 時, 載入的就是 virtualbox-dkms 了

 


 

一切為了方便:

 

在 ~/.bashrc 裡加上

alias vbox='vboxmanage'

 


 

建立VM (設定檔)

vboxmanage createvm --name debian6A --ostype Debian --basefolder /mnt/vm

createvm 它的主要目的是建立 VM 的 Configure File( <name>.xml ), 它除此以外別無其他作用 .....

--ostype 及 --ostype  是可有可無的 ~

Virtual machine 'debian6A' is created.
UUID: 5945e98a-2f65-438c-9a74-f82019272614
Settings file: '/mnt/vm/debian6A/debian6A.xml'

 

查看支援的 OS Type

vbox list ostypes

 


 

查看已存在的 VM

vbox list vms

輸出:

"debian6a" {01977a07-0ae8-4f97-8439-40acfe13c957}
"winxp-sp3" {2ac287eb-1867-4187-8ef5-cb6b49525789}

 

查看運行中的VM

vbox list runningvms

輸出:

"debian6a" {01977a07-0ae8-4f97-8439-40acfe13c957}

 

其他可能有用的 list 指令

  • vbox list hostdvds
  • vbox list hostinfo
  • vbox list hddbackends
  • vbox list systemproperties
  • vbox list dhcpservers
  • vbox list hdds
  • vbox list dvds

 


註冊VM

 

注冊:

VBoxManage registervm <uuid>|<filename>

刪除注冊:

VBoxManage unregistervm <uuid>|<name>

 

Example:

vbox registervm /mnt/vm/debian6A/debian6A.xml

vbox unregistervm winxp-sp3

注意:

當 un-register 的 VM 有一個 snapshots 時, 就會有以下 error

ERROR: Cannot unregister the machine 'winxp-sp3' because it has 1 snapshots

原因是有 snapshot 的 vm 是不能 register 回去的 ......

所以, 有 snapshot 的 vm 就不能 unregister 了.

刪除 snapshot 後, 再 unregister, 你會看到 ..........

ERROR: Cannot unregister the machine 'winxp-sp3' because it has 2 medium attachments

大刀闊斧的方法:

"註冊"可以理解成修改了 ~/.VirtualBox/VirtualBox.xml

所以, Stop "有關" vm 後, 把 VirtualBox.xml 改名時 VirtualBox.xml.bak

呵呵, 什麼 VM 都不見了 ^ ^.

 

P.S.

  • 在搬移有關 VM 的檔案前, 如 HardDisk Image, unregistervm 先會比較安全
  • 只有註冊了的 VM 才可執行及加 controller  ~
  • 注冊 xml 時記得要用 full path !!

 


 

查看某一VM 的資料:

VBoxManage showvminfo debian6A

Default 設定:

Memory size:     128MB
NIC                    disabled
Boot Device       Floppy DVD HardDisk
VT-x VPID:         on
Hardw. virt.ext: on

 


建立硬碟:

 

Clone 出來:

vbox clonehd ./squeeze.vdi  /mnt/vm/debian6/hd/debian6.vdi

cp vm 的HardDisk image 出來直接用是不可取的, 原因:

ERROR: UUID {e5f57ef3-005a-4de0-ab56-157b15e6314d} of the medium '/mnt/vm/winxp-sp3/hd/pagefile.vdi' does not match the value {179f78a1-e4c9-42e6-ab26-ce2c9f3c407d} stored in the media registry ('/root/.VirtualBox/VirtualBox.xml')
Details: code NS_ERROR_FAILURE (0x80004005), component Medium, interface IMedium, callee nsISupports

 

因為它們會有相同的 UUID !!

而在 vbox 上所有東西都是以 UUID 來記著的. (我們可以用 vbox list hdds 查看有什麼 Harddisk 注冊了)

 

P.S. 新版 vbox 支持更新 HD UUID 功能

VBoxManage.exe internalcommands sethduuid "C:\path\to\new\vdi"

UUID changed to: c14c05a8-59f7-4146-b1f2-a0da66443e32

 

轉成另外一種格式:

vboxmanage clonehd ./winxp-sp3-ide8g.vmdk  /mnt/vm/winxp_sp3-ide8g.vdi   --format vdi

vbox 對 vdi 支援得比較好, 所以都是用 vdi 為妙 ~

/winxp-sp3-ide8g.vmdk        <--- input
/mnt/vm/winxp_sp3-ide8g.vdi    <--- output
--format vdi    <--- output format

 

全新製作:

VBoxManage createhd  --filename <filename>   --size <megabytes>  [--format VDI|VMDK|VHD]

Example:

vboxmanage createhd --filename pagefile.vdi --size 1024

By default 是用 vdi Format 的

 

查看硬碟的資料:

vboxmanage showhdinfo debian.vmdk

UUID:                 8a57bc32-3310-4936-a7e6-831f12ab9ace
Accessible:           yes
Logical size:         2048 MBytes
Current size on disk: 974 MBytes
Type:                 normal (base)
Storage format:       VMDK
Location:             /mnt/vm/debian.vmdk

 


 

加 Controller 到 VM

 

Example: (添加)

VBoxManage storagectl debian6A --name c0 --add sata

Example: (移除)

VBoxManage storagectl debian6A --name c0 --remove

Controller 在 VM 的角色是決定它 "Storage" 的方式

支援的 controller 有 ide|sata|scsi|floppy|sas

 

ide:

Storage Controller Name (0):            c0
Storage Controller Type (0):            PIIX4
Storage Controller Instance Number (0): 0
Storage Controller Max Port Count (0):  2
Storage Controller Port Count (0):      

sata:

Storage Controller Name (0):            c0
Storage Controller Type (0):            IntelAhci
Storage Controller Instance Number (0): 0
Storage Controller Max Port Count (0):  30
Storage Controller Port Count (0):      30

 

P.S.

  • sata 的 controller 是不支持 dvddrive 的 !!

 


 

加 Device 到 Controller 上

 

VBoxManage storageattach    <uuid|vmname>
                            --storagectl <name>
                            --port <number>
                            --device <number>
                            [--type dvddrive|hdd|fdd]
                            [--medium none | emptydrive | <uuid>|<filename> | host:<drive> ]

 

Example: 加硬碟

VBoxManage storageattach debian6A \
                                            --storagectl "c0" --port 0 --device 0 \
                                            --type hdd  --medium /mnt/vm/debian6A/hd/sata-d0.vmdk  

Result:

c0 (0, 0): /mnt/vm/winxp-sp3/hd/winxp_sp3-ide8g.vdi

c0 (0, 0)  

  • controller 的名稱
  • port number
  • device number

舉 IDE 來說, 1 個 control 有 2 個 port, 每個 port 有 2 個 device (master 及 slave)

 

Example: 加 DVD-ROM

vboxmanage storageattach winxp-sp3 --storagectl "c0" --port 1 --device 0 --type dvddrive --medium emptydrive

Result:

c0 (1, 0): Empty

 

Example: 移除

vboxmanage storageattach winxp-sp3 --storagectl "c0" --port 0 --device 1 --type dvddrive --medium none

 


 

小許修改(Fine tune):

 

VBoxManage modifyvm <uuid|name>

--ostype <os>
--memory <n MB>
--cpus <cpucount>
--boot<1-4> none|floppy|dvd|disk|net
--snapshotfolder

 

列出支援的系統

VBoxManage list ostypes

ID:          WindowsXP
ID:          WindowsXP_64
.................................
ID:          Linux26
ID:          Linux26_64
.................................
ID:          Debian

 

Example:

vbox modifyvm debian6A --memory 256
vbox modifyvm debian6A --boot1 disk
vbox modifyvm debian6A --snapshotfolder /mnt/vm/debian6A/snapshot/

vbox modifyvm debian6A --vram 1

vbox modifyvm debian6a --usb on

vbox modifyvm debian6a --audio none

vbox modifyvm debian6a --largepages on
vbox modifyvm debian6a --pagefusion on    <-- 64-bit hosts

改用 usb keyboard 及 mouse

vbox modifyvm xfce --mouse usb
vbox modifyvm xfce --keyboard usb

 

# 設置音效裝置

vbox modifyvm <vm>  --audio none|null|oss|alsa|pulse

 


 

啟程

 

方式一: VBoxManage startvm

VBoxManage startvm <uuid>|<name> [--type gui|sdl|headless]

 

方式二: VBoxHeadless

  • -n, --vnc
  • -m, --vncport
  • -o, --vncpass <pw>
  • -s, -startvm <vm_name>

Example:

vboxheadless -n -m 5901 -o mypassword  -w 800 -h 600 -s <VM-Name>

Set framebuffer: buffer=ffffffffb6543008 w=800 h=600 bpp=32
Set framebuffer: buffer=ffffffffb3735000 w=640 h=480 bpp=32
Set framebuffer: buffer=ffffffffb64d1008 w=720 h=400 bpp=32
Set framebuffer: buffer=ffffffffb65eb008 w=640 h=480 bpp=32
Set framebuffer: buffer=ffffffffb65fe008 w=720 h=400 bpp=32
Set framebuffer: buffer=ffffffffb65eb008 w=640 h=480 bpp=32
..................................

 

!!! 注意 !!!

無論那種啟程方式, 如果是透過 ssh 啟動的話, 一定要用 screen 去保持 VM 在執行

又或者用 nohup VBoxHeadless -startvm <vmname>

 

P.S. tightVNC 比 UltraVNC 效果為好 !!

 


 

直接修改 image file -  virtualbox-ose-fuse

 

詳見:

http://datahunter.org/mount_vbox_image

 


 

Media 的管理

 

掛碟:

Vbox openmedium       disk|dvd <filename>
                                    [--type normal|immutable|writethrough|shareable] (disk only)
                                    [--parentuuid <uuid>] (disk only)

卸載硬碟或DVD

Vbox closemedium  disk|dvd <uuid>|<filename>

P.S. 有 attached 的 image 是不能 close 的

 

Example:

排 DVD

vbox openmedium dvd ./systemrescuecd-x86-2.4.0.iso

御 HardDisk

VBoxManage closemedium disk pagefile.vdi

 

查看它們

vbox list dvds

vbox list hdds

 

 



即時控制 - vbox controlvm

vbox controlvm <vm> pause | resume

vbox controlvm <vm> reset | poweroff

 

保留現在的狀態, 之後離開:

VBoxManage controlvm <vm> savestate

 

變更 Network:

vbox controlvm <vm> setlinkstate<1-N> on|off |

vbox controlvm <vm> nic<1-N> null | nat | bridged | intnet | hostonly

USB

usbattach <uuid>|<address>

usbdetach <uuid>|<address>

 

CPU

plugcpu <id> / unplugcpu <id>


啟用 Teleport:

vbox  controlvm <vm> teleport --hostname <name> --port <port> [--password <password>]

 


 

export 與 import

 

Export:

export 是為了在另一個 Virtual Software 上 import 進去

如 vbox ---> vmware

vbox export  <machines> --output|-o <ovf>

Example:

vbox export winxp-sp3 -o winxp-sp3.ovf

0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Successfully exported 1 machine(s).

Export 後大家會見到有以下檔案

.vmdk HardDisk Image
.ovf OS Configure

 

Import:

VBoxManage import <ovf/ova>

 

有用的參數:

--dry-run or -n


 

實時遷移試驗 (Teleportation)

 

遷移前, Source 機和 Target 機上的 Guest 的機硬件配置要一樣

如 CPU 數量, Ram 大小等等

 

其次, 它們要用同一個 HardDisk Image,

不過, share image 的方式並沒有限制,

可以是 smb, nfs, iscsi 之類

 

為了增大成功機會

vbox modifyvm vm_name --synthcpu on

synthetic CPU feature 是指 VM 不知到自己是在用什麼 CPU

debian:#cat /proc/cpuinfo
processor       : 0
vendor_id       : VirtualBox
cpu family      : 15
model           : 1
model name      : VirtualBox SPARCx86 Processor v1000
stepping        : 1
cpu MHz         : 3047.934

 

之後在 Target 執行接收 vm 的指令

VBoxManage modifyvm <guest_name> --teleporter on --teleporterport <port> --teleporterpassword <pw>

--teleporter on

If "on", when the machine is started, it does not boot the virtual machine as it would normally; instead, it then waits for a teleporting request

--teleporterpassword <password>

optional argument

 

然後在 Source 執行遷移指令

VBoxManage controlvm <guest_name> teleport --host <target_ip> --port <port> --password <pw>

 

最後, VM 會在 Target 機上出現後, 就可以關閉它的 teleport

VBoxManage modifyvm <VM> --teleporter off

 


 

在 Guest 上的工具

 

這裡的包只需要在 VM 上安裝, 不用在 Host 上安裝了

P.S.

要安裝系統的 header 檔

  • linux-headers-3.2.0-0.bpo.2-686-pae
  • linux-headers-3.2.0-0.bpo.2-common
  • linux-kbuild-3.2

 

工具1: guest-dkms

Package:

  • virtualbox-ose-guest-dkms <-- V4
  • virtualbox-ose-dkms <-- V3.2

好處:

  • vm 及 host 之間可以用 sharedfolder 來交換檔案(vboxfs)
  • VM 與 VM 之間可以共享未使用到的 memory (功能: ballooning) 只適用於 64-bit host

 

sharedfolder:

vbox sharedfolder  add <vmname> --name <name> --hostpath <hostpath>

vbox sharedfolder  remove <vmname> --name <name>

  • --transient: 當 VM reboot 後, 不會再有此 sharedfolder
  • --readonly

Example:

vbox sharedfolder add winxp --name sharedfolder --hostpath /mnt/vm/shardfolder/

 

ballooning:

為 winxp 此 vm 上有 64MB 是 ballooning memory

vbox controlvm winxp guestmemoryballoon 256

 

工具2: virtualbox-guest-utils
 

  • /sbin/mount.vboxsf
  • /usr/sbin/VBoxControl
  • /usr/sbin/VBoxService

 

工具3: virtualbox-ose-guest-x11

 

 


 

Global Configure File:

<Global>

    <MachineRegistry>
        <MachineEntry uuid="{???}" src="???.xml" />   // 一行一VM
        ...........
    </MachineRegistry>


    <MediaRegistry>

        <HardDisks>

            <HardDisk uuid="..." location="..." format="VMDK" type="Normal"/>    //單一硬碟影像檔
   
            <HardDisk uuid="..." location="...">   //有snapshot的硬碟
               <HardDisk uuid="..." location=".../>"
            </HardDisk>

        </HardDisk>

      <DVDImages>
        <Image uuid="..." location="..."/> // 一行一 iso
      </DVDImages>

      <FloppyImages/> // 就算沒有, 都會有這一行

    </MediaRegistry>



<NetserviceRegistry>
      <DHCPServers>
        <DHCPServer networkName="HostInterfaceNetworking-vboxnet0" IPAddress="..." networkMask=".." lowerIP="IP1" upperIP="IP2" enabled="1"/>
      </DHCPServers>
</NetserviceRegistry>

<SystemProperties defaultMachineFolder="Machines" defaultHardDiskFolder="???" defaultHardDiskFormat="VDI" remoteDisplayAuthLibrary="VRDPAuth" webServiceAuthLibrary="VRDPAuth" LogHistoryCount="3"/>
     
</Global>

 


 

VirtualBox Remote Desktop Extension (VRDE)

 

Server:

VBoxManage modifyvm "VM name" --vrde on

只要不是 OSE 版的 Vbox, 當用 VBoxHeadless 時 vrde 是會自動啟動的

Client:

rdesktop -a 16 -N <IP>[:port]

 


 

iscsi

 

VBoxManage addiscsidisk     --server <name>|<ip>
                            --target <target>
                            [--port <port>]
                            [--lun <lun>]
                            [--encodedlun <lun>]
                            [--username <username>]
                            [--password <password>]
                            [--type normal|writethrough|immutable|shareable]
                            [--intnet]


 

bandwidthctl(>v4)

 

它是用來控制 IO 的 Bandwithd

幾個 Device 組成一個 Group, 而它是用來限制一個 Group 的速度

我會用以下例子說明

 

# 建立 Group "limit1" 在 VM "debian1" 上, 並把速度限制在 5Mbyte

vbox bandwidthctl debian1 --name limit1 --add disk --limit 5

# 應用此 Group 在一隻 HD image 上

vbox storageattach debian1 --storagectl sata --port 0 --device 0 \
> --type hdd --medium /mnt/vm/debian1/hd/squeeze.vdi \
> --bandwidthgroup limit1

 


 

設置所有 VM 的所在目錄

vbox setproperty machinefolder /mnt/vm

 

 


 

詳見

https://www.virtualbox.org/manual/

 

 

Creative Commons license icon Creative Commons license icon