xhyve 是一个基于 OS X  Hypervisor.framework 的虚拟机,非常轻量,二进制可运行文件只有200KB+,非常适合用来在MAC上虚拟 linux 或者 bsd 系统。

关于xhyve的详细介绍,建议阅读:http://www.pagetable.com/?p=831

网站上面只介绍了如何将 Ubuntu 安装到 xhyve 上面,而有很多人在生产系统使用的 centos, 下面就是我在 xhyve 上安装 centos 的记录(其实现在解决开发环境与部署环境不匹配的方案有很多,docker 就是一个很好的工具)。

  • Step 1: 安装xhyve

如果使用homebrew:

$ brew update
$ brew install xhyve</pre>

如果是编译安装:

$ git clone https://github.com/mist64/xhyve
$ cd xhyve
$ make

编译完成后在 build/ 目录下可以找到可执行文件。

  • Step 2: 下载 centos 镜像,提取 kernel

这里我使用的是centos minimul iso 镜像,因为我暂时不需要 GUI 界面,只要命令行工具就可以:

$ wget http://mirrors.ustc.edu.cn/centos/7.2.1511/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso

$ shasum CentOS-7-x86_64-Minimal-1511.iso
783eef50e1fb91c78901d0421d8114a29b998478  CentOS-7-x86_64-Minimal-1511.iso

因为现在的 centos 镜像是hybrid file system的(可以直接dd 到u盘烧录的),而 OS X 的hdiutil 不支持直接挂载,所以我们需要一点小小的magic:

$ dd if=/dev/zero bs=2k count=1 of=/tmp/tmp.iso
$ dd if=CentOS-7-x86_64-Minimal-1511.iso bs=2k skip=1 >> /tmp/tmp.iso

#挂载:
$ hdiutil attach /tmp/tmp.iso

#拷贝kernel和运行时环境:
$ cp /Volumes/CentOS\ 7\ x86_64/isolinux/{vmlinuz,initrd.img} ~/Workspace/xhyve/build

#删除tmp.iso
$ rm /tmp/tmp.iso
  • Step 3: 安装 centos

首先,建立一个虚拟磁盘:

#8GB
$ dd if=/dev/zero of=hdd.img bs=1g count=8

然后编写安装脚本(设置环境变量),用来在 xhyve 启动 centos 安装镜像:

#!/bin/sh

# Linux
KERNEL="./vmlinuz"
INITRD="./initrd.img"
CMDLINE="earlyprintk=serial console=ttyS0"

MEM="-m 1G"
SMP="-c 2"
NET="-s 2:0,virtio-net"
IMG_CD="-s 3,ahci-cd,/Users/will/Downloads/CentOS-7-x86_64-Minimal-1511.iso"
IMG_HDD="-s 4,virtio-blk,./hdd.img"
PCI_DEV="-s 0:0,hostbridge -s 31,lpc"
LPC_DEV="-l com1,stdio"
#ACPI="-A"
#UUID="-U deadbeef-dead-dead-dead-deaddeafbeef"

# Linux
xhyve $ACPI $MEM $SMP $PCI_DEV $LPC_DEV $NET $IMG_CD $IMG_HDD $UUID -f kexec,$KERNEL,$INITRD,"$CMDLINE"

将上面的脚本保存(xhyverun_install.sh),并执行:

$ chmod a+x xhyverun_install.sh
$ sudo ./xhyverun_install.sh

然后进行设置安装,当安装完毕,安装程序显示:

Installation complete.  Press return to quit

的时候,不要着急按回车退出,我们切换到另外一个shell,把 安装完成的 kernel 和 初始化环境拷贝出来:

#centos 安装工具anaconda 使用的是tmux, 我们使用其功能键切换到一个shell
$ Ctrl-b 2

#然后检查你的虚拟机ip地址(我的虚拟机ip是192.168.64.8)
$ ifconfig

#如果在安装的时候没有设置网络,这个时候需要使用nmtui/dhclient等工具设置并且激活一下
$ nmtui or dhclient eth0

#然后进入新安装虚拟机的boot目录
$ cd /mnt/sysimage/boot/

#使用python大法,搭建http server
$ python -m SimpleHTTPServer

#在host上通过浏览器,或者wget等工具下载 kernel等文件
$ wget http://192.168.64.8:8000/vmlinuz-3.10.0-327.el7.x86_64
$ wget http://192.168.64.8:8000/initramfs-3.10.0-327.el7.x86_64.img

ok,这时候切换回第一个shell,然后关闭虚拟机:

$ Ctrl-b 1
$ enter
  • 运行 centos

编写运行脚本(设置运行环境变量):

#!/bin/sh

# Linux
KERNEL="./vmlinuz-3.10.0-327.el7.x86_64"
INITRD="./initramfs-3.10.0-327.el7.x86_64.img"
CMDLINE="earlyprintk=serial console=ttyS0 acpi=off root=/dev/vda3 ro"

MEM="-m 1G"
SMP="-c 2"
NET="-s 2:0,virtio-net"
#IMG_CD="-s 3,ahci-cd,/Users/will/Downloads/CentOS-7-x86_64-Minimal-1511.iso"
IMG_HDD="-s 4,virtio-blk,./hdd.img"
PCI_DEV="-s 0:0,hostbridge -s 31,lpc"
LPC_DEV="-l com1,stdio"
#ACPI="-A"
UUID="-U deadbeef-dead-dead-dead-deaddeafbeef"

# Linux
xhyve $ACPI $MEM $SMP $PCI_DEV $LPC_DEV $NET $IMG_CD $IMG_HDD $UUID -f kexec,$KERNEL,$INITRD,"$CMDLINE"

将脚本保存成 run.sh,然后执行:

#修改执行权限
$ chmod a+x run.sh

$ sudo ./run.sh

然后你就可以使用新的虚拟机了。。。

 

最后附上一段运行时的gif,xhyve 比 virtual box 资源占用小多了:

centos-on-xhyve

centos-on-xhyve