├── .devcontainer.json ├── .dockerignore ├── .github ├── ISSUE_TEMPLATE │ ├── 1-issue.yml │ ├── 2-feature.yml │ ├── 3-bug.yml │ ├── 4-question.yml │ └── config.yml ├── dependabot.yml ├── logo.png ├── renovate.json └── workflows │ ├── build.yml │ ├── check.yml │ ├── hub.yml │ └── test.yml ├── .gitignore ├── Dockerfile ├── assets └── config.plist ├── compose.yml ├── kubernetes.yml ├── license.md ├── readme.md └── src ├── boot.sh ├── entry.sh └── install.sh /.devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "macos", 3 | "service": "macos", 4 | "forwardPorts": [8006], 5 | "dockerComposeFile": "compose.yml" 6 | } 7 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .dockerignore 2 | .git 3 | .github 4 | .gitignore 5 | .gitlab-ci.yml 6 | .gitmodules 7 | Dockerfile 8 | Dockerfile.archive 9 | compose.yml 10 | compose.yaml 11 | docker-compose.yml 12 | docker-compose.yaml 13 | *.md 14 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/1-issue.yml: -------------------------------------------------------------------------------- 1 | name: "\U0001F6A8 Technical issue" 2 | description: When you're experiencing problems using the container 3 | body: 4 | - type: input 5 | id: os 6 | attributes: 7 | label: Operating system 8 | description: Your Linux distribution (can be shown by `lsb_release -a`). 9 | placeholder: e.g. Ubuntu 24.04 10 | validations: 11 | required: true 12 | - type: textarea 13 | id: summary 14 | attributes: 15 | label: Description 16 | description: A clear and concise description of your issue. 17 | validations: 18 | required: true 19 | - type: textarea 20 | id: compose 21 | attributes: 22 | label: Docker compose 23 | description: The compose file (or otherwise the `docker run` command used). 24 | render: yaml 25 | validations: 26 | required: true 27 | - type: textarea 28 | id: log 29 | attributes: 30 | label: Docker log 31 | description: The logfile of the container (as shown by `docker logs macos`). 32 | render: shell 33 | validations: 34 | required: true 35 | - type: textarea 36 | id: screenshot 37 | attributes: 38 | label: Screenshots (optional) 39 | description: Screenshots that might help to make the problem more clear. 40 | validations: 41 | required: false 42 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/2-feature.yml: -------------------------------------------------------------------------------- 1 | name: "\U0001F680 Feature request" 2 | description: Suggest an idea for improving the container 3 | title: "[Feature]: " 4 | labels: ["enhancement"] 5 | body: 6 | - type: textarea 7 | id: problem 8 | attributes: 9 | label: Is your proposal related to a problem? 10 | description: | 11 | Provide a clear and concise description of what the problem is. 12 | For example, "I'm always frustrated when..." 13 | validations: 14 | required: true 15 | - type: textarea 16 | id: solution 17 | attributes: 18 | label: Describe the solution you'd like. 19 | description: | 20 | Provide a clear and concise description of what you want to happen. 21 | validations: 22 | required: true 23 | - type: textarea 24 | id: alternatives 25 | attributes: 26 | label: Describe alternatives you've considered. 27 | description: | 28 | Let us know about other solutions you've tried or researched. 29 | validations: 30 | required: true 31 | - type: textarea 32 | id: context 33 | attributes: 34 | label: Additional context 35 | description: | 36 | Is there anything else you can add about the proposal? 37 | You might want to link to related issues here, if you haven't already. 38 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/3-bug.yml: -------------------------------------------------------------------------------- 1 | name: "\U0001F41E Bug report" 2 | description: Create a report to help us improve the container 3 | title: "[Bug]: " 4 | labels: ["bug"] 5 | body: 6 | - type: input 7 | id: os 8 | attributes: 9 | label: Operating system 10 | description: Your Linux distribution (can be shown by `lsb_release -a`). 11 | placeholder: e.g. Ubuntu 24.04 12 | validations: 13 | required: true 14 | - type: textarea 15 | id: summary 16 | attributes: 17 | label: Description 18 | description: Describe the expected behaviour, the actual behaviour, and the steps to reproduce. 19 | validations: 20 | required: true 21 | - type: textarea 22 | id: compose 23 | attributes: 24 | label: Docker compose 25 | description: The compose file (or otherwise the `docker run` command used). 26 | render: yaml 27 | validations: 28 | required: true 29 | - type: textarea 30 | id: log 31 | attributes: 32 | label: Docker log 33 | description: The logfile of the container (as shown by `docker logs macos`). 34 | render: shell 35 | validations: 36 | required: true 37 | - type: textarea 38 | id: screenshot 39 | attributes: 40 | label: Screenshots (optional) 41 | description: Screenshots that might help to make the problem more clear. 42 | validations: 43 | required: false 44 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/4-question.yml: -------------------------------------------------------------------------------- 1 | name: "\U00002753 General question" 2 | description: Questions about the container not related to an issue 3 | title: "[Question]: " 4 | labels: ["question"] 5 | body: 6 | - type: checkboxes 7 | attributes: 8 | label: Is your question not already answered in the FAQ? 9 | description: Please read the [FAQ](https://github.com/dockur/macos/blob/master/readme.md) carefully to avoid asking duplicate questions. 10 | options: 11 | - label: I made sure the question is not listed in the [FAQ](https://github.com/dockur/macos/blob/master/readme.md). 12 | required: true 13 | - type: checkboxes 14 | attributes: 15 | label: Is this a general question and not a technical issue? 16 | description: For questions related to issues you must use the [technical issue](https://github.com/dockur/macos/issues/new?assignees=&labels=&projects=&template=1-issue.yml) form instead. It contains all the right fields (system info, logfiles, etc.) we need in order to be able to help you. 17 | options: 18 | - label: I am sure my question is not about a technical issue. 19 | required: true 20 | - type: textarea 21 | id: question 22 | attributes: 23 | label: Question 24 | description: What's the question you have about the container? 25 | validations: 26 | required: true 27 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: docker 4 | directory: / 5 | schedule: 6 | interval: weekly 7 | - package-ecosystem: github-actions 8 | directory: / 9 | schedule: 10 | interval: weekly 11 | -------------------------------------------------------------------------------- /.github/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dockur/macos/d93c75b97914f5c2d0ef3d6b7e1cebdf56a603db/.github/logo.png -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": ["config:recommended", ":disableDependencyDashboard"] 4 | } 5 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - master 8 | paths-ignore: 9 | - '**/*.md' 10 | - '**/*.yml' 11 | - '.gitignore' 12 | - '.dockerignore' 13 | - '.github/**' 14 | - '.github/workflows/**' 15 | 16 | concurrency: 17 | group: build 18 | cancel-in-progress: false 19 | 20 | jobs: 21 | shellcheck: 22 | name: Test 23 | uses: ./.github/workflows/check.yml 24 | build: 25 | name: Build 26 | needs: shellcheck 27 | runs-on: ubuntu-latest 28 | permissions: 29 | actions: write 30 | packages: write 31 | contents: read 32 | steps: 33 | - 34 | name: Checkout 35 | uses: actions/checkout@v4 36 | with: 37 | fetch-depth: 0 38 | - 39 | name: Docker metadata 40 | id: meta 41 | uses: docker/metadata-action@v5 42 | with: 43 | context: git 44 | images: | 45 | ${{ secrets.DOCKERHUB_REPO }} 46 | ghcr.io/${{ github.repository }} 47 | tags: | 48 | type=raw,value=latest,priority=100 49 | type=raw,value=${{ vars.MAJOR }}.${{ vars.MINOR }} 50 | labels: | 51 | org.opencontainers.image.title=${{ vars.NAME }} 52 | env: 53 | DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest 54 | - 55 | name: Set up Docker Buildx 56 | uses: docker/setup-buildx-action@v3 57 | - 58 | name: Login into Docker Hub 59 | uses: docker/login-action@v3 60 | with: 61 | username: ${{ secrets.DOCKERHUB_USERNAME }} 62 | password: ${{ secrets.DOCKERHUB_TOKEN }} 63 | - 64 | name: Login to GitHub Container Registry 65 | uses: docker/login-action@v3 66 | with: 67 | registry: ghcr.io 68 | username: ${{ github.actor }} 69 | password: ${{ secrets.GITHUB_TOKEN }} 70 | - 71 | name: Build Docker image 72 | uses: docker/build-push-action@v6 73 | with: 74 | context: . 75 | push: true 76 | provenance: false 77 | platforms: linux/amd64 78 | tags: ${{ steps.meta.outputs.tags }} 79 | labels: ${{ steps.meta.outputs.labels }} 80 | annotations: ${{ steps.meta.outputs.annotations }} 81 | build-args: | 82 | VERSION_ARG=${{ steps.meta.outputs.version }} 83 | - 84 | name: Create a release 85 | uses: action-pack/github-release@v2 86 | with: 87 | tag: "v${{ steps.meta.outputs.version }}" 88 | title: "v${{ steps.meta.outputs.version }}" 89 | token: ${{ secrets.REPO_ACCESS_TOKEN }} 90 | - 91 | name: Increment version variable 92 | uses: action-pack/bump@v2 93 | with: 94 | token: ${{ secrets.REPO_ACCESS_TOKEN }} 95 | - 96 | name: Send mail 97 | uses: action-pack/send-mail@v1 98 | with: 99 | to: ${{secrets.MAILTO}} 100 | from: Github Actions <${{secrets.MAILTO}}> 101 | connection_url: ${{secrets.MAIL_CONNECTION}} 102 | subject: Build of ${{ github.event.repository.name }} v${{ steps.meta.outputs.version }} completed 103 | body: | 104 | The build job of ${{ github.event.repository.name }} v${{ steps.meta.outputs.version }} was completed successfully! 105 | 106 | See https://github.com/${{ github.repository }}/actions for more information. 107 | -------------------------------------------------------------------------------- /.github/workflows/check.yml: -------------------------------------------------------------------------------- 1 | on: [workflow_call] 2 | name: "Check" 3 | permissions: {} 4 | 5 | jobs: 6 | shellcheck: 7 | name: shellcheck 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v4 11 | - name: Run ShellCheck 12 | uses: ludeeus/action-shellcheck@master 13 | env: 14 | SHELLCHECK_OPTS: -x --source-path=src -e SC1091 -e SC2001 -e SC2002 -e SC2034 -e SC2064 -e SC2153 -e SC2317 -e SC2028 15 | - name: Lint Dockerfile 16 | uses: hadolint/hadolint-action@v3.1.0 17 | with: 18 | dockerfile: Dockerfile 19 | ignore: DL3008,DL3018,DL3020,DL3029,DL3059 20 | failure-threshold: warning 21 | -------------------------------------------------------------------------------- /.github/workflows/hub.yml: -------------------------------------------------------------------------------- 1 | name: Update 2 | on: 3 | push: 4 | branches: 5 | - master 6 | paths: 7 | - readme.md 8 | - README.md 9 | - .github/workflows/hub.yml 10 | 11 | jobs: 12 | dockerHubDescription: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v4 16 | - 17 | name: Docker Hub Description 18 | uses: peter-evans/dockerhub-description@v4 19 | with: 20 | username: ${{ secrets.DOCKERHUB_USERNAME }} 21 | password: ${{ secrets.DOCKERHUB_TOKEN }} 22 | repository: ${{ secrets.DOCKERHUB_REPO }} 23 | short-description: ${{ github.event.repository.description }} 24 | readme-filepath: ./readme.md 25 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | on: 2 | workflow_dispatch: 3 | pull_request: 4 | paths: 5 | - '**/*.sh' 6 | - '.github/workflows/test.yml' 7 | - '.github/workflows/check.yml' 8 | - 'Dockerfile' 9 | 10 | name: "Test" 11 | permissions: {} 12 | 13 | jobs: 14 | shellcheck: 15 | name: Test 16 | uses: ./.github/workflows/check.yml 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM --platform=$BUILDPLATFORM alpine:3.21 AS builder 2 | 3 | ARG VERSION_OPENCORE="1.0.4" 4 | ARG REPO_OPENCORE="https://github.com/acidanthera/OpenCorePkg" 5 | ADD $REPO_OPENCORE/releases/download/$VERSION_OPENCORE/OpenCore-$VERSION_OPENCORE-RELEASE.zip /tmp/opencore.zip 6 | 7 | RUN apk --update --no-cache add unzip && \ 8 | unzip /tmp/opencore.zip -d /tmp/oc && \ 9 | cp /tmp/oc/Utilities/macserial/macserial.linux /macserial && \ 10 | rm -rf /tmp/* /var/tmp/* /var/cache/apk/* 11 | 12 | FROM scratch AS runner 13 | COPY --from=qemux/qemu:7.12 / / 14 | 15 | ARG VERSION_ARG="0.0" 16 | ARG VERSION_KVM_OPENCORE="v21" 17 | ARG VERSION_OSX_KVM="326053dd61f49375d5dfb28ee715d38b04b5cd8e" 18 | ARG REPO_OSX_KVM="https://raw.githubusercontent.com/kholia/OSX-KVM" 19 | ARG REPO_KVM_OPENCORE="https://github.com/thenickdude/KVM-Opencore" 20 | 21 | ARG DEBCONF_NOWARNINGS="yes" 22 | ARG DEBIAN_FRONTEND="noninteractive" 23 | ARG DEBCONF_NONINTERACTIVE_SEEN="true" 24 | 25 | RUN set -eu && \ 26 | apt-get update && \ 27 | apt-get --no-install-recommends -y install \ 28 | xxd \ 29 | fdisk \ 30 | mtools && \ 31 | apt-get clean && \ 32 | echo "$VERSION_ARG" > /run/version && \ 33 | rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 34 | 35 | COPY --chmod=755 ./src /run/ 36 | COPY --chmod=755 ./assets /assets/ 37 | COPY --chmod=755 --from=builder /macserial /usr/local/bin/ 38 | 39 | ADD --chmod=644 \ 40 | $REPO_OSX_KVM/$VERSION_OSX_KVM/OVMF_CODE.fd \ 41 | $REPO_OSX_KVM/$VERSION_OSX_KVM/OVMF_VARS.fd \ 42 | $REPO_OSX_KVM/$VERSION_OSX_KVM/OVMF_VARS-1024x768.fd \ 43 | $REPO_OSX_KVM/$VERSION_OSX_KVM/OVMF_VARS-1920x1080.fd /usr/share/OVMF/ 44 | 45 | ADD $REPO_KVM_OPENCORE/releases/download/$VERSION_KVM_OPENCORE/OpenCore-$VERSION_KVM_OPENCORE.iso.gz /opencore.iso.gz 46 | 47 | VOLUME /storage 48 | EXPOSE 5900 8006 49 | 50 | ENV VERSION="13" 51 | ENV RAM_SIZE="4G" 52 | ENV CPU_CORES="2" 53 | ENV DISK_SIZE="64G" 54 | 55 | ENTRYPOINT ["/usr/bin/tini", "-s", "/run/entry.sh"] 56 | -------------------------------------------------------------------------------- /assets/config.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ACPI 6 | 7 | Add 8 | 9 | 10 | Comment 11 | My custom DSDT 12 | Enabled 13 | 14 | Path 15 | DSDT.aml 16 | 17 | 18 | Comment 19 | My custom SSDT 20 | Enabled 21 | 22 | Path 23 | SSDT-1.aml 24 | 25 | 26 | Comment 27 | Read the comment in dsl sample 28 | Enabled 29 | 30 | Path 31 | SSDT-ALS0.aml 32 | 33 | 34 | Comment 35 | Read the comment in dsl sample 36 | Enabled 37 | 38 | Path 39 | SSDT-AWAC-DISABLE.aml 40 | 41 | 42 | Comment 43 | Read the comment in dsl sample 44 | Enabled 45 | 46 | Path 47 | SSDT-BRG0.aml 48 | 49 | 50 | Comment 51 | Read the comment in dsl sample 52 | Enabled 53 | 54 | Path 55 | SSDT-EC-USBX.aml 56 | 57 | 58 | Comment 59 | Fake EC and USBX Power 60 | Enabled 61 | 62 | Path 63 | SSDT-EC.aml 64 | 65 | 66 | Comment 67 | Read the comment in dsl sample 68 | Enabled 69 | 70 | Path 71 | SSDT-EHCx-DISABLE.aml 72 | 73 | 74 | Comment 75 | Read the comment in dsl sample 76 | Enabled 77 | 78 | Path 79 | SSDT-IMEI.aml 80 | 81 | 82 | Comment 83 | CPU AGPM Plugin=1 84 | Enabled 85 | 86 | Path 87 | SSDT-PLUG.aml 88 | 89 | 90 | Comment 91 | Read the comment in dsl sample 92 | Enabled 93 | 94 | Path 95 | SSDT-PMC.aml 96 | 97 | 98 | Comment 99 | Read the comment in dsl sample 100 | Enabled 101 | 102 | Path 103 | SSDT-PNLF.aml 104 | 105 | 106 | Comment 107 | Read the comment in dsl sample 108 | Enabled 109 | 110 | Path 111 | SSDT-RTC0-RANGE.aml 112 | 113 | 114 | Comment 115 | Read the comment in dsl sample 116 | Enabled 117 | 118 | Path 119 | SSDT-RTC0.aml 120 | 121 | 122 | Comment 123 | Read the comment in dsl sample 124 | Enabled 125 | 126 | Path 127 | SSDT-SBUS-MCHC.aml 128 | 129 | 130 | Comment 131 | Read the comment in dsl sample 132 | Enabled 133 | 134 | Path 135 | SSDT-UNC.aml 136 | 137 | 138 | Comment 139 | add DTGP method 140 | Enabled 141 | 142 | Path 143 | SSDT-DTGP.aml 144 | 145 | 146 | Comment 147 | USB 2.0 Injection 148 | Enabled 149 | 150 | Path 151 | SSDT-EHCI.aml 152 | 153 | 154 | Delete 155 | 156 | 157 | All 158 | 159 | Comment 160 | Delete CpuPm 161 | Enabled 162 | 163 | OemTableId 164 | Q3B1UG0AAAA= 165 | TableLength 166 | 0 167 | TableSignature 168 | U1NEVA== 169 | 170 | 171 | All 172 | 173 | Comment 174 | Delete Cpu0Ist 175 | Enabled 176 | 177 | OemTableId 178 | Q3B1MElzdAA= 179 | TableLength 180 | 0 181 | TableSignature 182 | U1NEVA== 183 | 184 | 185 | Patch 186 | 187 | 188 | Base 189 | 190 | BaseSkip 191 | 0 192 | Comment 193 | Replace one byte sequence with another 194 | Count 195 | 0 196 | Enabled 197 | 198 | Find 199 | ESIzRA== 200 | Limit 201 | 0 202 | Mask 203 | 204 | OemTableId 205 | 206 | Replace 207 | RDMiEQ== 208 | ReplaceMask 209 | 210 | Skip 211 | 0 212 | TableLength 213 | 0 214 | TableSignature 215 | 216 | 217 | 218 | Base 219 | \_SB.PCI0.LPCB.HPET 220 | BaseSkip 221 | 0 222 | Comment 223 | HPET _CRS to XCRS 224 | Count 225 | 1 226 | Enabled 227 | 228 | Find 229 | X0NSUw== 230 | Limit 231 | 0 232 | Mask 233 | 234 | OemTableId 235 | 236 | Replace 237 | WENSUw== 238 | ReplaceMask 239 | 240 | Skip 241 | 0 242 | TableLength 243 | 0 244 | TableSignature 245 | 246 | 247 | 248 | Quirks 249 | 250 | FadtEnableReset 251 | 252 | NormalizeHeaders 253 | 254 | RebaseRegions 255 | 256 | ResetHwSig 257 | 258 | ResetLogoStatus 259 | 260 | SyncTableIds 261 | 262 | 263 | 264 | Booter 265 | 266 | MmioWhitelist 267 | 268 | Patch 269 | 270 | Quirks 271 | 272 | AllowRelocationBlock 273 | 274 | AvoidRuntimeDefrag 275 | 276 | DevirtualiseMmio 277 | 278 | DisableSingleUser 279 | 280 | DisableVariableWrite 281 | 282 | DiscardHibernateMap 283 | 284 | EnableSafeModeSlide 285 | 286 | EnableWriteUnprotector 287 | 288 | FixupAppleEfiImages 289 | 290 | ForceBooterSignature 291 | 292 | ForceExitBootServices 293 | 294 | ProtectMemoryRegions 295 | 296 | ProtectSecureBoot 297 | 298 | ProtectUefiServices 299 | 300 | ProvideCustomSlide 301 | 302 | ProvideMaxSlide 303 | 0 304 | RebuildAppleMemoryMap 305 | 306 | ResizeAppleGpuBars 307 | -1 308 | SetupVirtualMap 309 | 310 | SignalAppleOS 311 | 312 | SyncRuntimePermissions 313 | 314 | 315 | 316 | DeviceProperties 317 | 318 | Add 319 | 320 | PciRoot(0x1)/Pci(0x1F,0x0) 321 | 322 | compatible 323 | pci8086,2916 324 | device-id 325 | 326 | FikA 327 | 328 | name 329 | pci8086,2916 330 | 331 | 332 | Delete 333 | 334 | 335 | Kernel 336 | 337 | Add 338 | 339 | 340 | Arch 341 | Any 342 | BundlePath 343 | Lilu.kext 344 | Comment 345 | Patch engine 346 | Enabled 347 | 348 | ExecutablePath 349 | Contents/MacOS/Lilu 350 | MaxKernel 351 | 352 | MinKernel 353 | 8.0.0 354 | PlistPath 355 | Contents/Info.plist 356 | 357 | 358 | Arch 359 | Any 360 | BundlePath 361 | VirtualSMC.kext 362 | Comment 363 | SMC emulator 364 | Enabled 365 | 366 | ExecutablePath 367 | Contents/MacOS/VirtualSMC 368 | MaxKernel 369 | 370 | MinKernel 371 | 8.0.0 372 | PlistPath 373 | Contents/Info.plist 374 | 375 | 376 | Arch 377 | x86_64 378 | BundlePath 379 | WhateverGreen.kext 380 | Comment 381 | Video patches 382 | Enabled 383 | 384 | ExecutablePath 385 | Contents/MacOS/WhateverGreen 386 | MaxKernel 387 | 388 | MinKernel 389 | 10.0.0 390 | PlistPath 391 | Contents/Info.plist 392 | 393 | 394 | Arch 395 | Any 396 | BundlePath 397 | AppleALC.kext 398 | Comment 399 | Audio patches 400 | Enabled 401 | 402 | ExecutablePath 403 | Contents/MacOS/AppleALC 404 | MaxKernel 405 | 406 | MinKernel 407 | 8.0.0 408 | PlistPath 409 | Contents/Info.plist 410 | 411 | 412 | Arch 413 | x86_64 414 | BundlePath 415 | IntelMausi.kext 416 | Comment 417 | Intel Ethernet LAN 418 | Enabled 419 | 420 | ExecutablePath 421 | Contents/MacOS/IntelMausi 422 | MaxKernel 423 | 424 | MinKernel 425 | 13.0.0 426 | PlistPath 427 | Contents/Info.plist 428 | 429 | 430 | Arch 431 | x86_64 432 | BundlePath 433 | Legacy_USB3.kext 434 | Comment 435 | XHC ports configuration 436 | Enabled 437 | 438 | ExecutablePath 439 | 440 | MaxKernel 441 | 442 | MinKernel 443 | 15.0.0 444 | PlistPath 445 | Contents/Info.plist 446 | 447 | 448 | Arch 449 | x86_64 450 | BundlePath 451 | MCEReporterDisabler.kext 452 | Comment 453 | AppleMCEReporter disabler 454 | Enabled 455 | 456 | ExecutablePath 457 | 458 | MaxKernel 459 | 460 | MinKernel 461 | 19.0.0 462 | PlistPath 463 | Contents/Info.plist 464 | 465 | 466 | Arch 467 | x86_64 468 | BundlePath 469 | VoodooPS2Controller.kext 470 | Comment 471 | 472 | Enabled 473 | 474 | ExecutablePath 475 | Contents/MacOS/VoodooPS2Controller 476 | MaxKernel 477 | 478 | MinKernel 479 | 15.0.0 480 | PlistPath 481 | Contents/Info.plist 482 | 483 | 484 | Arch 485 | x86_64 486 | BundlePath 487 | VoodooPS2Controller.kext/Contents/PlugIns/VoodooPS2Keyboard.kext 488 | Comment 489 | 490 | Enabled 491 | 492 | ExecutablePath 493 | Contents/MacOS/VoodooPS2Keyboard 494 | MaxKernel 495 | 496 | MinKernel 497 | 15.0.0 498 | PlistPath 499 | Contents/Info.plist 500 | 501 | 502 | Arch 503 | x86_64 504 | BundlePath 505 | VoodooPS2Controller.kext/Contents/PlugIns/VoodooPS2Mouse.kext 506 | Comment 507 | 508 | Enabled 509 | 510 | ExecutablePath 511 | Contents/MacOS/VoodooPS2Mouse 512 | MaxKernel 513 | 514 | MinKernel 515 | 15.0.0 516 | PlistPath 517 | Contents/Info.plist 518 | 519 | 520 | Arch 521 | x86_64 522 | BundlePath 523 | VoodooPS2Controller.kext/Contents/PlugIns/VoodooPS2Trackpad.kext 524 | Comment 525 | 526 | Enabled 527 | 528 | ExecutablePath 529 | Contents/MacOS/VoodooPS2Trackpad 530 | MaxKernel 531 | 532 | MinKernel 533 | 15.0.0 534 | PlistPath 535 | Contents/Info.plist 536 | 537 | 538 | Arch 539 | x86_64 540 | BundlePath 541 | VoodooPS2Controller.kext/Contents/PlugIns/VoodooInput.kext 542 | Comment 543 | 544 | Enabled 545 | 546 | ExecutablePath 547 | Contents/MacOS/VoodooInput 548 | MaxKernel 549 | 550 | MinKernel 551 | 15.0.0 552 | PlistPath 553 | Contents/Info.plist 554 | 555 | 556 | Arch 557 | x86_64 558 | BundlePath 559 | USBPorts.kext 560 | Comment 561 | 562 | Enabled 563 | 564 | ExecutablePath 565 | 566 | MaxKernel 567 | 568 | MinKernel 569 | 570 | PlistPath 571 | Contents/Info.plist 572 | 573 | 574 | Arch 575 | x86_64 576 | BundlePath 577 | AGPMInjector.kext 578 | Comment 579 | 580 | Enabled 581 | 582 | ExecutablePath 583 | 584 | MaxKernel 585 | 586 | MinKernel 587 | 588 | PlistPath 589 | Contents/Info.plist 590 | 591 | 592 | Arch 593 | x86_64 594 | BundlePath 595 | BrcmFirmwareData.kext 596 | Comment 597 | Bluetooth firmware 598 | Enabled 599 | 600 | ExecutablePath 601 | Contents/MacOS/BrcmFirmwareData 602 | MaxKernel 603 | 604 | MinKernel 605 | 606 | PlistPath 607 | Contents/Info.plist 608 | 609 | 610 | Arch 611 | x86_64 612 | BundlePath 613 | BrcmNonPatchRAM2.kext 614 | Comment 615 | Bluetooth support for macOS 10.11-10.14 616 | Enabled 617 | 618 | ExecutablePath 619 | Contents/MacOS/BrcmNonPatchRAM2 620 | MaxKernel 621 | 18.99.99 622 | MinKernel 623 | 15.0.0 624 | PlistPath 625 | Contents/Info.plist 626 | 627 | 628 | Arch 629 | x86_64 630 | BundlePath 631 | BrcmPatchRAM2.kext 632 | Comment 633 | Bluetooth support for macOS 10.11-10.14 634 | Enabled 635 | 636 | ExecutablePath 637 | Contents/MacOS/BrcmPatchRAM2 638 | MaxKernel 639 | 18.99.99 640 | MinKernel 641 | 15.0.0 642 | PlistPath 643 | Contents/Info.plist 644 | 645 | 646 | Arch 647 | x86_64 648 | BundlePath 649 | BrcmPatchRAM3.kext 650 | Comment 651 | Bluetooth support for macOS 10.15- 652 | Enabled 653 | 654 | ExecutablePath 655 | Contents/MacOS/BrcmPatchRAM3 656 | MaxKernel 657 | 658 | MinKernel 659 | 19.0.0 660 | PlistPath 661 | Contents/Info.plist 662 | 663 | 664 | Arch 665 | x86_64 666 | BundlePath 667 | BrcmBluetoothInjector.kext 668 | Comment 669 | Bluetooth support for macOS 10.15-11 670 | Enabled 671 | 672 | ExecutablePath 673 | 674 | MaxKernel 675 | 20.99.99 676 | MinKernel 677 | 19.0.0 678 | PlistPath 679 | Contents/Info.plist 680 | 681 | 682 | Arch 683 | x86_64 684 | BundlePath 685 | BlueToolFixup.kext 686 | Comment 687 | Bluetooth support for macOS 12- 688 | Enabled 689 | 690 | ExecutablePath 691 | Contents/MacOS/BlueToolFixup 692 | MaxKernel 693 | 694 | MinKernel 695 | 21.0.0 696 | PlistPath 697 | Contents/Info.plist 698 | 699 | 700 | Arch 701 | x86_64 702 | BundlePath 703 | CryptexFixup.kext 704 | Comment 705 | Support for non-AVX2 CPUs in Ventura/Sonoma 706 | Enabled 707 | 708 | ExecutablePath 709 | Contents/MacOS/CryptexFixup 710 | MaxKernel 711 | 23.99.99 712 | MinKernel 713 | 22.1.0 714 | PlistPath 715 | Contents/Info.plist 716 | 717 | 718 | Block 719 | 720 | 721 | Arch 722 | Any 723 | Comment 724 | 725 | Enabled 726 | 727 | Identifier 728 | com.apple.driver.AppleTyMCEDriver 729 | MaxKernel 730 | 731 | MinKernel 732 | 733 | Strategy 734 | Disable 735 | 736 | 737 | Emulate 738 | 739 | Cpuid1Data 740 | 741 | VAYFAAAAAAAAAAAAAAAAAA== 742 | 743 | Cpuid1Mask 744 | 745 | ////AAAAAAAAAAAAAAAAAA== 746 | 747 | DummyPowerManagement 748 | 749 | MaxKernel 750 | 751 | MinKernel 752 | 753 | 754 | Force 755 | 756 | 757 | Arch 758 | Any 759 | BundlePath 760 | System/Library/Extensions/IONetworkingFamily.kext 761 | Comment 762 | 763 | Enabled 764 | 765 | ExecutablePath 766 | Contents/MacOS/IONetworkingFamily 767 | Identifier 768 | com.apple.iokit.IONetworkingFamily 769 | MaxKernel 770 | 13.99.99 771 | MinKernel 772 | 773 | PlistPath 774 | Contents/Info.plist 775 | 776 | 777 | Patch 778 | 779 | 780 | Arch 781 | x86_64 782 | Base 783 | 784 | Comment 785 | algrey - cpuid_set_cpufamily - force CPUFAMILY_INTEL_PENRYN 786 | Count 787 | 1 788 | Enabled 789 | 790 | Find 791 | 792 | MduAPQAAAAAGdQA= 793 | 794 | Identifier 795 | kernel 796 | Limit 797 | 0 798 | Mask 799 | 800 | /////wAAAP///wA= 801 | 802 | MaxKernel 803 | 20.3.99 804 | MinKernel 805 | 17.0.0 806 | Replace 807 | 808 | u7xP6njpXQAAAJA= 809 | 810 | ReplaceMask 811 | 812 | 813 | Skip 814 | 0 815 | 816 | 817 | Arch 818 | x86_64 819 | Base 820 | 821 | Comment 822 | algrey - thenickdude - cpuid_set_cpufamily - force CPUFAMILY_INTEL_PENRYN (Big Sur 11.3+, Monterey, Ventura, Sonoma) 823 | Count 824 | 1 825 | Enabled 826 | 827 | Find 828 | 829 | MdKzAYA9AAAAAAZ1 830 | 831 | Identifier 832 | kernel 833 | Limit 834 | 0 835 | Mask 836 | 837 | ////////AAAAAP// 838 | 839 | MaxKernel 840 | 23.99.99 841 | MinKernel 842 | 20.4.0 843 | Replace 844 | 845 | urxP6nizAJCQkJDr 846 | 847 | ReplaceMask 848 | 849 | 850 | Skip 851 | 0 852 | 853 | 854 | Arch 855 | x86_64 856 | Base 857 | _early_random 858 | Comment 859 | SurPlus v1 - PART 1 of 2 - Patch read_erandom (inlined in _early_random) 860 | Count 861 | 1 862 | Enabled 863 | 864 | Find 865 | AHQjSIs= 866 | Identifier 867 | kernel 868 | Limit 869 | 800 870 | Mask 871 | 872 | MaxKernel 873 | 21.1.0 874 | MinKernel 875 | 20.4.0 876 | Replace 877 | AOsjSIs= 878 | ReplaceMask 879 | 880 | Skip 881 | 0 882 | 883 | 884 | Arch 885 | x86_64 886 | Base 887 | _register_and_init_prng 888 | Comment 889 | SurPlus v1 - PART 2 of 2 - Patch register_and_init_prng 890 | Count 891 | 1 892 | Enabled 893 | 894 | Find 895 | ukgBAAAx9g== 896 | Identifier 897 | kernel 898 | Limit 899 | 256 900 | Mask 901 | 902 | MaxKernel 903 | 21.1.0 904 | MinKernel 905 | 20.4.0 906 | Replace 907 | ukgBAADrBQ== 908 | ReplaceMask 909 | 910 | Skip 911 | 0 912 | 913 | 914 | Arch 915 | x86_64 916 | Base 917 | _apfs_filevault_allowed 918 | Comment 919 | Force FileVault on Broken Seal (from OCLP project, for non-AVX2 Ventura/Sonoma) 920 | Count 921 | 0 922 | Enabled 923 | 924 | Find 925 | 926 | Identifier 927 | com.apple.filesystems.apfs 928 | Limit 929 | 0 930 | Mask 931 | 932 | MaxKernel 933 | 23.99.99 934 | MinKernel 935 | 22.1.0 936 | Replace 937 | uAEAAADD 938 | ReplaceMask 939 | 940 | Skip 941 | 0 942 | 943 | 944 | Quirks 945 | 946 | AppleCpuPmCfgLock 947 | 948 | AppleXcpmCfgLock 949 | 950 | AppleXcpmExtraMsrs 951 | 952 | AppleXcpmForceBoost 953 | 954 | CustomPciSerialDevice 955 | 956 | CustomSMBIOSGuid 957 | 958 | DisableIoMapper 959 | 960 | DisableIoMapperMapping 961 | 962 | DisableLinkeditJettison 963 | 964 | DisableRtcChecksum 965 | 966 | ExtendBTFeatureFlags 967 | 968 | ExternalDiskIcons 969 | 970 | ForceAquantiaEthernet 971 | 972 | ForceSecureBootScheme 973 | 974 | IncreasePciBarSize 975 | 976 | LapicKernelPanic 977 | 978 | LegacyCommpage 979 | 980 | PanicNoKextDump 981 | 982 | PowerTimeoutKernelPanic 983 | 984 | ProvideCurrentCpuInfo 985 | 986 | SetApfsTrimTimeout 987 | 0 988 | ThirdPartyDrives 989 | 990 | XhciPortLimit 991 | 992 | 993 | Scheme 994 | 995 | CustomKernel 996 | 997 | FuzzyMatch 998 | 999 | KernelArch 1000 | Auto 1001 | KernelCache 1002 | Auto 1003 | 1004 | 1005 | Misc 1006 | 1007 | BlessOverride 1008 | 1009 | Boot 1010 | 1011 | ConsoleAttributes 1012 | 0 1013 | HibernateMode 1014 | Auto 1015 | HibernateSkipsPicker 1016 | 1017 | HideAuxiliary 1018 | 1019 | InstanceIdentifier 1020 | 1021 | LauncherOption 1022 | Disabled 1023 | LauncherPath 1024 | Default 1025 | PickerAttributes 1026 | 17 1027 | PickerAudioAssist 1028 | 1029 | PickerMode 1030 | External 1031 | PickerVariant 1032 | Auto 1033 | PollAppleHotKeys 1034 | 1035 | ShowPicker 1036 | 1037 | TakeoffDelay 1038 | 0 1039 | Timeout 1040 | 0 1041 | 1042 | Debug 1043 | 1044 | AppleDebug 1045 | 1046 | ApplePanic 1047 | 1048 | DisableWatchDog 1049 | 1050 | DisplayDelay 1051 | 0 1052 | DisplayLevel 1053 | 2147483650 1054 | LogModules 1055 | * 1056 | SysReport 1057 | 1058 | Target 1059 | 3 1060 | 1061 | Entries 1062 | 1063 | Security 1064 | 1065 | AllowSetDefault 1066 | 1067 | ApECID 1068 | 0 1069 | AuthRestart 1070 | 1071 | BlacklistAppleUpdate 1072 | 1073 | DmgLoading 1074 | Signed 1075 | EnablePassword 1076 | 1077 | ExposeSensitiveData 1078 | 6 1079 | HaltLevel 1080 | 2147483648 1081 | PasswordHash 1082 | 1083 | PasswordSalt 1084 | 1085 | ScanPolicy 1086 | 18809603 1087 | SecureBootModel 1088 | Disabled 1089 | Vault 1090 | Optional 1091 | 1092 | Serial 1093 | 1094 | Init 1095 | 1096 | Override 1097 | 1098 | 1099 | Tools 1100 | 1101 | 1102 | Arguments 1103 | 1104 | Auxiliary 1105 | 1106 | Comment 1107 | Not signed for security reasons 1108 | Enabled 1109 | 1110 | Flavour 1111 | OpenShell:UEFIShell:Shell 1112 | FullNvramAccess 1113 | 1114 | Name 1115 | UEFI Shell 1116 | Path 1117 | Shell.efi 1118 | RealPath 1119 | 1120 | TextMode 1121 | 1122 | 1123 | 1124 | Arguments 1125 | 1126 | Auxiliary 1127 | 1128 | Comment 1129 | Memory testing utility 1130 | Enabled 1131 | 1132 | Flavour 1133 | MemTest 1134 | FullNvramAccess 1135 | 1136 | Name 1137 | memtest86 1138 | Path 1139 | memtest86/BOOTX64.efi 1140 | RealPath 1141 | 1142 | TextMode 1143 | 1144 | 1145 | 1146 | Arguments 1147 | Shutdown 1148 | Auxiliary 1149 | 1150 | Comment 1151 | Perform shutdown 1152 | Enabled 1153 | 1154 | Flavour 1155 | Auto 1156 | FullNvramAccess 1157 | 1158 | Name 1159 | Shutdown 1160 | Path 1161 | ResetSystem.efi 1162 | RealPath 1163 | 1164 | TextMode 1165 | 1166 | 1167 | 1168 | 1169 | NVRAM 1170 | 1171 | Add 1172 | 1173 | 4D1EDE05-38C7-4A6A-9CC6-4BCCA8B38C14 1174 | 1175 | DefaultBackgroundColor 1176 | AAAAAA== 1177 | 1178 | 4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102 1179 | 1180 | rtc-blacklist 1181 | 1182 | 1183 | 7C436110-AB2A-4BBB-A880-FE41995C9F82 1184 | 1185 | #INFO (prev-lang:kbd) 1186 | en:252 (ABC), set 656e3a323532 1187 | ForceDisplayRotationInEFI 1188 | 0 1189 | SystemAudioVolume 1190 | Rg== 1191 | boot-args 1192 | keepsyms=1 1193 | csr-active-config 1194 | Jg8= 1195 | prev-lang:kbd 1196 | ZW4tVVM6MA== 1197 | run-efi-updater 1198 | No 1199 | 1200 | 1201 | Delete 1202 | 1203 | 4D1EDE05-38C7-4A6A-9CC6-4BCCA8B38C14 1204 | 1205 | DefaultBackgroundColor 1206 | 1207 | 4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102 1208 | 1209 | rtc-blacklist 1210 | 1211 | 7C436110-AB2A-4BBB-A880-FE41995C9F82 1212 | 1213 | boot-args 1214 | ForceDisplayRotationInEFI 1215 | 1216 | 1217 | LegacyOverwrite 1218 | 1219 | LegacySchema 1220 | 1221 | 7C436110-AB2A-4BBB-A880-FE41995C9F82 1222 | 1223 | EFILoginHiDPI 1224 | EFIBluetoothDelay 1225 | LocationServicesEnabled 1226 | SystemAudioVolume 1227 | SystemAudioVolumeDB 1228 | SystemAudioVolumeSaved 1229 | bluetoothActiveControllerInfo 1230 | bluetoothInternalControllerInfo 1231 | flagstate 1232 | fmm-computer-name 1233 | fmm-mobileme-token-FMM 1234 | fmm-mobileme-token-FMM-BridgeHasAccount 1235 | nvda_drv 1236 | prev-lang:kbd 1237 | backlight-level 1238 | BootCampHD 1239 | 1240 | 8BE4DF61-93CA-11D2-AA0D-00E098032B8C 1241 | 1242 | Boot0080 1243 | Boot0081 1244 | Boot0082 1245 | BootNext 1246 | BootOrder 1247 | 1248 | 1249 | WriteFlash 1250 | 1251 | 1252 | PlatformInfo 1253 | 1254 | Automatic 1255 | 1256 | CustomMemory 1257 | 1258 | Generic 1259 | 1260 | AdviseFeatures 1261 | 1262 | MLB 1263 | C02717306J9JG361M 1264 | MaxBIOSVersion 1265 | 1266 | ProcessorType 1267 | 0 1268 | ROM 1269 | m7zhIYfl 1270 | SpoofVendor 1271 | 1272 | SystemMemoryStatus 1273 | Auto 1274 | SystemProductName 1275 | iMacPro1,1 1276 | SystemSerialNumber 1277 | C02TM2ZBHX87 1278 | SystemUUID 1279 | 007076A6-F2A2-4461-BBE5-BAD019F8025A 1280 | 1281 | UpdateDataHub 1282 | 1283 | UpdateNVRAM 1284 | 1285 | UpdateSMBIOS 1286 | 1287 | UpdateSMBIOSMode 1288 | Create 1289 | UseRawUuidEncoding 1290 | 1291 | 1292 | UEFI 1293 | 1294 | APFS 1295 | 1296 | EnableJumpstart 1297 | 1298 | GlobalConnect 1299 | 1300 | HideVerbose 1301 | 1302 | JumpstartHotPlug 1303 | 1304 | MinDate 1305 | -1 1306 | MinVersion 1307 | -1 1308 | 1309 | AppleInput 1310 | 1311 | AppleEvent 1312 | Builtin 1313 | CustomDelays 1314 | 1315 | GraphicsInputMirroring 1316 | 1317 | KeyInitialDelay 1318 | 50 1319 | KeySubsequentDelay 1320 | 5 1321 | PointerDwellClickTimeout 1322 | 0 1323 | PointerDwellDoubleClickTimeout 1324 | 0 1325 | PointerDwellRadius 1326 | 0 1327 | PointerPollMask 1328 | -1 1329 | PointerPollMax 1330 | 80 1331 | PointerPollMin 1332 | 10 1333 | PointerSpeedDiv 1334 | 1 1335 | PointerSpeedMul 1336 | 1 1337 | 1338 | Audio 1339 | 1340 | AudioCodec 1341 | 0 1342 | AudioDevice 1343 | 1344 | AudioOutMask 1345 | 1 1346 | AudioSupport 1347 | 1348 | DisconnectHda 1349 | 1350 | MaximumGain 1351 | -15 1352 | MinimumAssistGain 1353 | -30 1354 | MinimumAudibleGain 1355 | -55 1356 | PlayChime 1357 | Auto 1358 | ResetTrafficClass 1359 | 1360 | SetupDelay 1361 | 0 1362 | 1363 | ConnectDrivers 1364 | 1365 | Drivers 1366 | 1367 | 1368 | Arguments 1369 | 1370 | Comment 1371 | 1372 | Enabled 1373 | 1374 | LoadEarly 1375 | 1376 | Path 1377 | OpenVariableRuntimeDxe.efi 1378 | 1379 | 1380 | Arguments 1381 | 1382 | Comment 1383 | 1384 | Enabled 1385 | 1386 | LoadEarly 1387 | 1388 | Path 1389 | OpenRuntime.efi 1390 | 1391 | 1392 | Arguments 1393 | 1394 | Comment 1395 | HFS+ Driver 1396 | Enabled 1397 | 1398 | LoadEarly 1399 | 1400 | Path 1401 | OpenHfsPlus.efi 1402 | 1403 | 1404 | Arguments 1405 | 1406 | Comment 1407 | 1408 | Enabled 1409 | 1410 | LoadEarly 1411 | 1412 | Path 1413 | OpenCanopy.efi 1414 | 1415 | 1416 | Arguments 1417 | 1418 | Comment 1419 | 1420 | Enabled 1421 | 1422 | LoadEarly 1423 | 1424 | Path 1425 | AudioDxe.efi 1426 | 1427 | 1428 | Arguments 1429 | 1430 | Comment 1431 | 1432 | Enabled 1433 | 1434 | LoadEarly 1435 | 1436 | Path 1437 | OpenPartitionDxe.efi 1438 | 1439 | 1440 | Arguments 1441 | 1442 | Comment 1443 | 1444 | Enabled 1445 | 1446 | LoadEarly 1447 | 1448 | Path 1449 | OpenUsbKbDxe.efi 1450 | 1451 | 1452 | Arguments 1453 | 1454 | Comment 1455 | 1456 | Enabled 1457 | 1458 | LoadEarly 1459 | 1460 | Path 1461 | UsbMouseDxe.efi 1462 | 1463 | 1464 | Arguments 1465 | 1466 | Comment 1467 | 1468 | Enabled 1469 | 1470 | LoadEarly 1471 | 1472 | Path 1473 | Ps2KeyboardDxe.efi 1474 | 1475 | 1476 | Arguments 1477 | 1478 | Comment 1479 | 1480 | Enabled 1481 | 1482 | LoadEarly 1483 | 1484 | Path 1485 | Ps2MouseDxe.efi 1486 | 1487 | 1488 | Arguments 1489 | 1490 | Comment 1491 | 1492 | Enabled 1493 | 1494 | LoadEarly 1495 | 1496 | Path 1497 | HiiDatabase.efi 1498 | 1499 | 1500 | Arguments 1501 | 1502 | Comment 1503 | 1504 | Enabled 1505 | 1506 | LoadEarly 1507 | 1508 | Path 1509 | NvmExpressDxe.efi 1510 | 1511 | 1512 | Arguments 1513 | 1514 | Comment 1515 | 1516 | Enabled 1517 | 1518 | LoadEarly 1519 | 1520 | Path 1521 | XhciDxe.efi 1522 | 1523 | 1524 | Arguments 1525 | 1526 | Comment 1527 | 1528 | Enabled 1529 | 1530 | LoadEarly 1531 | 1532 | Path 1533 | ExFatDxe.efi 1534 | 1535 | 1536 | Arguments 1537 | 1538 | Comment 1539 | 1540 | Enabled 1541 | 1542 | LoadEarly 1543 | 1544 | Path 1545 | CrScreenshotDxe.efi 1546 | 1547 | 1548 | Arguments 1549 | 1550 | Comment 1551 | 1552 | Enabled 1553 | 1554 | LoadEarly 1555 | 1556 | Path 1557 | Ext4Dxe.efi 1558 | 1559 | 1560 | Arguments 1561 | 1562 | Comment 1563 | 1564 | Enabled 1565 | 1566 | LoadEarly 1567 | 1568 | Path 1569 | DpcDxe.efi 1570 | 1571 | 1572 | Arguments 1573 | 1574 | Comment 1575 | 1576 | Enabled 1577 | 1578 | LoadEarly 1579 | 1580 | Path 1581 | SnpDxe.efi 1582 | 1583 | 1584 | Arguments 1585 | 1586 | Comment 1587 | 1588 | Enabled 1589 | 1590 | LoadEarly 1591 | 1592 | Path 1593 | MnpDxe.efi 1594 | 1595 | 1596 | Arguments 1597 | 1598 | Comment 1599 | 1600 | Enabled 1601 | 1602 | LoadEarly 1603 | 1604 | Path 1605 | ArpDxe.efi 1606 | 1607 | 1608 | Arguments 1609 | 1610 | Comment 1611 | 1612 | Enabled 1613 | 1614 | LoadEarly 1615 | 1616 | Path 1617 | Dhcp4Dxe.efi 1618 | 1619 | 1620 | Arguments 1621 | 1622 | Comment 1623 | 1624 | Enabled 1625 | 1626 | LoadEarly 1627 | 1628 | Path 1629 | Ip4Dxe.efi 1630 | 1631 | 1632 | Arguments 1633 | 1634 | Comment 1635 | 1636 | Enabled 1637 | 1638 | LoadEarly 1639 | 1640 | Path 1641 | Udp4Dxe.efi 1642 | 1643 | 1644 | Arguments 1645 | 1646 | Comment 1647 | 1648 | Enabled 1649 | 1650 | LoadEarly 1651 | 1652 | Path 1653 | TcpDxe.efi 1654 | 1655 | 1656 | Arguments 1657 | 1658 | Comment 1659 | 1660 | Enabled 1661 | 1662 | LoadEarly 1663 | 1664 | Path 1665 | DnsDxe.efi 1666 | 1667 | 1668 | Arguments 1669 | 1670 | Comment 1671 | 1672 | Enabled 1673 | 1674 | LoadEarly 1675 | 1676 | Path 1677 | HttpDxe.efi 1678 | 1679 | 1680 | Arguments 1681 | 1682 | Comment 1683 | 1684 | Enabled 1685 | 1686 | LoadEarly 1687 | 1688 | Path 1689 | HttpUtilitiesDxe.efi 1690 | 1691 | 1692 | Arguments 1693 | 1694 | Comment 1695 | 1696 | Enabled 1697 | 1698 | LoadEarly 1699 | 1700 | Path 1701 | HttpBootDxe.efi 1702 | 1703 | 1704 | Arguments 1705 | 1706 | Comment 1707 | 1708 | Enabled 1709 | 1710 | LoadEarly 1711 | 1712 | Path 1713 | OpenLinuxBoot.efi 1714 | 1715 | 1716 | Arguments 1717 | 1718 | Comment 1719 | 1720 | Enabled 1721 | 1722 | LoadEarly 1723 | 1724 | Path 1725 | ResetNvramEntry.efi 1726 | 1727 | 1728 | Arguments 1729 | 1730 | Comment 1731 | 1732 | Enabled 1733 | 1734 | LoadEarly 1735 | 1736 | Path 1737 | ToggleSipEntry.efi 1738 | 1739 | 1740 | Arguments 1741 | 1742 | Comment 1743 | 1744 | Enabled 1745 | 1746 | LoadEarly 1747 | 1748 | Path 1749 | FirmwareSettingsEntry.efi 1750 | 1751 | 1752 | Input 1753 | 1754 | KeyFiltering 1755 | 1756 | KeyForgetThreshold 1757 | 5 1758 | KeySupport 1759 | 1760 | KeySupportMode 1761 | Auto 1762 | KeySwap 1763 | 1764 | PointerSupport 1765 | 1766 | PointerSupportMode 1767 | ASUS 1768 | TimerResolution 1769 | 50000 1770 | 1771 | Output 1772 | 1773 | ClearScreenOnModeSwitch 1774 | 1775 | ConsoleFont 1776 | 1777 | ConsoleMode 1778 | 1779 | DirectGopRendering 1780 | 1781 | ForceResolution 1782 | 1783 | GopBurstMode 1784 | 1785 | GopPassThrough 1786 | Disabled 1787 | IgnoreTextInGraphics 1788 | 1789 | InitialMode 1790 | Auto 1791 | ProvideConsoleGop 1792 | 1793 | ReconnectGraphicsOnConnect 1794 | 1795 | ReconnectOnResChange 1796 | 1797 | ReplaceTabWithSpace 1798 | 1799 | Resolution 1800 | 1920x1080@32 1801 | SanitiseClearScreen 1802 | 1803 | TextRenderer 1804 | BuiltinGraphics 1805 | UIScale 1806 | 0 1807 | UgaPassThrough 1808 | 1809 | 1810 | ProtocolOverrides 1811 | 1812 | AppleAudio 1813 | 1814 | AppleBootPolicy 1815 | 1816 | AppleDebugLog 1817 | 1818 | AppleEg2Info 1819 | 1820 | AppleFramebufferInfo 1821 | 1822 | AppleImageConversion 1823 | 1824 | AppleImg4Verification 1825 | 1826 | AppleKeyMap 1827 | 1828 | AppleRtcRam 1829 | 1830 | AppleSecureBoot 1831 | 1832 | AppleSmcIo 1833 | 1834 | AppleUserInterfaceTheme 1835 | 1836 | DataHub 1837 | 1838 | DeviceProperties 1839 | 1840 | FirmwareVolume 1841 | 1842 | HashServices 1843 | 1844 | OSInfo 1845 | 1846 | PciIo 1847 | 1848 | UnicodeCollation 1849 | 1850 | 1851 | Quirks 1852 | 1853 | ActivateHpetSupport 1854 | 1855 | DisableSecurityPolicy 1856 | 1857 | EnableVectorAcceleration 1858 | 1859 | EnableVmx 1860 | 1861 | ExitBootServicesDelay 1862 | 0 1863 | ForceOcWriteFlash 1864 | 1865 | ForgeUefiSupport 1866 | 1867 | IgnoreInvalidFlexRatio 1868 | 1869 | ReleaseUsbOwnership 1870 | 1871 | ReloadOptionRoms 1872 | 1873 | RequestBootVarRouting 1874 | 1875 | ResizeGpuBars 1876 | -1 1877 | ResizeUsePciRbIo 1878 | 1879 | ShimRetainProtocol 1880 | 1881 | TscSyncTimeout 1882 | 0 1883 | UnblockFsConnect 1884 | 1885 | 1886 | ReservedMemory 1887 | 1888 | 1889 | 1890 | 1891 | -------------------------------------------------------------------------------- /compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | macos: 3 | image: dockurr/macos 4 | container_name: macos 5 | environment: 6 | VERSION: "13" 7 | devices: 8 | - /dev/kvm 9 | - /dev/net/tun 10 | cap_add: 11 | - NET_ADMIN 12 | ports: 13 | - 8006:8006 14 | - 5900:5900/tcp 15 | - 5900:5900/udp 16 | volumes: 17 | - ./macos:/storage 18 | restart: always 19 | stop_grace_period: 2m 20 | -------------------------------------------------------------------------------- /kubernetes.yml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: v1 3 | kind: PersistentVolumeClaim 4 | metadata: 5 | name: macos-pvc 6 | spec: 7 | accessModes: 8 | - ReadWriteOnce 9 | resources: 10 | requests: 11 | storage: 64Gi 12 | --- 13 | apiVersion: apps/v1 14 | kind: Deployment 15 | metadata: 16 | name: macos 17 | labels: 18 | name: macos 19 | spec: 20 | replicas: 1 21 | selector: 22 | matchLabels: 23 | app: macos 24 | template: 25 | metadata: 26 | labels: 27 | app: macos 28 | spec: 29 | containers: 30 | - name: macos 31 | image: dockurr/macos 32 | env: 33 | - name: VERSION 34 | value: "13" 35 | - name: DISK_SIZE 36 | value: "64G" 37 | ports: 38 | - containerPort: 8006 39 | name: http 40 | protocol: TCP 41 | - containerPort: 5900 42 | name: vnc 43 | protocol: TCP 44 | securityContext: 45 | capabilities: 46 | add: 47 | - NET_ADMIN 48 | privileged: true 49 | volumeMounts: 50 | - mountPath: /storage 51 | name: storage 52 | - mountPath: /dev/kvm 53 | name: dev-kvm 54 | - mountPath: /dev/net/tun 55 | name: dev-tun 56 | terminationGracePeriodSeconds: 120 57 | volumes: 58 | - name: storage 59 | persistentVolumeClaim: 60 | claimName: macos-pvc 61 | - hostPath: 62 | path: /dev/kvm 63 | name: dev-kvm 64 | - hostPath: 65 | path: /dev/net/tun 66 | type: CharDevice 67 | name: dev-tun 68 | --- 69 | apiVersion: v1 70 | kind: Service 71 | metadata: 72 | name: macos 73 | spec: 74 | internalTrafficPolicy: Cluster 75 | ports: 76 | - name: http 77 | port: 8006 78 | protocol: TCP 79 | targetPort: 8006 80 | - name: vnc 81 | port: 5900 82 | protocol: TCP 83 | targetPort: 5900 84 | selector: 85 | app: macos 86 | type: ClusterIP 87 | -------------------------------------------------------------------------------- /license.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 |

OSX
2 |
3 | 4 |
5 |
6 | 7 | [![Build]][build_url] 8 | [![Version]][tag_url] 9 | [![Size]][tag_url] 10 | [![Package]][pkg_url] 11 | [![Pulls]][hub_url] 12 | 13 |

14 | 15 | OSX (macOS) inside a Docker container. 16 | 17 | ## Features ✨ 18 | 19 | - KVM acceleration 20 | - Web-based viewer 21 | - Automatic download 22 | 23 | ## Usage 🐳 24 | 25 | ##### Via Docker Compose: 26 | 27 | ```yaml 28 | services: 29 | macos: 30 | image: dockurr/macos 31 | container_name: macos 32 | environment: 33 | VERSION: "13" 34 | devices: 35 | - /dev/kvm 36 | - /dev/net/tun 37 | cap_add: 38 | - NET_ADMIN 39 | ports: 40 | - 8006:8006 41 | - 5900:5900/tcp 42 | - 5900:5900/udp 43 | volumes: 44 | - ./macos:/storage 45 | restart: always 46 | stop_grace_period: 2m 47 | ``` 48 | 49 | ##### Via Docker CLI: 50 | 51 | ```bash 52 | docker run -it --rm --name macos -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN -v "${PWD:-.}/macos:/storage" --stop-timeout 120 dockurr/macos 53 | ``` 54 | 55 | ##### Via Kubernetes: 56 | 57 | ```shell 58 | kubectl apply -f https://raw.githubusercontent.com/dockur/macos/refs/heads/master/kubernetes.yml 59 | ``` 60 | 61 | ##### Via Github Codespaces: 62 | 63 | [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/dockur/macos) 64 | 65 | ## FAQ 💬 66 | 67 | ### How do I use it? 68 | 69 | Very simple! These are the steps: 70 | 71 | - Start the container and connect to [port 8006](http://127.0.0.1:8006/) using your web browser. 72 | 73 | - Choose `Disk Utility` and then select the largest `Apple Inc. VirtIO Block Media` disk. 74 | 75 | - Click the `Erase` button to format the disk to APFS, and give it any name you like. 76 | 77 | - Close the current window and proceed the installation by clicking `Reinstall macOS`. 78 | 79 | - When prompted where you want to install it, select the disk you created previously. 80 | 81 | - After all files are copied, select your region, language, and account settings. 82 | 83 | Enjoy your brand new machine, and don't forget to star this repo! 84 | 85 | ### How do I select the version of macOS? 86 | 87 | By default, macOS 13 (Ventura) will be installed, but you can add the `VERSION` environment variable in order to specify an alternative: 88 | 89 | ```yaml 90 | environment: 91 | VERSION: "13" 92 | ``` 93 | 94 | Select from the values below: 95 | 96 | | **Value** | **Version** | **Name** | 97 | |-------------|----------------|------------------| 98 | | `15` | macOS 15 | Sequoia | 99 | | `14` | macOS 14 | Sonoma | 100 | | `13` | macOS 13 | Ventura | 101 | | `12` | macOS 12 | Monterey | 102 | | `11` | macOS 11 | Big Sur | 103 | 104 | > [!NOTE] 105 | > Support for macOS 15 (Sequoia) is still in its infancy, as it does not allow you to sign in to your Apple Account yet. 106 | 107 | ### How do I change the storage location? 108 | 109 | To change the storage location, include the following bind mount in your compose file: 110 | 111 | ```yaml 112 | volumes: 113 | - ./macos:/storage 114 | ``` 115 | 116 | Replace the example path `./macos` with the desired storage folder or named volume. 117 | 118 | ### How do I change the size of the disk? 119 | 120 | To expand the default size of 64 GB, add the `DISK_SIZE` setting to your compose file and set it to your preferred capacity: 121 | 122 | ```yaml 123 | environment: 124 | DISK_SIZE: "256G" 125 | ``` 126 | 127 | > [!TIP] 128 | > This can also be used to resize the existing disk to a larger capacity without any data loss. 129 | 130 | ### How do I change the amount of CPU or RAM? 131 | 132 | By default, the container will be allowed to use a maximum of 2 CPU cores and 4 GB of RAM. 133 | 134 | If you want to adjust this, you can specify the desired amount using the following environment variables: 135 | 136 | ```yaml 137 | environment: 138 | RAM_SIZE: "8G" 139 | CPU_CORES: "4" 140 | ``` 141 | 142 | ### How do I assign an individual IP address to the container? 143 | 144 | By default, the container uses bridge networking, which shares the IP address with the host. 145 | 146 | If you want to assign an individual IP address to the container, you can create a macvlan network as follows: 147 | 148 | ```bash 149 | docker network create -d macvlan \ 150 | --subnet=192.168.0.0/24 \ 151 | --gateway=192.168.0.1 \ 152 | --ip-range=192.168.0.100/28 \ 153 | -o parent=eth0 vlan 154 | ``` 155 | 156 | Be sure to modify these values to match your local subnet. 157 | 158 | Once you have created the network, change your compose file to look as follows: 159 | 160 | ```yaml 161 | services: 162 | macos: 163 | container_name: macos 164 | .... 165 | networks: 166 | vlan: 167 | ipv4_address: 192.168.0.100 168 | 169 | networks: 170 | vlan: 171 | external: true 172 | ``` 173 | 174 | An added benefit of this approach is that you won't have to perform any port mapping anymore, since all ports will be exposed by default. 175 | 176 | > [!IMPORTANT] 177 | > This IP address won't be accessible from the Docker host due to the design of macvlan, which doesn't permit communication between the two. If this is a concern, you need to create a [second macvlan](https://blog.oddbit.com/post/2018-03-12-using-docker-macvlan-networks/#host-access) as a workaround. 178 | 179 | ### How can macOS acquire an IP address from my router? 180 | 181 | After configuring the container for [macvlan](#how-do-i-assign-an-individual-ip-address-to-the-container), it is possible for macOS to become part of your home network by requesting an IP from your router, just like your other devices. 182 | 183 | To enable this mode, in which the container and macOS will have separate IP addresses, add the following lines to your compose file: 184 | 185 | ```yaml 186 | environment: 187 | DHCP: "Y" 188 | devices: 189 | - /dev/vhost-net 190 | device_cgroup_rules: 191 | - 'c *:* rwm' 192 | ``` 193 | 194 | ### How do I pass-through a disk? 195 | 196 | It is possible to pass-through disk devices or partitions directly by adding them to your compose file in this way: 197 | 198 | ```yaml 199 | devices: 200 | - /dev/sdb:/disk1 201 | - /dev/sdc1:/disk2 202 | ``` 203 | 204 | Use `/disk1` if you want it to become your main drive, and use `/disk2` and higher to add them as secondary drives. 205 | 206 | ### How do I pass-through a USB device? 207 | 208 | To pass-through a USB device, first lookup its vendor and product id via the `lsusb` command, then add them to your compose file like this: 209 | 210 | ```yaml 211 | environment: 212 | ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x1234" 213 | devices: 214 | - /dev/bus/usb 215 | ``` 216 | 217 | ### How do I share files with the host? 218 | 219 | To share files with the host, add the following volume to your compose file: 220 | 221 | ```yaml 222 | volumes: 223 | - ./example:/shared 224 | ``` 225 | 226 | Then start macOS and execute the following command: 227 | 228 | ```shell 229 | sudo -S mount_9p shared 230 | ``` 231 | 232 | In Finder’s menu bar, click on “Go – Computer” to access this shared folder, it will show the contents of `./example`. 233 | 234 | ### How do I verify if my system supports KVM? 235 | 236 | First check if your software is compatible using this chart: 237 | 238 | | **Product** | **Linux** | **Win11** | **Win10** | **macOS** | 239 | |---|---|---|---|---| 240 | | Docker CLI | ✅ | ✅ | ❌ | ❌ | 241 | | Docker Desktop | ❌ | ✅ | ❌ | ❌ | 242 | | Podman CLI | ✅ | ✅ | ❌ | ❌ | 243 | | Podman Desktop | ✅ | ✅ | ❌ | ❌ | 244 | 245 | After that you can run the following commands in Linux to check your system: 246 | 247 | ```bash 248 | sudo apt install cpu-checker 249 | sudo kvm-ok 250 | ``` 251 | 252 | If you receive an error from `kvm-ok` indicating that KVM cannot be used, please check whether: 253 | 254 | - the virtualization extensions (`Intel VT-x` or `AMD SVM`) are enabled in your BIOS. 255 | 256 | - you enabled "nested virtualization" if you are running the container inside a virtual machine. 257 | 258 | - you are not using a cloud provider, as most of them do not allow nested virtualization for their VPS's. 259 | 260 | If you did not receive any error from `kvm-ok` but the container still complains about a missing KVM device, it could help to add `privileged: true` to your compose file (or `sudo` to your `docker` command) to rule out any permission issue. 261 | 262 | ### How do I run Windows in a container? 263 | 264 | You can use [dockur/windows](https://github.com/dockur/windows) for that. It shares many of the same features, and even has completely automatic installation. 265 | 266 | ### How do I run a Linux desktop in a container? 267 | 268 | You can use [qemus/qemu](https://github.com/qemus/qemu) in that case. 269 | 270 | ### Is this project legal? 271 | 272 | Yes, this project contains only open-source code and does not distribute any copyrighted material. Neither does it try to circumvent any copyright protection measures. So under all applicable laws, this project will be considered legal. 273 | 274 | However, by installing Apple's macOS, you must accept their end-user license agreement, which does not permit installation on non-official hardware. So only run this container on hardware sold by Apple, as any other use will be a violation of their terms and conditions. 275 | 276 | ## Acknowledgements 🙏 277 | 278 | Special thanks to [seitenca](https://github.com/seitenca), this project would not exist without her invaluable work. 279 | 280 | ## Stars 🌟 281 | [![Stars](https://starchart.cc/dockur/macos.svg?variant=adaptive)](https://starchart.cc/dockur/macos) 282 | 283 | ## Disclaimer ⚖️ 284 | 285 | *Only run this container on Apple hardware, any other use is not permitted by their EULA. The product names, logos, brands, and other trademarks referred to within this project are the property of their respective trademark holders. This project is not affiliated, sponsored, or endorsed by Apple Inc.* 286 | 287 | [build_url]: https://github.com/dockur/macos/ 288 | [hub_url]: https://hub.docker.com/r/dockurr/macos/ 289 | [tag_url]: https://hub.docker.com/r/dockurr/macos/tags 290 | [pkg_url]: https://github.com/dockur/macos/pkgs/container/macos 291 | 292 | [Build]: https://github.com/dockur/macos/actions/workflows/build.yml/badge.svg 293 | [Size]: https://img.shields.io/docker/image-size/dockurr/macos/latest?color=066da5&label=size 294 | [Pulls]: https://img.shields.io/docker/pulls/dockurr/macos.svg?style=flat&label=pulls&logo=docker 295 | [Version]: https://img.shields.io/docker/v/dockurr/macos/latest?arch=amd64&sort=semver&color=066da5 296 | [Package]: https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fipitio.github.io%2Fbackage%2Fdockur%2Fmacos%2Fmacos.json&query=%24.downloads&logo=github&style=flat&color=066da5&label=pulls 297 | -------------------------------------------------------------------------------- /src/boot.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -Eeuo pipefail 3 | 4 | # Docker environment variables 5 | : "${BOOT_MODE:="macos"}" # Boot mode 6 | : "${SECURE:="off"}" # Secure boot 7 | 8 | BOOT_DESC="" 9 | BOOT_OPTS="" 10 | OVMF="/usr/share/OVMF" 11 | 12 | case "${HEIGHT,,}" in 13 | "1080" ) 14 | DEST="$PROCESS" 15 | ROM="OVMF_CODE.fd" 16 | VARS="OVMF_VARS-1920x1080.fd" 17 | ;; 18 | "768" ) 19 | DEST="${PROCESS}_hd" 20 | ROM="OVMF_CODE.fd" 21 | VARS="OVMF_VARS-1024x768.fd" 22 | ;; 23 | *) 24 | ROM="OVMF_CODE.fd" 25 | VARS="OVMF_VARS.fd" 26 | DEST="${PROCESS}_${HEIGHT}" 27 | ;; 28 | esac 29 | 30 | BOOT_OPTS+=" -smbios type=2" 31 | BOOT_OPTS+=" -rtc base=utc,base=localtime" 32 | BOOT_OPTS+=" -global ICH9-LPC.disable_s3=1" 33 | BOOT_OPTS+=" -global ICH9-LPC.disable_s4=1" 34 | BOOT_OPTS+=" -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off" 35 | 36 | osk=$(echo "bheuneqjbexolgurfrjbeqfthneqrqcyrnfrqbagfgrny(p)NccyrPbzchgreVap" | tr 'A-Za-z' 'N-ZA-Mn-za-m') 37 | BOOT_OPTS+=" -device isa-applesmc,osk=$osk" 38 | 39 | # OVMF 40 | DEST="$STORAGE/$DEST" 41 | 42 | if [ ! -s "$DEST.rom" ] || [ ! -f "$DEST.rom" ]; then 43 | [ ! -s "$OVMF/$ROM" ] || [ ! -f "$OVMF/$ROM" ] && error "UEFI boot file ($OVMF/$ROM) not found!" && exit 44 44 | cp "$OVMF/$ROM" "$DEST.rom" 45 | fi 46 | 47 | if [ ! -s "$DEST.vars" ] || [ ! -f "$DEST.vars" ]; then 48 | [ ! -s "$OVMF/$VARS" ] || [ ! -f "$OVMF/$VARS" ]&& error "UEFI vars file ($OVMF/$VARS) not found!" && exit 45 49 | cp "$OVMF/$VARS" "$DEST.vars" 50 | fi 51 | 52 | BOOT_OPTS+=" -drive if=pflash,format=raw,readonly=on,file=$DEST.rom" 53 | BOOT_OPTS+=" -drive if=pflash,format=raw,file=$DEST.vars" 54 | 55 | IMG="$STORAGE/boot.img" 56 | 57 | if [ ! -f "$IMG" ]; then 58 | 59 | FILE="OpenCore.img" 60 | IMG="/tmp/$FILE" 61 | rm -f "$IMG" 62 | 63 | # OpenCoreBoot 64 | ISO="/opencore.iso" 65 | OUT="/tmp/extract" 66 | 67 | rm -rf "$OUT" 68 | mkdir -p "$OUT" 69 | 70 | msg="Building boot image" 71 | info "$msg..." && html "$msg..." 72 | 73 | [ ! -f "$ISO" ] && gzip -dk "$ISO.gz" 74 | 75 | if [ ! -f "$ISO" ] || [ ! -s "$ISO" ]; then 76 | error "Could not find image file \"$ISO\"." && exit 10 77 | fi 78 | 79 | START=$(sfdisk -l "$ISO" | grep -i -m 1 "EFI System" | awk '{print $2}') 80 | mcopy -bspmQ -i "$ISO@@${START}S" ::EFI "$OUT" 81 | 82 | CFG="$OUT/EFI/OC/config.plist" 83 | 84 | PLIST="/assets/config.plist" 85 | [ -f "/config.plist" ] && PLIST="/config.plist" 86 | 87 | cp "$PLIST" "$CFG" 88 | 89 | ROM="${MAC//[^[:alnum:]]/}" 90 | ROM="${ROM,,}" 91 | BROM=$(echo "$ROM" | xxd -r -p | base64) 92 | RESOLUTION="${WIDTH}x${HEIGHT}@32" 93 | 94 | sed -r -i -e 's|m7zhIYfl|'"${BROM}"'|g' "$CFG" 95 | sed -r -i -e 's|iMacPro1,1|'"${MODEL}"'|g' "$CFG" 96 | sed -r -i -e 's|C02TM2ZBHX87|'"${SN}"'|g' "$CFG" 97 | sed -r -i -e 's|C02717306J9JG361M|'"${MLB}"'|g' "$CFG" 98 | sed -r -i -e 's|1920x1080@32|'"${RESOLUTION}"'|g' "$CFG" 99 | sed -r -i -e 's|007076A6-F2A2-4461-BBE5-BAD019F8025A|'"${UUID}"'|g' "$CFG" 100 | 101 | # Build image 102 | 103 | MB=256 104 | CLUSTER=4 105 | START=2048 106 | SECTOR=512 107 | FIRST_LBA=34 108 | 109 | SIZE=$(( MB*1024*1024 )) 110 | OFFSET=$(( START*SECTOR )) 111 | TOTAL=$(( SIZE-(FIRST_LBA*SECTOR) )) 112 | LAST_LBA=$(( TOTAL/SECTOR )) 113 | COUNT=$(( LAST_LBA-(START-1) )) 114 | 115 | if ! truncate -s "$SIZE" "$IMG"; then 116 | rm -f "$IMG" 117 | error "Could not allocate space to create image $IMG ." && exit 11 118 | fi 119 | 120 | PART="/tmp/partition.fdisk" 121 | 122 | { echo "label: gpt" 123 | echo "label-id: 1ACB1E00-3B8F-4B2A-86A4-D99ED21DCAEB" 124 | echo "device: $FILE" 125 | echo "unit: sectors" 126 | echo "first-lba: $FIRST_LBA" 127 | echo "last-lba: $LAST_LBA" 128 | echo "sector-size: $SECTOR" 129 | echo "" 130 | echo "${FILE}1 : start=$START, size=$COUNT, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B, uuid=05157F6E-0AE8-4D1A-BEA5-AC172453D02C, name=\"primary\"" 131 | 132 | } > "$PART" 133 | 134 | sfdisk -q "$IMG" < "$PART" 135 | echo "drive c: file=\"$IMG\" partition=0 offset=$OFFSET" > /etc/mtools.conf 136 | 137 | mformat -F -M "$SECTOR" -c "$CLUSTER" -T "$COUNT" -v "EFI" "C:" 138 | mcopy -bspmQ "$OUT/EFI" "C:" 139 | 140 | rm -rf "$OUT" 141 | 142 | info "" 143 | info "Model: $MODEL" 144 | info "Rom: $ROM" 145 | info "Serial: $SN" 146 | info "Board: $MLB" 147 | info "" 148 | 149 | fi 150 | 151 | BOOT_DRIVE_ID="OpenCore" 152 | 153 | DISK_OPTS+=" -device virtio-blk-pci,drive=${BOOT_DRIVE_ID},bus=pcie.0,addr=0x5,bootindex=$BOOT_INDEX" 154 | DISK_OPTS+=" -drive file=$IMG,id=$BOOT_DRIVE_ID,format=raw,cache=unsafe,readonly=on,if=none" 155 | 156 | CPU_VENDOR=$(lscpu | awk '/Vendor ID/{print $3}') 157 | DEFAULT_FLAGS="vendor=GenuineIntel,vmware-cpuid-freq=on,-pdpe1gb" 158 | 159 | if [[ "$CPU_VENDOR" != "GenuineIntel" ]] || [[ "${KVM:-}" == [Nn]* ]]; then 160 | [ -z "${CPU_MODEL:-}" ] && CPU_MODEL="Haswell-noTSX" 161 | DEFAULT_FLAGS+=",+pcid,+ssse3,+sse4.2,+popcnt,+avx,+avx2,+aes,+fma,+bmi1,+bmi2,+smep,+xsave,+xsavec,+xsaveopt,+xgetbv1,+movbe,+rdrand,check" 162 | fi 163 | 164 | if [ -z "${CPU_FLAGS:-}" ]; then 165 | CPU_FLAGS="$DEFAULT_FLAGS" 166 | else 167 | CPU_FLAGS="$DEFAULT_FLAGS,$CPU_FLAGS" 168 | fi 169 | 170 | SM_BIOS="" 171 | CLOCKSOURCE="tsc" 172 | [[ "${ARCH,,}" == "arm64" ]] && CLOCKSOURCE="arch_sys_counter" 173 | CLOCK="/sys/devices/system/clocksource/clocksource0/current_clocksource" 174 | 175 | if [ ! -f "$CLOCK" ]; then 176 | warn "file \"$CLOCK\" cannot not found?" 177 | else 178 | result=$(<"$CLOCK") 179 | result="${result//[![:print:]]/}" 180 | case "${result,,}" in 181 | "${CLOCKSOURCE,,}" ) ;; 182 | "kvm-clock" ) 183 | if [[ "$CPU_VENDOR" != "GenuineIntel" ]] && [[ "${CPU_CORES,,}" == "2" ]]; then 184 | warn "Restricted processor to a single core because nested KVM virtualization was detected!" 185 | CPU_CORES="1" 186 | else 187 | warn "Nested KVM virtualization detected, this might cause issues running macOS!" 188 | fi ;; 189 | "hyperv_clocksource_tsc_page" ) info "Nested Hyper-V virtualization detected, this might cause issues running macOS!" ;; 190 | "hpet" ) warn "unsupported clock source detected: '$result'. Please set host clock source to '$CLOCKSOURCE', otherwise it will cause issues running macOS!" ;; 191 | *) warn "unexpected clock source detected: '$result'. Please set host clock source to '$CLOCKSOURCE', otherwise it will cause issues running macOS!" ;; 192 | esac 193 | fi 194 | 195 | case "$CPU_CORES" in 196 | "" | "0" | "3" ) CPU_CORES="2" ;; 197 | "5" ) CPU_CORES="4" ;; 198 | "9" ) CPU_CORES="8" ;; 199 | esac 200 | 201 | case "$CPU_CORES" in 202 | "1" | "2" | "4" | "8" ) SMP="$CPU_CORES,sockets=1,dies=1,cores=$CPU_CORES,threads=1" ;; 203 | "6" | "7" ) SMP="$CPU_CORES,sockets=3,dies=1,cores=2,threads=1" ;; 204 | "10" | "11" ) SMP="$CPU_CORES,sockets=5,dies=1,cores=2,threads=1" ;; 205 | "12" | "13" ) SMP="$CPU_CORES,sockets=3,dies=1,cores=4,threads=1" ;; 206 | "14" | "15" ) SMP="$CPU_CORES,sockets=7,dies=1,cores=2,threads=1" ;; 207 | "16" | "32" | "64" ) SMP="$CPU_CORES,sockets=1,dies=1,cores=$CPU_CORES,threads=1" ;; 208 | *) 209 | error "Invalid amount of CPU_CORES, value \"${CPU_CORES}\" is not a power of 2!" && exit 35 210 | ;; 211 | esac 212 | 213 | USB="nec-usb-xhci,id=xhci" 214 | USB+=" -device usb-kbd,bus=xhci.0" 215 | USB+=" -global nec-usb-xhci.msi=off" 216 | 217 | return 0 218 | -------------------------------------------------------------------------------- /src/entry.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -Eeuo pipefail 3 | 4 | : "${APP:="macOS"}" 5 | : "${VGA:="vmware"}" 6 | : "${DISK_TYPE:="blk"}" 7 | : "${PLATFORM:="x64"}" 8 | : "${SUPPORT:="https://github.com/dockur/macos"}" 9 | 10 | cd /run 11 | 12 | . utils.sh # Load functions 13 | . reset.sh # Initialize system 14 | . install.sh # Get the OSX images 15 | . disk.sh # Initialize disks 16 | . display.sh # Initialize graphics 17 | . network.sh # Initialize network 18 | . boot.sh # Configure boot 19 | . proc.sh # Initialize processor 20 | . config.sh # Configure arguments 21 | 22 | trap - ERR 23 | 24 | version=$(qemu-system-x86_64 --version | head -n 1 | cut -d '(' -f 1 | awk '{ print $NF }') 25 | info "Booting ${APP}${BOOT_DESC} using QEMU v$version..." 26 | 27 | exec qemu-system-x86_64 ${ARGS:+ $ARGS} 28 | -------------------------------------------------------------------------------- /src/install.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -Eeuo pipefail 3 | 4 | # Docker environment variables 5 | 6 | : "${SN:=""}" # Device serial 7 | : "${MLB:=""}" # Board serial 8 | : "${MAC:=""}" # MAC address 9 | : "${UUID:=""}" # Unique ID 10 | : "${WIDTH:="1920"}" # Horizontal 11 | : "${HEIGHT:="1080"}" # Vertical 12 | : "${VERSION:="13"}" # OSX Version 13 | : "${MODEL:="iMacPro1,1"}" # Device model 14 | 15 | BASE_IMG_ID="InstallMedia" 16 | BASE_IMG="$STORAGE/base.dmg" 17 | BASE_VERSION="$STORAGE/$PROCESS.version" 18 | 19 | function getRandom() { 20 | local length="${1}" 21 | local result="" 22 | local chars=("0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F") 23 | 24 | for ((i=0; i&1 | tr ';' '\n' | awk -F'session=|;' '{print $2}' | grep 1) 50 | info=$(curl --disable -s -X POST -H "Host: osrecovery.apple.com" \ 51 | -H "Connection: close" \ 52 | -A "InternetRecovery/1.0" \ 53 | -b "session=\"${appleSession}\"" \ 54 | -H "Content-Type: text/plain" \ 55 | -d $'cid='"$(getRandom 16)"$'\nsn='"${mlb}"$'\nbid='"${board}"$'\nk='"$(getRandom 64)"$'\nfg='"$(getRandom 64)"$'\nos='"${type}" \ 56 | https://osrecovery.apple.com/InstallationPayload/RecoveryImage | tr ' ' '\n') 57 | 58 | downloadLink=$(echo "$info" | grep 'oscdn' | grep 'dmg') 59 | downloadSession=$(echo "$info" | grep 'expires' | grep 'dmg') 60 | 61 | if [ -z "$downloadLink" ] || [ -z "$downloadSession" ]; then 62 | 63 | local code="99" 64 | msg="Failed to connect to the Apple servers, reason:" 65 | 66 | curl --silent --max-time 10 --output /dev/null --fail -H "Host: osrecovery.apple.com" -H "Connection: close" -A "InternetRecovery/1.0" https://osrecovery.apple.com/ || { 67 | code="$?" 68 | } 69 | 70 | case "${code,,}" in 71 | "6" ) error "$msg could not resolve host!" ;; 72 | "7" ) error "$msg no internet connection available!" ;; 73 | "28" ) error "$msg connection timed out!" ;; 74 | "99" ) 75 | [ -n "$info" ] && echo "$info" && echo 76 | error "$msg unknown error" ;; 77 | *) error "$msg $code" ;; 78 | esac 79 | 80 | return 1 81 | fi 82 | 83 | # Check if running with interactive TTY or redirected to docker log 84 | if [ -t 1 ]; then 85 | progress="--progress=bar:noscroll" 86 | else 87 | progress="--progress=dot:giga" 88 | fi 89 | 90 | rm -f "$dest" 91 | /run/progress.sh "$dest" "0" "$msg ([P])..." & 92 | 93 | { wget "$downloadLink" -O "$dest" -q --header "Host: oscdn.apple.com" --header "Connection: close" --header "User-Agent: InternetRecovery/1.0" --header "Cookie: AssetToken=${downloadSession}" --timeout=30 --no-http-keep-alive --show-progress "$progress"; rc=$?; } || : 94 | 95 | fKill "progress.sh" 96 | 97 | if (( rc == 0 )) && [ -f "$dest" ]; then 98 | total=$(stat -c%s "$dest") 99 | size=$(formatBytes "$total") 100 | if [ "$total" -lt 100000 ]; then 101 | error "Invalid recovery image, file is only $size ?" && return 1 102 | fi 103 | html "Download finished successfully..." 104 | return 0 105 | fi 106 | 107 | msg="Failed to download $downloadLink" 108 | (( rc == 3 )) && error "$msg , cannot write file (disk full?)" && return 1 109 | (( rc == 4 )) && error "$msg , network failure!" && return 1 110 | (( rc == 8 )) && error "$msg , server issued an error response!" && return 1 111 | 112 | error "$msg , reason: $rc" 113 | return 1 114 | } 115 | 116 | download() { 117 | 118 | local board 119 | local version="$1" 120 | 121 | case "${version,,}" in 122 | "sequoia" | "15"* ) 123 | board="Mac-937A206F2EE63C01" ;; 124 | "sonoma" | "14"* ) 125 | board="Mac-827FAC58A8FDFA22" ;; 126 | "ventura" | "13"* ) 127 | board="Mac-4B682C642B45593E" ;; 128 | "monterey" | "12"* ) 129 | board="Mac-B809C3757DA9BB8D" ;; 130 | "bigsur" | "big-sur" | "11"* ) 131 | board="Mac-2BD1B31983FE1663" ;; 132 | "catalina" | "10"* ) 133 | board="Mac-00BE6ED71E35EB86" ;; 134 | *) 135 | error "Unknown VERSION specified, value \"${version}\" is not recognized!" 136 | return 1 ;; 137 | esac 138 | 139 | if [ -f "/boot.dmg" ]; then 140 | cp "/boot.dmg" "$BASE_IMG" 141 | else 142 | local file="/BaseSystem.dmg" 143 | ! downloadImage "$file" "$board" "$version" && exit 60 144 | mv -f "$file" "$BASE_IMG" 145 | fi 146 | 147 | echo "$version" > "$BASE_VERSION" 148 | return 0 149 | } 150 | 151 | generateID() { 152 | 153 | local file="$STORAGE/$PROCESS.id" 154 | 155 | [ -n "$UUID" ] && return 0 156 | [ -s "$file" ] && UUID=$(<"$file") 157 | UUID="${UUID//[![:print:]]/}" 158 | [ -n "$UUID" ] && return 0 159 | 160 | UUID=$(cat /proc/sys/kernel/random/uuid 2> /dev/null || uuidgen --random) 161 | UUID="${UUID^^}" 162 | UUID="${UUID//[![:print:]]/}" 163 | echo "$UUID" > "$file" 164 | 165 | return 0 166 | } 167 | 168 | generateAddress() { 169 | 170 | local file="$STORAGE/$PROCESS.mac" 171 | 172 | [ -n "$MAC" ] && return 0 173 | [ -s "$file" ] && MAC=$(<"$file") 174 | MAC="${MAC//[![:print:]]/}" 175 | [ -n "$MAC" ] && return 0 176 | 177 | # Generate Apple MAC address based on Docker container ID in hostname 178 | MAC=$(echo "$HOST" | md5sum | sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/00:16:cb:\3:\4:\5/') 179 | MAC="${MAC^^}" 180 | echo "$MAC" > "$file" 181 | 182 | return 0 183 | } 184 | 185 | generateSerial() { 186 | 187 | local file="$STORAGE/$PROCESS.sn" 188 | local file2="$STORAGE/$PROCESS.mlb" 189 | 190 | [ -n "$SN" ] && [ -n "$MLB" ] && return 0 191 | [ -s "$file" ] && SN=$(<"$file") 192 | [ -s "$file2" ] && MLB=$(<"$file2") 193 | SN="${SN//[![:print:]]/}" 194 | MLB="${MLB//[![:print:]]/}" 195 | [ -n "$SN" ] && [ -n "$MLB" ] && return 0 196 | 197 | # Generate unique serial numbers for machine 198 | SN=$(/usr/local/bin/macserial --num 1 --model "${MODEL}" 2>/dev/null) 199 | 200 | SN="${SN##*$'\n'}" 201 | [[ "$SN" != *" | "* ]] && error "$SN" && return 1 202 | 203 | MLB=${SN#*|} 204 | MLB="${MLB#"${MLB%%[![:space:]]*}"}" 205 | SN="${SN%%|*}" 206 | SN="${SN%"${SN##*[![:space:]]}"}" 207 | 208 | echo "$SN" > "$file" 209 | echo "$MLB" > "$file2" 210 | 211 | return 0 212 | } 213 | 214 | if [ ! -f "$BASE_IMG" ] || [ ! -s "$BASE_IMG" ]; then 215 | ! download "$VERSION" && exit 34 216 | fi 217 | 218 | STORED_VERSION="" 219 | if [ -f "$BASE_VERSION" ]; then 220 | STORED_VERSION=$(<"$BASE_VERSION") 221 | STORED_VERSION="${STORED_VERSION//[![:print:]]/}" 222 | fi 223 | 224 | if [ "$VERSION" != "$STORED_VERSION" ]; then 225 | info "Different version detected, switching base image from \"$STORED_VERSION\" to \"$VERSION\"" 226 | ! download "$VERSION" && exit 34 227 | fi 228 | 229 | if ! generateID; then 230 | error "Failed to generate UUID!" && exit 35 231 | fi 232 | 233 | if ! generateSerial; then 234 | error "Failed to generate serial number!" && exit 36 235 | fi 236 | 237 | if ! generateAddress; then 238 | error "Failed to generate MAC address!" && exit 37 239 | fi 240 | 241 | DISK_OPTS="-device virtio-blk-pci,drive=${BASE_IMG_ID},bus=pcie.0,addr=0x6" 242 | DISK_OPTS+=" -drive file=$BASE_IMG,id=$BASE_IMG_ID,format=dmg,cache=unsafe,readonly=on,if=none" 243 | 244 | return 0 245 | --------------------------------------------------------------------------------