Lima VM network

Author: Jase Batchelor

As mentioned in our previous article on Lima VM, it is possible to customise network configuration.

Specifically, we will install socket_vmnet which is allows us an easy way to use the Apple vmnet.framework virtualised networking framework

As per the documentation:

“Daemon to provide vmnet.framework support for rootless QEMU”

The socket_vmnet application allows us to use shared networking in Lima VM configuration.

 


Sections

 


Installation

Install Lima socket_vmnet

Install via homebrew

brew install socket_vmnet

To view the files installed by socket_vmnet

ls ${HOMEBREW_PREFIX}/opt/socket_vmnet/bin/*
# /opt/homebrew/opt/socket_vmnet/bin/socket_vmnet         
# /opt/homebrew/opt/socket_vmnet/bin/socket_vmnet_client

 


Configuration

Configure Lima socket_vmnet in networks.yaml

Note that we must NOT use a symlinked path to the socket_vmnet binary

Run the following and you will see that the socket_vmnet directory is symlinked to ../Cellar/socket_vmnet/1.1.2

ls -al /opt/homebrew/opt/socket_vmnet
# ... /opt/homebrew/opt/socket_vmnet -> ../Cellar/socket_vmnet/1.1.2

So in this case our actual path is

/opt/homebrew/Cellar/socket_vmnet/1.1.2/bin/socket_vmnet

Edit ~/.lima/_config/networks.yaml and amend the socketVMNet property to use the path above

paths:
# socketVMNet requires Lima >= 0.12 .
# socketVMNet has precedence over vdeVMNet.
  #socketVMNet: "/opt/socket_vmnet/bin/socket_vmnet"
  # Use full path to `socket_vmnet` binary rather than symlink 
  # Eg. Don't use '${HOMEBREW_PREFIX}/opt/socket_vmnet/bin/socket_vmnet'
  socketVMNet: "/opt/homebrew/Cellar/socket_vmnet/1.1.2/bin/socket_vmnet"
# vdeSwitch and vdeVMNet are DEPRECATED.
  vdeSwitch: /opt/vde/bin/vde_switch
  vdeVMNet: /opt/vde/bin/vde_vmnet
  varRun: /private/var/run/lima
  sudoers: /private/etc/sudoers.d/lima

group: everyone

networks:
  shared:
    mode: shared
    gateway: 192.168.105.1
    dhcpEnd: 192.168.105.254
    netmask: 255.255.255.0
  bridged:
    mode: bridged
    interface: en0
    # bridged mode doesn't have a gateway; dhcp is managed by outside network
  host:
    mode: host
    gateway: 192.168.106.1
    dhcpEnd: 192.168.106.254
    netmask: 255.255.255.0

 


Repeat the following step when ~/.lima/_config/networks.yaml is edited.

Configure sudoers for launching socket_vmnet

limactl sudoers > etc_sudoers.d_lima
sudo install -o root etc_sudoers.d_lima /etc/sudoers.d/lima
rm etc_sudoers.d_lima

 


Basic usage

Based on a great article on baptistout.net I was able to create a Lima configuration that provides the following:

  • base Debian 11 (Bullseye) image
  • install the Docker daemon
  • configure shared networking
limactl --name debian-01 start ./vm/lima-debian-docker.yaml

Sample output

# ? Creating an instance "debian-01"  [Use arrows to move, type to filter]
# > Proceed with the current configuration
#   Open an editor to review or modify the current configuration
#   Choose another example (docker, podman, archlinux, fedora, ...)
#   Exit

# ? Creating an instance "debian-01" Proceed with the current configuration
# INFO[0019] Starting socket_vmnet daemon for "shared-01" network 
# INFO[0019] Attempting to download the image              arch=aarch64 digest="sha512:97b888a2c59571494c628a1ef178c715914eac4de7e448fbc5d0673eae78336a37f0ac0c1d5a5ae8af201c67b84d6d2476cda6367cc5d00d2416f5e1ee9f912c" location="https://cloud.debian.org/images/cloud/bullseye/20230515-1381/debian-01-generic-arm64-20230515-1381.qcow2"
# INFO[0019] Using cache "/Users/jase/Library/Caches/lima/download/by-url-sha256/7c0eb03fa418b449d847f05df3703e4a172ad6b2231996e23c5d37c8451978ec/data" 
# INFO[0020] [hostagent] Starting QEMU (hint: to watch the boot progress, see "/Users/jase/.lima/debian-01/serial.log") 
# INFO[0020] SSH Local Port: 51706                        
# INFO[0020] [hostagent] Waiting for the essential requirement 1 of 5: "ssh" 
# INFO[0027] [hostagent] The essential requirement 1 of 5 is satisfied 
# INFO[0027] [hostagent] Waiting for the essential requirement 2 of 5: "user session is ready for ssh" 
# INFO[0027] [hostagent] The essential requirement 2 of 5 is satisfied 
# INFO[0027] [hostagent] Waiting for the essential requirement 3 of 5: "sshfs binary to be installed" 
# INFO[0033] [hostagent] The essential requirement 3 of 5 is satisfied 
# INFO[0033] [hostagent] Waiting for the essential requirement 4 of 5: "/etc/fuse.conf (/etc/fuse3.conf) to contain \"user_allow_other\"" 
# INFO[0039] [hostagent] The essential requirement 4 of 5 is satisfied 
# INFO[0039] [hostagent] Waiting for the essential requirement 5 of 5: "the guest agent to be running" 
# INFO[0039] [hostagent] The essential requirement 5 of 5 is satisfied 
# INFO[0039] [hostagent] Mounting "/Users/jase" on "/Users/jase" 
# INFO[0039] [hostagent] Mounting "/tmp/lima" on "/tmp/lima" 
# INFO[0039] [hostagent] Waiting for the optional requirement 1 of 1: "user probe 1/1" 
# INFO[0039] [hostagent] Forwarding "/run/user/501/docker.sock" (guest) to "/Users/jase/.lima/debian-01/sock/docker.sock" (host) 
# INFO[0039] [hostagent] Forwarding "/run/lima-guestagent.sock" (guest) to "/Users/jase/.lima/debian-01/ga.sock" (host) 
# INFO[0039] [hostagent] Not forwarding TCP 0.0.0.0:22    
# INFO[0039] [hostagent] Not forwarding TCP [::]:22       
# INFO[0060] [hostagent] The optional requirement 1 of 1 is satisfied 
# INFO[0060] [hostagent] Waiting for the final requirement 1 of 1: "boot scripts must have finished" 
# INFO[0063] [hostagent] The final requirement 1 of 1 is satisfied 
# INFO[0063] READY. Run `limactl shell debian-01` to open the shell. 
# INFO[0063] Message from the instance "debian-01":       
# To run `docker` on the host (assumes docker-cli is installed), run the following commands:
# ------
# docker context create lima-debian-01 --docker "host=unix:///Users/jase/.lima/debian-01/sock/docker.sock"
# docker context use lima-debian-01
# docker run hello-world
# ------

 


Docker on Lima VM

Test the Docker installation on the newly created Lima VM instance

Note that only the Docker CLI is required on the Mac host.
This does not require Docker Desktop.

To install just the Docker CLI

brew info docker
brew install docker

image

docker context list

docker context create lima-debian-01 --docker "host=unix:///Users/jase/.lima/debian-01/sock/docker.sock"
docker context list

docker context use lima-debian-01
docker images

 


Find IP address on Lima VM

limactl shell debian-01 -- ip -4 addr show lima0 | grep -oE 'inet\s[0-9]+(\.[0-9]+){3}' | cut -d ' ' -f2

 


Advanced usage

todo ;)