Manage Virtualbox virtual machines under command line


VirtualBox is a very useful x86/AMD64 virtualization application, we usually use it to test different operating systems, or do some computer science related practices, or maybe we just want to slice the hardware resource for resource utilization.

I would like to run a virtualbox program on my powerful servers, and use a lightweight but not powerful computer like Chromebook to remotely connect to the virtual machines under the virtualbox, so that I don’t have to bring a heavy computer every where, I can still have multiple machines with several different systems to run different programs.

From the beginning, I use vnc server with x window via ssh tunnel to create a secure connection and then launch virtualbox, in fact, the window manager is not always needed, especially we have installed the operating system, and the system runs properly, so I wonder if is possible to control the virtual machines under command line interface, and the answer is yes, and the command line virtual is much more powerful than I thought, I guess all the tasks and configurations can be done via command line now, of course including create/clone a vm or modify a vm hardware resource, vm import/export, share folder, network interface or usb device attach/detach, etc.

Without controlling via GUI, but from command line, I don’t need to start a vncclient then connect to my vncserver, also don’t need to forward the x window to my client, that’s very helpful, and that machine can run “in the background”, in fact, under the x window by vncserver, note that virtualbox still need a x window environment with virtualbox launched(at least by virtualbox v4.3.34), by my test result, if you don’t have a GUI virtual launched, the startvm command I will talk about later will not work, it will tell you vm started successfully, but in fact not, and will return 1(exit status).

I want to share some basic and commonly used commands, to help us control a virtualbox created virtual machine, if you didn’t know that before, hope this can help you.

Command ‘virtualbox’ usually means the GUI version of VirtualBox, here, for command line, we use ‘vboxmanage’, remember, I use the “vm name” to control a version machine here, you can also use its UUID at the same place, okay, here we go:

List all the virtual machines
– vboxmanage list vms

List the running virtual machines
– vboxmanage list runningvms

List the dhcp server info
– vboxmanage list dhcpservers

Show info about a virtual machine
– vboxmanage showvminfo “vm name”

Power on a vm:
– vboxmanage startvm “vm name”

Force reset/reboot a vm:
– vboxmanage controlvm “vm name” reset

Force power off a vm(cut the power down):
– vboxmanage controlvm “vm name” poweroff

Power off a vm as “Press its power button”(acpi, send power off signal, to power off in normal process, not cut the power down):
– vboxmanage controlvm “vm name” acpipowerbutton

Make a vm sleep as “Press its power button”(acpi, send sleep signal):
– vboxmanage controlvm “vm name” acpisleepbutton

Pause a vm:
– vboxmanage controlvm “vm name” pause

Resume a paused vm:
– vboxmanage controlvm “vm name” resume

Save a vm’s state(like poweroff but all states will be saved):
– vboxmanage controlvm “vm name” savestate

Take a png image screenshot of a vm:
– vboxmanage controlvm “vm name” screenshotpng filename.png


關於使用 ssh 登入系統會慢的問題 …

覺得ssh登入好慢,這也是考古題了 …


簡單來說,Linux主機大部分使用的 ssh daemon 都是用 openssh 來提供 ssh 遠端登入服務(其他常見的還有Dropbear、Busybox),而 openssh 有一個選項叫做 UseDNS,預設是 Yes ,調為 No 之後重新啟動 ssh 服務則登入系統的過程速度就會變快不少,來看看原因:

拿 Ubuntu 14.04 LTS 來看,man sshd_config,找到 UseDNS 這段:

UseDNS Specifies whether sshd(8) should look up the remote host name and check that the resolved host name for the remote IP
address maps back to the very same IP address. The default is “yes”.

白話文,這個設定會決定 ssh 服務要不要檢查使用者的 hostname、IP 對應,但這件事情必須要 Reverse DNS 跟 PTR(Pointer) record 配合,然而一般使用者很可能沒有 IP 反解記錄,如果再加上使用的是浮動IP或甚至兩台主機都是內部的虛擬IP,這個檢查很多時候是沒太多實質意義的,所以才不如關掉,跳過這個檢查可以省去一些時間

如果你是使用 Debian / Ubuntu GNU/Linux 的話,通常是直接在這個設定檔 /etc/ssh/sshd_config 最後一行加上:

UseDNS no

存檔後重啟 ssh 服務:

[bash]$ sudo service ssh restart[/bash]


剛好覺得你的 ssh 遠端登入慢慢卡卡的話 … 試試看吧