发现一个小玩具,分享一下。
可以快速的用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