|
| 1 | +# macOS with UTM (Docker) |
| 2 | + |
| 3 | +> [!CAUTION] |
| 4 | +> This installation method is not supported or maintained by the ARM Developers. |
| 5 | +> For full support and continued maintenance, |
| 6 | +> we recommend installing ARM via the supported [Docker Container](https://github.com/automatic-ripping-machine/automatic-ripping-machine/wiki/docker). |
| 7 | +> This installation method was developed for macOS users who cannot run Docker natively with USB passthrough. |
| 8 | +> |
| 9 | +> **Use at your own risk** |
| 10 | +
|
| 11 | +This guide covers installing ARM using Docker inside an Ubuntu Server VM running on macOS via UTM. This approach is necessary because ARM requires Linux and direct USB device access, which macOS cannot provide natively. |
| 12 | + |
| 13 | +> **Important:** You must use UTM's **QEMU backend** (Emulate), not Apple Virtualization (Virtualize). Apple Virtualization does not support USB passthrough. |
| 14 | +
|
| 15 | +## Prerequisites |
| 16 | + |
| 17 | +- Mac (Apple Silicon or Intel) |
| 18 | +- External USB DVD/Blu-ray drive |
| 19 | +- [Ubuntu Server 24.04 ISO](https://ubuntu.com/download/server) (ARM64 for Apple Silicon, AMD64 for Intel) |
| 20 | +- At least 4GB RAM and 64GB storage available for the VM |
| 21 | + |
| 22 | +--- |
| 23 | + |
| 24 | +## Part 1: Install UTM |
| 25 | + |
| 26 | +1. Download UTM from [https://mac.getutm.app](https://mac.getutm.app) |
| 27 | +2. Open the downloaded DMG file |
| 28 | +3. Drag UTM to your Applications folder |
| 29 | +4. Launch UTM from Applications |
| 30 | + |
| 31 | +> **Tip:** If macOS blocks the app, go to **System Settings → Privacy & Security** and click **Open Anyway**. |
| 32 | +
|
| 33 | +--- |
| 34 | + |
| 35 | +## Part 2: Create the Ubuntu VM |
| 36 | + |
| 37 | +### Step 1: Start a New VM |
| 38 | + |
| 39 | +1. Open UTM and click **Create a New Virtual Machine** |
| 40 | +2. Select **Emulate** (NOT Virtualize - critical for USB passthrough) |
| 41 | +3. Select **Linux** |
| 42 | + |
| 43 | +### Step 2: Configure the VM |
| 44 | + |
| 45 | +**Boot ISO:** |
| 46 | +- Click **Browse** and select your Ubuntu Server ISO |
| 47 | + |
| 48 | +**Hardware Settings (Apple Silicon):** |
| 49 | +- Architecture: `ARM64 (aarch64)` |
| 50 | +- System: `QEMU 8.2 ARM Virtual Machine` |
| 51 | +- RAM: `4096 MB` (minimum) |
| 52 | +- CPU Cores: `4` |
| 53 | + |
| 54 | +**Hardware Settings (Intel Mac):** |
| 55 | +- Architecture: `x86_64` |
| 56 | +- System: `Standard PC (Q35 + ICH9, 2009)` |
| 57 | +- RAM: `4096 MB` (minimum) |
| 58 | +- CPU Cores: `4` |
| 59 | + |
| 60 | +**Storage:** |
| 61 | +- Size: `64 GB` (minimum recommended) |
| 62 | + |
| 63 | +**Network:** |
| 64 | +- Select **Bridged (Advanced)** and choose your network interface (usually `en0`) |
| 65 | + |
| 66 | +### Step 3: Name and Create |
| 67 | + |
| 68 | +- Name: `ARM` or `Ubuntu-ARM` |
| 69 | +- Click **Save** |
| 70 | + |
| 71 | +--- |
| 72 | + |
| 73 | +## Part 3: Install Ubuntu Server |
| 74 | + |
| 75 | +1. Start the VM and select **Try or Install Ubuntu Server** |
| 76 | +2. Follow the installation wizard: |
| 77 | + - Installation type: **Ubuntu Server** (full, not minimized) |
| 78 | + - **Enable OpenSSH server** |
| 79 | + - Skip featured snaps |
| 80 | +3. After installation, remove the ISO from the virtual CD drive in UTM settings |
| 81 | +4. Get the VM's IP address: |
| 82 | + |
| 83 | +```bash |
| 84 | +ip addr show |
| 85 | +``` |
| 86 | + |
| 87 | +--- |
| 88 | + |
| 89 | +## Part 4: Connect USB DVD Drive |
| 90 | + |
| 91 | +### Attach the Drive in UTM |
| 92 | + |
| 93 | +1. With the VM running, plug in your USB DVD drive |
| 94 | +2. In the UTM window toolbar, click the **USB icon** |
| 95 | +3. Select your DVD drive to connect it to the VM |
| 96 | + |
| 97 | +### Verify the Drive |
| 98 | + |
| 99 | +SSH into your VM: |
| 100 | + |
| 101 | +```bash |
| 102 | +ssh username@<VM_IP_ADDRESS> |
| 103 | +``` |
| 104 | + |
| 105 | +Check if the drive is detected: |
| 106 | + |
| 107 | +```bash |
| 108 | +ls -la /dev/sr0 |
| 109 | +``` |
| 110 | + |
| 111 | +Expected output: |
| 112 | +``` |
| 113 | +brw-rw----+ 1 root cdrom 11, 0 Jan 29 05:28 /dev/sr0 |
| 114 | +``` |
| 115 | + |
| 116 | +--- |
| 117 | + |
| 118 | +## Part 5: Install Docker |
| 119 | + |
| 120 | +```bash |
| 121 | +sudo apt update && sudo apt upgrade -y |
| 122 | +curl -fsSL https://get.docker.com | sudo sh |
| 123 | +sudo usermod -aG docker $USER |
| 124 | +``` |
| 125 | + |
| 126 | +Log out and back in for group changes to take effect, then verify: |
| 127 | + |
| 128 | +```bash |
| 129 | +docker --version |
| 130 | +``` |
| 131 | + |
| 132 | +--- |
| 133 | + |
| 134 | +## Part 6: Install ARM |
| 135 | + |
| 136 | +### Create Directory Structure |
| 137 | + |
| 138 | +```bash |
| 139 | +mkdir -p ~/arm/{config,logs,music,movies,completed} |
| 140 | +cd ~/arm |
| 141 | +``` |
| 142 | + |
| 143 | +### Create Docker Compose File |
| 144 | + |
| 145 | +```bash |
| 146 | +cat > docker-compose.yml << 'EOF' |
| 147 | +services: |
| 148 | + arm: |
| 149 | + image: automaticrippingmachine/automatic-ripping-machine:latest |
| 150 | + container_name: arm |
| 151 | + restart: unless-stopped |
| 152 | + privileged: true |
| 153 | + environment: |
| 154 | + - PUID=1000 |
| 155 | + - PGID=1000 |
| 156 | + - TZ=America/New_York |
| 157 | + - ARM_UID=1000 |
| 158 | + - ARM_GID=1000 |
| 159 | + volumes: |
| 160 | + - ./config:/etc/arm/config |
| 161 | + - ./logs:/home/arm/logs |
| 162 | + - ./music:/home/arm/music |
| 163 | + - ./movies:/home/arm/media/movies |
| 164 | + - ./completed:/home/arm/media/completed |
| 165 | + ports: |
| 166 | + - "8080:8080" |
| 167 | + devices: |
| 168 | + - /dev/sr0:/dev/sr0 |
| 169 | +EOF |
| 170 | +``` |
| 171 | + |
| 172 | +> **Note:** Adjust `TZ` to your timezone (e.g., `America/Los_Angeles`, `Europe/London`) |
| 173 | +
|
| 174 | +### Start ARM |
| 175 | + |
| 176 | +```bash |
| 177 | +docker compose pull |
| 178 | +docker compose up -d |
| 179 | +``` |
| 180 | + |
| 181 | +### Verify ARM is Running |
| 182 | + |
| 183 | +```bash |
| 184 | +docker logs arm --tail 20 |
| 185 | +``` |
| 186 | + |
| 187 | +Look for: |
| 188 | +``` |
| 189 | +INFO ARM: DriveUtils.drives_search Optical drive detected: /dev/sr0 |
| 190 | +``` |
| 191 | + |
| 192 | +--- |
| 193 | + |
| 194 | +## Part 7: Access ARM |
| 195 | + |
| 196 | +Open your browser and navigate to: |
| 197 | + |
| 198 | +``` |
| 199 | +http://<VM_IP_ADDRESS>:8080 |
| 200 | +``` |
| 201 | + |
| 202 | +**Default credentials:** |
| 203 | +- Username: `admin` |
| 204 | +- Password: `password` |
| 205 | + |
| 206 | +> **Change the default password immediately** in Settings. |
| 207 | +
|
| 208 | +--- |
| 209 | + |
| 210 | +## Optional: Shared Media Library |
| 211 | + |
| 212 | +To save ripped media directly to a macOS folder, configure a VirtFS shared directory in UTM: |
| 213 | + |
| 214 | +1. Shut down the VM |
| 215 | +2. In UTM, edit the VM settings |
| 216 | +3. Under **Sharing**, add a directory path (e.g., `/Volumes/Media Library`) |
| 217 | +4. Start the VM and mount the share: |
| 218 | + |
| 219 | +```bash |
| 220 | +sudo mkdir -p /mnt/media-library |
| 221 | +sudo mount -t 9p -o trans=virtio share0 /mnt/media-library -oversion=9p2000.L |
| 222 | +``` |
| 223 | + |
| 224 | +5. Update your `docker-compose.yml` volumes to use `/mnt/media-library` |
| 225 | + |
| 226 | +For persistent mounting, add to `/etc/fstab`: |
| 227 | + |
| 228 | +``` |
| 229 | +share0 /mnt/media-library 9p trans=virtio,version=9p2000.L,rw,_netdev 0 0 |
| 230 | +``` |
| 231 | + |
| 232 | +> **Note:** VirtFS permissions require `chmod 777` on the shared directory due to UID mismatches between macOS and Linux. |
| 233 | +
|
| 234 | +--- |
| 235 | + |
| 236 | +## Troubleshooting |
| 237 | + |
| 238 | +### USB Drive Not Detected |
| 239 | + |
| 240 | +1. Verify you selected **Emulate** (QEMU), not Virtualize when creating the VM |
| 241 | +2. Check UTM's USB menu to ensure the drive is connected |
| 242 | +3. Run `ls -la /dev/sr*` in the VM |
| 243 | + |
| 244 | +### ARM Shows "No drives found" |
| 245 | + |
| 246 | +1. Verify `/dev/sr0` exists: `ls -la /dev/sr0` |
| 247 | +2. Check docker-compose.yml device path |
| 248 | +3. Restart the container: `docker compose restart` |
| 249 | + |
| 250 | +### Cannot Access Web UI |
| 251 | + |
| 252 | +1. Verify container is running: `docker ps` |
| 253 | +2. Check if VM IP changed: `ip addr show` |
| 254 | +3. Confirm port 8080 is exposed: `docker port arm` |
| 255 | + |
| 256 | +### Performance |
| 257 | + |
| 258 | +QEMU emulation is slower than native virtualization. This is the tradeoff for USB passthrough support. Ripping works but takes longer than on native hardware. |
| 259 | + |
| 260 | +--- |
| 261 | + |
| 262 | +## Maintenance Commands |
| 263 | + |
| 264 | +```bash |
| 265 | +# View logs |
| 266 | +docker logs arm -f |
| 267 | + |
| 268 | +# Restart ARM |
| 269 | +cd ~/arm && docker compose restart |
| 270 | + |
| 271 | +# Update ARM |
| 272 | +cd ~/arm && docker compose pull && docker compose up -d |
| 273 | + |
| 274 | +# Stop ARM |
| 275 | +cd ~/arm && docker compose down |
| 276 | +``` |
| 277 | + |
| 278 | +--- |
| 279 | + |
| 280 | +## Summary |
| 281 | + |
| 282 | +| Component | Value | |
| 283 | +|-----------|-------| |
| 284 | +| VM Software | UTM with QEMU backend | |
| 285 | +| Guest OS | Ubuntu Server 24.04 | |
| 286 | +| Container | `automaticrippingmachine/automatic-ripping-machine` | |
| 287 | +| Web Interface | `http://VM_IP:8080` | |
| 288 | +| Default Login | admin / password | |
| 289 | +| DVD Device | /dev/sr0 | |
0 commit comments