ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CentOS 7安装ELRepo:内核升级与驱动安装实战指南

CentOS 7安装ELRepo:内核升级与驱动安装实战指南 1. 为什么要装ELRepoCentOS 7默认源里那些“不给力”的东西CentOS 7虽然已经进入维护周期的尾声但在生产环境里的存量依然非常庞大。很多人刚开始用CentOS 7的时候都会遇到一个情况想装个新内核、想装个新版本的显卡驱动、想用上某些硬件需要的厂商驱动模块结果发现yum install直接提示找不到包或者版本老得吓人。出现这种情况多半是因为默认的base、updates、extras这几个官方源只维护稳定版和兼容性优先的包它们在软件版本策略上极其保守。ELRepoExtra Packages for Enterprise Linux不是第三方滥用性质的软件源它由专业社区维护专门面向RHEL、CentOS、Scientific Linux这类企业级发行版提供硬件驱动、文件系统驱动、内核以及相关工具的更新版本。可以把它理解成官方源的“专业补充子集”只做硬件和内核这条线避开了和官方源大量重复的普通软件包因此冲突面非常小。我在实际维护服务器的过程中遇到最多需要ELRepo的场景是这几个一是服务器要上新内核以获得更好的调度器、网络栈和硬件兼容性二是厂商要求操作系统内核版本必须达到某个最低线才能装驱动例如存储阵列卡驱动、部分网卡驱动三是需要启用类似NTFS、exFAT这类官方源不直接提供的内核模块支持。如果你也遇到这些情况ELRepo基本是必经之路。这篇文章会从源本身的工作原理讲起把安装步骤、验证方法、内核升级、驱动安装、卸载回滚全部走一遍并把我在生产环境里踩过的坑一并写出来希望对正在折腾CentOS 7的朋友有用。2. ELRepo的工作机制与版本选择要点2.1 ELRepo源里到底有什么ELRepo按功能划分成几个不同的子仓库搞明白它们的区别非常关键因为装错子仓库轻则浪费磁盘和网络带宽重则可能引入和现有环境产生冲突的包。elrepo主仓库包含大量硬件驱动包、内核模块、文件系统工具等。例如kmod-nvidia、kmod-drbd、ntfs-3g这一类都在这里。elrepo-extras额外补充包包含一些不在主仓库但在企业环境里有需求的软件比如某些编译工具链、ACPI工具等。elrepo-kernel专门放内核的仓库提供kernel-lt长期支持版和kernel-ml主线最新版两种系列。elrepo-testing测试仓库包含尚未正式发布的候选包。除非你有明确的测试需求否则生产环境不要轻易启用。从适用性上讲日常90%的需求集中在主仓库和kernel仓库这两个上面。需要驱动装elrepo需要升级内核就启用elrepo-kernel。2.2 为什么CentOS 7必须用el7版本的ELRepo包ELRepo的安装包本身是区分RHEL大版本的CentOS 7对应RHEL 7所以要用的release包是elrepo-release-7.0-*。如果手滑装了el8或者el9版本系统会直接报错因为仓库元数据里面的$releasever变量会被解析成7而repo文件里写的却是8或9路径对不上yum自然无法正常拉取数据。一个很容易被忽略的细节是CentOS 7的小版本并不会影响ELRepo的选择无论你是7.6还是7.9都统一使用el7的release包。这是因为ELRepo针对的是RHEL大版本兼容性不会因为小版本差异修改仓库路径。还有一个架构问题。ELRepo在x86_64架构下可用性最好aarch64等架构虽然在个别版本里也有支持但驱动的可用性会差很多。我在ARM架构的CentOS 7机器上试过安装ELRepo主仓库能正常同步元数据但要装某些kmod驱动包时会找不到对应架构的预编译包最终只能走源码编译路线。所以如果你的机器不是x86_64装ELRepo之前要有心理准备。3. CentOS 7安装ELRepo的完整实操流程3.1 安装前的环境检查老规矩动手之前先确认当前系统状态。以下命令我每次都会先跑一遍cat /etc/redhat-release uname -r uname -m yum repolist第一行确认系统版本第二行看当前内核版本第三行确认架构第四行看当前已启用的仓库列表。之所以要看仓库列表是为了提前发现是否已经装过类似第三方源比如EPEL避免后续产生repo文件命名上的困惑。这里还有一个容易被忽略的点装EPEL和装ELRepo两者不冲突。EPEL提供的是大量通用软件包ELRepo专注内核和硬件二者各有分工。生产环境里很多人会把两个源同时启用这种情况非常普遍。3.2 导入GPG密钥的正确姿势ELRepo的包在安装release包时就需要校验签名所以第一步是导入ELRepo的GPG公钥。这里我推荐直接从ELRepo官网获取密钥ID然后使用rpm命令导入rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org导入之后建议确认一下密钥是否生效rpm -qa gpg-pubkey* | grep elrepo如果看到类似gpg-pubkey-8c0d3c19-*这样的输出说明密钥导入成功。从安全角度讲GPG密钥的作用是确保你装的rpm包确实由ELRepo官方签名没被篡改或替换所以这步不能跳过。3.3 安装elrepo-release包EPEL、ELRepo这类第三方源都是通过安装一个release小包来完成仓库配置的这个包会把/etc/yum.repos.d/elrepo.repo文件放到系统里后续yum就会自动识别。CentOS 7直接执行yum install -y https://www.elrepo.org/elrepo-release-7.0-6.el7.elrepo.noarch.rpm这里要特别说明版本号。早期版本是elrepo-release-7.0-2后来更新到elrepo-release-7.0-4、elrepo-release-7.0-6我安装时用的是7.0-6。如果官网后续更新了版本号请以官网最新路径为准。安装时如果提示找不到该URL说明版本号已经变化直接访问https://www.elrepo.org/看首页最新推荐的下载链接即可。安装完成后立刻检查repo文件cat /etc/yum.repos.d/elrepo.repo正常情况下你会看到[elrepo]、[elrepo-extras]、[elrepo-kernel]、[elrepo-testing]四个仓库段落。其中testing默认是enabled0其他三个默认enabled1。3.4 首次刷新缓存并验证仓库可用性仓库配置好了不代表一定能用还需要让yum刷新元数据yum clean all yum makecachemakecache会从ELRepo的镜像站拉取仓库元数据到本地缓存。如果网络状况不好这一步可能比较慢属正常现象。刷新完成后查看仓库状态yum repolist你应该能看到elrepo、elrepo-extras、elrepo-kernel这几行后面的仓库包数量不是0就说明同步成功。到了这一步ELRepo的安装就算完成了整个过程非常短。但实际使用中更关键的是下一步——怎么利用这个源解决自己的需求。4. 用ELRepo升级内核的正确方法与参数考量4.1 kernel-lt和kernel-ml怎么选ELRepo的kernel仓库里有两个内核系列这是很多人第一次接触ELRepo时最纠结的地方。kernel-ltLong Term Support长期支持版内核。不会追新但维护周期长bug修复持续跟进。生产环境首选。kernel-mlMainline Stable主线稳定版。更新节奏快通常比lt版本新很多但相对应的支持周期短大版本迭代频繁。我自己的经验是跑常规业务、数据库、虚拟化宿主机一律用kernel-lt有明确的新硬件支持需求或者需要测试新内核特性时再考虑kernel-ml。不建议在生产环境无脑上ml因为内核频繁大版本跳跃可能导致第三方内核模块编译失效。用yum搜索一下看有哪些包可用yum --enablerepoelrepo-kernel list kernel*输出里会列出kernel-lt、kernel-lt-devel、kernel-lt-tools、kernel-ml等包。建议把devel和tools一起装上因为后续如果需要编译第三方驱动模块比如某些网卡驱动开发包是必须的。4.2 安装新版内核的完整命令以kernel-lt为例安装命令如下yum --enablerepoelrepo-kernel install -y kernel-lt kernel-lt-devel kernel-lt-tools安装过程会覆盖新内核的vmlinuz、initramfs、模块目录等到/boot和/lib/modules下面。注意它不会自动删除旧内核这点很关键因为保留旧内核能给你留一条“后悔”的后路。安装完成后不要急着重启先确认grub的默认启动项grub2-editenv list输出里的saved_entry表示当前默认启动的菜单项。如果想直接用新内核启动需要重新生成grub配置grub2-mkconfig -o /boot/grub2/grub.cfg然后查看新内核在grub菜单里的序号awk -F\ $1menuentry {print i : $2} /etc/grub2.cfg找到对应新内核的条目序号后用grub2-set-default指定grub2-set-default 0这里数字0表示第一个菜单项具体以你自己查到的序号为准。设置完再执行一次grub2-editenv list确认saved_entry已经变成新内核的菜单项然后再重启。4.3 升级内核后必做的两项检查重启完成后第一件事就是确认内核是否真的切换成功uname -r看到输出里的版本号确实变成新装的lt或ml版本后还可以进一步检查内核模块加载情况lsmod | wc -l dmesg | grep -i errordmesg检查有没有明显的硬件初始化错误。很多时候新内核刚启动部分模块会因为固件缺失或配置不一致报错这些问题越早发现越好处理。另外建议保留至少一个旧内核不要急着用yum remove清理至少在系统稳定运行一周后再考虑清理。清理旧内核可以使用yum install yum-utils后执行package-cleanup --oldkernels --count2这样的工具命令也可以手动逐个删除。5. 利用ELRepo安装硬件驱动的实战经验5.1 kmod类驱动包的安装模式ELRepo主仓库里最常用的是kmod-开头的驱动包这类包的特点是会针对当前运行的内核版本自动编译或加载预编译的模块。例如NVIDIA显卡驱动对应的包名是kmod-nvidiaDRBD分布式存储块设备驱动对应kmod-drbdNTFS读写支持对应kmod-ntfs。安装驱动包之前有一个大前提当前系统内核版本必须和驱动包适配。如果你的内核是ELRepo的kernel-lt或kernel-ml那么用ELRepo源里的kmod驱动包兼容性最好因为它们会一起构建维护。如果你用的是CentOS 7官方内核某些新的kmod驱动包可能会因为内核API差异而无法加载。以NVIDIA驱动为例安装前先看下显卡型号lspci | grep -i nvidia确认型号后执行yum --enablerepoelrepo install -y kmod-nvidia安装完成后执行nvidia-smi如果能看到显卡信息说明驱动加载成功。如果没有输出先检查内核模块modprobe nvidia dmesg | tail -30这类问题多半出现在Secure Boot场景。CentOS 7在UEFI Secure Boot模式下会拒绝加载未签名的内核模块解决办法是关闭Secure Boot或者通过mokutil导入MOK签名。5.2 安装RHEL/CentOS官方源里没有的文件系统工具ELRepo里有一个经常被忽略但极其好用的包ntfs-3g。CentOS 7的官方源并不直接提供NTFS读写支持以前很多人是通过编译源码解决其实ELRepo直接就有yum --enablerepoelrepo install -y ntfs-3g安装后挂载NTFS分区时可以用ntfs-3g文件系统类型。这个方法比编译源码省事太多而且ELRepo的包会跟随内核版本做适配稳定性比手动编译更高。类似的还有exFAT支持对应exfat-utils和kmod-exfat。这类工具在日常运维中看似冷门但真遇到外置硬盘、U盘场景时能救命。5.3 驱动包安装后容易忽略的边界情况kmod类驱动包在安装时会重新生成initramfs核心原因是某些驱动模块必须在启动早期加载比如根文件系统所在的RAID控制器驱动。如果你装完驱动后发现重启后不生效需要手动重建initramfsdracut -f再确认一下模块是否在initramfs里lsinitrd | grep 模块名我遇到过几次类似情况最后发现都是因为新内核的initramfs生成时机不对手动执行dracut -f后问题立刻解决。这个问题在换了新内核再装驱动的时候尤其容易出现。6. 将ELRepo替换为国内镜像源加速下载6.1 为什么需要换镜像ELRepo的官方源架设在海外国内服务器直接访问时速度通常不理想makecache阶段尤其痛苦。如果你的服务器带宽不大一次完整刷新可能要等好几分钟安装内核或驱动包时更是容易超时。这时候把ELRepo换成国内镜像可以大幅提升效率。国内很多高校和企业镜像站都同步了ELRepo例如清华TUNA、中科大USTC等。以清华镜像为例路径结构为https://mirrors.tuna.tsinghua.edu.cn/elrepo/6.2 修改repo文件指向镜像源修改/etc/yum.repos.d/elrepo.repo把每个仓库段落下的baseurl换成镜像地址同时保留mirrorlist这行但不让它生效。实际操作中是注释掉mirrorlist然后手动加上baseurl。[elrepo] nameELRepo.org Community Enterprise Linux Repository - el7 baseurlhttps://mirrors.tuna.tsinghua.edu.cn/elrepo/el7/$basearch/ # mirrorlisthttp://mirrors.elrepo.org/mirrorlist-el7.elrepo enabled1 gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org四个仓库段落都要替换一遍。替换完执行yum clean all yum makecache这时候速度提升会非常明显国内服务器基本可以达到带宽上限。6.3 镜像源使用的常见坑镜像同步存在时间差。如果你刚在主站发布了一个新包镜像站可能还要过几个小时甚至一天才同步过去。如果你在镜像源上找不到某个包先切回官方源试试别急着怀疑包名写错。另外gpgcheck1这个配置不要因为图省事改成0。虽然镜像站本身不太可能被篡改但安全习惯是一层一层叠加的保留GPG校验不会让你多等多少时间却能防止供应链级别的风险。7. ELRepo的卸载与仓库禁用方法7.1 干净卸载ELRepo源如果哪天不想要ELRepo了卸载相当简单yum remove -y elrepo-release这会删除repo文件后续yum就不会再读取ELRepo的仓库信息了。但要注意已经通过ELRepo安装的软件包不会随release包卸载而自动删除。如果你装过ELRepo的内核或kmod驱动需要手动决定是保留还是替换。如果只是暂时不用不需要卸载把仓库禁用就可以了。编辑/etc/yum.repos.d/elrepo.repo把对应仓库段落的enabled1改成enabled0或者用yum命令指定yum --disablerepoelrepo --disablerepoelrepo-kernel update这样能在不解散仓库配置的前提下避免误安装ELRepo里的包。7.2 用ELRepo装的内核怎么回滚回滚内核的过程需要注意操作顺序。假设你装了kernel-lt后想回到CentOS官方内核操作逻辑是先确认当前在grub里旧的官方内核还在然后直接用yum把kernel-lt相关包删掉。yum remove -y kernel-lt kernel-lt-devel kernel-lt-tools删除后重新生成grub配置grub2-mkconfig -o /boot/grub2/grub.cfg grub2-set-default 0重启后用uname -r确认已经回到官方内核。这里有个新手容易踩的坑如果你在删除前就已经重启进了新内核且只保留了这一个内核那么删掉新内核后系统可能没有可用内核会直接进不了系统。所以要养成“回滚前先确认还有别的可用内核”的习惯。8. 常见问题与排查技巧实录8.1 yum makecache时报错“Cannot retrieve metalink”这是我最常看到的ELRepo问题之一。一般报错信息类似[Errno 14] curl#6 - Could not resolve host: mirrors.elrepo.org遇到这个报错先做基础网络排查ping mirrors.elrepo.org curl -I https://www.elrepo.org/如果确认网络没问题多半是DNS解析被干扰。这种情况在部分网络环境下会出现解决方式就是前面说的直接把repo文件切换到国内镜像源一劳永逸。8.2 GPG密钥校验失败装驱动或内核时提示Public key for xxx.rpm is not installed说明密钥没导入成功。重新导入一次rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org然后验证rpm -qa gpg-pubkey* | grep elrepo还有一种情况是密钥过期或更换了。如果导入还是报错直接访问ELRepo官网看最新的密钥导入指引按其推荐的密钥URL重新操作。8.3 找不到内核开发包导致驱动编译失败使用kernel-lt或kernel-ml后安装某些不在ELRepo预编译范围内的第三方驱动时需要编译此时必须有与当前内核版本精确匹配的kernel-devel或kernel-lt-devel包。用uname -r查看完整内核版本然后用yum list installed | grep kernel-devel确认开发包版本是否一致。不一致就手动安装对应版本的devel包yum --enablerepoelrepo-kernel install -y kernel-lt-devel-$(uname -r)注意这里的$(uname -r)要能解析成完整版本如5.4.xxx-1.el7.elrepo.x86_64yum仓库里要有这个精确版本才会装得上。8.4 kmod驱动加载时提示“Key was rejected by service”这是Secure Boot的典型症状。如果你用的是UEFI启动且开启了Secure Boot系统会拒绝加载没有经过签名的内核模块。最常见、最省事的处理方式是在BIOS里关掉Secure Boot但有些企业安全策略不允许关闭。这种场景下可以走MOK签名流程用mokutil --import /path/to/module.ko把模块导入MOK列表。重启进入MOK管理界面按提示启用该模块签名。进入系统后执行modprobe验证。签名流程有点繁琐但这是安全启动环境下的正统做法不建议通过关闭模块校验之类的手段绕过。9. 我的一些使用心得和后续扩展建议ELRepo这个源在我维护的服务器上扮演的角色更像是一个“内核与驱动补给站”。平时不会频繁用到但每次需要的时候都是刚需比如新硬件上线、存储驱动更新、内核特性验证。它和EPEL最大的区别就在于“少而精”没有把大量应用软件堆进来这让它的仓库结构和依赖关系都相对简单用起来放心很多。如果这个源你也是第一次使用建议先在测试环境完整走一遍“安装源-刷新缓存-升级内核-装一个kmod驱动-重启-验证”的流程熟悉之后再上生产。千万别直接在核心业务机器上第一次装就直接升内核万一遇到驱动不兼容或者启动顺序问题处理时间窗口很短。一个可以继续深入的方向是把ELRepo里值得装的包整理成一个自己的工具清单配合用yum install --enablerepoelrepo的形式按需启用而不是长期把所有子仓库都开着。这样既能享受ELRepo带来的新鲜内核和驱动支持又能把包管理面控制在最小范围降低依赖冲突的概率这是我在生产环境里比较推荐的做法。
返回列表