Files
byre/docs/clean-install-vm.md
T

56 lines
4.1 KiB
Markdown

# Testing a clean install in a macOS VM
A tart VM on the Mac byre runs on gives a fresh Mac in seconds, to install byre on as a new user would. `tart list` shows the VMs there.
## The base VM
`byre-base` is a stopped VM left as just set up, kept in `~/.tart/vms/` (outside any checkout), and never run or installed into. Tests run on clones of it. It has:
- the macOS that `tart create --from-ipsw latest` installed (the newest the host supports; `tart get byre-base` and `sw_vers` inside show it), 4 CPUs, 8 GB of memory and an 80 GB disk;
- one account, `admin` with password `admin`, signed in automatically at boot, with passwordless `sudo`, the host user's `~/.ssh/id_ed25519.pub` in `authorized_keys`, Remote Login on, and sleep and screen lock off;
- no Apple Account, FileVault, Siri, Location Services or analytics, and macOS updates that download without installing;
- nothing else: no Homebrew, Command Line Tools, Tailscale or byre.
## Testing
```
tart clone byre-base byre-test
tart run byre-test
```
Run `tart run` in the task's terminal: it keeps running while the VM is up, and the VM's screen opens as a `tart` window. `tart ip byre-test` prints the VM's address once it has booted; `ssh admin@<ip>` gets in. `tart delete byre-test` throws the clone away. A clone is a copy-on-write copy, so it takes seconds and little disk. Apple's license allows two macOS VMs running at once per Mac, and other tasks may be running one.
To install a build, copy `~/byre-deploy/byre.dmg` (or a `mac/bundle.sh` build) in and put `Byre.app` in `/Applications` there. Copy an app bundle as a zip (`ditto -c -k --keepParent` on the host, `ditto -x -k` in the VM), since `scp -r` fails on the symlinks in its frameworks. Open apps in the VM's GUI session from SSH with `sudo launchctl asuser 501 sudo -u admin open /Applications/Byre.app`.
The app's Tailscale sign-in opens Safari in the VM. To have the human approve it from their own Mac, read the address over SSH (`sudo launchctl asuser 501 sudo -u admin osascript -e 'tell application "Safari" to get URL of front document'`, which asks once in the VM for Automation of Safari) and open the `https://login.tailscale.com/a/<code>` it names with `show_page` on the human's Mac.
## Driving the VM's screen
- Click the `tart` window's title bar first: the VM takes clicks and keys only while its window is the key window.
- Keys reach the VM without their modifiers through hands, so Shift, Cmd and symbols typed with `type` or `key` arrive wrong. Type only lowercase text and plain symbols there, and do the rest over SSH.
- Scrolling doesn't reach the VM; drag the scroll bar instead.
- `screencapture` over SSH fails for lack of Screen Recording in the VM; capture the `tart` window from the host with hands.
- Check `screen_list` before acting: another task's `tart` window can sit exactly on top of yours.
## Rebuilding the base
Only when it needs a newer macOS. `tart create --from-ipsw latest --disk-size 80 byre-base` downloads the restore image (about 15 GB, cached in `~/.tart/cache/IPSWs/`) and installs it; `tart set byre-base --cpu 4 --memory 8192`. Run it and click through Setup Assistant: "Set up as new", account `admin`/`admin`, skip the Apple Account ("Sign in Later in Settings"), and decline everything else. Then turn on Remote Login from the VM's Terminal:
```
sudo launchctl enable system/com.openssh.sshd; sudo launchctl bootstrap system /System/Library/LaunchDaemons/ssh.plist
```
and over SSH from the host (`ssh-copy-id admin@<ip>`, then):
```
echo 'admin ALL=(ALL) NOPASSWD: ALL' | sudo tee /etc/sudoers.d/admin
sudo chmod 440 /etc/sudoers.d/admin
sudo launchctl asuser 501 sudo sysadminctl -autologin set -userName admin -password admin
sudo pmset -a sleep 0 displaysleep 0
sudo shutdown -h now
```
`sysadminctl -autologin` fails with error 22 when run over SSH outside the GUI session, hence `launchctl asuser`.
tart itself is installed from its GitHub release (`gh release download --repo cirruslabs/tart`, unpacked to `~/Applications/tart.app`, with `~/bin/tart` linked to `tart.app/Contents/MacOS/tart`), since the Homebrew formula in `cirruslabs/cli` fails on current Homebrew.