在 KVM 虚拟机中运行 macOS 系统

之前介绍过如何在 Ubuntu 系统和 KVM 中安装 Windows 系统,当时就说了,希望有机会能把 macOS 也给虚拟化了,这样就完美了。今天这篇文章就是解决这个问题的。

准备工作

开始之前,你需要做好以下的准备工作:

  • 一台可以正常工作的 Mac 电脑
  • 一台装好了 KVM 的 Linux 主机
  • 下载好了的 macOS 安装包
  • 一颗不怕折腾的心

首先参考 Dhiru Kholia 的方式,获取一份代码先:

$ git clone git@github.com:kholia/OSX-KVM.git
Cloning into ‘OSX-KVM’…
remote: Counting objects: 28, done.
remote: Total 28 (delta 0), reused 0 (delta 0), pack-reused 28
Receiving objects: 100% (28/28), 2.62 MiB | 98.00 KiB/s, done.
Resolving deltas: 100% (1/1), done.

当然,如果你没有 Git 也可以直接下载 ZIP 压缩包

下载地址:https://github.com/kholia/OSX-KVM

创建 ISO 镜像

虚拟机是无法识别 Apple 的 DMG 文件的,所以我们需要在 Mac App Store 获取的 macOS Installer 的基础上,生成一个可以在虚拟机中启动的 ISO 镜像。

如果 macOS Sierra 已经下载好了的话,我们直接执行下面的命令就可以生成一个安装光盘镜像了。

$ sudo ./create_install_iso.sh

运行截图如上,程序结束后,会在当前目录生成了一个名为 Install_macOS_Sierra_(OS_X_10.12.2).iso 的光盘镜像文件。

把这个文件复制到 KVM 服务器,这一步就算是完成了。

rsync -avP Install_macOS_Sierra_(OS_X_10.12.2).iso server:/path/to/iso/

启动虚拟机

这里就是大坑了,之前折腾了 2 天都是卡在这里,用网上的各种方法一启动,就显示一个 boot: 就没有然后了。

我们先创建好需要的磁盘镜像 sierra.qcow2

$ cd /path/to/kvm
$ qemu-img create -f qcow2 sierra.qcow2 64G
Formatting ‘sierra.qcow2’, fmt=qcow2 size=68719476736 encryption=off cluster_size=65536 lazy_refcounts=off refcount_bits=16

参考仓库里面的 boot.shboot-macOS.sh,整理了如下的命令用于首次启动虚拟机:

kvm-spice -enable-kvm -m 4096 -cpu core2duo,kvm=off \
-machine pc-q35-2.4 \
-smp 4,cores=2 \
-usb -device usb-kbd -device usb-mouse \
-device isa-applesmc,osk=”ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc” \
-kernel ./enoch_rev2839_boot \
-smbios type=2 \
-device ide-drive,bus=ide.2,drive=MacHDD \
-drive id=MacHDD,if=none,file=./sierra.qcow2 \
-vnc 0.0.0.0:0 -k en-us \
-netdev tap,id=net0,ifname=tap0,script=no,downscript=no -device e1000-82545em,netdev=net0,id=net0,mac=52:54:00:c9:18:27 \
-device ide-drive,bus=ide.0,drive=MacDVD \
-drive id=MacDVD,if=none,snapshot=on,file=’/path/to/iso/Install_OS_X_10.11.6_El_Capitan.iso’

注意:这里我使用了 OS X El Capitan 的安装镜像,因为直接使用 macOS Sierra 无法调出「磁盘工具」,就算在「语言选择」界面等了多久都无法正常操作。所以最终选择了一个折中的办法,用老版本的镜像启动来初始化硬盘,然后再用新版本的镜像来安装系统。

OS X El Capitan 安装光盘的制作方法与 macOS Sierra 类似,请参考「创建 ISO 镜像」部分。

初始化磁盘

执行过上述命令后,命令行会一直处于等待状态,这个时候我们需要使用 VNC 远程桌面来完成剩下的操作。

注意:系统自带的 VNC 客户端还有 RealVNC Viewer 都无法正常访问没有密码保护的远程桌面。只有 TigerVNC 才能正常访问,这里也浪费了不少的时间。

正常连接后,可以看到 El Capitan 的欢迎界面:

接着像正常安装一样,开启「磁盘工具」,初始化磁盘:

这样,初始化磁盘的工作就完成了。

准备启动文件

其实,虽然是虚拟化 macOS,其实本质上还是运行一个 Hackintosh (黑苹果)。所以,必要的启动文件配置还是需要的。

好在在制作光盘镜像的时候,一些需要的文件就已经被打包在 ISO 光盘镜像里面了。

我们只需要打开 Terminal 把需要的文件复制到刚才初始化过的磁盘里面就可以了。

# cp -avP /Extra /Volumes/Macintosh/

然后我们就可以把虚拟机关闭了。

安装 macOS Sierra

虚拟机关闭以后,我们换一个命令来执行刚才的启动步骤:

kvm-spice -enable-kvm -m 4092 -cpu Penryn,kvm=off,vendor=GenuineIntel \
-machine pc-q35-2.4 \
-smp 4,cores=2 \
-usb -device usb-kbd -device usb-mouse \
-device isa-applesmc,osk=”ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc” \
-kernel ./enoch_rev2839_boot \
-smbios type=2 \
-vnc 0.0.0.0:0 -k en-us \
-device ide-drive,bus=ide.2,drive=MacHDD \
-drive id=MacHDD,if=none,file=./sierra.qcow2 \
-netdev tap,id=net0,ifname=tap0,script=no,downscript=no -device e1000-82545em,netdev=net0,id=net0,mac=52:54:00:c9:18:27 \
-device ide-drive,bus=ide.0,drive=MacDVD \
-drive id=MacDVD,if=none,snapshot=on,file=’/path/to/iso/Install_macOS_Sierra_(OS_X_10.12.2).iso’

其实跟第一次启动虚拟机没有太多的不同,主要的变化是 CPU 的配置还有安装镜像不一样而已。

安装完成以后提示 Restart 到这里基本的安装就算完成了,我们需要关闭虚拟主机,然后再进行下一步。

用 Virsh 配置虚拟主机

参考 libvirt-macOS.xml 生成了如下的 XML 配置文件:

<domain type=’kvm’ xmlns:qemu=’http://libvirt.org/schemas/domain/qemu/1.0′>
<name>sierra</name>
<description># echo 1 &gt; /sys/module/kvm/parameters/ignore_msrs</description>
<memory unit=’KiB’>4194304</memory>
<currentMemory unit=’KiB’>4194304</currentMemory>
<vcpu placement=’static’>2</vcpu>
<os>
<type arch=’x86_64′ machine=’pc-q35-2.4′>hvm</type>
<kernel>/path/to/kvm/enoch_rev2839_boot</kernel>
</os>
<features>
<acpi/>
<kvm>
<hidden state=’on’/>
</kvm>
</features>
<cpu mode=’custom’ match=’exact’>
<model fallback=’allow’>Penryn</model>
</cpu>
<devices>
<emulator>/usr/bin/kvm-spice</emulator>
<disk type=’file’ device=’disk’>
<driver name=’qemu’ type=’qcow2’/>
<source file=’/path/to/kvm/sierra.qcow2’/>
<target dev=’sda’ bus=’sata’/>
<boot order=’1’/>
<address type=’drive’ controller=’0′ bus=’0′ target=’0′ unit=’0’/>
</disk>
<interface type=’bridge’>
<source bridge=’br0’/>
<model type=’e1000-82545em’/>
<address type=’pci’ domain=’0x0000′ bus=’0x00′ slot=’0x03′ function=’0x0’/>
</interface>
<input type=’mouse’ bus=’usb’/>
<input type=’keyboard’ bus=’usb’/>
<graphics type=’vnc’ port=’5911′ autoport=’no’/>
<video>
<model type=’vmvga’ vram=’16384′ heads=’1’/>
<address type=’pci’ domain=’0x0000′ bus=’0x00′ slot=’0x02′ function=’0x0’/>
</video>
<memballoon model=’none’/>
</devices>
<qemu:commandline>
<qemu:arg value=’-device’/>
<qemu:arg value=’isa-applesmc,osk=ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc’/>
<qemu:arg value=’-smbios’/>
<qemu:arg value=’type=2’/>
<qemu:arg value=’-k’/>
<qemu:arg value=’en-us’/>
<qemu:arg value=’-cpu’/>
<qemu:arg value=’Penryn,vendor=GenuineIntel’/>
</qemu:commandline>
</domain>

上面这个是配置文件,比如保存为 sierra.xml,然后用 virsh 注册一个新的虚拟机:

$ virsh define sierra.xml
Domain sierra defined from sierra.xml

$ virsh start sierra
Domain sierra started

$ virsh list
Id Name State
—————————————————-
1 sierra running

接下来,用老方法映射一个本地端口来 VNC:

ssh -L 5911:127.0.0.1:5911 server

重新启动以后的效果如下图:

最后,我们再把虚拟机设置为开启自动启动:

$ virsh autostart sierra
Domain sierra marked as autostarted

设置好远程桌面和远程登录以后,就再也不用使用 VNC 了,完美!收工!

  • 2
    点赞
  • 5
    收藏
  • 打赏
    打赏
  • 0
    评论
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 一个完整的Docker有以下几个部分组成: DockerClient客户端 Docker Daemon守护进程 Docker Image镜像 DockerContainer容器 [2] 起源 Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。 Docker自2013年以来非常火热,无论是从 github 上的代码活跃度,还是Redhat在RHEL6.5集成对Docker的支持, 就连 Google 的 Compute Engine 也支持 docker 在其之上运行。 一款开源软件能否在商业上成功,很大程度上依赖三件事 - 成功的 user case(用例), 活跃的社区和一个好故事。 dotCloud 之家的 PaaS 产品建立在docker之上,长期维护且有大量的用户,社区也十分活跃,接下来我们看看docker的故事。 环境管理复杂 - 从各种OS到各种间件到各种app, 一款产品能够成功作为开发者需要关心的东西太多,且难于管理,这个问题几乎在所有现代IT相关行业都需要面对。 云计算时代的到来 - AWS的成功, 引导开发者将应用转移到 cloud 上, 解决了硬件管理的问题,然而间件相关的问题依然存在 (所以openstack HEAT和 AWS cloudformation 都着力解决这个问题)。开发者思路变化提供了可能性。 虚拟化手段的变化 - cloud 时代采用标配硬件来降低成本,采用虚拟化手段来满足用户按需使用的需求以及保证可用性和隔离性。然而无论是KVM还是Xen在 docker 看来,都在浪费资源,因为用户需要的是高效运行环境而非OS, GuestOS既浪费资源又难于管理, 更加轻量级的LXC更加灵活和快速 LXC的移动性 - LXC在 linux 2.6 的 kernel 里就已经存在了,但是其设计之初并非为云计算考虑的,缺少标准化的描述手段和容器的可迁移性,决定其构建出的环境难于迁移和标准化管理(相对于KVM之类image和snapshot的概念)。docker 就在这个问题上做出实质性的革新。这是docker最独特的地方。 VM技术和容器技术对比 VM技术和容器技术对比 面对上述几个问题,docker设想是交付运行环境如同海运,OS如同一个货轮,每一个在OS基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。这样,交付一个软件,就是一系列标准化组件的集合的交付,如同乐高积木,用户只需要选择合适的积木组合,并且在最顶端署上自己的名字(最后一个标准化组件是用户的app)。这也就是基于docker的PaaS产品的原型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论

打赏作者

夜色black

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值