文章目录

前言

一切的一切,只是因为我想在ubuntu上安装一个matlab跑程序……在重新启动之后,一直卡在输入账户密码这步,进不去桌面。输入正确的密码,黑屏一下,然后又会闪退回登录界面,这就是传说中的“循环登录”,其间还提示了一个:

    System program problem detected
Do you want to report the problem now?
Cancel                              Report problem...

查了下,这是系统错误报告,说明系统某个地方出错了。可以关闭这个提示:

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日志存在的地方:

#进入/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快速安装手册

注意,这台机器的参数是:

机器型号: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可以返回图形界面。

输入账户名和密码

如果忘记了账户名,可以返回图形界面,输入密码的上面是账户名

清除所有的英伟达显卡驱动程序

不用担心显示的问题,最坏的情况我们也有命令行可以使用

sudo apt-get purge nvidia-*

更新apt的国内源

默认源都是国外的服务器,很慢,更新成国内的:

(1)进入清华大学开源软件镜像站,选择ubuntu 16.04LTS,增加基础源。

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

(2)更新apt源

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:

#编辑
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内核版本

uname -r
4.4.0-116-generic

如果是116以上的,那么需要对linux内核进行降级。

【第1步】搜索系统内核:

sudo dpkg --get-selections | grep linux

【第2步】查看是否有低版本内核(重要!)

如果有低版本内核,那么卸载高版本内核后会自动退回低版本内核;

如果没有低版本内核,那么卸载高版本内核后会回到BIOS界面!

如果没有低版本内核,那么可以安装一个112的(没有尝试,因为有112的内核了)

sudo apt-get install linux-image-4.4.0-112-generic

【第3步】卸载高版本内核

sudo apt-get remove linux-image-4.4.0-116-generic

【第4步】重启

sudo shutdown -r now

【第5步】安装和内核版本对应的headers

可不做,后面安装Nvidia依赖也会装一次。

sudo apt-get install linux-headers-$(uname -r)

然后再次uname -r查看内核版本,发现退回了112了。

查看自己的显卡型号

lspci  | grep -i vga
vga compatible controller:Nvidia Corporation GK110GL [Quadro K6000] (rev a1)

官网查找合适的nvidia驱动

进入英伟达官网驱动下载,输入显卡型号,找到合适的驱动:

发现是一个375.82的驱动,也就是说我们只需要安装比这个高一点版本的驱动,就应该能兼容。当然也可以直接安装这个run文件,比较复杂。

选项一:直接安装run文件

(1)安装受限制的驱动列表

sudo apt-get insall nvidia-current nvidia-settings

(2)下载驱动(.run文件)

wget "http://cn.download.nvidia.com/XFree86/Linux-x86_64/375.82/NVIDIA-Linux-x86_64-375.82.run"

这个下载地址只需要F12查看<a href="xxxxxx">就可以知道了

(3)安装编译所需的依赖

sudo apt-get install build-essential pkg-config xserver-xorg-dev linux-headers-`uname -r`

注意看下uname -r是否已经是112了。

(4)屏蔽开源驱动nouveau

默认有一个开源的驱动nouveau,如果不屏蔽,在安装过程会报错。

sudo vi /etc/modprobe.d/blacklist.conf

加入:

blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv

(5)关闭图形环境

否则安装过程中会报错

sudo /etc/init.d/lightdm stop

会提示OK

(6)安装run文件

sudo ./NVIDIA-Linux-x86_64-375.82.run

(7)选项的选择

开始会显示大量点点(......),然后进入图形化安装界面:

如果提示是否接受(accept),选接受;

如果提示检测到xxx不完整,是否退出安装,选不退出(continue);

如果提示有旧驱动,询问是否删除旧驱动,选Yes; 

如果提示缺少某某模块(modules),询问是否上网下载,选no; 

如果提示编译模块,询问是否进行编译,选ok; 

如果提示将要修改Xorg.conf,询问是否允许,选Yes;


选项二:apt-get自动安装

sudo apt-cache search nvidia*

会出来很多版本,选择有的而且较高的版本:

sudo apt-get install nvidia-387

然后会出现和选项一一样的图形化安装界面

安装结束

出现这样的报告说明安装成功了,否则出错的话,出错的话log会存放在/var/log/nvidia-installer.log

查看驱动安装信息:

sudo nvidia-smi

然后重启,就能进去桌面了:

sudo shutdown -r now

二、艰辛的安装过程

​噩梦的开始

本来只是想安装一个matlab啊……谁会想到matlab自动安装了一个Nvidia CUDA插件……而且还是不兼容的那种……然后本来想着安装了软件之后重启一下再用,就再也进不去了……我先尝试了重启几次,重启完了之后发现显示屏不亮了,原来是显示屏接触不良了,把各个接线头都插拔了一下,搞了半小时,终于屏幕亮了。然后我开始看是什么原因导致的,首先发现的是屏幕的分辨率有问题,也没去多想。

黑屏的时候出现了一些字符,但是一闪而过看不清,于是我录了视频,那一帧并不是整数……不能暂停来看……于是我不断地按着那一帧画面,频率高了和固定是一样的,发现打印的字符是:

/dev/sdb1: recovering journal
/dev/sdb1: Clearing orphaned inode 1179883(uid=108,gid=114,mode=0100664,size=2363)
.......

查了查资料,发现这就是因为我在显示屏不显示东西的时候强制关机造成的,它在自动修复。看这个熟悉的操作系统的inode,就知道在修复一些文件节点了。所以,这和我进不去桌面没有任何关系……

又查了下unbuntu进不去桌面,发现有人说是桌面程序崩溃了,需要在recovery模式下面去重装桌面程序:

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输入密码后无法进入桌面,一直停留在登陆界面的问题》,让我输入这样的代码:

1.$ cd -  
2.$ sudo chown 你的用户名:你的用户名 .Xauthority  
3.ls .Xauthority -l

你让我cd - cd到哪里去。后来猜测是cd ~,回到/home目录。进行了操作,没有任何用。继续查下去,终于发现了《Ubuntu输入密码登入黑屏后仍返回到登入界面的解决》,这个.xsession-errors记录了错误,才知道是英伟达显卡的错误,回想起matlab安装的时候,安装了一个CUDA,和显卡有关,所以推测是和显卡不兼容,想着不用N卡就行了,但是……

ubuntu安装Nvidia驱动的坑

我先是想直接用集成显卡好了,不用N卡,用sudo apt-get remove nvidia*卸载了所有的驱动后,重启,发现真的用了集成显卡,进去桌面了!!!然而桌面看不全,所有的界面都不能移动,强行停留在中间。我尝试调分辨率,发现分辨率已经是最高了,1024的,是因为显示屏的分辨率更高,我也没有其他的设备,也不能重装系统因为机器上有数据,很难受。

好吧,还是决定重装Nvidia的显卡驱动,查到了最简单的方法:

sudo apt-get install nvidia-xxx

重启后发现不行,卸载了。然后查到了去下载针对显卡型号的run文件来安装,可是总提示错误:nvidia.ko模块安装有问题。找了半天,终于找到了错误日志:

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内核的源码:

cd /usr/src/linux-headers-4.4.0-116-generic

发现有人因为版本型号不同,直接改其下的include/generated里面的一些文件的数据就可以了,但是,retpoline根本没在里面出现:

grep -r "retpoline" ./include

需要修改幻数里面的文件:

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分别是更新什么呀?》


转载请注明出处http://www.bewindoweb.com/179.html | 三颗豆子
分享许可方式知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
重大发现:转载注明原文网址的同学刚买了彩票就中奖,刚写完代码就跑通,刚转身就遇到了真爱。
你可能还会喜欢
具体问题具体杠