1. 程式人生 > >登入問題定位之ubuntu輸入正確密碼後重新返回登入介面

登入問題定位之ubuntu輸入正確密碼後重新返回登入介面

上週五組內同事搭建了一個jenkins持續整合平臺,完善了我們的安卓自動化系統。我們將產品的自動打包整合到裡面,當天系統執行正常。週一回來正準備大幹一場,突然發現系統無端關機了。OK,關機那就重啟吧,半分鐘後出現了登入介面,迫不及待的輸入密碼,[enter],結果介面一閃又重新回到了登入介面。咦!怎麼回事?密碼是沒問題的,再次輸入,現象一樣!不會吧,難道系統被我們搞壞了?於是開始了長時間的定位過程。

檔案許可權問題

google搜尋發現跟登入相關的檔案是使用者根目錄下的.Xauthority檔案,如果沒有這個檔案的讀取許可權就會出現“輸入正確密碼後重新返回登入介面”的問題。解決方法:
(1) ctrl+alt+f1切換到命令列模式
(2) 使用正確的使用者名稱密碼登入。
(3) 在home下檢視該檔案許可權:

$ ls -al .Xauthority

很奇怪,執行ls命令提示找不到,說明出問題的機器找不到/bin/ls檔案,看來是環境變數失效了,那就自己設定一個環境變數吧,執行以下命令:

$ export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/games

再次執行ls命令

$ ls -al .Xauthority
-rw-------  1 staff  staff  2727 Mar 21  2015 .Xauthority

上述結果顯示檔案是登入使用者staff的,它有讀寫許可權,因此沒有問題,排除這種情況。
當然如果真的是這個問題可以執行以下命令解決

$ sudo chown staff:staff .Xauthority

繼續google我們發現另一種解決辦法:
(1) ctrl+alt+f1切換到命令列模式
(2) rm -rf .Xauthority
(3) ctrl+alt+f7切換回登入視窗
(4) 輸入使用者名稱密碼登入
按照上述方法執行一次,問題依舊,無奈!

分析登入日誌

以上方法都失效了,繼續盲目的google看來意義不大。我們想到了系統日誌,說幹就幹,再次進入命令列模式,檢視檔案/usr/log/auth.log。
通過auth.log的錯誤日誌,我們花了近2小時嘗試了很多辦法,比較有代表性的解決方案有:
(1) 更新系統外掛

$ sudo apt-get update 
$ sudo apt-get upgrade

(2) 將部分系統外掛會退到舊版本
嘗試這兩種方法是因為同事說在配置伺服器的過程中點選了系統外掛的更新,從錯誤日誌中顯示可能是外掛不相容導致。
(3) 更換桌面,切換成

$ sudo apt-get install xubuntu-desktop

懷疑是gnome桌面出問題了,安裝新的桌面可以解決這類問題。
很不幸的是所有的解決辦法都失敗了,我們這時快要崩潰了。

迴歸現象,峰迴路轉

在長時間折騰不出解決方案後,我們暫時放棄了,喝喝水並出去溜達了一圈。路上不時的想起定位過程,很快我們注意到第一步中那個奇怪的現象:“ls命令找不到,環境變數失效了!”。我們知道linux啟動的時候是預設會初始化環境變數的,即unbuntu預設環境變數中應該會有這個值:

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/games

快速回到工位,重啟電腦,登入命令列模式,檢視機器上的環境變數,執行以下命令:

$ /bin/echo $PATH
/Users/staff/.jenkins/bin

PATH竟然變成了“/Users/staff/.jenkins/bin”。檢視jenkins安裝指南,我們發現安裝過程修改了系統檔案/etc/profile,會向這個檔案寫入jenkins環境變數。檢視之:

$ cat /etc/profile
... (去除不必要資訊的干擾)
PATH=/Users/staff/.jenkins/bin

至此,問題看來已經找到了,linux啟動會載入/etc/profile檔案配置,因此問題機器PATH會最後修改為“/Users/staff/.jenkins/bin”。而桌面登入時依賴預設的環境變數,因此導致我們輸入正確的密碼也無法登入。
解決這個問題,將那個PATH的賦值修改成下列形式,重啟機器,輸入使用者名稱密碼,成功進入系統,開心死我們了!

PATH=$PATH:/Users/staff/.jenkins/bin

問題總結

  • 定位過程其實走了很多彎路,而關鍵現象卻選擇性忽略了,不過藉此機會也複習和學習了好些linux相關的配置和命令。
  • linux系統檔案非常敏感,修改時需特別注意
    系統出問題了,極大的可能是修改了系統檔案,因此,一個良好的習慣是系統檔案修改前對檔案進行備份,然後再進行修改,出問題後直接回滾往往可以馬上解決問題。
  • 當問題出現時,先分析全面問題的現象,然後再想解決方案
    google大法確實很不錯,但是如果盲目的搜尋只會讓問題更亂,折騰的更辛苦。但是如果分析清楚了現象,有時候自直接就能定位出問題,即使依賴google,現象清楚全面,搜尋結果也會更加準確,需要1天解決的問題或許1小時(甚至更短時間)就搞定了。
  • 問題定位沒有頭緒了,暫時拋開,或許會有新思路。
    蘇軾說:“不識廬山真面目,只緣身在此山中”,當我們困擾於問題時,可能我們已經糾結於問題的細枝末節了,而不能看到問題的全貌,這時走出廬山(暫時拋開),從不一樣的角度去看它時,往往會有意外的收穫。