使用 vagrant 在桌面环境下运行虚拟机

Posted

技术标签:

【中文标题】使用 vagrant 在桌面环境下运行虚拟机【英文标题】:Using vagrant to run virtual machines with desktop environment 【发布时间】:2013-09-23 13:26:45 【问题描述】:

我公司的开发环境是基于虚拟机的,运行在VirtualBox上。我们想更进一步,使用 Vagrant 的功能将机器描述保存在文本文件中,然后能够基于该文本文件“提升”该机器。结合puppet,这将解决我们每个人在VM中安装的软件版本不同的问题。

然而,Vagrant 似乎非常专注于在主机上开发,让机器在后台。我们需要在机器中拥有我们的开发环境,因此我们需要一个完整的 GUI,因此当键入“vagrant up”时,应该会出现一台具有完整桌面环境(XFCE、KDE...)的机器。

到目前为止,我已经成功地从 Xubuntu 发行版创建了一个“基础”盒子。但是当我输入“vagrant up”时,虽然桌面出现了,并且我能够正确登录,但 Vagrant 冻结在消息“等待机器启动。这可能需要几分钟......”。一段时间后,Vagrant 由于超时而崩溃。因此不会创建共享文件夹,也不会执行包配置程序 -puppet-。

如何使用 vagrant 创建具有完整 GUI 的虚拟机?

【问题讨论】:

我从来没有遇到过使用这些boxes 的问题。当您打包基础盒时,可能出了点问题。 从幼稚的角度来看,如果您可以在主机上而不是在 VM 上开发,为什么还要费心在 Vagrant VM 上安装 GUI 功能?为什么不在主机上开发? 当开发团队维护 VM/Vagrant 规范以与其应用程序的目标环境同步时,在 VM 上进行开发可以减少问题。您将获得更少的爬行依赖和行为,这是您的开发人员所独有的。目标环境/安装中不存在(或不相同)的环境。 其实你的结论并不完全正确。 Vagrant 并不是要让开发环境开箱即用。 linux上的很多人都是在终端中开发的。你可以用 ssh-only vagrant box 做到这一点。 【参考方案1】:

我只是通过三个步骤完成了这项工作。 askubuntu.com 的建议对我来说不太奏效,所以试试这个简化版:

    让基本的 Ubuntu 映像正常工作。你应该可以启动它并vagrant ssh。 接下来,启用默认关闭的 VirtualBox 显示。停止 VM 并取消注释 Vagrantfile:
     中的这些行
    config.vm.provider :virtualbox 做 |vb|
      vb.gui = 真
    结束
    启动 VM 并观察新的显示窗口。现在您只需要安装并启动xfce4。使用vagrant ssh 和:
    sudo apt-get install xfce4
    sudo startxfce4&
    

如果这是你第一次运行这个 Ubuntu 环境,你需要在安装 xfce4 之前运行以下命令:

sudo apt-get 更新

就是这样,您应该进入xfce4 会话。

更新:为了获得更好的体验,我建议进行以下改进:

    不要以 root 身份启动 GUI。您真的想保留vagrant 用户。为此,您需要允许任何人启动 GUI:sudo vim /etc/X11/Xwrapper.config 并将其编辑为 allowed_users=anybody。 接下来,启动 GUI 之前安装 VirtualBox 来宾工具。这将为您提供健康的屏幕分辨率、集成鼠标等。
    $ sudo apt-get install -y xfce4 virtualbox-guest-dkms virtualbox-guest-utils virtualbox-guest-x11
    $ sudo VBoxClient-all
    现在您才应该以vagrant 用户的身份使用$ startxfce4& 启动GUI。

更新 2: 今天试过了,VBoxClient-all 脚本并不总是安装。如果缺少,您可以替换为等价物:

sudo VBoxClient --clipboard
sudo VBoxClient --draganddrop
sudo VBoxClient --display
sudo VBoxClient --checkhostversion
sudo VBoxClient --seamless

【讨论】:

只是想顺便说一下,在尝试让 xfce 在 Fedora 19 vagrant box 中工作大约 5 小时后,解决方案是安装 virtualbox 来宾软件包(yum install VirtualBox-guest. x86_64)。如果没有该软件包,xorg 出于某种原因无法访问我的主机监视器。所以...谢谢伙计! 我在尝试这个时发现第 3 步的代码需要包含在 Vagrantfile 的 Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| ... done 方法中。 您可以通过在 Vagrantfile 中包含以下内容从 Vagrant 配置 Xwindows 等:#Provision X Windows、VirtualBox Guest、curl 和其他 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 :shell, :inline => "sudo VBoxClient-all" 提醒一下,Ubuntu 16.04 似乎不允许以这种方式以非 root 身份启动 XFCE:bugs.launchpad.net/ubuntu/+source/xinit/+bug/1562219 看起来startxfce4 可以在安装xserver-xorg-legacy 后在Ubuntu 16.04 (xenial) 上以非root 身份运行【参考方案2】:

这是 Air 以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

启动虚拟机

vagrant up

通过 virtualbox GUI 上的登录提示使用用户名:vagrant,密码:vagrant 登录。

启动 xfce

startx

【讨论】:

这对我有两个小的调整。首先,我在寻找“ubuntu/vivid64”框时得到了 404,所以我将其更改为在 vagrantcloud 上找到的“larryli/vivid64”。其次,我必须添加安装 vagrant-proxyconf 插件来管理代理设置。 它尖叫-> startx 当前没有安装?? 我的错,在 virtualbox 中没有配置 Internet 来下载 xfce4。它现在可以工作了,但有没有一种方法可以让我跳过登录并默认启动xfce4 @prayagupd 有点老了,但是你能详细说明一下“在 virtualbox 中没有配置 Internet 来下载 xfce4”吗?在vagrant ssh 之后运行 startx 时我遇到了同样的错误 我遇到了一些麻烦,我的虚拟框显示“startx: command not found”。有人可以帮我诊断一下吗?【参考方案3】:

这里是 Ubuntu 18.04 LTS / bionic 的稍微改编的 Vagrantfile - 感谢 Air 和 Nik 的回答,以及 this post 解释如何在使用 VirtualBox 时增加磁盘大小(默认 = 10 GB )。

VM 包含一个 LightDM 登录屏幕。

更新:我从这个例子中创建了一个GitHub repo,并添加了许多用于前端+后端开发的软件包。

# 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

  # https://askubuntu.com/questions/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

【讨论】:

在 Ubuntu 16.04 上,我必须安装 xserver-xorg-legacy 才能使 XWrapper.config 文件存在/被使用。 进一步测试表明,根据链接的 github repo 中的评论,可能不需要 sed 行。 @mh8020 感谢您创建 github 存储库。非常干净且易于理解,正是我所需要的。只有一个问题:我无法在来宾 Ubuntu 系统上正常工作!知道什么可以在您当前的设置中启用此功能吗? 谢谢,我在其他任何地方都找不到用户名和密码【参考方案4】:

我的 2 美分

确保您正在运行最新的 vagrant(现在为 1.3.3)+ VirtualBox(4.2.18)以避免错误。

您可以使用 shell 脚本或内联命令来安装桌面环境或轻量级窗口管理器

例如,在vagrantbox.es 的 Ubuntu 12.04 Precise base box 上安装 LXDE

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

  config.vm.provision "shell" do |s|
    s.inline = "apt-get install lubuntu-desktop -y"
  end
end
如果您构建自己的 vagrant base box,请确保遵循 base box 打包说明或考虑使用像 packer(或 veewee)这样的工具来自动化构建。

【讨论】:

【参考方案5】:

我正在使用 ubuntu 桌面映像,它可以很好地与带有虚拟框提供程序的 Windows 上的两个显示器配合使用。

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

【讨论】:

vb.customize ["modifyvm", :id, '--audio', 'dsound', '--audiocontroller', 'ac97'] 从虚拟机获取声音(如果需要) box-cutter 不再提供预先构建的图像。【参考方案6】:

您也可以考虑使用Packer 创建VirtualBox 映像供开发人员使用。

与其共享每个开发人员用于构建和运行他们的 VM 的 Vagrantfile,您将拥有一个用于创建 VM 映像的打包程序模板 (json)。开发人员下载或复制图像并在本地直接在 VB 中运行,无需自己构建。

许多公开共享的 Vagrant base box 都是使用 Packer 创建的。

【讨论】:

【参考方案7】:

https://askubuntu.com/questions/300799/does-ubuntu-12-04-lts-32-bit-have-graphic-user-interface/300805#300805

安装桌面后,您还需要安装 GDM 将让您直接启动到图形环境。你也会 想要配置它。

所以也许添加这个?

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

【讨论】:

...或更轻量级的xdm【参考方案8】:

我对 Nik 的回答做了一些修改以避免 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

【讨论】:

【参考方案9】:

除了上面 billmalarky 的评论之外,在 Fedora 20 上,在启动 xfce 之前需要执行以下操作:

安装 VirtualBox-guest.rpm(可从 rpmfusion 存储库获得) yum groups mark install 'graphical_environment' yum groupinstall "Xfce" yum install xorg-x11-drivers

代码如下:

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

【讨论】:

【参考方案10】:

就像@Air 的xfce4 解决方案一样。曾经我成功了,但今天我用 ubuntu16.04 失败了。我收到了这个错误:

xrdb can't open display 1

但幸运的是,我发现这是可行的:

startx

【讨论】:

【参考方案11】:

我看到一些人遇到“startx: command not found”的问题。我也有这个,这是因为我在首次配置完成之前尝试登录和 startx。耐心点,去喝杯咖啡。检查原始控制台窗口以查看正在发生的情况,尤其是在配置完成后。

【讨论】:

以上是关于使用 vagrant 在桌面环境下运行虚拟机的主要内容,如果未能解决你的问题,请参考以下文章

vagrant使用小结

windows下vagrant的安装使用

windows下vagrant的安装使用

使用 Vagrant + VirtualBox 快速构建 CentOS 下的 Docker 环境

Ubuntu18.06 Mate桌面环境下VirtuslBox打开虚拟机“全局菜单”异常退出解决办法

虚拟机桌面显示错乱怎么办?