CoreOS coreos-assembler文档
Posted rtoax
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CoreOS coreos-assembler文档相关的知识,希望对你有一定的参考价值。
文档修改日志
日期 | 修改内容 | 修改人 | 备注 |
---|---|---|---|
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
分支 | 问题 |
---|---|
stable | linux-firmware-20210919-125.fc35.noarch.rpm |
rhcos-4.6 | NetworkManager-1:1.22.14-1.fc32.x86_64 |
rhcos-4.7 | NetworkManager-1:1.26.4-1.fc33.x86_64 |
rhcos-4.8 | NetworkManager-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包
还是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
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
假如你想修改ostree
和 ignition-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 命令
默认情况,build命令将构建一个OSTree和一个QEMU镜像。下面的命令给出了额外选项。
2.1. buildextend-live 生成Live ISO
# 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
参考链接
以上是关于CoreOS coreos-assembler文档的主要内容,如果未能解决你的问题,请参考以下文章
基于 CentOS-Stream9 构建官方CoreOS COSA 镜像并构建 CoreOS