podman 源码 5.3.1编译

1. 构建环境

在麒麟V10服务器操作系统上构建:Kylin-Server-V10-GFB-Release-2204-Build03-ARM64.iso。

由于只是编译 podman 源码,没必要特地在物理机或服务上安装一个这样的操作系统,故采用在虚拟机里验证。

2. 安装依赖

参考资料: (https://podman.io/docs/installation#building-missing-dependencies) podman安装

2.1 安装基础包

yum install python3-pip pkg-config ninja-build cmake
pip3 install meson  -i https://pypi.tuna.tsinghua.edu.cn/simple

2.2. 安装高版本的 go

      系统自带的 go 版本不满足编译要求,需要安装高版本的go
   wget https://go.dev/dl/go1.23.3.linux-arm64.tar.gz
   tar -zxvf go1.23.3.linux-arm64.tar.gz -C /opt/
   echo "export PATH=$PATH:/opt/go/bin" >> ~/.bashrc
   source ~/.bashrc
 卸载系统自带的低版本的go, yum remove go -y
 安装git ,   yum install git -y

2.3. 安装conmon

    git clone https://github.com/containers/conmon
	cd conmon
	export GOCACHE="$(mktemp -d)"
	make
	sudo make podman

2.4. 安装runc

    git clone https://github.com/opencontainers/runc.git 
	cd runc
	make BUILDTAGS="selinux seccomp" #报错,解决方法在错误1
	sudo cp runc /usr/bin/runc

2.5. 安装slirp4netns

   wget https://github.com/rootless-containers/slirp4netns/archive/refs/tags/v1.3.1.zip
   unzip  v1.3.1.zip
   cd  slirp4netns-1.3.1
   ./autogen.sh
   ./configure     # 报错,解决方法在错误2
   make 
   make install

2.6. 安装netavark

   netavark 依赖 rust, protoc, go
	wget  https://github.com/containers/netavark/archive/refs/tags/v1.13.0.zip
	unzip v1.13.0.zip
	cd netavark-1.13.0  
	make              # 报错,解决方法在错误3
	make install

3. 编译安装podman

从git下载源代码:

wget  https://github.com/containers/podman/archive/refs/tags/v5.3.1.zip
unzip v5.3.1.zip
cd podman-5.3.1
make BUILDTAGS="selinux seccomp" PREFIX=/usr
make install PREFIX=/usr

4. 添加配置

sudo mkdir -p /etc/containers
sudo curl -L -o /etc/containers/registries.conf https://raw.githubusercontent.com/containers/image/main/registries.conf
sudo curl -L -o /etc/containers/policy.json https://raw.githubusercontent.com/containers/image/main/default-policy.json

参考 https://podman.io/docs/installation#building-missing-dependencies 中 Configuration files章节:

4.1 修改配置 registries.conf

添加:

unqualified-search-registries = ["docker.io"]
[[registry]]
location="localhost:5000"    # 自己私有镜像仓库地址或国内镜像仓库地址
insecure=true   

4.2 修改policy.json

添加:

{
    "default": [
        {
            "type": "insecureAcceptAnything"
        }
    ],
    "transports":
        {
            "docker-daemon":
                {
                    "": [{"type":"insecureAcceptAnything"}]
                }
        }
}

4.3 修改网络配置

参考 设置网络模式
为了在启动容器时保证使用的是slirp4netns网络模式,添加配置文件:

mkdir -p /etc/containers/containers.conf

添加:

[network]
default_rootless_network_cmd = "slirp4netns"

5. 验证

podman 基本命令执行正常

podman version
Client:       Podman Engine
Version:      5.3.1
API Version:  5.3.1
Go Version:   go1.23.3
Built:        Sun Nov 24 20:13:35 2024
OS/Arch:      linux/arm64
[root@localhost ~]# podman images
REPOSITORY                      TAG         IMAGE ID      CREATED       SIZE
[root@localhost ~]# podman ps 
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

[root@localhost ~]# podman info
.....

设置环境变量消除警告:

echo "export PODMAN_IGNORE_CGROUPSV1_WARNING=1" >> ~/.bashrc
source ~/.bashrc

新建一个Dockerfile文件:

FROM centos:7

RUN <<EOF
#!/bin/bash -ex

yum makecache
yum install -y wget curl tar tree vim git python3-pip ninja-build gcc gcc-c++ 
yum clean all
EOF

WORKDIR /root
CMD ["/bin/bash"]

执行 podman build -t test . 新建一个镜像报错

STEP 4/6: RUN <<EOF (#!/bin/bash -ex...)
error running container: from /usr/bin/runc creating container for [/bin/sh -c /bin/bash -ex /dev/pipes/buildahheredoc3982280730]: time="2024-11-26T14:59:37+08:00" level=error msg="runc create failed: invalid mount &{Source:/var/tmp/buildah2198621294/mnt/buildah-bind-target-10 Destination:/dev/pipes/buildahheredoc3982280730 Device:bind Flags:20480 ClearedFlags:1 PropagationFlags:[278528] Data:z,Z Relabel: RecAttr:<nil> Extensions:0 IDMapping:<nil>}: bind mounts cannot have any filesystem-specific options applied"
: exit status 1ERRO[0015] did not get container create message from subprocess: EOF 
Error: building at STEP "RUN <<EOF": while running runtime: exit status 1

在这里插入图片描述
从报错看是容器运行时 runc 执行出了问题,查看 https://podman.io/docs/installation#building-missing-dependencies 的 Install runtime dependencies , 让安装的 容器运行时是 crun,但后面的连接又是安装 runc,podman info 看到的 ociRuntime 是 runc, 这里不纠结了,直接从 git 下载crun 源码编译安装:

git clone https://github.com/containers/crun.git 
cd crun
./autogen.sh 
./configure --prefix=/usr/   # 这里报错,需要安装yajl-devel, systemd-devel
make -j4 && make install 

再次执行 podman build -t test . 成功, 这里没去深究了,猜测是 runc不支持 EOF语法

新建镜像和容器:

[root@localhost crun]# podman images
REPOSITORY                      TAG         IMAGE ID      CREATED        SIZE
localhost/test                  latest      ef1c61187ffc  7 minutes ago  1.1 GB
[root@localhost crun]# podman ps 
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
[root@localhost crun]# podman ps -a
CONTAINER ID  IMAGE                  COMMAND     CREATED         STATUS                       PORTS       NAMES
83c018b47440  localhost/test:latest  /bin/bash   22 seconds ago  Exited (127) 10 seconds ago              test

至此完成 !!!

6. buildah 工具

参考 buildah工具
Buildah 是一个用于构建 OCI 和 Docker 容器镜像的工具,旨在提供一种灵活且高效的方式来创建和管理容器镜像, 不依赖于守护进程。
Buildah run 相当执行containerfile文件中的 RUN,是更底层的。
从git 源码下载:

git clone https://github.com/containers/buildah.git
cd buildah
make && make install

错误

错误1:

编译runc报错:
在这里插入图片描述
找不到libseccomp.pc
安装 libseccomp-devel, yum install -y libseccomp-devel

错误2:

编译slirp4netns报错: 缺少slirp
在这里插入图片描述
依赖slirp,但是官方源上没有,自己从git下载编译

git clone -b v4.8.0 https://gitlab.freedesktop.org/slirp/libslirp.git
meson setup build -Dprefix=/usr/
meson compile -C build
meson install -C build

缺少:libcap
在这里插入图片描述
安装libcap-devel, yum install -y libcap-devel

错误3:

编译netavark报错,报当前系统自带的 cargo 1.29.0 版本不支持edition特性,版本太低导致
在这里插入图片描述
由于cargo 是同 rust一起安装的,rustc --version 是1.29.1

安装 rust有两种方式:
1. 在线安装:
使用中科大源:

echo "export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static" >> ~/.bashrc
echo "export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup" >> ~/.bashrc
source .bashrc
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source  $HOME/.cargo/env

查看cargo 版本和安装位置

which cargo
/root/.cargo/bin/cargo

cargo --version
cargo 1.82.0 (8f40fc59f 2024-08-21)

2. 从git 上拉取rust源代码,自己编译高版本的rust
参考 rust源码编译安装

git clone https://github.com/rust-lang/rust.git
cd rust
git checkout 1.82.0
python x.py build   #这里经常会失败,可以手动先下载包
python x.py install

可以在科学上网的情况下先手动下载包:
wget https://static.rust-lang.org/dist/2024-09-05/rust-std-1.81.0-aarch64-unknown-linux-gnu.tar.xz
wget https://static.rust-lang.org/dist/2024-09-05/rustc-1.81.0-aarch64-unknown-linux-gnu.tar.xz  
wget https://static.rust-lang.org/dist/2024-09-05/rust-std-1.81.0-aarch64-unknown-linux-gnu.tar.xz
放到: rust-1.82.0/build/cache/2024-09-05/

如果是下载的v1.82.0.zip解压编译,不是zip包解压的可以忽略,编译会报错,另外zip包缺少.git文件夹,导致 无法下载子模块:
在这里插入图片描述

thread 'main' panicked at src/core/config/config.rs:2803:10:
called `Result::unwrap()` on an `Err` value: "command did not execute successfully: cd \"/root/xqs/rust-1.82.0\" && env -u GIT_ALTERNATE_OBJECT_DIRECTORIES -u GIT_DIR -u GIT_INDEX_FILE -u GIT_OBJECT_DIRECTORY -u GIT_WORK_TREE \"git\" \"rev-list\" \"--author=bors@rust-lang.org\" \"-n1\" \"--first-parent\" \"HEAD\"\nexpected success, got: exit status: 128\n"
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Build completed unsuccessfully in 0:09:25

更换国内源, 新建/root/.cargo.config,添加如下内容

[source.crates-io]
replace-with = 'ustc'
[source.ustc]
registry = "https://mirrors.ustc.edu.cn/crates.io-index"

再次python x.py build

git clone 的直接看这后面
报错:

CMake Error at CMakeLists.txt:3 (cmake_minimum_required):
  CMake 3.20.0 or higher is required.  You are running version 3.12.1

需要安装更高版本的CMake

从git 上下载源码编译安装:
先安装依赖 openssl-devel, yum install -y openssl-devel

wget https://github.com/Kitware/CMake/archive/refs/tags/v3.31.1.zip
unzip v3.31.1.zip
cd CMake-3.31.1
./configure --prefix=/usr/
make && make install

继续报错,gcc 版本太低,需要自己编译安装高版本的gcc, 网上资料很多,这里不在说明。

CMake Error at cmake/modules/CheckCompilerVersion.cmake:37 (message):
  Host GCC version must be at least 7.4, your version is 7.3.0.
Call Stack (most recent call first):
  cmake/modules/CheckCompilerVersion.cmake:47 (check_compiler_version)
  cmake/config-ix.cmake:16 (include)
  CMakeLists.txt:949 (include)

protoc 编译安装

系统自带的protoc 版本为 3.9.0,如果系统不自带也需要自己安装, 针对比 2204 更高的版本

protoc --version
libprotoc 3.9.0

可以下载高版本的protoc 安装

wget https://github.com/protocolbuffers/protobuf/releases/download/v28.3/protoc-28.3-linux-aarch_64.zip
unzip protoc-28.3-linux-aarch_64.zip 
cp -af ./bin/protoc /usr/bin/ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/923897.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【K8S系列】深入解析 Kubernetes 中的 Deployment

Kubernetes&#xff08;K8s&#xff09;是一个开源的容器编排平台&#xff0c;旨在自动化应用程序的部署、扩展和管理。在 Kubernetes 中&#xff0c;Deployment 是一种用于管理无状态应用的工作负载资源&#xff0c;提供了丰富的功能&#xff0c;包括版本控制、滚动更新和回滚…

玩转 Burp Suite (1)

内容预览 ≧∀≦ゞ 玩转 Burp Suite (1)声明Burp Suite 简介Dashboard&#xff08;仪表盘&#xff09;1. 默认任务管理2. 暂停任务3. 新建扫描任务4. 使用总结 Target&#xff08;目标&#xff09;1. SIte Map &#xff08;站点地图&#xff09;2. Scope&#xff08;范围&#…

【ArcGISPro】Sentinel-2数据处理

错误 默认拉进去只组织了4个波段,但是实际有12个波段 解决方案 数据下载 Sentinel-2 数据下载-CSDN博客 数据处理 数据查看 创建镶嵌数据集 在数据管理工具箱中找到创建镶嵌数据集

智慧环保大数据解决方案

1. 智慧环保概述 智慧环保是“数字环保”的延伸&#xff0c;借助物联网技术整合环境监控对象&#xff0c;通过云计算实现环境管理与决策的智能化。其核心在于快速感知城市环境指标&#xff0c;保障人体健康与生命安全。 2. 智慧环保总体目标 智慧环保的总体目标是建立全面感…

【H2O2|全栈】JS进阶知识(八)ES6(4)

目录 前言 开篇语 准备工作 浅拷贝和深拷贝 浅拷贝 概念 常见方法 弊端 案例 深拷贝 概念 常见方法 弊端 逐层拷贝 原型 构造函数 概念 形式 成员 弊端 显式原型和隐式原型 概念 形式 constructor 概念 形式 原型链 概念 形式 结束语 前言 开篇语…

03-微服务搭建

1、搭建分布式基本环境 分布式组件 功能 SpringCloud Alibaba - Nacos 注册中心&#xff08;服务发现/注册&#xff09;、配置中心&#xff08;动态配置管理&#xff09; SpringCloud Alibaba - Sentinel 服务容错&#xff08;限流、降级、熔断&#xff09; SpringCloud …

Vue前端开发2.3.2-4 绑定指令

本文介绍了Vue中的绑定指令&#xff0c;包括属性绑定指令v-bind、事件绑定指令v-on以及双向数据绑定指令v-model。通过创建单文件组件&#xff0c;演示了如何使用这些指令来控制DOM属性、监听事件和实现表单输入与数据的双向同步。同时&#xff0c;探讨了v-model的修饰符如.num…

uniapp开发支付宝小程序自定义tabbar样式异常

解决方案&#xff1a; 这个问题应该是支付宝基础库的问题&#xff0c;除了依赖于官方更新之外&#xff0c;开发者可以利用《自定义 tabBar》曲线救国 也就是创建一个空内容的自定义tabBar&#xff0c;这样即使 tabBar 被渲染出来&#xff0c;但从视觉上也不会有问题 1.官方文…

双向链表、循环链表、栈

双向循环链表 class Node:#显性定义出构造函数def __init__(self,data):self.data data #普通节点的数据域self.next None #保存下一个节点的链接域self.prior None #保存前一个节点饿链接域 class DoubleLinkLoop:def __init__(self, node Node):self.head nodeself.siz…

【大数据学习 | Spark-Core】RDD的缓存(cache and checkpoint)

1. 单应用缓存&#xff1a;cache 1.1 cache算子 cache算子能够缓存中间结果数据到各个executor中&#xff0c;后续的任务如果需要这部分数据就可以直接使用避免大量的重复执行和运算。 rdd 存储级别中默认使用的算子cache算子&#xff0c;cache算子的底层调用的是persist算子…

上海乐鑫科技一级代理商飞睿科技,ESP32-C61高性价比WiFi6芯片高性能、大容量

在当今快速发展的物联网市场中&#xff0c;无线连接技术的不断进步对智能设备的性能和能效提出了更高要求。为了满足这一需求&#xff0c;乐鑫科技推出了ESP32-C61——一款高性价比的Wi-Fi 6芯片&#xff0c;旨在为用户设备提供更出色的物联网性能&#xff0c;并满足智能设备连…

如何选择黑白相机和彩色相机

我们在选择成像解决方案时黑白相机很容易被忽略&#xff0c;因为许多新相机提供鲜艳的颜色&#xff0c;鲜明的对比度和改进的弱光性能。然而&#xff0c;有许多应用&#xff0c;选择黑白相机将是更好的选择&#xff0c;因为他们产生更清晰的图像&#xff0c;更好的分辨率&#…

ubuntu22开机自动登陆和开机自动运行google浏览器自动打开网页

一、开机自动登陆 1、打开settings->点击Users 重启系统即可自动登陆桌面 二、开机自动运行google浏览器自动打开网页 1、安装google浏览器 sudo wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg -i ./google-chrome-stable…

MVC、EL、JSTL

1.MVC设计模式 三层&#xff1a; MVC&#xff1a; M&#xff08;Model&#xff09;模型&#xff1a;负责业务逻辑处理&#xff0c;数据库访问。 V&#xff08;View&#xff09;视图&#xff1a;负责与用户交互。 C&#xff08;Controller&#xff09;控制器&#xff1a;负责流程…

Python的3D可视化库 - vedo (3)visual子模块 点对象的可视化控制

文章目录 3 PointsVisual的方法3.1 对象属性3.1.1 顶点大小3.1.2 复制属性3.1.3 颜色设置3.1.4透明度设置 3.2 对象光效3.2.1 点的形状3.2.2 点的表面光效 3.3 尾随线和投影3.3.1 尾随线3.3.2 投影 3.4 给对象附加文字说明3.4.1 标注3.4.2 2D标注3.4.3 气泡说明3.4.4 旗标说明3…

MySQL系列之远程管理(安全)

导览 前言Q&#xff1a;如何保障远程登录安全一、远程登录的主要方式1. 用户名/口令2. SSH3. SSL/TLS 二、使用TLS协议加密连接1. 服务端2. 客户端 结语精彩回放 前言 在我们的学习或工作过程中&#xff0c;作为开发、测试或运维人员&#xff0c;经常会通过各类客户端软件&…

交通路口智能监测平台实现

目录 本文所有资源均可在该(https://www.aspiringcode.com/content?id17218996189491&uid3e852f876bcd45a4b3e8cf241260451b)处获取。 1.概述 交通要道的路口上人车穿行&#xff0c;特别是上下班早高峰&#xff0c;且时常发生交通事故。因此对交通路口的车流量和人流量的…

Qt Graphics View 绘图架构

Qt Graphics View 绘图架构 "QWGraphicsView.h" 头文件代码如下&#xff1a; #pragma once#include <QGraphicsView>class QWGraphicsView : public QGraphicsView {Q_OBJECTpublic:QWGraphicsView(QWidget *parent);~QWGraphicsView();protected:void mouseM…

获 2023 年度浙江省科学技术进步奖一等奖 | 网易数智日报

11 月 22 日&#xff0c;加快建设创新浙江因地制宜发展新质生产力动员部署会暨全省科学技术奖励大会在杭州隆重召开。浙江大学、网易数智等单位联合研发的“大规模结构化数据智能计算平台及产业化”项目获得 2023 年度浙江省科学技术进步奖一等奖。 加快建设创新浙江因地制宜发…

C++笔记之构造函数声明只需要写明需要的参数,不需要列出所有成员变量、可以使用成员初始化列表初始化所有需要的成员变量

C++笔记之构造函数声明只需要写明需要的参数,不需要列出所有成员变量、可以使用成员初始化列表初始化所有需要的成员变量 参考笔记 C++新特性探究(七):初始化列表(Initialization List) C++之关于初始化列表(Initialization List)的一个补充示例 C++笔记之构造函数声明只需要…