Skip to content

Releases: onexay/msl

msl 0.3.0

Choose a tag to compare

@onexay onexay released this 01 Oct 12:43
3038879

Changed

  • msl reads and writes a session's input and output itself, straight to the VM: msld only starts the process and passes msl the session's vsock connections (#57). Output through a pipe is about twice as fast (4 GiB in 4.8 s, was 8.2 s), input slightly faster (4.9 s, was 5.7 s), msld uses no CPU for it, and one slow or stuck session can no longer stall the others: the VM dials these connections, which a stalled reader can't freeze (#36). msld also ignores SIGPIPE now; a write to a client that had gone away could kill it, and the VM with it. --import, --export and --install move the tar stream the same way, and VS Code's managed pipes (remote server connections, forwarded ports) are each an msl --connect process, so a stuck pipe affects only itself.
  • Localhost forwarding is relayed by a separate process, msl-portd (in libexec/msl), as WSL's wslrelay.exe does: msld sets up each forwarded port and connection but no longer copies their bytes, and msl-portd has no entitlements. It runs only while a port is forwarded. In the same way, a separate process, msl-fileviewd, relays the ~/.msl/distros view and checks its NFS calls, so msld no longer carries file data either (it used about 4.6 s of CPU per GiB read).
  • A distribution's disk is attached to the VM as virtio-blk when the VM boots, served by Virtualization.framework like data.img, instead of through msld's NBD disk slots. msld no longer serves disk I/O, and fsync inside a distribution reaches the SSD again. virtio-blk can't be hot-plugged: a disk added while the VM runs (an install, an import, a --move to another volume, a --resize) makes msld restart the VM if no distribution is running, which takes about 1.5 s. If one is, the new disk is mounted through a loop device over the Mac share until the VM next restarts; that path is slower, and it's flushed to the SSD when the disk is detached and at shutdown. Up to 19 distribution disks are attached at boot, and the rest use the loop device. A distribution's disk is no longer limited to 4 TB.
  • An idle MSL wakes the Mac far less. msld no longer polls: its idle timers sleep until the next deadline instead of ticking every second, and its copy and accept loops block instead of waking every 100–200 ms (context switches while idle: about 1030 per 30 s before, 5–8 after). In the VM, the process reaper sleeps until a child exits instead of checking 20 times a second when there's none, and the localhost-forwarding port watcher is woken by the kernel (a sock_ops BPF program) when a port opens or closes instead of scanning every 500 ms. Idle, the VM's process now uses about 0.5% CPU, down from 2.5–3.5%.
  • The bundled VS Code extension is 0.2.0: each managed pipe is an msl --connect process.

Fixed

  • msl --export <distro> - | head (or any reader that stops early) no longer aborts msl with an uncaught "Broken pipe" exception; it exits with an error.

Removed

  • Compatibility between different versions of msl, msld and the VS Code extension: they're updated together. msld's connect socket (connect.sock) and msl-bridge are gone, and the extension needs msl --connect. From this version on, msl --update also updates the extension in every IDE that has it; after updating to this version, run msl --manage-ide --install once.
  • The NBD disk slots and MSL_DISK_SLOTS.

Install: sh install.sh (or sh install.sh --version 0.3.0). Update an existing install with msl --update.

Kernel Linux 6.18.15-msl-a1a22bd, release kernel-6.18.15-msl-a1a22bd
VS Code extension release vscode-0.2.0, installed by msl --manage-ide
Commit 3038879
Requires Apple silicon, macOS 26 or later
GPL sources BusyBox and e2fsprogs: the attached Debian source packages busybox_* and e2fsprogs_*. Kernel: attached to kernel-6.18.15-msl-a1a22bd.
Built by CI run 36862363559, Xcode 26.6
Signing ad-hoc (not notarised); checksum not PGP-signed

msl-0.3.0-macos-arm64.tar.gz SHA-256: 066f21286ef9b43647fd4c4c9f23a3d816c1b04786eac9f8d4772d35c263e504

msl 0.2.0

Choose a tag to compare

@onexay onexay released this 29 Sep 18:01
cb90aad

Added

  • msl shuts down cleanly when you log out, restart or shut down the Mac (#52). Before, the VM died with msld: distributions got no warning, and writes not yet synced were lost. msld now stops the distributions (5 s grace), unmounts and flushes their disks, and powers the VM off. It runs as a LaunchAgent (~/Library/LaunchAgents/dev.msl.msld.plist) that launchd starts on demand when msl connects, and gives up to 30 s to do this. msl --uninstall removes it.
  • Each new distribution gets its own disk, a sparse ext4.img in its install location, like WSL's ext4.vhdx (#50). Disks are attached to the running VM through 16 NBD disk slots served by msld. --manage --move, per-distribution --manage --resize, --export --vhd, --import --vhd, --import-in-place and --install --vhd-size now work; images are raw ext4, not VHDX. Distributions from earlier versions stay on the shared data.img until --move. Virtualization.framework passes no flushes to hot-attached disks, so fsync inside a distribution isn't a durability point: writes are flushed to the SSD when a disk is detached and at shutdown (Disk and storage).
  • [msl2] nestedVirtualization (default true): /dev/kvm in the distributions on an M3 or later.
  • The VM keeps one machine identifier across boots, and its /etc/machine-id is that identifier's UUID.

Changed

  • The documentation is now the MSL documentation site, https://onexay.github.io/msl-docs/ (source). msl no longer builds a site of its own, and its docs/ folder holds the developer notes.
  • The kernel and the VS Code extension moved to their own repositories, msl-kernel and msl-vscode-extension. msl pins a release of each (scripts/pin.sh) and bundles it as before.
  • Kernel kernel-6.18.15-msl-a1a22bd: KVM is built in, so /dev/kvm works in the distributions with nested virtualization (KVM_GET_API_VERSION 12 on an M3 Pro), and uname -r shows the release, 6.18.15-msl-a1a22bd, instead of 6.18.15.

Install: sh install.sh (or sh install.sh --version 0.2.0). Update an existing install with msl --update.

Kernel Linux 6.18.15-msl-a1a22bd, release kernel-6.18.15-msl-a1a22bd
VS Code extension release vscode-0.1.1, installed by msl --manage-ide
Commit cb90aad
Requires Apple silicon, macOS 26 or later
GPL sources BusyBox and e2fsprogs: the attached Debian source packages busybox_* and e2fsprogs_*. Kernel: attached to kernel-6.18.15-msl-a1a22bd.
Built by CI run 36607685165, Xcode 26.6
Signing ad-hoc (not notarised); checksum not PGP-signed

msl-0.2.0-macos-arm64.tar.gz SHA-256: 3ea4b2fed50950013670ffbd7940bfa1dc4f2425cc08bd4ae8794dd9690ee0e0

msl 0.1.11

Choose a tag to compare

@onexay onexay released this 28 Sep 17:12

Fixed

  • The VM no longer crashes when macOS runs short of memory. With the 4 KiB-page kernel, every distribution could crash within seconds once macOS started compressing or swapping the VM's memory, and a crash in the middle of a write could damage the data disk (#48). The cause is Virtualization.framework's handling of 4 KiB guest pages on the Mac's 16 KiB pages. MSL's kernel now uses 16 KiB pages, like the Mac (getconf PAGESIZE is 16384). Ubuntu 22.04 and 26.04, Debian 13, Fedora 44, AlmaLinux 9 and Kali were tested: every binary and library loads, and systemd and package managers work. Programs built to assume 4 KiB pages don't run; see Troubleshooting.
  • msl --install no longer hangs at the first setup prompt when its input is /dev/tty, as when install.sh runs it. On macOS /dev/tty means the calling process's controlling terminal, and msld has none. msl now passes msld the real terminal device instead.

Install: sh install.sh (or sh install.sh --version 0.1.11). Update an existing install with msl --update.

Kernel Linux 6.18.15-msl-21f0ec7, release kernel-6.18.15-msl-21f0ec7
VS Code extension release vscode-0.1.1, installed by msl --manage-ide
Commit 1982505
Requires Apple silicon, macOS 26 or later
GPL sources BusyBox and e2fsprogs: the attached Debian source packages busybox_* and e2fsprogs_*. Kernel: attached to kernel-6.18.15-msl-21f0ec7.
Built by CI run 36455383803, Xcode 26.6
Signing ad-hoc (not notarised); checksum not PGP-signed

msl-0.1.11-macos-arm64.tar.gz SHA-256: 28fcf25c4444d4f7e986d041fa47a297db793326c6c6ce0200b195b0687ce93e

MSL kernel 6.18.15 (21f0ec7)

Choose a tag to compare

@onexay onexay released this 28 Sep 16:29

Linux 6.18.15 (arm64), built by CI run 36450256573 (kernel/build-linux.sh on ubuntu-24.04-arm) from kernel/base.config + kernel/msl.fragment, commit b1b90ca. Used by scripts/build.sh via kernel/fetch.sh. GPL-2.0. Corresponding source: linux-6.18.15.tar.xz (attached, unmodified from kernel.org) plus the attached config; kernel/build-linux.sh reproduces the build.

msl 0.1.10

Choose a tag to compare

@onexay onexay released this 26 Sep 05:25

Fixed

  • msl starts on macOS 26 again. 0.1.9 was built with Xcode 27, whose Swift runtime links libraries macOS 26 doesn't have, so msld failed to start there. Releases are now built by CI with Xcode 26, the version that matches msl's minimum macOS, and scripts/publish.sh publishes that build instead of packaging on the releaser's Mac.

Install: sh install.sh (or sh install.sh --version 0.1.10). Update an existing install with msl --update.

Kernel Linux 6.18.15-msl-76f230e, release kernel-6.18.15-msl-76f230e
VS Code extension release vscode-0.1.1, installed by msl --manage-ide
Commit bb75105
Requires Apple silicon, macOS 26 or later
GPL sources BusyBox and e2fsprogs: the attached Debian source packages busybox_* and e2fsprogs_*. Kernel: attached to kernel-6.18.15-msl-76f230e.
Built by CI run 36220303941, Xcode 26.6
Signing ad-hoc (not notarised); checksum not PGP-signed

msl-0.1.10-macos-arm64.tar.gz SHA-256: e7cb14fa661272a5bae4e5e99ed17d2aa2da03c8191e383781345bc9d5232c51

msl 0.1.9

Choose a tag to compare

@onexay onexay released this 25 Sep 16:56

Fixed

  • Sessions get the distribution's locale (LANG, LANGUAGE, LC_* from /etc/default/locale or /etc/locale.conf), as in WSL and login shells. Without it, VS Code's terminal set LANG from its own UI language, and bash printed setlocale: cannot change locale (en_US.UTF-8) on distros that don't have that locale, such as Ubuntu with only C.UTF-8.

Install: sh install.sh (or sh install.sh --version 0.1.9). Update an existing install with msl --update.

Kernel Linux 6.18.15-msl-76f230e, release kernel-6.18.15-msl-76f230e
VS Code extension release vscode-0.1.1, installed by msl --manage-ide
Commit 99cc265
Requires Apple silicon, macOS 26 or later
GPL sources BusyBox and e2fsprogs: the attached Debian source packages busybox_* and e2fsprogs_*. Kernel: attached to kernel-6.18.15-msl-76f230e.
Signing ad-hoc (not notarised); checksum not PGP-signed

msl-0.1.9-macos-arm64.tar.gz SHA-256: 8d91794ec1ee0048435483efdc877e1e6dc11a4ef630a61a1e015932bb3c21ba

msl 0.1.8

Choose a tag to compare

@onexay onexay released this 25 Sep 16:24

Fixed

  • msl failed with "could not start /msld" when msld wasn't already running, for example right after msl --update. It looked for msld next to argv[0], which is just msl when run from PATH. The same lookup set the install prefix for --update, --uninstall and --version --json, and the msl path recorded for the VS Code extension. msl now uses its real executable path.

Security

  • Other local user accounts can no longer read or change your distributions through ~/.msl/distros (#1). The view is served through a 0600 Unix socket instead of a 127.0.0.1 port, and msld checks every NFS call: only your user ID and the kernel's get through, and only msld can mount the view. [msl2] fileViewTransport = tcp brings back the port, with the same checks but weaker protection.

Install: sh install.sh (or sh install.sh --version 0.1.8). Update an existing install with msl --update.

Kernel Linux 6.18.15-msl-76f230e, release kernel-6.18.15-msl-76f230e
VS Code extension release vscode-0.1.1, installed by msl --manage-ide
Commit 36cb3ef
Requires Apple silicon, macOS 26 or later
GPL sources BusyBox and e2fsprogs: the attached Debian source packages busybox_* and e2fsprogs_*. Kernel: attached to kernel-6.18.15-msl-76f230e.
Signing ad-hoc (not notarised); checksum not PGP-signed

msl-0.1.8-macos-arm64.tar.gz SHA-256: 8dde8321bb56d64e451c2a8aed8db2781b2f7973697b90d8fc3565471b6f85d0

msl 0.1.7

Choose a tag to compare

@onexay onexay released this 25 Sep 14:35

Fixed

  • msl --shutdown leaves the shared disk clean. It used to power off with the filesystem still marked for journal recovery, which then ran at every boot (#45).

Added

  • msl --manage <distro> --resize <size> grows the disk all distributions share (#3). Stop every distribution first (msl --shutdown). msl restarts the VM, which checks and grows the filesystem before mounting it (about 3 s for 256 GB). The disk can't shrink, and can't be larger than the macOS disk.
  • defaultVhdSize in [msl2] (as in .wslconfig) sets the disk's size when it's created. Without it, a new disk is 256 GB, but never more than the macOS disk.
  • msl --status shows the disk: its maximum size, what it uses on macOS, and what's free in the distributions and on macOS. It warns when macOS is nearly out of disk space, which the distributions can't see.

Changed

  • Renamed, breaking: macOS files are mounted at /mnt/macos in every distribution, not /mnt/mac (/macos under a custom [automount] root). The environment variables MSL_MAC_USER, MSL_MAC_HOME and MSL_MAC_VIEW are now MSL_MACOS_*, and msl --version --json reports macos instead of macOS. Scripts that use the old names need updating.
  • Messages and docs say "macOS" throughout, instead of mixing "Mac" and "macOS".
  • msl --version and msld's log show the commit a build came from, as semver build metadata: 0.1.7+3af5916 (.dirty for uncommitted changes). Update checks still compare 0.1.7.
  • Kernel releases are tagged with a hash of their config instead of a counter: kernel-6.18.15-msl-76f230e. The same config always gives the same tag, and msl --version shows it.
  • The kernel enables device-mapper (CONFIG_BLK_DEV_DM) and the NBD client (CONFIG_BLK_DEV_NBD).
  • The initramfs carries static e2fsck and resize2fs from Debian's e2fsprogs 1.47.2 (GPL-2.0); their source is attached to each release.

Install: sh install.sh (or sh install.sh --version 0.1.7). Update an existing install with msl --update.

Kernel Linux 6.18.15-msl-76f230e, release kernel-6.18.15-msl-76f230e
VS Code extension release vscode-0.1.1, installed by msl --manage-ide
Commit 66fb0af
Requires Apple silicon, macOS 26 or later
GPL sources BusyBox and e2fsprogs: the attached Debian source packages busybox_* and e2fsprogs_*. Kernel: attached to kernel-6.18.15-msl-76f230e.
Signing ad-hoc (not notarised); checksum not PGP-signed

msl-0.1.7-macos-arm64.tar.gz SHA-256: 5717463112920b0a1a21f5d0bd846aaf8a579706dd373fada3d42b05e782a4ad

msl 0.1.6

Choose a tag to compare

@onexay onexay released this 25 Sep 12:44

Changed

  • msl --manage <distro> --move now fails with "not supported" instead of reporting success. It only recorded the location: every distro lives on the shared disk, so nothing was moved.
  • The VM section of ~/.mslconfig is now [msl2]. [wsl2] still works, so existing files and a copied .wslconfig need no change.

Fixed

  • Names that are CNAME aliases (deb.debian.org, cdn.kernel.org, www.apple.com) resolve in distros again. 0.1.5's DNS fix made macOS report the CNAME record as well, and msld then answered with the alias alone or with records glibc rejects, so lookups failed and apt and curl couldn't reach those hosts (#42).

Install: sh install.sh (or sh install.sh --version 0.1.6). Update an existing install with msl --update.

Kernel Linux 6.18.15-msl, release kernel-6.18.15-msl.1
VS Code extension release vscode-0.1.1, installed by msl --manage-ide
Commit fbd0895
Requires Apple silicon, macOS 26 or later
GPL sources BusyBox: the attached Debian source package busybox_*. Kernel: attached to kernel-6.18.15-msl.1.
Signing ad-hoc (not notarised); checksum not PGP-signed

msl-0.1.6-macos-arm64.tar.gz SHA-256: 319e93504f3345ea62e744b56150445a847aba51a495c519c14849de98a83697

msl 0.1.5

Choose a tag to compare

@onexay onexay released this 25 Sep 10:56

Fixed

  • DNS lookups in distros no longer stall for 5 to 10 seconds when a name has an IPv4 address but no IPv6 one, as github.com does. msld now passes on macOS's "no such record" answer instead of waiting out its timeout. Tools that look up both address families, such as VS Code's extension host, curl and git, used to hit connect timeouts; VS Code timed out connecting to api.github.com while cloning (#41).

Install: sh install.sh (or sh install.sh --version 0.1.5). Update an existing install with msl --update.

Kernel Linux 6.18.15-msl, release kernel-6.18.15-msl.1
VS Code extension release vscode-0.1.1, installed by msl --manage-ide
Commit 0a7b590
Requires Apple silicon, macOS 26 or later
GPL sources BusyBox: the attached Debian source package busybox_*. Kernel: attached to kernel-6.18.15-msl.1.
Signing ad-hoc (not notarised); checksum not PGP-signed

msl-0.1.5-macos-arm64.tar.gz SHA-256: 9c1b2613575ded8d3f565000bc29fc1a0f52c52dde4b2cc4ae40716b0997d98d