什么是循環(huán)登錄
開機(jī)/重啟后的登錄界面,分辨率變得很低,并且輸入密碼后,黑屏一閃而過又重新回到輸入密碼的界面,如此循環(huán)無法跳出,俗稱“循環(huán)登錄”。
為什么會(huì)循環(huán)登錄
造成循環(huán)登錄有多種可能的原因:
1. 顯卡驅(qū)動(dòng)相關(guān)原因,導(dǎo)致循環(huán)登錄
最常見的是,內(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)致。
解決ubuntu16.04循環(huán)登錄問題 這篇嘗試添加PyCharm的bin路徑到PATH,但忘記追加原有PATH的值。實(shí)際上完全沒必要添加PyCharm,Dash里搜索即可。
啟動(dòng)Ubuntu時(shí),密碼正確但是出現(xiàn)循環(huán)登陸的現(xiàn)象 這篇嘗試添加JDK的bin目錄到PATH,目測是把PATH的值改成只剩JDK的bin目錄導(dǎo)致進(jìn)不去桌面。
Ubuntu陷入登錄循環(huán) 這篇總結(jié)貼中提到.profile文件被修改的時(shí)候?qū)懥恕板e(cuò)別字”
3. 磁盤空間不足,導(dǎo)致循環(huán)登錄
例如/var/log或/home滿了。df -h
可查看磁盤使用情況。
ubuntu14.04開機(jī)登錄死循環(huán) 該博主刪除大量無效log文件后問題得以解決。
Ubuntu陷入登錄循環(huán) 提到HOME分區(qū)滿導(dǎo)致。
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),大概猜測一下可行的方法:
確保顯卡驅(qū)動(dòng)是適合筆記本(notebook)的,以和臺(tái)式機(jī)區(qū)別。同一型號(hào)顯卡,筆記本上和臺(tái)式機(jī)上也許并不完全一樣,驅(qū)動(dòng)可能有差別。
如果仍然失敗,考慮到筆記本通常默認(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)更新的方法