在xhyve中运行Debian/Ubuntu

部署xhyve参考在OS X中部署xhyve

在xhyve中运行Ubuntu

安装Ubuntu 16.04(成功)

  • xhyve使用文件作文本地磁盘,可能需要使用raw磁盘,qcow磁盘可能比较难以加载。

dd if=/dev/zero of=ubuntu18.img bs=1g count=16
  • 获取需要的内核文件

xhyve从本地文件系统加载内核和initrd镜像 -- 需要从本地挂载的iso中提取以便能够启动一个安装cd。先下载一个iso,然后将iso挂载到mac中并复制出kernel文件。

为了能够挂载iso,需要构建一个兼容副本(也就是最前面到2k块是空白),然后挂载副本:

dd if=/dev/zero bs=2k count=1 of=tmp.iso
dd if=ubuntu-16.04.5-server-amd64.iso bs=2k skip=1 >> tmp.iso
hdiutil attach tmp.iso
  • 从挂载的卷中复制出内核文件:

cp /Volumes/Ubuntu-Server\ 16/install/vmlinux .
cp /Volumes/Ubuntu-Server\ 16/install/initrd.gz .
  • 安装脚本install.sh指定16.04镜像:

#!/bin/bash
KERNEL="vmlinuz"
INITRD="initrd.gz"
CMDLINE="earlyprintk=serial console=ttyS0"

# Guest Config
MEM="-m 2G"
IMG_CD="-s 1,ahci-cd,ubuntu-16.04.5-server-amd64.iso"
IMG_HDD="-s 2,virtio-blk,ubuntu.img"
NET="-s 3:0,virtio-net,en0"
PCI_DEV="-s 0:0,hostbridge -s 31,lpc"
LPC_DEV="-l com1,stdio"
ACPI="-A"

# and now run
sudo xhyve $ACPI $MEM $PCI_DEV $LPC_DEV $NET $IMG_CD $IMG_HDD -f kexec,$KERNEL,$INITRD,"$CMDLINE"

顺利启动安装,整个过程非常快速。

  • 安装完成后不要马上重启,而是Go Back 然后选择 Execute a shell,因为此时我们需要将安装的initrd 和 linux(内核)复制出到macOS中,以便能够让xhyve启动系统:

在使用 sbin/ifconfig 可以看到虚拟机的IP地址,例如 192.168.64.2

然后在macOS上执行

此时可以看到在macOS上,增加了一个 boot 目录包含了ubuntu虚拟机的/boot目录下所有文件。之后我们将使用这个目录中内核来启动虚拟机。

  • 启动虚拟机脚本 run.sh

运行启动脚本,启动进入Ubuntu 16操作系统控制台,启动速度极快

  • 恢复虚拟机网络的脚本masq.sh

在macOS物理主机上运行任何VPN程序,在退出VPN时候会导致虚拟机网路无法连接,则通过如下脚本恢复网络

能对比测试(vmware .vs xhyve)

采用 unixbench 简单对比两种不同虚拟化的性能差异

  • xhyve中运行1c2g规格虚拟机测试结果

  • vmware中运行1c2g规格虚拟机测试结果

从UnixBench测试来看,vmware环境运行的ubuntu性能比 xhyve 略好:vmware比xhyve性能约高 5%

升级 Ubuntu 16.04 到 18.04

前面已经完成了Ubuntu 16.04在xhyve中的系统安装,就考虑既然直接安装Ubuntu 18.04的iso失败,难么能否在现有已经安装成功的Ubuntu 16.04基础上升级到18.04?

参考 升级Ubuntu系统到18.04 LTS Bionic Beaver

不过,升级完成后,同样方法,将镜像中的最新版本内核复制到macOS系统中通过 xhyve 加载方式启动(如之前run.sh启动脚本),但是启动和直接使用Ubuntu 18.04 iso镜像安装一样报错

看来目前xhyve尚不能启动最新的 4.15.0 系列内核,实际测试回退到 4.4.0 内核(即Ubuntu 16.04所用内核)则可以正常启动。所以,目前我在xhyve中使用的Ubuntu 18.04系统运行的内核版本为 4.4.0-131

参考 hyperkit fails to boot 4.17 and 4.18 kernel (based on Linuxkit) 信息,导致高版本内核运行异常是因为一些较新的内核触发的VMEXIT没有被hyperkit正确处理。qemu 3.0可以工作在内核4.17的hvf模式 (-accel hvf -cpu host),最新版本的hyperkit/xhyve已经可以启动Fedora 29,即 machyve/xhyve@cc672d5 可能已经解决。

  • 为了能够始终访问控制台,建议使用screen来运行xhyve的终端,也就是先运行screen成勋再执行xhyve运行虚拟机,以便能够随时访问终端。

  • 由于内核升级会导致虚拟机无法运行,所以需要暂时关闭Kernel update

Ubuntu 18安装(失败)

实践是安装Ubuntu 18 LTS版本

  • xhyve使用文件作文本地磁盘,可能需要使用raw磁盘,qcow磁盘可能比较难以加载。

  • 获取需要的内核文件

xhyve从本地文件系统加载内核和initrd镜像 -- 需要从本地挂载的iso中提取以便能够启动一个安装cd。先下载一个iso,然后将iso挂载到mac中并复制出kernel文件。

为了能够挂载iso,需要构建一个兼容副本(也就是最前面到2k块是空白),然后挂载副本:

此时提示该镜像挂载:

然后,从挂载的卷中复制出内核文件:

上述方法可以参考 PXE boot of 18.04 ISO ,也就是可以从 18.04 ISO文件中解压缩出必要的文件来构建一个PXE启动,方法适用于 16.04 , 17.10 和 18.04 等不同版本。

如果是早期的 16.04 版本,上述镜像内核文件位于ISO根目录中,类似方法:

此时就可以删除临时的 tmp.iso 文件了

  • 现在需要启动安装器,也即是如下 install.sh 脚本

注意:我的安装目录位于 ~/vms 目录下,这个目录下包含了前面解压缩出来的内核文件,以及iso安装文件:

以下改自ubuntu 16的安装脚本在启动ubuntu 18的安装过程,会有响应缓慢问题,似乎和总线有关

运行安装脚本

报错:

这个报错参考 Could not open backing file: No such file or directory #143,原来是我写错了镜像名字导致的。

修改安装脚本(参考 Ubuntu 18 on xhyve on MacOS X failed again )将不同的设别分设到不同的总线端口上

但是,上述安装脚本遇到了启动后内核无法识别设备问题:

尝试16.04.5安装iso中内核启动

这个方法是参考 Ubuntu 18 on xhyve on MacOS X failed again ,也遇到了相同的问题:

  • 使用 16.04.5 版本的iso中复制出来的 vmlinuz 和 initrd.gz 启动,配置使用 18.04.1 版本的iso进行安装,在启动之后也是在检测和挂载CD-ROM阶段出现报错

但是,退到shell中检查,可以看到CDROM是挂载的

尝试做了一次umount /cdrom之后,然后重新执行 Detect and mount CD-ROM 发现,这个镜像重新挂载,但是依然报错。

Check the CD-ROM(s) integrity 功能来看,提示信息

所以,我推测安装工具是做了MD5校验来确定是否CDROM正确挂载,而在xhyve安装中修改ISO会导致校验失败。

或许和CentOS一样能够通过netinstall方式来安装可以绕过这个问题?

通过Ubuntu 18的mini.iso安装(网络安装),接近成功

Installation/MinimalCD 提供了网络安装下载:

  • 果然通过netinstall方式可以绕过奇怪的无法挂载CDROM问题

这里有一个疏忽,忘记将 ubuntu-18.04.1.0-live-server-amd64.iso 替换成 mini.iso ,但是没有想到,实际上使用了 mini.iso 中的内核 linuxinitrd.gz 之后,启动安装就会通过网络获取相关软件包,不再需要使用iso镜像中的文件,所以并没有遇到问题。

不过,我虽然安装成功,但是启动运行出现磁盘hung,导致无法访问,准备再次使用默认的EXT4文件系统进行安装。

  • 磁盘分区和文件系统我没有采用默认的ext4文件系统,而是采用了比较激进的btrfs:

/dev/sda1设置为xfs文件系统,挂载为/boot

/dev/sda2设置为btrfs文件系统,挂载为/

最后的磁盘分区情况如下:

开始安装了,进展顺利,激动。。。

  • 最后安装完成,暂时不要直接退出安装界面,而是把磁盘镜像/boot目录下的内核复制出来:

Go Back 然后选择 Execute a shell,因为此时我们需要将安装的initrd 和 linux(内核)复制出到macOS中,以便能够让xhyve启动系统:

在使用 ip addr 可以看到虚拟机的IP地址,例如 192.168.64.4

然后在macOS上执行

此时可以看到在macOS上,增加了一个 boot 目录包含了ubuntu虚拟机的/boot目录下所有文件。之后我们将使用这个目录中内核来启动虚拟机。

  • 启动运行脚本

遇到一个诡异问题,虽然安装过程正常顺利,但是启动运行出现任务挂起。启动非常缓慢,出现报错。一种可能是虚拟化磁盘读取响应问题,另一种可能是选择的文件系统问题。

尝试18.10

尝试从16.04的iso中提取启动内核安装18.04(失败)

复制内核

启动内核脚本采用16.04的内核,但是安装镜像iso文件则选择18.04

果然,这样启动安装可以进行,顺利见到了安装界面。但是很不幸,出现了load addition module无法复制问题,init之后指定复制文件不能匹配。

参考

Last updated

Was this helpful?