Xiaopei's DokuWiki

These are the good times in your life,
so put on a smile and it'll be alright

User Tools

Site Tools


it:virtualbox

Virtual Box / Vagrant

Vagrant - 对开发者的 vbox 的包装

  • 包装好的 Virtual Box,更适合于开发使用。
  • Vagrant Cloud 中有一些现成的 box
  • 另有 PuPHPet - Online GUI configurator for Puppet & Vagrant 等方便的搭建环境的工具
  • 将下载好的 .box 加入 vagrant, 网速太慢,直接用 vagrant 下载不靠谱
    # 如果 vagrantfile 中使用了 box: ubuntu-precise12042-x64-vbox43,
    # 那么就可以如下将 **已下好** 的 box 导入 vagrant,再 vagrant up.
    $ vagrant box add ubuntu-precise12042-x64-vbox43 ~/box/precise64.box
  • 将别的机器的 ~/.vagrant 目录里的 box 目录直接拷过来用的方法:要把版本目录改成 0 才能用!
  • 一个 Vagrant box 的根目录(Vagrantfile 所在的目录)与 box 内部的 /Vagrant 文件是同步的
    • 加更多的同步目录
      +  config.vm.synced_folder "src/", "/srv/website"
  • box 初始化 (provision)
    1. 写一个 bootstrap.sh
      bootstrap.sh
      #!/usr/bin/env bash
       
      apt-get update
      apt-get install -y apache2
      rm -rf /var/www
      ln -fs /vagrant /var/www
    2. 修改 Vagrantfile
      Vagrant.configure("2") do |config|
        config.vm.box = "precise32"
      +  config.vm.provision :shell, :path => "bootstrap.sh"
      end
    3. 第一次 vagrant up 时, 就会运行 bootstrap.sh
  • 端口映射
    +  config.vm.network :forwarded_port, host: 4567, guest: 80
  • 待机
    # 休眠
    $ vagrant suspend
    # 关机
    $ vagrant halt
  • 搞坏了
    # 删除, 之后再 up 能新创建一个干净的 box
    $ vagrant destroy
  • 第一次 up 时不 provision
    $ vagrant up --no-provision
    # 使用 puphpet 的 box 时,没找到修改 apt::source 的办法
    # (直接在 puppet + apt::src 不行),所以可以先 --no-provision
    # up 后,ssh 修改 apt 源,退出 ssh,再单独
    $ vagrant provision

vagrant 可能遇到 mount 在其他 service 之后的问题,造成 mount nginx 的配置但不启用。解决方法包括:

  • vagrant ssh -c 'sudo service nginx restart'
  • 或者 Provisioning scripts run after mounts. If you set the provisioning script to run “always”, then you can do something like this:
    config.vm.provision :shell, :inline ⇒ “sudo service mysql start”, run: “always”

vagrant / virtualbox 默认会强制 vm 时间与 host 相同若要修改 vm 的时间(如为了测试),可按以下方法:

  • 修改 Vagrantfile
    Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
      # config.vm.box = ...
    
      config.vm.provider :virtualbox do |vb|
        vb.customize ["setextradata", :id, "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled", 1]
      end
    end
  • 命令行
    # 查看
    $ VBoxManage getextradata sun-flower_default_1419827662326_56480 VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled
    # 修改
    $ VBoxManage setextradata <vm-name> VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled 1
  default: Error: Connection timeout. Retrying...
  default: Error: Connection timeout. Retrying...
  default: Error: Connection timeout. Retrying...
  default: Error: Connection timeout. Retrying...
  default: Error: Connection timeout. Retrying...
  default: Error: Connection timeout. Retrying...

可能是 VM 未正常关机,开机时需要按键盘造成的,可以:

# turn on the GU
config.vm.provider :virtualbox do |vb|
  vb.gui = true
end
# 麻烦,但能准确查到问题

# 或是先查 VM id
VBoxManage list runningvms
# 再发送 Enter 键
vboxmanage controlvm projects_1234567890 keyboardputscancode 1c
# 或发送 S 键(skip)
vboxmanage controlvm projects_1234567890 keyboardputscancode 1f

# 开机后,修改 ubuntu 配置
sudo grub-mkconfig
# that reset the /boot/grub/grub.cfg file

Keyboard scancodes: Keyboard scancodes

Host Vagrant for teamwork

Use NFS to speed up your Vagrant

默认的 Vagrant synced_folder 机制可能慢,可用 NFS 加速

config.vm.synced_folder “~/Code”, “/home/vagrant/Code”, :nfs ⇒ true

用 NFS 后,box 异常关机后,可能 NFS 挂不起来,可删除 /etc/exports 再 vagrant reload

How to set up a self-hosted "vagrant cloud" with versioned, self-packaged vagrant boxes

对于 box 维护者:

  1. 基于一个第三方 box,使用 Vagrantfile 或手动,准备包含自定义环境的 box
  2. 打包 box
    # 在自定义的 Vagrant 的目录中
    $ vagrant package --vagrantfile Vagrantfile.pkg --output 'dev_0.0.1.box'
    1. Vagrantfile.pkg 中可写 box 默认的 端口转发、目录映射 等
      # coding: utf-8
      # -*- mode: ruby -*-
      # vi: set ft=ruby :
       
      VAGRANTFILE_API_VERSION = "2"
       
      Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
       
        config.vm.network "private_network", ip: "192.168.33.11"
        config.vm.network "forwarded_port", guest: 80, host: 8080
       
        config.ssh.forward_agent = true
       
        config.vm.synced_folder "~/Code", "/home/vagrant/Code"
        config.vm.synced_folder "~/Code/log", "/var/log/sync"
        config.vm.synced_folder "~/Code/vhost", "/usr/local/nginx/conf/vhost"
       
        config.vm.provision :shell, :inline => "sudo /etc/init.d/nginx restart", run: "always"
       
      end
  3. 计算 sha1
    $ openssl sha1 dev_0.0.1.box
    SHA1(dev_0.0.1.box)= 3403a6a8f6758c99938a888ed8cdcc75ff8ad944
  4. Using a box catalog for versioning
    {
        "name": "devops",
        "description": "This box contains Ubuntu 14.04.1 LTS 64-bit.",
        "versions": [{
            "version": "0.1.0",
            "providers": [{
                    "name": "virtualbox",
                    "url": "file:///Users/hollodotme/VagrantBoxes/devops_0.1.0.box",
                    "checksum_type": "sha1",
                    "checksum": "d3597dccfdc6953d0a6eff4a9e1903f44f72ab94"
            }]
        },{
            "version": "0.1.1",
            "providers": [{
                    "name": "virtualbox",
                    "url": "file:///Users/hollodotme/VagrantBoxes/devops_0.1.1.box",
                    "checksum_type": "sha1",
                    "checksum": "0b530d05896cfa60a3da4243d03eccb924b572e2"
            }]
        }]
    }
  5. 使用 HTTP 或 FTP 服务器架设 catalog 和 box

对于 box 使用者:

  1. 在开发环境的 Vagrantfile 中加入 config.vm.box_url
    # Under ...
    config.vm.box = "devops"
    # ... add the line
    config.vm.box_url = "file://~/VagrantBoxes/devops.json"
    # save the file
  2. vagrant up
  3. 使用 vagrant box outdated 检查 box 是否有更新
  4. 使用 vagrant box update 更新 box
  5. 当 box 多了后,需要删除老版本的 box,需要时看参考文档吧:How to set up a self-hosted "vagrant cloud" with versioned, self-packaged vagrant boxes

Vagrant 不支持修改 box_url: Vagrant Will Not Override Cached Metadata URL #4235

通过 packer 使用一套配置统一 开发环境和生产环境

但是开发环境中一般会使用 synced_folder,而生产环境不会,packer 怎么解决这个问题还不清楚。

服务器中的 VirtualBox

如果启动报以下错,则需 dpkg-reconfigure

WARNING: The character device /dev/vboxdrv does not exist.
	 Please install the virtualbox-dkms package and the appropriate
	 headers, most likely linux-headers-generic.

	 You will not be able to start VMs until this problem is fixed.

$ sudo dpkg-reconfigure virtualbox-dkms
<code>
</WRAP>


  * Ubuntu 源中可能无最新版 VBox, 安装步骤需按文档: [[https://www.virtualbox.org/wiki/Linux_Downloads#Debian-basedLinuxdistributions|Linux_Downloads – Oracle VM VirtualBox]]


<WRAP center round alert>
<wrap em>VPS 里可能无法安装 VB</wrap> <code>
Starting VirtualBox kernel modules ...failed!
  (Running VirtualBox in a Xen environment is not supported)

Linux 下安 VB 可参考:https://www.virtualbox.org/wiki/Linux_Downloads

安装后,VB 可能还无法运行,需要 sudo /etc/init.d/vboxdrv setup,而 setup 又需要 Linux 的 header 头文件和 DKMS

Linux 头文件可 uname -a 获得

$ uname  -a 
Linux falcon 3.2.0-24-virtual #...
 
$ sudo apt-get install dkms
# 注意如果 uname 有 virtual, 那 header 也得有 virtual 
$ sudo apt-get install linux-headers-3.2.0-24-virtual 
 
$ sudo /etc/init.d/vboxdrv setup

DokuWiki Administrator 2014/04/01 14:37

cli - VBoxManage

常用命令

  • 别忘了安装 extpack
    sudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-4.3.6-91406.vbox-extpack
  • 查看 vm 信息
    VBoxManage showvminfo eb8b66e3-82e5-4b93-8b9d-f3423ee2062d
  • 修改 vm 远程桌面 (VRDE) 端口
    VBoxManage modifyvm "eb8b66e3-82e5-4b93-8b9d-f3423ee2062d" --vrdeport 5000
  • 设置 vm 用桥接联网
    VBoxManage modifyvm <id|name> --nic1 bridged --bridgeadapter1 eth1
  • 保存 vm 状态并关闭
    VBoxManage controlvm  eb8b66e3-82e5-4b93-8b9d-f3423ee2062d savestate

但更建议用 phpvirtualbox!

web frontend - phpvirtualbox

phpvirtualbox - A web-based VirtualBox front-end written in PHP. - Google Project Hosting

  • 安装指南, 要注意 phpvbox 的登录帐号/密码(默认 admin)和 VBOXWEB_USER 不同

远程桌面

  • 虚拟机级别的远程桌面 VRDP(Virtualbox Remote DisPlay): 服务器端需要安装 extension packs, VRDP 提供与本机运行 VBox 相同的体验, 常在安装/配置虚拟机时使用
  • cli 下安装 extention packs 参考VBoxManage extpack
    $ sudo VBoxManage extpack install <.vbox-extpack>
    $ VBoxManage list extpacks
  • mac 下的 Remote Desktop 软件可用 CoRD
  • Windows 实现 Remote Login 需要在 “我的电脑 → 属性” 中设置

  • Windows 如需多用户同时远程登陆, 需使用 universaltermsrvpatch_20090425.zip 破解

kvm - Kernel Based Virtual Machine - 另一个虚拟机软件

据说, 性能优于 vbox

it/virtualbox.txt · Last modified: 2017/03/14 11:36 by admin