67个版本
0.14.4 | 2024年7月16日 |
---|---|
0.14.2 | 2024年6月21日 |
0.13.3 | 2024年3月11日 |
0.12.8 | 2023年12月15日 |
0.2.1 | 2021年7月28日 |
在 操作系统 中排名 38
每月下载量 1,302
445KB
9K SLoC
ostree-ext
使用Rust编写的,基于Rust ostree绑定的ostree扩展API。
如果您正在编写使用ostree和Rust的工具,这个crate是为您准备的。然而,虽然ostree核心非常稳定,但API和数据模型以及这个crate应该被视为“可塑的”。将努力保留先前版本(例如tar和容器序列化)写入的数据的向后兼容性,但如果你选择使用这个crate,请提交一个问题来告知我们。
目前,以下项目已知使用此crate
这个crate的目的是成为新的高级ostree相关功能实现的地方。然而,目前它被保留在与核心C库分开的状态,而核心C库本身也与ostree-rs绑定分开。
高级功能(更多内容见下文)
- ostree和opencontainers/image的桥接/集成
- 通用的tar导入/导出
- 比较ostree提交的API
flowchart TD
ostree-rs-ext --- ostree-rs --- ostree
ostree-rs-ext --- containers-image-proxy-rs --- skopeo --- containers/image
有关容器栈的更多信息,请参阅下文。
模块 "tar": tar导出/导入
ostree支持导出到tar包是有损的,因为它没有例如提交元数据。这添加了一种新的导出格式,实际上是一种新的自定义仓库模式,结合了硬链接检查。
这个新的导出流可以被无损地导入到不同的仓库中。
文件系统布局
.
├── etc # content is at traditional /etc, not /usr/etc
│ └── passwd
├── sysroot
│ └── ostree # ostree object store with hardlinks to destinations
│ ├── repo
│ │ └── objects
│ │ ├── 00
│ │ └── 8b
│ │ └── 7df143d91c716ecfa5fc1730022f6b421b05cedee8fd52b1fc65a96030ad52.file.xattrs
│ │ └── 7df143d91c716ecfa5fc1730022f6b421b05cedee8fd52b1fc65a96030ad52.file
│ └── xattrs # A new directory with extended attributes, hardlinked with .xattr files
│ └── 58d523efd29244331392770befa2f8bd55b3ef594532d3b8dbf94b70dc72e674
└── usr
├── bin
│ └── bash
└── lib64
└── libc.so
将其视为一种新的ostree仓库模式tar-stream
等,尽管目前它只包含一个提交。
主要区别是添加了特殊的 .xattr
文件;tar 变体和支持库之间的差异太大,以至于我们不能依赖它们在往返过程中工作。此外,为了支持容器中的 web 服务器,我们需要例如 security.selinux
不会被容器运行时修改/覆盖。
模块 "diff": 计算两个 ostree 提交之间的差异
let subdir: Option<&str> = None;
let refname = "fedora/coreos/x86_64/stable";
let diff = ostree_ext::diff::diff(repo, &format!("{}^", refname), refname, subdir)?;
这被 rpm-ostree ex apply-live
所使用。
模块 "container": 在 ostree 和 OCI/Docker 镜像之间建立桥梁
此模块包含 API,用于在 OSTree 提交和 opencontainers 生态系统之间双向映射。
因为容器镜像只是 tar 文件的层,所以它建立在 crate::tar
模块之上。
此模块建立在 containers-image-proxy-rs 和 skopeo 之上,而后者最终是围绕 containers/image 生态系统的前端。
特别是,containers/image
库用于从远程仓库检索内容,这使得可以在该库的功能之上构建,包括签名、镜像和一般而言,一个经过战斗考验的与 OCI 和 Docker 仓库交互的代码库。
封装
对于现有使用 ostree 的组织,提供了 API(和 CLI)来“封装”和“解封装”一个 OSTree 提交作为一个 OCI 镜像。
$ ostree-ext-cli container encapsulate --repo=/path/to/repo exampleos/x86_64/stable docker://quay.io/exampleos/exampleos:stable
然后您可以选择例如。
$ podman run --rm -ti --entrypoint bash quay.io/exampleos/exampleos:stable
直接运行容器进行 CI 测试是一个用例。但更重要的是,这个容器镜像可以推送到任何仓库,并作为基于 ostree 的操作系统发布工程的一部分使用。
然而,这是一个非常简单的模型——它目前生成一个包含单个层的容器镜像,这意味着每次更改都需要重新下载整个层。最近,生成容器镜像的底层 API 支持了“分块”镜像。但这需要为特定的包/构建系统编码。
生成“分块”镜像的好参考代码库是 rpm-ostree compose container-encapsulate。这用于生成当前的 Fedora CoreOS 镜像。
直接解封装 ostree 容器
这个工作的一个主要目标是使它完全原生于基于 ostree 的操作系统,以便直接拉取容器镜像。
CLI 提供了一种“解封装”的方法——以流式传输的方式获取容器镜像并导入嵌入的 OSTree 提交。在这里,您必须使用一个定义签名验证的前缀方案。
ostree-remote-image:$remote:$imagereference
:这表明应使用 ostree 远程配置$remote
验证嵌入在镜像引用中的 OSTree 提交。ostree-image-signed:$imagereference
:通过 containers/image 堆栈获取,但需要 某些 签名验证(不是通过 ostree)。ostree-unverified-image:$imagereference
:不执行任何签名验证
$ ostree-ext-cli container unencapsulate --repo=/ostree/repo ostree-remote-image:someremote:docker://quay.io/exampleos/exampleos:stable
但像 rpm-ostree 这样的项目可以支持
$ rpm-ostree rebase ostree-remote-image:someremote:quay.io/exampleos/exampleos:stable
(与常规的 rpm-ostree upgrade
升级一样,知道如何拉取那个容器镜像)
为了强调这一点,当前的高级模型是这是一对一的映射——一个 ostree 提交可以导出(包装)到一个容器镜像中,这将正好有一个层。当将其重新导入到 ostree 仓库中时,除了其校验和之外的所有容器元数据都将被丢弃。
签名
OSTree 支持本地的 GPG 和 ed25519 签名,并且默认情况下,在从获取的容器镜像启动时,会验证 ostree 级别的签名。对于 ostree,通过 ostree 远程指定签名配置。为了将此配置配对,该库定义了一个“类似 URL”的字符串模式:ostree-remote-registry:<remotename>:<containerimage>
一个具体的实例可能是:ostree-remote-registry:fedora:quay.io/coreos/fedora-coreos:stable
要解析和生成这些字符串,请参阅 OstreeImageReference
。
分层
容器镜像的一个关键特性是支持分层。此功能通过一个独立的 container/store 模块处理。
这些 API 也通过 CLI 公开
$ ostree-ext-cli container image --help
ostree-ext-cli-container-image 0.4.0-alpha.0
Commands for working with (possibly layered, non-encapsulated) container images
USAGE:
ostree-ext-cli container image <SUBCOMMAND>
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
SUBCOMMANDS:
copy Copy a pulled container image from one repo to another
deploy Perform initial deployment for a container image
help Prints this message or the help of the given subcommand(s)
list List container images
pull Pull (or update) a container image
有关 ostree 和容器的更多详细信息
依赖项
~30–44MB
~778K SLoC