一篇博客带你搞懂 aptyumdnfrpm 以及源码编译,从此软件安装不求人。


前言

作为国产操作系统的代表,麒麟软件(KylinOS)已经广泛应用于政企、金融、教育等领域。它分为桌面版(基于 Ubuntu/Debian)和服务器版(基于 CentOS/RHEL),因此包管理工具有两套体系。很多新手在安装软件时经常混淆 apt 和 yum,遇到编译安装更是满头问号。

本文将从 零基础 出发,用 大量实际例子 帮你理清:

  • 麒麟系统下到底该用 apt 还是 yum/dnf

  • 每个包管理工具的核心参数及典型使用场景

  • rpm 底层命令的妙用

  • 源码编译安装的完整流程

  • 如何让其他服务(比如 Ansible)使用编译安装的 Python

读完本文,你将能自信地处理麒麟系统上 90% 的软件安装问题。


一、麒麟系统的包管理体系:先看分支

麒麟系统有两大家族:

系统分支 基于 包格式 高级包管理器 底层包管理器
银河麒麟桌面版 Ubuntu/Debian .deb apt dpkg
银河麒麟服务器版 (V10 SP0及更早) CentOS 7 .rpm yum rpm
银河麒麟服务器版 (V10 SP1+) RHEL 8+ .rpm dnf (兼容 yum 命令) rpm

一句话原则

  • 桌面版 → 用 apt

  • 服务器版 → 用 dnf(或 yum

  • 无论哪个版本,rpm 和 dpkg 是底层,不自动解决依赖,建议优先用高级工具。


二、高级包管理器:apt vs yum/dnf

2.1 apt 命令详解(适用于麒麟桌面版)

apt 是 Debian 系的前端工具,语法简洁,带颜色输出和进度条。

常用命令及实际例子
操作 命令 说明
更新软件源列表 sudo apt update 必须先执行,否则不知道有新软件
安装软件 sudo apt install nginx 自动解决依赖
安装时自动确认 sudo apt install -y nginx 跳过 [Y/n] 提示
卸载(保留配置) sudo apt remove nginx 配置文件还在
彻底卸载(删配置) sudo apt purge nginx 配置文件也删除
搜索软件包 apt search nginx 按名称和描述搜索
查看包详细信息 apt show nginx 版本、依赖、大小、描述
列出已安装包 apt list --installed 可配合 grep 筛选
升级所有包 sudo apt upgrade 基于已更新的源列表
删除无用的依赖 sudo apt autoremove 清理孤儿包
仅下载不安装 apt download nginx 下载 .deb 到当前目录
修复破损依赖 sudo apt --fix-broken install 安装中断时常用

实战场景1:安装 Python 3 并确保 pip 可用

sudo apt update
sudo apt install python3 python3-pip -y

实战场景2:彻底卸载 Apache 并清理残留

sudo apt purge apache2
sudo apt autoremove

实战场景3:查看 nginx 有哪些文件会被安装(不实际安装)

apt download nginx
dpkg --contents nginx*.deb   # 稍后会讲 dpkg

2.2 yum / dnf 命令详解(适用于麒麟服务器版)

yum 和 dnf 参数高度相似。下面以 dnf 为例(yum 同样适用)。

常用命令及实际例子
操作 命令 说明
更新源缓存 sudo dnf makecache 类似 apt update
安装软件 sudo dnf install nginx 自动解决依赖
安装时自动确认 sudo dnf install -y nginx 跳过交互
卸载软件 sudo dnf remove nginx 删除软件及依赖
搜索软件 dnf search nginx 搜索名称和摘要
查看包信息 dnf info nginx 版本、仓库、大小
列出已安装包 dnf list installed 配合 grep 过滤
升级所有包 sudo dnf update 升级系统全部软件
仅下载不安装 dnf download nginx 需要先安装 dnf-plugins-core
查找哪个包提供某个文件 dnf provides /usr/sbin/nginx 解决“命令找不到”
查看事务历史 dnf history 可回滚
清理缓存 sudo dnf clean all 释放磁盘空间

实战场景1:安装开发工具组

sudo dnf groupinstall "Development Tools" -y

实战场景2:查找 htpasswd 命令属于哪个包

dnf provides /usr/bin/htpasswd
# 输出:httpd-tools-2.4.6-... 说明需要安装 httpd-tools

实战场景3:回滚最近一次安装(假设历史 ID 为 12)

sudo dnf history undo 12

2.3 yum 与 dnf 的区别

  • 性能dnf 依赖解析更快,内存占用更低。

  • 代码yum 是 Python 2,dnf 是 Python 3 + C 库。

  • 行为dnf 默认不保护正在运行的内核,升级内核后建议立即重启。

  • 兼容:在 CentOS/RHEL 8+ 上,yum 命令只是 dnf 的别名。

一句话:新系统用 dnf,旧系统用 yum,命令基本通用。


三、底层工具:rpm 和 dpkg

高级工具(apt/dnf)负责解决依赖,底层工具负责直接操作单个包文件。当你只有 .rpm 或 .deb 文件,或者需要查询、验证、提取文件时,底层工具就派上用场了。

3.1 rpm 命令详解(服务器版)

安装、升级、卸载
操作 命令示例 说明
安装 rpm -ivh package.rpm -i 安装,-v 显示详情,-h 进度条
升级 rpm -Uvh package.rpm 如果未安装则安装,已安装则升级
卸载 rpm -e nginx 需要精确的包名(不带版本号)
忽略依赖强制安装 rpm -ivh --nodeps package.rpm 危险,可能导致软件不可用
查询操作(最常用)
操作 命令 说明
查询已安装包信息 rpm -qi nginx 版本、架构、安装日期
列出包安装的文件 rpm -ql nginx 查看软件到底装了哪些文件
查询文件属于哪个包 rpm -qf /etc/nginx/nginx.conf 反向查找
列出所有已安装包 rpm -qa 常配合 grep
查看未安装包的信息 rpm -qip package.rpm -p 表示 package file
查看未安装包会释放哪些文件 rpm -qlp package.rpm 安装前预览
验证与校验
操作 命令 说明
验证包完整性 rpm -V nginx 比较文件 MD5、权限等是否被改
验证所有包 rpm -Va 找出被篡改的文件
检查包的 GPG 签名 rpm -K package.rpm 验证来源合法性

实战场景1:从网上下载并安装一个本地 .rpm 包

wget https://example.com/nginx.rpm
rpm -ivh nginx.rpm
# 如果报依赖缺失,需要用 yum localinstall 代替

实战场景2:找出哪个包提供了 /usr/bin/python3

rpm -qf /usr/bin/python3

实战场景3:验证所有包,找出 MD5 校验失败的文件(可能被篡改)

rpm -Va | grep '^..5'

实战场景4:重建损坏的 rpm 数据库

sudo rm -f /var/lib/rpm/__db.*
sudo rpm --rebuilddb

3.2 dpkg 命令(桌面版,简要)

与 rpm 对应,常用命令:

操作 命令
安装本地 .deb sudo dpkg -i package.deb
卸载 sudo dpkg -r package
列出已安装包 dpkg -l
查询包安装的文件 dpkg -L nginx
查询文件属于哪个包 dpkg -S /etc/nginx/nginx.conf

注意dpkg 同样不处理依赖,安装时若提示缺依赖,请执行 sudo apt --fix-broken install


四、源码编译安装:彻底掌握软件定制

当官方仓库版本过旧,或者你需要开启某个特殊编译选项时,源码编译是终极方案。

4.1 编译安装的三步曲

./configure      # 检测环境,生成 Makefile
make             # 编译(根据 Makefile 生成二进制)
make install     # 安装到指定目录

每一步都可能带有参数,下面详细拆解。

第一步:./configure 常用参数
参数 作用 例子
--prefix=PATH 指定安装根目录 --prefix=/opt/python311
--exec-prefix=PATH 指定可执行文件目录 一般不用单独设
--enable-FEATURE 启用某个功能 --enable-optimizations(Python)
--disable-FEATURE 禁用某个功能 --disable-ipv6
--with-PACKAGE 包含某个外部库的支持 --with-ssl(Nginx)
--without-PACKAGE 不包含某个库 --without-http_gzip_module
CFLAGS="-O2" 传递给 C 编译器的优化标志 提升性能
LDFLAGS="-L/path" 链接器搜索库的路径 指定非标准位置的库
第二步:make 常用选项
  • make -j N:并行编译,N 为核心数(如 make -j 4

  • make clean:清理编译中间文件

  • make distclean:彻底清理,包括 Makefile

第三步:make install

通常需要 sudo,因为默认安装到 /usr/local

4.2 实战:编译安装 Python 3.11 到 /opt/python311

需求

  • 自定义路径

  • 启用性能优化

  • 生成共享库(方便其他程序调用)

  • 自带 pip

  • 不使用 tkinter

步骤

# 1. 安装编译依赖(麒麟服务器版)
sudo dnf groupinstall "Development Tools" -y
sudo dnf install openssl-devel bzip2-devel libffi-devel readline-devel sqlite-devel -y

# 2. 下载源码
wget https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tar.xz
tar -xf Python-3.11.9.tar.xz
cd Python-3.11.9

# 3. 配置(核心参数)
./configure --prefix=/opt/python311 \
            --enable-optimizations \
            --enable-shared \
            --with-ensurepip=install \
            --without-tk

# 4. 编译(使用全部 CPU 核心)
make -j $(nproc)

# 5. 安装
sudo make install

安装后,Python 在 /opt/python311/bin/python3.11,pip 也在同目录。

4.3 如何让命令行默认使用编译安装的 Python?

方法一:修改 PATH 环境变量(推荐)
echo 'export PATH=/opt/python311/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
python3 --version   # 应显示 3.11.9
方法二:创建软链接
sudo ln -s /opt/python311/bin/python3.11 /usr/local/bin/python3
# 注意:/usr/local/bin 优先级高于 /usr/bin
方法三:使用 update-alternatives(Debian/桌面版)
sudo update-alternatives --install /usr/bin/python3 python3 /opt/python311/bin/python3.11 1
sudo update-alternatives --config python3

4.4 如何让其他服务(如 Ansible)使用编译安装的 Python?

Ansible 控制节点需要 Python 解释器。默认它会找 PATH 中的第一个 python3。我们可以强制指定:

方式1:命令行参数

ansible-playbook playbook.yml --python /opt/python311/bin/python3

方式2:环境变量

export ANSIBLE_PYTHON_INTERPRETER=/opt/python311/bin/python3
ansible-playbook playbook.yml

方式3:写入 ansible.cfg

[defaults]
interpreter_python = /opt/python311/bin/python3

方式4:在 inventory 中针对主机指定

web1 ansible_python_interpreter=/opt/python311/bin/python3

小技巧:如果你已经把 /opt/python311/bin 添加到了 PATH 的前面,那么 Ansible 会自动使用它,无需额外配置。


五、如何确定编译时需要哪些参数?(关键)

很多新手卡在这一步:我怎么知道这个软件需要哪些 --with-xxx 或 --enable-xxx

答案很简单:需求驱动 + 看帮助 + 试错

5.1 三步法确定参数

第一步:明确你的需求

问自己几个问题:

  • 我要把软件装在哪里?(决定 --prefix

  • 我需要什么特殊功能?例如 HTTPS → --with-ssl,性能优化 → --enable-optimizations

  • 我不需要什么功能?例如不需要 GUI → --without-gui

第二步:查看官方文档和 ./configure --help
./configure --help | less

输出会列出所有可用参数,并附简短说明。例如 Nginx 的 help 中会有:

--with-http_ssl_module         enable ngx_http_ssl_module
--without-http_gzip_module     disable ngx_http_gzip_module
第三步:试错迭代

运行 ./configure,如果报错缺少依赖,根据提示安装对应的 -devel 包或添加 --with-xxx 参数。

实战示例:编译 Nginx 时报错

./configure: error: SSL modules require the OpenSSL library.

解决办法:

  • 安装 openssl-develsudo dnf install openssl-devel

  • 或指定自定义 OpenSSL 路径:--with-openssl=/opt/openssl

5.2 常见软件的典型参数(可作模板)

软件 典型配置参数
Python --prefix=/opt/python3 --enable-shared --enable-optimizations --with-ensurepip=install
Nginx --prefix=/etc/nginx --with-http_ssl_module --with-http_v2_module
Redis --prefix=/opt/redis(Redis 使用 make PREFIX=/opt/redis install
MySQL -DCMAKE_INSTALL_PREFIX=/opt/mysql -DWITH_SSL=system(MySQL 用 CMake)

5.3 如果完全没有思路,就只指定 --prefix

很多软件只需指定安装路径就能编译成功。例如:

./configure --prefix=/opt/myapp
make && make install

运行时如果缺少功能,再回头添加参数重新编译。不要追求一步到位,迭代是正常流程。

六、总结与最佳实践

  1. 首选高级包管理器

    • 桌面版:apt

    • 服务器版:dnf(或 yum

    • 除非需要特定版本或特殊编译选项,否则不要轻易编译安装。

  2. 底层工具用于查询和急救

    • rpm -qf / dpkg -S:查文件来源

    • rpm -V:验证文件完整性

    • rpm --rebuilddb:修复数据库

  3. 编译安装四部曲

    ./configure --prefix=/your/path [其他参数]
    make -j$(nproc)
    sudo make install
    # 最后记得把 bin 目录加入 PATH
  4. 让其他服务使用自编译软件

    • 优先修改 PATH 环境变量

    • 或在服务配置中指定绝对路径(如 Ansible 的 interpreter_python

  5. 不要怕试错
    编译报错是常态,根据错误信息搜索或安装依赖,总能解决。

麒麟系统融合了 Debian 和 Red Hat 两大流派,初看容易混淆,但只要记住 “桌面用 apt,服务器用 dnf” 这个口诀,再配合本文给出的实际命令例子,你就能轻松应对日常软件管理任务。

编译安装虽然比包管理复杂,但它给了你最大的自由度。当你需要为生产环境定制高性能软件时,本文的编译流程和参数决策方法将成为你的利器。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐