本文总结操作系统和 Linux 下容易发生的各种意外损坏情况,以及如何提前检测和预防。

上一篇复盘和总结了Linux下容易发生的意外损坏情况、如何提前检测和预防的思路。

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 变量等效的动态库文件搜索路径。

总之,系统级别的配置文件尽量少改动,除非很清楚系统配置文件的内容原理。用户级别的配置文件可以改,修改后多测试。软件级别的配置文件可以按需改,因为不影响其他用户。

TIPs:

懂得软件开发的朋友们,还可以利用git功能,在修改配置之前,做一下版本管理。以备配置文件错误后,及时恢复。

参考资料:

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

文章来自:51CTO

Loading

作者 yinhua

发表回复