什么是循環(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)核升級但沒有配置支持顯卡驅(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)升級導(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ì)看一下升級了什么公条。我這里在2020-10-30升級拇囊,內(nèi)核升級到了4.4.0-193,附帶的靶橱,gcc/g++從5.4.0被升級到了5.5.0寥袭。
這有什么問題呢?可能是gcc版本升級关霸,導(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)升級,在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ū)別。同一型號顯卡赋铝,筆記本上和臺(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)更新的方法