
什么是 gVisor?
gVisor 在运行的应用程序与 宿主操作系统之间提供了一层强大的隔离。它是一个实现了 类 Linux 接口 的应用内核。与 Linux 不同,它使用内存安全 语言(Go)编写,并运行在用户空间。
gVisor 包含一个名为 runsc 的 开放容器倡议(OCI) 运行时,
使其能够轻松与现有的容器工具配合使用。runsc 运行时
与 Docker 和 Kubernetes 集成,使得运行沙箱化
容器变得简单。
gVisor 不是什么?
- gVisor 不是一个系统调用过滤器(例如
seccomp-bpf),也不是对 Linux 隔离原语的封装(例如firejail、AppArmor 等)。 - gVisor 也不是一台虚拟机,就日常术语中的含义而言(例如 VirtualBox、QEMU)。
gVisor 采取了一种独特的第三种方法,在保持常规用户空间应用程序 较低的资源占用、快速启动和 灵活性的同时,提供了许多虚拟机的安全优势。
为什么 gVisor 存在?
容器并不是一个沙箱。虽然容器已经 彻底改变了我们开发、打包和部署应用程序的方式,但使用它们来 运行不受信任或潜在恶意的代码而不进行额外隔离并不是 一个好主意。虽然使用单一共享内核可以实现效率和 性能提升,但也意味着仅凭一个 漏洞就可能发生容器逃逸。
gVisor 是一个用于容器的应用程序内核。它在限制应用程序可访问的主机内核表面的同时,仍允许应用程序访问其预期的所有功能。与大多数内核不同,gVisor 不假设或要求固定的物理资源集;相反,它利用现有的主机内核功能,并作为普通进程运行。换句话说,gVisor 通过 Linux 来实现 Linux。
不应将 gVisor 与用于增强容器抵御外部威胁、提供额外完整性检查或限制服务访问范围的技术和工具混淆。对于提供给容器的数据,应始终谨慎对待。
文档
用户文档和技术架构,包括快速入门指南,可在 gvisor.dev 找到。
从源代码安装
gVisor 支持在 x86_64 和 ARM64 上构建。未来可能会支持其他架构。
就这些说明而言,bazel 和其他构建依赖项被封装在一个构建容器中。也可以直接使用 bazel,或输入 make help 以构建标准目标。
要求
确保已安装以下依赖项:
- Linux 4.14.77+ (older linux)
- Docker 版本 17.09.0 或更高版本
构建
构建一个包含 runsc、containerd-shim-runsc-v1
containerd shim 以及若干 runsc 预期在自身旁边的
gvisor-bin/ 目录中找到的 sidecar 二进制文件的发布 tarball,然后将其解压到 /usr/local/bin:
make release-tarball DESTINATION=bin/
sudo tar -C /usr/local/bin -xf bin/gvisor.tar.bz2
要构建特定的库或二进制文件,你可以指定目标:
make build TARGETS="//pkg/tcpip:tcpip"
直接使用 Bazel 构建(不使用 Docker)
由于存在额外的开销,不建议直接使用 Bazel,但为了开始使用:
- 查看 build dockerfile 以获取所需依赖项的规范列表。
- 安装并使用 bazelisk。否则,请确保你的 bazel 版本与 .bazelversion 文件中列出的版本一致。
设置好依赖项后,使用 Bazel 与使用 Makefile 类似:
bazel build -c opt //debian:gvisor-release-tar
测试
要运行标准测试套件,您可以使用:
make unit-tests
make tests
要运行特定测试,您可以指定目标:
# Makefile
make test TARGETS="//runsc:version_test"
# Bazel
bazel test //runsc:version_test
Mac OS
某些包支持直接在 macOS 上运行测试。在撰写本文时,gVisor 需要 bazel 8,你可以通过 homebrew 安装:
brew install bazel@8
# You can then run the tests, e.g.:
$(brew --prefix bazel@8)/bin/bazel test --macos_sdk_version=$(xcrun --show-sdk-version) -- //tools/nogo/... //tools/check{aligned,const,escape,linkname,locks,unsafe}/...
使用 go get
本项目使用 bazel 来构建和管理依赖项。维护了一个合成的
go 分支,该分支与标准 go 工具链兼容,以提供便利。这对于依赖
gVisor 子包(例如通过 Netstack 实现的用户态网络)的外部包和库,将其 gVisor Go
代码导入到它们的 Go 项目中非常有用。
注意:runsc 从该分支构建的版本不受支持。gVisor 和
runsc 需要多个二进制文件(其中一些甚至不是用 Go 编写的)才能正常运行。go 分支以尽力而为的方式提供支持,
不支持直接在该分支上进行开发。开发应在
master 分支上进行,然后反映到 go 分支中。
社区与治理
请参阅 GOVERNANCE.md 获取项目治理信息。
gvisor-users 邮件列表 和 gvisor-dev 邮件列表 是提问和讨论的良好起点。
安全策略
请参阅 SECURITY.md。
贡献
请参阅 Contributing.md。
