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+(较旧的Linux)
- Docker 17.09.0或更高版本
构建
构建并安装runsc
二进制文件:
mkdir -p bin
make copy TARGETS=runsc DESTINATION=bin/
sudo cp ./bin/runsc /usr/local/bin
测试
要运行标准测试套件,可以使用:
make unit-tests
make tests
要运行特定测试,可以指定目标:
make test TARGETS="//runsc:version_test"
使用go get
本项目使用bazel来构建和管理依赖项。为了方便起见,维护了一个与标准go
工具兼容的合成go
分支。
例如,要直接从这个分支构建和安装runsc
:
echo "module runsc" > go.mod
GO111MODULE=on go get gvisor.dev/gvisor/runsc@go
CGO_ENABLED=0 GO111MODULE=on sudo -E go build -o /usr/local/bin/runsc gvisor.dev/gvisor/runsc
随后,你可以构建并安装containerd
的垫片二进制文件:
GO111MODULE=on sudo -E go build -o /usr/local/bin/containerd-shim-runsc-v1 gvisor.dev/gvisor/shim
请注意,这个分支是以最大努力的方式支持的,不支持直接在这个分支上进行开发。开发应该在master
分支上进行,然后反映到go
分支中。
社区与治理
有关项目治理信息,请参阅GOVERNANCE.md。
gvisor-users邮件列表和gvisor-dev邮件列表是提问和讨论的良好起点。
安全政策
请参阅SECURITY.md。
贡献
请参阅Contributing.md。