详细表现症状
- 版本为ubuntu18.04LTS
- 登陆后桌面不显示文件,但是使用shell访问Desktop文件夹可以看到文件。
- 使用
nautilus ~/Desktop
命令打开桌面文件夹也可以看到原来桌面上的文件。 - 无法更换壁纸,点击更换壁纸后可以进到更换壁纸的窗口,也可以选壁纸,但选中后不生效。
- 侧边栏保存的自定义的快捷方式消失,只保留了当初系统默认的快捷方式。
- 终端的配色,字体大小等各种设置均恢复为默认。
- ntfs的硬盘无法自动挂载,跟ubuntu同一块固态上的windows分区能识别,另一块机械硬盘未识别
- 磁盘分区中能看到/efi分区,点击即不能访问也不能卸载
- 原系统安装的软件仍然可以正常使用,比如chrome,htop等,所以系统未恢复默认
- 侧边栏添加自定义的快捷方式成功,但是重启后配置会恢复默认。
- 终端配色,字体等配置修改可以立马生效,但是重启后配置恢复默认。
- 自动隐藏侧边栏设置不生效
故障发生前的操作
发生故障前几天都在调试gstreamer,安装编译过gstreamer的库,由于gstreamer的依赖有版本要求,
还手动编译了多个依赖库,但是并没有成功安装好所有依赖。
由于当时安装gstreamer的依赖库时速度很慢,把源从科大的源更改到阿里的源,并进行了upgrade
及update
操作。
更新完成重启后问题出现。由于有更新这个操作,所以很头大,更新库太多,而且问题出现前系统已经有一个月没关机重启过, 完全不知道是否是更新库引起的,也定位不到是哪个库引起的,在google之后发现出现此问题的回答并不多,每次搜索都是那几个回答, 逐个尝试后问题仍未解决。
本来想将就下,大不了每次重启后再设置几下,结果尝试了一个小时由于侧边栏始终无法自动消失终于忍无可忍,一怒之下想要重装系统。 不过由于这个系统已经成功运行了5年多,加上与win10双系统,重装成本太高,决定还是抢救以下。
故障排除经过
由于以ubuntu桌面不显示文件这个方向搜索到的答案未解决问题,所以以为可能跟磁盘挂载有关系,因为磁盘挂载跟之前的确不一样了。
所以重新修改了默认挂载磁盘,修改后重启系统,输入账号密码后竟然长时间黑屏。多次ctrl
+alt
+f1
后再次登陆,终于进到桌面,
磁盘均挂载成功,但是仍然可见/efi分区。由于启动时有长时间黑屏,所以怀疑跟桌面环境有关。
反复卸载重装gnome,中间一度无法进入桌面,输入密码登陆后就黑屏。经过进入命令行模式各种卸载安装桌面环境,甚至重新安装了unity环境, 即便进入unity问题依然存在。中间根据多个回答删除了默认的桌面环境配置,但是问题依然存在,此时虽然美排除是桌面环境的问题, 但是桌面环境这边已经无能为力了。
中间怀疑过是NVIDIA驱动的问题,不过查看了下好像没什么异常,更重要的是显卡驱动是曾经治好我强迫症的部分,轻易还是不要先从它这里下手。
重启进入recovery模式清理空间,检测磁盘分区等操作,发现机械硬盘已经挂载,恢复原来设置,问题仍未解决。磁盘挂载这里也是无能为力了。
到目前为止异常点又回到桌面文件不见,无法更换壁纸,设置无法保存这三点上来,于是又进行了漫长了google过程。并对之前的搜索结果重新阅读,
在一个回答
Not able to see items on Desktop
提到使用gnome-tweak
这个工具,使用之后发现Desktop
选项默认是关闭的,打开之后仍然看不到桌面。感觉这里有问题,但是不知道什么问题。
在这个回答里No files or folders are shown on Desktop Ubuntu 17.10
提到通过命令gsettings set org.gnome.desktop.background show-desktop-icons true
设置,但是设置并未生效,相反设置时还会有错误提示。
GLib-GIO-Message: Using the 'memory' GSettings backend. Your settings will not be saved or shared with other applications.
GLib-GIO-WARNING **: 01:24:52.587: unknown schema extension 'd'
GLib-GIO-WARNING **: 01:24:52.587: unknown schema extension 'd'
...
google这个报错,找到一个回答gsettings error: using the memory backed, 里面的解决方法是设置了这样一个环境变量:
export GIO_EXTRA_MODULES=/usr/lib/x86_64-linux-gnu/gio/modules/
尝试设置这个环境变量后第一行的报错果然没有了,但是其他报错仍然存在。其实现在想,到这里提示性已经很明显,但是当时还是未意识到问题,导致之后又是长时间的搜索与尝试。
此时已经把注意力集中到GIO及GSettings相关的问题上来,在这个问题My dconf/gsettings installation is broken. How can I fix it without Ubuntu reinstall?中,最高赞认为是环境变量的问题, 所以首先排查了环境变量,并把相关自定义的环境变量删除,问题依然存在。
排名第二的答案中分析了库的顺序问题,根据答案依次查看了这两个路径/usr/local/lib
及/lib/x86_64-linux-gnu
,发现果然有一样的动态库,
联想到之前改环境变量可以去掉一个报错,所以严重怀疑是这个问题。
查看这两个路径下重复的动态库,发现跟glib有关,这时候想起来当时为了调试gstreamer库,安装了gstreamer库的依赖glib。至此已经可以认为是跟glib有关。
删除/usr/local/lib
下所有与/lib/x86_64-linux-gnu
重复的库,再次执行gsettings set org.gnome.desktop.background show-desktop-icons true
命令,
桌面忽然出现了文件。至此解决。
问题原因分析与总结
出现问题的原因就是在手动编译glib时,采用了./configure;make;make install
的无脑三段式安装,导致在make install
过程中把动态库安装到了/usr/local/lib
目录,
按照上面的回答,由于linux搜索的顺序/usr/local/lib
更靠前,所以屏蔽掉了原来的库,导致运行不正常。
上面的分析中的几个答案其实都能解决对应的问题,在通过增加GIO_EXTRA_MODUL
环境变量就能减少一个报错的时候,应该深入去分析原因,
有可能少走一些弯路。好在所有的弯路并不白走。
安装软件的时候./configure
不带任何参数,在make install
的时候拷贝库及头文件到系统默认目录,的确很方便,但是即不利于排查问题,
在软件作者没做uninstall工作的话,想卸载也是极其困难的。
但是如果每个软件都安装到自己的目录,那每个软件都要设置环境变量,不仅麻烦,长时间下来会导致环境变量很长,不利于维护。
如果把自己编译安装的软件统一放到一个目录比如~/usr
下,不要添加到系统原有目录里,这样环境变量只要添加~/usr/bin
就可以了。
但是时间久了以后~/usr
也会越来越庞大,不过还是比直接放到系统目录好,而且不需要管理员权限。目前我自己就是采用这样方法,
只不过gstreamer的依赖实在太多了,所以一时懒得设置,就引发了一场血案。
在排查问题上,首先大的方向上还是应该少怀疑ubuntu本身更新带来的问题,虽然更新常常带来问题, 但是长期发行版以及ubuntu目前越来越稳定的表现还是应该把重点放在自身编译上。
其次在查找问题时还是要注意报错信息,不过刚开始没有定位大方向,很难逐个问题仔细查看,毕竟可能的原因太多了。