跳转至

1 软件包管理介绍

包括本系统在内的 Linux 发行版本质上都是由包括 kernel 在内的软件包 (package) 通过一定的组织形式构成的。软件包管理工具的作用就是安全高效地管理这些软件包。

目前本系统仅支持 rpm 这一类软件包格式,支持 dnf 和 yum 两种包管理软件,这里强烈推荐用户更多地使用 dnf。

2 软件源介绍

包管理工具都是从可用的软件包源中下载用户指定的软件包以及其依赖包,然后进行安装、升级等操作,因此需要提供可靠的软件源。

2.1 在线软件源

目前系统已默认配置好基础的 repo 源,如下所示,用户无需再额外配置。

需要注意的是,仅 [BaseOS][AppStream] 两项是默认使能的,因此用户想使用其它几项的源,需要手动调整 enabled=1

cat /etc/yum.repos.d/OpenCloudOS-Stream.repo 
[BaseOS]
name=BaseOS $releasever - $basearch
baseurl=https://mirrors.opencloudos.tech/opencloudos-stream/releases/$releasever/BaseOS/$basearch/Packages/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-OpenCloudOS-Stream

[AppStream]
name=AppStream $releasever - $basearch
baseurl=https://mirrors.opencloudos.tech/opencloudos-stream/releases/$releasever/AppStream/$basearch/Packages/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-OpenCloudOS-Stream

[BaseOS-debuginfo]
name=BaseOS-debuginfo $releasever - $basearch
baseurl=https://mirrors.opencloudos.tech/opencloudos-stream/releases/$releasever/BaseOS/$basearch/debug/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-OpenCloudOS-Stream

[AppStream-debuginfo]
name=AppStream-debuginfo $releasever - $basearch
baseurl=https://mirrors.opencloudos.tech/opencloudos-stream/releases/$releasever/AppStream/$basearch/debug/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-OpenCloudOS-Stream

[BaseOS-source]
name=BaseOS-source $releasever
baseurl=https://mirrors.opencloudos.tech/opencloudos-stream/releases/$releasever/BaseOS/source/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-OpenCloudOS-Stream

[AppStream-source]
name=AppStream-source $releasever
baseurl=https://mirrors.opencloudos.tech/opencloudos-stream/releases/$releasever/AppStream/source/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-OpenCloudOS-Stream

此外,我们还提供了 EPOL 源,EPOL 是 Extra Packages for OpenCloudOS Linux 的缩写,旨在提供更多增强功能,EPOL 源默认已配置,但是如果发生缺失的情况,用户可以通过如下命令安装 EPOL 源的 repo 文件:

dnf install -y opencloudos-stream-epol-repos

安装完成之后即可访问 EPOL 中的 rpm 包。

2.2 搭建本地软件源

除了使用官方的在线源之外,对于需要离线使用软件源的场景,用户可以自己搭建本地软件源,具体步骤如下:

1 创建目录

mkdir -p /mnt/myiso   # 创建放置 iso 的目录,位置随意,确保存储空间充足
mkdir -p /mnt/my_yum  # 创建挂载 iso 的目录,位置随意,确保存储空间充足
2 下载 iso,以 x86_64 为例,需要注意的是 everything iso 是包最为充足的,因此建议现在此 iso。

cd /mnt/myiso
wget https://mirrors.opencloudos.tech/opencloudos-stream/releases/23/images/x86_64/OpenCloudOS-Stream-23-20230301-x86_64-everything.iso

注:示例中的版本号仅作为演示,用户需要按需填写自己的版本的路径

3 挂载 iso

# mount -o loop /mnt/myiso/OpenCloudOS-Stream-23-20230301-x86_64-everything.iso /mnt/my_yum/
mount: /mnt/my_yum: WARNING: source write-protected, mounted read-only.
4 此时就可以通过 /mnt/my_yum 目录 访问 iso 中的rpm包了

cd /mnt/my_yum/
tree -L 2
.
├── AppStream
│   ├── Packages
│   └── repodata
├── BaseOS
│   ├── Packages
│   └── repodata
├── boot
│   └── grub2
├── EFI
│   └── BOOT
└── images
    ├── efiboot.img
    ├── eltorito.img
    ├── install.img
    └── pxeboot

12 directories, 3 files
5 配置本地 repo 源,可以参考如下:

cat /etc/yum.repos.d/local.repo
[AppStream]
name=AppStream
baseurl=file:///mnt/my_yum/AppStream
priority=1
enabled=1

[BaseOS]
name=BaseOS
baseurl=file:///mnt/my_yum/BaseOS
priority=1
enabled=1
6 验证

可以尝试安装一个软件包,或者查询源中的软件包

2.3 搭建临时本地源

除了使用我们官方提供的 iso 搭建本地源之外,用户也可以自行准备 rpm 包,将指定目录制作为临时的本地源,具体步骤如下:

1 创建目录

mkdir -p /mnt/local_repo/x86_64/Packages # 目录位置随意,确保存储空间足够即可
2 安装 createrepo 工具

dnf install -y createrepo
3 将 rpm 包拷贝到本地源目录

cp *.rpm /mnt/local_repo/x86_64/Packages
4 创建 repodata

createrepo /mnt/local_repo/x86_64

这一步执行完后会在 /mnt/local_repo/x86_64 目录下创建 repodata 5 配置本地 repo 源,可以参考如下:

cat /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt/local_repo/x86_64
priority=1
enabled=1
6 验证,可以尝试安装一个软件包,或者查询源中的软件包进行验证。

3 包管理配置

系统默认通过 dnf 工具进行软件包管理。dnf 配置分为两部分:dnf 本身的配置和源配置

3.1 dnf 配置

本系统默认的配置如下:

cat /etc/dnf/dnf.conf 
[main]
gpgcheck=1
installonly_limit=3
clean_requirements_on_remove=True
best=True
skip_if_unavailable=False
zchunk=False

除了默认的配置之外,用户也可以自己调整 dnf 配置,可以通过 man 命令查询

man dnf.conf

3.2 repo 源配置

上文已经列出了环境中默认的 repo 配置,常见的配置说明如下,用户可按需调整

参数 值类型 默认值 说明
name string repo 源的名字
baseurl list repo 源的 URL 列表
priority integer repo 源的优先级,取值范围 0 - 99,值越小优先级越高
gpgcheck boolean 1 是否进行 GPG 校验
installonly_limit integer 3 允许被并行安装的软件包数量
clean_requirements_on_remove boolean True 是否在卸载软件包时同时卸载没有被其他软件包使用的依赖
best boolean True 是否在安装软件包时安装最高版本,如果无法安装则失败。(指定安装包的依赖安装时不受此参数控制)
skip_if_unavailable boolean False 安装时会跳过不可用的源
zchunk boolean False 是否通过 zchunk 格式压缩 repo 的元数据

4 常用包管理命令

4.1 安装/卸载/下载软件包

安装源中的软件包

dnf install -y pkgname

安装用户自己编译的 rpm 包文件

dnf localinstall -y pkgname.rpm

软件包卸载

dnf remove -y pkgname

下载源中的 rpm 包

dnf download pkgname

4.2 软件包升/降级

将已安装的 rpm 包升级

dnf upgrade pkgname

将已安装的 rpm 包降级

dnf downgrade pkgname

4.3 软件包信息查询

列出当前环境所有已安装软件包

rpm -qa

此命令会列出系统全量安装的包列表,因此一般配合 grep 命令使用

查询指定软件包信息

rpm -qi pkgname

查询repo源中的软件包,会从包名完全匹配、名字和简介匹配、名字模糊匹配、简介模糊匹配四个方面查找指定字段。

dnf search pkgname

通过repo源查询指定软件包的依赖关系

dnf repoquery --whatrequires pkgname
dnf repoquery --requires pkgname

查询repo源中指定软件包信息

dnf info pkgname

查询源中哪些包提供了指定文件或能力

dnf whatprovides name

5 常见报错处理

5.1 install 失败

具体日志大致如下, 完整如下图所示

You have enabled checking of packages via GPG keys. This is a good thing.
However, you do not have any GPG public keys installed. You need to download
the keys for packages you wish to install and install them.
You can do that by running the command:
    rpm --import public.gpg.key

enter image description here

此问题多发生于配置额外源的时候,可以编辑 /etc/yum.conf 文件,将 gpgcheck 选项改为 gpgcheck=0 即可 enter image description here

5.2 Database environment version mismatch

详细报错信息如下

error: db5 error(-30969) from dbenv->open: BDB0091 DB_VERSION_MISMATCH: Database environment version mismatch
error: cannot open Packages index using db5 - (-30969)
error: cannot open Packages database in /var/lib/rpm

多见于强制结束 yum 导致 rpm 数据库损坏,处理策略为:

1 删除损坏的 rpmdb 文件

rm -f /var/lib/rpm/__**
2 重建 rpm 数据库

rpm --rebuilddb
3 清除所有 yum 缓存

yum clean all

如此即可

5.3 容器部署时dnf install失败

现象如下: enter image description here

且配置了 dns 仍无法解决,dig 命令显示 Operation not permitted enter image description here

如果有如上现象,则可能与 dnf 包管理无关,请确认 host 的 doker 版本与 docker image 中 glibc 的版本,如果 docker image 的 glibc > 2.34,则需使 host 的 docker >= 20.10.9

5.4 软件包冲突

如果不同的软件包提供了相同的能力或者相同的文件,则会产生软件包冲突,这是正常现象,我们以 mariadb 和 mysql 为例:

rpm -qa | grep mariadb
mariadb-connector-c-config-3.3.1-4.ocs23.noarch
mariadb-common-10.5.16-4.ocs23.x86_64
mariadb-connector-c-3.3.1-4.ocs23.x86_64
mariadb-10.5.16-4.ocs23.x86_64

dnf install -y mysql
Last metadata expiration check: 3:01:01 ago on Fri 26 May 2023 01:02:52 PM CST.
Error: 
 Problem: problem with installed package mariadb-10.5.16-4.ocs23.x86_64
  - package mariadb-10.5.16-4.ocs23.x86_64 conflicts with mysql provided by mysql-8.0.32-3.ocs23.x86_64
  - package mysql-8.0.32-3.ocs23.x86_64 conflicts with mariadb provided by mariadb-10.5.16-4.ocs23.x86_64
  - conflicting requests
(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

由于 mariadb 和 mysql 提供了相近的数据库能力,因此会产生 conflicts,用户需要自行斟酌保留哪个,如果需要 mysql,则要在已知影响的情况下移除已安装的 mariadb。

另外,当源里面存在多个待安装的冲突包版本时(如下有多个版本的 mysql),冲突日志会有所不同,处理方式相同。

dnf prov mysql
Last metadata expiration check: 0:15:01 ago on Fri 26 May 2023 11:51:52 PM CST.
mysql-8.0.32-2.ocs23.x86_64 : MySQL client programs and shared libraries
Repo        : build0
Matched from:
Provide    : mysql = 8.0.32-2.ocs23

mysql-8.0.32-3.ocs23.x86_64 : MySQL client programs and shared libraries
Repo        : build0
Matched from:
Provide    : mysql = 8.0.32-3.ocs23

dnf install -y mysql
Last metadata expiration check: 0:14:33 ago on Fri 26 May 2023 11:51:52 PM CST.
Error: 
 Problem: problem with installed package mariadb-10.5.16-4.ocs23.x86_64
  - package mariadb-10.5.16-4.ocs23.x86_64 conflicts with mysql provided by mysql-8.0.32-3.ocs23.x86_64
  - package mysql-8.0.32-3.ocs23.x86_64 conflicts with mariadb provided by mariadb-10.5.16-4.ocs23.x86_64
  - cannot install the best candidate for the job
(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)