我如何使用Vagrant和libvirt

669 阅读4分钟

我承认这一点。我是一个Linux的粉丝。虽然我在工作站上使用Slackware,在服务器上使用红帽企业Linux(RHEL)多年,但我喜欢看其他发行版如何做事。更重要的是,我非常喜欢在其他发行版上测试我写的应用程序和脚本,以确保可移植性。事实上,在我看来,这正是Linux的一大优势。你可以下载一个发行版并在上面免费测试你的软件。在封闭的操作系统中,你无法做到这一点,至少在不违反EULA的情况下,或者在不付费的情况下,你往往要注册下载几GB的文件,只是为了测试一个不超过几百GB的应用程序。但Linux是开源的,所以很少有借口忽视至少三四个主要的发行版,除了设置一个虚拟机可能需要大量的点击,有时还需要复杂的虚拟网络。至少,这曾经是一个借口,直到Vagrant改变了开发者的虚拟机工作流程。

什么是Vagrant

Vagrant是一个简单的虚拟机管理器,用于你的终端。它允许你轻松地从互联网上拉出一个最小的、预先构建好的虚拟机,在本地运行,并在短短的几步内SSH到它。这是你建立一个虚拟机的最快速度。它是需要测试网络服务器的网络开发人员、需要在不同发行版上测试应用程序的程序员以及喜欢看不同发行版工作情况的业余爱好者的理想选择。

Vagrant本身也是相对最小的。它本身不是一个虚拟化框架。它只是管理你的虚拟机(Vagrant术语中的 "盒子")。它可以使用VirtualBox,或者通过一个插件,使用轻量级的libvirt项目作为后端。

什么是libvirt

libvirt项目是一个旨在管理虚拟化的工具包,支持KVMQEMULXC等。你可以把它看作是一种虚拟机API,允许开发者编写友好的应用程序,使用户能够通过libvirt轻松协调虚拟化。我使用libvirt作为Vagrant的后端,因为它在多个应用程序中都很有用,包括virt-manager和GNOME Boxes

安装Vagrant

你可以从vagrantup.com/downloads安装Vagrant。这里有基于Debian的系统、基于CentOS的系统、macOS、Windows等的构建版本。

对于CentOS、Fedora或类似系统,你会得到一个RPM包,你可以用dnf

$ sudo dnf install ./vagrant_X.Y.ZZ_x86_64.rpm

在Debian、Linux Mint、Elementary和类似系统上,你会得到一个DEB包,你可以用apt

$ sudo apt install ./vagrant_X.Y.ZZ_x86_64.deb

安装libvirt和支持包

在Linux上,你的发行版可能已经安装了libvirt,但要实现与Vagrant的集成,你还需要一些其他的软件包。用你的软件包管理器安装这些软件包。

在Fedora、CentOS和类似系统上。

$ sudo dnf install gcc libvirt \
libvirt-devel libxml2-devel \
make ruby-devel libguestfs-tools

在Debian、Linux Mint和类似系统上。

$ sudo apt install build-dep vagrant ruby-libvirt \
qemu libvirt-daemon-system libvirt-clients ebtables \
dnsmasq-base libxslt-dev libxml2-dev libvirt-dev \
zlib1g-dev ruby-dev libguestfs-tools

根据你的发行版,你可能需要启动libvirt 守护程序。

$ sudo systemctl start libvirtd

安装Vagrant-libvirt插件

在Vagrant中,libvirt是通过一个插件启用的。Vagrant让安装插件变得很容易,所以你的第一个Vagrant命令是一个你很少会再运行的命令。

$ vagrant plugin install vagrant-libvirt

现在,libvirt插件已经安装完毕,你可以开始使用虚拟机了。

设置你的Vagrant环境

要开始使用Vagrant,创建一个名为~/Vagrant 的目录。这是你的Vagrantfiles 的地方。

$ mkdir ~/Vagrant

在这个目录中,创建一个子目录来代表你要下载的发行版。例如,假设你需要一个CentOS测试盒。

创建一个CentOS目录,然后换到它。

$ mkdir ~/Vagrant/centos
$ cd ~/Vagrant/centos

现在你需要找到一个虚拟机,这样你就可以把刚才的目录转换成Vagrant环境了。

找到一个Vagrant虚拟机

大体上说,Vagrant盒子来自三个不同的地方。Hashicorp(Vagrant的维护者),发行版的维护者,以及像你和我这样的人。有些镜像是最小的,目的是作为定制的基础。相比之下,其他的图像试图解决一个特定的需求(例如,你可能会发现一个LAMP堆栈图像,准备用于网络开发)。你可以通过浏览或搜索盒子的主中心app.vagrantup.com/boxes/searc…来寻找图像。

在这个例子中,搜索 "centos "并找到名为generic/centos8 的条目。点击图片以获得关于如何使用该虚拟机的说明。该说明有两种形式。

  • 你需要的Vagrant文件的代码
  • 你需要从终端使用该盒子的命令

后者是更直接的方法。

$ vagrant init generic/centos8

init 子命令在你的当前目录下创建一个配置文件,称为Vagrantfile,它将该目录转化为Vagrant环境。在任何时候,你都可以使用global-status 子命令查看已知的Vagrant环境列表。

$ vagrant global-status
id       name    provider state   directory
-------------------------------------------
49c797f  default libvirt running /home/tux/Vagrant/centos8

用Vagrant启动一个虚拟机

一旦你运行了init 命令,你就可以用vagrant up 启动你的虚拟机。

$ vagrant up

这将导致Vagrant下载虚拟机镜像(如果它不存在于本地),建立一个虚拟网络,并配置你的盒子。

进入Vagrant虚拟机

一旦你的虚拟机启动并运行,你就可以用vagrant ssh 登录它。

你连接到你当前Vagrant环境中运行的盒子。一旦登录,你可以运行该主机的所有原生命令。这是一个运行自己内核的虚拟机,有仿真的硬件和常见的Linux软件。

离开Vagrant虚拟机

要离开你的Vagrant虚拟机,就像你通常退出Linux电脑一样,注销主机。

box$ exit

或者,你可以关闭虚拟机的电源。

box$ sudo poweroff

你也可以使用vagrant 命令停止机器的运行。

box$ vagrant halt

销毁Vagrant虚拟机

当使用完Vagrant虚拟机后,你可以销毁它。

$ vagrant destroy

另外,你可以使用全局box 子命令来删除一个虚拟机。

$ vagrant box remove generic/centos8

Vagrant很简单

Vagrant让虚拟机变得简单、一次性、快速。当你需要一个测试环境或一个假的服务器来进行ping或开发,或一个干净的实验室计算机来进行实验或监控时,你可以通过Vagrant获得一个。有些人认为虚拟机现在已经不重要了,因为容器已经接管了服务器,但虚拟机有独特的特性,使它们很有用。它们运行自己的内核,有一个独立于主机的完整而独特的堆栈,并使用仿真硬件。当你需要一个虚拟机时,Vagrant可能是获得它的最佳方式。