Virtualbox rodando em Background, Python e GTK

Publicado: 27-05-2010 em Linux, Não classificado, Programação, Python, Ubuntu, Virtualbox
Tags:, , ,

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.

Comentários
  1. Marcus Ortense disse:

    Parabens Danilo, belo post.
    Estava procurando exatamente isso ^^
    Muito obrigado.
    []‘s

  2. Adriano disse:

    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.

    • Danilo Jeremias da Silva disse:

      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()
      
      • Adriano disse:

        Olá Danilo,

        Mto obrigado, kra… esse post me ajudou mto…
        precisava exatamente disto.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s