笔者在自己的惠普笔记本上安装了采用KDE的Debian,配备了官方的4.19.5
内核。后来我又从Linux内核官网上下载了最新的5.2.8
版本内核,自己编译安装。
直到某一天,我例行进行sudo apt upgrade
大更新,更新过程中官方的内核和ramdisk也一并更新了。结果这次更新完毕重启,出现了以下问题:
5.2.8
内核始终无法正常进入登录界面,一直卡在Debian的启动画面处,按方向键切换到日志画面可以看到,日志也卡在某处不动了。- 再过一段时间,日志里就会显示Accounts Service等多个系统关键服务均启动失败。
然而,使用官方内核启动,却一切正常。这到底是什么原因呢?
启动时显示内核日志来排查故障
要想分析问题,首先还是要从内核日志入手。内核日志相当于系统的“黑匣子”,一般启动过程中的故障会在内核日志中得到反映。默认地,内核日志会在系统启动时直接输出到屏幕上,这一点可以在运行Linux发行版的安装或rescue程序中体会得到。不过,绝大多数Linux发行版会在正式启动时把内核日志隐藏。
为了便于调试,需要临时更改Grub2的菜单项,来重新把内核日志显示出来。启动时,在Debian的默认启动项上按e键编辑,显示菜单项的源码,然后把源码中的两个参数“quiet
”和“splash
”删掉,按F10启动系统。
被删掉的两个参数作用如下:
参数名 | 作用 |
---|---|
quiet |
启动时隐藏内核日志输出(但不会隐藏systemd 等系统服务的输出) |
splash |
启用启动画面(Boot Screen) |
找到出错的地方
果不其然,内核日志记录了出错的根源所在,如图所示:
1 |
|
显然这是一条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
重新编译并安装内核,即可生效:
1 |
|
重启后,Grub2默认即以最新编译的内核来启动系统,果然一切正常,久违的登录界面又回来了。
提示
一般供个人使用的桌面Linux发行版都不需要SELinux,如Deepin、Ubuntu、OpenSUSE、Manjaro。前述系统,即使启用了SELinux也不会对实际运行有任何影响,而Debian这样的情况纯属意外。
- 本文作者: 爱拼安小匠
- 本文链接: https://anclark.github.io/2019/08/17/Struggle_with_Linux/Debian SELinux导致无法启动问题/
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 3.0(署名-非商用-禁止演绎 3.0) 许可协议。转载请注明出处!