关于银河麒麟操作系统黑屏问题

一.问题说明

安装xx所软件后在/etc/ld.so.conf.d/下创建了一个JinCEarth.conf的配置文件,ldconfig使其生效,然后安装任意一个包,重启时将会黑屏

1.根本原因:ld.so.cache的改变使得/usr/lib/x86_64-linux-gnu/libXrandr.so.2的库加载不上导致lightdm反复重启,表现为黑屏闪屏。

2.具体原因分析(libXrandr.so.2的库加载不上的原因):

  通过跟踪一个系统缓存中可用的库来分析问题

    ldconfig -p |grep libXrandr.so.2

(1)在没有安装xx软件并ldconfig之前,只有一个候选路径

    libXrandr.so.2 => /usr/lib/x86_64-linux-gnu/libXrandr.so.2

    此时查询ldd  /usr/sbin/ukui-greeter|grep的结果为

                libXrandr.so.2 => /usr/lib/x86_64-linux-gnu/libXrandr.so.2

  1. 安装xx所软件后在/etc/ld.so.conf.d/下创建了一个JinCEarth.conf的配置文件,ldconfig使其生效,生成新的ld.so.cache。此时系统有了一点变化。

libXrandr.so.2=> /usr/lib/x86_64-linux-gnu/libXrandr.so.2

libXrandr.so.2 => /opt/ZHXT/.../libXrandr.so.2

    此时查询ldd  /usr/sbin/ukui-greeter|grep libXrandr.so.2的结果为

libXrandr.so.2 =>/usr/lib/x86_64-linux-gnu/libXrandr.so.2

    系统表面上一切正常

(3)在同一个库的候选上有多条路径,会先找ld.so.cache中排名靠前的那个,但是一旦这个排名发生了改变,就会产生不可预知的严重后果,这个后果取决于这个库对于系统正常运行有多重要

而安装任何一个安装包正是使这个排名发生改变的诱因。

    dpkg  -i  xxx.deb的操作会使ldconfig -p |grep  libXrandr.so.2的查询结果变为

    libXrandr.so.2 => /opt/ZHXT/.../libXrandr.so.2

    libXrandr.so.2 => /usr/lib/x86_64-linux-gnu/libXrandr.so.2

    而此时查询ldd  /usr/sbin/ukui-greeter|grep libXrandr.so.2的结果变为

    libXrandr.so.2 => /opt/ZHXT/.../libXrandr.so.2

系统表面上一切正常,但是错误已经产生,一但lightdm重启时加载启动libXrandr.so.2,黑屏现象就这样产生了

    那么dpkg究竟做了什么?

    答案就是dpkg在安装后设置的过程中也使用了ldconfig,具体使用者为dpkg名下的libc-bin触发器。同样是ldconfig,为何dpkg过后顺序就变了,原因是libc-bin修改了名为

     LC_ALL的环境变量,LC_ALL的设置会导致LC_COLLATE也发生改变,这个环境变量即为问题产生的关键,因为LC_COLLATE正是用于定义环境的排序和比较规则。

    用户如需验证的话可将/var/lib/dpkg/info/libc-bin.postinst中的export LC_ALL=C注释掉,如此的话dpkg安装的时候将不会改变ld.so.cache的排序

    但是一定要记得改回去,该方法不可作为解决问题的方法。

    或者在手动执行ldconfig之前先export export LC_ALL=C,然后ldconfig将会改变ld.so.cache的排序,unset LC_ALL,再次ldconfig,ld.so.cache将会还原

    那么也就很好解释为什么问题产生之后,再次ldconfig 或者 移除导致问题产生的库使候选路径自动变为原来的一条(/opt/ZHXT/.../libXrandr.so.2下libXrandr.so.2),系统恢复正常

    这只是暂时解决的方法,因为外来库的隐患依旧残留在ld.so.cache中

  • 如何设置环境变量及风险说明

(不推荐作用于全局的环境变量设置及修改)

如果一定要使用全局变量,可以使用风险较小的方法

 1.在ld.so.conf中添加路径或者在ld.so.conf.d中添加新的conf后ldconfig生成新的缓存文件ld.so.cache,风险较大。系统加载会用到ld.so.cache,具体参考上方问题分析

 2.在/etc/profile中设置export LD_LIBRARY_PATH=/xxxx/xxx,风险较小,不会影响到ld.so.cache,影响域将会变为profile生效之后启动的系统应用

 3.用的时候在终端中设置环境变量,export LD_LIBRARY_PATH=/xxxx/xxx,基本无风险,但仅在当前终端中生效

 4.对于Qt来说,只需要在工程文件夹下面创建一个qt.conf,里面加上以下内容即可使程序在运行时默认调用指定路径下的库,该方法是qt官方提供的(网址:https://doc.qt.io/qt-5/qt-conf.html),零风险,合规范,当然不能作用于全局,只能作用于当前工程,无需重复设置。以下为设置方法

如果qt所有相关的lib,plugins等都在同一个文件夹下,只需要

   [Paths]

   Prefix = /opt/Qt5.9.6

如果qt所有相关的lib,plugins等不是同一个文件夹下,则需要

   [Paths]

   Libraries = qt的lib对应路径

   Plugins        = qt的plugins对应路径

   这两个是必须的

   以下根据需求选择

   LibraryExecutables    = qt的libexec对应路径

   Binaries =  qt的bin对应路径

   Headers     = qt的include对应路径

   Imports      = qt的imports对应路径

   Qml2Imports = qt的qml对应路径

   Translations = qt的translations对应路径

   Examples = qt的examples对应路径

   Tests =        qt的tests对应路径

三、共享库的查找顺序

linux中动态链接库的搜索顺序 

linux中程序对动态链接库的搜索顺序,如下所述:

1.首先查看程序文件的.dynamic 段是否包含了一个叫DT_RPATH的项(它是一个以冒号分隔的库文件搜索目录列表)。

查看.dynamic 段,readelf  -d  test(编译好的可执行文件)
   怎么设置这个选项?
   需要在编译连接程序的时候使用-L选项,假设一个程序test需要使用liblib.so库,如下所示进行编译连接:
gcc -o test -L./ -llib  test.c
这样在执行test程序时,test便会先到./即当前目录下查找所需要的动态库。-L操作只在编译时生效。如果想使用指定的路径,需要加参数-Wl,rpath,例如 gcc -o test test.c -L. -ltest -Wl,-rpath=/root/mycodes/codes/test,ldd  test查看库文件路径/root/mycodes/codes/test路径查找正确
2.查找是否存在环境变量 LD_LIBRARY_PATH(它是一个以冒号分隔的库文件搜索目录列表)。
   怎么设置这个选项?当然是设置linux下的环境变量就可以了。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./

当然,这种方法是对当前登录生效的。如果想开机即有效,跟其它环境变量的设置也是一样,需要修改一些配置文件。

修改配置文件的方法如下:
该变量添加位置可以在系统的多个启动文件中如:/etc/profile(该文件在全局变量中起作用) -> /etc/rc.local(在shell下起作用) -> /etc/bashrc(在shell下起作用)  ~/.profile(在shell下起作用)->  ~/.bashrc(在shell下起作用) 等。
3.查看库高速缓存文件 /etc/ld.so.conf ,它包含了库名和路径的一个对应列表,如果库名存在,连接器就使用它对应的路径,用这个查找方法能够找到大部分的库。

   怎么设置这个选项?可以直接编辑ld.so.conf加入需要查找的路径,也可以在/etc/ld.so.conf.d目录下的己有文件中加入路径,或者在该目录下新建一个文件(名字为*.conf即可),再把需要的路径加入到该文件中。最后执行ldconfig即可生效。ld.so.conf.d中添加的配置为全局变量根据查找顺序,如果有同名库,就会更具规则找到第一路径的库
ldconfig的查找顺序是根据字符集的规则查找的LANG=C(posix规则) 或者zh_CN.UTF-8 字符集决定
4.查找默认路径/lib和/usr/lib,

如果经过了以上的步骤仍然查找失败,则将报错并退出相关程序。

对于前三个步骤来说,我们均是可以进行设置调整的,其中第三个步骤中的设置需要root权限才能进行,且会影响所有的程序。

  • 使用同名库,

如果必须使用同名库尽量不要放入全局环境变量也就是不要放在/etc/ld.so.conf.d/路径下,

1、编译软件时将库的查找路径编译进去 gcc -o test test.c -L. -ltest -Wl,-rpath=/root/mycodes/codes/test 

2、可以在执行软件时再加载库文件,例如在软件执行时添加export 同名库路径,

或者在类似/etc/profile设置环境变量添加库的查询路径,但是此种加载方式只在shell环境中起作用

3、如果需要写入/etc/ld.so.conf.d/下的xx.conf文件中需要通过ldconfig -p  |grep  libxxx*  查看确认库文件对系统文件和其他软件的影响,确认系统或其他软件是否会有异常,再做进一步处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/172453.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL进阶_10.锁

文章目录 一、概述二、MySQL并发事务访问相同记录2.1、读-读2.2、写-写2.3、读-写2.4、并发问题的解决方案 三、锁的不同角度分类3.1、 读锁、写锁3.1.1、 锁定读 3.2、表级锁、页级锁、行锁3.2.1、表锁3.2.2、意向锁3.2.2.1、意向锁的作用3.2.2.2、意向锁的互斥性 3.2.3、自增…

2019年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

文章目录 2019年考研英语二真题SectionⅠ Use of EnglishSection II Reading ComprehensionText 121——细节信息题22——细节信息题23——细节信息题24——细节信息题25——词义题 Text 226——细节信息题27——细节信息题28——细节信息题29——细节信息题30——态度题 Text …

springboot2.0 集成swagger3+Knife4j导出离线API 配置

springboot 版本2.3.1 一、集成swagger3 引入swagger依赖包 <!--swagger3集成--><dependency><groupId>org.springframework.plugin</groupId><artifactId>spring-plugin-core</artifactId><version>2.0.0.RELEASE</version>…

Linux面试题(三)

目录 34、du 和 df 的定义&#xff0c;以及区别&#xff1f; 35、awk 详解。 36、当你需要给命令绑定一个宏或者按键的时候&#xff0c;应该怎么做呢&#xff1f; 37、如果一个 linux 新手想要知道当前系统支持的所有命令的列表&#xff0c;他需要怎么做&#xff1f; 38、…

第一百八十一回 如何绘制阴影效果

文章目录 1. 概念介绍2. 使用方法2.1 SegmentedButton2.2 ButtonSegment 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 1. 概念介绍 我们在本章回中介绍的SegmentedButton组件是一种分段式按钮&#xff0c;它把多个按钮连接成一组显示&#xff0c;组内再对不同的按钮进…

[计算机网络]应用层概述

0.写在前面: 该层为教学模型的最后一层,某种意义上来说是最接近各位开发者的一层,正因如此,这层中的很多定义和概念大家都有属于自己的理解, 完全按照书本反而才是异类,因此在这里我会去结合我做前端开发的一些经验,来处理和讲解一些概念,另外本层中的部分协议也不会过多阐述了…

VUE简易购物车程序

目录 效果预览图 完整代码 效果预览图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

Python 进阶(十一):高精度计算(decimal 模块)

《Python入门核心技术》专栏总目录・点这里 文章目录 1. 导入decimal模块2. 设置精度3. 创建Decimal对象4. 基本运算5. 比较运算6. 其他常用函数7. 注意事项8. 总结 大家好&#xff0c;我是水滴~~ 在进行数值计算时&#xff0c;浮点数的精度问题可能会导致结果的不准确性。为了…

【Amazon】通过直接连接的方式导入 KubeSphere集群至KubeSphere主容器平台

文章目录 一、设置主集群方式一&#xff1a;使用 Web 控制台方式二&#xff1a;使用 Kubectl命令 二、在主集群中设置代理服务地址方式一&#xff1a;使用 Web 控制台方式二&#xff1a;使用 Kubectl命令 三、登录控制台验证四、准备成员集群方式一&#xff1a;使用 Web 控制台…

第六届 传智杯初赛B组

文章目录 A. 字符串拼接&#x1f37b; AC code B. 最小差值&#x1f37b; AC code C. 红色和紫色&#x1f37b; AC code D. abb&#x1f37b; AC code E. kotori和素因子&#x1f37b; AC code F. 红和蓝&#x1f37b; AC code &#x1f970; Tips&#xff1a;AI可以把代码从 j…

Android获取原始图片Bitmap的宽高大小尺寸,Kotlin

Android获取原始图片Bitmap的宽高大小尺寸&#xff0c;Kotlin val options BitmapFactory.Options()options.inJustDecodeBounds trueval decodeBmp BitmapFactory.decodeResource(resources, R.mipmap.p1, options)//此时&#xff0c;decode出来的decodeBmp宽高并不是原始图…

C++通讯录管理系统

目录 系统需求 1、 创建项目 2、 菜单功能设计 3、 退出功能设计 4、 添加联系人功能设计 4.1 设计联系人结构体 4.2 设计通讯录结构体 4.3 在main函数中创建通讯录 4.4 封装添加联系人函数 4.5 添加联系人功能测试 5、 显示联系人功能设计 5.1 封装显示…

算法基础之合并集合

合并集合 核心思想:并查集: 1.将两个集合合并2.询问两个元素是否在一个集合当中 基本原理:每个集合用一棵树表示 树根的编号就是整个集合的编号 每个节点存储其父节点&#xff0c;p[x]表示x的父节点 #include<iostream>using namespace std;const int N100010;int p[N];…

Huggingface 超详细介绍

Hugging face 起初是一家总部位于纽约的聊天机器人初创服务商&#xff0c;他们本来打算创业做聊天机器人&#xff0c;然后在github上开源了一个Transformers库&#xff0c;虽然聊天机器人业务没搞起来&#xff0c;但是他们的这个库在机器学习社区迅速大火起来。目前已经共享了超…

Ansible的handler

环境 管理节点&#xff1a;Ubuntu 22.04控制节点&#xff1a;CentOS 8Ansible&#xff1a;2.15.6 handler 当任务结果产生变化时&#xff0c;通过 notify 通知handler做相应处理。 一个简单例子 --- - hosts: alltasks:- name: task1debug:msg: "I am task1"cha…

【C++初阶】二、入门知识讲解(引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【C初阶】一、入门知识讲解 &#xff08;C关键字、命名空间、C输入&输出、缺省参数、函数重载&#xff09;-CSDN博客 六 . 引用 &#xff08;1&#xff09;. 引用的概念和特性…

Hugging Face宣布最受欢迎的AI机构,开源模型ChatGLM-6B广受认可

近日&#xff0c;Hugging Face作为开源AI社区的代表&#xff0c;总结了社区最欢迎的前15个公司和机构&#xff0c;几乎囊括了全部国内外风头正盛的AI科技机构&#xff0c;Stability AI、Meta AI、Runway占据排名前三&#xff0c;大众熟知的OpenAI、谷歌、微软也榜上有名。 其中…

医学检验(LIS)管理系统源码,LIS源码,云LIS系统源码

医学检验(LIS)管理系统源码&#xff0c;云LIS系统全套商业源码 随着全自动生化分析仪、全自动免疫分析仪和全自动血球计数器等仪器的使用&#xff0c;检验科的大多数项目实现了全自动化分析。全自动化分析引入后&#xff0c;组合化验增多&#xff0c;更好的满足了临床需要&…

php订单发起退款(余额和微信支付)

index.html <a class"btn btn-danger btn-change btn-tuikuan btn-disabled" href"javascript:;"><i class"fa fa-tuikuan"></i> 订单退款</a>-->order.js // 为表格绑定事件Table.api.bindevent(table);//退款按钮…

K8S----taint、tolerations、label

一、污点(taint),针对的是节点,只有node才有污点的概念 1、 给节点增加一个污点 kubectl taint nodes node1 key1=value1:NoSchedule给节点 node1 增加一个污点,它的键名是 key1,键值是 value1,效果是 NoSchedule。 这表示只有拥有和这个污点相匹配的容忍度的 Pod 才能…