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,所以再安装一次git安装git ,   yum install -y git

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.zipunzip  v1.3.1.zipcd  slirp4netns-1.3.1./autogen.sh./configure     # 报错,解决方法在错误2make 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:7RUN <<EOF
#!/bin/bash -exyum makecache
yum install -y wget curl tar tree vim git python3-pip ninja-build gcc gcc-c++ 
yum clean all
EOFWORKDIR /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.0

安装 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/cargocargo --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文件夹,导致 无法下载子模块,我的解决办法是把git上这个项目的.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/ 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git的使用(简洁版)

什么是 Git&#xff1f; Git 是一个分布式版本控制系统 (DVCS)&#xff0c;用于跟踪文件的更改并协调多人之间的工作。它由 Linus Torvalds 在 2005 年创建&#xff0c;最初是为了管理 Linux 内核的开发。Git 的主要目标是提供高效、易用的版本控制工具&#xff0c;使得开发者…

Vue构建错误解决:(error TS6133)xxx is declared but its value is never read.

TypeScript会检查代码中未使用的变量&#xff0c;如果vscode安装了Vue的语法检查工具&#xff0c;会看到告警提示&#xff0c;再npm run build的时候&#xff0c;这个警告会变成错误 解决方案1&#xff1a;删除定义了未使用的变量 推荐使用这种方案&#xff0c;能保证代码的质…

Perplexica - AI 驱动的搜索引擎

更多AI开源软件&#xff1a; AI开源 - 小众AIhttps://www.aiinn.cn/sources Perplexica 是一个开源的 AI 驱动的搜索工具或 AI 驱动的搜索引擎&#xff0c;可以深入互联网寻找答案。受 Perplexity AI 的启发&#xff0c;它是一个开源选项&#xff0c;不仅可以搜索网络&#xf…

企业后端多租户管理平台

1 简介 此系统在企业后端管理系统上进行的更改&#xff0c;用于快速开发租户管理平台。项目中详细的功能请查看文章&#xff1a;企业后端系统通用模版_后端模板-CSDN博客 支持多租户&#xff0c;支持多租户切换&#xff0c;支持多租户数据隔离&#xff0c;支持多租户数据同步等…

微信小程序蓝牙writeBLECharacteristicValue写入数据返回成功后,实际硬件内信息查询未存储?

问题&#xff1a;连接蓝牙后&#xff0c;调用小程序writeBLECharacteristicValue&#xff0c;返回传输数据成功&#xff0c;查询硬件响应发现没有存储进去&#xff1f; 解决&#xff1a;一直以为是这个write方法的问题&#xff0c;找了很多相关贴&#xff0c;后续进行硬件日志…

Zero to JupyterHub with Kubernetes中篇 - Kubernetes 常规使用记录

前言&#xff1a;纯个人记录使用。 搭建 Zero to JupyterHub with Kubernetes 上篇 - Kubernetes 离线二进制部署。搭建 Zero to JupyterHub with Kubernetes 中篇 - Kubernetes 常规使用记录。搭建 Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s。 参考&…

电脑无互联网连接怎么解决?分享5种解决方案

无互联网连接是指设备无法与互联网进行通信或连接失败。这可能会导致我们无法正常上网&#xff0c;给我们的日常生活和工作带来很大的不便。但请不要担心&#xff0c;下面将为您介绍一些解决无互联网连接问题的方法。 一、检查网络是否正常连接 首先&#xff0c;确保您的路由器…

Web前端学习_CSS盒子模型

content padding border margin <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>CSS盒子模型</title><style></style> </head> <body> <div class"demo&quo…

HTML CSS JS基础考试题与答案

一、选择题&#xff08;2分/题&#xff09; 1&#xff0e;下面标签中&#xff0c;用来显示段落的标签是&#xff08; d &#xff09;。 A、<h1> B、<br /> C、<img /> D、<p> 2. 网页中的图片文件位于html文件的下一级文件夹img中&#xff0c;…

华为开源操作系统openEuler安装部署

本文主要描述华为开源操作系统openEuler的安装部署。openEuler是面向数字基础设施的开源操作系统&#xff0c;是由开放原子开源基金会&#xff08;OpenAtom Foundation&#xff09;孵化及运营的开源项目&#xff0c;其愿景是为世界提供数字基础设施的开源操作系统&#xff0c;其…

分布式搜索引擎之elasticsearch单机部署与测试

分布式搜索引擎之elasticsearch单机部署与测试 1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的…

渣土车治理新方案:智能化引领安全与环保新时代

一、渣土车问题现状 1. 盲区众多隐患大&#xff0c;事故频发令人忧。 渣土车盲区多&#xff0c;易引发交通事故&#xff0c;给行人和其他车辆带来严重安全威胁。由于渣土车体积庞大&#xff0c;实际的视觉盲区范围包括半盲区为左车门 1.2 米、右前方 1.5 米、正前方 1.2 米&am…

Vue3+node.js实现登录

文章目录 前端代码实现后端代码实现跨域处理 前端代码实现 效果图 前端代码实现 <template><div class"login-container"><el-card class"login-card"><template #header><div class"card-header"><span>…

jenkins 2.346.1最后一个支持java8的版本搭建

1.jenkins下载 下载地址&#xff1a;Index of /war-stable/2.346.1 2.部署 创建目标文件夹&#xff0c;移动到指定位置 创建一个启动脚本&#xff0c;deploy.sh #!/bin/bash set -eDATE$(date %Y%m%d%H%M) # 基础路径 BASE_PATH/opt/projects/jenkins # 服务名称。同时约定部…

Windows10+VirtualBox+Ubuntu:安装虚拟机VirtualBox,虚拟机中安装Ubuntu

一、需求 在Windows10系统中&#xff0c;安装虚拟机VirtualBox&#xff0c;VirtualBox中安装Ubuntu桌面版。 二、环境准备 系统环境 Windows10 内存&#xff1a;8G 虚拟化 虚拟机的运行&#xff0c;如果需要Windows系统开启虚拟化&#xff0c;可以通过BIOS设置。 “虚拟…

pcb元器件选型与焊接测试时的一些个人经验

元件选型 在嘉立创生成bom表&#xff0c;对照bom表买 1、买电容时有50V或者100V是它的耐压值&#xff0c;注意耐压值 2、在买1117等降压芯片时注意它降压后的固定输出&#xff0c;有那种可调降压比如如下&#xff0c;别买错了 贴片元件焊接 我建议先薄薄的在引脚上涂上锡膏…

【漏洞复现】|百易云资产管理运营系统/mobilefront/c/2.php前台文件上传

漏洞描述 湖南众合百易信息技术有限公司&#xff08;简称&#xff1a;百易云&#xff09;成立于2017年是一家专注于不动产领域数字化研发及服务的国家高新技术企业&#xff0c;公司拥有不动产领域的数字化全面解决方案、覆盖住宅、写字楼、商业中心、专业市场、产业园区、公建、…

重学 Android 自定义 View 系列(八):星星评分控件(RatingBar)

前言 本节实现一个常见的星星评分控件&#xff0c;广泛应用于各种评价类应用中&#xff0c;比如电影评分、商品评价等。难度不大&#xff0c;直接开搂&#xff01; 最终效果如下&#xff1a; 1. 效果分析 显示若干颗星星&#xff08;默认为5颗&#xff0c;可根据属性配置&a…

【力扣热题100】—— Day3.相交链表

被你改变的那部分我&#xff0c;代替你&#xff0c;永远与我站在一起 —— 24.11.28 160. 相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 …

SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD

目录 一、OFD 简介1.1 什么是 OFD&#xff1f;1.2 什么是 版式文档&#xff1f;1.3 为什么要用 OFD 而不是PDF&#xff1f; 二、ofdrw 简介2.1 定义2.2 Maven 依赖2.3 ofdrw 的 13 个模块 三、PDF/文本/图片 转 OFD&#xff08;ofdrw-conterver&#xff09;3.1 介绍&#xff1a…