解决 Ubuntu系统不能进入系统、登陆后黑屏、soft lockup、分辨率显示异常等若干问题

本文介绍了如何解决Ubuntu 18.04系统在启动时遇到的watchdog BUG: soft lockup问题以及登陆后显示低分辨率的问题。通过在启动时添加nomodeset参数进入系统,然后卸载并禁用nouveau驱动,最后安装Nvidia驱动以解决显卡驱动导致的故障。详细步骤包括禁用nouveau,更新初始化内核,安装Nvidia驱动并重启。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决 Ubuntu系统不能进入系统、登陆后黑屏、soft lockup、分辨率显示异常等若干问题

我的环境

  • 系统:Windows 10/Ubuntu 18.04双系统 X64
  • 显卡:Nvidia GForce GTX 1050
  • 分辨率:1920*1080

问题说明

我遇到的问题是:
1.选择 Ubuntu系统启动,出现 watchdog : BUG :soft lockup - CPU 等问题,等待2分钟依然进入不了系统;
2.进入系统后分辨率显示不到最高分辨率。

解决问题

这些问题基本可以归结为显卡驱动问题,可以通过更换显卡驱动解决问题。想要更换驱动就得想办法进入系统。

进入系统

进入不了系统,长按电源键强制重启。在选择 Ubuntu系统进入时,不要直接按ENTER键进入,按e进入编辑模式 找到quiet splash在后面追加nomodeset,即

quiet splash 变为
quiet splash nomodeset

这一步的目的是不加载显卡启动。然后按Ctrl+X启动。就可以进入系统。

进入系统后准备更换驱动。下载Nvidia驱动:

<think>我们正在讨论Linux内核中的两种锁死(lockup问题soft lockup和workqueue lockup。这两种锁死虽然都表现为系统或部分功能停滞,但它们的触发机制、影响范围和调试方法有本质区别。下面我将从多个维度进行对比分析: --- ### 一、定义与检测机制 | 特性 | Soft Lockup | Workqueue Lockup | |---------------|------------------------------------------|------------------------------------------| | **本质** | CPU核心长时间无法调度内核线程 | 工作队列线程被阻塞导致任务积压 | | **检测器** | NMI中断(通过`watchdog`进程)[^2] | 工作队列看门狗(`wq_watchdog`)[^1] | | **阈值** | 默认20秒(`kernel.watchdog_thresh`) | 默认30秒(`kernel.workqueue.watchdog_thresh`) | | **触发条件** | CPU未释放`softlockup_touch_ts`时间戳 | 工作项执行时间超过阈值且未主动更新触摸时间 | > **数学表达**: > 设$t_{thresh}$为阈值,$t_{now}$为当前时间,$t_{touch}$为最后更新时间戳: > - Soft Lockup: $t_{now} - t_{touch} > t_{thresh}$ > - Workqueue Lockup: $\exists \text{ work } w_i, \text{ } t_{now} - w_i.\text{start\_time} > t_{thresh}$ --- ### 二、根本原因对比 #### 1. Soft Lockup - **CPU资源被独占** - 中断处理程序(ISR)或内核线程长时间占用CPU(如死循环) ```c // 典型错误代码:内核模块中的死循环 while (condition) { // 未调用cond_resched()释放CPU } ``` - **调度器失效** - 实时进程(RT)以`SCHED_FIFO`优先级99运行且不主动让出CPU #### 2. Workqueue Lockup - **工作项阻塞** - 工作队列中的任务(`work_struct`)执行同步操作时被阻塞: - 等待锁(如`mutex_lock`)但持锁者被抢占 - 内存分配(`GFP_KERNEL`)时因内存不足陷入直接回收 - **资源死锁** - 工作线程与其他执行上下文(如中断)发生循环锁依赖 > **关键区别**: > - Soft Lockup是**CPU级故障**,表现为整个核心停滞 > - Workqueue Lockup是**任务级故障**,仅影响关联工作队列的任务 --- ### 三、诊断方法差异 #### 1. Soft Lockup调试 - 强制触发SysRq调用栈: ```bash echo l > /proc/sysrq-trigger # 打印所有CPU的堆栈 ``` - 分析堆栈中的**循环点**或**长时间原子操作** #### 2. Workqueue Lockup调试 - 检查工作队列状态: ```bash cat /sys/kernel/debug/workqueue/workqueue/state ``` - 定位阻塞的工作项: ```text BUG: workqueue lockup - pool cpus=0 ... workqueue events: flags=0x0 pending: do_cache_clean, neigh_managed_work <-- 阻塞任务列表 ``` --- ### 四、解决方案对比 | 措施 | Soft Lockup | Workqueue Lockup | |---------------------|------------------------------|-------------------------------| | **紧急恢复** | 重启CPU核心(可能需系统重启) | 取消排队的工作项或重启线程池 | | **代码修复** | 添加`cond_resched()`调用点 | 改用`WQ_MEM_RECLAIM`队列[^3] | | **配置调整** | 增大`watchdog_thresh` | 限制工作项并发数(`max_active`) | | **硬件相关** | 检查CPU过热/超频 | 排除设备驱动阻塞(如NVMe超时) | > **代码示例**(避免Workqueue阻塞): > ```c > // 创建具有内存回收能力的工作队列 > struct workqueue_struct *wq = > alloc_workqueue("wq_name", WQ_MEM_RECLAIM | WQ_HIGHPRI, 0); > ``` --- ### 五、典型案例分析 #### 案例1: Soft Lockup(NVMe驱动) - **现象**:`CPU#0 stuck for 22s`,调用栈卡在`nvme_wait_ready` - **原因**:NVMe控制器未响应导致忙等待循环 - **修复**:添加延迟并检查超时 #### 案例2: Workqueue Lockup(文件系统- **现象**:`workqueue lockup - pool cpus=1`,`wb_workfn`阻塞 - **原因**:`writeback`工作项在直接回收内存时被阻塞 - **修复**:改用`GFP_NOIO`分配模式 --- ### 六、总结对比表 | 维度 | Soft Lockup | Workqueue Lockup | |--------------|------------------------------|-------------------------------| | **影响范围** | 整个CPU核心 | 特定工作队列的任务 | | **根源** | CPU调度被抢占失败 | 工作项执行路径阻塞 | | **调试工具** | SysRq + NMI | `workqueue`调试接口 | | **修复重点** | 中断/实时进程优化 | 异步化阻塞操作 | > 当两者同时发生时,通常**Soft Lockup是根本原因**:某个CPU被完全占用后,运行在该CPU上的工作队列线程也无法执行[^1][^2]。 §§相关问题§§ 1. 如何配置Linux内核的watchdog阈值来调整锁死检测灵敏度? 2. 在编写内核模块时,哪些API可以安全地用于工作队列中? 3. 为什么内存压力会同时导致soft lockup和workqueue lockup? 4. Linux内核中有哪些替代工作队列的异步任务机制?</think>### Linux系统中"soft lockup"与"workqueue lockup"的本质区别 在Linux内核调试中,**soft lockup**和**workqueue lockup**是两种不同类型的系统停滞问题,它们的触发机制、影响范围和调试方法有本质区别: --- #### 一、核心区别对比表 | 特性 | Soft Lockup | Workqueue Lockup | |---------------------|----------------------------------------|---------------------------------------| | **检测机制** | NMI中断通过`watchdog`进程监控[^2] | 工作队列专用看门狗`wq_watchdog`[^1] | | **触发条件** | CPU核心无法调度内核线程 | 工作队列线程执行超时 | | **影响范围** | 整个CPU核心停滞 | 特定工作队列任务积压 | | **默认阈值** | 20秒(`kernel.watchdog_thresh`) | 30秒(`kernel.workqueue.watchdog_thresh`)| | **根本原因** | CPU被独占(如死循环/实时进程) | 工作项阻塞(如死锁/长时I/O) | | **典型调用栈特征** | `__schedule+0x...`卡在循环或锁等待 | `process_one_work+0x...`卡在驱动函数 | --- #### 二、机制差异详解 1. **Soft Lockup(软锁死)** - **本质**:CPU核心**完全失去调度能力** - **检测原理**: - 每个CPU有一个`watchdog`线程定期更新时间戳 - 当NMI中断发现时间戳超过阈值时触发 ```c // kernel/watchdog.c void touch_softlockup_watchdog(void) { per_cpu(watchdog_touch_ts, cpu) = SOFTLOCKUP_RESET; // 更新时间戳 } ``` - **典型场景**: - 内核死循环未调用`cond_resched()` - 实时进程(`SCHED_FIFO`)独占CPU[^2] - 中断处理程序超时 2. **Workqueue Lockup(工作队列锁死)** - **本质**:**特定工作线程**被阻塞导致任务积压 - **检测原理**: - 每个工作项记录开始时间戳 - 定时检查执行时长是否超阈值 ```c // kernel/workqueue/watchdog.c wq_watchdog_touch_workqueue(work) { work->start_time = jiffies; // 记录启动时间 } ``` - **典型场景**: - 驱动工作项等待永不释放的锁 - 内存回收阻塞在`GFP_KERNEL`分配 - 文件系统操作卡在I/O(如示例中的`wb_workfn`) --- #### 三、调试方法对比 | **调试手段** | Soft Lockup | Workqueue Lockup | |---------------------|--------------------------------------|-------------------------------------| | **关键日志** | `BUG: soft lockup - CPU#X stuck!` | `BUG: workqueue lockup - pool cpus=X` | | **SysRq命令** | `echo l > /proc/sysrq-trigger` | `echo w > /proc/sysrq-trigger` | | **状态检查** | `cat /proc/softlockups` | `cat /sys/kernel/debug/workqueue/state` | | **代码修复重点** | 添加抢占点(`cond_resched()`) | 拆分长任务/使用`WQ_MEM_RECLAIM` | --- #### 四、典型案例分析 1. **Soft Lockup案例** - 现象:NVMe驱动忙等待控制器响应 ```dmesg BUG: soft lockup - CPU#1 stuck for 23s! [nvme:1234] Call Trace: __schedule+0x2e0/0x860 nvme_wait_ready+0x75/0x120 [nvme] // 死循环等待 ``` - 修复:添加延迟检查+超时退出 2. **Workqueue Lockup案例** - 现象:文件系统写回任务卡在内存回收 ```dmesg workqueue lockup: writeback pool cpus=0 pending: wb_workfn (mm/page-writeback.c:2600) ``` - 修复:改用`GFP_NOIO`分配策略 --- #### 五、数学关系模型 设$t_{thresh}$为阈值,$t_{exec}$为执行时间: - **Soft Lockup触发条件**: $$\forall \text{ CPU}_i, \Delta t_i = t_{now} - t_{touch,i} > t_{thresh}$$ - **Workqueue Lockup触发条件**: $$\exists \text{ work } w_j \in \text{ WQ}_k, \Delta t_j = t_{now} - w_j.\text{start_time} > t_{thresh}$$ > 这表明workqueue lockup是**存在性条件**(某个任务阻塞),而soft lockup是**全称条件**(整个CPU停滞)[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值