Virtualbox para quem não sabe é um software de virtualização, pertencente atualmente a Oracle. Um grande concorrente do VMware, sendo que o Virtualbox ganha quando o assunto é utilização de memória e processamento.
Mas agora vamos ao assunto real do post, a utilização do Virtualbox em modo background, permitindo o acesso via conexão remota (RDP).
Após criada a máquina virtual você pode inicializá-la pelo modo texto, no caso utilizei Virtualbox versão 3.2.0 no Ubuntu virtualizando uma máquina Débian, cujo nome ficou “DebianVM”.
Primeiro habilitaremos o modo “Tela Remota”, para isso selecione a máquina e clique em configuração, aparecerá uma janela e terá o item tela, e nela a aba “Tela Remota”, para habilitar a função é necessário somente escolher a opção “Habilitar servidor”.
Se você inicializar a máquina normalmente você poderá acessá-la via o comando:
rdesktop SEU_IP:PORTA
Onde deve-se trocar SEU_IP pelo ip da máquina que está rodando a VM,e a PORTA pela configurada, a padrão é 3389.
Ao acessar você perceberá que não seria util ter as 2 janelas funcionando, a remota e a padrão do Virtualbox. No meu caso outra pessoa precisa acessar a área de trabalho da máquina remotamente e eu não preciso ficar com a tela padrão do Vbox aberta, especialmente pois consumiria mais processamento e memória.
Para rodar em background o Virtualbox possui alguns comandos de console, mas nos concentraremos no VBoxManage:
Apartir do VBoxManage podemos fazer várias operações com as máquinas virtuais(Para ver todas as possibilidades use o comando VBoxManage –help). Vou citar apenas os necessários para inicializar e desligar a VM.
Para inicializar a VM é necessário apenas o comando:
VBoxManage startvm NOME_DA_VM --type=vrdp
Onde no meu caso ficou:
VBoxManage startvm DebianVM --type=vrdp
Para Deligar a VM é necessário apenas o comando:
VBoxManage controlvm NOME_DA_VM poweroff
Onde no meu caso ficou:
VBoxManage controlvm DebianVM poweroff
Então criei o seguinte script em Python e Gtk para não ter de ficar sempre utilizando o console:
#!/usr/bin/python
import pygtk
pygtk.require('2.0')
import gtk
import os
class VBoxBackground:
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_border_width(10)
self.window.set_title("VBox Background")
self.container = gtk.HBox()
self.window.connect("delete_event", self.delete_event)
self.window.connect("destroy", self.destroy)
self.start_button = gtk.Button("Start VM")
self.start_button.connect("clicked", self.start_vm)
self.stop_button = gtk.Button("PowerOFF VM")
self.stop_button.connect("clicked", self.poweroff_vm)
self.combobox = gtk.combo_box_new_text()
self.vms()
self.container.add(self.start_button)
self.container.add(self.combobox)
self.container.add(self.stop_button)
self.window.add(self.container)
self.window.show_all()
def start_vm(self, widget):
os.popen("VBoxManage startvm " + self.vm_atual() + " --type=vrdp")
print "Starting VM " + self.vm_atual()
def poweroff_vm(self, widget):
os.popen("VBoxManage controlvm " + self.vm_atual() + " poweroff")
print "Stoping VM " + self.vm_atual()
def delete_event(self, widget, event, data=None):
return False
def vms(self):
lista = os.popen("VBoxManage list vms").readlines()
[self.combobox.append_text(x.split('"')[1]) for i,x in enumerate(lista) if i>3]
def vm_atual(self):
return self.combobox.get_model()[self.combobox.get_active()][0]
def destroy(self, widget, data=None):
gtk.main_quit()
def main(self):
gtk.main()
if __name__ == "__main__":
vboxb = VBoxBackground()
vboxb.main()
Para ver o código melhor formatado clique aqui.
Ele lista as VMs e possui 2 botões Start VM e poweroff VM.
UPDATE: Criado repositório no GitHub com este código, caso queira contribuir acesse VBoxBackground.
Foi adicionado ao aplicativo a possibilidade de salvar a VM rodando.

Parabens Danilo, belo post.
Estava procurando exatamente isso ^^
Muito obrigado.
[]‘s
Mto bom, Danilo…
Nunca havia programado em python… mas este fonte está sendo de grande ajuda para mim…
Só uma dúvida… se eu quisesse colocar as VMs em um gtklist, ao invés do combo… como ficaria?
Grato.
Olá Adriano
Respondendo o seu questionamento, a utilização de um gtklist é não é valida devido ao fato de estar deprecado, então utilizei uma treeview que gera mais ou menos o mesmo resultado esperado.
Segue abaixo o código exemplo.
#!/usr/bin/python import pygtk pygtk.require('2.0') import gtk import os import gobject class VBoxBackground: def __init__(self): self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.set_border_width(10) self.window.set_title("VBox Background") self.container = gtk.VBox() self.window.connect("delete_event", self.delete_event) self.window.connect("destroy", self.destroy) self.start_button = gtk.Button("Start VM") self.start_button.connect("clicked", self.start_vm) self.stop_button = gtk.Button("PowerOFF VM") self.stop_button.connect("clicked", self.poweroff_vm) self.model = gtk.ListStore(str) self.tree = gtk.TreeView(self.model) column = gtk.TreeViewColumn("VMS", gtk.CellRendererText(), text=0) self.tree.append_column(column) self.vms() self.container.add(self.start_button) self.container.add(self.tree) self.container.add(self.stop_button) self.window.add(self.container) self.window.show_all() def start_vm(self, widget): os.popen("VBoxManage startvm " + self.vm_atual() + " --type=vrdp") print "Starting VM " + self.vm_atual() def poweroff_vm(self, widget): os.popen("VBoxManage controlvm " + self.vm_atual() + " poweroff") print "Stoping VM " + self.vm_atual() def delete_event(self, widget, event, data=None): return False def vms(self): lista = os.popen("VBoxManage list vms").readlines() [self.model.append([x.split('"')[1]]) for i,x in enumerate(lista) if i>3] def vm_atual(self): sel = self.tree.get_selection().get_selected()[1] if (sel): return self.model.get_value(sel,0) else: return None def destroy(self, widget, data=None): gtk.main_quit() def main(self): gtk.main() if __name__ == "__main__": vboxb = VBoxBackground() vboxb.main()Olá Danilo,
Mto obrigado, kra… esse post me ajudou mto…
precisava exatamente disto.