最後更新: 2019-08-14
目錄
- 介紹
- 查看 VT
- 安裝
- 一切為了方便
- 建立VM (設定檔)
- 查看已存在的 VM
- 註冊VM
- 查看某一VM 的資料
- 建立硬碟
- 加硬碟Controller 到 VM
- 加 Device 到 Controller 上
- 小許修改(modifyvm)
- 啟程
- 直接修改 image file (vdfuse)
- Media 的管理
- 即時控制
- export 與 import
- 實時遷移試驗
- Guest Tools
- Global Configure File(VirtualBox.xml)
- VirtualBox Remote Desktop Extension (VRDE)
- iscsi
- bandwidthctl
- 設置所有 VM 的所在目錄
- VCPU
- Reboot VM daily
- Doc
介紹
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/