Virtualbox 的建立與設定

最後更新: 2019-08-14


目錄


介紹

 

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 的資料

 

vbox showvminfo win03

output:

Name:            win03
Guest OS:        Windows 2003
UUID:            1b99245b-c58e-4643-ae38-xxx
Config file:     /vbox/win03/win03.vbox
Snapshot folder: /vbox/hd/win03/Snapshots
Log folder:      /vbox/win03/Logs
Hardware UUID:   1b99245b-c58e-4643-ae38-xxx
Memory size:     2048MB
Page Fusion:     off
VRAM size:       16MB
CPU exec cap:    100%
HPET:            off
Chipset:         piix3
Firmware:        BIOS
Number of CPUs:  1

...........................

ACPI:            on
IOAPIC:          off
PAE:             off
Time offset:     0 ms
RTC:             local time
Hardw. virt.ext: on
Hardw. virt.ext exclusive: on
Nested Paging:   on
Large Pages:     on
VT-x VPID:       on
State:           paused (since 2014-06-06T02:47:21.043000000)
Monitor count:   1
3D Acceleration: off
2D Video Acceleration: off
Teleporter Enabled: off

...........................

Storage Controller Name (0):            IDE Controller
Storage Controller Type (0):            PIIX4
IDE Controller (0, 0): /vbox/hd/win03/disk1.vdi (UUID: 4b75fabb-314f-479f-a99e-xxx)
IDE Controller (0, 1): /vbox/hd/win03/disk1.vdi (UUID: d84e899d-875a-47ce-85ec-xxx)
IDE Controller (1, 0): Empty

...........................

Currently Attached USB Devices:

<none>

Shared folders:  <none>

VRDE Connection:    not active
Clients so far:     0


Guest:

Configured memory balloon size:      0 MB
OS type:                             Windows2003
Additions run level:                 1

.............................

 


建立硬碟

 

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

 

Resize Harddisk:

[1] Unmount Harddisk

[2] Resize it

C:\Program Files\Oracle\VirtualBox>VBoxManage modifyhd "C:\vbox\win7-2\win7-2.vdi" --resize 80000

0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

[3] Check it

vboxmanage showhdinfo "C:\vbox\win7-2\win7-2.vdi"

UUID:           dd068bc6-6fc1-4ff1-9d41-12dab261a527
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       C:\vbox\win7-2\win7-2.vdi
Storage format: VDI
Format variant: dynamic default
Capacity:       80000 MBytes
Size on disk:   17065 MBytes
Encryption:     disabled

 


加 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 上

 

Usage

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

Example: 加硬碟

vbox showvminfo myvm

........
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/vbox/myvm/C.vdi (UUID: bf2325cd-1eb3-4be6-a9c9-acf2796b459e)
IDE Controller (1, 0): Empty
........

vbox storageattach myvm \
    --storagectl "IDE Controller" --port 0 --device 1 \
    --type hdd  --medium /home/vbox/myvm/D.vdi

Result:

c0 (0, 0)

  • controller 的名稱
  • port number
  • device number

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

Example: 加 DVD-ROM

vbox 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

savestate: frozen VM:

# The virtual machine will resume in the same position that you left in when you start it again.

# The contents of its RAM are saved to your hard disk

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 是為了在另一個 hypervisor 上 import 進去, 如 vbox ---> vmware

 * VM 要在 Stop 的狀態才可以 export

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

有用的參數:

--dry-run / -n

Import:

VBoxManage import <ovf/ova>

 


實時遷移試驗 (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(v>4)

 

它是用來控制 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 的所在目錄

 

# 設定 "Default machine folder"

vbox setproperty machinefolder /mnt/vm

# check

vbox list systemproperties

Default machine folder:          /home/vbox/

 


VCPU

 

# 設置此 VM 最多可以幾多顆 vcpu

vbox modifyvm  lxc --cpus 3

P.S.

有 2 core 的 Host 是可以設置 VM 有 3 vcpu 的

# 為 VM 加 CPU

vbox modifyvm  lxc --plugcpu 1

# 支援 Hotplug

vbox modifyvm lvx  --cpuhotplug on

# 在 running 的 vm hotplug cpu

vbox controlvm lxc plugcpu 1

unplugcpu

P.S.

CPU  的資料是放在 /sys/devices/system/cpu

cpu0  cpufreq  cpuidle  kernel_max  offline  online  perf_events  possible  present

#限制可以佔用率 vCPU

vbox modifyvm lxc --cpuexecutioncap 50

# single virtual CPU can use up to 50% of a single host CPU.

# 隱藏 CPU 資料

vbox modifyvm lxc --synthcpu on

root@debian:~# cat /proc/cpuinfo
processor       : 0
vendor_id       : VirtualBox
cpu family      : 15
model           : 1
model name      : VirtualBox SPARCx86 Processor v1000
....................................

# 使用 Intel 的 VT / AMD 的 AMD-V 功能

vbox modifyvm lxc  --hwvirtex on

 


Reboot VM daily

 

rebootvm.bat

@echo off

cd "C:\Program Files\Oracle\VirtualBox\"

echo "poweroff VM"
VBoxManage.exe controlvm vpn acpipowerbutton
timeout 120
echo "start VM"
VBoxManage.exe startvm vpn

Task scheduler setting

 * user 必須 login 此 script 才會有效

 


Doc

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

 

 

Creative Commons license icon Creative Commons license icon