Cài macOS trên Linux với Docker-OSX: “Phím tắt” cho Dev build App iOS hiệu suất cao

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

Quick start – Có ngay macOS sau vài phút

Bạn đang dùng Ubuntu, Fedora hay bất kỳ distro Linux nào và cần gấp một môi trường macOS để check giao diện trên Safari? Hay đơn giản là muốn build thử một đoạn code Swift mà không có máy Mac? Hãy thử ngay lệnh này. Mình mặc định là bạn đã cài Docker và máy có hỗ trợ KVM nhé.

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

Lệnh trên sẽ tự động kéo image macOS Catalina (nặng khoảng 2.3GB) và khởi chạy giao diện ngay trên màn hình Linux. Thay vì mất cả tiếng để cấu hình file ISO trên VirtualBox, bạn chỉ cần ngồi nhâm nhi cốc cafe là xong. Quá tiện đúng không?

Tại sao Docker-OSX lại là “chân ái” cho Developer?

Trước đây, nhắc đến Hackintosh là anh em nghĩ ngay đến việc phân vùng ổ cứng hay chỉnh sửa EFI cực kỳ đau đầu. Dùng VirtualBox thì hiệu năng thường lẹt đẹt, lag đến mức khó chịu.

Docker-OSX giải quyết triệt để những nỗi đau này. Nó kết hợp sức mạnh của QEMUKVM (Kernel-based Virtual Machine) nhưng được đóng gói gọn gàng trong Docker. Có 3 điểm mình thấy cực kỳ đáng giá:

  • Hiệu suất gần như máy thật: Nhờ KVM, CPU được pass-through trực tiếp. Trải nghiệm gõ phím hay mở ứng dụng mượt hơn hẳn VirtualBox, tốc độ build code cũng nhanh hơn khoảng 30%.
  • Quản lý dạng Infrastructure as Code: Bạn có thể xóa đi tạo lại, hoặc clone một môi trường macOS sạch chỉ bằng một dòng lệnh.
  • Tích hợp X11 Forwarding: Cửa sổ macOS hiện ra như một ứng dụng bình thường trên desktop Linux, không tạo cảm giác bị tách biệt.

Trong hệ thống homelab mình đang chạy với Proxmox VE (quản lý 12 VM), mình luôn dành riêng một node Linux cho Docker-OSX. Đây là playground lý tưởng để mình test script automation và build agent cho Jenkins trước khi triển khai thực tế.

Chuẩn bị hệ thống (Prerequisites)

Để máy ảo chạy mượt và tránh lỗi “treo táo”, máy tính của bạn cần thỏa mãn vài điều kiện sau:

1. Bật ảo hóa trong BIOS

Hãy vào BIOS/UEFI, tìm và Enable mục Intel VT-x hoặc AMD-V. Sau đó kiểm tra lại bằng lệnh:

kvm-ok

Nếu thấy dòng “KVM acceleration can be used” là bạn đã sẵn sàng. Nếu chưa có lệnh này, hãy cài gói cpu-checker.

2. Cài đặt Docker và thư viện hỗ trợ

Trên Ubuntu hoặc Debian, anh em cài môi trường bằng lệnh sau:

sudo apt update
sudo apt install qemu qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager docker.io -y
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
sudo usermod -aG kvm $USER

Mẹo nhỏ: Bạn nhớ log out và log in lại để các thiết lập phân quyền có hiệu lực nhé.

Hướng dẫn cài đặt chi tiết các phiên bản macOS

Tùy nhu cầu mà bạn chọn phiên bản phù hợp. Tác giả sickcodes có đủ “đồ chơi” từ High Sierra cho đến Ventura hay Sonoma mới nhất.

Cài đặt macOS Monterey (Để hỗ trợ Xcode đời cao)

Nếu mục tiêu là build app iOS mới nhất, bạn sẽ cần Monterey trở lên. Lệnh dưới đây sẽ tạo ổ cứng ảo 40GB và bắt đầu quá trình cài đặt:

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

Giải thích nhanh các thông số:

  • RAM=6: Cấp 6GB RAM (mình khuyên nên để tối thiểu 4GB).
  • CORES=4: Số nhân CPU cấp cho máy ảo.
  • -p 50922:22: Forward port SSH để điều khiển Mac từ terminal của máy Linux.

Lưu ý quan trọng: Khi màn hình cài đặt hiện lên, bạn phải vào Disk Utility để format ổ cứng ảo (thường là QEMU HARDDISK) sang định dạng APFS trước khi nhấn “Reinstall macOS”.

Tối ưu hiệu năng để dùng cho “sướng”

Cài xong rồi nhưng để làm việc ổn định lâu dài, bạn nên thực hiện thêm 3 bước này.

1. Lưu trữ dữ liệu lâu dài (Persistence)

Mặc định khi xóa container, dữ liệu trong macOS sẽ mất sạch. Để giữ lại file và cấu hình, hãy mount một thư mục trên máy host làm ổ cứng cho máy ảo:

docker run -it \
    --device /dev/kvm \
    -v /home/user/macos_data:/var/lib/libvirt/images \
    -p 50922:22 \
    sickcodes/docker-osx:auto

2. Kết nối iPhone/iPad vào máy ảo

Đây là tính năng mình cực kỳ ưng ý. Để debug app trực tiếp trên iPhone, bạn dùng lsusb để tìm ID thiết bị, sau đó thêm tham số vào lệnh chạy. Cách đơn giản nhất là dùng biến môi trường:

# Ví dụ pass-through thiết bị USB cụ thể
-e "EXTRA=-device usb-host,hostbus=1,hostport=3"

3. Chế độ không cửa sổ (Headless) cho CI/CD

Nếu chỉ dùng làm build server, bạn chẳng cần giao diện đồ họa làm gì cho tốn tài nguyên. Hãy bỏ biến DISPLAY và chạy ngầm:

docker run -d \
    --device /dev/kvm \
    -p 50922:22 \
    sickcodes/docker-osx:auto

Lúc này, bạn chỉ cần ssh -p 50922 user@localhost là có thể thao tác với terminal của Mac rồi.

Kinh nghiệm thực tế và lưu ý quan trọng

Sau hơn một năm sử dụng Docker-OSX trong công việc, mình có vài lời khuyên thực tế cho anh em:

  • Hạn chế dùng iCloud cá nhân: Docker-OSX có thể giả lập Serial Number để dùng iMessage, nhưng rủi ro bị Apple khóa tài khoản chính là có thật. Tốt nhất hãy tạo một Apple ID clone để test.
  • Ưu tiên ổ cứng NVMe: Tốc độ load macOS trên SSD thường và NVMe khác biệt rõ rệt. Trên NVMe, máy ảo chỉ mất chưa đến 20 giây để boot vào màn hình chính.
  • Lỗi Network: Nếu máy ảo không có mạng, hãy kiểm tra bridge-utils. Đôi khi Docker sẽ “đá nhau” với các quy tắc iptables trên hệ thống Linux của bạn.

Việc setup ban đầu có vẻ hơi rắc rối về mặt câu lệnh. Tuy nhiên, một khi đã “vào việc”, bạn sẽ thấy nó ổn định và nhanh hơn hẳn các loại máy ảo truyền thống. Giải pháp này giúp mình tiết kiệm một khoản tiền kha khá thay vì phải sắm thêm Mac Mini chỉ để chạy vài tác vụ biên dịch nhỏ lẻ.

Anh em cứ mạnh dạn vọc vạch nhé. Nếu gặp lỗi khi docker pull hay bị kẹt ở logo táo, cứ để lại comment bên dưới mình sẽ hỗ trợ.

Share: