Usando o vagrant para executar máquinas virtuais com ambiente de desktop

148

O ambiente de desenvolvimento da minha empresa é baseado em máquinas virtuais em execução no VirtualBox. Gostaríamos de dar um passo adiante, e usar os recursos do Vagrant para ter a descrição da máquina em um arquivo de texto e, em seguida, poder "elevar" essa máquina com base nesse arquivo de texto. Combinado ao fantoche, isso nos resolveria o problema de que todos têm diferentes versões de software instaladas na VM.

No entanto, o Vagrant parece muito focado no desenvolvimento do host, deixando a máquina em segundo plano. Nós precisaríamos ter nosso ambiente de desenvolvimento dentro da máquina, portanto, precisaríamos de uma GUI completa; portanto, ao digitar "vagar" uma máquina com um ambiente de área de trabalho completo (XFCE, KDE ...) deve aparecer.

Até agora, consegui criar uma caixa "base" a partir de uma distribuição do Xubuntu. Mas quando eu digito "vagrant up", embora a área de trabalho apareça e eu consiga fazer o login corretamente, o Vagrant congela com a mensagem "Aguardando a inicialização da máquina. Isso pode levar alguns minutos ...". Depois de um tempo, o Vagrant falha devido ao tempo limite. Portanto, as pastas compartilhadas não são criadas, nem o provedor de pacotes -puppet- é executado.

Como criar uma máquina virtual com uma GUI completa usando o vagrant?

PRiera
fonte
1
Nunca tive problemas ao usar essas caixas . Talvez algo tenha dado errado quando você empacotou sua caixa base.
precisa saber é o seguinte
1
da perspectiva ingênua, se é possível desenvolver no host e não na VM, por que você está se preocupando em instalar os recursos de GUI na VM do Vagrant? por que não desenvolver no host?
Alexander Mills
O desenvolvimento da VM pode resultar em menos problemas quando as especificações da VM / Vagrant são mantidas pela equipe de desenvolvimento para estar sincronizadas com o ambiente de destino de seus aplicativos. Você terá menos dependências e comportamentos assustadores, exclusivos do seu desenvolvedor. ambiente enquanto não estiver presente (ou não for idêntico) no ambiente / instalação de destino.
21419 Jim
Na verdade, sua conclusão não está completamente certa. O Vagrant não é sobre ter o ambiente de desenvolvimento fora da caixa. Muitas pessoas no linux desenvolvem em um terminal. E você pode fazer isso muito bem com caixas vagabundos ssh-only.
Erikbwork 29/09/16

Respostas:

150

Acabei de trabalhar com basicamente três etapas. O conselho de askubuntu.comnão funcionou muito bem para mim, então tente esta versão simplificada:

  1. Obtenha uma imagem básica do Ubuntu funcionando. Você deve poder inicializá-lo e vagrant ssh.
  2. Em seguida, ative a exibição do VirtualBox, que está desativada por padrão. Pare a VM e remova o comentário destas linhas em Vagrantfile:
    config.vm.provider: virtualbox do | vb |
      vb.gui = true
    fim
  3. Inicialize a VM e observe a nova janela de exibição. Agora você só precisa instalar e iniciar xfce4. Use vagrant sshe:
    sudo apt-get install xfce4
    sudo startxfce4 &
    

Se esta é a primeira vez que você executa este ambiente Ubuntu, precisará executar o seguinte comando antes de instalar o xfce4:

sudo apt-get update

É isso, você deve pousar em uma xfce4sessão.

Atualização: para uma experiência melhor, recomendo estas melhorias:

  1. Não inicie a GUI como raiz. Você realmente quer permanecer como vagrantusuário. Para fazer isso, você precisa permitir que alguém inicie a GUI: sudo vim /etc/X11/Xwrapper.confige edite-a para allowed_users=anybody.
  2. Em seguida, instale as ferramentas de convidado do VirtualBox antes de iniciar a GUI. Isso fornecerá uma resolução de tela saudável, mouse integrado etc.
    $ sudo apt-get install -y xfce4 virtualbox-guest-dkms virtualbox-guest-utils virtualbox-guest-x11
    $ sudo VBoxClient-all
  3. Somente agora você deve iniciar a GUI como vagrantusuário, com $ startxfce4&.

Atualização 2: tentei isso hoje e o VBoxClient-allscript nem sempre está instalado. Se estiver faltando, você pode substituir pelo equivalente:

sudo VBoxClient --clipboard
sudo VBoxClient --draganddrop
sudo VBoxClient --display
sudo VBoxClient --checkhostversion
sudo VBoxClient --seamless
Ar
fonte
2
Só queria entrar e dizer que, após cerca de 5 horas tentando fazer com que o xfce funcionasse em uma caixa vagabunda do fedora 19, a solução foi instalar o pacote de convidados do virtualbox (yum install VirtualBox-guest.x86_64). Sem esse pacote, o xorg não conseguia acessar o monitor da máquina host por algum motivo. Então ... Obrigado cara!
billmalarky
Descobri ao tentar isso que o código da etapa 3 precisa estar contido no Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| ... donemétodo do Vagrantfile.
precisa saber é
1
Você pode provisionar Xwindows etc. no Vagrant incluindo o seguinte no seu arquivo Vagrant: #Provision X Windows, VirtualBox Guest, curl e outros pacotes apt config.vm.provision: shell,: inline => "sudo apt-get install -y curl xfce4 VirtualBox-guest-dkms VirtualBox-guest-utils virtualbox-guest-x11" config.vm.provision: escudo,: inline => "sudo VBoxClient-all" </ code>
Farrukh Najmi
2
Apenas um heads-up que o Ubuntu 16.04 não parecem permitir iniciar XFCE como não-raiz desta forma: bugs.launchpad.net/ubuntu/+source/xinit/+bug/1562219
Air
1
Looks como startxfce4pode ser executado como não-root no Ubuntu 16.04 (hospitaleiro) depois de instalarxserver-xorg-legacy
Laurence Billingham
74

Aqui está a excelente resposta da Air na forma de um Vagrantfile

Vagrant.configure(2) do |config|
  # Ubuntu 15.10
  config.vm.box = "ubuntu/wily64"

  config.vm.provider "virtualbox" do |vb|
    # Display the VirtualBox GUI when booting the machine
    vb.gui = true
  end

  # Install xfce and virtualbox additions
  config.vm.provision "shell", inline: "sudo apt-get update"
  config.vm.provision "shell", inline: "sudo apt-get install -y xfce4 virtualbox-guest-dkms virtualbox-guest-utils virtualbox-guest-x11"
  # Permit anyone to start the GUI
  config.vm.provision "shell", inline: "sudo sed -i 's/allowed_users=.*$/allowed_users=anybody/' /etc/X11/Xwrapper.config"
end

Para iniciar o vm

vagrant up

Efetue login com nome de usuário:, vagrantsenha: vagrantatravés do prompt de login na GUI da caixa virtual.

Iniciar o xfce

startx
Nik
fonte
Isso funcionou para mim com dois pequenos ajustes. Primeiro, obtive um 404 ao procurar a caixa "ubuntu / vivid64", então mudei para "larryli / vivid64", que encontrei no vagrantcloud. Segundo, tive que adicionar o plugin vagrant-proxyconf para gerenciar as configurações de proxy.
precisa
2
Ele grita -> startx não está instalado no momento?
prayagupd 15/09/16
1
Meu problema, a Internet não foi configurada no virtualbox para baixar o xfce4. Ele funciona agora, mas existe uma maneira de pular o login e iniciar o xfce4por padrão?
Prayagupd #
@prayagupd pouco antigo, mas você pode falar sobre "A Internet não foi configurada no virtualbox para baixar o xfce4"? Eu estou recebendo o mesmo erro ao executar startx depoisvagrant ssh
Joshua Zastrow
1
Estou com alguns problemas, onde minha caixa virtual diz "startx: comando não encontrado". Alguém poderia me ajudar a diagnosticar isso?
OOProg 22/01/19
11

Meus 2 centavos

  • Verifique se você está executando o vagrant mais recente (1.3.3 agora) + VirtualBox (4.2.18) para evitar erros.

  • Você pode usar o shell script ou o comando embutido para instalar um ambiente de área de trabalho ou um gerenciador de janelas leve

    Por exemplo, instale o LXDE em cima da caixa base do Ubuntu 12.04 Precise em vagrantbox.es

Vagrant.configure("2") do |config|
  # ... other configuration

  config.vm.provision "shell" do |s|
    s.inline = "apt-get install lubuntu-desktop -y"
  end
end
  • Se você criar suas próprias caixas base vagrantes, siga as instruções de embalagem da caixa base ou considere ferramentas como empacotador (ou veewee) para automatizar a construção.
Terry Wang
fonte
9

Aqui está um Vagrantfile levemente adaptado para o Ubuntu 18.04 LTS / biônico - graças às respostas da Air e Nik , e este post explicando como aumentar o tamanho do disco ao usar o VirtualBox (padrão = 10 GB).

A VM inclui uma tela de login do LightDM.

Atualização: criei um repositório GitHub a partir deste exemplo e adicionei muitos pacotes de software para o desenvolvimento de front-end + back-end.

# Optional - enlarge disk:
#vagrant plugin install vagrant-disksize
vagrant up
vagrant reload
# After reboot, the VM screen should show the LightDM login screen.
# Log in as user "vagrant", password "vagrant".
Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/bionic64"
  # Optional - enlarge disk (will also convert the format from VMDK to VDI):
  #config.disksize.size = "50GB"

  config.vm.provider "virtualbox" do |vb|
    # Display the VirtualBox GUI when booting the machine
    vb.gui = true
  end

  # /ubuntu/1067929/on-18-04-package-virtualbox-guest-utils-does-not-exist
  config.vm.provision "shell", inline: "sudo apt-add-repository multiverse && sudo apt-get update"

  # Install xfce and virtualbox additions.
  # (Not sure if these packages could be helpful as well: virtualbox-guest-utils-hwe virtualbox-guest-x11-hwe)
  config.vm.provision "shell", inline: "sudo apt-get install -y xfce4 virtualbox-guest-dkms virtualbox-guest-utils virtualbox-guest-x11"
  # Permit anyone to start the GUI
  config.vm.provision "shell", inline: "sudo sed -i 's/allowed_users=.*$/allowed_users=anybody/' /etc/X11/Xwrapper.config"

  # Optional: Use LightDM login screen (-> not required to run "startx")
  config.vm.provision "shell", inline: "sudo apt-get install -y lightdm lightdm-gtk-greeter"
  # Optional: Install a more feature-rich applications menu
  config.vm.provision "shell", inline: "sudo apt-get install -y xfce4-whiskermenu-plugin"
end
mh8020
fonte
No Ubuntu 16.04, tive que instalar o xserver-xorg-legacy para que o arquivo XWrapper.config existisse / fosse usado.
MZB
Testes adicionais sugerem que a linha sed pode não ser necessária, de acordo com o comentário no repositório do github vinculado.
MZB 08/02/19
@ mh8020 Obrigado por criar o repositório github. Muito limpo e fácil de seguir, exatamente o que eu precisava. Apenas uma questão: não consigo som no sistema convidado do Ubuntu para funcionar! Alguma idéia do que poderia habilitar isso na sua configuração atual?
timmwagener 23/02
7

Estou usando a imagem da área de trabalho do ubuntu, ela funciona muito bem com dois monitores no windows com o provedor de caixa virtual.

Vagrant.configure(2) do |config|
  config.vm.box = "box-cutter/ubuntu1404-desktop"

  config.ssh.forward_agent = true

  config.vm.network "forwarded_port", guest: 8080, host: 8080
  config.vm.network "forwarded_port", guest: 3000, host: 3000


  config.vm.synced_folder "../../git", "/home/vagrant/git"

  config.vm.provider "virtualbox" do |vb|
    vb.gui = true
    vb.customize ["modifyvm", :id, "--monitorcount", "2"]
    vb.memory = "2048"
  end
end
Andrzej Rehmann
fonte
3
vb.customize ["modifyvm", :id, '--audio', 'dsound', '--audiocontroller', 'ac97']para obter o som do vm (se necessário)
Igonato
O cortador de caixas não fornece mais as imagens pré-construídas.
krock
5

Você também pode considerar usar o Packer para criar imagens do VirtualBox para uso dos desenvolvedores.

Em vez de compartilhar o arquivo Vagrant que cada desenvolvedor usa para criar e executar sua VM, você teria um modelo de empacotador (json) que é usado para criar uma imagem de VM. Os desenvolvedores fazem o download ou copiam a imagem e a executam localmente, diretamente no VB, sem a necessidade de compilar.

Muitas das caixas básicas do Vagrant compartilhadas publicamente são criadas com o Packer.

Kief
fonte
2

/ubuntu/300799/does-ubuntu-12-04-lts-32-bit-have-graphic-user-interface/300805#300805

Depois de instalar a área de trabalho, você também desejará instalar o GDM, que permitirá inicializar diretamente em um ambiente gráfico. Você também vai querer configurá-lo.

Então, talvez adicione isso?

Vagrant::Config.run do |config|
    config.vm.provision :shell, :inline => "sudo apt-get install gdm"
    config.vm.provision :shell, :inline => "sudo dpkg-reconfigure gdm"
end
Anthony Roberts
fonte
1
... ou o xdm mais leve
geekQ 5/02
1

Corrigi um pouco a resposta da Nik para evitar o HTTP 404:

Vagrant.configure(2) do |config|
  # Ubuntu 15.10
  config.vm.box = "bento/ubuntu-18.04"

  config.vm.provider "virtualbox" do |vb|
    # Display the VirtualBox GUI when booting the machine
    vb.gui = true
  end

  # Install xfce and virtualbox additions
  config.vm.provision "shell", inline: "sudo apt-get update"
  config.vm.provision "shell", inline: "sudo apt-get install -y xfce4 virtualbox-guest-dkms virtualbox-guest-utils virtualbox-guest-x11"
  # Permit anyone to start the GUI
  config.vm.provision "shell", inline: "sudo sed -i 's/allowed_users=.*$/allowed_users=anybody/' /etc/X11/Xwrapper.config"
end
Stepan Yakovenko
fonte
0

Adicionando ao comentário de billmalarky acima, no fedora 20, o seguinte era necessário antes de iniciar o xfce:

  • Instale o VirtualBox-guest.rpm (disponível em repositórios rpmfusion)
  • grupos yum marcam instalação 'ambiente gráfico'
  • yum groupinstall "Xfce"
  • yum instalar xorg-x11-drivers

Aqui está o código:

config.vm.provision "shell", inline: <<-SHELL        
    #Install Virtual Box guest additions from rpmfusion repos
    cd /vagrant
    yum install -y rpmfusion-free-release-20.noarch.rpm 
    yum install -y rpmfusion-nonfree-release-20.noarch.rpm
    yum update -y
    yum install -y VirtualBox-guest

    #Add XFCE desktop to fedora server
    yum groups mark install 'graphical_environment'
    yum groupinstall -y "Xfce"
    yum install -y xorg-x11-drivers   
SHELL
Izak Marais
fonte
0

Como a xfce4solução da @Air. Uma vez tive sucesso, mas hoje falhei com o ubuntu16.04. Eu recebi este erro:

xrdb can't open display 1

Mas, felizmente, achei que isso funciona:

startx
scil
fonte
0

Vejo que algumas pessoas estão tendo problemas com "startx: comando não encontrado". Eu também tinha isso e porque estava tentando o login e o startx antes da conclusão do provisionamento pela primeira vez. Seja paciente, vá tomar um café. Verifique a janela do console original para ver o que está acontecendo, especialmente quando o aprovisionamento terminar.

Adrian Yorke
fonte