Running centos 7 on xhyve
Contents
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