Post

An x64 dev box for OMSCS on Apple Silicon

An x64 dev box for OMSCS on Apple Silicon

I use an M-series Mac. I love it. It loves me. We’re a happy family. ❤️

But many OMSCS courses only support x64-based machines. Emulation via Docker and Rosetta got me through most assignments, but GIOS (CS 6200) was the breaking point — I wanted a native x64 toolchain instead of fighting an emulator on every debug session.

So I built gt-omscs-infra: a one-command Azure dev box with per-course containers that CLion connects to over SSH.

The mental model

One Azure VM runs Docker, with a separate container per course. CLion on the Mac connects to the container’s exposed SSH port. Bicep provisions the VM, networking, NSG, public IP, and an auto-shutdown schedule.

1
2
3
4
5
6
CLion (local Mac)
        │ SSH
        ▼
Azure VM (Docker)
 ├─ gios-env :2222
 └─ sat-env  :2223

A few decisions worth calling out

Azure VM, not Codespaces or serverless. I had student credits sitting around, state persists between sessions, and I’m not paying per CPU-minute during a long debug session.

One VM, many containers. Idle cost is shared across courses, there’s one auto-shutdown schedule, one set of creds to rotate. Containers keep each course’s toolchain isolated.

COMPOSE_PROFILES drives both Compose and the NSG. Disabling a course on the next deploy removes its container and its inbound SSH rule in the same step, so the firewall and the running services never drift.

Auto-shutdown via Microsoft.DevTestLab/schedules. The VM deallocates every night. Idle compute drops to zero; only storage keeps ticking.

The whole flow, end to end

1
2
3
4
5
6
7
8
9
10
11
12
13
# one-time
brew install azure-cli yq
az login
ssh-keygen -t ed25519  # if you don't have one already

# clone and configure
git clone git@github.com:kylemart/gt-omscs-infra.git
cd gt-omscs-infra
cp .env.example .env
$EDITOR .env  # set DNS_LABEL

# deploy
./deploy.sh

First run is about 5 minutes (Docker install + first image build). After that, redeploys are ~30 seconds and only touch what changed.

To verify:

1
ssh omscs@<fqdn> 'cd containers && docker compose ps'

When you’re done with the term, one command takes everything down:

1
az group delete --name rg-omscs-eastus2 --yes --no-wait

Where to go next

The repo has the full walkthrough — see docs/DEPLOY.md to deploy, docs/CLION.md to wire up CLion, and docs/ARCHITECTURE.md for the rationale behind each piece.

If you’re an OMSCS student in the same Apple-Silicon-shaped corner I was in, I hope this saves you a weekend.

This post is licensed under CC BY 4.0 by the author.

© Kyle Martinez. Some rights reserved.

Built with ♥︎ in the cloud

Trending Tags