Skip to content

Conversation

@norio-nomura
Copy link
Contributor

@norio-nomura norio-nomura commented Sep 6, 2025

Description:

Since systemd v256 (Ubuntu 24.10), SSH is bound to AF_VSOCK port 22.

https://github.com/systemd/systemd/releases/tag/v256

  • If the system is run in a VM providing AF_VSOCK support, it automatically
    binds sshd to AF_VSOCK port 22.

https://discourse.ubuntu.com/t/oracular-oriole-release-notes/44878

  • When sshd is installed on a system, a new systemd generator, systemd-ssh-generator
    binds a socket-activated SSH server to local AF_VSOCK and AF_UNIX sockets under certain conditions.

This PR changes to delay starting SSH port forwarding until the SSH server on the VM becomes ready. If AF_VSOCK port 22 can be connected, start a local SSH port as a proxy for AF_VSOCK port 22, instead of starting gvisor's port forwarder.

SSH over VSOCK is faster than SSH over gvisor's port forwarder.

This change is opt-out because it requires VZ and VM with systemd v256+,
setting LIMA_SSH_OVER_VSOCK=true does not mean it works.
To disable, set LIMA_SSH_OVER_VSOCK=false.

Benchmark logs:

On MacBook Pro 14 inch, 2023 with Apple M2 Pro

SETUP:

$ sw_vers
ProductName:		macOS
ProductVersion:		15.7
BuildVersion:		24G219
$ limactl start template://ubuntu-24.10 --rosetta --containerd=none --log-level error
<snip>
$ limactl shell ubuntu-24.10 sudo apt-get -U install -y iperf3 -qqq
<snip>

GRPC Port Forwarder (Current):

$ limactl shell ubuntu-24.10 iperf3 -s
WARN[0000] Both top-level 'rosetta' and 'vmOpts.vz.rosetta' are configured. Using vmOpts.vz.rosetta. Top-level 'rosetta' is deprecated. 
-----------------------------------------------------------
Server listening on 5201 (test #1)
-----------------------------------------------------------
Accepted connection from ::1, port 53668
[  5] local ::1 port 5201 connected to ::1 port 53672
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec   354 MBytes  2.97 Gbits/sec                  
[  5]   1.00-2.00   sec   359 MBytes  3.01 Gbits/sec                  
[  5]   2.00-3.00   sec   354 MBytes  2.97 Gbits/sec                  
[  5]   3.00-4.00   sec   354 MBytes  2.97 Gbits/sec                  
[  5]   4.00-5.00   sec   357 MBytes  3.00 Gbits/sec                  
[  5]   5.00-6.00   sec   354 MBytes  2.97 Gbits/sec                  
[  5]   6.00-7.00   sec   355 MBytes  2.98 Gbits/sec                  
[  5]   7.00-8.00   sec   355 MBytes  2.98 Gbits/sec                  
[  5]   8.00-9.00   sec   355 MBytes  2.98 Gbits/sec                  
[  5]   9.00-9.98   sec   352 MBytes  3.01 Gbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-9.98   sec  3.47 GBytes  2.98 Gbits/sec                  receiver
-----------------------------------------------------------
Server listening on 5201 (test #2)
-----------------------------------------------------------
^Ciperf3: interrupt - the server has terminated

SSH Port Forwarder on gvisor's virtual network (Old):

$ LIMA_SSH_PORT_FORWARDER=true LIMA_SSH_OVER_VSOCK=false limactl restart ubuntu-24.10 --log-level error
$ limactl shell ubuntu-24.10 iperf3 -s
WARN[0000] Both top-level 'rosetta' and 'vmOpts.vz.rosetta' are configured. Using vmOpts.vz.rosetta. Top-level 'rosetta' is deprecated. 
-----------------------------------------------------------
Server listening on 5201 (test #1)
-----------------------------------------------------------
Accepted connection from ::1, port 43814
[  5] local ::1 port 5201 connected to ::1 port 43824
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec   277 MBytes  2.32 Gbits/sec                  
[  5]   1.00-2.00   sec   280 MBytes  2.35 Gbits/sec                  
[  5]   2.00-3.00   sec   278 MBytes  2.34 Gbits/sec                  
[  5]   3.00-4.00   sec   279 MBytes  2.34 Gbits/sec                  
[  5]   4.00-5.00   sec   279 MBytes  2.34 Gbits/sec                  
[  5]   5.00-6.00   sec   279 MBytes  2.34 Gbits/sec                  
[  5]   6.00-7.00   sec   281 MBytes  2.36 Gbits/sec                  
[  5]   7.00-8.00   sec   280 MBytes  2.35 Gbits/sec                  
[  5]   8.00-9.00   sec   281 MBytes  2.36 Gbits/sec                  
[  5]   9.00-10.00  sec   279 MBytes  2.34 Gbits/sec                  
[  5]  10.00-10.03  sec  9.00 MBytes  2.34 Gbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.03  sec  2.74 GBytes  2.34 Gbits/sec                  receiver
-----------------------------------------------------------
Server listening on 5201 (test #2)
-----------------------------------------------------------
^Ciperf3: interrupt - the server has terminated

SSH Port Forwarder over AF_VSOCK (New):

$ LIMA_SSH_PORT_FORWARDER=true limactl restart ubuntu-24.10 --log-level error
$ limactl shell ubuntu-24.10 iperf3 -s
WARN[0000] Both top-level 'rosetta' and 'vmOpts.vz.rosetta' are configured. Using vmOpts.vz.rosetta. Top-level 'rosetta' is deprecated. 
-----------------------------------------------------------
Server listening on 5201 (test #1)
-----------------------------------------------------------
Accepted connection from ::1, port 57942
[  5] local ::1 port 5201 connected to ::1 port 57948
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec   422 MBytes  3.54 Gbits/sec                  
[  5]   1.00-2.00   sec   425 MBytes  3.57 Gbits/sec                  
[  5]   2.00-3.00   sec   427 MBytes  3.58 Gbits/sec                  
[  5]   3.00-4.00   sec   426 MBytes  3.58 Gbits/sec                  
[  5]   4.00-5.00   sec   426 MBytes  3.58 Gbits/sec                  
[  5]   5.00-6.00   sec   428 MBytes  3.59 Gbits/sec                  
[  5]   6.00-7.00   sec   426 MBytes  3.58 Gbits/sec                  
[  5]   7.00-8.00   sec   428 MBytes  3.59 Gbits/sec                  
[  5]   8.00-9.00   sec   425 MBytes  3.57 Gbits/sec                  
[  5]   9.00-10.00  sec   425 MBytes  3.57 Gbits/sec                  
[  5]  10.00-10.00  sec  1.62 MBytes  3.83 Gbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec  4.16 GBytes  3.57 Gbits/sec                  receiver
-----------------------------------------------------------
Server listening on 5201 (test #2)
-----------------------------------------------------------
^Ciperf3: interrupt - the server has terminated

@AkihiroSuda AkihiroSuda added this to the v2.0.0 milestone Sep 6, 2025
if err != nil {
return err
}
logrus.Infof("started vsock forwarder: localhost:%d -> vsock:%d on VM", hostPort, vsockPort)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can be another PR, but wondering if we can further optimize the performance with (an equivalent of) systemd-ssh-proxy — SSH client plugin for connecting to AF_VSOCK and AF_UNIX sockets
https://www.freedesktop.org/software/systemd/man/256/systemd-ssh-proxy.html

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand the meaning of the comment.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought it might be possible to eliminate the TCP->vsock forwarder and let ssh directly connect to the vsock.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VM's VSOCK should not be open to the host unless the process that is starting the VM is mediated. As this PR is doing.

@norio-nomura norio-nomura force-pushed the ssh-over-vsock-on-vz branch 2 times, most recently from 4ea3d0f to a549d55 Compare September 6, 2025 12:42
@norio-nomura
Copy link
Contributor Author

Ubuntu 24.04 and earlier, SSH over AF_VSOCK can be enabled with:

provision:
- mode: yq
  path: /etc/systemd/system/ssh.socket.d/vsock.conf
  format: ini
  expression: |
    .Socket.ListenStream="vsock::22"

and upgraded SSH tracked at sshd socket activation does not support AF_VSOCK

@norio-nomura
Copy link
Contributor Author

norio-nomura commented Sep 7, 2025

How to enable SSH over AF_VSOCK on Ubuntu 20.04, 22.04, and 24.04

Ubuntu 20.04, 22.04:

Since the patched version of SSH has already been released, it requires:

  • Add ListenStream="vsock::22" to ssh.socket configuration
  • Change ssh.service to use socket-based activation
$ limactl start template://ubuntu-20.04 --rosetta --containerd=none --set '.provision|=.//empty + [{
  "mode": "yq",
  "format": "ini",
  "path": "/etc/systemd/system/ssh.socket.d/vsock.conf",
  "expression": ".Socket.ListenStream=\"vsock::22\""
}, {
  "mode": "system",
  "script": ("#!/bin/bash
set -eux -o pipefail
systemctl is-enabled ssh.service || exit 0
# use socket based activation
systemctl disable --now ssh.service
systemctl enable --now ssh.socket
"|. style="literal")
}]'
$ limactl restart ubuntu-20.04 2>&1 |grep -i vsock
time="2025-09-07T17:01:40+09:00" level=info msg="[hostagent] started vsock forwarder: localhost:59291 -> vsock:22 on VM"
time="2025-09-07T17:01:40+09:00" level=info msg="[hostagent] Detected SSH server is listening on the vsock port; changed localhost:59291 to proxy for the vsock port"

Ubuntu 24.04:

Since the patched version of SSH is not yet released (2025/09/07), it requires installing the proposed version.
The patched version of SSH has been released (2025/09/09), update openssh-server to latest release.

  • Add ListenStream="vsock::22" to the ssh.socket configuration.
  • Install the proposed version of SSH. Update openssh-server to patched version (1:9.6p1-3ubuntu13.14)
  • Already, SSH has been changed to default socket-based activation.
$ limactl start template://ubuntu-24.04 --rosetta --containerd=none --set '.provision|=.//empty + [{
  "mode": "yq",
  "format": "ini",
  "path": "/etc/systemd/system/ssh.socket.d/vsock.conf",
  "expression": ".Socket.ListenStream=\"vsock::22\""
}, {
  "mode": "system",
  "script": ("#!/bin/bash
ss -l --vsock|grep \*:22 -q && exit 0
apt-get --update install --assume-yes openssh-server
"|. style="literal")
}]'
$ limactl restart ubuntu-24.04 2>&1 |grep -i vsock
time="2025-09-07T17:01:56+09:00" level=info msg="[hostagent] started vsock forwarder: localhost:59299 -> vsock:22 on VM"
time="2025-09-07T17:01:56+09:00" level=info msg="[hostagent] Detected SSH server is listening on the vsock port; changed localhost:59299 to proxy for the vsock port"

Edit: The patched version of openssh-server has been released on Ubuntu 24.04

@norio-nomura norio-nomura force-pushed the ssh-over-vsock-on-vz branch 2 times, most recently from 2d98aa5 to 5161063 Compare September 8, 2025 07:45
@norio-nomura
Copy link
Contributor Author

I'm considering another PR for the port forwarder implementation to VSOCK, which can be defined in lima.yaml, but I'm not sure if it's better to mix the rules with .portForwards[]. 🤔

@norio-nomura norio-nomura force-pushed the ssh-over-vsock-on-vz branch 2 times, most recently from e3bc0bd to 9238459 Compare September 9, 2025 09:49
@norio-nomura
Copy link
Contributor Author

Ubuntu 24.04:

Since the patched version of SSH is not yet released (2025/09/07), it requires installing the proposed version.

The patched version of SSH has been released (2025/09/09), update openssh-server to latest release.

@norio-nomura norio-nomura marked this pull request as draft September 10, 2025 03:56
@norio-nomura
Copy link
Contributor Author

To support custom usernet, I will move WaitOpeningSSHPort logic to the server side.

@norio-nomura norio-nomura marked this pull request as ready for review September 10, 2025 05:33
@norio-nomura
Copy link
Contributor Author

To support custom usernet, I will move WaitOpeningSSHPort logic to the server side.

done.

@norio-nomura
Copy link
Contributor Author

To support custom usernet, I will move WaitOpeningSSHPort logic to the server side.

This added an entry point /extension/wait_port?ip=<ip address>&port=<port> to endpoint sock of usernet.

@norio-nomura
Copy link
Contributor Author

Updated to use SSHAddress as the host address.

@norio-nomura norio-nomura force-pushed the ssh-over-vsock-on-vz branch 4 times, most recently from 102d712 to 0a29768 Compare September 17, 2025 07:50
@norio-nomura norio-nomura force-pushed the ssh-over-vsock-on-vz branch 4 times, most recently from 9f5f7d3 to 3372ae7 Compare September 19, 2025 02:56
logrus.Errorf("error writing to pid fil %q", pidFile)
errCh <- err
}
filesToRemove[pidFile] = struct{}{}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line was not effective until this PR, because above defer:

	filesToRemove := make(map[string]struct{})
	defer func() {
		for f := range filesToRemove {
			_ = os.RemoveAll(f)
		}
	}()

has passed before filesToRemove[pidFile] = struct{}{} has effect.
Because I changed to wait waitSSHLocalPortAccessible, above defer changed to remove pidFile.
That’s why test fails with:
https://github.com/lima-vm/lima/actions/runs/17849303510/job/50754678943?pr=3979#step:9:165

time="2025-09-19T05:30:22Z" level=fatal msg="expected status "Running", got "Broken" (maybe use limactl stop -f?)"

I think filesToRemove is not required.
I'll remove them.

@norio-nomura norio-nomura force-pushed the ssh-over-vsock-on-vz branch 4 times, most recently from 57f60a3 to 6dae6d1 Compare September 20, 2025 00:41
Since systemd v256 (Ubuntu 24.10), SSH is bound to AF_VSOCK port 22.

https://github.com/systemd/systemd/releases/tag/v256
> - If the system is run in a VM providing AF_VSOCK support, it automatically
binds sshd to AF_VSOCK port 22.

https://discourse.ubuntu.com/t/oracular-oriole-release-notes/44878
> - When sshd is installed on a system, a new systemd generator, systemd-ssh-generator
binds a socket-activated SSH server to local AF_VSOCK and AF_UNIX sockets under certain conditions.

This changes to delay starting SSH port forwarding until the SSH server on the VM becomes ready.
If AF_VSOCK port 22 can be connected, start a local SSH port as a proxy for AF_VSOCK port 22,
instead of starting gvisor's port forwarder.

SSH over VSOCK is faster than SSH over gvisor's port forwarder.

This change is opt-out because it requires VZ and VM with systemd v256+,
setting `LIMA_SSH_OVER_VSOCK=true` does not mean it works.
To disable, set `LIMA_SSH_OVER_VSOCK=false`.

Signed-off-by: Norio Nomura <norio.nomura@gmail.com>

Loosen retry interval of connecting to SSH port on VM

Signed-off-by: Norio Nomura <norio.nomura@gmail.com>

Change default timeout to 600 seconds

Signed-off-by: Norio Nomura <norio.nomura@gmail.com>
Signed-off-by: Norio Nomura <norio.nomura@gmail.com>

# Conflicts:
#	hack/test-templates.sh

hack/test-templates.sh: avoid using `limactl restart`

Signed-off-by: Norio Nomura <norio.nomura@gmail.com>

hack/test-templates.sh: change order of tests

Signed-off-by: Norio Nomura <norio.nomura@gmail.com>

change `grep -iq` to  `grep -i`

Signed-off-by: Norio Nomura <norio.nomura@gmail.com>
…ecomes available.

Signed-off-by: Norio Nomura <norio.nomura@gmail.com>
`filesToRemove` was not effective until this PR, because above `defer`:
```golang
	filesToRemove := make(map[string]struct{})
	defer func() {
		for f := range filesToRemove {
			_ = os.RemoveAll(f)
		}
	}()
```
has passed before `filesToRemove[pidFile] = struct{}{}` has effect.
Because I changed to wait `waitSSHLocalPortAccessible`, above `defer` changed to remove `pidFile`.
That’s why test fails with:
https://github.com/lima-vm/lima/actions/runs/17849303510/job/50754678943?pr=3979#step:9:165
> time="2025-09-19T05:30:22Z" level=fatal msg="expected status \"Running\", got \"Broken\" (maybe use `limactl stop -f`?)"

I think `filesToRemove` is not required.
I'll remove them.

Signed-off-by: Norio Nomura <norio.nomura@gmail.com>
Copy link
Member

@AkihiroSuda AkihiroSuda left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks

@AkihiroSuda AkihiroSuda merged commit c85e72c into lima-vm:master Sep 23, 2025
62 of 63 checks passed
@norio-nomura norio-nomura deleted the ssh-over-vsock-on-vz branch September 23, 2025 06:05
@norio-nomura
Copy link
Contributor Author

Thanks! 🙏🏻

tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Nov 10, 2025
⚠️ **CAUTION: this is a major update, indicating a breaking change!** ⚠️

This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [lima-vm/lima](https://github.com/lima-vm/lima) | major | `v1.2.2` -> `v2.0.1` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>lima-vm/lima (lima-vm/lima)</summary>

### [`v2.0.1`](https://github.com/lima-vm/lima/releases/tag/v2.0.1)

[Compare Source](lima-vm/lima@v2.0.0...v2.0.1)

#### Changes

- Binary release artifacts:
  - Fix a regression in v2.0.0 `level=fatal msg="template \"_images/<IMAGE>.yaml\" not found"` ([#&#8203;4313](lima-vm/lima#4313), thanks to [@&#8203;vvoland](https://github.com/vvoland))

- Misc:
  - pkg/networks/usernet: use `SIGINT` instead of `SIGKILL` ([#&#8203;4310](lima-vm/lima#4310), thanks to [@&#8203;norio-nomura](https://github.com/norio-nomura))

Full changes: <https://github.com/lima-vm/lima/milestone/64?closed=1>

#### Usage

```console
$ limactl create
$ limactl start
...
INFO[0029] READY. Run `lima` to open the shell.

$ lima uname
Linux
```

***

The binaries were built automatically on GitHub Actions.
The build log is available for 90 days: <https://github.com/lima-vm/lima/actions/runs/19137304035>

The sha256sum of the SHA256SUMS file itself is `25ad222fa1cf91a85ef7be67664f2ba65228a5d82a39be1adbbe842096854e24` .

***

Release manager: [@&#8203;AkihiroSuda](https://github.com/AkihiroSuda)

### [`v2.0.0`](https://github.com/lima-vm/lima/releases/tag/v2.0.0)

[Compare Source](lima-vm/lima@v1.2.2...v2.0.0)

This is the second major release of Lima, featuring the support for [pluggable VM drivers](https://lima-vm.io/docs/dev/drivers/), [GPU acceleration](https://lima-vm.io/docs/config/gpu/), and [MCP](https://lima-vm.io/docs/config/ai/outside/mcp/).
This release also commemorates the promotion of the project from CNCF [Sandbox](https://www.cncf.io/sandbox-projects/) to [Incubating](https://www.cncf.io/projects/) 🎉.

#### Highlights

- [Experimental plug-in subsystem for VM driver infrastructure](https://lima-vm.io/docs/dev/drivers/).
  This will help implementing third-party plugins without modifying the code base of Lima.
  Thanks to [GSoC 2025](https://gist.github.com/unsuman/ff31a323ecef2289bf065882726ed7f0) contributor [@&#8203;unsuman](https://github.com/unsuman) .
- [Experimental krunkit VM driver](https://lima-vm.io/docs/config/vmtype/krunkit/) for supporting GPU acceleration ([#&#8203;4137](lima-vm/lima#4137), thanks to [@&#8203;unsuman](https://github.com/unsuman))
- [Experimental integration for Model Context Protocol (MCP)](https://lima-vm.io/docs/config/ai/outside/) ([#&#8203;3744](lima-vm/lima#3744)). i.e., Lima can be now used as a sandbox for AI agents such as Gemini.
- Add `limactl (start|restart) --progress` flag to show the progress of provisioning ([#&#8203;3846](lima-vm/lima#3846), [#&#8203;3915](lima-vm/lima#3915), thanks to [@&#8203;olamilekan000](https://github.com/olamilekan000) [@&#8203;norio-nomura](https://github.com/norio-nomura))
- Add `limactl shell --preserve-env` flag to propagate env vars from the host to VM ([#&#8203;3830](lima-vm/lima#3830), thanks to [@&#8203;olamilekan000](https://github.com/olamilekan000))

#### Other notable changes

- `/tmp/lima` is no longer mounted by default ([#&#8203;3951](lima-vm/lima#3951))
- SSH port is no longer hard-coded to 60022 for the "default" instance ([#&#8203;3780](lima-vm/lima#3780))
- Forward UDP ports by default ([#&#8203;4054](lima-vm/lima#4054))
- Support CLI plugins ([#&#8203;3834](lima-vm/lima#3834), [#&#8203;4009](lima-vm/lima#4009), thanks to [@&#8203;olamilekan000](https://github.com/olamilekan000))
- Support custom URL scheme plugins ([#&#8203;3937](lima-vm/lima#3937), thanks to [@&#8203;jandubois](https://github.com/jandubois)).
  `template://default` is now recommended to be written as `template:default`. The old form is still supported.

##### Details

- VM driver infrastructure:
  - [Experimental plug-in subsystem for VM driver infrastructure](https://lima-vm.io/docs/dev/drivers/) ([multiple MRs](https://github.com/lima-vm/lima/pulls?q=is%3Apr+milestone%3Av2.0.0+is%3Aclosed+label%3Aarea%2Fvmdrivers), thanks to [@&#8203;unsuman](https://github.com/unsuman))

- krunkit:
  - [Experimental krunkit VM driver](https://lima-vm.io/docs/config/vmtype/krunkit/) for supporting GPU acceleration ([#&#8203;4137](lima-vm/lima#4137), thanks to [@&#8203;unsuman](https://github.com/unsuman))

- VZ:
  - Support Rosetta AOT Caching with CDI ([#&#8203;3858](lima-vm/lima#3858), thanks to [@&#8203;norio-nomura](https://github.com/norio-nomura))
  - Support accelerating SSH using `AF_VSOCK` ([#&#8203;3979](lima-vm/lima#3979), thanks to [@&#8203;norio-nomura](https://github.com/norio-nomura))

- QEMU:
  - Fallback to TCG when KVM is not available on Linux hosts ([#&#8203;4204](lima-vm/lima#4204))

- MCP:
  - [Experimental integration for Model Context Protocol (MCP)](https://lima-vm.io/docs/config/ai/outside/) ([#&#8203;3744](lima-vm/lima#3744)).  Lima now provides MCP tools for reading, writing, and executing local files using a VM sandbox. Known to work with Google Gemini CLI.

- `limactl` CLI:
  - Add `limactl (start|restart) --progress` flag to show the progress of provisioning ([#&#8203;3846](lima-vm/lima#3846), [#&#8203;3915](lima-vm/lima#3915), thanks to [@&#8203;olamilekan000](https://github.com/olamilekan000) [@&#8203;norio-nomura](https://github.com/norio-nomura))
  - Add `limactl (create|start|edit) --port-forward` flag for static port forwarding ([#&#8203;3699](lima-vm/lima#3699), thanks to [@&#8203;Horiodino](https://github.com/Horiodino)).
    Usually not needed, but useful for instances created with `--plain`.
  - Add `limactl (create|start|edit) --ssh-port` flag ([#&#8203;3791](lima-vm/lima#3791))
  - Add `limactl (create|start|edit) --mount-only` flag ([#&#8203;3947](lima-vm/lima#3947)).
    Similar to `--mount`, but overrides the existing mounts. Useful for mounting `$(pwd)`.
  - Support specifying `--set` multiple times in `limactl (create|start|edit)` ([#&#8203;4197](lima-vm/lima#4197), thanks to [@&#8203;AndiDog](https://github.com/AndiDog))
  - Add `limactl shell --preserve-env` flag to propagate env vars from the host to VM ([#&#8203;3830](lima-vm/lima#3830), thanks to [@&#8203;olamilekan000](https://github.com/olamilekan000)).
    See also [`LIMA_SHELLENV_ALLOW`](https://lima-vm.io/docs/config/environment-variables/#lima_shellenv_allow) and [`LIMA_SHELLENV_BLOCK`](https://lima-vm.io/docs/config/environment-variables/#lima_shellenv_block).
  - Support CLI plugins ([#&#8203;3834](lima-vm/lima#3834), [#&#8203;4009](lima-vm/lima#4009), thanks to [@&#8203;olamilekan000](https://github.com/olamilekan000))
  - Support custom URL scheme plugins ([#&#8203;3937](lima-vm/lima#3937), thanks to [@&#8203;jandubois](https://github.com/jandubois)).
    `template://default` is now recommended to be written as `template:default`. The old form is still supported.
  - Add `limactl copy --backend=rsync` flag as an alternative to `scp` backend ([#&#8203;3143](lima-vm/lima#3143), thanks to [@&#8203;olamilekan000](https://github.com/olamilekan000))
  - Add `limactl list--yq` and `limactl info --yq` flags ([#&#8203;3998](lima-vm/lima#3998), thanks to [@&#8203;jandubois](https://github.com/jandubois))
  - Add `limactl rename OLD NEW` ([#&#8203;4207](lima-vm/lima#4207))
  - Deprecate `--yes` and introduce `limactl (clone|rename|edit|shell) --start` instead ([#&#8203;4108](lima-vm/lima#4108), [#&#8203;4285](lima-vm/lima#4285), thanks to [@&#8203;Horiodino](https://github.com/Horiodino) [@&#8203;nlordell](https://github.com/nlordell))

- YAML:
  - Migrate `cpuType` to `vmOpts.qemu` ([#&#8203;3500](lima-vm/lima#3500), thanks to [@&#8203;unsuman](https://github.com/unsuman))
  - Add `yq` provision mode ([#&#8203;3892](lima-vm/lima#3892), thanks to [@&#8203;norio-nomura](https://github.com/norio-nomura))
  - Prohibit relative paths in YAML ([#&#8203;3950](lima-vm/lima#3950)).
    Relative paths were never intended to be supported,
    but they were accidentally allowed due to a regression in v1.1.0.
    The CLI command `limactl (create|start|edit) --mount DIR` still supports relative paths.

- Default template:
  - Remove `/tmp/lima` mount ([#&#8203;3951](lima-vm/lima#3951))
  - Stop hardcoding SSH port 60022 ([#&#8203;3780](lima-vm/lima#3780))

- Network:
  - Enable mDNS for vzNAT and socket\_vmnet ([#&#8203;4272](lima-vm/lima#4272), thanks to [@&#8203;norio-nomura](https://github.com/norio-nomura))

- Port forwarding:
  - Support port forwarding in plain mode ([#&#8203;3699](lima-vm/lima#3699), thanks to [@&#8203;Horiodino](https://github.com/Horiodino))
  - Support host sockets in gRPC port forwarder ([#&#8203;4008](lima-vm/lima#4008), thanks to [@&#8203;norio-nomura](https://github.com/norio-nomura))
  - Forward UDP ports by default ([#&#8203;4054](lima-vm/lima#4054))
  - Eliminated 3-second delay for detecting ports ([#&#8203;4066](lima-vm/lima#4066))
  - Removed iptables watcher for `sudo nerdctl run -p ...` ([#&#8203;4107](lima-vm/lima#4107)).
    `sudo nerdctl run -p ...` now requires nerdctl v2.1.6 or later.
  - Improved performance of gRPC forwarder ([#&#8203;4247](lima-vm/lima#4247), thanks to [@&#8203;balajiv113](https://github.com/balajiv113))
  - Support UDP in Kubernetes ([#&#8203;4233](lima-vm/lima#4233))
  - Change default of `guestIPMustBeZero` to `true` when `guestIP` is `0.0.0.0` ([#&#8203;4221](lima-vm/lima#4221), thanks to [@&#8203;jandubois](https://github.com/jandubois))

- Build system:
  - Remove `Kconfig` and `config.mk`, in favor of Makefile variables ([#&#8203;3732](lima-vm/lima#3732))
  - Support Fedora, RHEL, and relevant host distributions ([#&#8203;4228](lima-vm/lima#4228), thanks to [@&#8203;valdela1](https://github.com/valdela1))

- Templates:
  - `alpine`, `alpine-iso`: update to Alpine 3.22 ([#&#8203;4184](lima-vm/lima#4184), [#&#8203;4190](lima-vm/lima#4190), thanks to [@&#8203;jandubois](https://github.com/jandubois))
  - `debian`: update to Debian 13 ([#&#8203;4029](lima-vm/lima#4029), thanks to [@&#8203;unsuman](https://github.com/unsuman))
  - `docker`, `docker-rootful`: Enable containerd image store ([#&#8203;3941](lima-vm/lima#3941), thanks to [@&#8203;norio-nomura](https://github.com/norio-nomura))
  - `fedora`: update to Fedora 43 ([#&#8203;4255](lima-vm/lima#4255))
  - `opensuse`: update to openSUSE Leap 16 ([#&#8203;4203](lima-vm/lima#4203))
  - `oraclelinux`: update to Oracle Linux 10 ([#&#8203;4236](lima-vm/lima#4236), thanks to [@&#8203;valdela1](https://github.com/valdela1))
  - `ubuntu`, `default`: update Ubuntu to 25.10 ([#&#8203;4202](lima-vm/lima#4202))
  - `k0s`: New template ([#&#8203;3728](lima-vm/lima#3728), thanks to [@&#8203;plandem](https://github.com/plandem))
  - `experimental/ubuntu-next`: update to Ubuntu 26.04 pre-release ([#&#8203;4311](lima-vm/lima#4311))

- Project:
  - Invite Ansuman Sahoo ([@&#8203;unsuman](https://github.com/unsuman)) as a Reviewer ([#&#8203;4003](lima-vm/lima#4003), thanks to [@&#8203;jandubois](https://github.com/jandubois))
  - Promote from CNCF Sandbox to Incubating ([#&#8203;4201](lima-vm/lima#4201))

Full changes: <https://github.com/lima-vm/lima/milestone/59?closed=1>

Thanks to [@&#8203;AndiDog](https://github.com/AndiDog) [@&#8203;Horiodino](https://github.com/Horiodino) [@&#8203;afbjorklund](https://github.com/afbjorklund) [@&#8203;alexandear](https://github.com/alexandear) [@&#8203;ashwat287](https://github.com/ashwat287) [@&#8203;balajiv113](https://github.com/balajiv113) [@&#8203;bonifaido](https://github.com/bonifaido) [@&#8203;dharsanb](https://github.com/dharsanb) [@&#8203;gnawhleinad](https://github.com/gnawhleinad) [@&#8203;iamleot](https://github.com/iamleot) [@&#8203;jandubois](https://github.com/jandubois) [@&#8203;kachick](https://github.com/kachick) [@&#8203;muchzill4](https://github.com/muchzill4) [@&#8203;ningmingxiao](https://github.com/ningmingxiao) [@&#8203;nlordell](https://github.com/nlordell) [@&#8203;norio-nomura](https://github.com/norio-nomura) [@&#8203;olamilekan000](https://github.com/olamilekan000) [@&#8203;plandem](https://github.com/plandem) [@&#8203;stek29](https://github.com/stek29) [@&#8203;unsuman](https://github.com/unsuman) [@&#8203;valdela1](https://github.com/valdela1) [@&#8203;vax-r](https://github.com/vax-r) [@&#8203;vishalanarase](https://github.com/vishalanarase) [@&#8203;zyfy29](https://github.com/zyfy29)

#### EOL of v1.2

Lima v1.2 will continue to receive security updates and critical bug fixes until **2026-02-06** (3 months from now).
See also <https://lima-vm.io/docs/releases/>.

#### Usage

```console
$ limactl create
$ limactl start
...
INFO[0029] READY. Run `lima` to open the shell.

$ lima uname
Linux
```

***

The binaries were built automatically on GitHub Actions.
The build log is available for 90 days: <https://github.com/lima-vm/lima/actions/runs/19130682878>

The sha256sum of the SHA256SUMS file itself is `112f1ef1d9850e29b4be425ca71e8b6ac686f593ff741164885b51fbd6919ca6` .

***

Release manager: [@&#8203;AkihiroSuda](https://github.com/AkihiroSuda)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNzMuMCIsInVwZGF0ZWRJblZlciI6IjQxLjE3My4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiXX0=-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants