Releases: onexay/msl
Release list
msl 0.3.0
Changed
mslreads and writes a session's input and output itself, straight to the VM:msldonly starts the process and passesmslthe 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),mslduses 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).msldalso ignores SIGPIPE now; a write to a client that had gone away could kill it, and the VM with it.--import,--exportand--installmove the tar stream the same way, and VS Code's managed pipes (remote server connections, forwarded ports) are each anmsl --connectprocess, so a stuck pipe affects only itself.- Localhost forwarding is relayed by a separate process,
msl-portd(inlibexec/msl), as WSL'swslrelay.exedoes:msldsets up each forwarded port and connection but no longer copies their bytes, andmsl-portdhas no entitlements. It runs only while a port is forwarded. In the same way, a separate process,msl-fileviewd, relays the~/.msl/distrosview and checks its NFS calls, somsldno 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, andfsyncinside 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--moveto 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.
msldno 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 --connectprocess.
Fixed
msl --export <distro> - | head(or any reader that stops early) no longer abortsmslwith an uncaught "Broken pipe" exception; it exits with an error.
Removed
- Compatibility between different versions of
msl,msldand the VS Code extension: they're updated together.msld's connect socket (connect.sock) andmsl-bridgeare gone, and the extension needsmsl --connect. From this version on,msl --updatealso updates the extension in every IDE that has it; after updating to this version, runmsl --manage-ide --installonce. - 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
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.msldnow 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 whenmslconnects, and gives up to 30 s to do this.msl --uninstallremoves it. - Each new distribution gets its own disk, a sparse
ext4.imgin its install location, like WSL'sext4.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-placeand--install --vhd-sizenow work; images are raw ext4, not VHDX. Distributions from earlier versions stay on the shareddata.imguntil--move. Virtualization.framework passes no flushes to hot-attached disks, sofsyncinside 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/kvmin the distributions on an M3 or later.- The VM keeps one machine identifier across boots, and its
/etc/machine-idis 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/kvmworks in the distributions with nested virtualization (KVM_GET_API_VERSION12 on an M3 Pro), anduname -rshows the release,6.18.15-msl-a1a22bd, instead of6.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
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 PAGESIZEis 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 --installno longer hangs at the first setup prompt when its input is/dev/tty, as wheninstall.shruns it. On macOS/dev/ttymeans 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)
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
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.shpublishes 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
Fixed
- Sessions get the distribution's locale (
LANG,LANGUAGE,LC_*from/etc/default/localeor/etc/locale.conf), as in WSL and login shells. Without it, VS Code's terminal setLANGfrom its own UI language, and bash printedsetlocale: cannot change locale (en_US.UTF-8)on distros that don't have that locale, such as Ubuntu with onlyC.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
Fixed
mslfailed with "could not start /msld" when msld wasn't already running, for example right aftermsl --update. It looked for msld next toargv[0], which is justmslwhen run fromPATH. The same lookup set the install prefix for--update,--uninstalland--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 a127.0.0.1port, 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 = tcpbrings 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
Fixed
msl --shutdownleaves 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.defaultVhdSizein[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 --statusshows 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/macosin every distribution, not/mnt/mac(/macosunder a custom[automount] root). The environment variablesMSL_MAC_USER,MSL_MAC_HOMEandMSL_MAC_VIEWare nowMSL_MACOS_*, andmsl --version --jsonreportsmacosinstead ofmacOS. Scripts that use the old names need updating. - Messages and docs say "macOS" throughout, instead of mixing "Mac" and "macOS".
msl --versionand msld's log show the commit a build came from, as semver build metadata:0.1.7+3af5916(.dirtyfor uncommitted changes). Update checks still compare0.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, andmsl --versionshows it. - The kernel enables device-mapper (
CONFIG_BLK_DEV_DM) and the NBD client (CONFIG_BLK_DEV_NBD). - The initramfs carries static
e2fsckandresize2fsfrom 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
Changed
msl --manage <distro> --movenow 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
~/.mslconfigis now[msl2].[wsl2]still works, so existing files and a copied.wslconfigneed 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
aptandcurlcouldn'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
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.comwhile 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