当前位置: 首页 > 工具软件 > OPNFV > 使用案例 >

opnfv的编译过程&& 404修复 && GPG error修复

廉元龙
2023-12-01

1 从opnfv官网下载fuel.git, 其中Makefile主要工作是执行 docker/runcontext make iso

docker/runcontext是docker目录下的命令shell,主要工作是执行docker build,即基于Dockerfile,使用build命令创建image

执行docker/runcontext后,使用docker images可以查到build出来的影像


2 由于Makefile里要求 make iso, runcontext发现这句话后,就理解为步骤1,然后针对步骤1创建的影像执行make iso。

make iso相当于在image中进行编译。


以上编译过程中make iso和Fuel平常编译方式相同。opnfv和Fuel编译不同的地方在opnfv多出步骤1,即创建了一个image.在image中

做的编译。


这里略微介绍以下docker对image的操作

docker build 创建image

docker images     列出image

docker run  运行image


我在编译过程中经常出错,导致每次都要重新下载进行编译。前文中Fuel的编译就很方便,出现错误,可以make iso继续编译。

这次重新编译的解决方法:

步骤1 在fz上执行 make debug而不是make iso 或make (fz是我的宿主机,不是docker所创建的影像)

这时将进入bash,在bash中编译make iso(此时在docker中执行)

步骤2 在docker中共享了宿主机的目录,我的是/mnt/sdb/fuel/

将runcontext中docker run --rm的地方改为docker run --rm=false 其目的是在docker影像退出时不删除文件系统

步骤3 修改build/Makefile文件中ISOCACHE相关的内容,

其主要内容是先

a clone fuel-main.git (这是fuel编译的导引)

b 更新docker

c fuel预备条件准备

d make repos

以上和普通fuel编译类似

e patching fuel repos

f 执行3编fuel编译(防止wget timeout)

最后生成了Fuel文件。

如上a到d不容易失败,比较容易失败的是f(不然这群家伙为什么要编译3次)

目前我的情况是在f步骤有404,说明mos的文件目录有变动

此时继续编译的方法应该是在命令行下直接执行sudo -E ./fuel_build_loop,并需要改动一些脚本


这次opnfv c版本的过程中出现的错误修改如下,清参考

root@fz:/mnt/sdb/fuel# git diff build/Makefile
diff --git a/build/Makefile b/build/Makefile
index b760568..3ad39ff 100644
--- a/build/Makefile
+++ b/build/Makefile
@@ -60,7 +60,7 @@ export LATEST_MIRROR_ID_URL := http://$(shell ./select_closest
 export MIRROR_MOS_UBUNTU ?= $(shell echo "$(LATEST_MIRROR_ID_URL)" | cut -d'/' 
 #export LATEST_TARGET_UBUNTU := $(shell curl -sSf "$(MIRROR_MOS_UBUNTU)/mos-rep
 # Fuel 9.0
-export LATEST_TARGET_UBUNTU := snapshots/9.0-2016-06-23-164100-copy
+export LATEST_TARGET_UBUNTU := snapshots/9.0-2016-06-23-164100
 export MIRROR_MOS_UBUNTU_ROOT := /mos-repos/ubuntu/$(LATEST_TARGET_UBUNTU)
 
 export LATEST_TARGET_CENTOS := $(shell curl -sSf "$(LATEST_MIRROR_ID_URL)/mos-r
@@ -97,8 +97,8 @@ all:
        @KERNEL_VER=$$(uname -r); \
        KERNEL_ARRAY=($${KERNEL_VER//./ }); \
        if [ $${KERNEL_ARRAY[0]} -lt 3  ] || [[ $${KERNEL_ARRAY[0]} -eq 3 && $${
-       @docker/runcontext $(DOCKERIMG) wget -q www.google.com -O /dev/null || (
-       @docker/runcontext $(DOCKERIMG) $(MAKE) $(MAKEFLAGS) iso
+       @docker/runcontext $(DOCKERIMG) wget -q www.baidu.com -O /dev/null || (e
+       @docker/runcontext $(DOCKERIMG) $(MAKE) $(MAKEFLAGS) iso 
 
 
 ############################################################################
root@fz:/mnt/sdb/fuel# 


2

Hit http://archive.ubuntu.com trusty/restricted Translation-en
Fetched 14.2 MB in 2min 49s (83.9 kB/s)
W: GPG error: http://mirror.seed-us1.fuel-infra.org mos9.0 Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY BCE5CC461FA22B08
W: GPG error: http://mirror.seed-us1.fuel-infra.org mos9.0-security Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY BCE5CC461FA22B08
W: GPG error: http://mirror.seed-us1.fuel-infra.org mos9.0-updates Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY BCE5CC461FA22B08
W: GPG error: http://mirror.seed-us1.fuel-infra.org mos9.0-holdback Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY BCE5CC461FA22B08
W: Failed to fetch bzip2:/var/lib/apt/lists/partial/archive.ubuntu.com_ubuntu_dists_trusty-security_main_binary-amd64_Packages  Hash Sum mismatch

问题原因分析:

docker内chroot目录下的trusted.gpg( chroot/etc/apt/trusted.gpg)中没有找到对应public key

导致reprepro的时候检查本地镜像失败。

解决方法:

在docker内输入

gpg --keyserver keyserver.ubuntu.com --primary-keyring build/packages/deb/chroot/etc/apt/trusted.gpg --recv-keys BCE5CC461FA22B08

这里只列出了最关键参数primary-keyring, 其他keyserver等就比较容易找。

原因说明:

在docker里/mnt/sdb/fuel/build 执行make iso之后,会调用到fuel_build_loop

单独调用fuel_build_loop后,其会调用/tmp/fuel-main/目录下的make iso

而fuel-main即fuel的主编译程序。这里的opnfv编译方法与fuel mirantis的编译略微不同。

后者使用docker编译,前者因为已经在sdb/fuel中使用docker,这里就改用chroot

因而这里容易产生迷惑。这两种方式最后都会使用独立的文件系统进行影像构造(ubuntu, centos)

上面出现的GPG error,就是在构造ubuntu镜像时出现的错误(来自debmirror, reprepro的构造)

其中debmirror 用于产生一个本地影像,位置在LOCAL_MIRROR_UBUNTU (see /build/mirror/ubuntu/module.mk)

reprepro用于产生,管理和同步本地debian库,其指令是includedeb, 目的是包括pool目录所指定的deb文件

从GPG error出发,可以得知其是ubuntu影像(而非docker上的ubuntu)在构建过程中未加入public key导致.所以此处

作gpg --primary-keyring的时候,需要明确指定primary-keyring的位置,不是docker上的ubuntu,即不是/etc/apt/,而是

/chroot/etc/apt/



ref:

1 https://help.ubuntu.com/community/Repositories/Ubuntu#Authentication%20Tab

2 https://help.ubuntu.com/community/GnuPrivacyGuardHowto

3 https://www.mankier.com/1/gpg



 类似资料: