或者通过 Linkedin 联系(如果它是私人的):https://www.linkedin.com/in/sickcodes
或通过 https://sick.codes/contact/
该项目由 Sick.Codes 维护。 (叽叽喳喳)
其他积分可以在这里找到:https://github.com/sickcodes/Docker-OSX/blob/master/CREDITS.md
此外,所有贡献者的完整列表可以在这里找到:https://github.com/sickcodes/Docker-OSX/graphs/contributors
非常感谢 @kholia 维护上游项目,Docker-OSX 构建在 OSX-KVM 之上。
还要特别感谢 @thenickdude,他维护了由 @Leoyzen 发起的有价值的 KVM-OpenCore 分支!
特别感谢 OpenCore 团队:https://github.com/acidanthera/OpenCorePkg。他们维护良好的引导加载程序提供了 Docker-OSX 用户喜欢的许多强大功能:)
如果您喜欢这个项目,请考虑在这里或上游做出贡献!
视频设置教程也可以在这里找到:https://www.youtube.com/watch?v=wLezYl77Ll8
Windows 用户:点击此处查看下面的注释!
第一次来这里?尝试初始设置,否则尝试按照以下说明使用 Catalina 或 Big Sur。
发布名称及其版本:
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e SHORTNAME=catalina
sickcodes/docker-osx:latest
# docker build -t docker-osx .
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e SHORTNAME=big-sur
sickcodes/docker-osx:latest
# docker build -t docker-osx .
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e GENERATE_UNIQUE=true
-e MASTER_PLIST_URL= ' https://raw.githubusercontent.com/sickcodes/osx-serial-generator/master/config-custom.plist '
-e SHORTNAME=monterey
sickcodes/docker-osx:latest
# docker build -t docker-osx .
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e GENERATE_UNIQUE=true
-e MASTER_PLIST_URL= ' https://raw.githubusercontent.com/sickcodes/osx-serial-generator/master/config-custom.plist '
-e SHORTNAME=ventura
sickcodes/docker-osx:latest
# docker build -t docker-osx .
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e GENERATE_UNIQUE=true
-e CPU= ' Haswell-noTSX '
-e CPUID_FLAGS= ' kvm=on,vendor=GenuineIntel,+invtsc,vmware-cpuid-freq=on '
-e MASTER_PLIST_URL= ' https://raw.githubusercontent.com/sickcodes/osx-serial-generator/master/config-custom-sonoma.plist '
-e SHORTNAME=sonoma
sickcodes/docker-osx:latest
# docker build -t docker-osx .
# 40GB disk space required: 20GB original image 20GB your container.
docker pull sickcodes/docker-osx:auto
# boot directly into a real OS X shell with a visual display [NOT HEADLESS]
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e GENERATE_UNIQUE=true
sickcodes/docker-osx:auto
# username is user
# password is alpine
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e SHORTNAME=high-sierra
sickcodes/docker-osx:latest
# docker build -t docker-osx .
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e SHORTNAME=mojave
sickcodes/docker-osx:latest
# docker build -t docker-osx .
这是下载容器的特别好方法,以防 Docker 的 CDN(或您的连接)速度很慢。
wget https://images2.sick.codes/mac_hdd_ng_auto.img
docker run -it
--device /dev/kvm
-p 50922:10022
-v " ${PWD} /mac_hdd_ng_auto.img:/image "
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e GENERATE_UNIQUE=true
-e MASTER_PLIST_URL=https://raw.githubusercontent.com/sickcodes/Docker-OSX/master/custom/config-nopicker-custom.plist
-e SHORTNAME=catalina
sickcodes/docker-osx:naked
首先在来宾内部的网络共享中启用 SSH。将-e "USERNAME=user"
和-e "PASSWORD=password"
更改为您的凭据。容器会将自身添加到~/.ssh/authorized_keys
由于看不到屏幕,请使用带 nopicker 的 PLIST,例如:
# Catalina
# wget https://images2.sick.codes/mac_hdd_ng_auto.img
# Monterey
wget https://images.sick.codes/mac_hdd_ng_auto_monterey.img
docker run -it
--device /dev/kvm
-p 50922:10022
-v " ${PWD} /mac_hdd_ng_auto_monterey.img:/image "
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e " USERNAME=user "
-e " PASSWORD=alpine "
-e GENERATE_UNIQUE=true
-e MASTER_PLIST_URL=https://raw.githubusercontent.com/sickcodes/Docker-OSX/master/custom/config-nopicker-custom.plist
-e SHORTNAME=monterey
sickcodes/docker-osx:naked-auto
最简单、最安全的方法是sshfs
# on Linux/Windows
mkdir ~ /mnt/osx
sshfs user@localhost:/ -p 50922 ~ /mnt/osx
# wait a few seconds, and ~/mnt/osx will have full rootfs mounted over ssh, and in userspace
# automated: sshpass -p <password> sshfs user@localhost:/ -p 50922 ~/mnt/osx
如果您有笔记本电脑,请参阅下一个 usbfluxd 部分。
如果您有台式电脑,可以使用@Silfalion的说明:https://github.com/Silfalion/Iphone_docker_osx_passthrough
usbfluxd 的视频设置教程也可以在这里找到:https://www.youtube.com/watch?v=kTk5fGjK_PM
此方法适用于笔记本电脑、PC 或任何设备!
感谢 @nikias 通过 https://github.com/corellium 提供的 usbfluxd!
这是在 Linux 内部完成的。
在Linux上打开3个终端
在 Linux 上通过 USB 连接设备允许您使用 https://github.com/corellium/usbfluxd 将端口5000
上的usbmuxd
公开到同一网络上的另一个系统。
确保已安装usbmuxd
、 socat
和usbfluxd
。
sudo pacman -S libusbmuxd usbmuxd avahi socat
在 AUR 上可用:https://aur.archlinux.org/packages/usbfluxd/
yay usbfluxd
插入您的 iPhone 或 iPad。
1 号航站楼
sudo systemctl start usbmuxd
sudo avahi-daemon
2 号航站楼:
# on host
sudo systemctl restart usbmuxd
sudo socat tcp-listen:5000,fork unix-connect:/var/run/usbmuxd
3 号航站楼:
sudo usbfluxd -f -n
这是在 macOS 内部完成的。
安装自制软件。
172.17.0.1
通常是 Docker 桥接 IP,即您的 PC,但您可以使用ip addr
中的任何 IP ...
macOS 终端:
# on the guest
brew install make automake autoconf libtool pkg-config gcc libimobiledevice usbmuxd
git clone https://github.com/corellium/usbfluxd.git
cd usbfluxd
./autogen.sh
make
sudo make install
接受 USB over TCP 连接,并显示为本地:
(您可能需要将172.17.0.1
更改为主机的 IP 地址。例如检查ip addr
)
# on the guest
sudo launchctl start usbmuxd
export PATH=/usr/local/sbin: ${PATH}
sudo usbfluxd -f -r 172.17.0.1:5000
关闭 Xcode 等应用程序并重新打开它们,您的设备应该会出现!
如果您需要在 Linux 上重新启动,请擦除当前的 usbfluxd、usbmuxd 和 socat:
sudo killall usbfluxd
sudo systemctl restart usbmuxd
sudo killall socat
请参阅 https://github.com/sickcodes/osx-optimizer 中的命令!
按照下面的教程移动 /var/lib/docker
教程在这里:https://sick.codes/how-to-run-docker-from-block-storage/
仅当您愿意擦除所有当前的 Docker 映像/层时,才应遵循上述教程。
安全模式:暂时禁用 docker,以便您可以暂时移动 Docker 文件夹。
killall dockerd
systemctl disable --now docker
systemctl disable --now docker.socket
systemctl stop docker
systemctl stop docker.socket
现在,Docker 守护进程已关闭,将 /var/lib/docker 移至某处
然后,在某处符号链接 /var/lib/docker :
mv /var/lib/docker /run/media/user/some_drive/docker
ln -s /run/media/user/some_drive/docker /var/lib/docker
# now check if /var/lib/docker is working still
ls /var/lib/docker
如果您看到文件夹,则说明它有效。您可以重新启动 Docker,或者如果您想确定的话,只需重新启动即可。
2021-11-14 - 添加了 High Sierra、莫哈韦
在构建时选择其中之一,与使用 docker pull 时无关:
--build-arg SHORTNAME=high-sierra
--build-arg SHORTNAME=mojave
--build-arg SHORTNAME=catalina
--build-arg SHORTNAME=big-sur
--build-arg SHORTNAME=monterey
--build-arg SHORTNAME=ventura
--build-arg SHORTNAME=sonoma
目前有多个图像,每个图像都有不同的用例(如下所述):
高山脉:
莫哈韦:
卡塔利娜:
大苏尔:
蒙特利打造您自己的形象:
文图拉制作您自己的形象:
索诺玛制作自己的形象:
Sick.Codes 预制的Catalina系统:用户名: user
,密码: alpine
裸露:自带图像设置(首先使用上述任何一项):
Naked Auto:与上面相同,但带有-e USERNAME
& -e PASSWORD
和-e OSX_COMMANDS="put your commands here"
localhost:50922
)localhost:8888
)docker commit
克隆容器:auto
至少 50 GB(一半用于基础映像,一半用于运行时映像为了方便起见,基于此存储库内容构建的映像也可以在Docker Hub上使用:https://hub.docker.com/r/sickcodes/docker-osx
可用 Docker 镜像及其预期用途的完整列表可以在说明中找到。
Docker-OSX 支持 Kubernetes。
Kubernetes Helm Chart & Documentation 可以在 helm 目录下找到。
感谢 cephasara 做出的这一重大贡献。
如果您在运行 Docker-OSX 时遇到小问题或有任何疑问,请随时提出问题。
但是,在打开问题之前,请检查已关闭的问题并确认您正在使用此存储库的最新版本 - 您的问题可能已经得到解决!您可能还会在下面的问题与解答部分中看到您的答案。
关注@sickcodes!
对于更复杂的工作,我们提供以下支持服务:
如果您有兴趣,请联系 Twitter 上的@sickcodes 或单击此处。
Docker-OSX 根据 GPL v3+ 获得许可。欢迎并非常感谢您的贡献。事实上,您可以使用 Docker-OSX 作为创建专有软件的工具。
如果您认真对待 Apple 安全性,并且可能在 Apple Bug 赏金计划中找到 6 位数的 Bug 赏金,那么您来对地方了!进一步说明:Hackintosh、OSX-KVM 或 Docker-OSX 合法吗?
本项目中提及的产品名称、徽标、品牌和其他商标均为其各自商标持有者的财产。这些商标持有者不以任何身份隶属于我们的存储库。他们不以任何方式赞助或认可该项目。
有多种不同的 Docker-OSX 映像可供使用,适用于不同的目的。
sickcodes/docker-osx:latest
- 我只是想尝试一下。sickcodes/docker-osx:latest
- 我想使用 Docker-OSX 在 Xcode 中开发/保护应用程序(登录 Xcode、Transporter)sickcodes/docker-osx:naked
- 我想将 Docker-OSX 用于 CI/CD 相关目的(登录 Xcode、Transporter)使用:latest
或big-sur
创建您的个人形象。然后,将图像从图像中拉出。之后,您将能够复制该图像并将其导入到:naked
容器中,以便反复将容器恢复到之前的状态。
sickcodes/docker-osx:auto
- 我只对使用命令行感兴趣(对于编译软件或无头使用 Homebrew 很有用)。
sickcodes/docker-osx:naked
- 我需要 iMessage/iCloud 进行安全研究。
sickcodes/docker-osx:big-sur
- 我想运行 Big Sur。
sickcodes/docker-osx:monterey
- 我想运行蒙特雷。
sickcodes/docker-osx:ventura
- 我想运行 Ventura。
sickcodes/docker-osx:sonoma
- 我想运行 Sonoma。
sickcodes/docker-osx:high-sierra
- 我想运行 High Sierra。
sickcodes/docker-osx:mojave
- 我想运行 Mojave。
在执行其他操作之前,您需要在 BIOS 中打开硬件虚拟化。具体如何取决于您的特定机器(和 BIOS),但它应该很简单。
然后,您需要 QEMU 和主机上的一些其他依赖项:
# ARCH
sudo pacman -S qemu libvirt dnsmasq virt-manager bridge-utils flex bison iptables-nft edk2-ovmf
# UBUNTU DEBIAN
sudo apt install qemu qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virt-manager libguestfs-tools
# CENTOS RHEL FEDORA
sudo yum install libvirt qemu-kvm
然后,启用 libvirt 并加载 KVM 内核模块:
sudo systemctl enable --now libvirtd
sudo systemctl enable --now virtlogd
echo 1 | sudo tee /sys/module/kvm/parameters/ignore_msrs
sudo modprobe kvm
使用 WSL2(Windows 11 + Windows Subsystem for Linux)可以在 Windows 上运行 Docker-OSX。
您必须安装版本 22000+(21H2 或更高版本)的 Windows 11。
首先,通过在管理员 powershell 中运行此命令来在计算机上安装 WSL。欲了解更多信息,请查看此处。
这将默认安装 Ubuntu。
wsl --install
您可以在 PowerShell 中使用wsl -l -v
确认 WSL2 已启用。要查看可用的其他发行版,请使用wsl -l -o
。
如果您之前安装了 WSL1,请升级到 WSL 2。检查此链接以从 WSL1 升级到 WSL2。
WSL 安装后,转到C:/Users/<Your_Name>/.wslconfig
并将nestedVirtualization=true
添加到文件末尾(如果该文件不存在,请创建它)。有关.wslconfig
文件的更多信息,请查看此链接。验证您是否在文件资源管理器选项中选择了“显示隐藏文件”和“显示文件扩展名”。结果应该是这样的:
[wsl2]
nestedVirtualization=true
进入您的 WSL 发行版(在 powershell 中运行wsl
)并使用kvm-ok
命令检查是否启用了 KVM。输出应如下所示:
INFO: /dev/kvm exists
KVM acceleration can be used
如果没有安装,请使用命令sudo apt -y install bridge-utils cpu-checker libvirt-clients libvirt-daemon qemu qemu-kvm
进行安装。
如果尚未安装,请立即下载并安装适用于 Windows 的 Docker。
安装后,进入设置并选中这两个框:
General -> "Use the WSL2 based engine";
Resources -> WSL Integration -> "Enable integration with my default WSL distro",
确保x11-apps
已安装。如果没有安装,请使用命令sudo apt install x11-apps -y
进行安装。
最后,获得视频输出有3种方式:
要使用 WSLg 的内置 X-11 服务器,请更改 docker run 命令中的这两行以将 Docker-OSX 指向 WSLg。
-e "DISPLAY=${DISPLAY:-:0.0}"
-v /mnt/wslg/.X11-unix:/tmp/.X11-unix
或者尝试:
-e "DISPLAY=${DISPLAY:-:0}"
-v /mnt/wslg/.X11-unix:/tmp/.X11-unix
对于 Windows 上的 Ubuntu 20.x,请参阅#458
启动 macOS 基本系统(按 Enter 键)
单击Disk Utility
擦除最大的磁盘(默认大约 200GB),不要修改较小的磁盘。 -- 如果您无法点击erase
,您可能需要将磁盘大小减少1kb
(可选)如果您想限制容量,请使用未使用的空间创建一个分区来容纳操作系统和文件。 (对于 Xcode 12 分区至少 60GB。)
单击Reinstall macOS
安装过程中系统可能需要多次重新启动
如果您在使用时遇到困难,特别是如果您还不太熟悉 Docker,那么这是一个很好的起点。
只是想快速制作一个容器吗?查看我们的容器创建示例部分。
更具体/高级的故障排除问题和答案可以在更多问题和解答中找到。您还应该检查已关闭的问题。即使您在本文档中找不到,其他人也可能已经得到了与您类似的问题的答案!
请参阅初始设置。
docker: unknown server OS: .
See 'docker run --help'.
这意味着您的 docker 守护进程没有运行。
pgrep dockerd
不应返回任何内容
因此,您有几个选择。
sudo dockerd
用于前台 Docker 使用。我用这个。
或者
sudo systemctl --start dockerd
现在启动 dockerd 。
或者
sudo systemctl --enable --now dockerd
用于在每次重新启动时启动 dockerd,现在。
示例:
-e EXTRA='-smp 6,sockets=3,cores=2'
-e EXTRA='-smp 8,sockets=4,cores=2'
-e EXTRA='-smp 16,sockets=8,cores=2'
请注意,与内存不同,CPU 使用是共享的。这样您就可以将所有 CPU 分配给容器。
如果你使用sudo dockerd
或者 dockerd 由 systemd/systemctl 控制,那么你必须在 Docker 组中。如果您不在 Docker 组中:
sudo usermod -aG docker " ${USER} "
如果需要,还可以将自己添加到 kvm 和 libvirt 组中:
sudo usermod -aG libvirt " ${USER} "
sudo usermod -aG kvm " ${USER} "
另请参阅:初始设置。
# run ad hoc
sudo dockerd
# or daemonize it
sudo nohup dockerd &
# enable it in systemd (it will persist across reboots this way)
sudo systemctl enable --now docker
# or just start it as your user with systemd instead of enabling it
systemctl start docker
非常感谢我们的贡献者,到目前为止,他们已经解决了几乎所有可以想到的问题!
https://github.com/sickcodes/Docker-OSX/blob/master/CREDITS.md
使用docker run
创建了一个容器,并想稍后再次重用底层镜像?
注意:首先请参阅容器创建示例,了解如何达到适用的程度。
这是当您想稍后再次运行相同的容器时使用的。您可能需要使用docker commit
来保存容器,然后才能重新使用它。检查您的容器是否已使用docker ps --all
进行持久化。
如果你不运行这个,你每次都会有一个新的图像。
# look at your recent containers and copy the CONTAINER ID
docker ps --all
# docker start the container ID
docker start -ai abc123xyz567
# if you have many containers, you can try automate it with filters like this
# docker ps --all --filter "ancestor=sickcodes/docker-osx"
# for locally tagged/built containers
# docker ps --all --filter "ancestor=docker-osx"
您还可以将.img
文件从存储在/var/lib/docker
容器中拉出,并将其作为运行时参数提供给:naked
Docker 映像。
另请参阅:此处。
使用sickcodes/docker-osx:auto
的容器可以在启动时停止。
# find last container
docker ps -a
# docker start old container with -i for interactive, -a for attach STDIN/STDOUT
docker start -ai -i < Replace this with your ID >
如果您尚未完成硬件虚拟化的所有设置,您可能会看到一个或多个与 libgtk 相关的错误。如果您还没有这样做,请查看初始设置部分和例行检查部分,因为您可能错过了设置步骤,或者可能没有准备好所有所需的 Docker 依赖项。
另请参阅:此处。
如果您尚未设置 xhost,请尝试以下操作:
echo $DISPLAY
# ARCH
sudo pacman -S xorg-xhost
# UBUNTU DEBIAN
sudo apt install x11-xserver-utils
# CENTOS RHEL FEDORA
sudo yum install xorg-x11-server-utils
# then run
xhost +
您分配的 RAM 不能多于您的机器的内存。默认值为 3 GB: -e RAM=3
。
如果您尝试为容器分配比当前可用的 RAM 更多的 RAM,则可能会看到类似以下错误: cannot set up guest memory 'pc.ram': Cannot allocate memory
。另请参阅:这里,这里。
例如(如下) buff/cache
已经包含 20 GB 的已分配 RAM:
[user@hostname ~] $ free -mh
total used free shared buff/cache available
Mem: 30Gi 3.5Gi 7.0Gi 728Mi 20Gi 26Gi
Swap: 11Gi 0B 11Gi
清除缓冲区和缓存:
sudo tee /proc/sys/vm/drop_caches <<< 3
现在再次检查 RAM:
[user@hostname ~] $ free -mh
total used free shared buff/cache available
Mem: 30Gi 3.3Gi 26Gi 697Mi 1.5Gi 26Gi
Swap: 11Gi 0B 11Gi
注意:AppleALC、 alcid
和 VoodooHDA-OC 不支持编解码器。但是,IORegistryExplorer 确实显示控制器组件正在工作。
docker run
--device /dev/kvm
-e AUDIO_DRIVER=pa,server=unix:/tmp/pulseaudio.socket
-v " /run/user/ $( id -u ) /pulse/native:/tmp/pulseaudio.socket "
-v /tmp/.X11-unix:/tmp/.X11-unix
sickcodes/docker-osx
docker run
--device /dev/kvm
-e AUDIO_DRIVER=pa,server=unix:/tmp/pulseaudio.socket
-v " /run/user/ $( id -u ) /pulse/native:/tmp/pulseaudio.socket "
-v /tmp/.X11-unix:/tmp/.X11-unix
-e PULSE_SERVER=unix:/tmp/pulseaudio.socket
sickcodes/docker-osx pactl list
docker run
--device /dev/kvm
-e AUDIO_DRIVER=pa,server=unix:/tmp/pulseaudio.socket
-v /mnt/wslg/runtime-dir/pulse/native:/tmp/pulseaudio.socket
-v /mnt/wslg/.X11-unix:/tmp/.X11-unix
sickcodes/docker-osx
可以根据您的需要转发其他端口。在此示例中,我们将使用 Mac OSX 来托管 nginx:
host:10023 <-> 10023:container:10023 <-> 80:guest
在主机上,运行:
docker run -it
--device /dev/kvm
-p 50922:10022
-e ADDITIONAL_PORTS= ' hostfwd=tcp::10023-:80, '
-p 10023:10023
sickcodes/docker-osx:auto
在运行容器的终端会话中,运行:
/bin/bash -c " $( curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh ) "
brew install nginx
sudo sed -i -e ' s/8080/80/ ' /usr/local/etc/nginx/nginx.confcd
# sudo nginx -s stop
sudo nginx
现在应该可以通过端口 10023 访问 nginx。
此外,您可以将多个语句串在一起,例如:
-e ADDITIONAL_PORTS= ' hostfwd=tcp::10023-:80,hostfwd=tcp::10043-:443, '
-p 10023:10023
-p 10043:10043
您可能不需要使用默认设置执行任何操作即可从容器内部启用互联网连接。此外,即使ping
不起作用, curl
也可能起作用。
请参阅此处、此处和此处的讨论。
本地安装不需要这样做。
另外请注意,即使您在容器中使用 VPN,它也可能会导致主机泄露您的 IP。
但是,如果您尝试远程连接到 Docker-OSX 实例(例如数据中心托管的 Docker-OSX 实例),这可能会提高您的性能:
# enable for current session
sudo sysctl -w net.ipv4.ip_forward=1
# OR
# sudo tee /proc/sys/net/ipv4/ip_forward <<< 1
# enable permanently
sudo touch /etc/sysctl.conf
sudo tee -a /etc/sysctl.conf << EOF
net.ipv4.ip_forward = 1
EOF
# or edit manually with the editor of your choice
nano /etc/sysctl.conf || vi /etc/sysctl.conf || vim /etc/sysctl.conf
# now reboot
与访客共享文件夹非常简单。
您的文件夹将转到 Arch 容器内的 /mnt/hostshare,然后通过 QEMU 传递。
然后从 mac 内部使用sudo -S mount_9p hostshare
进行安装。
例如,
FOLDER= ~ /somefolder
-v " ${FOLDER} :/mnt/hostshare "
-e EXTRA= " -virtfs local,path=/mnt/hostshare,mount_tag=hostshare,security_model=passthrough,id=hostshare "
完整示例:
# stat mac_hdd_ng.img
SHARE= ~ /somefolder
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-v " ${PWD} /mac_hdd_ng.img:/home/arch/OSX-KVM/mac_hdd_ng.img "
-v " ${SHARE} :/mnt/hostshare "
-e EXTRA= " -virtfs local,path=/mnt/hostshare,mount_tag=hostshare,security_model=passthrough,id=hostshare "
sickcodes/docker-osx:latest
# !!! Open Terminal inside macOS and run the following command to mount the virtual file system
# sudo -S mount_9p hostshare
要使用 NFS 共享文件夹,请在主机上设置一个文件夹,例如/srv/nfs/share
,然后附加到/etc/exports
:
/srv/nfs/share 127.0.0.1/0(insecure,rw,all_squash,anonuid=1000,anongid=985,no_subtree_check)
您现在可能需要重新加载导出,这将开始共享该目录。
# reload shared folders
sudo exportfs -arv
来源及解释
为anonuid
和anongid
授予共享文件夹的权限,其中anonuid
和anongid
与您的 Linux 用户的相匹配; id -u
id -u ; id -g
将打印userid:groupid
chown 1000:985 /srv/nfs/share
chmod u+rwx /srv/nfs/share
使用附加标志--network host
启动 Docker-OSX 容器
从 mac 终端创建并挂载 nfs 文件夹:
mkdir -p ~/mnt
sudo mount_nfs -o locallocks 10.0.2.2:/srv/nfs/share ~/mnt
启动你的容器。
选择一个端口,例如7700
。
lsusb
获取vid:pid
在 Linux 上: sudo usbredirserver -p 7700 1e3d:2096
现在,在 Docker 窗口中按 Enter 键即可看到(qemu)
控制台。
即使机器已启动,您也可以使用如下命令添加/删除磁盘:
chardev-add socket,id=usbredirchardev1,port=7700,host=172.17.0.1
device_add usb-redir,chardev=usbredirchardev1,id=usbredirdev1,debug=4
PORT=7700
IP_ADDRESS=172.17.0.1
-e EXTRA= " -chardev socket,id=usbredirchardev1,port= ${PORT} ,host= ${IP_ADDRESS} -device usb-redir,chardev=usbredirchardev1,id=usbredirdev1,debug=4 " `
Fedora 的默认防火墙设置可能会阻止 Docker 的网络接口访问互联网。为了解决此问题,您需要将防火墙中的接口列入白名单:
# Set the docker0 bridge to the trusted zone
sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0
sudo firewall-cmd --reload
检查您的机器是否启用了硬件虚拟化:
sudo tee /sys/module/kvm/parameters/ignore_msrs <<< 1
egrep -c ' (svm|vmx) ' /proc/cpuinfo
-e NETWORKING=vmxnet3
-e NETWORKING=e1000-82545em
/
目录开始使用du -sh *
,并找到可以删除文件的大目录。例如不必要的缓存文件、Xcode 平台等。sudo trimforce enable
启用修剪,然后重新启动。dd if=/dev/zero of=./empty && rm -f empty
将磁盘上的空白空间清零docker cp stoppedcontainer:/home/arch/OSX-KVM/mac_hdd_ng.img .
qemu-img check -r all mac_hdd_ng.img
以修复任何错误。qemu-img convert -O qcow2 mac_hdd_ng.img deduped.img
并再次检查错误qemu-img convert -c -O qcow2 deduped.img compressed.img
以进一步压缩图像。虽然这可能会降低运行速度,但它的大小应该会减少大约 25%。 FROM sickcodes/docker-osx
USER arch
COPY --chown=arch ./deduped.img /home/arch/OSX-KVM/mac_hdd_ng.img
首先确保自动启动已启用
接下来,您需要将 SSH 设置为自动启动。
sudo systemsetup -setremotelogin on
确保提交新的 docker 映像并保存它,或按照减少磁盘空间部分中的描述进行重建。
然后使用这些参数运行它。
# Run with the -nographic flag, and enable a telnet interface
docker run
--device /dev/kvm
-p 50922:10022
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e EXTRA= " -monitor telnet::45454,server,nowait -nographic -serial null "
mycustomimage
如果您在本地构建 Docker-OSX,您可能需要使用 Arch Linux 的镜像。
镜像位置可以在这里找到(使用两个字母的国家代码):https://archlinux.org/mirrorlist/all/
docker build -t docker-osx:latest
--build-arg RANKMIRRORS=true
--build-arg MIRROR_COUNTRY=US
--build-arg MIRROR_COUNT=10
--build-arg SHORTNAME=catalina
--build-arg SIZE=200G .
使用方便的运行时参数提供程序选项-e EXTRA=
将任何设备/目录传递到 Docker 容器和 QEMU 参数。
# example customizations
docker run
-e RAM=4
-e SMP=4
-e CORES=4
-e EXTRA= ' -usb -device usb-host,hostbus=1,hostaddr=8 '
-e INTERNAL_SSH_PORT=23
-e MAC_ADDRESS= " $( xxd -c1 -p -l 6 /dev/urandom | tr ' n ' ' : ' | cut -c1-17 ) "
-e AUDIO_DRIVER=alsa
-e IMAGE_PATH=/image
-e SCREEN_SHARE_PORT=5900
-e DISPLAY=:0
-e NETWORKING=vmxnet3
--device /dev/kvm
--device /dev/snd
-v /tmp/.X11-unix:/tmp/.X11-unix
docker-osx:latest
在./custom
中生成序列号或让 docker 在运行时生成它们(见下文)。
在登录 iCloud 等之前随时验证您的序列号。
# this is a quick way to check your serial number via cli inside OSX
ioreg -l | grep IOPlatformSerialNumber
# test some commands
sshpass -p ' alpine ' ssh user@localhost -p 50922 ' ping google.com '
# check your serial number
sshpass -p ' alpine ' ssh user@localhost -p 50922 ' ioreg -l | grep IOPlatformSerialNumber '
# ARCH
pacman -S libguestfs
# UBUNTU DEBIAN
apt install libguestfs -y
# RHEL FEDORA CENTOS
yum install libguestfs -y
在./custom
文件夹中,您会发现4
脚本。
config-nopicker-custom.plist
opencore-image-ng.sh
这两个文件来自 OSX-KVM。
您不需要触及这两个文件。
config.plist 有 5 个值被占位符替换。单击此处无缘无故地查看这些值。
generate-unique-machine-values.sh
该脚本将生成序列号、Mac 地址、CSV/TSV 输出,以及制作bootdisk image
。您可以创建数百个./custom/generate-unique-machine-values.sh --help
./custom/generate-unique-machine-values.sh
--count 1
--tsv ./serial.tsv
--bootdisks
--output-bootdisk OpenCore.qcow2
--output-env source.env.sh
或者如果您有一些特定的序列号...
generate-specific-bootdisk.sh
generate-specific-bootdisk.sh
--model " ${DEVICE_MODEL} "
--serial " ${SERIAL} "
--board-serial " ${BOARD_SERIAL} "
--uuid " ${UUID} "
--mac-address " ${MAC_ADDRESS} "
--output-bootdisk OpenCore-nopicker.qcow2
# proof of concept only, generates random serial numbers, headlessly, and quits right after.
docker run --rm -it
--device /dev/kvm
-p 50922:10022
-e NOPICKER=true
-e GENERATE_UNIQUE=true
-e DEVICE_MODEL= " iMacPro1,1 "
sickcodes/docker-osx:auto
# -e OSX_COMMANDS='ioreg -l | grep IOPlatformSerialNumber'
# run the same as above 17gb auto image, with SSH, with nopicker, and save the bootdisk for later.
# you don't need to save the bootdisk IF you supply specific serial numbers!
docker run -it
--device /dev/kvm
-p 50922:10022
-e NOPICKER=true
-e GENERATE_SPECIFIC=true
-e DEVICE_MODEL= " iMacPro1,1 "
-e SERIAL= " C02TW0WAHX87 "
-e BOARD_SERIAL= " C027251024NJG36UE "
-e UUID= " 5CCB366D-9118-4C61-A00A-E5BAF3BED451 "
-e MAC_ADDRESS= " A8:5C:2C:9A:46:2F "
-e OSX_COMMANDS= ' ioreg -l | grep IOPlatformSerialNumber '
sickcodes/docker-osx:auto
# run an existing image in current directory, with a screen, with SSH, with nopicker.
stat mac_hdd_ng.img # make sure you have an image if you're using :naked
docker run -it
-v " ${PWD} /mac_hdd_ng.img:/image "
--device /dev/kvm
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-v /tmp/.X11-unix:/tmp/.X11-unix
-p 50922:10022
-e NOPICKER=true
-e GENERATE_SPECIFIC=true
-e DEVICE_MODEL= " iMacPro1,1 "
-e SERIAL= " C02TW0WAHX87 "
-e BOARD_SERIAL= " C027251024NJG36UE "
-e UUID= " 5CCB366D-9118-4C61-A00A-E5BAF3BED451 "
-e MAC_ADDRESS= " A8:5C:2C:9A:46:2F "
-e WIDTH=1000
-e HEIGHT=1000
sickcodes/docker-osx:naked
如果要生成序列号,请在运行时使用-e GENERATE_UNIQUE=true
或者您可以在./custom
文件夹中生成它们。然后使用:
-e GENERATE_SPECIFIC=true
-e SERIAL= " "
-e BOARD_SERIAL= " "
-e UUID= " "
-e MAC_ADDRESS= " "
stat mac_hdd_ng_testing.img
touch ./output.env
# generate fresh random serial numbers, with a screen, using your own image, and save env file with your new serial numbers for later.
docker run -it
--device /dev/kvm
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-v /tmp/.X11-unix:/tmp/.X11-unix
-p 50922:10022
-e NOPICKER=true
-e GENERATE_UNIQUE=true
-e GENERATE_SPECIFIC=true
-e DEVICE_MODEL= " iMacPro1,1 "
-v " ${PWD} /output.env:/env "
-v " ${PWD} /mac_hdd_ng_testing.img:/image "
sickcodes/docker-osx:naked
要使用 iMessage 或 iCloud,您需要更改5
值。
SERIAL
BOARD_SERIAL
UUID
MAC_ADDRESS
ROM
只是小写的 mac 地址,每个字之间没有:
。
您可以使用-e GENERATE_UNIQUE=true
告诉容器为您生成它们
或者使用-e GENERATE_SPECIFIC=true
告诉容器使用特定的
-e GENERATE_SPECIFIC=true
-e DEVICE_MODEL= " iMacPro1,1 "
-e SERIAL= " C02TW0WAHX87 "
-e BOARD_SERIAL= " C027251024NJG36UE "
-e UUID= " 5CCB366D-9118-4C61-A00A-E5BAF3BED451 "
-e MAC_ADDRESS= " A8:5C:2C:9A:46:2F "
显示分辨率由这一行控制:
https://github.com/sickcodes/Docker-OSX/blob/master/custom/config-nopicker-custom.plist#L819
Docker-OSX 将使用以下一个很酷的技巧生成一个新的OpenCore.qcow2
,而不是挂载该磁盘:
-e GENERATE_UNIQUE=true
-e WIDTH=800
-e HEIGHT=600
要使用WIDTH
/ HEIGHT
,必须与-e GENERATE_UNIQUE=true
或-e GENERATE_SPECIFIC=true
一起使用。
启动将花费大约 30 秒的时间,因为它需要使用libguestfs
创建一个新的启动分区。
-e GENERATE_SPECIFIC=true
-e WIDTH=1920
-e HEIGHT=1080
-e SERIAL= " "
-e BOARD_SERIAL= " "
-e UUID= " "
-e MAC_ADDRESS= " "
# using an image in your current directory
stat mac_hdd_ng.img
docker run -it
--device /dev/kvm
-p 50922:10022
-v " ${PWD} /mac_hdd_ng.img:/image "
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e GENERATE_SPECIFIC=true
-e DEVICE_MODEL= " iMacPro1,1 "
-e SERIAL= " C02TW0WAHX87 "
-e BOARD_SERIAL= " C027251024NJG36UE "
-e UUID= " 5CCB366D-9118-4C61-A00A-E5BAF3BED451 "
-e MAC_ADDRESS= " A8:5C:2C:9A:46:2F "
-e MASTER_PLIST_URL=https://raw.githubusercontent.com/sickcodes/Docker-OSX/master/custom/config-nopicker-custom.plist
-e WIDTH=1600
-e HEIGHT=900
sickcodes/docker-osx:naked
# generating random serial numbers, using the DIY installer, along with the screen resolution changes.
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e GENERATE_UNIQUE=true
-e WIDTH=800
-e HEIGHT=600
sickcodes/docker-osx:latest
这是其他一些决议!如果您的分辨率无效,它将默认为 800x600。
-e WIDTH=800
-e HEIGHT=600
-e WIDTH=1280
-e HEIGHT=768
-e WIDTH=1600
-e HEIGHT=900
-e WIDTH=1920
-e HEIGHT=1080
-e WIDTH=2560
-e HEIGHT=1600
第一步是停止 docker 守护进程
sudo systemctl stop docker
第二步是更改容器配置
/var/lib/docker/containers/[container-id]/config.v2.json
(假设您原来的WIDTH是1024,HEIGHT是768,您可以搜索1024并将其替换为新值。768也是如此。)
最后一步是重新启动 docker 守护进程
sudo systemctl restart docker
将磁盘作为卷传递到容器中,然后再次将磁盘传递到 QEMU 命令行附加项中。
使用config-custom.plist
因为您可能想查看启动菜单,否则省略第一行:
DISK_TWO= " ${PWD} /mount_me.img "
-e MASTER_PLIST_URL= 'https://raw.githubusercontent.com/sickcodes/osx-serial-generator/master/config-custom.plist'
-v "${DISK_TWO}:/disktwo"
-e EXTRA= '-device ide-hd,bus=sata.5,drive=DISK-TWO -drive id=DISK-TWO,if=none,file=/disktwo,format=qcow2'
OSX_IMAGE= " ${PWD} /mac_hdd_ng_xcode_bigsur.img "
DISK_TWO= " ${PWD} /mount_me.img "
docker run -it
--device /dev/kvm
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-v /tmp/.X11-unix:/tmp/.X11-unix
-e MASTER_PLIST_URL= ' https://raw.githubusercontent.com/sickcodes/osx-serial-generator/master/config-custom.plist '
-v " ${OSX_IMAGE} " :/image
-v " ${DISK_TWO} " :/disktwo
-e EXTRA= ' -device ide-hd,bus=sata.5,drive=DISK-TWO -drive id=DISK-TWO,if=none,file=/disktwo,format=qcow2 '
sickcodes/docker-osx:naked
另请参阅:此处。
在 Docker-OSX 中,我们使用qcow2
镜像。
这意味着映像会随着您的使用而增长,但来宾操作系统认为您有 200GB 可用空间。
只读
# mount the qemu image like a real disk
sudo modprobe nbd max_part=8
sudo qemu-nbd --connect=/dev/nbd0 ./image.img
sudo fdisk /dev/nbd0 -l
mkdir -p ./mnt
sudo mount /dev/nbd0p1 ./mnt
# inspect partitions (2 partitions)
sudo fdisk /dev/nbd0 -l
# mount using apfs-linux-rw OR apfs-fuse
mkdir -p ./part
sudo mount /dev/nbd0p2 ./part
sudo apfs-fuse -o allow_other /dev/nbd0p2 ./part
查看完磁盘后,可以卸载分区、磁盘并删除环回设备:
sudo umount ./part
sudo umount ./mnt
sudo qemu-nbd --disconnect /dev/nbd0
sudo rmmod nbd
首先,QEMU 必须以 root 身份启动。
还可以通过更改容器中设备的权限来完成 USB 直通。请参阅此处。
例如,使用以下内容创建一个新的 Dockerfile
FROM sickcodes/docker-osx
USER arch
RUN sed -i -e s/exec qemu/exec sudo qemu/ ./Launch.sh
COPY --chown=arch ./new_image.img /home/arch/OSX-KVM/mac_hdd_ng.img
其中new_image.img
是您提取的 qcow2 图像。然后使用docker build .
接下来我们需要找出我们想要传递给虚拟机的 USB 设备的总线和端口号:
lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M
| __ Port 2: Dev 5, If 0, Class=Human Interface Device, Driver=usbhid, 12M
| __ Port 2: Dev 5, If 1, Class=Chip/SmartCard, Driver=, 12M
| __ Port 3: Dev 2, If 0, Class=Wireless, Driver=, 12M
| __ Port 3: Dev 2, If 1, Class=Wireless, Driver=, 12M
| __ Port 5: Dev 3, If 0, Class=Video, Driver=uvcvideo, 480M
| __ Port 5: Dev 3, If 1, Class=Video, Driver=uvcvideo, 480M
在这个例子中,我们想要通过智能卡设备。我们想要的设备位于总线 1 和端口 2 上。
如果您的设备是 USB 2.0 (ehci) 与 USB 3.0 (xhci),也可能存在差异。请参阅此处了解更多详细信息。
# hostbus and hostport correspond to the numbers from lsusb
# runs in privileged mode to enable access to the usb devices.
docker run
--privileged
--device /dev/kvm
-e RAM=4
-p 50922:10022
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e EXTRA= " -device virtio-serial-pci -device usb-host,hostbus=1,hostport=2 "
mycustomimage
当您在 MacOS shell 中执行system_profiler SPUSBDataType
时,您应该会看到该设备出现。
重要提示:这将导致主机系统在虚拟机运行时无法访问 USB 设备!
这是我最喜欢的容器。您可以提供现有磁盘映像作为 Docker 命令行参数。
使用sudo find /var/lib/docker -name mac_hdd_ng.img -size +10G
提取镜像
使用命令参数-v "${PWD}/mac_hdd_ng.img:/image"
提供您自己的本地映像,并在指示 Docker 创建容器时使用sickcodes/docker-osx:naked
。
裸映像用于启动任何现有的 .img 文件,例如当前工作目录中的 ( $PWD
)
默认情况下,该图像有一个名为NOPICKER
的变量,其值为"true"
。这将跳过磁盘选择菜单。使用-e NOPICKER=false
或除true
之外的任何其他字符串进入启动菜单。
这使您可以使用其他磁盘,而不必跳过启动菜单,例如恢复磁盘或磁盘实用程序。
docker pull sickcodes/docker-osx:naked
# run your own image + SSH
# change mac_hdd_ng.img
docker run -it
--device /dev/kvm
-p 50922:10022
-v " ${PWD} /mac_hdd_ng.img:/image "
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
sickcodes/docker-osx:naked
# run local copy of the auto image + SSH + Boot menu
docker run -it
--device /dev/kvm
-p 50922:10022
-v " ${PWD} /mac_hdd_ng_auto.img:/image "
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e " NOPICKER=false "
sickcodes/docker-osx:naked
如果您保留以下行,则“快速启动”命令应该开箱即用。适用于auto
和naked
:
-v /tmp/.X11-unix:/tmp/.X11-unix
-e "DISPLAY=${DISPLAY:-:0.0}"
-e OSX_COMMANDS
允许您在容器内运行任何命令
docker pull sickcodes/docker-osx:auto
# boot to OS X shell + display + specify commands to run inside OS X!
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e " OSX_COMMANDS=/bin/bash -c " put your commands here " "
sickcodes/docker-osx:auto
# Boots in a minute or two!
或者,如果您已有图像并且只想登录并执行任意命令:
docker pull sickcodes/docker-osx:naked-auto
# boot to OS X shell + display + specify commands to run inside OS X!
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e USERNAME=yourusername
-e PASSWORD=yourpassword
-e " OSX_COMMANDS=/bin/bash -c " put your commands here " "
sickcodes/docker-osx:naked-auto
# Boots in a minute or two!
还有无数其他潜在用例可以与 Docker-OSX 完美配合,您将在下面看到其中一些!
对于无头容器,请从docker run
命令中删除以下两行:
# -v /tmp/.X11-unix:/tmp/.X11-unix
# -e "DISPLAY=${DISPLAY:-:0.0}"
这对于 CI/CD 管道特别有帮助。
# run your own image headless + SSH
docker run -it
--device /dev/kvm
-p 50922:10022
-v " ${PWD} /mac_hdd_ng.img:/image "
sickcodes/docker-osx:naked
必须将 -it 更改为 -i 才能与 QEMU 控制台交互
要使用 -i 退出容器,您必须docker kill <containerid>
。例如,要杀死所有内容, docker ps | xargs docker kill
.
原生 QEMU VNC 示例
docker run -i
--device /dev/kvm
-p 50922:10022
-p 5999:5999
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e EXTRA= " -display none -vnc 0.0.0.0:99,password=on "
sickcodes/docker-osx:big-sur
# type `change vnc password myvncusername` into the docker terminal and set a password
# connect to localhost:5999 using VNC
# qemu 6 seems to require a username for vnc now
根本没有 TLS/HTTPS 加密!
或者ssh -N [email protected] -L 5999:127.0.0.1:5999
,其中1.1.1.1
是您的远程服务器 IP。
(注意:如果您关闭端口 5999 并使用 SSH 隧道,这将变得安全。)
添加以下行:
-e EXTRA="-display none -vnc 0.0.0.0:99,password=on"
在 Docker 终端中,按enter
直到看到(qemu)
。
键入change vnc password someusername
输入新 vnc 用户名的密码^。
您还需要容器 IP: docker inspect <containerid> | jq -r '.[0].NetworkSettings.IPAddress'
或者ip n
通常会首先显示容器 IP。
现在VNC使用Docker容器IP进行连接,例如172.17.0.2:5999
通过 SSH 的远程 VNC: ssh -N [email protected] -L 5999:172.17.0.2:5999
,其中1.1.1.1
是您的远程服务器 IP, 172.17.0.2
是您的 LAN 容器 IP。
现在您可以将 VNC 直接连接到使用此命令构建的任何容器!
或者,您可以启用 SPICE 协议,该协议允许使用remote-viewer
而不是 VNC 来访问您的 OSX 容器。
注意: -disable-ticketing
将允许未经身份验证访问虚拟机。请参阅 Spice 手册以获取设置身份验证访问(“票务”)的帮助。
docker run
--device /dev/kvm
-p 3001:3001
-p 50922:10022
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e EXTRA= " -monitor telnet::45454,server,nowait -nographic -serial null -spice disable-ticketing,port=3001 "
mycustomimage
然后只需执行remote-viewer spice://localhost:3001
并添加--spice-debug
进行调试。
# You can create an image of an already configured and setup container.
# This allows you to effectively duplicate a system.
# To do this, run the following commands
# make note of your container id
docker ps --all
docker commit containerid newImageName
# To run this image do the following
docker run
--device /dev/kvm
--device /dev/snd
-v /tmp/.X11-unix:/tmp/.X11-unix
newImageName
docker pull sickcodes/docker-osx:auto
# boot directly into a real OS X shell with no display (Xvfb) [HEADLESS]
docker run -it
--device /dev/kvm
-p 50922:10022
sickcodes/docker-osx:auto
# username is user
# password is alpine
# Wait 2-3 minutes until you drop into the shell.
docker pull sickcodes/docker-osx:latest
docker run -it
--device /dev/kvm
--device /dev/snd
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
sickcodes/docker-osx:latest
# press CTRL + G if your mouse gets stuck
# scroll down to troubleshooting if you have problems
# need more RAM and SSH on localhost -p 50922?
docker run -it
--device /dev/kvm
--device /dev/snd
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
sickcodes/docker-osx:latest
# turn on SSH after you've installed OS X in the "Sharing" settings.
ssh user@localhost -p 50922
添加额外选项-e NOPICKER=true
。
旧机器:
# find your containerID
docker ps
# move the no picker script on top of the Launch script
# NEW CONTAINERS
docker exec containerID mv ./Launch-nopicker.sh ./Launch.sh
# VNC-VERSION-CONTAINER
docker exec containerID mv ./Launch-nopicker.sh ./Launch_custom.sh
# LEGACY CONTAINERS
docker exec containerID bash -c " grep -v InstallMedia ./Launch.sh > ./Launch-nopicker.sh
chmod +x ./Launch-nopicker.sh
sed -i -e s/OpenCore.qcow2/OpenCore-nopicker.qcow2/ ./Launch-nopicker.sh
"
容器设置中的自动更新仍然处于启用状态。您可能希望将其关闭。我们对此有未来的发展计划。
${DISPLAY:-:0.0}
? $DISPLAY
是指您的 X11 显示服务器的 shell 变量。
${DISPLAY}
是相同的,但允许您像这样连接变量:
${DISPLAY}_${DISPLAY}
将打印:0.0_:0.0
$DISPLAY_$DISPLAY
将打印:0.0
...因为$DISPLAY_
不是$DISPLAY
${variable:-fallback}
允许您设置一个“后备”变量,以便在未设置$variable
时进行替换。
您还可以使用${variable:=fallback}
来设置该变量(在当前终端中)。
在 Docker-OSX 中,我们假设:0.0
是默认的$DISPLAY
变量。
你可以看到你的是什么
echo $DISPLAY
这样, ${DISPLAY:-:0.0}
将使用您的 X11 服务器为您设置的任何变量,否则:0.0
-v /tmp/.X11-unix:/tmp/.X11-unix
? -v
是一个 Docker 命令行选项,可让您将卷传递到容器。
我们让 Docker 容器使用的目录是 X 服务器显示套接字。
/tmp/.X11-unix
如果我们让 Docker 容器使用与我们自己的环境相同的显示套接字,那么您在 Docker 容器内运行的任何应用程序也会显示在您的屏幕上! https://www.x.org/archive/X11R6.8.0/doc/RELNOTES5.html
在初始化或启动容器时,您可能会看到来自(qemu)
控制台的以下形式的错误: ALSA lib blahblahblah: (function name) returned error: no such file or directory
。这些或多或少都是预料之中的。只要您能够启动容器并且一切正常,就没有理由担心这些。
另请参阅:此处。