在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 简单对比两种不同虚拟化的性能差异
安装编译工具参考 Debian最小化安装后的软件包安装建议
安装使用Unixbench参考 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 提供了网络安装下载:
下载 Ubuntu 18.04 "Bionic Beaver" 的网络安装镜像 mini.iso
果然通过netinstall方式可以绕过奇怪的无法挂载CDROM问题
这里有一个疏忽,忘记将 ubuntu-18.04.1.0-live-server-amd64.iso 替换成 mini.iso ,但是没有想到,实际上使用了 mini.iso 中的内核 linux 和 initrd.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?