内部数据结构

Lima 主目录 (${LIMA_HOME})

默认为 ~/.lima

注意,我们故意避免在 macOS 上使用 ~/Library/Application Support/Lima

我们使用 ~/.lima 以便为套接字路径留有足够的空间,在 macOS 上套接字路径必须少于 104 个字符。

Unix:该目录不能位于 NFS 文件系统上,它需要是本地的。

配置目录 (${LIMA_HOME}/_config)

配置目录包含适用于所有实例的全局 lima 设置。

用户身份:

Lima 创建一个默认身份并使用其公钥作为授权密钥来访问所有 lima 实例。此外,lima 还会配置来自 ~/.ssh/*.pub 的所有公钥,因此用户可以使用 ssh 端点而无需显式指定身份。

  • user:私钥
  • user.pub:公钥

实例目录 (${LIMA_HOME}/<INSTANCE>)

实例目录包含以下文件:

元数据:

  • lima-version:用于创建此实例的 Lima 版本
  • lima.yaml:YAML 配置文件
  • protected:空文件,由 limactl protect 使用

cloud-init:

  • cloud-config.yaml:cloud-init 配置,仅供参考。
  • cidata.iso:cloud-init ISO9660 镜像。参见 cidata.iso

Ansible:

  • ansible-inventory.yaml:Ansible 节点清单。参见 ansible

磁盘:

  • basedisk:基础镜像
  • diffdisk:差异镜像 (QCOW2)

内核:

  • kernel:内核
  • kernel.cmdline:内核命令行
  • initrd:initrd

QEMU:

  • qemu.pid:QEMU PID
  • qmp.sock:QMP 套接字
  • qemu-efi-code.fd:QEMU UEFI 代码(不总是存在)

VZ:

  • vz.pid:VZ PID
  • vz-identifier:虚拟机的唯一机器标识符文件
  • vz-efi:虚拟机的 EFI 变量存储文件

串口:

  • serial.log:默认串口日志(仅 QEMU),用于调试
  • serial.sock:默认串口套接字(仅 QEMU),用于调试(用法:socat -,echo=0,icanon=0 unix-connect:serial.sock
  • serialp.log:PCI 串口日志(仅 QEMU (ARM)),用于调试
  • serialp.sock:PCI 串口套接字(仅 QEMU (ARM)),用于调试(用法:socat -,echo=0,icanon=0 unix-connect:serialp.sock
  • serialv.log:virtio 串口日志,用于调试
  • serialv.sock:virtio 串口套接字(仅 QEMU),用于调试(用法:socat -,echo=0,icanon=0 unix-connect:serialv.sock

SSH:

  • ssh.sock:SSH 控制主套接字
  • ssh.config:用于 ssh -F 的 SSH 配置文件。Lima 自身不使用。

VNC:

  • vncdisplay:VNC 显示主机/端口
  • vncpassword:VNC 显示密码

客户机代理:

每个驱动程序使用自己的通信模式

  • qemu:使用 virtio-port io.lima-vm.guest_agent.0
  • vz:使用 vsock 端口 2222
  • wsl2:使用空闲的随机 vsock 端口 回退是通过 ssh 端口使用端口转发
  • ga.sock:通过 SSH 转发到客户机中的 /run/lima-guestagent.sock

主机代理:

  • ha.pid:hostagent PID
  • ha.sock:hostagent REST API
  • ha.stdout.log:hostagent 标准输出(JSON 行,参见 pkg/hostagent/events.Event
  • ha.stderr.log:hostagent 标准错误(人类可读消息)

磁盘目录 (${LIMA_HOME}/_disk/<DISK>)

磁盘目录包含以下文件:

数据磁盘:

  • datadisk:附加到实例的 qcow2 或 raw 磁盘

锁:

  • in_use_by:指向正在使用该磁盘的实例目录的符号链接

当使用 vmType: vz(Virtualization.framework)时,在启动时,在 additionalDisks 中指定的任何 qcow2(默认)格式磁盘都将转换为 RAW,因为 Virtualization.framework 只支持挂载 RAW 磁盘。这种转换使额外磁盘能够与 Virtualization.framework 和 QEMU 一起工作,但在与磁盘交互时会产生一些后果。最重要的是,常规的 macOS 默认 cp 命令将复制 整个 虚拟磁盘大小,而不仅仅是 已使用/已分配 的部分。复制仅已使用数据的最简单方法是向 cp 添加 -c 选项:cp -c old_path new_pathcp -c 使用 clonefile(2) 创建磁盘的写时复制克隆,应该会立即返回。

ls 也只会显示磁盘的完整/虚拟大小。要查看已分配的空间,可以使用 du -h disk_pathqemu-img info disk_path。更多详情请参见 #1405

模板目录 (${LIMA_HOME}/_templates)

模板目录可以存储可以用 template:// 模式引用的额外模板文件。

如果模板目录存在(且未设置 $LIMA_TEMPLATES_PATH),则会在搜索包含 Lima 自身捆绑的所有模板的 /usr/local/share/lima/templates 默认目录之前搜索此目录。

Lima 缓存目录 (~/Library/Caches/lima)

在 macOS 上目前硬编码为 ~/Library/Caches/lima

在 Linux 上使用 $XDG_CACHE_HOME/lima,通常为 $HOME/.cache/lima

在 Windows 上使用 %LocalAppData%\lima,即 C:\Users\<USERNAME>\AppData\Local\lima

下载缓存 (~/Library/Caches/lima/download/by-url-sha256/<SHA256_OF_URL>)

该目录包含以下文件:

  • url:原始 url 文本,不带 “\n”
  • data:数据
  • <ALGO>.digest:数据的摘要,采用 OCI 格式。 例如,文件名 sha256.digest,内容为 sha256:5ba3d476707d510fe3ca3928e9cda5d0b4ce527d42b343404c92d563f82ba967

Ansible

实例目录包含一个清单文件,可能与 Ansible playbook 和命令一起使用。 参见 构建 Ansible 清单 关于动态清单。

cidata.iso

cidata.iso 包含以下文件:

  • user-dataCloud-init 用户数据
  • meta-dataCloud-init 元数据
  • network-configCloud-init 网络配置版本 2
  • lima.env:在 boot.sh 处理期间可用的 LIMA_CIDATA_* 环境变量(见下文)
  • param.env:对应于 lima.yamlparam 设置的 PARAM_* 环境变量
  • lima-guestagent:Lima 客户机代理二进制文件
  • nerdctl-full.tgznerdctl-full-<VERSION>-<OS>-<ARCH>.tar.gz
  • boot.sh:启动脚本
  • boot/*:启动脚本模块
  • util/*:实用程序命令脚本,在启动脚本模块中执行
  • provision.system/*:自定义配置脚本(系统)
  • provision.user/*:自定义配置脚本(用户)
  • etc_environment:要添加到 /etc/environment 的环境变量(也在 boot.sh 期间加载)

最大文件名长度 = 30

卷标签

卷标签是 “cidata”,由 cloud-init NoCloud 定义。

环境变量

  • LIMA_CIDATA_DEBUGlimactl start 命令的 --debug 标志的值。
  • LIMA_CIDATA_NAME:lima 实例名称
  • LIMA_CIDATA_MNT:磁盘的挂载点。/mnt/lima-cidata
  • LIMA_CIDATA_USER:用户名字符串
  • LIMA_CIDATA_UID:数字 UID
  • LIMA_CIDATA_COMMENT:全名或注释字符串
  • LIMA_CIDATA_HOME:客户机主目录
  • LIMA_CIDATA_SHELL:客户机登录 shell
  • LIMA_CIDATA_HOSTHOME_MOUNTPOINT:主机主目录的挂载点,如果未挂载则为空
  • LIMA_CIDATA_MOUNTS:Lima 挂载的数量
  • LIMA_CIDATA_MOUNTS_%d_MOUNTPOINT:Lima 挂载的第 N 个挂载点(N=0, 1, …)
  • LIMA_CIDATA_MOUNTTYPE:Lima 挂载的类型(“reverse-sshfs”、“9p”、…)
  • LIMA_CIDATA_DATAFILE_%08d_OVERWRITE:如果数据文件已存在时应该覆盖,则设置为 “true”。
  • LIMA_CIDATA_DATAFILE_%08d_OWNER:设置为数据文件的所有者。
  • LIMA_CIDATA_DATAFILE_%08d_PATH:设置为数据文件应复制到的路径。
  • LIMA_CIDATA_DATAFILE_%08d_PERMISSIONS:设置为数据文件的文件权限(八进制)。
  • LIMA_CIDATA_CONTAINERD_USER:如果要设置无根 containerd,则设置为 “1”
  • LIMA_CIDATA_CONTAINERD_SYSTEM:如果要设置系统级 containerd,则设置为 “1”
  • LIMA_CIDATA_CONTAINERD_ARCHIVE:containerd 归档的名称。nerdctl-full.tgz
  • LIMA_CIDATA_SLIRP_GATEWAY:设置为 SLIRP 网络上主机的 IP 地址。192.168.5.2
  • LIMA_CIDATA_SLIRP_DNS:设置为 SLIRP 网络上 DNS 的 IP 地址。192.168.5.3
  • LIMA_CIDATA_SLIRP_IP_ADDRESS:设置为 SLIRP 网络上客户机的 IP 地址。192.168.5.15
  • LIMA_CIDATA_UDP_DNS_LOCAL_PORT:设置为 hostagent dns 服务器的 udp 端口号(未启用时为 0)。
  • LIMA_CIDATA_TCP_DNS_LOCAL_PORT:设置为 hostagent dns 服务器的 tcp 端口号(未启用时为 0)。

虚拟机生命周期

lima 序列图

(基于 Lima 0.8.3)