起因
我想在ubuntu上安装一个matlab跑程序。
在重新启动之后,一直卡在输入账户密码这步,进不去桌面。输入正确的密码,黑屏一下,然后又会闪退回登录界面,这就是传说中的“循环登录”,其间还提示了一个:
text
System program problem detected
Do you want to report the problem now?
Cancel Report problem...查了下,这是系统错误报告,说明系统某个地方出错了。可以关闭这个提示:
yaml
sudo vi /etc/default/report
# set this to 0 to disable apport, or to 1 to enable it
# you can temporarily override this with
# sudo service apport start force_start=1
enabled=1把其中的enabled=1改成0就可以了,不过这个没什么意义,还是进不去的。
这是实验室的服务器,里面有数据,不能重装系统……查了半天资料,查到了错误的log日志存在的地方:
shell
#进入/home目录
cd ~
#查看所有的文件(包括隐藏文件)
ls -la
#就能看到.xsession-errors文件了,而且时间还是最新的
cat .xsession-errors
#出来的结果是:
Xlib: extension "GLX" missing on display ":0".
Xlib: extension "GLX" missing on display ":0".
....百度了下,原来是Nvidia驱动不兼容导致的,问题终于找出来了,以为马上能解决了,只是没想到这是个开头……
Nvidia快速安装手册
注意,这台机器的参数是:
text
机器型号:Dell Precision Tower 7810(工作站)
CPU:Intel Xeon(R) CPU E5-2637 v3 3.50Ghz×4
显卡:nvidia gk110gl Quadro k6000
操作系统:ubuntu 16.04LTS(内核:4.4.0-116-generic)进入tty命令行模式
在登录界面按Ctrl+Alt+F1(F1~F6可以开启6个不同的界面)进入命令行模式;按Ctrl+Alt+F7可以返回图形界面。
输入账户名和密码
如果忘记了账户名,可以返回图形界面,输入密码的上面是账户名
清除所有的英伟达显卡驱动程序
不用担心显示的问题,最坏的情况我们也有命令行可以使用
shell
sudo apt-get purge nvidia-*更新apt的国内源
默认源都是国外的服务器,很慢,更新成国内的:
- 进入清华大学开源软件镜像站,选择ubuntu 16.04LTS,增加基础源。

shell
sudo vi /etc/apt/sources.list
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse- 更新apt源
shell
sudo apt-get update注意这里的update和upgrade的区别:
- update更新路径,相当于找到资源存放的位置
- upgrade更新软件,相当于软件管家自动升级已经安装好的软件
如果发现都被忽略了,出现:apt-get: Could not resolve 'mirrors.tuna.tsinghua.edu.cn’,说明它可能无法解析这个域名的IP地址:
【第1步】去ChinaZ查询这个域名的服务器IP,得到IP地址为101.6.8.193
【第2步】将这个IP加入hosts:
shell
#编辑
sudo vi /etc/hosts
#加入以下内容
101.6.8.193 mirrors.tuna.tsinghua.edu.cn
#立即生效
sudo /etc/init.d/networking restart【第3步】重新sudo apt-get update
查看自己的linux内核版本
shell
uname -r
4.4.0-116-generic如果是116以上的,那么需要对linux内核进行降级。
【第1步】搜索系统内核:
shell
sudo dpkg --get-selections | grep linux
【第2步】查看是否有低版本内核(重要!)
- 如果有低版本内核,那么卸载高版本内核后会自动退回低版本内核;
- 如果没有低版本内核,那么卸载高版本内核后会回到BIOS界面!
- 如果没有低版本内核,那么可以安装一个112的(没有尝试,因为有112的内核了)
shell
sudo apt-get install linux-image-4.4.0-112-generic【第3步】卸载高版本内核
shell
sudo apt-get remove linux-image-4.4.0-116-generic【第4步】重启
shell
sudo shutdown -r now【第5步】安装和内核版本对应的headers
可不做,后面安装Nvidia依赖也会装一次。
shell
sudo apt-get install linux-headers-$(uname -r)然后再次uname -r查看内核版本,发现退回了112了。
查看自己的显卡型号
shell
lspci | grep -i vga
vga compatible controller:Nvidia Corporation GK110GL [Quadro K6000] (rev a1)官网查找合适的nvidia驱动并安装
进入英伟达官网驱动下载,输入显卡型号,找到合适的驱动:
发现是一个375.82的驱动,也就是说我们只需要安装比这个高一点版本的驱动,就应该能兼容。当然也可以直接安装这个run文件,比较复杂。
选项一:直接安装run文件
- 安装受限制的驱动列表
shell
sudo apt-get insall nvidia-current nvidia-settings- 下载驱动(.run文件)
shell
wget "http://cn.download.nvidia.com/XFree86/Linux-x86_64/375.82/NVIDIA-Linux-x86_64-375.82.run"这个下载地址只需要F12查看<a href="xxxxxx">就可以知道了
- 安装编译所需的依赖
shell
sudo apt-get install build-essential pkg-config xserver-xorg-dev linux-headers-`uname -r`注意看下uname -r是否已经是112了。
- 屏蔽开源驱动nouveau 默认有一个开源的驱动nouveau,如果不屏蔽,在安装过程会报错。
shell
sudo vi /etc/modprobe.d/blacklist.conf加入:
yaml
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv- 关闭图形环境,否则安装过程中会报错
shell
sudo /etc/init.d/lightdm stop会提示OK
- 安装run文件
shell
sudo ./NVIDIA-Linux-x86_64-375.82.run- 选项的选择
- 开始会显示大量点点(......),然后进入图形化安装界面:
- 如果提示是否接受(accept),选接受;
- 如果提示检测到xxx不完整,是否退出安装,选不退出(continue);
- 如果提示有旧驱动,询问是否删除旧驱动,选Yes;
- 如果提示缺少某某模块(modules),询问是否上网下载,选no;
- 如果提示编译模块,询问是否进行编译,选ok;
- 如果提示将要修改Xorg.conf,询问是否允许,选Yes;
选项二:apt-get自动安装
shell
sudo apt-cache search nvidia*会出来很多版本,选择有的而且较高的版本:
shell
sudo apt-get install nvidia-387然后会出现和选项一一样的图形化安装界面
安装结束
输入命令nvidia-smi,出现这样的报告说明安装成功了,否则出错的话,出错的话log会存放在/var/log/nvidia-installer.log。
查看驱动安装信息:
shell
sudo nvidia-smi然后重启,就能进去桌面了:
shell
sudo shutdown -r now完整的探索过程
本来只是想安装一个matlab啊……谁会想到matlab自动安装了一个Nvidia CUDA插件……而且还是不兼容的那种……然后本来想着安装了软件之后重启一下再用,就再也进不去了……我先尝试了重启几次,重启完了之后发现显示屏不亮了,原来是显示屏接触不良了,把各个接线头都插拔了一下,搞了半小时,终于屏幕亮了。然后我开始看是什么原因导致的,首先发现的是屏幕的分辨率有问题,也没去多想。
黑屏的时候出现了一些字符,但是一闪而过看不清,于是我录了视频,那一帧并不是整数……不能暂停来看……于是我不断地按着那一帧画面,频率高了和固定是一样的,发现打印的字符是:
shell
/dev/sdb1: recovering journal
/dev/sdb1: Clearing orphaned inode 1179883(uid=108,gid=114,mode=0100664,size=2363)
.......查了查资料,发现这就是因为我在显示屏不显示东西的时候强制关机造成的,它在自动修复。看这个熟悉的操作系统的inode,就知道在修复一些文件节点了。所以,这和我进不去桌面没有任何关系……
又查了下unbuntu进不去桌面,发现有人说是桌面程序崩溃了,需要在recovery模式下面去重装桌面程序:
shell
apt-get install ubuntu-desktop可是,当我进入recovery的root模式没几分钟,界面就开始乱跳……还各种#命令行出现在中间和背景进行着xor……
我决定在这几分钟内搞定问题,然而我想多了,apt-get提示找不到包……于是需要重新更新apt的源。我就想几分钟肯定不行,需要在原来进不去桌面的那里用Ctrl+Alt+F1切换命令行,在那里弄,于是我shutdown -r now……然后,显示屏先是微微发蓝,然后变成蓝色,然后重启了再也没亮起来……我猜测,那个传输数据的针肯定是接触不良,所以又开始各种插拔,然后,把显示屏的数据线拔下来,插回去的时候一侧的螺丝怎么拧也拧不上了,真棒。然后再尝试了重启机器,发现显示屏亮了,我稍稍移动下显示屏,ubuntu的紫红色变成了蓝色,再稍稍移动一下,又变回了红色,再也不想去碰它了。安装apt源,却给我报了一大堆的错误,解决方法参考《ubuntu16.04出现APT的错误:Update::Post-Invoke-Success》。紧接着,查到一篇劣质文章《解决Ubuntu输入密码后无法进入桌面,一直停留在登陆界面的问题》,让我输入这样的代码:
shell
cd -
sudo chown 你的用户名:你的用户名 .Xauthority
ls .Xauthority -l你让我cd - cd到哪里去。后来猜测是cd ~,回到/home目录。进行了操作,没有任何用。继续查下去,终于发现了《Ubuntu输入密码登入黑屏后仍返回到登入界面的解决》,这个.xsession-errors记录了错误,才知道是英伟达显卡的错误,回想起matlab安装的时候,安装了一个CUDA,和显卡有关,所以推测是和显卡不兼容,想着不用N卡就行了,但是……
我先是想直接用集成显卡好了,不用N卡,用sudo apt-get remove nvidia*卸载了所有的驱动后,重启,发现真的用了集成显卡,进去桌面了!!!然而桌面看不全,所有的界面都不能移动,强行停留在中间。我尝试调分辨率,发现分辨率已经是最高了,1024的,是因为显示屏的分辨率更高,我也没有其他的设备,也不能重装系统因为机器上有数据,很难受。
好吧,还是决定重装Nvidia的显卡驱动,查到了最简单的方法:
shell
sudo apt-get install nvidia-xxx重启后发现不行,卸载了。然后查到了去下载针对显卡型号的run文件来安装,可是总提示错误:nvidia.ko模块安装有问题。找了半天,终于找到了错误日志:
log
nvidia:version magic"4.4.0-116-generic SMP mod_unload modversions" should be "4.4.0-116-generic SMP mod_unload modversions retpoline"哇就差了一个retpoline而已啊。查了下version magic,是幻数的意思,在安装软件交叉编译的时候,会对比linux内核的幻数和软件所需要的环境的幻数是不是一致的,从而保证软件稳定。那很简单啊,删去retpoline就好了。我找到了存放Linux内核的源码:
shell
cd /usr/src/linux-headers-4.4.0-116-generic发现有人因为版本型号不同,直接改其下的include/generated里面的一些文件的数据就可以了,但是,retpoline根本没在里面出现:
shell
grep -r "retpoline" ./include需要修改幻数里面的文件:
shell
vi /include/linux/vermagic.h真的发现了retpoline,写的是IF具有什么功能,就"retpoline",否则就"",所以只要把retpoline改成""就行了。然而需要重新编译内核……各种环境+3小时,根本等不了。陷入了绝境,所有的方法都不行。查了一下retpoline:《谷歌推出新的Retpoline编码技术,可避免Spectre攻击》:
2018年1月5日,Google已经公布了他们工程师创建的新编码技术的详细信息,任何开发人员都可以部署和防止Spectre攻击。Google声称,这种称为Retpoline的新技术与过去几天推出的其他补丁相比,对性能的影响可以忽略不计,其他补丁在某些情况下会导致CPU性能大幅下降。Turner还向Linux内核项目提交了一个补丁,以实现Linux内核的Retpoline技术。在向其他Linux内核开发人员介绍该技术时,Turner表示,Retpoline为我们的内部工作负载添加了一个“平均总体开销”,它的范围在0-1.5%内,其中包括一些高分组处理引擎。
发现事情并不是这么简单。发现了很多人提交了这个4.4.0-116版本内核的bug:
- 2018-2-22 《wifi -> broadcom -> update to 4.4.0-116 mismatch wl mod》
- 2018-2-22 《4.4.0-116 Kernel update on 2/21 breaks Nvidia drivers (on 14.04 and 16.04) due to outdated gcc-4.8》
哇,竟然是最新的问题。那既然是新的,就退内核吧,降内核版本,终于找到了一篇优质博文《安装nvidia 390/387/384显卡驱动出现登录死循环问题的参考解决方法》,一模一样的错误,一样的内核降级思路。在买了泡面和水准备通宵的时候,终于解决了所有的问题,回去睡觉了。
参考资料
重要资料
1、关闭错误报告《手把手 教你解决Ubuntu的错误提示》
2、apt源《清华大学开源软件镜像站》
3、xsession-errors《Ubuntu输入密码登入黑屏后仍返回到登入界面的解决》
4、安装手册维基百科《Nvidia ubuntu中文》
5、Nvidia官网驱动《Nvidia驱动下载》
6、坑的解决《安装nvidia 390/387/384显卡驱动出现登录死循环问题的参考解决方法》
其他
1、《Ubuntu 16.04 nvidia安装》
2、《 Xlib: extension "GLX" missing on display ":0.0".》
3、《glxgears Xlib: extension "GLX" missing on display ":0.0"》
4、《Ubuntu 16.04 内核降级》
5、《linux下显卡信息的查看》
6、《Ubuntu修改apt-get源》
7、《MATLAB CUDA插件》
8、《怎么使ko文件的version magic通过?》
9、《谷歌推出新的Retpoline编码技术,可避免Spectre攻击》
10、《4.4.0-116 Kernel update on 2/21 breaks Nvidia drivers (on 14.04 and 16.04) due to outdated gcc-4.8》
11、《wifi -> broadcom -> update to 4.4.0-116 mismatch wl mod》
12、《VirtualBox not starting after kernel upgrade》
13、《Retpoline support》
14、《NVIDIA Driver Installation nvidia: version magic '4.4.0-116-generic SMP mod_unload modversions ' sho...》
15、《Linux中的update和upgrade分别是更新什么呀?》



粤公网安备44030602007943号