具体报错如下面代码,是说找不到共享库libnsl.so.1
,因此无法进行安装。
/u01/app/oracle/product/19.3.0/dbhome_1/perl/bin/perl: error while loading shared libraries: libnsl.so.1: cannot open shared object file: No such file or directory
复制
1. libnsl和libnsl.so.1是什么关系?
libnsl是库名称,在安装好以后,会在/lib64目录下生成实际的库文件libnsl.so.1.0.0
,而libnsl.so.1
是libnsl.so.1.0.0
的软链接。
2.libnsl
是干什么的?
这个介绍的材料不多,且关于LInux底层开发的一些东西。但我还是想弄清楚Oracle在安装的时候为什么要依赖这个。
要了解libnsl.so.1
,首先要了解NIS(network information serivce),翻译成中文是网络信息服务,主要作用是一种识别和定位网络对象和资源的机制,不仅存储有关机器名称和地址的信息,还存储有关用户、网络本身和网络服务的信息。要区别于DNS,DNS主要作用是通过主机名称而不是ip地址的方式简化通信。NIS的通信是分为服务端和客户端的,要通信就存在通信接口,早期NIS的通信接口是通过glibc实现的,而现在,我们用上RHEL8的版本后,NIS的接口已经从glibc移除,而是通过libnsl来独立实现。
3. Oracle19c安装为什么需要libnsl
?
我查了一下Oracle官方文档,在Database文档中,只有Oracle Net Services章节有介绍NIS,在sqlnet.ora中的NAMES.DIRECTORY_PATH有可能被使用到,当然默认值是没有NIS的。因此也就是为了兼容才会用到,这种方式几乎已经不会用到了。
在GRID文档中,只有Grid Naming Service上会用到,在/etc/nsswitch.conf
中配置解析策略,Oracle自己都不建议用的,如果网络问题,会对解析造成很大问题。
总结以上两点,可以看出,要libnsl
只是为了客户的使用场景可能会用到NIS。并不是强依赖的。
4. 为什么RHEL8安装Oracle 19c会报libnsl.so.1
找不到
这是因为在RHEL8上默认安装了libnsl
的2.0升级版本,2.0版本对IPV6支持的更出色。因此我们可以在/lib64目录下找到libnsl.so.2.0.0
。当然RHEL7是不会出这个问题的。
5.该如何解决libnsl.so.1
找不到的问题?
有两种方法可以解决:
通过yum安装libnsl
yum install libnsl
复制
通过修改软链接方式进行欺骗
在没有yum源的情况下可以考虑此方法
cd /lib64
ln -s libnsl.so.2.0.0 libnsl.so.1
复制
其他小问题
在rhel8上安装Oracle 19c时,要先执行以下命令,不然会报操作系统不匹配。这是因为19c安装包有bug,命中Bug 30286976
export CV_ASSUME_DISTID=OL7
复制
参考文档:
How to install libnsl.so.1 in Red Hat Enterprise Linux 8.1? - Red Hat Customer Portal
rhel8: Warning about linking a program with both libnsl.so.1 and libnsl.so2 - Red Hat Customer Portal
https://github.com/thkukuk/libnsl
Parameters for the sqlnet.ora File (oracle.com)
Issues Affecting Linux for Oracle Database 19c
评论
