CentOS使用yum仅下载源码不安装的命令:把源码抱回家再慢慢炖

CentOS使用yum仅下载源码不安装的命令:把源码抱回家再慢慢炖

想给内核打补丁,却怕线上环境直接翻车?只想把源码拖回来慢慢研究,却被yum一把装到系统里?别急,CentOS的yum其实藏着一条“只看不碰”的暗道,一条命令就能把.src.rpm原封不动请进本地目录,不动现有包,不触发依赖,连编译痕迹都不留。下面就把这条暗道一次性说透,顺带把常见坑也填平。
为什么非要“只下不装”
线上机器跑的是定制内核,动一发牵全身;开发机又嫌网速慢,想先在本地镜像站把源码拖回去再分发;更有人想对比官方补丁和自己手改的差异,这时候任何“意外安装”都是灾难。yum默认行为是下载+安装,但给它加两枚开关,就能让它变成温顺的“下载器”。
核心命令:yumdownloader 搭配 -source
CentOS自带yum-utils小工具包,里面藏着yumdownloader。先确认装上:
yum -y install yum-utils

接着一条指令:
yumdownloader --source 包名
就能把对应的.src.rpm扔进当前目录,不会触发任何安装动作。如果想把源码统一归拢,再加--destdir=/自定义路径,例如:
yumdownloader --source --destdir=/data/src httpd
执行完去看目录,只有httpd-*.src.rpm静静躺着,系统里原来的httpp纹丝不动。
老版本yum没有yumdownloader?用yum的“下载-only”兼容写法
极老系统可能没yum-utils,也可以让yum亲自出马:
yum install --downloadonly --downloaddir=/data/src 包名
注意,这条命令默认下载的是二进制rpm,要的是源码,需要再拼一层:
yum install --downloadonly --downloaddir=/data/src 包名*.src
yum会去找同名的source rpm,拉下来依旧不安装。缺点是要写全包名,不如yumdownloader简洁。
一次拉一整套内核源码示例
想研究当前运行内核的补丁,先查版本:
uname -r
假设输出“3.10.0-1160.el7”,直接:
yumdownloader --source --destdir=/data/src kernel-3.10.0-1160.el7
几分钟后,kernel-3.10.0-1160.el7.src.rpm就位。接着用rpm -ivh解包,再rpmbuild -bp打补丁目录,就能在~/rpmbuild/BUILD里随意折腾,原系统内核稳如老狗。
常见坑位提醒
1. 找不到source包:默认repo没启用source,手动打开/etc/yum.repos.d/CentOS-Sources.repo,把enabled=0改成1,再yum clean all。
磁盘爆满:kernel.src.rpm动辄两百兆,提前df -h看一眼/data/src够不够放。
权限问题:下载目录别放在root独占的700权限路径,普通用户想读都读不了。
版本号写错:tab补全最靠谱,手打少一个“el7”都会提示No package。
把源码转成可编译目录的下一步
src.rpm到手后,多数人想直接看代码:
rpm -ivh kernel-*.src.rpm
这会写入~/rpmbuild目录,接着:
cd ~/rpmbuild/SPECS && rpmbuild -bp kernel.spec
打完补丁的纯净源码就躺在BUILD/kernel-*/里,随便改、随便diff、随便编译模块,和系统正在跑的kernel互不干扰。
一条命令总结
记住这句就够:
yumdownloader --source --destdir=/任意路径 包名
不装、不依赖、不污染生产环境,源码想怎么看就怎么看。
附:最小化安装没yum-utils的快速自救
如果连yum-utils都没有,先:
rpm -q yum-utils || yum -y install yum-utils
内网环境也能提前在外网机用同样的命令把yum-utils及其依赖全部down下来,再scp进去rpm -ivh手动装,全程依旧不需要外网。
把这条命令写进脚本,结合cron每天凌晨拉最新安全补丁的src.rpm,第二天上班就能第一时间审补丁、打热补丁,再也不怕“一升级就炸服”。源码在手,节奏我有。
