msl list (or ls, instances) | Every instance. |
msl new <name> [--distro <d>] [--cpus <n>] [--memory <size>] [--disk <size>] | Creates an instance, sized, without opening a shell. --memory 2G-8G makes it dynamic. |
msl resources [instance] | Its CPUs, memory and disk. Also msl config. |
msl resources <instance> --cpus 4 --memory 6G --disk 128G | Changes them — the same settings as the Resources and Storage cards. --disk-fixed <size> reserves the space up front. |
msl forward <instance> <mac port>:<linux port> | Opens that port on this Mac, reaching the guest's. Bound to 127.0.0.1 only, so nothing outside this Mac can see it. Reaches a server the guest bound on 0.0.0.0; for one bound on 127.0.0.1 - which Flask, Vite, Rails and manage.py runserver all do by default - add --ssh, which forwards through the guest's own sshd and so connects from inside. Refused while the instance is sandboxed: a forwarded port would be a way out of the box. |
msl unforward <mac port> | Closes it. Never refused by a policy - it reduces what this Mac exposes. |
msl admin certify <lineage|instance> [--label "..."] | Signs a statement that this image is yours. The one tier a local user cannot forge: instance identities are signed by a key mslhd can read, a certificate by your MSLAP key — which a fleet keeps on another machine. Copy the file to /Library/Application Support/MSL/lineages/ on each Mac (needs sudo) so a non-administrator cannot add or remove one. |
msl admin revoke <lineage|instance> [--reason "..."] | Withdraws an image. Every instance of that lineage then refuses to start, and no capability can set it aside — a revocation a policy could override would be no revocation at all. |
msl vault <instance> status | Whether its disk is in an encrypted container, and whose key opens it. |
msl vault <instance> adopt | Moves the container to a passphrase you hold instead of this Mac's own key. After this nothing on the Mac can open it until someone types it, including MSL after a reboot — and there is no recovery if it is lost. This is the rung that resists a determined administrator of this Mac; the default one does not. |
msl vault <instance> unlock / lock | Supplies that passphrase for this session, or forgets it and closes the container. The key is never written down, so a reboot asks again. |
msl protect <instance> | Moves the instance's disk into an encrypted container (AES-256), so a copy of the file is useless on any other Mac. The key is derived from the instance's identity and never stored. A real copy of the whole disk, so it takes minutes and needs that much free space while it runs; the original goes only after the copy inside has been read back and checked. What it does not do: anything inside the instance stays readable to anyone who can open a shell in it, and a determined administrator of this Mac can still reach the key. |
msl unprotect <instance> | Moves it back out as a plain file. Refused where the policy denies instance.clone — an administrator who sealed an image did not mean it unsealed. |
msl identity [instance] | Where an instance came from: a fresh original, or a copy, and how many copies deep. Every instance is issued a signed lineage when it is created; a clone keeps its parent's lineage and gains a generation, so a copy can be told from an original even if it arrived outside MSL. Reports only — nothing is refused on an identity in this version. |
msl rename <instance> <new name> | Renames it, carrying its disk, accounts, settings and per-app overrides. Refused while it is running, and while it has hibernated memory or a snapshot: a guest's network address is derived from its name, and macOS will not restore saved state whose address has changed. Its Launchpad entries and Dock pins are removed, since a generated app launches an instance by name. |
msl clone <instance> <new name> | Makes a second instance from it - the disk is an instant APFS copy, so it costs nothing until the two diverge. The copy keeps the original's SSH host key until the guest makes a new one. Refused while the original is running: copying a mounted filesystem captures it mid-write. |
msl remove <instance> [--keep-disk] | Removes it and its saved state. Removing a distro's last instance also deletes its disk, unless --keep-disk. |
msl status [instance] | Its state. |
msl suspend [instance] | Freezes it in memory. |
msl resume [instance] | Unfreezes or starts it. |
msl hibernate [instance] | Saves it to disk and stops it. |
msl --hibernate [instance] | The same — for every running instance if none is named. |
msl --shutdown [instance] | Asks Linux to power off, then stops it — every running instance if none is named. |