首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Linux 動態鏈接庫加載失敗排查實戰:pacemaker rpm 安裝後啟動報錯 libcoroipcc.so.4 缺失

     編輯:Java 綜合教學

故障現象

CentOS 6.3 x64,編譯安裝 pacemaker 1.1.15 rpm 包後,服務啟動失敗:

[root@srdsdevapp73 ~]# service pacemaker start
Starting Pacemaker Cluster Manager [FAILED]

排查步驟

1. strace 定位缺失庫

[root@srdsdevapp73 ~]# strace -f service pacemaker start
...
[pid 19960] writev(2, [{"pacemakerd", 10}, {": ", 2}, 
    {"error while loading shared libra", 36}, {": ", 2}, 
    {"libcoroipcc.so.4", 16}, {": ", 2}, 
    {"cannot open shared object file", 30}, ...
]

明確報錯:libcoroipcc.so.4 找不到。

2. ldd 檢查完整依賴

[root@srdsdevapp73 ~]# ldd /usr/sbin/pacemakerd
...
libcoroipcc.so.4 => not found
libcfg.so.4 => not found
libconfdb.so.4 => not found
...

共 3 個庫缺失。同時發現異常路徑:

libcrmcluster.so.4 => /usr/lib/libcrmcluster.so.4  (異常:應為 /usr/lib64/)

3. 根因分析

  • 系統殘留舊版 pacemaker 安裝產物在 /usr/lib/(32 位庫目錄)。
  • 新版 rpm 安裝到 /usr/lib64/(64 位庫目錄)。
  • 動態鏈接器搜索順序:/lib → /usr/lib → /lib64 → /usr/lib64。
  • /usr/lib/libcrmcluster.so.4 被優先找到,但它依賴的 libcoroipcc.so.4 等庫不在 /usr/lib/,導致連帶缺失。

解決方案

# 刪除殘留的 32 位舊庫
[root@srdsdevapp73 ~]# rm -f /usr/lib/libcrm*
[root@srdsdevapp73 ~]# rm -f /usr/lib/libstonithd.*

# 再次驗證
[root@srdsdevapp73 ~]# ldd /usr/sbin/pacemakerd
linux-vdso.so.1 => (0x00007fff9a3ff000)
libcrmcluster.so.4 => /usr/lib64/libcrmcluster.so.4 (0x00007f849a1fc000)
libstonithd.so.2 => /usr/lib64/libstonithd.so.2 (0x00007f8499fea000)
... 所有庫均正確指向 /usr/lib64/ 或系統路徑

# 啟動服務
[root@srdsdevapp73 ~]# service pacemaker start
Starting Pacemaker Cluster Manager [ OK ]

知識延伸:Linux 動態鏈接庫搜索順序

當 /etc/ld.so.conf 未額外配置,且未設置 LD_LIBRARY_PATH 時,運行時鏈接器 (ld-linux.so) 默認搜索順序:

  1. /lib
  2. /usr/lib
  3. /lib64
  4. /usr/lib64

關鍵機制:

  • ldconfig 掃描上述目錄生成 /etc/ld.so.cache,運行時直接讀取緩存加速。
  • 同名庫先找到者勝出,若 32 位庫殘留在前序目錄,會導致 64 位程序加載錯誤架構庫或缺失依賴。
  • RPATH/RUNPATH (編譯時嵌入)、LD_LIBRARY_PATH (環境變量) 優先級高於默認路徑。

最佳實踐建議

  1. 純 64 位系統清理 32 位庫:yum remove *.i686 或手動清理 /usr/lib/ 下非系統必要庫。
  2. rpm 打包指定 lib64:%{_libdir} 宏自動展開為 /usr/lib64,避免硬編碼 /usr/lib。
  3. 安裝前檢查殘留:find /usr/lib -name "libcrm*" -o -name "libstonithd*"。
  4. ldd 驗證為必經步驟:發布腳本中集成 ldd <binary> | grep "not found" 自動化檢測。

總結

動態鏈接庫加載失敗多因目錄殘留舊版庫搶佔搜索優先級。掌握 strace 定位缺失、ldd 全依賴檢查、ldconfig 緩存機制、搜索順序優先級,能快速定位並徹底解決此類「找不到庫」故障。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved