IT袋

当前位置:主页 > 经验教程 > 系统教程 >

使用mkosi构建RHEL和RHEL

使用mkosi构建RHEL和RHEL UBI镜像(3)

时间:2023-12-13 14:03:42 来源:IT袋 作者:马勇
导读:使用mkosi构建RHEL和RHEL,好的,我们现在有一个镜像,镜像中包含了一些来自 RHEL UBI 软件包的内容。我们如何在其上加点我们自己的东西呢? 使用自己的文件扩展镜像 有几种方法

使用mkosi构建RHEL和RHEL

好的,我们现在有一个镜像,镜像中包含了一些来自 RHEL UBI 软件包的内容。我们如何在其上加点我们自己的东西呢?

使用自己的文件扩展镜像

有几种方法可以扩展镜像,包括从头开始编译某些东西。但在那之前,让我们做一些更简单的事情,将一个现成的文件系统注入到镜像中:

$ mkdir -p mkosi.extra/srv/www/content
$ cat >mkosi.extra/srv/www/content/index.html <<'EOF'
<h1>Hello, World!</h1>
EOF

现在,该镜像将包含/srv/www/content/index.html

这种方法用于注入额外的配置或简单的程序。

从源代码构建

现在让我们过一遍完整流程,从源代码构建一些东西。例如,一个简单的 Meson 项目,有一个单独的 C 文件:

$ cat >hello.c <<'EOF'
#include <stdio.h>
int main(int argc, char **argv) {
    char buf[1024];
    FILE *f = fopen("/srv/www/content/index.html", "re");
    size_t n = fread(buf, 1, sizeof buf, f);
    fwrite(buf, 1, n, stdout);
    fclose(f);
    return 0;
}
EOF
$ cat >meson.build <<'EOF'
project('hello', 'c')
executable('hello', 'hello.c',
            install: true)
EOF
$ cat >mkosi.build <<'EOF'
set -ex
mkosi-as-caller rm -rf "$BUILDDIR/build"
mkosi-as-caller meson setup "$BUILDDIR/build" "$SRCDIR"
mkosi-as-caller meson compile -C "$BUILDDIR/build"
meson install -C "$BUILDDIR/build" --no-rebuild
EOF
$ chmod +x mkosi.build

总结一下:我们有一些源代码(hello.c),一个构建系统配置文件(meson.build),以及一个由 mkosi 调用的胶水脚本(mkosi.build)。对于实际的项目,也会有相同的元素,只是更加复杂。

这个脚本需要一些解释。mkosi 在创建镜像时使用用户命名空间。这允许包管理器(例如dnf)安装由不同用户拥有的文件,即使它是由一个普通非特权用户调用的。我们使用mkosi-as-caller切换回调用者以进行编译。这样,在$BUILDDIR下编译期间创建的文件将由调用者拥有。

现在让我们使用我们的程序构建镜像。与之前的调用相比,我们需要额外的软件包:mesongcc。由于我们现在有了构建脚本,mkosi 将执行两个构建阶段:首先创建一个构建镜像,并在其中调用构建脚本,将安装产物存储在一个临时目录中,然后构建最终镜像,并将安装产物注入其中。(mkosi 设置$DESTDIRmeson install自动使用$DESTDIR,因此并不需要我们明确指定。)

$ mkosi \
    -d rhel-ubi \
    -t disk \
    -p bash,coreutils,util-linux,systemd,rpm \
    --autologin \
    --build-package=meson,gcc \
    --build-dir=mkosi.builddir \
    --build-script=mkosi.build \
    -f

此时,我们有了带有自定义载荷的镜像

相关阅读