This is an informal translation of README.md
(revision c1368f45, 2022-Dec-12) in Chinese.
This translation might be out of sync with the English version.
Please refer to the English README.md
for the latest information.
这是 README.md
(修订版 c1368f45, 2022-12-12) 的非正式中文翻译,与英文版相比可能有所延迟。
最新情况请查看英文版 README.md
。
Lima 启动了具有自动文件共享和端口转发功能的 Linux 虚拟机(类似于 WSL2),以及 containerd。
Lima 可以被认为是某种非官方的 "Mac 上的 containerd"。
Lima 预期是在 macOS 宿主上使用,但它在 Linux 宿主上也运行良好。
✅ 自动文件共享
✅ 自动端口转发
✅ 对 containerd 的内建支持 (其他的容器引擎也可以使用)
✅ Intel 宿主上的 Intel 虚拟机
✅ ARM 宿主上的 ARM 虚拟机
✅ 各种虚拟机 Linux 发行版:AlmaLinux,Alpine,Arch Linux,Debian,Fedora,openSUSE,Oracle Linux,Rocky,Ubuntu (默认),……
相关项目:sshocker (带有文件共享和端口转发的 ssh)
这个项目与 The Lima driver project (driver for ARM Mali GPUs) 无关。
Talks 页面包含 Lima 相关会议演讲的幻灯片和视频的链接。
Lima 的目标是向 Mac 用户推广 containerd (包括 nerdctl (contaiNERD ctl)),但 Lima 也可以用于非容器应用。
容器环境:
- Rancher Desktop: 在桌面上进行 Kubernetes 和容器的管理
- Colima: 用最小化的安装来在 Mac 上使用 Docker (和 Kubernetes)
- Finch: Finch 是一个用于本地容器开发的命令行客户端
GUI:
- Lima xbar 插件: xbar 插件用于从菜单栏启动/停止虚拟机并查看它们的运行状态。
- lima-gui: Lima 的 Qt GUI
- GitHub Discussions
- CNCF Slack 上的
#lima
频道
Lima 遵循 CNCF 行为准则。
$ uname -a
Darwin macbook.local 20.4.0 Darwin Kernel Version 20.4.0: Thu Apr 22 21:46:47 PDT 2021; root:xnu-7195.101.2~1/RELEASE_X86_64 x86_64
$ lima uname -a
Linux lima-default 5.11.0-16-generic #17-Ubuntu SMP Wed Apr 14 20:12:43 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ LIMA_INSTANCE=arm lima uname -a
Linux lima-arm 5.11.0-16-generic #17-Ubuntu SMP Wed Apr 14 20:10:16 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux
请查看 ./docs/multi-arch.md
,获取 ARM 宿主上的 Intel 虚拟机 和 Intel 宿主上的 ARM 虚拟机 的执行情况。
$ echo "files under /Users on macOS filesystem are readable from Linux" > some-file
$ lima cat some-file
files under /Users on macOS filesystem are readable from Linux
$ lima sh -c 'echo "/tmp/lima is writable from both macOS and Linux" > /tmp/lima/another-file'
$ cat /tmp/lima/another-file
/tmp/lima is writable from both macOS and Linux
$ lima nerdctl run -d --name nginx -p 127.0.0.1:8080:80 nginx:alpine
你不用每次都运行 "lima nerdctl",相反,你可以使用特殊的快捷方式 "nerdctl.lima" 来做同样的事情。默认情况下,它将和 Lima 一起安装,所以,你不需要做任何额外的事情。会有一个名为 nerdctl 的符号链接指向 nerdctl.lima。但这只在目录中没有 nerdctl 条目时才会创建。值得一提的是,它只能通过 make install 创建。不包括在 Homebrew/MacPorts/nix 软件包中。
在 macOS 和 Linux 都可以通过 http://127.0.0.1:8080 访问。
关于如何使用 containerd 和 nerdctl(contaiNERD ctl),请访问 https://github.com/containerd/containerd 和 https://github.com/containerd/nerdctl。
可以直接使用 Homebrew 上的包 进行安装。
brew install lima
手动安装的步骤
安装 QEMU 7.0 或更新的版本。
- 从 https://github.com/lima-vm/lima/releases 下载 Lima 的二进制文件,
并将其解压到
/usr/local
(或其他地方)。比如:
brew install jq
VERSION=$(curl -fsSL https://api.github.com/repos/lima-vm/lima/releases/latest | jq -r .tag_name)
curl -fsSL "https://github.com/lima-vm/lima/releases/download/${VERSION}/lima-${VERSION:1}-$(uname -s)-$(uname -m).tar.gz" | tar Cxzvm /usr/local
- 如果想从源码安装 Lima,可以运行
make && make install
。
注意 Lima 没有定期在 ARM Mac 进行测试(因为缺乏 CI)。
[macOS]$ limactl start
...
INFO[0029] READY. Run `lima` to open the shell.
[macOS]$ lima uname
Linux
limactl start [--name=NAME] [--tty=false] <template://TEMPLATE>
: 启动 Linux 实例
$ limactl start
? Creating an instance "default" [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
...
INFO[0029] READY. Run `lima` to open the shell.
选择 Proceed with the current configuration
,然后等待宿主终端上显示 "READY" 。
如果想做自动化,--tty=false
flag 可以禁用用户交互。
从 "docker" 模板创建一个 "default" 实例:
$ limactl start --name=default template://docker
注意:
limactl start template://TEMPLATE
需要 Lima v0.9.0 或更新版本。 老版本应该用limactl start /usr/local/share/doc/lima/examples/TEMPLATE.yaml
替代。
查看模板列表:
$ limactl start --list-templates
从本地文件创建 "default" 实例:
$ limactl start --name=default /usr/local/share/lima/examples/fedora.yaml
从远程 URL(小心使用,一定要确保来源是可信的)创建 "default" 实例:
$ limactl start --name=default https://raw.githubusercontent.com/lima-vm/lima/master/examples/alpine.yaml
limactl shell <INSTANCE> <COMMAND>
: 在 Linux 上执行 <COMMAND>
。
对于 "default" 实例,这条命令可以缩写为 lima <COMMAND>
。
lima
命令也接受环境变量 $LIMA_INSTANCE
作为实例名。
limactl copy <SOURCE> ... <TARGET>
: 在实例之间,或者宿主与实例之间复制文件
使用 <INSTANCE>:<FILENAME>
指定一个实例内的源文件或者目标文件。
limactl list [--json]
: 列出实例
limactl stop [--force] <INSTANCE>
: 停止实例
limactl delete [--force] <INSTANCE>
: 删除实例
limactl factory-reset <INSTANCE>
: 将实例恢复为初始设置
limactl edit <INSTANCE>
: 编辑实例
limactl disk create <DISK> --size <SIZE>
: 创建一个要附加到某个实例的外部磁盘
limactl disk delete <DISK>
: 删除一个已有的磁盘
limactl disk list
: 列出所有已有的磁盘
-
要启用 bash 中的自动补全,添加
source <(limactl completion bash)
到~/.bash_profile
内。 -
要启用 zsh 中的自动补全,请查看
limactl completion zsh --help
Lima 可能存在导致数据丢失的 bug。
确保在运行 Lima 前做好数据备份。
尤其需要注意的是,以下数据可能很容易丢失:
- 共享可写目录下的数据(默认路径
/tmp/lima
), 可能在宿主休眠之后发生(比如,在关闭和重新打开笔记本电脑的盖子之后) - 虚拟机镜像中的数据,绝大部分发生在升级 Lima 的版本时
当前虚拟机默认配置:
- OS: Ubuntu 22.10 (Kinetic Kudu)
- CPU: 4 cores
- 内存:4 GiB
- 硬盘:100 GiB
- 挂载目录:
~
(只读),/tmp/lima
(可写) - SSH: 127.0.0.1:60022
- (系统)管理程序:QEMU 附带 HVF 加速(默认),或者 Virtualization.framework
- 文件共享:Reverse SSHFS (默认),或者 virtio-9p-pci 即 virtfs,或者 virtiofs
- 端口转发:
ssh -L
,通过监视虚拟机的/proc/net/tcp
和iptables
事件来自动化
- 请通过
git commit -s
来用你的真实姓名签名你的提交, 以此确认你的 Developer Certificate of Origin (DCO)。 - 请合并提交。
🙏
- 文档
- CLI 用户体验
- 性能优化
- Windows 宿主
- 使用 vsock 替换 SSH(这份工作需要在 QEMU repo 内完成)
默认情况下,密码是被禁用和锁定的。
你应该执行 limactl shell bash
(或者 lima bash
)来打开 shell。
还有一种方法,你可以直接 ssh 进虚拟机:ssh -p 60022 -i ~/.lima/_config/user -o NoHostAuthenticationForLocalhost=yes 127.0.0.1
。
可以的。不过我们没有定期在 ARM 上进行测试(因为缺乏 CI)。
AlmaLinux,Alpine,Arch Linux,Debian,Fedora,openSUSE,Oracle Linux,和 Rocky 都是可以运行的。
请查看 ./examples/
。
一个镜像必须满足下面的需求:
- systemd 或者 OpenRC
- cloud-init
- 下面的二进制包应该被预装:
sudo
- 下面的二进制包应该被预装,或者可以通过包管理器安装:
sshfs
newuidmap
和newgidmap
apt-get
,dnf
,apk
,pacman
, 或者zypper
(如果你想贡献对其他包管理器的支持,请执行git grep apt-get
来确定哪里需要改动)
是的,任何容器引擎都可以和 Lima 配合使用。
容器运行时例子:
./examples/docker.yaml
: Docker./examples/podman.yaml
: Podman./examples/apptainer.yaml
: Apptainer
容器镜像构建器例子:
./examples/buildkit.yaml
: BuildKit
容器业务流程协调程序例子:
./examples/k3s.yaml
: Kubernetes (k3s)./examples/k8s.yaml
: Kubernetes (kubeadm)./examples/nomad.yaml
: Nomad
默认的 Ubuntu 镜像也包含了 LXD。运行 lima sudo lxc init
来设置 LXD。
也可以看看第三方基于 Lima 的 containerd 项目:
- Rancher Desktop: 在桌面上进行 Kubernetes 和容器的管理
- Colima: 用最小化的安装来在 Mac 上使用 Docker (和 Kubernetes)
Lima 本身不支持连接到远程 Linux 计算机,但是 Lima 的前身 sshocker 为远程 Linux 计算机提供了类似的功能。
例如,运行 sshocker -v /Users/foo:/home/foo/mnt -p 8080:80 <USER>@<HOST>
将 /Users/foo
作为 /home/foo/mnt
向远程计算机公开,并将 localhost:8080
转发到远程计算机的 80 端口。
Lima 是免费软件(Apache License 2.0),但 Docker for Mac 不是。 他们的 EULA 甚至禁止披露 benchmark 的结果。
另一方面来说,Moby,即 Docker for Linux,也是免费软件,但 Moby/Docker 没有 containerd 的几个新特性,比如:
如果你在 macOS 上通过 homebrew 安装了 QEMU v6.0.0 或更新的版本,你的 QEMU 二进制文件应该已经自动签名以启用 HVF 加速。
但是,如果你看到 HV_ERROR
,你可能需要对二进制文件进行手动签名。
cat >entitlements.xml <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.hypervisor</key>
<true/>
</dict>
</plist>
EOF
codesign -s - --entitlements entitlements.xml --force /usr/local/bin/qemu-system-x86_64
注意:只有 10.15.7 之前版本的 macOS 上你才可能需要额外添加这个授权:
<key>com.apple.vm.hypervisor</key>
<true/>
- 确保 HVF 已经通过
com.apple.security.hypervisor
授权进行启用。参见 "QEMU 崩溃,提示HV_ERROR
" - 模拟非原生计算机(Intel 宿主上的 ARM 虚拟机,ARM 宿主上的 Intel 虚拟机)在设计上就很慢。查看
docs/multi-arch.md
了解解决方法。
- 确保 QEMU 已经签名过。参见 "QEMU 崩溃,提示
HV_ERROR
"。 - 如果你是在 macOS 10.15.7 或者 11.0 或者更新的版本上运行,请确保授权
com.apple.vm.hypervisor
没有被添加。它只在旧版本 macOS 上生效。你可以通过执行codesign --remove-signature /usr/local/bin/qemu-system-x86_64
来清理签名然后重新开始
已知在 Intel Mac 上运行 RHEL8 兼容发行版(如 Rocky Linux 8.x)的镜像时会发生此错误。
解决方式是设置环境变量:QEMU_SYSTEM_X86_64="qemu-system-x86_64 -cpu Haswell-v4"
。
https://bugs.launchpad.net/qemu/+bug/1838390
默认虚拟机 IP 192.168.5.15 对宿主和其他虚拟机来说是不可访问的。
要添加另一个 IP 地址给宿主和其他虚拟机访问的话,请启用 socket_vmnet
(从 Lima v0.12 起可用)
或者 vde_vmnet
(已弃用).
请查看 ./docs/network.md
。
Lima 使用的是 QEMU 的 SLIRP 网络,它不支持开箱即用 ping
。
$ ping google.com
PING google.com (172.217.165.14): 56 data bytes
64 bytes from 172.217.165.14: seq=0 ttl=42 time=2395159.646 ms
64 bytes from 172.217.165.14: seq=0 ttl=42 time=2396160.798 ms (DUP!)
更多细节请查看 Documentation/Networking。
试试 virtiofs。请查看 docs/mount.md
。
默认情况下,home 目录是以只读形式挂载的。
如果想启用可写,请在 YAML 中指定 writable: true
。
mounts:
- location: "~"
writable: true
运行 limactl edit <INSTANCE>
来为一个实例打开 YAML 编辑器进行编辑。
在 macOS 宿主上,Rancher Desktop(从 v1.0 开始)以以下配置启动 Lima:
$LIMA_HOME
目录:$HOME/Library/Application Support/rancher-desktop/lima
limactl
二进制文件:/Applications/Rancher Desktop.app/Contents/Resources/resources/darwin/lima/bin/limactl
- Lima 实例名:
0
如果想要开启一个 shell,运行下面的命令:
LIMA_HOME="$HOME/Library/Application Support/rancher-desktop/lima" "/Applications/Rancher Desktop.app/Contents/Resources/resources/darwin/lima/bin/limactl" shell 0
在 Linux 宿主上,试试以下命令:
LIMA_HOME="$HOME/.local/share/rancher-desktop/lima" /opt/rancher-desktop/resources/resources/linux/lima/bin/limactl shell 0
如果你已经安装了 Rancher Desktop 作为一个 AppImage 的话:
LIMA_HOME="$HOME/.local/share/rancher-desktop/lima" "$(ls -d /tmp/.mount_ranche*/opt/rancher-desktop/resources/resources/linux/lima/bin)/limactl" shell 0
- 检查日志:
limactl --debug start
$HOME/.lima/<INSTANCE>/serial.log
/var/log/cloud-init-output.log
(虚拟机内)/var/log/cloud-init.log
(虚拟机内)
- 确保你没有在 YAML 文件内混合使用空格和 tab。
我们是一个 Cloud Native Computing Foundation 沙盒项目。
The Linux Foundation® (TLF) has registered trademarks and uses trademarks. For a list of TLF trademarks, see Trademark Usage.