oracle 23c free 的 rpm 包硬依赖 el8 内核 abi 和系统库符号,不兼容 el9;其 requires 约束 kernel >=4.18.0-305 且

Oracle 23c 的 RPM 包硬依赖 EL8 内核 ABI 和系统库符号
Oracle 23c Free 的 oracle-database-free-23c RPM 不是通用二进制,它在构建时明确链接了 EL8(如 Oracle Linux 8、CentOS Stream 8)内核和用户态环境提供的特定符号与行为。这不是“建议”,而是安装时 rpm 或 dnf 直接校验失败的硬约束。
常见错误现象包括:
-
Failed dependencies: kernel >= 4.18.0-305 is needed(RHEL9 默认内核是 5.14+,但 ABI 已变) -
error: Failed dependencies: libcrypto.so.10()(64bit) is needed(EL9 提供的是libcrypto.so.11,且符号不兼容) -
cannot install rpm package后无进一步提示,实际卡在 glibc 或 audit 库版本校验环节
根本原因不是“版本号高低”,而是以下三点:
- EL8 使用的
glibc-2.28提供的 syscall 封装、NSS 模块接口与 EL9 的glibc-2.34存在不兼容变更 - Oracle 23c 二进制中调用的
audit_log_acct_message等审计 API 在 EL9 中已被重命名或移除 - RPM spec 文件里写死了
Requires: kernel >= 4.18.0-305 ,EL9 内核(5.14+)直接被包管理器拒收
dnf install oracle-database-free-23c 报错时先查内核和发行版 ID
执行以下命令确认真实环境,别只看 uname -r:
cat /etc/redhat-release
rpm -q --whatprovides kernel | head -1
awk -F= '/^ID=/ {print $2}' /etc/os-release
若输出含 ol9、rhel9 或 centos-stream-9,哪怕内核是 4.18.x(手动降级过),也无效——因为 /usr/lib/os-release 中的 DISTRO_ID 已被 Oracle CVU 工具用于判断是否跳过兼容性检查。
此时唯一合规路径是换用 oracle-database-free-23ai(23ai 是 23c 的正式继任者,RPM 原生支持 EL9)。
compat-openssl10 强制安装不能绕过内核版本限制
有人尝试用 rpm -ivh compat-openssl10-*.el9.rpm --force --nodeps 解决 libcrypto 问题,但这只覆盖了 OpenSSL 层。后续仍会失败于:
-
/etc/init.d/oracle-free-23c configure启动时因CVU检测到OL9而拒绝初始化数据库 - 监听器
lsnrctl start失败,报TNS-12547: Lost contact,实际是 socket 选项(如SO_KEEPALIVE行为)在新内核中被调整 - 即使强行启动,
sqlplus / as sysdba连接后执行SELECT * FROM v$version;会 segfault —— 因为libclntsh.so.23.1依赖的libpthread符号版本不匹配
真正关键的边界不在 OpenSSL,而在内核 ABI、glibc、audit 和 systemd 的四层耦合。任何试图“打补丁绕过”的操作,都会在 configure 或首次建库阶段暴露不可恢复的静默崩溃。











