Debian:修復SELinux導致卡在啓動畫面的問題

筆者在自己的惠普筆記本上安裝了採用KDE的Debian,配備了官方的4.19.5內核。後來我又從Linux內核官網上下載了最新的5.2.8版本內核,自己編譯安裝。

直到某一天,我例行進行sudo apt upgrade大更新,更新過程中官方的內核和ramdisk也一併更新了。結果這次更新完畢重啓,出現了以下問題:

  • 5.2.8內核始終無法正常進入登錄界面,一直卡在Debian的啓動畫面處,按方向鍵切換到日誌畫面可以看到,日誌也卡在某處不動了。
  • 再過一段時間,日誌裏就會顯示Accounts Service等多個系統關鍵服務均啓動失敗。

然而,使用官方內核啓動,卻一切正常。這到底是什麼原因呢?

啓動時顯示內核日誌來排查故障

要想分析問題,首先還是要從內核日誌入手。內核日誌相當於系統的“黑匣子”,一般啓動過程中的故障會在內核日誌中得到反映。默認地,內核日誌會在系統啓動時直接輸出到屏幕上,這一點可以在運行Linux發行版的安裝或rescue程序中體會得到。不過,絕大多數Linux發行版會在正式啓動時把內核日誌隱藏。

爲了便於調試,需要臨時更改Grub2的菜單項,來重新把內核日誌顯示出來。啓動時,在Debian的默認啓動項上按<kbd>e</kbd>鍵編輯,顯示菜單項的源碼,然後把源碼中的兩個參數“quiet”和“splash”刪掉,按<kbd>F10</kbd>啓動系統。

被刪掉的兩個參數作用如下:

參數名 作用
quiet 啓動時隱藏內核日誌輸出(但不會隱藏systemd等系統服務的輸出)
splash 啓用啓動畫面(Boot Screen)

找到出錯的地方

果不其然,內核日誌記錄了出錯的根源所在,如圖所示:

[    5.732328] audit: type=1107 audit(1565948152.477:3): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=kernel msg='Unknown class system exe="/usr/lib/systemd/systemd" sauid=0 hostname=? addr=? terminal=?

顯然這是一條SELinux audit日誌,從中可見,SELinux阻止了systemd這個核心進程的啓動。在Debian中,systemd是初始化系統的進程,任何進程都從它創建,該進程無法工作即意味着系統的癱瘓。這就不難解釋爲什麼系統會定格在啓動過程了。

從Linux內核網站上下載的源碼,默認啓用了SELinux,而這次Debian的大更新有可能在SELinux的支持上存在Bug,由此也不難解釋爲什麼更新之前5.2.8版本的內核工作正常,更新後卻無法使用。相比之下,官方內核始終都沒有啓用SELinux,故不會存在這個問題。

解決方案:禁用內核中的SELinux

解決方法很簡單,既然SELinux阻止了系統核心進程的啓動,那麼關閉內核中的SELinux支持,就能讓systemd暢通無阻了。

假設筆者之前已經做好了5.2.8版本的內核配置,內核源碼根目錄下有文件.config。那麼,在這裏運行make menuconfig,打開設置菜單,然後禁用掉以下選項:

  • Security options → NSA SELinux support

重新編譯並安裝內核,即可生效:

make -j6; sudo make modules_install; sudo make install

重啓後,Grub2默認即以最新編譯的內核來啓動系統,果然一切正常,久違的登錄界面又回來了。

提示

一般供個人使用的桌面Linux發行版都不需要SELinux,如Deepin、Ubuntu、OpenSUSE、Manjaro。前述系統,即使啓用了SELinux也不會對實際運行有任何影響,而Debian這樣的情況純屬意外。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章