如何在华为云欧拉系统 ECS 实例新建私有 REPO 源并制作安全 RPM 包

对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》

写在前面


对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》


在某些情况下,我们可能需要在华为云欧拉系统ECS实例上新建私有REPO源:

通过创建私有REPO源,您可以在本地维护和管理自己的软件包,而无需依赖公共的软件源。这对于需要在内部网络环境中部署应用程序或提供特定软件包的组织非常有用。私有REPO源还可以提供更好的访问速度和安全性。

同时可以控制软件包的分发方式。您可以选择将软件包限制为特定的用户或组织,并根据需要进行访问控制。这样可以确保只有授权的人员可以访问和使用您的软件包。

通过在华为云欧拉系统ECS实例上新建私有REPO源并制作安全的RPM包,您可以更好地管理和控制软件包的分发过程,并确保软件包的安全性和完整性。

今天和小伙伴们分享如何在华为云欧拉系统ECS 新建私有 REPO 源 并制作安全 RPM 包

安装 rpm-build

rpm-build 是一个用于构建 RPM 软件包的工具集合。RPM(Red Hat Package Manager)是一种在 Linux 发行版中使用的软件包管理系统,如Red Hat Enterprise Linux(RHEL),CentOS和Fedora。它允许您创建、安装、升级和管理系统上的软件包。

rpm-build 软件包提供了从源代码构建RPM软件包所需的工具和实用程序,其中包括规范文件(spec file)。规范文件包含有关软件包的信息以及构建和安装软件包的指令。

以下是rpm-build软件包提供的一些关键组件和实用程序:

rpmbuild:这是主要的命令行工具,用于构建RPM软件包。它接受一个规范文件作为输入,并执行构建软件包的必要步骤,包括编译源代码、创建软件包结构和生成RPM软件包文件。

rpmspec:此实用程序用于验证和解析规范文件。可以使用它在构建软件包之前检查规范文件的语法和正确性。

rpmdevtools:这是一组工具,简化了构建RPM软件包的过程。它提供了诸如

  • rpmdev-setuptree(设置构建软件包的目录结构)
  • rpmdev-newspec(生成规范文件模板)
  • rpmdev-bumpspec(更新规范文件的版本信息)等实用程序。

rpm-build-libs:此软件包包含构建RPM软件包所需的库和头文件。它为具有对 RPM 库的依赖关系的软件包提供必要的开发文件。

1
2
3
4
5
6
7
[root@ecs-hce ~]# yum -y  install rpm-build >> /dev/null 
retrieving repo key for base unencrypted from http://repo.huaweicloud.com/hce/2.0/os/RPM-GPG-KEY-HCE-2
Importing GPG key 0xA8DEF926:
Userid : "HCE <support@huaweicloud.com>"
Fingerprint: C1BA 9CD4 9D03 A206 E241 F176 28DA 5B77 A8DE F926
From : http://repo.huaweicloud.com/hce/2.0/os/RPM-GPG-KEY-HCE-2
[root@ecs-hce ~]# yum -y install rpm-devel rpmdevtools >> /dev/null

生成 rpm 开发目录

rpmdev-setuptreerpmdevtools 软件包中的一个实用程序,用于设置 RPM 软件包构建的目录结构。它创建了一个标准的 RPM 构建环境,包括各种必要的目录和文件。

1
2
3
[root@ecs-hce ~]# rpmdev-setuptree 
[root@ecs-hce ~]# ls
rpmbuild

使用 rpmdev-setuptree 命令可以在当前用户的主目录下创建以下目录:

  • ~/rpmbuild/SOURCES:用于存放源代码文件、补丁文件和其他构建所需的资源文件。
  • ~/rpmbuild/SPECS:用于存放RPM软件包的规范文件(spec file)。
  • ~/rpmbuild/BUILD:用于构建RPM软件包时的临时构建目录。
  • ~/rpmbuild/RPMS:用于存放构建完成的RPM软件包文件。
  • ~/rpmbuild/SRPMS:用于存放构建完成的源码RPM软件包文件。

创建源码路径,创建源码文件并修改权限,源码文件中写入代码

1
2
3
4
5
6
7
8
[root@ecs-hce ~]# cd /root/rpmbuild/SOURCES/
[root@ecs-hce SOURCES]# mkdir hce2-helloworld-1.0.0
[root@ecs-hce SOURCES]# touch hce2-helloworld-1.0.0/hce2-helloworld
[root@ecs-hce SOURCES]# chmod 755 hce2-helloworld-1.0.0/hce2-helloworld
[root@ecs-hce SOURCES]# vim hce2-helloworld-1.0.0/hce2-helloworld
[root@ecs-hce SOURCES]# cat hce2-helloworld-1.0.0/hce2-helloworld
!/bin/sh
echo Hello World!

压缩源码

1
2
3
[root@ecs-hce SOURCES]# tar zcvf hce2-helloworld-1.0.0.tar.gz hce2-helloworld-1.0.0/
hce2-helloworld-1.0.0/
hce2-helloworld-1.0.0/hce2-helloworld

生成规范文件位置

进入/root/rpmbuild/SPECS 路径生成.spec文件,需要输入y 确认

rpmdev-newspec 是 rpmdevtools 软件包中的一个实用程序,用于生成一个新的RPM 软件包规范文件(spec file)的模板。规范文件是描述 RPM 软件包的元数据和构建指令的文本文件。

1
2
3
4
5
6
[root@ecs-hce SOURCES]# cd /root/rpmbuild/SPECS/
[root@ecs-hce SPECS]# yum install -y git >> /dev/nul
[root@ecs-hce SPECS]# rpmdev-newspec hce2-helloworld.spec
hce2-helloworld.spec created; type minimal, rpm version >= 4.17.
[root@ecs-hce SPECS]# ls
hce2-helloworld.spec

使用 rpmdev-newspec 命令可以方便地生成一个空白的规范文件模板,可以在此基础上填充具体的软件包信息和构建指令。

[root@ecs-hce SPECS]# vim hce2-helloworld.spec
[root@ecs-hce SPECS]# cp hce2-helloworld.spec hce2-helloworld.spec.back
[root@ecs-hce SPECS]# !vi
vim hce2-helloworld.spec

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
编写软件包信息和构建指令


```bash
Name: hce2-helloworld
Version: 1.0.0
Release: 1%{?dist}
Summary: hce2-helloworld

Group: Development/Tools
License: GPL
#URL:
Source0: %{name}-%{version}.tar.gz

#BuildRequires:
#Requires:

%description

%prep
%setup -q

%build

%install
mkdir -p $RPM_BUILD_ROOT/usr/bin
cp $RPM_BUILD_DIR/%{name}-%{version}/hce2-helloworld $RPM_BUILD_ROOT/usr/bin/

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root,-)
%doc
/usr/bin/hce2-helloworld

%changelog

执行编译命令,生成 rpm

rpmbuild 是一个用于构建 RPM 软件包的命令行工具。它接受一个 RPM 软件包规范文件(spec file)作为输入,并根据规范文件中定义的指令执行构建过程,生成最终的 RPM 软件包文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
[root@ecs-hce SPECS]# rpmbuild --nodebuginfo -ba hce2-helloworld.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.fTh7oO
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd /root/rpmbuild/BUILD
+ rm -rf hce2-helloworld-1.0.0
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/hce2-helloworld-1.0.0.tar.gz
+ /usr/bin/tar -xof -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd hce2-helloworld-1.0.0
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ RPM_EC=0
++ jobs -p
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.G258Wy
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd hce2-helloworld-1.0.0
+ RPM_EC=0
++ jobs -p
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.dvzv3Y
+ umask 022
+ cd /root/rpmbuild/BUILD
+ '[' /root/rpmbuild/BUILDROOT/hce2-helloworld-1.0.0-1.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/hce2-helloworld-1.0.0-1.x86_64
++ dirname /root/rpmbuild/BUILDROOT/hce2-helloworld-1.0.0-1.x86_64
+ mkdir -p /root/rpmbuild/BUILDROOT
+ mkdir /root/rpmbuild/BUILDROOT/hce2-helloworld-1.0.0-1.x86_64
+ cd hce2-helloworld-1.0.0
+ mkdir -p /root/rpmbuild/BUILDROOT/hce2-helloworld-1.0.0-1.x86_64/usr/bin
+ cp /root/rpmbuild/BUILD/hce2-helloworld-1.0.0/hce2-helloworld /root/rpmbuild/BUILDROOT/hce2-helloworld-1.0.0-1.x86_64/usr/bin/
+ '[' '%{buildarch}' = noarch ']'
+ QA_CHECK_RPATHS=1
+ case "${QA_CHECK_RPATHS:-}" in
+ /usr/lib/rpm/check-rpaths
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/brp-ldconfig
+ /usr/lib/rpm/brp-compress
+ /usr/lib/rpm/brp-strip /usr/bin/strip
+ /usr/lib/rpm/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1 1
+ /usr/lib/rpm/brp-python-hardlink
Processing files: hce2-helloworld-1.0.0-1.x86_64
__brp_dim_baseline not set, ignore dim baseline generating
Provides: hce2-helloworld = 1.0.0-1 hce2-helloworld(x86-64) = 1.0.0-1
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/hce2-helloworld-1.0.0-1.x86_64
Wrote: /root/rpmbuild/SRPMS/hce2-helloworld-1.0.0-1.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/hce2-helloworld-1.0.0-1.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.QbHsJi
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd hce2-helloworld-1.0.0
+ rm -rf /root/rpmbuild/BUILDROOT/hce2-helloworld-1.0.0-1.x86_64
+ RPM_EC=0
++ jobs -p
+ exit 0
[root@ecs-hce SPECS]#

查看生成路径

1
2
[root@ecs-hce SPECS]# ls /root/rpmbuild/RPMS/x86_64/hce2-helloworld-1.0.0-1.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/hce2-helloworld-1.0.0-1.x86_64.rpm

创建私有的 repo 源

选择一个本地私有REPO源的文件目录

选择用/home/private/目录(手动创建一个目录) 将步骤10中的rpm包,拷贝到该目录下

1
2
[root@ecs-hce SPECS]# mkdir /home/private
[root@ecs-hce SPECS]# cp /root/rpmbuild/RPMS/x86_64/hce2-helloworld-1.0.0-1.x86_64.rpm /home/private/

安装createrepo工具,使用 createrepo 命令来创建 RPM 软件包仓库。使用方法如下:

1
2
3
4
5
6
7
8
9
[root@ecs-hce SPECS]# yum install -y  createrepo >> /dev/null
[root@ecs-hce SPECS]# cd /home/private
[root@ecs-hce private]# createrepo .
Directory walk started
Directory walk done - 1 packages
Temporary output repo path: ./.repodata/
Preparing sqlite DBs
Pool started (with 5 workers)
Pool finished

编辑 repo 配置文件, repo 配置文件中增加 repo 源

1
2
3
4
5
6
7
8
9
[root@ecs-hce private]# vi /etc/yum.repos.d/hce.repo
[root@ecs-hce private]# cat /etc/yum.repos.d/hce.repo
.......
.......
[hce2-test]
name=hce2-test
baseurl=file:///home/private/
enabled=1
gpgcheck=0

生效repo源

yum makecache 是一个 yum 命令的选项,用于创建或更新 yum 软件包管理器的本地软件包缓存。

当执行 yum makecache 命令时,yum 会检查配置文件中定义的软件包仓库,并下载或更新仓库中的元数据信息。这些元数据包括软件包列表、版本信息、依赖关系等,用于加快后续的软件包搜索和安装过程。

1
2
3
4
5
[root@ecs-hce private]# yum makecache
HCE 2.0 base 70 kB/s | 3.0 kB 00:00
HCE 2.0 updates 151 kB/s | 3.5 kB 00:00
hce2-test 2.9 MB/s | 3.0 kB 00:00
Metadata cache created.

安装 hce2-helloworld-1.0.0.rpm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@ecs-hce private]# yum install hce2-helloworld
Last metadata expiration check: 0:00:11 ago on Fri 08 Dec 2023 10:21:38 PM CST.
Dependencies resolved.
========================================================================================================================================================================
Package Architecture Version Repository Size
========================================================================================================================================================================
Installing:
hce2-helloworld x86_64 1.0.0-1 hce2-test 6.4 k

Transaction Summary
========================================================================================================================================================================
Install 1 Package

Total size: 6.4 k
Installed size: 28
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : hce2-helloworld-1.0.0-1.x86_64 1/1
Verifying : hce2-helloworld-1.0.0-1.x86_64 1/1

Installed:
hce2-helloworld-1.0.0-1.x86_64

Complete!

制作安全补丁 rpm ,拷贝生成新的源码包,升级版本

1
2
3
4
5
6
[root@ecs-hce private]# cd /root/rpmbuild/SOURCES/
[root@ecs-hce SOURCES]# cp -r hce2-helloworld-1.0.0 hce2-helloworld-1.1.0
[root@ecs-hce SOURCES]# tar zcvf hce2-helloworld-1.1.0.tar.gz hce2-helloworld-1.1.0/
hce2-helloworld-1.1.0/
hce2-helloworld-1.1.0/hce2-helloworld
[root@ecs-hce SOURCES]# cd ../SPECS/

修改hce2-helloworld.spec版本号,将Version:1.0.0修改为1.1.0。其他内容保持不变。

1
[root@ecs-hce SPECS]# vim hce2-helloworld.spec

编译生成新的RPM包,并拷贝到/home/private/目录下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
[root@ecs-hce SPECS]# rpmbuild --nodebuginfo -ba hce2-helloworld.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.37tfGQ
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd /root/rpmbuild/BUILD
+ rm -rf hce2-helloworld-1.1.0
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/hce2-helloworld-1.1.0.tar.gz
+ /usr/bin/tar -xof -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd hce2-helloworld-1.1.0
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ RPM_EC=0
++ jobs -p
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.hmcjbb
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd hce2-helloworld-1.1.0
+ RPM_EC=0
++ jobs -p
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.CvqayW
+ umask 022
+ cd /root/rpmbuild/BUILD
+ '[' /root/rpmbuild/BUILDROOT/hce2-helloworld-1.1.0-1.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/hce2-helloworld-1.1.0-1.x86_64
++ dirname /root/rpmbuild/BUILDROOT/hce2-helloworld-1.1.0-1.x86_64
+ mkdir -p /root/rpmbuild/BUILDROOT
+ mkdir /root/rpmbuild/BUILDROOT/hce2-helloworld-1.1.0-1.x86_64
+ cd hce2-helloworld-1.1.0
+ mkdir -p /root/rpmbuild/BUILDROOT/hce2-helloworld-1.1.0-1.x86_64/usr/bin
+ cp /root/rpmbuild/BUILD/hce2-helloworld-1.1.0/hce2-helloworld /root/rpmbuild/BUILDROOT/hce2-helloworld-1.1.0-1.x86_64/usr/bin/
+ '[' '%{buildarch}' = noarch ']'
+ QA_CHECK_RPATHS=1
+ case "${QA_CHECK_RPATHS:-}" in
+ /usr/lib/rpm/check-rpaths
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/brp-ldconfig
+ /usr/lib/rpm/brp-compress
+ /usr/lib/rpm/brp-strip /usr/bin/strip
+ /usr/lib/rpm/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1 1
+ /usr/lib/rpm/brp-python-hardlink
Processing files: hce2-helloworld-1.1.0-1.x86_64
__brp_dim_baseline not set, ignore dim baseline generating
Provides: hce2-helloworld = 1.1.0-1 hce2-helloworld(x86-64) = 1.1.0-1
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/hce2-helloworld-1.1.0-1.x86_64
Wrote: /root/rpmbuild/SRPMS/hce2-helloworld-1.1.0-1.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/hce2-helloworld-1.1.0-1.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.eFBaP4
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd hce2-helloworld-1.1.0
+ rm -rf /root/rpmbuild/BUILDROOT/hce2-helloworld-1.1.0-1.x86_64
+ RPM_EC=0
++ jobs -p
+ exit 0
[root@ecs-hce SPECS]# cd /home/private

创建了一个名为 updateinfo.xml 的文件

该文件包含一个 XML 结构,描述了一个安全更新的详细信息。它提供了有关更新的作者、来源、状态、版本、严重程度、摘要、描述、引用和软件包列表的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@ecs-hce private]# touch updateinfo.xml
[root@ecs-hce private]# vim updateinfo.xml
[root@ecs-hce private]# cat updateinfo.xml
<?xml version="1.0" encoding="UTF-8"?>
<updates>
<update author="Huawei Cloud EulerOS" from="Huawei Cloud EulerOS" status="stable" type="security" version="1.0">
<id>HCE2-SA-2022:0001</id>
<title>HCE2-SA-2022:0001: hce2-helloworld security update (Important)</title>
<issued date="2022-04-09"/>
<updated date="2022-04-09" timestamp="1612697870"/>
<rights>Copyright (C) 2020-2021 Huawei Cloud EulerOS</rights>
<release>Huawei Cloud EulerOS 2</release>
<severity>Important</severity>
<summary>hce2-helloworld security update</summary>
<description>Package updates are available for Huawei Cloud EulerOS 2 that fix the following vulnerabilities:
CVE-2021-21261: Just for test
</description>
<references>
<reference href="" id="HCE2-SA-2022:0001" type="HCE2-SA"/>
<reference href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-21261" cvss3="8.8/CVSS:3.1/AV:L/AC:L/PR:L/UI:N/
S:C/C:H/I:H/A:H" id="CVE-2021-21261" type="cve"/>
</references>
<pkglist>
<collection short="hce2">
<name>Huawei Cloud EulerOS 2</name>
<package arch="x86_64" epoch="" name="hce2-helloworld" version="1.3.0" release="1.3.0" src="">
<filename>hce2-helloworld-1.3.0-1.x86_64.rpm</filename>
</package>
</collection>
</pkglist>
</update>
<updates>

更新repo源,modifyrepo 是一个用于修改软件包仓库元数据的工具。

1
2
3
4
5
6
7
[root@ecs-hce private]# modifyrepo updateinfo.xml repodata/
[root@ecs-hce private]# yum makecache
HCE 2.0 base 38 kB/s | 3.0 kB 00:00
HCE 2.0 updates 162 kB/s | 3.5 kB 00:00
hce2-test 3.4 MB/s | 3.4 kB 00:00
hce2-test 219 kB/s | 1.4 kB 00:00
Metadata cache created.

检查更新信息可以看到有新的更新提示

1
2
3
4
5
6
7
8
9
[root@ecs-hce private]# yum updateinfo
Last metadata expiration check: 0:00:04 ago on Fri 08 Dec 2023 10:24:14 PM CST.
Updates Information Summary: available
48 Security notice(s)
7 Critical Security notice(s)
20 Important Security notice(s)
19 Moderate Security notice(s)
2 Low Security notice(s)
[root@ecs-hce private]#

根据输出,yum updateinfo 命令显示了可用的更新信息摘要。

根据输出,有 48 条安全通知可用,其中包括不同级别的通知:7 条关键安全通知、20 条重要安全通知、19 条中等安全通知和 2 条低级安全通知。

该命令的输出提示您有可用的安全更新,建议您及时执行更新操作,以确保系统的安全性和稳定性。您可以使用 yum update 命令来执行更新操作。

博文部分内容参考

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知,这是一个开源项目,如果你认可它,不要吝啬星星哦 :)


https://edu.huaweicloud.com/certificationindex/developer/9bf91efb086a448ab4331a2f53a4d3a1


© 2018-2024 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

发布于

2024-02-04

更新于

2024-02-15

许可协议

评论
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×