CoreOS coreos-assembler文档

Posted rtoax

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CoreOS coreos-assembler文档相关的知识,希望对你有一定的参考价值。

CoreOS coreos-assembler文档

荣涛
2021年11月24日

文档修改日志

日期修改内容修改人备注
2021年11月24日创建FCOS荣涛
2021年11月25日cosa命令行荣涛
2021年11月29日buildextend荣涛
2021年12月3日cosa run荣涛

引言

简言之,有一个容器,可以用docker或者podman pull下来,几个链接如下:

coreos-assembler/被安装在容器中的/usr/lib/coreos-assembler目录下,使用cosa shell命令进入容器。

创建Fedora CoreOS

1. 创建流程图

下图显示使用COSA 创建Fedora CoreOS的流程:

2. 开始:先决条件

官网上Building Fedora CoreOS使用podman,我的环境podman装不上,我用的docker。

然而,最主要的先决条件是理解coreos-assembler是如何生成磁盘镜像的,并且,以可维护的方式创建它们需要访问虚拟化——具体来说是/dev/kvm

如果你在KVM 虚机中运行,可以尝试使能nested virt,简述为下面指令:

$ cat /sys/module/kvm_intel/parameters/nested
Y

下面有一些云选项提供给裸金属或者nested virt,如:

  • Packet
  • GCE nested virt
  • EC2 i3.metal instances
  • IBM Bare Metal

此外,在Kubernetes内完全支持运行coreos-assembler;Fedora CoreOS流水线在OpenShift 中作为一个私有的裸金属集群pod中运行coreos-assembler,这个pod中挂载了/dev/kvm。查看fedora-coreos-pipeline源代码和guide to run COSA using nested virt with OpenShift in GCP.

3. 下载Docker容器

$ podman pull quay.io/coreos-assembler/coreos-assembler

我用的:

$ docker pull quay.io/coreos-assembler/coreos-assembler
Using default tag: latest

latest: Pulling from coreos-assembler/coreos-assembler
0c2ae48d4544: Pull complete 
92e54902f7e4: Pull complete 
6051e78b771d: Pull complete 
20086a808f59: Pull complete 
16c748d7b474: Pull complete 
64611d28061f: Pull complete 
a2e5a49d1652: Pull complete 
8828cffada3f: Pull complete 
b46fd9827bd5: Pull complete 
7e4680a05da4: Pull complete 
595650b13b9d: Pull complete 
a2273e4bd4fa: Pull complete 
be9cd0230faf: Pull complete 
6261502e6232: Pull complete 
Digest: sha256:5b255b58da05810dd077ba0be9967ca8bd9c1a23cc9786835bf48cbf6c68057c
Status: Downloaded newer image for quay.io/coreos-assembler/coreos-assembler:latest
quay.io/coreos-assembler/coreos-assembler:latest

查看镜像:

$ docker images 
REPOSITORY                                  TAG       IMAGE ID       CREATED         SIZE
quay.io/coreos-assembler/coreos-assembler   latest    bfd1d8866cea   9 hours ago     7.04GB
quay.io/coreos/butane                       release   53539920e69e   3 months ago    6.51MB

4. 创建工作目录

$ mkdir fcos
$ cd fcos

我的目录/home/rongtao/fcos

5. 定义bash昵称,运行cosa

写一个bash脚本运行容器,有一些需要调整的参数。

需要使用non-root执行。

cosa() 
   env | grep COREOS_ASSEMBLER
   local -r COREOS_ASSEMBLER_CONTAINER_LATEST="quay.io/coreos-assembler/coreos-assembler:latest"
   if [[ -z $COREOS_ASSEMBLER_CONTAINER ]] && $(podman image exists $COREOS_ASSEMBLER_CONTAINER_LATEST); then
       local -r cosa_build_date_str="$(podman inspect -f ".Created" $COREOS_ASSEMBLER_CONTAINER_LATEST | awk 'print $1')"
       local -r cosa_build_date="$(date -d $cosa_build_date_str +%s)"
       if [[ $(date +%s) -ge $((cosa_build_date + 60*60*24*7)) ]] ; then
         echo -e "\\e[0;33m----" >&2
         echo "The COSA container image is more that a week old and likely outdated." >&2
         echo "You should pull the latest version with:" >&2
         echo "podman pull $COREOS_ASSEMBLER_CONTAINER_LATEST" >&2
         echo -e "----\\e[0m" >&2
         sleep 10
       fi
   fi
   set -x
   podman run --rm -ti --security-opt label=disable --privileged                                    \\
              --uidmap=1000:0:1 --uidmap=0:1:1000 --uidmap 1001:1001:64536                          \\
              -v $PWD:/srv/ --device /dev/kvm --device /dev/fuse                                  \\
              --tmpfs /tmp -v /var/tmp:/var/tmp --name cosa                                         \\
              $COREOS_ASSEMBLER_CONFIG_GIT:+-v $COREOS_ASSEMBLER_CONFIG_GIT:/srv/src/config/:ro   \\
              $COREOS_ASSEMBLER_GIT:+-v $COREOS_ASSEMBLER_GIT/src/:/usr/lib/coreos-assembler/:ro  \\
              $COREOS_ASSEMBLER_CONTAINER_RUNTIME_ARGS                                            \\
              $COREOS_ASSEMBLER_CONTAINER:-$COREOS_ASSEMBLER_CONTAINER_LATEST "$@"
   rc=$?; set +x; return $rc

根据我的环境,我做出了一些小的改动,因为我使用docker,和podman不完全兼容。

6. 执行指令

首先,指令cosa需要使能:

$ source cosa.sh

然后,就可以添加参数地在bash下运行这个命令。

7. 初始化

首先需要从GitHub上克隆配置,需要新建一个空文件夹,并进入:

$ mkdir fcos
$ cd fcos
$ cosa init --branch stable https://github.com/coreos/fedora-coreos-config

我在Gitee上放了上面github仓库的镜像https://gitee.com/rtoax/fedora-coreos-config

克隆的仓库将在`$PWD/src/config/目录中。

7.1. 源

有如下几个源:

          https://kojipkgs.fedoraproject.org/repos-dist/coreos-pool/latest/x86_64/Packages/

                https://repo.huaweicloud.com/fedora/releases/35/Everything/x86_64/os/Packages/
      https://dl.fedoraproject.org/pub/fedora/linux/releases/35/Everything/x86_64/os/Packages/

                  https://repo.huaweicloud.com/fedora/updates/35/Everything/x86_64/Packages/
        https://dl.fedoraproject.org/pub/fedora/linux/updates/35/Everything/x86_64/Packages/

          https://repo.huaweicloud.com/fedora/updates/testing/35/Everything/x86_64/Packages/
https://dl.fedoraproject.org/pub/fedora/linux/updates/testing/35/Everything/x86_64/Packages/

          https://repo.huaweicloud.com/fedora/updates/35/Modular/x86_64/Packages/
https://dl.fedoraproject.org/pub/fedora/linux/updates/35/Modular/x86_64/Packages/

          https://repo.huaweicloud.com/fedora/updates/testing/35/Modular/x86_64/Packages/
https://dl.fedoraproject.org/pub/fedora/linux/updates/testing/35/Modular/x86_64/Packages/

在coreos-assembler源码中对应命令行shell脚本为cmd-init,简言之,该脚本使用git命令克隆一个fedora coreos配置仓库。

8. 下载RPMs

首先,取所有元数据和数据包:

$ cosa fetch
Run docker run
+ docker run --rm -ti --security-opt label=disable --privileged -v /home/rongtao/test-os/coreos-assembler/fcos/a.test:/srv/ --device /dev/kvm --device /dev/fuse --tmpfs /tmp -v /var/tmp:/var/tmp --name cosa quay.io/coreos-assembler/coreos-assembler:latest fetch
Config commit: f1962b51d501262580ec55972f6ca2fc7d3da9e6
[此处省略很多行]
Installing 400 packages:
  NetworkManager-1:1.32.12-2.fc35.x86_64 (fedora-coreos-pool)
  NetworkManager-cloud-setup-1:1.32.12-2.fc35.x86_64 (fedora-coreos-pool)
  NetworkManager-libnm-1:1.32.12-2.fc35.x86_64 (fedora-coreos-pool)
  NetworkManager-team-1:1.32.12-2.fc35.x86_64 (fedora-coreos-pool)
  [此处省略很多行]
Input state hash: 5b11f395b70439126f1918f57526cee46a834102e19cf4930588d46302498c7c
Will download: 400 packages (546.1?MB)
⠤ Downloading from 'fedora-coreos-pool'  45% [█████████░░░░░░░░░░░] (29m)

9. 创建

然后进行创建:

$ cosa build

此步骤需要耐心等待,需要时间较长。

每一次build都会在$PWD/builds/中创建一个新的文件夹,包含生成的OSTree提交(tar压缩文件)和qemu虚拟机镜像。

下一步,再次运行cosa build,确保没有再次更改。你可以再次运行cosa fetch检测RPMs更新。

在coreos-assembler源码中对应命令行shell脚本为cmd-fetch

10. 运行

$ cosa run

这将启动builds/latest下的QEMU镜像。它使用-snapshot,所以任何改动都将在你退出qemu后消失。使用Ctrl-a x退出,Ctrl-a ?查看更多选项。

使用cosa run --devshell-console独占shell显示所有日志。

11. 自定义运行

运行r任意位置的qcow2:

$ cosa run --qemu-image ./coreos-style.qcow2

此外,可能在运行镜像的时候传递自定义的ignition配置文件,要求使用子命令kola qemuexec:

$ cosa kola qemuexec --ignition ./ignition.json --ignition-direct --qemu-image ./coreos-style.qcow2

具体帮助信息参见cosa kola qemuexec --help

12. 生成ISO

参见命令buildextend-live对应章节。

13. 可能遇到的问题

13.1. cosa fetch

分支问题
stablelinux-firmware-20210919-125.fc35.noarch.rpm
rhcos-4.6NetworkManager-1:1.22.14-1.fc32.x86_64
rhcos-4.7NetworkManager-1:1.26.4-1.fc33.x86_64
rhcos-4.8NetworkManager-1:1.26.6-1.fc33.x86_64
rhcos-4.9

cosa fetch将下载repomd.xml文件,注意在https://github.com/coreos/fedora-coreos-config中链接已经失效,需要修改为:

仓库中的URL已经失效,
失效URL:https://dl.fedoraproject.org/pub/
重定位到:https://archives.fedoraproject.org/pub/archive/

为了简化上面的问题,执行下面的脚本进行URL替换:

#!/bin/bash 
# Rong Tao 
# 2021.11.25

from_url="https://dl.fedoraproject.org/pub/"
to_url="https://archives.fedoraproject.org/pub/archive/"

files=`sudo grep -rl "https://dl.fedoraproject.org/pub/" | grep repo`

for f in $files
do
	sed "s/https:\\/\\/dl.fedoraproject.org\\/pub\\//https:\\/\\/archives.fedoraproject.org\\/pub\\/archive\\//g" -i $f
done

13.1.1. cannot update repo ‘fedora-updates’

$ cosa fetch
Run docker run
+ docker run --rm -ti --security-opt label=disable --privileged -v /home/rongtao/test-os/coreos-assembler/fcos/a.test:/srv/ --device /dev/kvm --device /dev/fuse --tmpfs /tmp -v /var/tmp:/var/tmp --name cosa quay.io/coreos-assembler/coreos-assembler:latest fetch
Config commit: 8ee685de4336f856df18bf2edb12d7e76ae79c43
Using manifest: /srv/src/config/manifest.yaml
Committing fedora-coreos-config-overlay-05core: /srv/src/config/overlay.d/05core ... b051dd01da43793dafbf7b43871369c5f5fc4a385e7e52d197112af977be9a6c
Committing fedora-coreos-config-overlay-08nouveau: /srv/src/config/overlay.d/08nouveau ... a038f599e14a87ddfd41057137755c3aae56b6025f915fc172af97d0c137f168
Committing fedora-coreos-config-overlay-09misc: /srv/src/config/overlay.d/09misc ... a5f9323b6d1659ecf9418c82a5ce964cb568d7c45c4f1cd936c34b67cbc0e37b
Committing fedora-coreos-config-overlay-10coreuser: /srv/src/config/overlay.d/10coreuser ... 4b5df802bc38436cce7e678aa72b106ee1ce0af96c72a9f385135a4a4b9d0ce1
Committing fedora-coreos-config-overlay-14NetworkManager-plugins: /srv/src/config/overlay.d/14NetworkManager-plugins ... faf5ad65722897da7e0d693d7b4977952e5cf40700c0c7fccf0b28db848f3dca
Committing fedora-coreos-config-overlay-15fcos: /srv/src/config/overlay.d/15fcos ... d5de83ffd89156e331b8933aa8b3b28932e672cf4395fffed51d54c3ec138c46
Committing fedora-coreos-config-overlay-20platform-chrony: /srv/src/config/overlay.d/20platform-chrony ... 9bc640c6e4749c9d2b4223e7e29c66ad6db0d98eb72fb11b190e7ae917d69b5b
Running: rpm-ostree compose tree --repo=/srv/tmp/repo --touch-if-changed /srv/tmp/treecompose.changed --cachedir=/srv/cache --unified-core /srv/tmp/override/coreos-assembler-override-manifest.yaml --download-only
0 metadata, 0 content objects imported; 0 bytes content written
rpm-ostree version: 2021.13
No previous commit for fedora/x86_64/coreos/bodhi-updates
Enabled rpm-md repositories: fedora fedora-updates fedora-modular fedora-updates-modular
⠉ Updating metadata for 'fedora'  95% [███████████████████░] (0s) 

Updating metadata for 'fedora'... done
⠉ Updating metadata for 'fedora-updates'  87% [█████████████████░░░] (1s) 

Updating metadata for 'fedora-updates'... done
error: Updating rpm-md repo 'fedora-updates': cannot update repo 'fedora-updates': Yum repo downloading error: Downloading error(s): repodata/9a011f78a635d685046799c26bf5535db37aa9fcba981b10b45b00aad118c648-primary.xml.zck - Cannot download, all mirrors were already tried without success; repodata/aa482bfd3a0fed676f370cec186dc26b8c79e231e54343faf8292b4d29434968-filelists.xml.zck - Cannot download, all mirrors were already tried without success; Last error: Curl error (28): Timeout was reached for https://archives.fedoraproject.org/pub/archive/fedora/linux/updates/31/Everything/x86_64/repodata/9a011f78a635d685046799c26bf5535db37aa9fcba981b10b45b00aad118c648-primary.xml.zck [Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds]
+ rc=1
+ set +x

上面下载的文件不存在,参考网址

9a011f78a635d685046799c26bf5535db37aa9fcba981b10b45b00aad118c648-primary.xml.zck 不存在
5dd866cf6ce0e21f428b6c5bf4eabee65719b72c8cc279393125e79b34fdae31-primary.xml.zck 存在
aa482bfd3a0fed676f370cec186dc26b8c79e231e54343faf8292b4d29434968-filelists.xml.zck 不存在
d601f9ef02bca6948263031733c69a1dbdc8ad11750d4e8dbd91256d775ecaf5-filelists.xml.zck 存在

上面下载的文件存在,但下载超时,参考网址

9a011f78a635d685046799c26bf5535db37aa9fcba981b10b45b00aad118c648-primary.xml.zck

注意,在初始化过程中要指定fedora coreos config的分支:cosa init --branch stable,因为默认是个测试分支。

13.1.2. 不存在的rpm包

RPM包repo网址

还是cosa fetch阶段,提示错误:没有Packages/l/linux-firmware-20210919-125.fc35.noarch.rpm。在网页上查看,也是找不到这个rpm包。

可以尝试初始化阶段指定别的分支试试。在初始化阶段使用特定发布的分支:

$ cosa init --branch rhcos-4.9 https://gitee.com/rtoax/fedora-coreos-config

但是这个问题并没有得到解决。我又换了一个分支rhcos-4.6,遇到了下面的问题。

13.1.3. Couldn’t find locked package

$ cosa init --branch rhcos-4.6 https://gitee.com/rtoax/fedora-coreos-config
[...]
rpm-ostree version: 2021.13
No previous commit for fedora/x86_64/coreos/testing-devel
Enabled rpm-md repositories: fedora-coreos-pool fedora fedora-updates
Updating metadata for 'fedora-coreos-pool'... done
Updating metadata for 'fedora'... done
Updating metadata for 'fedora-updates'... done
Importing rpm-md... done
rpm-md repo 'fedora-coreos-pool'; generated: 2021-11-24T21:43:31Z solvables: 14546
rpm-md repo 'fedora'; generated: 2020-04-22T22:22:36Z solvables: 55327
rpm-md repo 'fedora-updates'; generated: 2021-05-25T01:50:03Z solvables: 27535
error: Couldn't find locked package 'NetworkManager-1:1.22.14-1.fc32.x86_64' (pkgs matching NEVRA: 0; mismatched checksums: 0)

如果是rhcos-4.6分支,将提示NetworkManager-1:1.26.4-1.fc33.x86_64

用coreos-assembler自定义CoreOS

文章中的意思是,coreos-assembler是专门为Fedora CoreOS打造的工具。维护一个定制的操作系统构建是一项不容小觑的任务。但是,我们将努力记录更改,并保持 coreos-assembler 相对稳定。

CoreOS-assembler 用于构建 RHEL CoreOS,但是 CoreOS-assembler 目前不是 Red Hat 产品。

使用CoreOS Assembler

Working with CoreOS Assembler

1. 理解 config git:COREOS_ASSEMBLER_CONFIG_GIT

理论上,coreos-assembler将生成OSTree 提交和磁盘镜像绑定到一个独立的建立模式中。建立目标被config git定义,存放在src/config中(相对于build目录)。

我们可以使用环境变量COREOS_ASSEMBLER_CONFIG_GIT,例如:

$ export COREOS_ASSEMBLER_CONFIG_GIT=/path/to/github.com/coreos/fedora-coreos-config/
$ cosa init --force /dev/null
$ cosa fetch && cosa build

否则你需要执行$ cosa init https://github.com/coreos/fedora-coreos-config才行。

2. config git组件

2.1. manifest.yaml

为了生成OSTree commits,CoreOS Assembler使用manifest.yaml文件:一个rpm-ostre或者treefile,它大部分可以归结为一个 rpm 列表和一组 rpm-md 仓库。

它也支持postprocess进行人工修改。查看rpm-ostree的文档Treefile format reference

2.2. overlay.d/

通过在overlay.d/下创建子目录,coreos-assembler也支持嵌入架构依赖的配置文件和脚本。每个子目录都是通过OSTree commits添加,以字母顺序排序。建议使用以字母为前缀的名称,如05core, 10extras。非目录将会被忽略。例如,README.md文件就被忽略了。

2.3. image.yaml

这个YAML文件配置输出的磁盘镜像,支持的keys有:

  • size:以GB为单位的云镜像需求的大小;
  • extra-kargs:内核命令行参数列表;
  • include:包含另一个yaml文件,列出的值将被扩展。其他类型,源配置文件中的优先级高。

3. 修改config git配置

首先你可以扩展镜像大小,修改src/config/image.yaml即可,然后再次运行cosa build,并且得知OSTree commit没有变化,但是一个新的镜像将在builds中生成,当你运行cosa run时,将会生成这个镜像。

另外,尝试编辑src/config/manifest.yaml,添加或移除packages。你也可以添加本地rpm-md file:///仓库。

4. 使用overrides

开发速度取决于编辑-编译-调试这个周期。coreos-assembler支持overrides/子目录,允许容易的覆盖在基础OS上本地生成的内容。

overrides/子目录下级目录:

  • overrides/rootfs
  • overrides/rpm

假如你想修改ostreeignition-dracut,看这个github上的pull requestPR,增加了make install DESTDIR=支持。总体上,上游建立的系统支持。

具体的,如果/path/to/cosa-workdir时你运行cosa init的目录,那么在项目编辑之后,为新添加的组件执行下面的命令:

$ make install DESTDIR=/path/to/cosa-workdir/overrides/rootfs

这将安装文件到/path/to/cosa-buildroot/overrides/rootfs/usr/bin/ostree。然后,可以在cosa工作目录执行cosa build,覆盖合并。

你也可以选择overrides/rpm目录接收建立前的RPMs包。当你想在任意位置搭建二进制RPM,或者你想通过官方的建立流程,这可能是比较好的选择。如果任何RPMs包已经存在,那么coreos-assembler将自动执行createrepo_c并且确保它将被用于构建。

未来,coreos-assembler可能也会支持一些overrides/src

5. 使用cosa run --bind-ro更快的迭代

Using cosa run --bind-ro for even faster iteration

$ cosa run --bind-ro ~/src/github/containers/podman,/run/workdir
$ cd ~
$ cosa run \\
      --qemu-image src/fcos/build/latest/x86_64/fedora-coreos-*.x86_64.qcow2 \\
      --bind-ro src/github/containers/podman,/run/workdir

TODO

6. 使用host的二进制

$ make
$ install -D -m 0755 bin/amd64/ignition /path/to/cosadir/overrides/initramfs/usr/bin/ignition
$ cd /path/to/cosadir
$ cosa buildinitramfs-fast
$ cosa run --qemu-image tmp/fastbuild/fastbuildinitrd-fedora-coreos-qemu.qcow2

7. 使用不同的CA证书

如果你需要访问host上的CA证书,例如,当你需要访问不是公共的私有git仓库,你可以使用环境变量COREOS_ASSEMBLER_CONTAINER_RUNTIME_ARGS挂载挂载host证书

注意:共享/etc/pki/ca-trust可能会被SELinux阻塞,所以你可能必须使用一个带有system_u:object_r:container_file_t:s0内容的文件夹。具体请参考SELinux。

$ export COREOS_ASSEMBLER_CONTAINER_RUNTIME_ARGS='-v /etc/pki/ca-trust:/etc/pki/ca-trust:ro'
$ cosa init https://github.com/coreos/fedora-coreos-config.git
$ cosa fetch && cosa build

8. 在谷歌计算平台上基于OpenShift运行CoreOS Assembler

Running CoreOS Assembler in OpenShift on Google Compute Platform

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: cosa
  name: cosa
spec:
  containers:
  - args:
    - shell
    - sleep
    - infinity
    image: quay.io/coreos-assembler/coreos-assembler:latest
    name: cosa
    resources:
      requests:
        # Today COSA hardcodes 2048 for launching VMs.  We could
        # probably shrink that in the future.
        memory: "3Gi"
        devices.kubevirt.io/kvm: "1"
      limits:
        memory: "3Gi"
        devices.kubevirt.io/kvm: "1"
    volumeMounts:
    - mountPath: /srv
      name: workdir
  volumes:
  - name: workdir
    emptyDir: 
  restartPolicy: Never

CoreOS Assembler命令行参考

Coreos Assembler Command Line Reference

下面介绍cosa在CoreOS Assembler容器中的子命令。可以查看--help帮助信息

1. 主要命令

名称描述
build使用已经获取的包构建OSTree和人工镜像
clean删除所有人工构建
fetch取并注入最新的包
init构建当前目录,并下载给定git repo
kola使用kola运行测示例
list列出可用的本地构建
run用Qemu运行一个Core OS实例
shell进入Coreos-Assembler容器shell
virt-install用libvirt安装一个CoreOS

下面的命令仅仅做部分的重建。

  • build-fast:从已经存在的镜像创建一个qcow2镜像,并更新ostree提交。
  • buildinitramfs-fast:从已经存在的构建中创建一个新的qcow2镜像文件,并且更新initramfs。

2. buildextend 命令

coreos-assembler

默认情况,build命令将构建一个OSTree和一个QEMU镜像。下面的命令给出了额外选项。

2.1. buildextend-live 生成Live ISO

cmd-buildextend-live

# 1. 先执行下面命令
$ cosa buildextend-metal4k
# 2. 生成ISO文件
$ cosa buildextend-live --build 35.20211129.1.0.

2.2. buildextend-dasd,metal,metal4k,qemu

2.3. buildextend-aliyun,aws,azure,digitalocean,exoscale,gcp,vultr

2.4. buildextend-azurestack,ibmcloud,openstack,vmware

2.5. aliyun,aws-replicate

附录

1. coraos-assembler的安装

TODO

2. 构建cosa容器

TODO

参考链接


Copyright (C) CESTC Com.

以上是关于CoreOS coreos-assembler文档的主要内容,如果未能解决你的问题,请参考以下文章

构建官方CoreOS COSA 镜像并构建 CoreOS

基于 CentOS-Stream9 构建官方CoreOS COSA 镜像并构建 CoreOS

基于 CentOS-Stream9 构建官方CoreOS COSA 镜像并构建 CoreOS

Fedora CoreOS

aws opswork 是不是支持 CoreOS

CoreOS ignition简介