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

Download history 313/week @ 2024-05-03 465/week @ 2024-05-10 689/week @ 2024-05-17 329/week @ 2024-05-24 758/week @ 2024-05-31 482/week @ 2024-06-07 731/week @ 2024-06-14 1294/week @ 2024-06-21 903/week @ 2024-06-28 287/week @ 2024-07-05 777/week @ 2024-07-12 328/week @ 2024-07-19 451/week @ 2024-07-26 140/week @ 2024-08-02 412/week @ 2024-08-09 236/week @ 2024-08-16

每月下载量 1,302

MIT/Apache

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绑定分开。

高级功能(更多内容见下文)

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-rsskopeo 之上,而后者最终是围绕 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 和容器的更多详细信息

请参阅 ostree-and-containers.md

依赖项

~30–44MB
~778K SLoC