解決ubuntu顯卡驅(qū)動(dòng)和循環(huán)登錄問題

login.jpg

什么是循環(huán)登錄

開機(jī)/重啟后的登錄界面,分辨率變得很低,并且輸入密碼后,黑屏一閃而過又重新回到輸入密碼的界面,如此循環(huán)無法跳出,俗稱“循環(huán)登錄”。

為什么會(huì)循環(huán)登錄

造成循環(huán)登錄有多種可能的原因:

1. 顯卡驅(qū)動(dòng)相關(guān)原因,導(dǎo)致循環(huán)登錄

nvidia.png

最常見的是,內(nèi)核版本和顯卡驅(qū)動(dòng)版本不兼容導(dǎo)致循環(huán)登錄。 例如內(nèi)核升級(jí)但沒有配置支持顯卡驅(qū)動(dòng)。這是本文重點(diǎn)關(guān)注的一類原因。

也有比較少見的,獨(dú)顯和集顯共存問題,nvidia-prime切換后可以使用:

2. 改配置文件時(shí)系統(tǒng)環(huán)境變量被改壞,導(dǎo)致循環(huán)登錄

例如/etc/profile/etc/environment~/.profile~/.bashrc, ~/.bash_profile等文件中配置PATH,原本希望append一個(gè)路徑,但卻設(shè)置成了PATH只等于這一個(gè)路徑。通常是Linux菜鳥或粗心導(dǎo)致。

3. 磁盤空間不足,導(dǎo)致循環(huán)登錄

例如/var/log或/home滿了。df -h可查看磁盤使用情況。

4. 輸入法沖突導(dǎo)致

例如多個(gè)輸入法共存時(shí)可能觸發(fā)。

Ubuntu 登錄循環(huán)問題 這篇提到fcitx和搜狗輸入法的設(shè)定不正確導(dǎo)致的。

5. 系統(tǒng)升級(jí)導(dǎo)致

如果重啟后發(fā)現(xiàn)顯卡驅(qū)動(dòng)掛了,而通過查找 /var/log/apt/history.log.1 發(fā)現(xiàn)關(guān)機(jī)前最后一次的apt記錄,里面執(zhí)行過sudo apt upgrade,那么可以仔細(xì)看一下升級(jí)了什么。我這里在2020-10-30升級(jí),內(nèi)核升級(jí)到了4.4.0-193,附帶的,gcc/g++從5.4.0被升級(jí)到了5.5.0。

這有什么問題呢?可能是gcc版本升級(jí),導(dǎo)致和原來的DKMS中的顯卡驅(qū)動(dòng)的內(nèi)核模塊沖突。畢竟,原來是用gcc5.4生成的ko。而重裝顯卡驅(qū)動(dòng)450時(shí)選dkms后也會(huì)報(bào)錯(cuò)說編譯器版本不匹配。于是這次放棄選擇DKMS了。

6. 其他

諸如檢查~/.Xauthority~/.gconf等配置文件,檢查和修改權(quán)限,或者干脆刪除。

再例如檢查~/.xsession-errors文件,檢查/var/log/Xorg.0.log文件。

這類方法基本上不管用,偶爾管用也并不能讓人知道先前為什么循環(huán)登錄,有瞎搞的嫌疑。

還有提到“用adduser命令新建一個(gè)用戶,看能不能登錄進(jìn)去”:
ubuntu登陸無限循環(huán)

此方法確實(shí)能夠驗(yàn)證先前用戶home目錄下配置文件有問題,不過遷移用戶數(shù)據(jù)也是比較不可取的。

正確的配置顯卡驅(qū)動(dòng)

顯卡驅(qū)動(dòng)和內(nèi)核的關(guān)系

原理上,顯卡是硬件,需要顯卡驅(qū)動(dòng)的正確配置,才能夠被操作系統(tǒng)所管理使用;操作系統(tǒng)識(shí)別顯卡驅(qū)動(dòng)后,對用戶態(tài)提供顯卡的使用接口。

具體到Ubuntu系統(tǒng),它用的是linux內(nèi)核。有意或無意的更新linux內(nèi)核后,重啟的機(jī)器會(huì)默認(rèn)加載新版內(nèi)核,而如果內(nèi)核與顯卡驅(qū)動(dòng)不兼容,就導(dǎo)致了循環(huán)登錄

最常見的解決思路:卸載并重新安裝顯卡驅(qū)動(dòng)。新裝的驅(qū)動(dòng)可以和原來版本相同,也可以是新版。然而這種做法并沒有從根本上解決問題:為什么我的內(nèi)核會(huì)更新?我好象并沒有更新過內(nèi)核?

一個(gè)合格的Linux用戶,應(yīng)當(dāng)會(huì)查看系統(tǒng)日志、定位報(bào)錯(cuò),并解決問題。查看了/var/log/apt/history.log,我發(fā)現(xiàn)了關(guān)鍵:

Start-Date: 2020-05-03  16:51:58
Commandline: /usr/bin/unattended-upgrade                                                                                    
Install: linux-modules-extra-4.15.0-99-generic:amd64 (4.15.0-99.100~16.04.1, automatic), linux-headers-4.15.0-99:amd64 (4.  15.0-99.100~16.04.1, automatic), linux-modules-4.15.0-99-generic:amd64 (4.15.0-99.100~16.04.1, automatic), linux-headers-4. 15.0-99-generic:amd64 (4.15.0-99.100~16.04.1, automatic), linux-image-4.15.0-99-generic:amd64 (4.15.0-99.100~16.04.1,       automatic)

沒錯(cuò),unattended-upgrade,這家伙意思是自動(dòng)升級(jí),在5月3日 16:51:58悄悄的安裝了新版內(nèi)核(4.15.0-99)

有沒有辦法關(guān)掉unattended-upgrade呢?有,后文介紹。

如果保持unattended-upgrade打開,能不能讓顯卡驅(qū)動(dòng)自動(dòng)適配新內(nèi)核?能,而且是推薦的方式(DKMS),不過也需要一番設(shè)置。

unattended-upgrade是什么?能關(guān)閉嗎?

通過man命令可以知道,unattended-upgrade在每天的cron任務(wù)(/etc/cron.daily/apt-compat)中被在隨機(jī)的時(shí)間點(diǎn)觸發(fā)使用,更新了內(nèi)核。

對服務(wù)器而言,unattended-upgrade安裝了新版內(nèi)核,安全角度來看是一件好事因?yàn)樾迯?fù)了漏洞;但對于使用ubuntu做深度學(xué)習(xí)訓(xùn)練的人來說,這顯得多此一舉,幫了倒忙。即使不使用圖形界面而只是用ssh遠(yuǎn)程連接使用,也會(huì)遭遇如下類似報(bào)錯(cuò):

NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

而此條報(bào)錯(cuò)也很直白的表明了,內(nèi)核版本和顯卡驅(qū)動(dòng)版本不兼容,顯卡罷工了,深度學(xué)習(xí)訓(xùn)練暫停了。

關(guān)閉unattended-upgrade

對付暴力的唯一辦法就是更加暴力。把unattended-upgrade關(guān)掉才能代表深度學(xué)習(xí)的正義:
我的機(jī)器上是/etc/apt/apt.conf.d/20auto-upgrades,有些機(jī)器上可能是/etc/apt/apt.conf.d/10periodic。編輯此文件,找到并修改它的取值為"0":

sudo vim /etc/apt/apt.conf.d/20auto-upgrades

找到并修改它的取值為"0"(如果沒有則添加):

APT::Periodic::Unattended-Upgrade "0";

不過,關(guān)閉unattended-upgrade也只是杜絕了以后莫名其妙的被更新內(nèi)核,當(dāng)前已經(jīng)被更新了內(nèi)核而驅(qū)動(dòng)版本不匹配,還是要搞一下顯卡驅(qū)動(dòng)。

CUDA和顯卡驅(qū)動(dòng)的關(guān)系

搞深度學(xué)習(xí)要用CUDA來加速訓(xùn)練,有時(shí)候也用來部署加速。

CUDA安裝包里面帶有兼容版本的顯卡驅(qū)動(dòng)。沒錯(cuò),必須搭配合適版本的顯卡驅(qū)動(dòng),才能支持CUDA,否則裝好的CUDA也永不上。

舉例:*華公司的AI集群訓(xùn)練系統(tǒng),物理機(jī)的顯卡驅(qū)動(dòng)遲遲不肯更新,導(dǎo)致訓(xùn)模師在2020年還只能用CUDA8這樣落后的東西。*華的sa們都在忙什么?

說回CUDA安裝包里的顯卡驅(qū)動(dòng),個(gè)人不建議安裝它。盡管它確實(shí)在多數(shù)情況下能讓CUDA正常運(yùn)行起來,但是這一版本的顯卡驅(qū)動(dòng)在安裝的時(shí)候不會(huì)注冊dkms模塊,這就導(dǎo)致一旦更新了linux內(nèi)核,重啟機(jī)器后顯卡驅(qū)動(dòng)再次和內(nèi)核不兼容,圖形界面桌面進(jìn)不去,CUDA用不了,深度學(xué)習(xí)訓(xùn)練推理都罷工。

而手動(dòng)從nvidia官網(wǎng)下載的顯卡驅(qū)動(dòng)(standalone版本),是帶有dkms注冊支持功能的。在此倡議:Ubuntu系統(tǒng)下,請不要安裝CUDA安裝包里的顯卡驅(qū)動(dòng),請到nvidia官網(wǎng)手動(dòng)下載.run格式的顯卡驅(qū)動(dòng),手動(dòng)下載安裝

有人會(huì)問:ppa:graphics-drivers/ppa這個(gè)倉庫不香嗎?用apt安裝CUDA和顯卡驅(qū)動(dòng)不是更方便嗎?

我覺得這類用戶沒有考慮過多個(gè)版本的CUDA共存的問題,他們也不曾遇到當(dāng)急需用最近版CUDA而ppa源里的顯卡驅(qū)動(dòng)版本過低時(shí)的那種無奈。

正確安裝顯卡的姿勢

關(guān)閉unattended-upgrade

sudo vim /etc/apt/apt.conf.d/20auto-upgrades

找到并修改它的取值為"0"(如果沒有則添加):

APT::Periodic::Unattended-Upgrade "0";

獲取內(nèi)核相關(guān)包

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

禁用開源驅(qū)動(dòng)nouveau

新建/etc/modprobe.d/blacklist-nouveau.conf,內(nèi)容:

blacklist nouveau
options nouveau modeset=0
sudo update-initramfs -u

正確的卸載顯卡驅(qū)動(dòng)

想要正確的安裝顯卡驅(qū)動(dòng),必須知道怎么正確的卸載顯卡驅(qū)動(dòng)。有時(shí)候使用的機(jī)器是別人之前維護(hù)的,而前任維護(hù)者也許配置的并不合理,需要先檢查再按自己的風(fēng)格配置:

  • .run文件安裝的顯卡驅(qū)動(dòng),卸載:sudo /usr/bin/nvidia-uninstall,或找到原始的.run文件,執(zhí)行sudo bash ./xxx.run --uninstall

  • cuda安裝包里的顯卡驅(qū)動(dòng),卸載:sudo /usr/bin/nvidia-uninstall

  • apt repo下載安裝的:

sudo aptitude search nvidia | grep '^i' #查看
sudo apt remove --purge nvidia-XXX #例如我是nvidia-384

正確的安裝dkms依賴包

盡管standalone版本的nvidia顯卡驅(qū)動(dòng)已經(jīng)內(nèi)置了注冊dkms的功能,但ubuntu16.04并不默認(rèn)支持dkms。也就是說,雖然你滿心歡喜的在安裝顯卡驅(qū)動(dòng)時(shí)選擇了dkms,但是某天因?yàn)閡nattended-upgrade更新了內(nèi)核,顯卡會(huì)再次罷工。

正確姿勢:

sudo apt install dkms

查找和nvidia相關(guān)的dkms包:

aptitude search dkms | ag 'nvidia'
sudo apt install bbswitch-dkms

安裝后,得到/usr/lib/dkms_autoinstaller這一可執(zhí)行文件。

正確的獲取顯卡驅(qū)動(dòng)

前面提到過,不要用CUDA安裝包里的顯卡驅(qū)動(dòng),它不帶dkms支持會(huì)導(dǎo)致以后問題頻發(fā)。請到官網(wǎng)自行下載適合版本的顯卡驅(qū)動(dòng)。

sudo init 3

sudo bash ./NVIDIA-Linux-x86_64-440.82.run

注意選擇dkms支持,選擇32位兼容。

正確的配置dkms

ls /var/lib/initramfs-tools | sudo xargs -n1 /usr/lib/dkms/dkms_autoinstaller start

這會(huì)把所有內(nèi)核模塊打入到所有內(nèi)核中。然后重啟系統(tǒng)即可。

如果不重啟,無線網(wǎng)卡和CUDA可能無法使用。

筆記本上執(zhí)行如上操作,仍然循環(huán)登錄
本人目前手頭沒有帶nvidia顯卡的ubuntu筆記本,暫時(shí)不能實(shí)驗(yàn),大概猜測一下可行的方法:

  1. 確保顯卡驅(qū)動(dòng)是適合筆記本(notebook)的,以和臺(tái)式機(jī)區(qū)別。同一型號(hào)顯卡,筆記本上和臺(tái)式機(jī)上也許并不完全一樣,驅(qū)動(dòng)可能有差別。

  2. 如果仍然失敗,考慮到筆記本通常默認(rèn)用集顯作為顯示輸出,臺(tái)式機(jī)默認(rèn)用獨(dú)顯做顯示輸出;則先卸載掉剛才安裝的驅(qū)動(dòng),再重新加入–no-opengl-files選項(xiàng)安裝。而后續(xù)要用到opengl的情況(譬如基于vulkan的優(yōu)化加速庫),則在安裝cuda時(shí),注意勾選opengl、取消勾選顯卡驅(qū)動(dòng)(不確定,只是一時(shí)的想法,求驗(yàn)證)

參考

NVIDIA CUDA Installation Guide for Linux,全面,但不全都正確可用

解決Driver/library version mismatch,中文博客中比較深入的一篇

Command to rebuild all DKMS modules for all installed kernels?,啟發(fā)了我找到dkms的正確配置方式

ubuntu 禁止/取消系統(tǒng)自動(dòng)更新的方法

http://www.jeepxie.net/article/581478.html

解決Nvidia顯卡的電腦安裝Ubuntu及驅(qū)動(dòng)的各種坑

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。