Skip to content

Conversation

@AkihiroSuda
Copy link
Member

The event watcher is now triggered immediately on sys_exit_bind, not waiting for the next 3-second tick.

This commit resolves the long-standing TODO since the initial commit:

newTicker := func() (<-chan time.Time, func()) {
// TODO: use an equivalent of `bpftrace -e 'tracepoint:syscalls:sys_*_bind { printf("tick\n"); }')`,
// without depending on `bpftrace` binary.
// The agent binary will need CAP_BPF file cap.
ticker := time.NewTicker(tick)
return ticker.C, ticker.Stop
}

Close #3067
Close #3766
Close #4021

@balajiv113
Copy link
Member

Does this work for UDP as well ??

@jandubois
Copy link
Member

I don't have time to test right now, but I think this will not trigger when the port is closed, right?

One common problem with our polling is that test suites create a container with exposed ports, and after stopping the container create another one again in the next test that exposes the same ports. Due to the 3 second polling the old forwards may not have been removed yet, blocking the new container from exposing the same ports again.

Maybe there is another trace point to also kick the ticker, like sys_exit_close or tcp:tcp_close, if that works reliably?

@AkihiroSuda
Copy link
Member Author

AkihiroSuda commented Sep 23, 2025

Does this work for UDP as well ??

Yes

sys_exit_close

Seems too frequent

$ sudo bpftrace -e 'tracepoint:syscalls:sys_exit_close { printf("%d %s %s\n", elapsed / 1000 / 1000 / 1000, probe, comm); }'
Attaching 1 probe...                                   
0 tracepoint:syscalls:sys_exit_close tmux: server      
0 tracepoint:syscalls:sys_exit_close tmux: server      
0 tracepoint:syscalls:sys_exit_close tmux: server      
1 tracepoint:syscalls:sys_exit_close tmux: server      
1 tracepoint:syscalls:sys_exit_close tmux: server      
2 tracepoint:syscalls:sys_exit_close tmux: server      
2 tracepoint:syscalls:sys_exit_close tmux: server      
2 tracepoint:syscalls:sys_exit_close containerd        
2 tracepoint:syscalls:sys_exit_close containerd        
2 tracepoint:syscalls:sys_exit_close containerd        
2 tracepoint:syscalls:sys_exit_close containerd 
...

tcp:tcp_close

Doesn't seem to exist in /sys/kernel/debug/tracing/available_events

The event watcher is now triggered immediately on `sys_exit_bind`,
not waiting for the next 3-second tick.

This commit resolves the long-standing TODO since the initial commit:
https://github.com/lima-vm/lima/blob/7459f4587987ed014c372f17b82de1817feffa2e/cmd/lima-guestagent/daemon_linux.go#L57-L63

Close PR 3067, 3766, 4021

Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
@AkihiroSuda
Copy link
Member Author

One common problem with our polling is that test suites create a container with exposed ports, and after stopping the container create another one again in the next test that exposes the same ports. Due to the 3 second polling the old forwards may not have been removed yet, blocking the new container from exposing the same ports again.

How does this happen? The guest kernel isn't aware of the usage of the host port, so it doesn't block bind() in the guest.
After bind() in the guest succeeds, the ticker event is triggered, and the hostagent updates the host port status accordingly.

Copy link
Member

@balajiv113 balajiv113 left a comment

Choose a reason for hiding this comment

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

LGTM 👍

Looks like i overcomplicated by thinking of getting a real event with open ports.

@jandubois
Copy link
Member

How does this happen? The guest kernel isn't aware of the usage of the host port, so it doesn't block bind() in the guest.
After bind() in the guest succeeds, the ticker event is triggered, and the hostagent updates the host port status accordingly.

I guess the issue used to be that the test would connect to the dangling port on the host. So maybe just looking for bind events is enough; will need to write a test to verify.

jandubois added a commit to jandubois/lima that referenced this pull request Sep 23, 2025
It verifies that when a container is destroyed, its ports can be reused
immediately and are not subject to being freed by a polling loop. See lima-vm#4066.

Signed-off-by: Jan Dubois <jan.dubois@suse.com>
Copy link
Member

@jandubois jandubois left a comment

Choose a reason for hiding this comment

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

I haven't reviewed the code (@balajiv113 seems to have done so already), but I wrote a test (#4077) to verify it works properly, which is seems to do.

This seems like the most straightforward fix to the issue!

@jandubois jandubois merged commit 45c9527 into lima-vm:master Sep 23, 2025
140 of 144 checks passed
jandubois added a commit to jandubois/lima that referenced this pull request Sep 23, 2025
It verifies that when a container is destroyed, its ports can be reused
immediately and are not subject to being freed by a polling loop. See lima-vm#4066.

Signed-off-by: Jan Dubois <jan.dubois@suse.com>
@norio-nomura
Copy link
Contributor

norio-nomura commented Sep 25, 2025

After this is merged, the CPU utilization rate of lima-guestagent is always close to 90%.

screenshot 2025-09-25 9 36 07

I confirmed that it will be resolved with reverted.

jandubois added a commit to jandubois/lima that referenced this pull request Sep 28, 2025
It verifies that when a container is destroyed, its ports can be reused
immediately and are not subject to being freed by a polling loop. See lima-vm#4066.

Signed-off-by: Jan Dubois <jan.dubois@suse.com>
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.

4 participants