diff --git "a/content/zh/post/xingchen/OM\345\256\211\350\243\205openssl\345\205\274\345\256\271\351\227\256\351\242\230.md" "b/content/zh/post/xingchen/OM\345\256\211\350\243\205openssl\345\205\274\345\256\271\351\227\256\351\242\230.md" new file mode 100644 index 0000000000000000000000000000000000000000..2e8b3891ac4aa2a7e3774a2fb66a786aefc26334 --- /dev/null +++ "b/content/zh/post/xingchen/OM\345\256\211\350\243\205openssl\345\205\274\345\256\271\351\227\256\351\242\230.md" @@ -0,0 +1,80 @@ ++++ +title = "OM安装后,linux命令报错openssl不兼容" +date = "2023-06-17" +tags = ["OM安装后,linux命令报错openssl不兼容"] +archives = "2023-06-17" +author = "zhang_xubo" +summary = "OM安装后,linux命令报错openssl不兼容" +img = "/zh/post/xingchen/title/img1.png" +times = "10:30" ++++ + +### 概述 + +在部分系统中,使用OM安装完成openGauss数据库后,会出现例如 **yum install** 不可用, 或者 **ssh** 不可用的问题。 + +**问题现象** + +1. 在openeuler20.03系统上,使用openGauss 3.0.3之前的版本,OM安装完成后,切换到root下使用yum安装组件,会出现如下错误: + ``` + symbol SSLv3_method version OPENSSL_1_1_0 not defined in file libssl.so.1.1 with link time reference + ``` + +2. 在一些高版本系统中,如centos8以上。安装完成数据库后,使用ssh报错: + ![](../images/opensslerror/ssherror.png) + + +**问题原因** + +为了保证兼容和稳定,openGauss在开源三方库里面引入了openssl组件进行管理和维护,这样依赖会导致openGauss使用的openssl版本和操作系统上自带openssl版本的可能存在不兼容的问题。 + +OM安装完成后,会再 `/etc/profile` 里面写入自身的环境变量,如下: +``` +export GPHOME=/opt/huawei/install/om +export UNPACKPATH=/opt/software/openGauss +export PATH=$PATH:$GPHOME/script/gspylib/pssh/bin:$GPHOME/script +export LD_LIBRARY_PATH=$GPHOME/script/gspylib/clib:$LD_LIBRARY_PATH +export LD_LIBRARY_PATH=$GPHOME/lib:$LD_LIBRARY_PATH +export PYTHONPATH=$GPHOME/lib +export PATH=$PATH:/root/gauss_om/omm/script +``` +其中的**LD_LIBRARY_PATH**会将openGauss包中lib目录下的so库文件优先级提前,在使用如yum命令时候,就会优先去加载openGauss lib目录下的二级制。 + +而openGauss lib下放着 libssl.so 和 libcrypto.so ,这两个输入openssl的库文件。如果此时存在不兼容,那么在使用操作系统工具时候,如果工具依赖了openssl的相关不兼容函数,就会报错。 + +1. 编译选项不同导致不兼容 + +`symbol SSLv3_method` 就是由于编译选项引起的不兼容现象。早起openGauss-third-party中的openssl在编译时候并未开启sslv3-method,但是操作系统yum所依赖的二进制需要用到sslv3相关的函数,就导致报错sslv3-method symbol not found。 + + +2. 系统上对openssl做修改导致接口不兼容 + +在 Centos 8 以及相关的发行版中,操作系统自身对openssl做了很大的patch改动,其中存在对接口函数的增加和删除。 +`undefined symbol EVP_KDF_ctrl`报错就是场景之一。 在原始的openssl中具有该函数,但是在 Centos8 系统上却对该函数做了删除。 此时安装了openGauss后,在openGauss的环境变量下,部分工具必然会出现问题。 + + +**处理方式** + +1. 对于 `symbol SSLv3_method not found`, 可以更新下三方库,在构建openssl的时候开启编译选项 `enable-ssl3-method`。 + + ![](../images/opensslerror/enable_sslv3.png) + +2. 对于OM安装过程中出现 `undefined symbol EVP_KDF_ctrl` 问题,可以把系统上的 `libcrypto.so` 放到 `$TOOL/script/gspylib/clib `替换掉om包里面的lib文件 + +3. 同意对于OM安装过程中出现问题的场景,由于OM需要依赖一些开源组件如 psutil,paramiko等,这些组件编译的二进制文件依赖openssl进而产生了不兼容问题,可以在操作系统上手动安装如下四个组件: + ``` + psutil + netifaces + cryptography + paramiko + ``` + 然后OM安装时候, preinstall加上 --unused-third-party 即可使用系统的组件替代OM包中的组件,进而规避该问题。 + ``` + ./gs_preinstall -U xx -G xx -X /xx/single.xml --unused-third-party + ``` + +4. 对于在安装后,使用 ssh 工具出现 `undefined symbol EVP_KDF_ctrl` 问题的场景; 可以再在使用ssh之前, 把系统的lib库库优先级放到前面,就不会影响ssh。 + ``` + export LD_LABRRRY_PATH=/usr/lib64:$LD_LABRRRY_PATH;ssh 192.168.0.100 command; + ``` + 这个问题由于系统自身对openssl做了修改,尤其在 Centos8 上, 删除openssl中的函数在openGauss中还继续使用,该兼容问题无法解决,只能通过加载环境变量的优先级方式来规避。 \ No newline at end of file diff --git a/content/zh/post/xingchen/compile_without_lse.md b/content/zh/post/xingchen/compile_without_lse.md deleted file mode 100644 index dcdafa37594a41ec2150ae27307a4c4a2865c877..0000000000000000000000000000000000000000 --- a/content/zh/post/xingchen/compile_without_lse.md +++ /dev/null @@ -1,39 +0,0 @@ -+++ -title = "安装时报指令错误的处理" -date = "2021-05-21" -tags = ["安装时报指令错误的处理"] -archives = "2021-05-21" -author = "xingchen" -summary = "安装时报指令错误的处理" -img = "/zh/post/xingchen/title/img1.png" -times = "19:30" -+++ - -### 概述 - -在一些非官方指定的系统上面 (官方指定的系统:https://opengauss.org/zh/docs/latest/docs/Description/%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83.html), 使用官网提供的镜像安装数据库,有时会遇到一些 `"非法指令" "illegal instruction"` 的问题, 这些往往是由于CPU指令集不兼容导致的。 - -此处我们只说下在ARM上面安装失败的问题。 - -常见的主要如下: - -官网发布的 `openEuler_arm` 包,在编译的时候,打开了`ARM_LSE`指令集做了编译的优化。但是对于一些其他版本的arm服务器,不一定支持。 - -代码注释中这么写的: -``` -build\script\mpp_package.sh - -# it may be risk to enable 'ARM_LSE' for all ARM CPU, but we bid our CPUs are not elder than ARMv8.1 -``` - -实测在 ***鲲鹏920*** 和 ***麒麟990*** 的cpu芯片下是支持安装的。 -cpu可以通过 `lscpu` 名称查看。 - -对于其他不自持该指令的系统,需要去掉 `-D__ARM_LSE` 指令重新编译即可。 - -在编译脚本中 `build\script\mpp_package.sh`,删除掉所有的 `-D__ARM_LSE` , 重新编译数据库。 - -patch如下图: - -![](../images/compile/withoutlse.png) - diff --git a/content/zh/post/xingchen/illegal_instruction.md b/content/zh/post/xingchen/illegal_instruction.md new file mode 100644 index 0000000000000000000000000000000000000000..81c11896b4be5e4dcb2d3862626cf4f4a67440bf --- /dev/null +++ b/content/zh/post/xingchen/illegal_instruction.md @@ -0,0 +1,106 @@ ++++ +title = "安装时报指令错误的处理" +date = "2023-06-17" +tags = ["安装时报指令错误的处理"] +archives = "2023-06-17" +author = "zhang_xubo" +summary = "安装时报指令错误的处理" +img = "/zh/post/xingchen/title/img1.png" +times = "10:30" ++++ + +### 概述 + +在使用官网提供的镜像安装数据库,有时会遇到一些 `"非法指令" "illegal instruction"` 的问题,或者在一些本地搭建的虚拟机上,数据库启动失败,但是没有很明确的错误信息的问题。 这些往往是由于CPU指令集不兼容导致的。 + + +常见的有3种: +1. arm CPU下的lse指令 +2. x86_64 CPU下的rdtscp指令 +3. x86_64 CPU下的avx指令 + + +### 1. arm服务器下LSE指令 + +官网发布的 `openEuler_arm` 包,在编译的时候,打开了`ARM_LSE`指令集做了编译的优化。但是对于一些其他arm服务器,不一定支持。 + +构建脚本: +``` +build\script\utils\make_compile.sh + +# it may be risk to enable 'ARM_LSE' for all ARM CPU, but we bid our CPUs are not elder than ARMv8.1 +``` + +实测在 ***鲲鹏920*** 和 ***麒麟990*** 的cpu芯片下是支持安装的。 +cpu可以通过 `lscpu` 名称查看。 + +对于其他不自持该指令的系统,需要去掉 `-D__ARM_LSE` 指令重新编译即可。 + +在编译脚本中 `build\script\utils\make_compile.sh`,删除掉所有的 `-D__ARM_LSE` , 重新打包数据库。 +``` +sh build.sh -m release -3rd /sdb/binarylibs -pkg + +# -3rd 是对应三方库二进制的目录 +``` + +patch如下图: + +![](../images/compile/withoutlse.png) + +### 2. x86服务器下rdtscp指令 + +rdtscp指令集用来检索CPU周期计数器,MOT特性有用到 + +在server中位置如下: +`src\gausskernel\storage\mot\core\infra\synchronization\cycles.h` + +``` +/** + * @brief Retrieve the CPU cycle counter using rdtscp instruction + * @detail Force processor barrier and memory barrier + * @return The CPU cycle counter value. + */ + static __inline __attribute__((always_inline)) uint64_t Rdtscp() + { +#if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__)) + uint32_t low, high; + __asm__ __volatile__("rdtscp" : "=a"(low), "=d"(high) : : "%rcx"); + return (((uint64_t)high << 32) | low); +#elif defined(__aarch64__) + unsigned long cval = 0; + asm volatile("isb; mrs %0, cntvct_el0" : "=r"(cval) : : "memory"); + return cval; +#else +#error "Unsupported CPU architecture or compiler." +#endif + } +``` + +有些自己搭建的虚拟机可能没有这个指令集,导致数据库无法启动。 + +**检测方式** + +使用lscpu命令进行检测是否具有该指令集: +`lscpu | grep rdtscp` + +**解决方法** +如果没有该指令集,需要开启CPU直通模式 (host-passthrough) + +### x86服务器下avx指令 + +avx指令集用来进行加速计算,主要是db4ai在使用。该指令集从 **2.1.0** 版本开始引入,如果存在2.1.0之前版本可以运行数据库而2.1.0之后数据库启动失败,也有可能是没有该指令导致。 + +**检测方式** + +使用lscpu命令进行检测是否具有该指令集: +`lscpu | grep avx` + +**解决方法** +如果没有该指令集,从代码中删掉该指令集的引用,重新打包数据库。 + +该指令集的引用在Makefile里面,可以全局搜索 `-mavx` , 删掉如下编译选项里面加载-mavx指令,然后重新打包构建即可。 +``` +ifeq ($(PLATFORM_ARCH),x86_64) + override CPPFLAGS += -mavx +endif +``` \ No newline at end of file diff --git a/content/zh/post/xingchen/images/opensslerror/enable_sslv3.png b/content/zh/post/xingchen/images/opensslerror/enable_sslv3.png new file mode 100644 index 0000000000000000000000000000000000000000..03c90cf1b2e0df6da3ebdba504ea92695e7bcc01 Binary files /dev/null and b/content/zh/post/xingchen/images/opensslerror/enable_sslv3.png differ diff --git a/content/zh/post/xingchen/images/opensslerror/ssherror.png b/content/zh/post/xingchen/images/opensslerror/ssherror.png new file mode 100644 index 0000000000000000000000000000000000000000..e5ae09245cedb26017d84df6b35397d6d2c13a85 Binary files /dev/null and b/content/zh/post/xingchen/images/opensslerror/ssherror.png differ