有一种特殊的 box 被称为“base box”。这些 box 包含 Vagrant 运作所需的最低限度,通常不是对现有的 Vagrant 环境(“base box”中的“base”)的重新包装。
例如,Vagrant 项目(例如“precise64”)提供的 Ubuntu box 就是基础 box。它们基于从 ISO 安装的最小 Ubuntu,而不是重新打包已有的环境。
基础 box 在创建用于未来开发环境的洁净平台时非常有用。Vagrant 项目希望未来能够为更多的操作系统提供基础 box。在此之前,此页面记录了如何创建自己的基础 box。
高级话题! 创建基础 box 可能是一个耗时且乏味的过程,不建议新 Vagrant 用户使用。如果你刚刚开始使用 Vagrant,建议先尝试查找现有的基础 box。
1. 什么是基础 box
基础 box 通常只包含支持 Vagrant 工作的最小的软件集。例如,Linux box 可能只包含下面内容:
- 包管理器
- SSH
- 用于 Vagrant 连接的 SSH 用户
- 也许有 Chef、Puppet等,但不是必须的
此外,每个 provider 可能需要额外的软件。例如,如果你创建用于 VirtualBox 的基础 box,需要添加 VirtualBox 的附加软件,以便共享目录可以正常工作。如果为 AWS 创建基础 box,则不需要。
2. 创建基础 box
每个基础 box 都关联一个 provider。根据你使用的是 VirtualBox、VMWare 或 AWS,会创建不同的基础 box。
本章只会讲创建基础 box 的统一文档,然而,跟 provider 相关的部分会链接到相关文档:
Packer 和 Vagrant Cloud
强烈建议通过 Packer 创建基础 box 的可重复性构建,并且使用 Atlas 自动化构建。更多资料参考 Atlas 文档的 用 Packers 创建 Vagrant box。
磁盘空间
当创建基础 box 时,确保有足够的磁盘空间来做有趣的事情,而不会感到烦恼。例如,在 VirtualBox 中,应该创建一个动态调整大小最大的驱动器。这会导致驱动器的实际占用空间最初很小,但需要磁盘空间时动态增加到最大容量,为最终用户提供最大的灵活性。
如果要创建 AWS 基本 box,则不要强制 AMI 分配 TB 字节的 EBS 存储,因为用户可以自行完成。但是你应该默认安装临时驱动器,因为它们是免费的并提供大量的磁盘空间。
内存
像磁盘空间一样,找到合适的默认内存非常重要。对于大多数 provider,用户可以使用 Vagrantfile 修改内存,所以默认情况下不要使用太多。如果一个基础 box 上的 vagrant 一下子就需要几千兆字节的 RAM,那么这将会是一种糟糕的用户体验(并且有点令人震惊)。相反,选择 512MB 通常足以在 Vagrant 机器上玩耍并做有趣的事情,且可以在需要时轻松增加。
外设(音频,USB 等)
关闭所有基础 box 中不需要的硬件,例如音频和 USB 控制器。Vagrant 通常不需要这些,如果需要可以很容易的通过 Vagrantfile 添加。
3. 默认用户设置
在 Vagrant 中,几乎所有特性都可以修改。但是,Vagrant 确实希望有一些默认设置能够让基础 box 可以工作。如果你打算公开发布 box,则应该将其创建为默认设置。
如果你正在创建一个私人使用的基础 box,你应该尽量不要创建默认设置,因为别人会打开你的基础 box,这样有安全风险(已知用户,密码,私钥等)。
“vagrant” 用户
默认情况下,Vagrant 期望有一个“vagrant”用户用于通过 SSH 连接到机器时使用。该用户应该使用 Vagrant 默认使用的不安全密钥对来尝试 SSH。此外,即使 Vagrant 默认使用基于密钥的身份验证,但将“vagrant”用户的密码设置为“vagrant”是通用惯例。这可以让用户在需要时手动以该用户的身份登录。
要使用不安全的密钥对配置 SSH 访问,请将公钥放入“vagrant”用户的 ~/.ssh/authorized_keys
文件中。请注意,OpenSSH 对文件权限非常挑剔。因此,请确保 ~/.ssh
具有 0700
权限并且授权密钥文件具有 0600
权限。
当 Vagrant 启动一个 box 并检测到不安全的密钥对时,它会自动用一个随机生成的密钥对代替它,以在 box 运行时提供额外的安全性。
root 密码:“vagrant”
Vagrant 实际上并不使用或期望任何 root 密码。但是,拥有众所周知的根密码可以让公众更容易地根据需要修改机器。
公开可用的基础 box 通常使用“vagrant”这个根密码。
不需密码的 Sudo
这个很重要!Vagrant 的许多特性都希望默认的 SSH 用户能够配置无密码的 sudo。这让 Vagran 可以t配置网络,挂载同步目录,安装软件等。
首先,一些精简版操作系统的安装默认不包括 sudo。确认你以某种方式安装了sudo。
安装了 sudo 之后,需要将“vagrant”用户配置为不需密码。可以在配置文件中添加下面一行的内容:
vagrant ALL=(ALL) NOPASSWD: ALL
此外,通过 SSH 连接时,Vagrant 默认不使用 pty 或 tty。需要确保没有连接要使用它。如果它存在则删除。这允许 sudo 在没有 tty 的情况下正常工作。注意,可以将 Vagrant 配置为请求一个 pty,这可让你保留此配置。但是,默认情况下,Vagrant 不会这样做。
SSH 调整
即使你的计算机或 Vagrant 机器未连接到互联网,为了保持 SSH 快速,请在 SSH 服务器配置中将 UseDNS 配置设置为 no。
这可以避免在连接 SSH 客户端上进行反向 DNS 查找,这可能需要几秒钟的时间。
4. Windows Boxes
Supported Windows guest operating systems: - Windows 7 - Windows 8 - Windows Server 2008 - Windows Server 2008 R2 - Windows Server 2012 - Windows Server 2012 R2
Windows Server 2003 and Windows XP are not supported, but if you are a die hard XP fan this may help you.
Base Windows Configuration
- Turn off UAC
- Disable complex passwords
- Disable “Shutdown Tracker”
- Disable “Server Manager” starting at login (for non-Core)
In addition to disabling UAC in the control panel, you also must disable UAC in the registry. This may vary from Windows version to Windows version, but Windows 8/8.1 use the command below. This will allow some things like automated Puppet installs to work within Vagrant Windows base boxes.
reg add HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionPoliciesSystem /v EnableLUA /d 0 /t REG_DWORD /f /reg:64
Base WinRM Configuration
To enable and configure WinRM you will need to set the WinRM service to auto-start and allow unencrypted basic auth (obviously this is not secure). Run the following commands from a regular Windows command prompt:
winrm quickconfig -q
winrm set winrm/config/winrs @{MaxMemoryPerShellMB="512"}
winrm set winrm/config @{MaxTimeoutms="1800000"}
winrm set winrm/config/service @{AllowUnencrypted="true"}
winrm set winrm/config/service/auth @{Basic="true"}
sc config WinRM start= auto
Additional WinRM 1.1 Configuration
These additional configuration steps are specific to Windows Server 2008 (WinRM 1.1). For Windows Server 2008 R2, Windows 7 and later versions of Windows you can ignore this section.
- Ensure the Windows PowerShell feature is installed
- Change the WinRM port to 5985 or upgrade to WinRM 2.0
The following commands will change the WinRM 1.1 port to what’s expected by Vagrant:
netsh firewall add portopening TCP 5985 "Port 5985"
winrm set winrm/config/listener?Address=*+Transport=HTTP @{Port="5985"}
5. 其他软件
现在,你拥有所有用于基础 box 的必须的且可以与 Vagrant 共同使用的软件。但是,还可以安装一些其他软件。
虽然未来可能会不一样,但现在使用这些 provider 时,Vagrant 仍不会自动安装 Chef 或 Puppet。用户可以使用 shell 程序来执行此操作,但是如果希望 Chef/Puppet 开箱即用,则必须将其安装在基本 box 中。
安装这个不在本教程范围内,但应该相当简单。
除此之外,还可以随意安装和配置默认情况下可用于此基本 box 的任何其他软件。
6. 打包 Box
将 box 打包成 box 文件是特定于 provider 的。请参阅 provider 特定的文档以创建基准 box。部分 provider 特定的指南链接到此页面的顶部。
7. 发布 Box
可以分发 box 文件。但是,如果想支持版本控制、将多个 provider 放在一个 URL 中、推送更新、分析等,我们建议你将该 box 添加到 HashiCorp 的 Vagrant Cloud。
可以将公共和私人 box 上传到此服务。
8. 测试 Box
要测试这个 box,假装你是 Vagrant 的一个新用户:
$ vagrant box add --name my-box /path/to/the/new.box
...
$ vagrant init my-box
...
$ vagrant up
...
如果创建的是基于其他 provider 的 box,需要在使用 vagrant up
命令时添加 --provider
选项。如果启动成功,则表示 box 可以工作。