发现一个小玩具,分享一下。

可以快速的用Docker run一个MacOS系统,简单的的体验一下MacOS或者用来与CI集成都不错。

安装Docker

sudo pacman -S docker

安装基础工具

sudo pacman -S qemu libvirt dnsmasq virt-manager bridge-utils flex bison iptables-nft edk2-ovmf

启动相关服务

sudo systemctl enable --now libvirtd
sudo systemctl enable --now virtlogd

加载内核模块

echo 1 | sudo tee /sys/module/kvm/parameters/ignore_msrs

sudo modprobe kvm

设置用户权限

sudo usermod -aG docker "${USER}"
sudo usermod -aG libvirt "${USER}"
sudo usermod -aG kvm "${USER}"

到这里注销重新登录X,或者干脆重启一下吧。

启动Docker

sudo systemctl start docker

设置XServer权限

xhost +

拉取Docker镜像

# 打算运行monterey版本的Mac OS,因此这里拉取monterey镜像
docker pull sickcodes/docker-osx:monterey

# 这是一个壳镜像,初始化完毕后我们将使用这个镜像来真正的run系统
docker pull sickcodes/docker-osx:naked

让我们直接把Mac OS跑起来

docker run -it \
    --device /dev/kvm \
    -p 50922:10022 \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e "DISPLAY=${DISPLAY:-:0.0}" \
    sickcodes/docker-osx:monterey

如果一切顺利,就会看到下面这个启动窗口了:
启动窗口

用方向键选择引导项,回车进入Mac OS的安装过程:
选择引导项

先选择分区工具,对硬盘进行格式化:
选择分区工具

此时可以看到三块硬盘,我们选择容量最大的那块,选中后点击“Erase”进行格式化:
硬盘列表

源项目建议我们使用非APFS格式的硬盘,我们听人劝:
格式化

硬盘格式化完毕后,我们退出分区工具,选择“Reinstall mac OS Monterery”
选择安装系统

之后选择刚才格式化好的那块硬盘作为系统盘,并开始安装系统:
选择系统盘

接下来开始初始化系统盘,可能需要蛮长的时间,趁这个时候起来喝点开水活动一下吧。
等待初始化系统盘

直到系统自动重启后再次回到这个引导界面,我们直接退出安装过程:
退出安装过程

当然,安装过程还未结束。不过,为了后续能够复用硬盘,我们先把刚才初始化好的系统盘复制出来。

# 查找系统盘镜像文件
sudo find /var/lib/docker -size +10G | grep mac_hdd_ng.img
# 找到之后将其复制到任意你期望的目录 
mkdir ~/macos
sudo cp /var/lib/docker/xxxxxxx/mac_hdd_ng.img  ~/macos/

复制系统盘

然后,我们继续安装过程:

docker run -it --rm \
    --device /dev/kvm \
    -p 50922:10022 \
    -v "${HOME}/macos/mac_hdd_ng.img:/image" \ # 这里替换成你自己的路径
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e "DISPLAY=${DISPLAY:-:0.0}" \
    -e "NOPICKER=true" \
    sickcodes/docker-osx:naked

整个过程会重启很多次,直到需要你手动输入一些信息。

安装完毕后就可以开始使用。

不过等你关机后容器会被自动删除,因为上面的命令我添加了--rm参数。

不过别担心,只要这个mac_hdd_ng.img硬盘镜像文件还在,系统就还在。

为了方便下次继续使用,写一个小小的脚本来方便启动:

touch ~/macos.sh
chmod +x ~/macos.sh
vim ~/macos.sh

输入下述内容:

sudo systemctl start docker # 如果已经将Docker设置为开机启动,可以省略这行。
xhost +
docker run -it --rm \
    --device /dev/kvm \
    -p 50922:10022 \
    -v "${HOME}/macos/mac_hdd_ng.img:/image" \ # 这里替换成你自己的路径
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e "DISPLAY=${DISPLAY:-:0.0}" \
    -e "NOPICKER=true" \
    -e "RAM"=half \ # 内存也可以自己调整
    sickcodes/docker-osx:naked

好了,结束。

我个人感觉还是蛮卡的,不知道直通显卡后会不会好一些。

不过可以以无界面的方式运行,用于CI或者远程开发还是非常方便的。

相关开源项目:
https://github.com/sickcodes/Docker-OSX
https://github.com/kholia/OSX-KVM