cd /home/misaka tar -xvf openssl-1.0.0t.tar.gz cd openssl-1.0.0t # 注意这里是要编译 So 库的,所以要加 shared 参数,因为不打算做安装动作,所以 prefix 和 openssldir 参数都不加 ./config shared make
等待编译完成,即可在当前目录下找到对应的 So 文件: libcrypto.so.1.0.0、libssl.so.1.0.0,将其拷贝出来即可用在故障复现的机器上。
Dec 07 01:28:24 localhost.localdomain systemd[1]: Starting High-performance, schema-free document-oriented database... Dec 07 01:28:24 localhost.localdomain systemd[1]: Started High-performance, schema-free document-oriented database. Dec 07 01:28:24 localhost.localdomain mongod[7420]: /usr/bin/mongod: /lib64/libcrypto.so.10: no version information available (required by /usr/bin/mongod) Dec 07 01:28:24 localhost.localdomain mongod[7420]: /usr/bin/mongod: /lib64/libcrypto.so.10: no version information available (required by /usr/bin/mongod) Dec 07 01:28:24 localhost.localdomain mongod[7420]: /usr/bin/mongod: /lib64/libssl.so.10: no version information available (required by /usr/bin/mongod) Dec 07 01:28:24 localhost.localdomain mongod[7420]: /usr/bin/mongod: relocation error: /usr/bin/mongod: symbol FIPS_mode_set version libcrypto.so.10 not defined in file libcrypto.so.1> Dec 07 01:28:24 localhost.localdomain systemd[1]: mongod.service: Main process exited, code=exited, status=127/n/a Dec 07 01:28:24 localhost.localdomain systemd[1]: mongod.service: Failed with result 'exit-code'.
4、查看动态库引用关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
[root@localhost mongo3.4.10]# ldd /usr/bin/mongod /usr/bin/mongod: /lib64/libcrypto.so.10: no version information available (required by /usr/bin/mongod) /usr/bin/mongod: /lib64/libcrypto.so.10: no version information available (required by /usr/bin/mongod) /usr/bin/mongod: /lib64/libssl.so.10: no version information available (required by /usr/bin/mongod) linux-vdso.so.1 (0x00007ffc0ed99000) libssl.so.10 => /lib64/libssl.so.10 (0x00007fa28fa5b000) libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fa28f69d000) librt.so.1 => /usr/lib64/librt.so.1 (0x00007fa28f694000) libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007fa28f68f000) libm.so.6 => /usr/lib64/libm.so.6 (0x00007fa28f50e000) libgcc_s.so.1 => /usr/lib64/libgcc_s.so.1 (0x00007fa28f4f5000) libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007fa28f4d3000) libc.so.6 => /usr/lib64/libc.so.6 (0x00007fa28f326000) /lib64/ld-linux-x86-64.so.2 (0x00007fa292a26000)
[root@localhost mongo3.4.10]# ls -lrt /lib64/libcrypto.so.10 lrwxrwxrwx 1 root root 18 Dec 7 00:34 /lib64/libcrypto.so.10 -> libcrypto.so.1.0.0
5、确认 libcrypto.so.1.0.0 中是否包含 symbol FIPS_mode_set,这里可以用nm或者objdump等方法,如不包含则没有任何输出
Dec 07 01:49:52 localhost.localdomain systemd[1]: Starting High-performance, schema-free document-oriented database... Dec 07 01:49:52 localhost.localdomain systemd[1]: Started High-performance, schema-free document-oriented database. Dec 07 01:49:52 localhost.localdomain mongod[8039]: about to fork child process, waiting until server is ready for connections. Dec 07 01:49:52 localhost.localdomain mongod[8040]: forked process: 8041 Dec 07 01:49:53 localhost.localdomain mongod[8039]: child process started successfully, parent exiting
[root@localhost mongodb]# LD_LIBRARY_PATH=/usr/lib64/mongodb:$LD_LIBRARY_PATH mongo MongoDB shell version v3.4.10 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.10 Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user Server has startup warnings: 2025-12-07T01:49:52.704+0800 I CONTROL [initandlisten] 2025-12-07T01:49:52.704+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2025-12-07T01:49:52.704+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2025-12-07T01:49:52.704+0800 I CONTROL [initandlisten] 2025-12-07T01:49:52.704+0800 I CONTROL [initandlisten] 2025-12-07T01:49:52.704+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2025-12-07T01:49:52.704+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2025-12-07T01:49:52.704+0800 I CONTROL [initandlisten] > exit bye
[root@localhost bin]# mongo MongoDB shell version v3.4.10 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.10 Server has startup warnings: 2025-12-07T01:49:52.704+0800 I CONTROL [initandlisten] 2025-12-07T01:49:52.704+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2025-12-07T01:49:52.704+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2025-12-07T01:49:52.704+0800 I CONTROL [initandlisten] 2025-12-07T01:49:52.704+0800 I CONTROL [initandlisten] 2025-12-07T01:49:52.704+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2025-12-07T01:49:52.704+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2025-12-07T01:49:52.704+0800 I CONTROL [initandlisten] >
5)根据上述步骤将 mongoimport、mongoexport 等工具做类似处理即可。
问题思考
经过以上步骤,服务冲突就已经解决完毕,可以开展后续的业务工作,但还是有些内容值得思考的: 1)如果业务上如果有 So 库特定版本依赖并需要创建软链接时,需要考虑下是否为类似 OpenSSL 相关的基础依赖,在部署时是否独占机器,如果非独占,那么还是要考虑下是否会影响其他服务。在本次案例中是采取了主动规避的方案,两边都不受影响,但如果遇到暴力操作,直接解除 PubKit 的软链接再部署服务,那么对业务来说是灾难性的,可能会遇到在排查解决问题时双方互相反复解除软链接的情况。
2)对于业务部署来讲,提前检查环境是必须进行的,除了操作系统、磁盘分区等等基础信息检查项之外,还应该加上业务依赖上的检查,比如 So 版本检查,提前发现问题并制定解决方案,节省现场处理问题的时间。