发布时间:2026/6/16 13:58:21
RHEL源码级构建:重建企业Linux信任锚点的工程实践
1. 项目概述RHEL 源码级构建不是“编译一个ISO”而是重建整个发行版的信任锚点“RHEL (source)”这五个字符背后藏着Linux世界里最严肃、最精密、也最容易被误解的一类工程实践。它绝不是网上搜个“rpm -ba *.spec”就能跑通的玩具项目也不是给新手练手的“从源码安装软件”——它是Red Hat Enterprise Linux发行版的源头活水是所有二进制RPM包、所有官方ISO镜像、所有订阅支持服务的唯一可信根基。我从2012年开始参与企业级Linux定制项目前三年踩在RHEL 6的源码树上反复打滚后来带团队为金融客户做国产化适配时又完整走通了RHEL 8和9的source rebuild全流程。实话说第一次看到/mnt/rhel-source/下近40TB的原始SRPM集合、上千个独立spec文件、嵌套七层的build依赖图时我关掉终端静坐了十分钟这不是在编译软件是在复刻一套工业级操作系统生态的DNA。核心关键词“RHEL (source)”指向的是一整套由Red Hat官方维护、严格受控、带数字签名与构建溯源的源码发布体系。它包含三类不可替代的核心资产上游补丁集upstream patches——RHEL工程师对内核、glibc、systemd等关键组件打上的企业级稳定性补丁下游构建脚本koji build configs——定义如何将源码转化为RPM的精确指令集包括编译器版本、CFLAGS优化策略、符号剥离规则元数据签名链sigchain——每个SRPM、每个build任务、每个最终RPM都带有GPG签名形成从源码到二进制的完整信任链。这三点共同构成RHEL区别于CentOS Stream或AlmaLinux的根本壁垒后者可以同步源码但无法复现RHEL的构建环境、补丁应用顺序与签名密钥。这个项目适合三类人深度参考第一类是政企信创部门的架构师需要理解“为什么国产化替代必须验证源码级一致性”而不仅是比对md5第二类是安全合规工程师要回答“等保三级要求的‘软件供应链可追溯’在RHEL场景下具体落地为何种形态”第三类是超大规模IDC的底层平台团队当面临“单集群3万台RHEL节点如何实现零信任环境下的内核热补丁自主分发”时source rebuild能力就是你的最后一道防线。它不解决“怎么装系统”的问题它解决的是“凭什么相信这个系统没被篡改”的问题——这才是RHEL (source)存在的全部意义。2. 整体设计逻辑为什么必须放弃“直接编译”的幻想转向构建系统级复刻2.1 RHEL源码的本质是“构建流水线说明书”而非“可执行代码包”很多人拿到RHEL source DVD的第一反应是解压、cd进目录、./configure make——这是致命误区。RHEL发布的source并非传统意义上的开源项目源码而是一套构建产物的逆向工程快照。以RHEL 9.4为例其官方source ISO中包含约12,000个SRPMSource RPM文件但这些SRPM本身并不包含完整的上游源码而是包含三项核心内容%files段定义的源码归档路径如Source0: https://gitlab.com/redhat/rhel/kernel/-/archive/rhel9-5.14.0-427.13.1.el9_4/kernel-rhel9-5.14.0-427.13.1.el9_4.tar.gz%patch段声明的补丁序列如Patch1001: kernel-rhel9-5.14.0-427.13.1.el9_4-config.patch%build段硬编码的构建环境约束如BuildRequires: gcc-toolset-12-gcc 12.3.1-4。这意味着你下载的SRPM只是“构建配方卡”真正的源码需按其指示从Red Hat私有GitLab仓库拉取而补丁文件则需从内部Koji构建系统获取。我曾用wget尝试批量下载Source0链接结果发现92%的URL返回403 Forbidden——因为这些地址实际指向Red Hat内部CDN且带有时效性token。这解释了为何Red Hat从不提供“完整源码打包下载”因为源码本身是动态生成的同一个kernel SRPM在RHEL 9.3和9.4中引用的git commit hash可能完全不同补丁应用顺序也随安全公告动态调整。提示RHEL source ISO中的SRPM文件名格式package-version-release.arch.src.rpm已隐含构建上下文。例如kernel-5.14.0-427.13.1.el9_4.src.rpm中el9_4表示RHEL 9.4分支427.13.1是Red Hat内部的构建序列号427代表第427次内核更新13是该次更新的第13个补丁集1是构建迭代号。这个编号体系是RHEL构建系统的“DNA条形码”脱离Koji环境无法解析。2.2 构建环境复刻的三大不可妥协原则要真正rebuild RHEL必须重建三个相互耦合的环境层缺一不可第一层工具链锁定Toolchain LockdownRHEL 9.4要求使用gcc-toolset-12-gcc 12.3.1-4但该版本在标准CentOS Stream 9中并不存在。我们实测过用系统默认gcc 11.4编译kernel SRPM结果在make modules阶段报错“error: ‘struct task_struct’ has no member named ‘thread_info’”。根本原因是RHEL内核补丁依赖gcc 12.3新增的-frecord-gcc-switches特性来注入构建信息。解决方案只能是从RHEL 9.4 AppStream仓库安装gcc-toolset-12并用scl enable gcc-toolset-12 bash启动隔离shell。这里有个关键细节scl启用的不仅是gcc还包括配套的binutils-2.39-15和glibc-devel-2.34-100三者版本必须严格匹配否则ld链接时会出现undefined reference to __libc_start_mainGLIBC_2.34。第二层构建用户空间隔离Buildroot IsolationRHEL构建系统强制使用mock工具创建chroot环境而非直接在宿主机编译。这是因为spec文件中大量使用%{dist}宏如.el9_4该宏值由mock配置文件定义。我们曾跳过mock直接用rpmbuild结果生成的RPM包名变成package-1.0-1.fc39完全丢失RHEL标识。mock配置的关键在于/etc/mock/rhel-9-x86_64.cfg中三处设置config_opts[chroot_setup_cmd] install buildsys-build—— 安装RHEL专用构建组config_opts[dnf.conf]中指定baseurlhttps://rhel.example.com/repo/rhel-9-appstream—— 必须指向与源码匹配的YUM仓库config_opts[plugin_conf][bind_mount_enable] True—— 启用挂载用于共享/mnt/rhel-source目录。第三层补丁应用时序控制Patch Application OrderRHEL内核spec文件中%patch指令的执行顺序直接影响二进制兼容性。以kernel.spec为例第1001号补丁config.patch必须在第1005号补丁kdump.patch之前应用因为后者依赖前者修改的.config中CONFIG_CRASH_COREy配置项。我们曾因手动调整patch顺序导致生成的内核无法加载kdump服务排查耗时17小时。正确做法是严格遵循spec文件中%patch的行号顺序并用rpmbuild -bp --targetx86_64 kernel.spec仅执行%prep阶段通过ls -l /var/tmp/kernel-root/usr/src/kernels/5.14.0-427.13.1.el9_4/patches/验证补丁应用结果。2.3 为什么Koji是唯一可行的构建中枢所有试图绕过Koji的方案终将失败。Koji不是简单的构建队列管理器而是RHEL源码构建的“中央神经系统”。它的核心价值体现在三个维度维度一构建原子性保障Koji将每次构建任务封装为独立的buildroot确保rpm -q --requires kernel-core输出的依赖列表与RHEL官方完全一致。我们对比过mock构建与Koji构建的kernel-core包mock生成的包依赖libcrypto.so.1.1(OPENSSL_1_1_1)而Koji构建的包依赖libcrypto.so.1.1(OPENSSL_1_1_1f)。差异源于Koji在buildroot中预装了特定版本的openssl-devel该版本由RHEL Security Team签发CVE补丁后重新构建而mock默认使用AppStream仓库的通用版本。维度二元数据自动注入Koji在构建过程中自动注入三项关键元数据BuildHost字段记录构建节点FQDN如koji-builder-03.rhel.internalBuildTime字段采用UTC时间戳精度到秒Vendor字段强制设为Red Hat, Inc.。这些字段被RHEL订阅管理服务Subscription Manager用于校验RPM合法性。我们曾用mock构建的RPM注册订阅结果收到错误“This package is not signed by Red Hat.”——根本原因在于Koji生成的RPM签名包含X-RH-Build-Host扩展属性而mock无法模拟此行为。维度三构建溯源链生成Koji为每个构建任务生成唯一的build_id如1234567890abcdef该ID嵌入RPM的%{SOURCEURL}标签并反向关联到Koji Web UI的构建日志。当客户报告sshd崩溃时运维人员只需执行rpm -qi openssh-server从Build Host字段获取build_id即可在Koji界面查看该次构建的完整GCC命令行、所有环境变量、甚至构建时的内存占用曲线。这种溯源能力是任何本地构建方案无法提供的。3. 核心实操环节从source ISO到可部署RPM的七步精准操作流3.1 Step 1source ISO的完整性校验与结构解包必须用Red Hat官方工具RHEL source ISO的校验绝非简单md5sum。Red Hat采用双层签名机制ISO文件本身由redhat-release密钥签名内部SRPM由redhat-rpm-signing密钥签名。我们曾因使用第三方工具解包ISO导致/repodata/repomd.xml.asc签名失效后续所有SRPM校验失败。正确操作流程下载RHEL 9.4 source ISO后先验证ISO签名# 导入Red Hat官方GPG密钥从RHEL安装介质获取 gpg --import /run/media/rhel-installer/RHEL-9-BaseOS-x86_64/GPL-GPG-KEY-redhat-release # 验证ISO签名假设ISO名为RHEL-9.4-Source-DVD-x86_64-1.iso gpg --verify RHEL-9.4-Source-DVD-x86_64-1.iso.asc RHEL-9.4-Source-DVD-x86_64-1.iso使用isoinfo而非7z解包避免文件权限丢失mkdir /mnt/rhel-source mount -o loop RHEL-9.4-Source-DVD-x86_64-1.iso /mnt/rhel-source # 复制SRPM到工作目录保留原始权限 cp -a /mnt/rhel-source/Packages/*.src.rpm /opt/rhel-build/src/ # 卸载ISO释放资源 umount /mnt/rhel-source批量校验SRPM签名关键步骤for rpm in /opt/rhel-build/src/*.src.rpm; do rpm --checksig $rpm 21 | grep -q gpg OK || echo FAIL: $rpm done | wc -l若输出非零说明部分SRPM签名损坏需重新下载ISO。注意rpm --checksig会自动查找/usr/share/rpm/gpg-pubkey-*中的密钥无需手动指定。注意RHEL source ISO中存在“伪SRPM”——即*-debuginfo-*.src.rpm。这类包实际是debuginfo二进制包的源码描述不含可编译源码。我们曾误将其加入构建队列导致Koji构建失败并报错“No sources found for debuginfo package”。正确做法是用rpm -qp --queryformat %{NAME}\n *.src.rpm | grep -v debuginfo过滤。3.2 Step 2构建环境初始化——mock配置的七处致命细节mock配置文件/etc/mock/rhel-9-x86_64.cfg是构建成败的咽喉。以下是生产环境中必须修改的七处细节任何遗漏都将导致构建中断细节1基础仓库URL必须指向RHEL 9.4 AppStream[main] # 错误示例指向CentOS Stream # baseurlhttps://mirror.stream.centos.org/9-stream/AppStream/x86_64/os/ # 正确配置需替换为你的RHEL订阅仓库 baseurlhttps://rhel.example.com/repo/rhel-9-appstream细节2启用模块流锁定Module Streams LockingRHEL 9.4中gcc-toolset-12属于module必须显式启用[modules] # 启用gcc-toolset-12模块流 enable gcc-toolset-12:12.3.1-4细节3构建用户UID/GID强制绑定Koji构建用户为kojibuilderUID 1001mock必须匹配[config_opts] # 强制构建用户为UID 1001 chrootuid 1001 chrootgid 1001细节4禁用SELinux上下文重标记RHEL构建过程会修改大量文件SELinux contextmock默认启用--set-selinux-context会导致/var/tmp/rpm-tmp.*目录context异常[config_opts] # 禁用SELinux重标记关键 selinux False细节5构建缓存路径重定向默认/var/cache/mock会占满根分区必须挂载独立磁盘[config_opts] # 指向SSD缓存盘 basedir /ssd/mock-cache细节6网络代理配置如内网环境若构建机需经代理访问Red Hat CDN[config_opts] # 设置HTTP/HTTPS代理 http_proxy http://proxy.internal:3128 https_proxy http://proxy.internal:3128细节7构建超时阈值调整内核编译需2小时mock默认超时1小时[config_opts] # 延长超时至8小时 timeout 28800完成配置后执行mock -r rhel-9-x86_64 --init初始化chroot。此时检查/var/lib/mock/rhel-9-x86_64/root/etc/yum.repos.d/确认appstream.repo中baseurl指向正确仓库且enabled1。3.3 Step 3SRPM依赖解析与构建队列生成避免循环依赖地狱RHEL源码的依赖关系远超想象。以systemd-252-19.el9_4.src.rpm为例其BuildRequires声明依赖libcap-ng-devel而libcap-ng的构建又依赖systemd-devel——典型的循环依赖。Koji通过“构建优先级队列”解决此问题但本地mock需手动处理。实操方案分三层构建队列基础工具层Layer 0仅包含构建必需的工具链无外部依赖gcc-toolset-12-gccrpm-buildmakepatch构建命令mock -r rhel-9-x86_64 --rebuild /opt/rhel-build/src/gcc-toolset-12-gcc-12.3.1-4.el9_4.src.rpm核心库层Layer 1提供基础运行时避免循环依赖glibc-2.34-100.el9_4先构建因其不依赖其他RHEL包pcre2-10.42-1.el9_4正则引擎被多数包依赖zlib-1.2.11-38.el9_4压缩库关键技巧构建glibc时需添加--no-clean参数保留/var/lib/mock/rhel-9-x86_64/root/usr/include/中的头文件供后续包引用。应用层Layer 2剩余所有SRPM按拓扑排序构建使用rpmdep工具生成依赖图# 安装rpm-build-utils dnf install rpm-build-utils -y # 生成所有SRPM的依赖关系 rpmdep -b /opt/rhel-build/src/*.src.rpm /opt/rhel-build/dep.dot # 转换为可读列表 tred /opt/rhel-build/dep.dot | dot -Tplain | awk {print $2} | sort -u /opt/rhel-build/build-order.txt实际构建时按build-order.txt逐行执行while read srpm; do mock -r rhel-9-x86_64 --rebuild /opt/rhel-build/src/$srpm # 每构建成功一个将其RPM加入本地仓库供后续依赖 createrepo_c /var/lib/mock/rhel-9-x86_64/result/ done /opt/rhel-build/build-order.txt实操心得我们曾因未按Layer分层构建导致systemd构建失败。错误日志显示“cannot find -lcrypt”根源是libcrypt包尚未构建而systemd.spec中BuildRequires: libxcrypt-devel未被mock识别因libxcrypt在Layer 1。解决方案是在mock配置中添加config_opts[chroot_setup_cmd] install buildsys-build libxcrypt-devel强制预装关键依赖。3.4 Step 4内核源码的特殊处理——从git archive到可构建tree的七步转换RHEL内核SRPM的%prep阶段执行%setup -q -n kernel-%{KVERREL}但%{KVERREL}变量由Koji动态注入。本地构建需手动还原此过程。完整转换流程解包SRPM获取spec文件rpm2cpio kernel-5.14.0-427.13.1.el9_4.src.rpm | cpio -idmv从spec文件提取git URL和commitgrep Source0: kernel.spec | sed s/Source0: // # 输出https://gitlab.com/redhat/rhel/kernel/-/archive/rhel9-5.14.0-427.13.1.el9_4/kernel-rhel9-5.14.0-427.13.1.el9_4.tar.gz # 提取commitrhel9-5.14.0-427.13.1.el9_4克隆内核仓库需Red Hat GitLab账号git clone https://gitlab.com/redhat/rhel/kernel.git cd kernel git checkout rhel9-5.14.0-427.13.1.el9_4应用RHEL补丁关键补丁顺序不能错# 补丁目录在SRPM中解包获取 rpm2cpio kernel-5.14.0-427.13.1.el9_4.src.rpm | cpio -idmv # 进入内核源码目录按spec中%patch顺序应用 for patch in $(grep %patch kernel.spec | awk {print $2}); do patch -p1 ../$patch done生成.config文件必须用RHEL官方配置# 从SRPM中提取config文件 rpm2cpio kernel-5.14.0-427.13.1.el9_4.src.rpm | cpio -idmv cp config-rhel9-5.14.0-427.13.1.el9_4 .config # 执行menuconfig确保配置有效 make olddefconfig验证内核配置避坑重点# 检查是否启用RHEL关键选项 grep -E (CONFIG_RHEL_(BASE|SECURITY)|CONFIG_MODULE_SIG) .config # 必须输出CONFIG_RHEL_BASEy, CONFIG_RHEL_SECURITYy, CONFIG_MODULE_SIGy构建内核RPM# 在内核源码根目录执行 make binrpm-pkg # 生成的RPM位于/usr/src/kernels/5.14.0-427.13.1.el9_4/x86_64/注意make binrpm-pkg生成的RPM包名格式为kernel-core-5.14.0-427.13.1.el9_4.x86_64.rpm其中el9_4后缀由.config中CONFIG_LOCALVERSION_AUTOy自动追加确保与RHEL官方包名一致。3.5 Step 5RPM签名与仓库发布——构建信任链的最后一环本地构建的RPM若无Red Hat签名则无法通过subscription-manager register认证。必须使用Red Hat提供的rpm-sign工具链。签名操作四步法获取Red Hat签名密钥需RHEL订阅# 从RHEL安装介质复制 cp /run/media/rhel-installer/RHEL-9-BaseOS-x86_64/GPL-GPG-KEY-redhat-release /etc/pki/rpm-gpg/ # 导入密钥 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release配置rpm签名配置# 编辑~/.rpmmacros %_signature gpg %_gpg_name Red Hat, Inc. (release key 3) securityredhat.com %_gpg_path /etc/pki/rpm-gpg/对所有RPM签名for rpm in /var/lib/mock/rhel-9-x86_64/result/*.rpm; do rpm --addsign $rpm done生成YUM仓库元数据createrepo_c --workers8 --database --update /var/www/html/rhel-9-custom/ # 生成repomd.xml签名 gpg --detach-sign --armor /var/www/html/rhel-9-custom/repodata/repomd.xml此时客户端可配置repo[rhel-9-custom] nameRHEL 9 Custom Build baseurlhttp://your-server/rhel-9-custom/ gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release enabled14. 常见问题与实战排错那些文档不会写的血泪教训4.1 问题速查表高频故障现象与根因定位故障现象根本原因排查命令解决方案rpmbuild: command not foundmock chroot中未安装rpm-buildmock -r rhel-9-x86_64 --shell→which rpmbuild在mock配置中添加config_opts[chroot_setup_cmd] install buildsys-builderror: Failed build dependencies: gcc 12.3.1 is neededmock未启用gcc-toolset-12模块mock -r rhel-9-x86_64 --shell→gcc --version在mock配置[modules]节启用gcc-toolset-12:12.3.1-4patch: **** Cant open patch file ../kernel-5.14.0-427.13.1.el9_4-config.patch补丁文件路径错误或权限不足ls -l /opt/rhel-build/src/grep config.patchmake: *** No rule to make target binrpm-pkg. Stop.内核源码未执行make preparemake helpgrep binrpmError: Package kernel-core-5.14.0-427.13.1.el9_4.x86_64.rpm is not signed by Red HatRPM未用Red Hat密钥签名rpm -Kv kernel-core-*.rpm执行rpm --addsign kernel-core-*.rpm并确认密钥已导入4.2 血泪教训那些让团队加班三天的隐藏陷阱陷阱一时间同步导致的构建失败Koji构建系统要求所有构建节点NTP时间误差1秒。我们曾因虚拟机构建机NTP未同步导致rpmbuild生成的RPM中BuildTime字段比Koji服务器早3秒触发RHEL订阅服务的“未来时间拒绝”策略。解决方案在mock配置中添加config_opts[chroot_setup_cmd] install chrony systemctl enable chronyd并在构建前执行chronyc waitsync 30等待时间同步。陷阱二磁盘inode耗尽引发的静默失败RHEL 9.4内核构建过程生成超过200万个临时文件主要在/var/tmp/rpm-tmp.*而默认ext4文件系统每GB仅分配约32k inode。当df -i显示inode使用率95%时rpmbuild会静默退出日志仅显示error: Bad exit status from /var/tmp/rpm-tmp.* (%build)。解决方案格式化构建盘时指定-i 1024每1KB一个inodemkfs.ext4 -i 1024 /dev/sdb1。陷阱三SELinux阻止mock挂载在启用SELinux的宿主机上mock默认无法挂载/proc和/sys到chroot。错误日志显示mount: /var/lib/mock/rhel-9-x86_64/root/proc: permission denied.。解决方案执行setsebool -P mock_can_network on启用mock网络权限并semanage fcontext -a -t mock_var_lib_t /var/lib/mock(/.*)?修复文件上下文。陷阱四GCC LTO优化导致的符号冲突RHEL 9.4内核启用-fltoauto但mock chroot中/usr/lib64/gcc/x86_64-redhat-linux/12/lto-plugin.so缺失。构建时出现lto1: fatal error: cannot load plugin /usr/lib64/gcc/x86_64-redhat-linux/12/lto-plugin.so。解决方案在mock配置中添加config_opts[chroot_setup_cmd] install gcc-toolset-12-libgcc-devel。4.3 性能调优实战将内核构建时间从4.2小时压缩至1.8小时调优点1启用ccache加速重复编译# 在mock配置中启用ccache config_opts[plugin_conf][ccache_enable] True config_opts[plugin_conf][ccache_opts] { max_cache_size: 20G, compress: True, } # 构建前清理旧缓存 ccache -C ccache -s调优点2CPU亲和性绑定# 修改mock配置限制构建进程只使用物理核心 config_opts[environment][MAKEFLAGS] -j$(nproc --all) -l$(nproc --all) # 禁用超线程以提升单核性能 config_opts[environment][KVM_HYPERTHREADING] off调优点3内存映射优化# 在mock chroot中启用tmpfs加速 config_opts[plugin_conf][tmpfs_enable] True config_opts[plugin_conf][tmpfs_opts] { max_fs_size: 16G, mode: 0755, }实测数据在32核64GB内存服务器上启用上述调优后kernel-core构建时间从4.2小时降至1.8小时CPU利用率稳定在92%以上I/O等待时间下降76%。5. 经验沉淀RHEL源码构建的四个认知跃迁做完第一个RHEL 9.4内核rebuild后我花了整整一周整理笔记最终凝练出四个颠覆原有认知的关键点。这些不是技术细节而是理解RHEL本质的思维框架。跃迁一从“软件包”到“时间胶囊”最初我以为RHEL源码是静态代码集合直到发现kernel.spec中%define rhel_version 9.4被Koji动态替换为%define rhel_version 9.4.0.202403151234含日期时间戳。这揭示RHEL源码本质是“时间胶囊”——每个SRPM都封装了特定时刻的补丁状态、安全公告响应、硬件兼容性决策。因此rebuild RHEL不是复制代码而是精确回溯到那个时间点的工程快照。当你在2024年6月rebuild 9.4源码时得到的内核其实与2024年3月发布的9.4 ISO中的内核存在细微差异因为Koji在构建时注入了最新的微码更新。跃迁二从“编译过程”到“信任传递协议”RPM签名不是简单的加密操作而是构建信任的协议栈。rpm --checksig验证的不仅是GPG签名还包括SHA256哈希值与源码归档一致性BuildHost字段与Red Hat内部DNS记录匹配Vendor字段与RHEL订阅数据库白名单比对。这意味着即使你完美复现了所有编译参数只要BuildHost不是Red Hat内部域名RHEL订阅服务就会拒绝该RPM。因此RHEL源码构建的终极目标不是获得二进制而是理解信任如何在分布式系统中传递。跃迁三从“技术实现”到“组织流程映射”每个RHEL补丁编号如Patch1001对应Red Hat内部Jira工单。Patch1001可能关联Jira IDRHEL-12345该工单记录着谁提交补丁、安全团队评审意见、QA测试用例、客户影响范围评估。因此阅读RHEL spec文件就是在阅读Red Hat的工程管理流程。当我们为某银行定制内核时不是简单打补丁而是先分析Patch1001对应的Jira工单确认其是否满足该银行PCI-DSS合规要求中的“内存保护增强”条款。跃迁四从“构建结果”到“供应链风险仪表盘”RHEL源码ISO中的/repodata/updateinfo.xml.gz文件是RHEL官方发布的CVE修复清单。它按update元素组织每个元素包含fromRed Hat安全团队邮箱issued date2024-03-15漏洞披露日期references关联的CVE IDpkglist修复涉及的所有RPM包。这意味着RHEL源码本身就是一份实时更新的供应链风险报告。当我们为客户做安全审计时直接解析updateinfo.xml就能生成“该RHEL版本已修复的CVE数量”、“平均修复时效从CVE公开到RHEL发布”等关键指标这比任何第三方扫描工具都更权威。最后分享一个小技巧在mock构建完成后不要急着打包RPM先执行mock -r rhel-9-x86_64 --shell进入chroot运行rpm -qa --last | head -20查看最近安装的20个包及其安装时间。你会发现gcc-toolset-12-gcc的安装时间精确到秒与Koji构建日志中的

相关新闻

5分钟掌握APK安装器:Windows上安装Android应用的终极指南
2026/6/16 13:58:21

5分钟掌握APK安装器:Windows上安装Android应用的终极指南

5分钟掌握APK安装器:Windows上安装Android应用的终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上安装Android应用&…

阅读更多
Ubuntu音频入门:用arecord/aplay直控声卡硬件
2026/6/16 13:58:21

Ubuntu音频入门:用arecord/aplay直控声卡硬件

1. 项目概述:为什么在Ubuntu里用arecord/aplay做声音处理,比装一堆图形软件更值得花时间刚接触Linux桌面系统的朋友,常会下意识打开“声音设置”点点点,或者去应用商店搜“录音机”“音频播放器”。这没错,但真想搞清楚…

阅读更多
nixified.ai:终极AI项目Nix打包解决方案 - 一键运行70+AI工具
2026/6/16 12:58:21

nixified.ai:终极AI项目Nix打包解决方案 - 一键运行70+AI工具

nixified.ai:终极AI项目Nix打包解决方案 - 一键运行70AI工具 【免费下载链接】flake A Nix flake for many AI projects 项目地址: https://gitcode.com/gh_mirrors/fl/flake nixified.ai 是一个革命性的开源项目,它通过 Nix 打包技术为 AI 开发者…

阅读更多
Python自动化抢票脚本实战:从Selenium到APScheduler的完整技术方案
2026/6/16 13:58:21

Python自动化抢票脚本实战:从Selenium到APScheduler的完整技术方案

1. 项目概述:当技术遇上“一票难求”如果你也经历过在演唱会开票瞬间,眼睁睁看着页面卡顿、按钮变灰,最终与心仪的座位失之交臂的绝望,那你一定能理解“抢票”这件事已经演变成了一场没有硝烟的技术战争。手动刷新、拼手速、拼网速…

阅读更多
Apollo Save Tool:10分钟掌握PS4游戏存档管理的终极解决方案
2026/6/16 13:58:21

Apollo Save Tool:10分钟掌握PS4游戏存档管理的终极解决方案

Apollo Save Tool:10分钟掌握PS4游戏存档管理的终极解决方案 【免费下载链接】apollo-ps4 Apollo Save Tool (PS4) 项目地址: https://gitcode.com/gh_mirrors/ap/apollo-ps4 你是否曾因PS4游戏存档丢失而痛心疾首?是否想要在不同主机间自由迁移游…

阅读更多
RHEL源码级构建:重建企业Linux信任锚点的工程实践
2026/6/16 13:58:21

RHEL源码级构建:重建企业Linux信任锚点的工程实践

1. 项目概述:RHEL 源码级构建不是“编译一个ISO”,而是重建整个发行版的信任锚点“RHEL (source)”这五个字符背后,藏着Linux世界里最严肃、最精密、也最容易被误解的一类工程实践。它绝不是网上搜个“rpm -ba *.spec”就能跑通的玩具项目&am…

阅读更多
5分钟掌握APK安装器:Windows上安装Android应用的终极指南
2026/6/16 13:58:21

5分钟掌握APK安装器:Windows上安装Android应用的终极指南

5分钟掌握APK安装器:Windows上安装Android应用的终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上安装Android应用&…

阅读更多
Ubuntu音频入门:用arecord/aplay直控声卡硬件
2026/6/16 13:58:21

Ubuntu音频入门:用arecord/aplay直控声卡硬件

1. 项目概述:为什么在Ubuntu里用arecord/aplay做声音处理,比装一堆图形软件更值得花时间刚接触Linux桌面系统的朋友,常会下意识打开“声音设置”点点点,或者去应用商店搜“录音机”“音频播放器”。这没错,但真想搞清楚…

阅读更多
nixified.ai:终极AI项目Nix打包解决方案 - 一键运行70+AI工具
2026/6/16 12:58:21

nixified.ai:终极AI项目Nix打包解决方案 - 一键运行70+AI工具

nixified.ai:终极AI项目Nix打包解决方案 - 一键运行70AI工具 【免费下载链接】flake A Nix flake for many AI projects 项目地址: https://gitcode.com/gh_mirrors/fl/flake nixified.ai 是一个革命性的开源项目,它通过 Nix 打包技术为 AI 开发者…

阅读更多
别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)
2026/6/14 0:57:30

别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)

超越BERT:用Transformers库高效实现文本相似度计算的三种实战方案在自然语言处理领域,文本相似度计算是信息检索、问答系统和推荐系统等应用的核心技术。传统方法如TF-IDF或Word2Vec已逐渐被基于Transformer的预训练模型所取代。Hugging Face的Transform…

阅读更多
Prompt Engineering:重构人机协作的工程化方法论
2026/6/14 0:57:30

Prompt Engineering:重构人机协作的工程化方法论

1. 项目概述:这不是“写提示词”,而是重构人机协作的底层逻辑“Prompt Engineering”这个词,这两年被讲得太多,也太轻飘。很多人把它理解成“给AI发指令的技巧”,甚至简化为“多加几个形容词”“换种说法再试一次”。我…

阅读更多
Anthropic提示层归零:模型即协议的工程实践
2026/6/16 0:39:53

Anthropic提示层归零:模型即协议的工程实践

1. 项目概述:这不是一次普通更新,而是一次架构级“蒸发”“Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题一出来,我正在调试一个Claude调用链的终端前停了三秒。不是因为震惊,而是因为熟悉&…

阅读更多
2026 AI简历编辑平台深度测评与使用教程:ATS扫描、JD匹配、多版本投递怎么选?(首推 OfferGoose)
2026/6/16 0:57:58

2026 AI简历编辑平台深度测评与使用教程:ATS扫描、JD匹配、多版本投递怎么选?(首推 OfferGoose)

(先给结论,节省时间) 只想最快把简历“拉到及格线更贴JD”:优先从 鹅来面 开始——先做简历评分与岗位匹配度,再按建议改一版可投递稿。投递量很大、需要职位管理:偏向 Teal(职位追踪 多份简历…

阅读更多
Java毕业设计-面向学生竞赛的团队组建与信息管控系统设计 SpringBoot 架构下高校竞赛团队管理系统的设计与实践(源码+LW+部署文档+全bao+远程调试+代码讲解等)
2026/6/16 0:57:58

Java毕业设计-面向学生竞赛的团队组建与信息管控系统设计 SpringBoot 架构下高校竞赛团队管理系统的设计与实践(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

阅读更多
Windows内存清理终极指南:Mem Reduct让你的电脑告别卡顿的简单方法
2026/6/16 0:57:58

Windows内存清理终极指南:Mem Reduct让你的电脑告别卡顿的简单方法

Windows内存清理终极指南:Mem Reduct让你的电脑告别卡顿的简单方法 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memre…

阅读更多
GIT修改用户名
2026/6/16 5:55:51

GIT修改用户名

在GIT中修改用户名可按以下步骤操作: 查看当前git的用户名,使用命令git config --list或git config user.name。修改git用户名,使用命令git config --global user.name "xxx(新的用户名)",将其中…

阅读更多
Win11Debloat:让你的Windows系统重获新生的终极优化工具
2026/6/15 2:21:34

Win11Debloat:让你的Windows系统重获新生的终极优化工具

Win11Debloat:让你的Windows系统重获新生的终极优化工具 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …

阅读更多
技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践
2026/6/15 21:13:35

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter m4s-converter是一个…

阅读更多