Docker-OSX - Docker で macOS VM を実行してください!DockerのネイティブOSX-KVMの近くで実行してください!X11 フォワーディング!OS X セキュリティリサーチのための CI/CDDocker mac Containers.

(Run macOS VM in a Docker! Run near native OSX-KVM in Docker! X11 Forwarding! CI/CD for OS X Security Research! Docker mac Containers.)

Created at: 2020-06-04 19:01:37
Language: Shell
License: GPL-3.0

ドッカー-OSX ·ツイッターで@sickcodesをフォローする

Docker コンテナでの Mac OS X の実行

Mac OS X を Docker でネイティブに近いパフォーマンスで実行しましょう!X11 フォワーディング!iMessageのセキュリティ調査!iPhoneのUSBが機能しています!ドッカーコンテナ内のmacOS!

LinuxとWindowsの両方を使用してmacOSのセキュリティ調査を実施してください!

Docker-OSXにDiscordサーバーとTelegramが追加されました!

Discordは#docker-osxでアクティブであり、誰でも来て質問やアイデアなどを尋ねることができます。

クリックしてDiscordサーバーに参加します https://discord.gg/sickchat

クリックしてテレグラムサーバーに参加します https://t.me/sickcodeschat

または、プライベートの場合は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

Docker-OSXがOSX-KVMの上に構築されているアップストリームプロジェクトを維持してくれた@kholiaに感謝します。

また、@Leoyzenによって開始された貴重なフォークKVM-OpenCoreを管理している@thenickdudeにも特に感謝します!

OpenCoreチームに特に感謝します:https://github.com/acidanthera/OpenCorePkg。彼らのよく維持されたブートローダーは、Docker-OSXユーザーが楽しむ優れた機能の多くを提供します:)

このプロジェクトが気に入ったら、ここまたは上流に貢献することを検討してください!

クイックスタートドッカー-OSX

ビデオセットアップチュートリアルもここで入手できます:https://www.youtube.com/watch?v=wLezYl77Ll8

Windowsユーザー:以下のメモを見るには、ここをクリックしてください!

ここで初めてですか?初期設定を試すか、以下の手順を試してカタリナまたはビッグサーのいずれかを使用してください。

質問、アイデア、または単にたむろしたいですか?

https://discord.gg/sickchat

カタリナhttps://img.shields.io/docker/image-size/sickcodes/docker-osx/latest?label=sickcodes%2Fdocker-osx%3Alatest

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

# docker build -t docker-osx .

ビッグサーhttps://img.shields.io/docker/image-size/sickcodes/docker-osx/big-sur?label=sickcodes%2Fdocker-osx%3Abig-sur

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

# docker build -t docker-osx --build-arg SHORTNAME=big-sur .

モントレーhttps://img.shields.io/docker/image-size/sickcodes/docker-osx/monterey?label=sickcodes%2Fdocker-osx%3Amonterey

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' \
    sickcodes/docker-osx:monterey

# docker build -t docker-osx --build-arg SHORTNAME=monterey .

ベンチュラhttps://img.shields.io/docker/image-size/sickcodes/docker-osx/ventura?label=sickcodes%2Fdocker-osx%3Aventura

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' \
    sickcodes/docker-osx:ventura

# docker build -t docker-osx --build-arg SHORTNAME=ventura .

プリインストールされたカタリナを実行するhttps://img.shields.io/docker/image-size/sickcodes/docker-osx/auto?label=sickcodes%2Fdocker-osx%3Aauto

# 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
# passsword is alpine

古いシステム

ハイシエラhttps://img.shields.io/docker/image-size/sickcodes/docker-osx/high-sierra?label=sickcodes%2Fdocker-osx%3Ahigh-sierra

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

# docker build -t docker-osx --build-arg SHORTNAME=high-sierra .

モハーベhttps://img.shields.io/docker/image-size/sickcodes/docker-osx/mojave?label=sickcodes%2Fdocker-osx%3Amojave

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

# docker build -t docker-osx --build-arg SHORTNAME=mojave .

イメージを手動でダウンロードして Docker で使用する

https://img.shields.io/docker/image-size/sickcodes/docker-osx/naked?label=sickcodes%2Fdocker-osx%3Anaked

これは、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 \
    sickcodes/docker-osx:naked

独自のイメージを使用し、シェルに手動および自動的にログインする

https://img.shields.io/docker/image-size/sickcodes/docker-osx/naked-auto?label=sickcodes%2Fdocker-osx%3Anaked-auto

最初にゲスト内のネットワーク共有でSSHを有効にします。資格情報を変更します。コンテナはそれ自体を

-e "USERNAME=user"
-e "PASSWORD=password"
~/.ssh/authorized_keys

画面が表示されないため、次のように plist を nopicker と共に使用します。

# 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 \
    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

(VFIO) iPhone USB パススルー (VFIO)

ラップトップをお持ちの場合は、次のusbfluxdセクションを参照してください。

デスクトップPCをお持ちの場合は、@Silfalionの指示を使用できます:https://github.com/Silfalion/Iphone_docker_osx_passthrough

(USBFLUXD) iPhone USB -> Network style passthrough OSX-KVM Docker-OSX

usbfluxdのビデオセットアップチュートリアルは、ここでも利用できます:https://www.youtube.com/watch?v=kTk5fGjK_PM

macOS 仮想マシン上の iPhone USB パススルー Linux & Windows

この方法は、ラップトップ、PC、何でも機能します!

https://github.com/corellium 経由でusbfluxd@nikiasいただきありがとうございます!

これはLinux内で行われます。

Linuxで3つのターミナルを開きます

LinuxでUSB経由でデバイスを接続すると、https://github.com/corellium/usbfluxd を使用してポートで同じネットワーク上の別のシステムに公開できます。

usbmuxd
5000

がインストールされていることを確認します。

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

usbfluxdを実行しているホストに接続する

これはmacOS内で行われます。

自作をインストールします。

172.17.0.1
通常、PCであるDockerブリッジIPですが、任意のIPを使用できます...
ip addr

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

TCP 経由の USB 接続を受け入れ、ローカルとして表示されます。

(ホストのIPアドレスに変更する必要があるかもしれません。

172.17.0.1
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 を使用してコンテナを高速化する

https://github.com/sickcodes/osx-optimizer のコマンドを参照してください!

  • GUIログイン画面をスキップします(自己責任で!
  • macOSでスポットライトインデックスを無効にして、仮想インスタンスを大幅に高速化します。
  • 重いログイン画面の壁紙を無効にする
  • 更新を無効にします(自己責任で!

/ var / lib / dockerを外部ドライブ、ブロックストレージ、NFS、またはその他の考えられる場所に移動して、ディスク容量を増やします。

以下のチュートリアルに従って、/var/lib/dockerを移動します

  • 代わりに、サーバーのディスクまたはSSDを使用する安価な大容量物理ディスクストレージ。
  • ブロックストレージ、NFSなど

チュートリアルはこちら: 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

今、そのドッカーデーモンはオフになっています、/ 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 - ハイシエラ、モハベを追加

ビルド中にこれらのいずれかを選択し、dockerプルを使用する場合は無関係です。

--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

技術的な詳細

現在、複数の画像があり、それぞれに異なるユースケースがあります(以下で説明)。

  • ハイシエラ
  • モハーベ
  • カタリナ
  • ビッグサー
  • モントレー
  • ベンチュラ
  • オート(既製のカタリナ)
  • 裸(独自の.imgを使用)
  • ネイキッドオート(独自の.imgとSSHを使用する)

ハイシエラ:

https://img.shields.io/docker/image-size/sickcodes/docker-osx/high-sierra?label=sickcodes%2Fdocker-osx%3Ahigh-sierra

モハーベ:

https://img.shields.io/docker/image-size/sickcodes/docker-osx/mojave?label=sickcodes%2Fdocker-osx%3Amojave

カタリナ:

https://img.shields.io/docker/image-size/sickcodes/docker-osx/latest?label=sickcodes%2Fdocker-osx%3Alatest

ビッグサー:

https://img.shields.io/docker/image-size/sickcodes/docker-osx/big-sur?label=sickcodes%2Fdocker-osx%3Abig-sur

モントレーはあなた自身のイメージを作ります:

https://img.shields.io/docker/image-size/sickcodes/docker-osx/monterey?label=sickcodes%2Fdocker-osx%3Amonterey

Sick.Codesによって事前に作られたカタリナシステム: ユーザー名: 、パスワード:

user
alpine

https://img.shields.io/docker/image-size/sickcodes/docker-osx/auto?label=sickcodes%2Fdocker-osx%3Aauto

裸:自分のイメージを持ち込む設定(最初に上記のいずれかを使用します):

https://img.shields.io/docker/image-size/sickcodes/docker-osx/naked?label=sickcodes%2Fdocker-osx%3Anaked

ネイキッドオート:上記と同じですが、&と

-e USERNAME
-e PASSWORD
-e OSX_COMMANDS="put your commands here"

https://img.shields.io/docker/image-size/sickcodes/docker-osx/naked-auto?label=sickcodes%2Fdocker-osx%3Anaked-auto

資格

  • USB fluxdを使用してLinux上でiPhone OSX KVMを使用してください!
  • macOS Monterey VM on Linux!
  • フォルダ共有-
  • USBパススルー(ホットプラグも)
  • SSH が有効 (
    localhost:50922
    )
  • VNC 有効 () ./vnc バージョンを使用している場合
    localhost:8888
  • シリアル番号ジェネレータによるiMessageのセキュリティ調査!
  • X11 転送が有効になっている
  • QEMU + KVM 上で実行されます
  • ビッグサー、カスタムイメージ、Xvfbヘッドレスモードをサポート
  • コンテナのクローンを作成できます
    docker commit

必要条件

  • 最低限のインストール用に20GB + ++ディスク容量(Xcodeを使用している場合は50GB)
  • 仮想化はBIOS設定で有効にする必要があります
  • x86_64 KVM対応ホスト
  • 少なくとも 50 GB (半分は基本イメージ用、半分はランタイム イメージ用)
    :auto

藤堂

  • セキュリティ研究者向けのドキュメント
  • GPU アクセラレーション
  • virt-manager のサポート

港湾労働者

このリポジトリのコンテンツの上に構築されたイメージは、便宜上Docker Hubでも利用できます https://hub.docker.com/r/sickcodes/docker-osx

利用可能なDockerイメージとその使用目的の包括的なリストは、手順に記載されています。

Kubernetes

Docker-OSX は Kubernetes をサポートしています。

Kubernetes Helm Chart & Documentation は helm ディレクトリの下にあります。

この大きな貢献に貢献してくれたcephasaraに感謝します。

アーティファクトハブ

支える

小さな質問と問題

Docker-OSXの実行で軽微な問題が発生した場合、または質問がある場合は、自由に問題を開いてください。

解決済みの問題

ただし、問題を開く前に、クローズされた問題を確認し、このリポジトリの最新バージョンを使用していることを確認してください — 問題はすでに解決されている可能性があります!また、以下の質問と回答のセクションにも回答が表示される場合があります。

機能要求と更新

フォロー@sickcodes!

プロフェッショナルサポート

より高度な取り組みのために、次のサポートサービスを提供しています。

  • エンタープライズサポート、ビジネスサポート、またはカジュアルサポート。
  • カスタム画像、カスタムスクリプト、コンサルティング(時間単位で利用可能!
  • あなたまたはあなたの開発チームとの1対1の会話。

興味のある方は、Twitterで@sickcodesお問い合わせいただくか、ここをクリックしてください。

ライセンス/貢献

Docker-OSXはGPL v3+の下でライセンスされています。貢献は歓迎され、非常に高く評価されています。実際、プロプライエタリなソフトウェアを作成するためのツールとしてDocker-OSXを使用することが許可されています。

その他のクールな Docker/QEMU ベースのプロジェクト

免責事項

あなたがAppleセキュリティに真剣に取り組んでいて、おそらくAppleバグバウンティプログラム内で6桁のバグ報奨金を見つけているなら、あなたは正しい場所にいます!追記:Hackintosh、OSX-KVM、またはDocker-OSXは合法ですか?

本プロジェクトで言及されている製品名、ロゴ、ブランド、その他の商標は、それぞれの商標所有者に帰属します。これらの商標権者は、いかなる立場でも当社のリポジトリと提携していません。彼らはこのプロジェクトを後援したり支持したりすることはありません。

指示

コンテナー イメージ

すでにセットアップされていますか、それともコンテナをすばやく作成しようとしていますか?クイックスタートを確認するか、コンテナ作成例のセクションでさらに多くのユースケースを確認してください。

さまざまな目的に適したいくつかの異なるDocker-OSXイメージが利用可能です。

またはを使用して個人のイメージを作成します。次に、画像を画像から引き出します。その後、そのイメージを複製してコンテナにインポートし、コンテナを繰り返し以前の状態に戻すことができます。

:latest
big-sur
:naked

初期設定

他のことをする前に、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

Docker-OSXをWindows上で実行したいのですが

Windows で Docker-OSX を実行することは、WSL2 (Windows 11 + Windows Subsystem for Linux 用) を使用して可能です。

ビルド11+(22000H21以降)でWindows2がインストールされている必要があります。

まず、管理者の PowerShell でこのコマンドを実行して、コンピューターに WSL をインストールします。詳細については、こちらをご覧ください

これにより、デフォルトでUbuntuがインストールされます。

wsl --install

PowerShell を使用して、WSL2 が有効になっていることを確認できます。利用可能な他のディストリビューションを表示するには、 を使用します。

wsl -l -v
wsl -l -o

以前に WSL1 をインストールしたことがある場合は、WSL 2 にアップグレードします。WSL1 から WSL2 にアップグレードするには、このリンクを確認してください。

WSL のインストール後、ファイルの末尾に移動して追加します (ファイルが存在しない場合は作成します)。ファイルの詳細については、このリンクを確認してください。ファイルエクスプローラーのオプションで[隠しファイルを表示]と[ファイル拡張子を表示]を選択していることを確認します。 結果は次のようになります。

C:/Users/<Your_Name>/.wslconfig
nestedVirtualization=true
.wslconfig

[wsl2]
nestedVirtualization=true

WSL ディストリビューション (PowerShell で実行) に移動し、コマンドを使用して KVM が有効になっているかどうかを確認します。出力は次のようになります。

wsl
kvm-ok

INFO: /dev/kvm exists
KVM acceleration can be used

次に、Windows用のDockerがまだインストールされていない場合は、ダウンロードしてインストールします。

インストール後、[設定]に移動し、次の2つのチェックボックスをオンにします。

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: これは最も簡単で使いやすいオプションです。キーボードが完全に通過しない、デスクトップに2番目のマウスが表示されるなど、いくつかの問題(WSLgの問題)があるかもしれませんが、このオプションをお勧めします。

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 については、https://github.com/sickcodes/Docker-OSX/discussions/458 を参照してください。

  • VNC: 詳細については、VNC セクションを参照してください。qemu に -vnc 引数を追加することもできます。VNC クライアント経由で Mac VM に接続します。方法は次のとおりです
  • デスクトップ環境:これにより、完全なデスクトップLinuxエクスペリエンスが提供されますが、コンピューターのリソースをもう少し使用します。ここにガイドの例がありますが、デスクトップ環境のセットアップに役立つ他のガイドがあります。DE の例

コンテナ作成時の追加の起動手順

  • macOS ベースシステムを起動します (Enter キーを押します)。

  • クリック

    Disk Utility

  • 最大のディスク(デフォルトは約200GB)を消去し、小さいディスクは変更しないでください。 -- クリックできない場合は、ディスク サイズを 1 KB 減らす必要があります。

    erase

  • (オプション)容量を制限する場合は、未使用の領域を使用してOSとファイルを格納するためのパーティションを作成します。(Xcode 12パーティションの場合は少なくとも60GB。

  • クリック

    Reinstall macOS

  • インストール中にシステムが複数回再起動する必要がある場合があります

トラブルシューティング

定期点検

これは、特にDockerにまだ慣れていない場合に、開始するのに最適な場所です。

コンテナをすばやく作成したいだけですか?コンテナ作成例のセクションをご覧ください。

より具体的/高度なトラブルシューティングの質問と回答は、その他の質問と回答にあります。また、クローズされた問題も確認する必要があります。他の誰かがあなたのような質問をすでに答えているかもしれません あなたがこの文書でそれを見つけることができなくても!

CPU が仮想化をサポートしていることを確認する

初期設定を参照してください。

ドッカー不明なサーバーOSエラー

docker: unknown server OS: .
See 'docker run --help'.

これは、ドッカーデーモンが実行されていないことを意味します。

pgrep dockerd
何も返さない

したがって、いくつかの選択肢があります。

sudo dockerd
フォアグラウンドドッカーの使用のために。私はこれを使います。

又は

sudo systemctl --start dockerd
これを今すぐドッキングします。

又は

sudo systemctl --enable --now dockerd
再起動するたびにDockerdを起動するため、そして今。

より多くの CPU コア/SMP を使用する

例:

-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をコンテナに割り当てることができます。

ユーザーが Docker グループ、KVM グループ、libvirt グループに属していることを確認する

自分を Docker グループに追加する

systemd/systemctl によって制御されている場合、または dockerd が制御されている場合は、Docker グループに属している必要があります。 Docker グループに属していない場合:

sudo dockerd

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"

また、に格納されているコンテナーからファイルをプルし、ランタイム引数として Docker イメージを指定することもできます。

.img
/var/lib/docker
:naked

こちらも参照してください。

以前にDocker-OSXを使用したことがあり、自動的に起動するコンテナを再起動したい

使用するコンテナは、起動中に停止できます。

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 エラー "接続が拒否されました"

ハードウェア仮想化用にすべてをまだ設定していない場合、libgtk 関連のエラーが 1 つ以上表示されることがあります。まだ行っていない場合は、セットアップ手順を見逃したか、必要なすべての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 の過剰割り当て

マシンに搭載されているよりも多くのRAMを割り当てることはできません。デフォルトは 3 ギガバイトです。

-e RAM=3

現在使用可能な RAM よりも多くの RAM をコンテナーに割り当てようとすると、次のようなエラーが表示されることがあります。参照:ここここ

cannot set up guest memory 'pc.ram': Cannot allocate memory

たとえば(以下)、にはすでに20ギガバイトのRAMが割り当てられています。

buff/cache

[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

パルスオーディオ

サウンドにパルスオーディオを使用する

注: AppleALCalcidVoodooHDA-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

PulseAudio with WSLg

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

追加のポートを転送する (nginx ホスティングの例)

必要に応じて追加のポートを転送することができます。この例では、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

これで、nginxはポート10023で到達可能になります。

さらに、次のように複数のステートメントを文字列化することもできます。

    -e ADDITIONAL_PORTS='hostfwd=tcp::10023-:80,hostfwd=tcp::10043-:443,'
    -p 10023:10023 \
    -p 10043:10043 \

ブリッジ ネットワーク

コンテナー内からインターネット接続を有効にするために、既定のセットアップでは何もする必要がない場合があります。さらに、動作しなくても動作する可能性があります。

curl
ping

こことこことここ議論を参照してください。

リモートインストールのブリッジネットワーク接続の IPv4 転送を有効にする

これは、ローカルインストールには必要ありません。

さらに、コンテナで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

Docker-OSX QEMU macOS とフォルダを共有する

ゲストとフォルダを共有するのはとても簡単です。

あなたのフォルダは 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" \

Full example:

# 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

Share Linux NFS Drive into macOS

To share a folder using NFS, setup a folder for on the host machine, for example, and then append to :

/srv/nfs/share
/etc/exports

/srv/nfs/share      127.0.0.1/0(insecure,rw,all_squash,anonuid=1000,anongid=985,no_subtree_check)

You may need to reload exports now, which will begin sharing that directory.

# reload shared folders
sudo exportfs -arv

Source & Explanation

Give permissions on the shared folder for the and , where and matches that of your linux user;

anonuid
anongid
anonuid
anongid
id -u

id -u ; id -g
will print
userid:groupid

chown 1000:985 /srv/nfs/share
chmod u+rwx /srv/nfs/share

Start the Docker-OSX container with the additional flag

--network host

Create and mount the nfs folder from the mac terminal:

mkdir -p ~/mnt
sudo mount_nfs -o locallocks 10.0.2.2:/srv/nfs/share ~/mnt

Share USB Drive into macOS over QEMU

Mount USB Drive (Hotplug/Hot Plug USB)

Start your container.

Pick a port, for example, .

7700

lsusb
to get
vid:pid

On Linux:

sudo usbredirserver -p 7700 1e3d:2096

Now, in the Docker window hit Enter to see the console.

(qemu)

You can add/remove the disk using commands like this, even once the machine is started:

chardev-add socket,id=usbredirchardev1,port=7700,host=172.17.0.1

device_add usb-redir,chardev=usbredirchardev1,id=usbredirdev1,debug=4

Mount USB Drive inside macOS at boot Docker OSX

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: enable internet connectivity with a bridged network

Fedora's default firewall settings may prevent Docker's network interface from reaching the internet. In order to reoslve this, you will need to whitelist the interface in your firewall:

# Set the docker0 bridge to the trusted zone
sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0
sudo firewall-cmd --reload

Nested Hardware Virtualization

Check if your machine has hardware virtualization enabled:

sudo tee /sys/module/kvm/parameters/ignore_msrs <<< 1

egrep -c '(svm|vmx)' /proc/cpuinfo

Virtual network adapters

Fast internet connectivity

-e NETWORKING=vmxnet3

Slow internet connectivity

-e NETWORKING=e1000-82545em

CI/CD Related Improvements

Tips for reducing the size of the image

  • Start the container as usual, and remove unnecessary files. A useful way to do this is to use starting from the directory, and find large directories where files can be removed. E.g. unnecessary cached files, Xcode platforms, etc.
    du -sh *
    /
  • Once you are satisfied with the amount of free space, enable trim with , and reboot.
    sudo trimforce enable
  • Zero out the empty space on the disk with
    dd if=/dev/zero of=./empty && rm -f empty
  • Shut down the VM and copy out the qcow image with
    docker cp stoppedcontainer:/home/arch/OSX-KVM/mac_hdd_ng.img .
  • Run to fix any errors.
    qemu-img check -r all mac_hdd_ng.img
  • Run and check for errors again
    qemu-img convert -O qcow2 mac_hdd_ng.img deduped.img
  • OPTIONAL: Run to further compress the image. This may reduce the runtime speed though, but it should reduce the size by roughly 25%.
    qemu-img convert -c -O qcow2 deduped.img compressed.img
  • Check for errors again, and build a fresh docker image. E.g. with this Dockerfile
FROM sickcodes/docker-osx
USER arch
COPY --chown=arch ./deduped.img /home/arch/OSX-KVM/mac_hdd_ng.img

Run Docker-OSX headlessly with Telnet

First make sure autoboot is enabled

Next, you will want to set up SSH to be automatically started.

sudo systemsetup -setremotelogin on

Make sure to commit the new docker image and save it, or rebuild as described in the section on reducing disk space.

Then run it with these arguments.

# 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

What mirrors are appropriate to use to build Docker-OSX locally?

If you are building Docker-OSX locally, you'll probably want to use Arch Linux's mirrors.

Mirror locations can be found here (uses two-letter country codes): 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 .

Custom QEMU Arguments (passthrough devices)

Pass any devices/directories to the Docker container & the QEMU arguments using the handy runtime argument provider option .

-e EXTRA=

# 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

Generating serial numbers

Generate serial numbers in OR make docker generate them at runtime (see below).

./custom

At any time, verify your serial number before logging into iCloud, etc.

# 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'

Getting started with serial numbers

# ARCH
pacman -S libguestfs

# UBUNTU DEBIAN
apt install libguestfs -y

# RHEL FEDORA CENTOS
yum install libguestfs -y

Inside the folder you will find scripts.

./custom
4

  • config-nopicker-custom.plist
  • opencore-image-ng.sh

These two files are from OSX-KVM.

You don't need to touch these two files.

The config.plist has 5 values replaced with placeholders. Click here to see those values for no reason.

  • generate-unique-machine-values.sh
    This script will generate serial numbers, with Mac Addresses, plus output to CSV/TSV, plus make a .
    bootdisk image

You can create hundreds,

./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

Or if you have some specific serial numbers...

  • 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

This example generates a random set of serial numbers at runtime, headlessly

# 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' \

This example generates a specific set of serial numbers at runtime

# 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

This example generates a specific set of serial numbers at runtime, with your existing image, at 1000x1000 display resolution

# 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

If you want to generate serial numbers, either make them at runtime using

    -e GENERATE_UNIQUE=true \

Or you can generate them inside the folder. And then use:

./custom

    -e GENERATE_SPECIFIC=true \
    -e SERIAL="" \
    -e BOARD_SERIAL="" \
    -e UUID="" \
    -e MAC_ADDRESS="" \

Making serial numbers persist across reboots

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

To use iMessage or iCloud you need to change values.

5

  • SERIAL
  • BOARD_SERIAL
  • UUID
  • MAC_ADDRESS

ROM
is just the lowercased mac address, without
:
between each word.

You can tell the container to generate them for you using

-e GENERATE_UNIQUE=true

Or tell the container to use specific ones using

-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" \

Changing display resolution

The display resolution is controlled by this line:

https://github.com/sickcodes/Docker-OSX/blob/master/custom/config-nopicker-custom.plist#L819

Instead of mounting that disk, Docker-OSX will generate a new by using this one cool trick:

OpenCore.qcow2

-e GENERATE_UNIQUE=true \
-e WIDTH=800 \
-e HEIGHT=600 \

To use /, you must use with either or .

WIDTH
HEIGHT
-e GENERATE_UNIQUE=true
-e GENERATE_SPECIFIC=true

It will take around 30 seconds longer to boot because it needs to make a new boot partition using .

libguestfs

-e GENERATE_SPECIFIC=true \
-e WIDTH=1920 \
-e HEIGHT=1080 \
-e SERIAL="" \
-e BOARD_SERIAL="" \
-e UUID="" \
-e MAC_ADDRESS="" \

Change Docker-OSX Resolution Examples

# 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

Here's a few other resolutions! If you resolution is invalid, it will default to 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 \

This example shows how to change resolution after the container is created.

First step is to stop the docker daemon

sudo systemctl stop docker

The second step is to change container config in

/var/lib/docker/containers/[container-id]/config.v2.json

(Suppose your original WIDTH is 1024 and HEIGHT is 768, you can search 1024 and replace it with the new value. Same for 768.)

The last step is to restart the docker daemon

sudo systemctl restart docker

Mounting physical disks in Mac OSX

Pass the disk into the container as a volume and then pass the disk again into QEMU command line extras with.

Use the because you probably want to see the boot menu, otherwise omit the first line:

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' \

Physical disk mounting example

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

See also: here.

Extracting the APFS disk on Linux

In Docker-OSX, we are using images.

qcow2

This means the image grows as you use it, but the guest OS thinks you have 200GB available.

READ ONLY

# 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

When you are finishing looking at your disk, you can unmount the partition, the disk, and remove the loopback device:

sudo umount ./part
sudo umount ./mnt
sudo qemu-nbd --disconnect /dev/nbd0
sudo rmmod nbd

USB Passthrough

Firstly, QEMU must be started as root.

It is also potentially possible to accomplish USB passthrough by changing the permissions of the device in the container. See here.

For example, create a new Dockerfile with the following

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

Where is the qcow2 image you extracted. Then rebuild with

new_image.img
docker build .

Next we need to find out the bus and port numbers of the USB device we want to pass through to the VM:

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

In this example, we want to pass through a smartcard device. The device we want is on bus 1 and port 2.

There may also be differences if your device is usb 2.0 (ehci) vs usb 3.0 (xhci). See here for more details.

# 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

You should see the device show up when you do in the MacOS shell.

system_profiler SPUSBDataType

Important Note: this will cause the host system to lose access to the USB device while the VM is running!

Container creation examples

Quick Start your own image (naked container image)

This is my favourite container. You can supply an existing disk image as a Docker command line argument.

  • Pull images out using

    sudo find /var/lib/docker -size +10G | grep mac_hdd_ng.img

  • Supply your own local image with the command argument and use when instructing Docker to create your container.

    -v "${PWD}/mac_hdd_ng.img:/image"
    sickcodes/docker-osx:naked

    • Naked image is for booting any existing .img file, e.g in the current working directory (

      $PWD
      )

    • By default, this image has a variable called which is . This skips the disk selection menu. Use or any other string than the word to enter the boot menu.

      NOPICKER
      "true"
      -e NOPICKER=false
      true

      This lets you use other disks instead of skipping the boot menu, e.g. recovery disk or disk utility.

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

Building an OSX container with video output

The Quick Start command should work out of the box, provided that you keep the following lines. Works in & machines:

auto
naked

    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e "DISPLAY=${DISPLAY:-:0.0}" \

Prebuilt image with arbitrary command line arguments

https://img.shields.io/docker/image-size/sickcodes/docker-osx/auto?label=sickcodes%2Fdocker-osx%3Aauto

-e OSX_COMMANDS
lets you run any commands inside the container

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!

OR if you have an image already and just want to log in and execute arbitrary commands:

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!

Further examples

There's a myriad of other potential use cases that can work perfectly with Docker-OSX, some of which you'll see below!

Building a headless OSX container

For a headless container, remove the following two lines from your command:

docker run

    # -v /tmp/.X11-unix:/tmp/.X11-unix \
    # -e "DISPLAY=${DISPLAY:-:0.0}" \

Building a headless container from a custom image

https://img.shields.io/docker/image-size/sickcodes/docker-osx/naked?label=sickcodes%2Fdocker-osx%3Anaked

This is particularly helpful for CI/CD pipelines.

# 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

Building a headless container which allows insecure VNC on localhost (!for local use only!)

Must change -it to -i to be able to interact with the QEMU console

To exit a container using -i you must

docker kill <containerid>
. For example, to kill everything,
docker ps | xargs docker kill
.

Native QEMU VNC example

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

NOT TLS/HTTPS Encrypted at all!

Or , where is your remote server IP.

ssh -N root@1.1.1.1 -L  5999:127.0.0.1:5999
1.1.1.1

(Note: if you close port 5999 and use the SSH tunnel, this becomes secure.)

Building a headless container to run remotely with secure VNC

Add the following line:

-e EXTRA="-display none -vnc 0.0.0.0:99,password=on"

In the Docker terminal, press until you see .

enter
(qemu)

Type

change vnc password someusername

Enter a password for your new vnc username^.

You also need the container IP:

docker inspect <containerid> | jq -r '.[0].NetworkSettings.IPAddress'

Or will usually show the container IP first.

ip n

Now VNC connect using the Docker container IP, for example

172.17.0.2:5999

Remote VNC over SSH: , where is your remote server IP and is your LAN container IP.

ssh -N root@1.1.1.1 -L  5999:172.17.0.2:5999
1.1.1.1
172.17.0.2

Now you can direct connect VNC to any container built with this command!

I'd like to use SPICE instead of VNC

Optionally, you can enable the SPICE protocol, which allows use of to access your OSX container rather than VNC.

remote-viewer

Note: will allow unauthenticated access to the VM. See the spice manual for help setting up authenticated access ("Ticketing").

-disable-ticketing

  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

Then simply do and add for debugging.

remote-viewer spice://localhost:3001
--spice-debug

Creating images based on an already configured and set up container

# 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
# passsword is alpine
# Wait 2-3 minutes until you drop into the shell.

Run the original version of Docker-OSX

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?

Run but enable SSH in OS X (Original Version)!

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

Autoboot into OS X after you've installed everything

Add the extra option .

-e NOPICKER=true

Old machines:

# 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
"

The big-sur image starts slowly after installation. Is this expected?

Automatic updates are still on in the container's settings. You may wish to turn them off. We have future plans for development around this.

What is ?
${DISPLAY:-:0.0}

$DISPLAY
is the shell variable that refers to your X11 display server.

${DISPLAY}
is the same, but allows you to join variables like this:

  • e.g. would print
    ${DISPLAY}_${DISPLAY}
    :0.0_:0.0
  • e.g. would print
    $DISPLAY_$DISPLAY
    :0.0

...because is not

$DISPLAY_
$DISPLAY

${variable:-fallback}
が設定されていない場合に置換される「フォールバック」変数を設定できます。
$variable

を使用して、その変数を(現在のターミナルで)設定することもできます。

${variable:=fallback}

Docker-OSXでは、デフォルトの変数であると想定しています。

:0.0
$DISPLAY

あなたはあなたのものを見ることができます

echo $DISPLAY

そうすれば、X11サーバーが設定した変数を使用します。

${DISPLAY:-:0.0}
: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

起動時またはコンテナ作成時の ALSA エラー

コンテナを初期化または起動するときに、次の形式のコンソールからエラーが表示されることがあります。これらは多かれ少なかれ予想されています。コンテナを起動でき、すべてが機能している限り、これらについて心配する必要はありません。

(qemu)
ALSA lib blahblahblah: (function name) returned error: no such file or directory

こちらも参照してください。