MSL release notes
What changed in each MSL release, newest first. Update to the latest release with msl --update. Changes that can break a script or a habit are marked Breaking. Each version links to its GitHub release, which has the downloads and checksums.
0.3.0
1 October 2026 · GitHub release · kernel kernel-6.18.15-msl-a1a22bd
Changed
- Breaking: MSL, its service and the VS Code extension are updated together, and the extension from MSL 0.2.0 or earlier can’t connect to MSL 0.3.0. After updating from 0.2.0, run
msl --manage-ide --installonce. From then on,msl --updatealso updates the extension in every IDE that has it. See Upgrade MSL. - A command’s input and output go straight between
msland the VM instead of throughmsld(#57). Output through a pipe is about twice as fast (4 GiB in 4.8 s, was 8.2 s), and a slow or stuck command no longer slows down the others.msl --import,--exportand--installmove their tar streams the same way. - Each distribution’s disk is attached to the VM when it starts and served by Virtualization.framework, so
fsyncinside a distribution reaches the SSD again: the durability caveat of 0.2.0 no longer applies. A disk that appears while the VM runs (an install, an import, a move to another volume, a resize) restarts the VM if no distribution is running, in about 1.5 s; otherwise it’s served more slowly until the VM next restarts. Up to 19 disks are attached at start, and a disk is no longer limited to 4 TB. See Manage disk space. - An idle MSL wakes the Mac far less: the idle VM uses about 0.5% CPU, down from 2.5–3.5%.
- Forwarded ports and
~/.msl/distrosare carried by two processes of their own,msl-portdandmsl-fileviewd, like WSL’swslrelay.exe, somsldno longer copies their data. - MSL bundles VS Code extension 0.2.0.
Fixed
msl --export <distro> -into a reader that stops early (| head) no longer crashesmsl.
Removed
MSL_DISK_SLOTS, with the disk slots it sized.
0.2.0
29 September 2026 · GitHub release · kernel kernel-6.18.15-msl-a1a22bd
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, 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 and gives up to 30 seconds 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). It’s 256 GB by default, or the size of the macOS disk if that’s smaller;msl --install --vhd-sizeanddefaultVhdSizechoose another size. The VM attaches disks through 16 disk slots, so a stopped distribution you haven’t used for a while can give its slot up. See Manage disk space. msl --manage --move,msl --manage --resizefor one distribution,msl --export --vhd,msl --import --vhdandmsl --import-in-placework as in WSL, with raw ext4 images instead of VHDX.msl --unregisterdeletes the distribution’sext4.img, including one imported in place.nestedVirtualizationin[msl2], as in.wslconfig(defaulttrue):/dev/kvmin the distributions on a Mac with an M3 chip or later; MSL’s kernel (6.18.15-msl-a1a22bd) has KVM built in, anduname -rnow shows that release.msl --statusshows whether it’s on.- The VM keeps one machine identifier across boots, and its
/etc/machine-idis that identifier’s UUID. Distributions keep their own.
Changed
- Breaking:
msl --manage <distro> --resizegrows that distribution’s disk (it must be stopped) rather thandata.imgfor all of them. Distributions from earlier versions stay ondata.img, and--resizestill growsdata.imgfor them, until you move them onto their own disk withmsl --manage <distro> --move <folder>. - Breaking:
fsyncinside a distribution on its own disk isn’t a durability point. Virtualization.framework passes no flushes to these disks, so writes are flushed to the SSD when a disk is detached and atmsl --shutdown. A crash of MSL or the VM keeps what was written; a macOS crash or power loss can lose recent writes. See Durability. msl --statusshows the distributions’ disks (Distribution disks), and the shared disk only while a distribution is still on it.- The kernel and the VS Code extension moved to their own repositories, msl-kernel and msl-vscode-extension. MSL still bundles both.
0.1.11
28 September 2026 · GitHub release · kernel kernel-6.18.15-msl-21f0ec7
Fixed
- The VM no longer crashes when macOS runs short of memory (#48). 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. The cause is Virtualization.framework’s handling of 4 KiB pages in the VM 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, andmsldhas none.mslnow passesmsldthe real terminal device.
0.1.10
26 September 2026 · GitHub release
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
msldfailed to start there. Releases are now built by CI with Xcode 26, the version that matches MSL’s minimum macOS. If you installed 0.1.9 on macOS 26, reinstall with the one-line installer; your distributions are kept.
0.1.9
25 September 2026 · GitHub release
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 VS Code’s own display language, and bash printedsetlocale: cannot change locale (en_US.UTF-8)on distributions without that locale, such as Ubuntu with onlyC.UTF-8.
0.1.8
25 September 2026 · GitHub release
Fixed
mslfailed with “could not start/msld” when msldwasn’t already running, for example right aftermsl --update. It looked formsldnext toargv[0], which is justmslwhen it runs fromPATH. The same lookup set the install prefix for--update,--uninstalland--version --json, and the path recorded for the VS Code extension.mslnow 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 Unix socket that only your user can open, instead of a127.0.0.1port, andmsldchecks every NFS call: only your user ID and the kernel’s get through, and onlymsldcan mount the view.fileViewTransport = tcpin[msl2]brings back the port, with the same checks but weaker protection. See Security model.
0.1.7
25 September 2026 · GitHub release · kernel kernel-6.18.15-msl-76f230e
Added
msl --manage <distro> --resize <size>grows the disk all distributions share (#3). Stop every distribution first withmsl --shutdown. MSL restarts the VM, which checks and grows the filesystem before mounting it, in about 3 seconds 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
- Breaking: macOS files are mounted at
/mnt/macosin every distribution, not/mnt/mac(/macoswith a custom[automount] root). The environment variablesMSL_MAC_USER,MSL_MAC_HOMEandMSL_MAC_VIEWare nowMSL_MACOS_USER,MSL_MACOS_HOMEandMSL_MACOS_VIEW, andmsl --version --jsonreportsmacosinstead ofmacOS. Update scripts, shell profiles and editor settings that use the old names; there’s no compatibility link. - Messages say “macOS” throughout, instead of mixing “Mac” and “macOS”.
msl --versionandmsld’s log show the commit a build came from, as0.1.7+3af5916(with.dirtyfor uncommitted changes). Update checks still compare the plain version.- Kernel releases are tagged with a hash of their configuration instead of a counter, for example
kernel-6.18.15-msl-76f230e.msl --versionshows it. - The kernel enables device-mapper and the NBD client. See Kernel release notes.
- The VM’s initial RAM disk carries static
e2fsckandresize2fsfrom Debian’s e2fsprogs 1.47.2 (GPL-2.0), to check and grow the shared disk. Their source is attached to each release.
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).
0.1.6
25 September 2026 · GitHub release
Changed
- Breaking:
msl --manage <distro> --movefails with “not supported” instead of reporting success. It only recorded the location: every distribution 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, such as deb.debian.org, cdn.kernel.org and www.apple.com, resolve in distributions again (#42). 0.1.5’s DNS fix made macOS report the CNAME record as well, and
msldthen answered with the alias alone or with records glibc rejects, soaptandcurlcouldn’t reach those hosts.
0.1.5
25 September 2026 · GitHub release
Fixed
- DNS lookups no longer stall for 5 to 10 seconds when a name has an IPv4 address but no IPv6 one, as github.com does (#41).
msldnow passes on macOS’s “no such record” answer instead of waiting for a timeout. Tools that look up both address families, such as curl, git and VS Code’s extension host, used to hit connect timeouts; VS Code timed out connecting toapi.github.comwhile cloning.
0.1.4
25 September 2026 · GitHub release
Added
msl --manage-ide [--ide <vscode|vscode-insiders|vscode-oss|cursor|all>] [--install|--uninstall]sets up the VS Code extension (#35). It installs the bundled extension and enables its proposed API in the IDE’sargv.json, keeping comments and other keys. Without options, it lists the IDEs it finds and asks what to do. The installer runs it for the IDEs it finds (--no-ideskips this), andmsl --uninstallundoes it.- A preview VS Code extension that opens folders inside a distribution, with no SSH and no network port on macOS. See Get started with VS Code and the VS Code extension release notes.
msld’s connect socket,connect.sock, which the extension uses to open byte streams into a distribution (#32).
Changed
- Breaking: distribution files on macOS moved from
~/MSL/<distro>to~/.msl/distros/<distro>, so they no longer add a visible folder to your home directory. Each distribution still appears in Finder under Locations with its logo. On start,msldunmounts old~/MSLmounts and removes~/MSLif it’s empty.MSL_VIEW_DIRstill overrides the location. - x86_64-only distributions (Arch Linux, SUSE Linux Enterprise, eLxr) are no longer offered by
msl --list --online, andmsl --installrefuses them (#40).--install --from-filestill accepts x86_64 images. - Releases no longer include a
.pkg.install.shis the way to install MSL, and the only one that sets up IDEs. - The VS Code extension has its own releases,
vscode-<version>, like the kernel. Each MSL release bundles the published one.
Fixed
msl --helplists every commandmslaccepts, adding--debug-shell,--mountand--unmount,--update,--uninstall,--manage,--set-version,--set-default-versionand--list --online.msldremoves its VM bridge sockets when the VM stops, so stale sockets no longer pile up.
0.1.3
25 September 2026 · GitHub release
Added
--jsonfor the query commands:--listand its variants,--list --online,--statusand--version. Errors go to stderr as JSON, withwsl.exe’s exit codes.
0.1.2
24 September 2026 · GitHub release
Fixed
- Stopping a distribution (
--terminate, the idle timeout,--shutdown) shuts it down cleanly instead of killing it (#19). systemd distributions power off, and other distributions’ processes getSIGTERM. Anything still running after 10 seconds is killed. Previously journald reported “corrupted or uncleanly shut down” journals, and services could lose unflushed data. - The network interface stays
eth0, as in WSL (#20). systemd 259, in Ubuntu 26.04, treats the distribution as a container, so it ignorednet.ifnames=0and renamed the interface toenp0s1.
0.1.1
24 September 2026 · GitHub release · kernel kernel-6.18.15-msl.1
The first release. (0.1.0 was withdrawn before it was announced; 0.1.1 replaces it.)
- The
wsl.execommand line on macOS, with the same arguments, behaviour and messages: install, import, export and unregister; list, set the default, terminate and shut down;--status,--manage,--mountand--unmount;--debug-shell,--update,--uninstalland--version. - Unmodified arm64 WSL distribution images, from Microsoft’s distribution list or a
.wslfile, in one lightweight Virtualization.framework VM. Each distribution gets its own init and can run systemd. - Integration with macOS: the macOS filesystem in every distribution, with
mslstarting in your current macOS directory;MSLENVandmslpath; localhost forwarding and DNS through macOS; each distribution’s files in Finder, with the distribution’s logo. ~/.mslconfig(the.wslconfigequivalent),/etc/wsl.confand/etc/msl.conf, idle timeouts, and MSL’s own first-run setup for Debian.- An interactive installer,
install.sh, and self-update withmsl --update. - PGP-signed release checksums:
install.shverifies the signature whengpgis installed and a signature is published. - Releases include the full licence texts of all dependencies, and the GPL source of BusyBox and the kernel.
- Licensed under Apache-2.0.