尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CentOS 7软件安装全指南:RPM、YUM与源码编译的实战对比与避坑手册

CentOS 7软件安装全指南:RPM、YUM与源码编译的实战对比与避坑手册 装软件这件事在CentOS 7上其实就三种思路RPM、YUM、源码包。我见过太多新手上来就敲yum install xxx报错了不知道该往哪查也见过有人非要手动rpm -ivh装包结果被依赖关系折腾一整天还有一部分人执迷于源码编译总觉得自己编译的更“高级”结果连make都过不了。这篇文章我把三种方式全部捋一遍从原理到实操作尤其把踩过的坑都标出来给正在折腾CentOS 7的朋友做个参考。1. 三种安装方式先搞清楚它们解决什么问题1.1 为什么CentOS 7有这三种安装方式CentOS 7继承了红帽系Linux的包管理传统最底层的是RPM全称Red Hat Package Manager。它负责直接操作.rpm包文件把程序装进系统并记录安装的文件清单和版本信息。你可以把它理解成一个“安装器”相当于Windows下的安装程序只不过它只能在RPM系的Linux上跑而且对系统版本、依赖环境有严格要求。YUM则是RPM之上的工具层。它把分散的RPM包收集到仓库repository里安装时自动帮你下载依赖、解析版本、一并安装。CentOS 7默认用的就是YUM后来新版系统改成DNF但CentOS 7的生态基本还是YUM为主。对日常使用者来说YUM才是真正的主力因为几乎所有软件都能用一个yum install搞定不需要你去一个个手动找依赖包。源码包则完全是另一套路线。它不提供编译好的二进制文件而是把开发者写的原始代码打包给你你需要在目标机器上自己配置编译参数、生成Makefile、用编译器构建出可执行文件。这个过程可控性最强但你也要付出时间成本并且对编译环境有要求。1.2 从本质区别上理解选型先看一张我做了很多次对比的表格这几种方式的差异一目了然对比维度RPM包YUM仓库源码包安装包形态.rpm文件仓库里的rpm包及其元数据.tar.gz/.tar.xz源码压缩包依赖处理不自动处理缺什么报什么自动解析并安装依赖依赖靠configure检测缺失则报错安装速度快直接释放文件较快取决于下载速度慢需要编译大项目可能几十分钟定制能力低包怎么编的就怎么装低只能装仓库默认版本高可指定路径、功能模块、编译参数获取难度需要找到匹配系统版本的rpm配置好源后一句话安装官方源码站随便下载升级卸载卸载干净但有依赖顺序约束yum update统一升级卸载麻烦通常手动删除目录从这个表能看出RPM适合“手里已经拿到安装包、且依赖环境满足”的场景YUM适合绝大多数在线安装源码包适合需要定制、或者官方只提供源码的场景。1.3 我的选型判断标准我自己的习惯是能YUM就YUMYUM里没有再看RPM实在不行或者要特殊定制才上源码包。比如装NginxCentOS官方源里的版本太旧需要新版特性我可能会单独找Nginx官方RPM源而不是直接源码编译。但像PaddlePaddle这类对CPU指令集有特殊要求的或者要自定义编译路径和参数的那就必须源码编译。还有一个容易忽略的点源码包编译之前要先准备开发工具链。你要是连gcc都没有编译第一步就会挂在configure上。这个问题我会在后面重点讲。2. RPM包安装实操最直接但依赖最麻烦2.1 先把rpm命令基础用法过一遍很多人一上来就rpm -ivh xxx.rpm装不上就懵。其实rpm命令本身并不难关键是搞懂参数含义-iinstall安装-v显示详细信息-h显示进度条配合-v就是-ivh-U升级安装如果已装旧版本会覆盖升级没装过就等同于安装-e卸载删除包里记录的所有文件-qa查询系统上所有已安装的rpm包-ql查询某个包安装了哪些文件-qf查询某个文件属于哪个包-V校验包内文件是否被改动过举个例子你想安装一个本地下载好的mysql-community-client.rpm最常规的命令是rpm -ivh mysql-community-client.rpm如果这个包已经存在旧版本需要升级就用rpm -Uvh mysql-community-client.rpm卸载则是rpm -e mysql-community-client注意卸载时只要包名不要带完整版本号。rpm -e后面跟完整的安装包文件路径是会吃亏的。2.2 遇到“-bash: rpm: command not found”怎么办这个报错看起来挺恐怖但其实分两种情况。第一种是系统精简安装连rpm都没部署多见于什么“最小化安装镜像”装出来的环境。第二种是PATH环境变量被修改过导致/usr/bin/rpm或/bin/rpm没被找到。先用绝对路径试一下/usr/bin/rpm --version如果这个命令能执行说明只是PATH的问题把/usr/bin加进~/.bashrc就行export PATH$PATH:/usr/bin如果连绝对路径都说找不到文件那就确实是rpm包没装。此时可以借助安装介质比如用CentOS 7的安装ISO挂载后从Packages目录找到rpm-*.rpm包再用rpm2cpio或者直接解包的方式恢复。不过现实中更常见的是系统彻底坏在救不起来直接重装更省事。2.3 依赖地狱解决RPM依赖的几条实战经验RPM最折磨人的就是依赖。你装一个包它报Requires: libssl.so.10()(64bit) is needed你去找libssl装的时候又说要libcrypto的更高版本一层套一层。我的第一招是不要死磕rpm -ivh改用yum localinstall。比如yum localinstall mysql-community-client.rpm这个命令会把本地rpm包当成一个待安装目标然后自动从已配置的YUM源里寻找并安装它缺失的依赖。这是我在内网离线环境里最常用的方案比手动一个个找依赖高效得多。第二招是先用rpm查询命令确认缺什么。比如rpm -qpR mysql-community-client.rpm-qpR会列出这个rpm包的Requires列表你一条条核对系统里是否已有。核对的命令是rpm -qa | grep libssl第三招更重要学会区分“运行时依赖”和“构建依赖”。如果你是给普通用户环境装包只关注Requires即可但如果你在编译其他软件那就要把-devel包也装全。很多人在这一步漏掉-devel包导致编译时缺头文件。3. YUM安装日常主力核心在源3.1 YUM的工作机制像手机应用商店YUM的核心理念是“软件仓库”。你在/etc/yum.repos.d/目录下配置一个或多个.repo文件每个文件指向一个远程或本地源。YUM首先去源下载所有包的元数据包括包名、版本、依赖关系存在本地缓存里然后根据你输入的yum install命令在元数据里找出目标包并递归解析所有依赖最后一次性安装。这个机制的好处是依赖关系由仓库维护者和你自己配置的源共同保证只要你用的源可靠大部分依赖问题不需要人工干预。缺点也很明显源没配好后面全废。3.2 本地YUM源搭建离线环境必备我经常在物理隔离的内网环境干活没外网这时候本地YUM源就是救命稻草。最典型的做法是把CentOS 7的安装ISO挂载到系统用它作为源。步骤如下把ISO上传到服务器或直接放入光驱/虚拟光驱然后挂载mkdir -p /mnt/centos7 mount -o loop /path/to/CentOS-7-x86_64-Minimal-2009.iso /mnt/centos7如果是VMware虚拟机可以直接在虚拟机设置里加载ISO然后用mount /dev/cdrom /mnt/centos7创建本地repo文件vi /etc/yum.repos.d/local.repo写入以下内容[local] nameCentOS7 Local Repo baseurlfile:///mnt/centos7 enabled1 gpgcheck0更新缓存yum clean all yum makecache测试安装yum install -y vim如果ISO是最小化安装盘Packages目录里的包数量有限装不了太全。这时候可以再挂载一个DVD完整版ISO或者把在线下载的rpm包放进去构建自己的离线仓库。3.3 把YUM源换成国内镜像避免源失效CentOS 7官方源已经停止维护现在默认源经常“Errors during downloading metadata for repository”表现为yum不可用。最稳妥的做法是换国内镜像。以阿里云镜像为例备份旧的repo文件cd /etc/yum.repos.d/ mkdir backup mv *.repo backup/然后下载阿里云CentOS 7的repocurl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo这里要留意阿里源里写的是$releaseverCentOS 7会解析为7可以用sed -i s/$releasever/7/g /etc/yum.repos.d/CentOS-Base.repo整完执行yum clean all yum makecacheEPEL源同理它是很多额外软件的基础yum install -y epel-release如果epel-release本身装不上就直接下载EPEL的rpm包rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm之后同样替换为阿里云的epel源。3.4 常用YUM命令组合一站搞定安装YUM的日常命令不多但每个都很重要yum install -y 包名 # 安装-y表示自动确认 yum remove 包名 # 卸载 yum update 包名 # 升级指定包 yum update -y # 全量升级慎用 yum search 关键词 # 搜索源里有哪些包 yum provides 文件/命令 # 查某个命令由哪个包提供 yum deplist 包名 # 查看包依赖关系 yum groups list # 列出包组 yum groupinstall Development Tools # 安装开发工具组 yum history # 查看安装历史方便回滚yum provides非常有用。比如你在执行某个脚本时提示command not found: ifconfig但你不知道装谁可以yum provides ifconfig它会提示net-tools包。这也是排查依赖问题的利器。3.5 离线机器批量下载RPM包内网没外网但有一台能上网的机器怎么办当然是把rpm包下载下来拷进去。YUM提供了两个非常实用的方法。第一yumdownloader。需要先装yum install -y yum-utils然后下载某个包及其依赖到指定目录yumdownloader --resolve --destdir/tmp/rpms nginx--resolve表示连同依赖一起下载--destdir指定保存目录。第二更简单的方式直接利用downloadonly插件yum install --downloadonly --downloaddir/tmp/rpms nginx这条命令会在安装前先把包和依赖都下载到目录但不会执行安装。非常适合在离线机上提前准备好一批包。拷到内网机器后就地建一个本地源或者直接对打包目录执行yum localinstall /tmp/rpms/*.rpm3.6 YUM的高频坑和避坑建议生产环境千万别随手执行yum update -y尤其不要更新内核和OpenSSH。我见过太多跑到一半卡住、远程连接断掉、系统起不来的案例。真要更新用yum update --excludekernel* --excludeopenssh*或锁版本工具。装了EPEL源之后要留意它和官方源的包冲突。比如某些包在官方源和EPEL里版本不一致YUM可能报“Nothing to do”或者依赖冲突。缓存目录/var/cache/yum会随安装过程越来越大可以定期yum clean all清理。遇到“Errors during downloading metadata for repository”时不要只重试先检查/etc/resolv.conf是不是DNS没配置再检查源URL是否还能访问。大概率是源失效而不是网络问题。4. 源码包编译安装要定制就自己动手4.1 什么场景下必须用源码包源码编译最典型的使用场景有三类。第一软件官方只提供源码包比如某些Nginx模块、Python的特定版本、Redis较高版本没有现成rpm。第二需要对软件做定制化比如指定安装目录、启用/禁用某些模块、调整编译优化参数。第三仓库里的版本太旧比如CentOS 7官方仓库中Python还是2.7跟不上需求。当然代价也很明确编译耗时、依赖要求高、后续卸载和升级需要自己动手。所以选择源码包之前先想想能不能找到可靠的第三方源比如Nginx官方源、MySQL官方源能省很多事。4.2 编译前的环境准备源码编译最常见的第一道坎就是没有编译器。我在新装的最小化系统里直接编译经常看到configure: error: no acceptable C compiler found in $PATH解决办法是先装开发工具组yum groupinstall -y Development Tools这个包组会一次性装上gcc、gcc-c、make、automake、autoconf、kernel-devel等大部分编译工具。如果你只需要编译单个软件也可以只装gcc和makeyum install -y gcc gcc-c make另外很多软件在configure时会检测各种开发库头文件。比如编译Nginx需要pcre、zlib、openssl的开发库yum install -y pcre-devel zlib-devel openssl-devel这里有个规律源码编译时XXX库缺失就装XXX-devel包。如果你在configure日志里看到“checking for ... not found”大多数情况是这个依赖库的devel包没装。4.3 经典三步走configure make make install以我经常折腾的Nginx为例完整流程是下载源码包并解压wget https://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0配置编译参数./configure --prefix/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module--prefix指定安装目录不指定的话默认会散落在系统各处后续卸载极难清理。所以强烈建议源码安装一律指定一个独立目录。编译并安装make -j$(nproc) make installmake -j后面跟的数字是并行编译的进程数$(nproc)会自动取CPU核心数能大幅缩短编译时间。但要注意如果你给虚拟机分配的核心数不多并行太高反而容易内存不够一般-j2或-j4就够。装完之后Nginx就被放到/usr/local/nginx目录下。可执行文件在sbin配置文件在conf网页目录在html。4.4 编译安装后的系统集成源码包默认不会被systemd管理所以要让它开机自启需要自己写一个service文件。以Nginx为例在/etc/systemd/system/nginx.service里写入[Unit] Descriptionnginx web server Afternetwork.target [Service] Typeforking PIDFile/usr/local/nginx/logs/nginx.pid ExecStart/usr/local/nginx/sbin/nginx ExecReload/usr/local/nginx/sbin/nginx -s reload ExecStop/usr/local/nginx/sbin/nginx -s stop PrivateTmptrue [Install] WantedBymulti-user.target然后执行systemctl daemon-reload systemctl enable --now nginx这样源码安装的软件也能像YUM安装的一样被systemd管理。还有一点编译好的Nginx不会自动注册到防火墙信任列表如果你要用80端口记得开放防火墙firewall-cmd --permanent --add-port80/tcp firewall-cmd --reload4.5 源码包的卸载与清理源码安装没有统一卸载命令除非软件提供了make uninstall。但实践中我很少依赖它因为make uninstall不一定能完全清理所有文件。更保险的做法是安装时指定--prefix/opt/xxx卸载时直接删掉整个目录即可rm -rf /usr/local/nginx然后清理掉你自己创建的systemd service文件、环境变量、启动脚本等。如果你希望源码包也能像rpm一样被追踪管理可以试试checkinstall。它能在make install之后生成一个rpm包方便以后卸载升级。不过这个工具需要单独下载而且对老系统的兼容性一般我用的反而不多。5. 常见问题与排查技巧实录5.1 高频报错速查表报错信息原因分析解决办法-bash: yum: command not found系统精简到连yum都没有或路径丢失检查/usr/bin/yum是否存在不存在则用rpm包重装yumrpm: command not foundrpm命令缺失或PATH异常用绝对路径/usr/bin/rpm尝试否则恢复rpm包Requires: libxxx.so.1()(64bit) is neededrpm包缺少动态库依赖用yum whatprovides *libxxx.so.1*找到对应包并安装Errors during downloading metadata for repository源失效或网络配置问题换可用源检查DNS、curl源地址No package xxx available仓库里没有这个包检查是否启用EPEL或用源码编译configure: error: no acceptable C compiler found缺编译器yum groupinstall -y Development Toolsmake: *** No targets specified and no makefile foundconfigure没过没有生成Makefile回头看configure的输出日志解决依赖问题5.2 装大软件前先看看磁盘空间很多人装软件装到一半编译临时文件把/分区塞满服务起不来。这里我给个硬建议装大软件前先执行df -h如果根分区快满了想办法扩容。CentOS 7默认用LVM扩容逻辑卷比较方便。比如根分区在/dev/mapper/centos-root先看卷组有没有剩余空间vgs有空间就直接扩展lvextend -L 20G /dev/mapper/centos-root xfs_growfs / # 如果是xfs文件系统如果根分区不是LVM那只能在分区层面想办法或者干脆重装盘的时候多分一些。5.3 安装完软件后的常规检查软件装完不等于万事大吉。我每次都会做三件事检查端口和进程ss -tlnp | grep 端口号确认服务已经监听。检查开机自启systemctl is-enabled 服务名如果没有输出enabled就执行systemctl enable 服务名。检查防火墙firewall-cmd --list-ports没放的端口及时放行。很多朋友报“服务起不来”或“外网访问不到”最后排查下来都是防火墙或SELinux的问题。CentOS 7默认SELinux是enforcing如果实在被坑烦了可以先临时用setenforce 0测试确认是SELinux的问题再决定是否修改配置文件。不过生产环境我不建议直接关最好按SELinux上下文规范处理。5.4 几条个人实操心得最后说几句实在话。第一遇到依赖问题先想想能不能用yum localinstall或yum deplist不要头铁硬刚rpm。系统报错的提示已经写得很清楚照着解决远比瞎试快。第二源码编译最怕的就是“缺一半依赖”。所以我每次都会提前把Development Tools装上并且尽量把常见devel包也装齐。虽然包有点多但能在后续编译中省下大量时间。第三无论用哪种方式都建议把安装方式、安装路径、配置文件位置记录到一个简单笔记里。尤其是源码包过了三个月你可能连当初把Nginx装在哪都忘了。第四如果CentOS 7的官方源彻底不能用了尽快导出当前已安装的包列表迁移到Rocky Linux或AlmaLinux时能快速恢复环境。用yum list installed可以拿到所有rpm包的清单。CentOS 7已经被很多企业卷进老系统的行列但它的生命周期依然活跃在大量服务器上。RPM、YUM、源码包这三种安装方式并不冲突反而是同一套生态在不同场景下的互补。我现在的习惯是能YUM坚决YUMYUM满足不了就找第三方的RPM源最后才考虑源码编译。源码编译这种路子更像是“给自己定制一套合身的衣服”需要付出的理解和维护成本都更高。你在CentOS 7上折腾过的安装问题最后多半会落到依赖和源这两件事上把这两点看透基本就能通畅无阻了。
返回列表