Ubuntu 开机启动问题解决思路

在使用 Linux 系统时,开机启动卡在 Logo 界面或无法进入桌面,是常见也最令人头疼的问题。本文结合实践经验,总结了几类常见原因及对应的解决思路,希望能够帮助定位问题。

显卡驱动问题

显卡驱动是最常见的启动问题来源,显卡驱动一般分独立显卡驱动和集成显卡驱动两种,独立显卡一般都会需要从官网下载,集成显卡一般会在发行系统内核自带。显卡驱动问题通常表现为系统能正常启动,但在进入桌面时黑屏或卡住。

  • 内核版本过低,不支持新硬件

例如在之前文章 ubuntu20.04更新内核 中提到的,ubuntu20.04发布时间是2020年,但在intel i9-13900KF的芯片发布时间是2022年,这种场景只能通过更新最新内核才可以解决。

  • 独立显卡驱动不兼容或缺失

例如在之前文章 安装英伟达驱动 ,该文章介绍了如何在CentOS安装新驱动和禁用nouveau驱动。NVIDIA 显卡常见问题:nouveau 与官方驱动冲突。AMD新型号则需要较新内核与 Mesa 版本。

处理方式:
由于显卡驱动问题,无法进入系统,都不会影响内核正常启动,只是无法进入桌面环境,可以通过“Ctrl + Alt + F2”进入命令行模式进行系统修复。

Grub 引导问题

Grub 引导错误会导致系统在 Logo 卡死 或 依赖 U 盘才能启动。

  • grub 引导程序安装错误,安装在U盘
    现象是插入装机U盘,才能启动系统,拔出后无法启动系统。

  • grub 引导程序需要修复
    现象启动系统卡在主板logo画面

处理方式:
以上都可以通过修复grub引导程序解决

1
2
3
4
5
6
7
8
9
# 查看系统硬盘
sudo lsblk

# 修复grub引导程序
sudo grub-install /dev/sda

# 更新grub引导程序
sudo update-grub

软件兼容性问题

某些第三方软件(如输入法、显卡工具)安装后可能修改系统组件,导致开机卡住。如搜狗拼音,安装方法可以参考 安装中文拼音
该类软件问题一般都是兼容性的错误,如果明确知道情况下,可以通过“Ctrl + Alt + F2”进入命令行模式进行软件卸载和修复。

系统内核问题

系统内核问题就比较多了,也比较复杂,排查难度较大。但是一般都会出现内核打印日志,需要根据内核日志进行排查。以下是一些常见的内核启动日志,涉及硬件驱动、dts 配置等。

  • RK平台

xc7160 摄像头驱动代码报错

1
2
3
4
5
6
7
[    4.147468] I : [File] : drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c; [Line] : 417; [Func] : mali_modul.
[ 4.147877] Mali:
[ 4.147879] Mali device driver loaded
[ 4.148156] xc7160 4-001b: T-chip firefly camera driver version: 00.01.01
[ 4.148428] xc7160 4-001b: Failed to get power-gpios, maybe no use
[ 4.148457] xc7160 4-001b: Failed to get reset-gpios, maybe no use

处理:
1、这是摄像头配置,若硬件环境不支持,去掉xc7160该项相关编译即可

npu 报错

1
2
3
4
5
6
7
8
9
10
11
12
13
[    4.133806] RKNPU fde40000.npu: Linked as a consumer to fde4b000.iommu       
[ 4.134239] RKNPU fde40000.npu: RKNPU: rknpu iommu is enabled, using iommu me
[ 4.134364] RKNPU fde40000.npu: Linked as a consumer to regulator.22
[ 4.134384] RKNPU fde40000.npu: can't request region for resource [mem 0xfde]
[ 4.134903] [drm] Initialized rknpu 0.4.2 20210701 for fde40000.npu on minor1
[ 4.135152] RKNPU fde40000.npu: leakage=5
[ 4.135192] RKNPU fde40000.npu: pvtm = 90570, from nvmem
[ 4.135605] RKNPU fde40000.npu: avs=0
[ 4.136379] RKNPU fde40000.npu: l=0 h=2147483647 hyst=5000 l_limit=0 h_limit0
[ 4.136436] RKNPU fde40000.npu: failed to find power_model node
[ 4.136463] RKNPU fde40000.npu: RKNPU: failed to initialize power model
[ 4.136485] RKNPU fde40000.npu: RKNPU: failed to get dynamic-coefficient

处理:
1、确认NPU 芯片供电及dts配置,必要时禁用 NPU。

dts配置问题

1
2
[    4.137819] rockchip-pm rockchip-suspend: not set pwm-regulator-config 

处理:dts补充相关配置

wifi配置问题

1
2
3
4
5
6
 ======== dhd_wlan_deinit_plat_data ========                                 
[ 4.131624] dhd_module_init: Failed to load the driver, try cnt 0
[ 4.131664] dhd_module_init: Failed to load driver max retry reached**
[ 4.131673] dhd_module_init: Exit err=-19
[ 4.132057] ==gsl_ts_init==
[ 4.132117] ret=0

处理:
1、更新最新驱动源码或者 wireless_wlan相关使其disabled

卡在pcie

1
2
rk-pcie 3c0800000.pcie: PCIe Linking... LTSSM is 0x0

处理:PCIe3.0 的 PHY 工作异常

mmc3出错

1
2
3
4
   1.717334] mmc3 mmc_send_io_op_cond err: -110                                                                                                       
v� 1.717839]
[ 1.777562] vendor storage:20190527 ret = 0

和mmc相关错误

1
2
3
4
5
[ 2.059405] rockchip-csi2-dphy0: No link between dphy and sensor

[ 2.059418] rkisp-vir0: update sensor failed

v? 2.065622]

处理:
1、firefly sdk中对mmc做了改动,需要替换rk原厂mmc驱动代码

串口2开启问题

1
2
3
4
[    2.192160] rockchip-system-monitor rockchip-system-monitor: system monitor probe
[ 2.193444] Serial: 8250/16550 driver, 10 ports, IRQ sharing disabled
[ 2.194341] feb50000.serial: ttyS2 at MMIO 0xfeb50000 (irq = 80, base_baud = 1500000) is a 16550A

原因:
1、deconfig 中需要开启 以下配置

1
2
3
4
5
6
7
8
9
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
CONFIG_SERIAL_8250_BCM2835AUX=y
CONFIG_SERIAL_8250_DW=y
CONFIG_SERIAL_8250_OMAP=y
CONFIG_SERIAL_8250_MT6577=y
CONFIG_SERIAL_8250_UNIPHIER=y

2、fiq_debugger 调试口可能与普通串口冲突,需要修改串口配置

1
2
3
4
5
6
7
8
9
10
11
12
fiq_debugger: fiq-debugger {
compatible = "rockchip,fiq-debugger";
rockchip,serial-id = <2>;
rockchip,wake-irq = <0>;
/* If enable uart uses irq instead of fiq */
rockchip,irq-mode-enable = <1>;
rockchip,baudrate = <1500000>; /* Only 115200 and 1500000 */
interrupts = <GIC_SPI 423 IRQ_TYPE_LEVEL_LOW>;
pinctrl-names = "default";
pinctrl-0 = <&uart2m0_xfer>;
status = "okay";
};

待完善…