原本可倖免於難的Linux故障狀況如何避免?你也可以搞定

2024.01.10

Linux系統一般在以下方面出現潛在問題而影響正常運作:

  • 硬體故障;
  • 內核錯誤;
  • 文件系統損壞;
  • 軟體衝突;
  • 系統更新問題;
  • 惡意軟體;
  • 過度負載;
  • 配置錯誤。

本文繼續分析第4-8的問題。

軟體衝突

Linux下的軟體衝突有哪些表現?

軟體衝突1:依賴函式庫缺失,軟體找不到依賴的函數

例如很多開發人員,從原始碼編譯方式安裝了一些基礎的類別庫到自訂庫路徑下,然後發現系統和桌面的其他軟體啟動異常。以下是QT 相關的軟體啟動失敗的報錯日誌:

…… libQt5XcbQpa.so.5: undefined symbol: FT_Property_Set
  • 1.

根據關鍵字搜尋得到一大堆結果,大家往往發現網路上有各種有效、無效的解決辦法,各說一套

對此,我的觀點是,建議Linux的使用者要知其然,知其所以然,要深入理解Linux問題的根源。並從根源解決,舉一反三在發生類似問題後,也能自主解決。

例如上面的錯誤日誌,如果是新安裝了自己編譯的庫檔案到系統目錄後發生的問題,那麼往往跟QT軟體依賴的函式庫(如libfreetype.so)被替換為不相容的版本所引起的。FT_Property_Set 關鍵字,可幫我們確定問題範圍與freetype相關也可受到/etc/ld.so.conf.d/.conf 的檔案中的。

可以判斷這個問題不是libfreetype.so函式庫被刪引起的,因為若是系統函式庫libfreetype.so被刪,那麼Qt的報錯將會類似required libfreetype.so library not found。

如何避免?可透過在局部使用LD_LIBRARY_PATH ,例如在腳本內、在命令列前面以 LD_LIBRARY_PATY=自訂函式庫的路徑+指令 的這種方式呼叫軟體。就可以避免不同環境和庫的相互幹擾、污染的問題。

採用conda環境隔離、python的venv 環境隔離等方式;使用docker 容器環境運行不同軟體、甚至在virtualbox等虛擬機器上運行不同軟體;這些方式也可以幫助避免軟體衝突的問題。

安裝時的軟體包衝突2:

例如centos的yum方式安裝軟體包時,提示錯誤嚐過添加"--skip-broken"來跳過無法安裝的軟體包或'--nobest'來不只使用軟體包的最佳候選)

這類問題往往由於軟體來源配置存在多個不同版本的軟體來源,需要避免/etc/yum.d/*.repo 檔案中存在重複的不同版本的倉庫:

否則透過yum安裝指定軟體名稱時,將提示版本衝突。

系統更新問題

Linux系統更新失敗而導致的軟體衝突,一旦發生,往往是比較嚴重的問題。所以小編建議,當大版更新前,一定要做好系統設定檔和資料檔的異機備份。

一個好消息是,Deepin、Ubuntu等發行版,對系統升級、核心加裝新版本等重大更新,更新後不會替換原始文件,而是在系統啟動時另起一個引導選單入口,這樣新開機啟動的系統就會是更新後的系統;舊版的系統內容仍可在舊的引導入口進入。在新軟體系統發生異常後,可以進入舊系統軟體繼續使用。

惡意軟體問題

惡意軟體的問題、過度負載問題,往往維運人員遇到比較多。惡意軟體也是系統過載、網路流量異常的元兇。惡意軟體的入侵,除了人為安裝了惡意軟體,還有主動入侵,例如網站程式碼漏洞、系統軟體對外服務漏洞(如nginx或nodejs軟體漏洞)就可以被外界利用,向系統植入惡意軟體。

對此,小編建議,在Linux下,啟用防火牆、關閉非必要的對外連接埠、不要使用弱密碼、及時更新已知存在漏洞的軟體到安全的版本、不訪問危險站點、透過容器等隔離工具進行存在風險的存取操作。

配置錯誤

Linux使用者最常遇到的配置錯誤導致的系統問題,往往是添加修改了環境變數文件,影響了正常變數的存取效果。

對於Linux系統,環境變數分為系統層級變數、使用者層級變數、腳本範圍內的執行時間環境變數。

寫在 /etc/profile 中的屬於系統層級的全域腳本和環境變數。寫在 ~/.bashrc 檔案裡的腳本和環境變量,將在使用者shell或桌面登入後生效。而類似 tomcat 的startup.sh 等控制jvm啟動過程的腳本內的變量,將只影響腳本範圍內的軟體。因此不會影響系統或使用者其他軟體的正常運作。例如pycharm 的安裝包,內涵pycharm.sh [1],就是一個.sh 文件,pycharm 的啟動腳本,也是.sh文件,它把pycharm運行所需的庫所在路徑,通過腳本內的環境變量,讓pycharm的最終二進位檔案感知、從pycharm的當前子目錄載入(如./lib/libmy.so)。

寫在/etc/ld.so.conf.d/xxxx.conf 裡的會作用域整個系統的LD_LIBRARY_PATH 變數等效的動態函式庫檔案搜尋路徑。

總之,系統層級的設定檔盡量少改動,除非很清楚系統設定檔的內容原理。使用者層級的設定檔可以改,修改後多測試。軟體層級的設定檔可以按需改,因為不影響其他使用者。

尖端:

懂得軟體開發的朋友們,還可以利用git功能,在修改設定之前,先做一下版本管理。以備設定檔錯誤後,及時恢復。

參考資料:

[1]pycharm 的安裝包,內涵pycharm.sh : https://download.jetbrains.com.cn/python/pycharm-community-2023.2.5.tar.gz