Hướng dẫn sử dụng Tart trên macOS Apple Silicon: Tạo và quản lý máy ảo CLI cho CI/CD

Quick start: Chạy máy ảo macOS/Linux sau 3 lệnh

Làm việc trên chip M-series (M1 đến M4), bạn sẽ thấy việc cài VirtualBox hay VMware Fusion vừa nặng vừa cồng kềnh. Tart giải quyết gọn vấn đề này. Toàn bộ thao tác gói gọn trong terminal.

Cài đặt Tart qua Homebrew:

brew install cirruslabs/cli/tart

Kiểm tra nhanh phiên bản:

tart --version

Kéo image Ubuntu 22.04 LTS ARM64 dựng sẵn từ GitHub Container Registry:

# Pull và đặt tên máy ảo cục bộ là my-ubuntu-vm
tart clone ghcr.io/cirruslabs/ubuntu:latest my-ubuntu-vm

Khởi động máy ảo ở chế độ chạy ngầm (headless), không cần mở cửa sổ GUI:

tart run --no-graphics my-ubuntu-vm &

Chờ khoảng 3 đến 5 giây để máy ảo nhận IP, sau đó SSH trực tiếp:

# Lấy IP được cấp phát tự động
VM_IP=$(tart ip my-ubuntu-vm)

# User và password mặc định của image Cirrus Labs là: admin / admin
ssh admin@$VM_IP

Máy ảo khởi động gần như tức thì. Bạn đã có một shell Linux ARM64 biệt lập để làm việc.

Giải thích chi tiết: Tart là gì và tại sao lại tối ưu cho Apple Silicon?

Nếu bạn từng dựng homelab chạy Proxmox x86 để test app, bạn sẽ hiểu sự ức chế khi cần môi trường macOS native. Phần cứng x86 không thể giả lập mượt mà kiến trúc ARM của Apple. Tart sinh ra để lấp vào khoảng trống đó.

Tart do Cirrus Labs phát triển, chạy trực tiếp trên Apple Virtualization.framework native của macOS. Không cần lớp dịch cồng kềnh. CPU và RAM máy ảo được map thẳng xuống phần cứng Apple Silicon. Kết quả: thời gian boot máy ảo Linux chỉ mất khoảng 2-3 giây, còn macOS mất khoảng 12-15 giây. Mức ngốn CPU khi idle chỉ dưới 1%.

Kiến trúc OCI Native: Coi máy ảo như container

Điểm giá trị nhất của Tart so với Vagrant hay Parallels là cách đóng gói:

  • Đóng gói dạng Container Registry: Toàn bộ ổ đĩa ảo (disk.img) và config (config.json) được đẩy lên registry chuẩn OCI như GHCR, AWS ECR hay Docker Hub. Bạn pull/push máy ảo tương tự lệnh docker pull.
  • Clone tức thì nhờ APFS: macOS sử dụng APFS với tính năng Copy-on-Write (CoW). Lệnh tart clone một máy ảo dung lượng 60GB chỉ mất đúng 300ms. Dữ liệu vật lý chưa bị nhân bản cho đến khi bạn ghi file mới.

Các lệnh vận hành cốt lõi

Bảng lệnh thường dùng khi làm việc hàng ngày:

# Xem danh sách máy ảo hiện có
tart list

# Kiểm tra tài nguyên cấp phát (CPU, RAM, kích thước disk)
tart get my-ubuntu-vm

# Tăng cấu hình lên 4 vCPU và 8GB RAM
tart set my-ubuntu-vm --cpu 4 --memory 8192

# Tắt máy ảo an toàn
tart stop my-ubuntu-vm

# Xóa sạch VM khi không còn dùng
tart delete my-ubuntu-vm

Nâng cao: Dựng pipeline CI/CD với máy ảo dùng một lần (Ephemeral VM)

Tart cực kỳ hữu ích khi làm runner tự host cho GitLab Runner hoặc GitHub Actions. Mỗi job build sẽ nhận một máy ảo mới tinh, build xong tự hủy sạch sẽ, không lo leak secret hay rác ổ cứng.

1. Kéo image macOS chính thức

Cirrus Labs cung cấp sẵn các base image macOS từ Monterey đến Sequoia:

# Kéo base image macOS Sonoma (dung lượng tải khoảng 25-30GB)
tart clone ghcr.io/cirruslabs/macos-sonoma-base:latest macos-base

2. Shell script quản lý vòng đời job build

Script thực tế chạy trong CI runner để tạo VM tạm, thực thi test và tự dọn dẹp:

#!/usr/bin/env bash
set -euo pipefail

BASE_IMAGE="macos-base"
BUILD_ID="job-$$"

echo "[1/4] Clone máy ảo tạm từ snapshot: $BUILD_ID"
tart clone "$BASE_IMAGE" "$BUILD_ID"

echo "[2/4] Chạy VM headless..."
tart run --no-graphics "$BUILD_ID" &

# Polling chờ máy ảo nhận IP (tối đa 30s)
echo "[3/4] Đang chờ IP từ DHCP..."
VM_IP=""
for i in {1..30}; do
    VM_IP=$(tart ip "$BUILD_ID" 2>/dev/null || true)
    if [ -n "$VM_IP" ]; then break; fi
    sleep 1
done

if [ -z "$VM_IP" ]; then
    echo "Lỗi: Không lấy được IP sau 30s!"
    tart stop "$BUILD_ID" && tart delete "$BUILD_ID"
    exit 1
fi

echo "VM sẵn sàng tại $VM_IP. Chạy tác vụ build..."
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 admin@"$VM_IP" << 'EOF'
    sw_vers
    xcodebuild -version
    # Chèn lệnh chạy test hoặc build ứng dụng ở đây
EOF

echo "[4/4] Dọn dẹp máy ảo..."
tart stop "$BUILD_ID"
tart delete "$BUILD_ID"
echo "Hoàn tất dọn dẹp."

3. Chia sẻ thư mục qua VirtioFS

Không cần dùng rsync hay scp để copy repository hàng gigabyte vào máy ảo. Tart tích hợp sẵn VirtioFS với tốc độ đọc ghi đạt xấp xỉ 80-90% tốc độ ổ NVMe gốc:

# Mount thư mục dự án từ máy chủ vào VM
tart run --dir=workspace:/Users/admin/my-project my-ubuntu-vm

Trong guest OS Linux, gắn thư mục vào cây thư mục hệ thống:

sudo mkdir -p /mnt/workspace
sudo mount -t virtiofs workspace /mnt/workspace

Kinh nghiệm thực chiến khi vận hành Tart

  • Giới hạn 2 máy ảo macOS: Thỏa thuận bản quyền (EULA) của Apple quy định mỗi máy Mac chỉ được chạy tối đa 2 máy ảo macOS cùng lúc. Nếu chạy quá 2 VM macOS, hệ thống sẽ báo lỗi từ framework ảo hóa.
  • Kiểm soát dung lượng phình to: Tính năng CoW giúp clone nhanh, nhưng khi Xcode build sinh ra hàng chục GB thư mục DerivedData, ổ đĩa máy host vẫn sẽ đầy. Luôn kiểm tra định kỳ bằng tart list để xóa các VM mồ côi (orphaned VMs).
  • Phân bổ tài nguyên hợp lý: Với máy Mac 16GB RAM, chỉ nên gán tối đa 8GB RAM cho VM. macOS cần tối thiểu 6-8GB RAM để duy trì WindowServer, swap cache và các tác vụ hệ thống nền mượt mà.
  • Khắc phục trễ IP: Sau khi boot, card mạng ảo đôi khi cần 3 đến 8 giây để xin cấp DHCP từ host bridge. Hãy viết logic loop kiểm tra với biến đếm timeout thay vì chỉ gọi sleep cố định.
Share: