最近给笔记本换了一个固态,顺便就重装了一下系统,版本是Ubuntu 20.10。装完之后各种功能基本都是正常的,触摸板轻触单击、双指右键等功能开箱即用。但是在安装完最新的Nvidia驱动之后就出现了问题,系统挂起之后就无法唤醒了,只有一个光标在屏幕上一直闪。

这种基本上都是硬件的兼容问题,要么就寄希望于内核和驱动的更新,要么就换一个linux发行版。但是由于我重装之前应该是正常的,就导致我非常难受,想要解决这个问题。linux这类问题千变万化,很多时候搜遍互联网也没法解决。但这次运气不错,找到了问题的症结,并且有一定的普适性。

I found a solution which should work for everyone.

Worked for me! In fact, it is the only damned thing that ever worked for me.

问题原因

Linux系统向上为用户提供良好的操作界面,向下管理各种硬件和资源。其中包括开关机、挂起和唤醒、休眠等,还有Fn功能键等。软件与硬件沟通中间渠道就是通过固件,这部分是由硬件厂商提供的,一般写在BIOS里。ACPI是一个重要的规范,称作高级配置与电源接口。由于现在Windows是操作系统的绝对的主流,很多厂商在设计的时候就没有考虑到其他操作系统比如Linux,就会导致很多功能无法正常的工作。

不过好在这个现象已经引起Linux开发者的注意,并且提供了一个acpi_osi=的选项,可以让固件提供和Windows相同的功能。

解决方法

ACPI的DSDT提供了对操作系统的识别功能,我们可以用如下的命令查看DSDT支持什么样的系统版本:

$ sudo strings /sys/firmware/acpi/tables/DSDT | grep -i 'windows ' | sort

在我的电脑上包括Windows 2009Windows 2012Windows 2013三个返回值,分别代表的是Windows 7,8和8.1。接下来只需要给内核增加一个参数,就可以让硬件识别为Windows了。具体的方法是在/etc/defalut/grub中给GRUB_CMDLINE_LINUX增加acpi_osi=参数,大概像下面这个样子:

GRUB_CMDLINE_LINUX="acpi_osi=! \"acpi_osi=Windows 2015\""

接着,执行sudo update-grub命令就可以将配置部署到Grub上了。重启系统,执行

$ cat /proc/cmdline

可以看到启动参数已经被添加成功了。在这种情况下,如果问题是这个导致的话已经可以解决了。如果不行,几个Windows版本都可以试一试,我用的是Windows 2009才可以。但即使你的问题没有被完全解决,仍然推荐保留这个选项来保证ACPI的全功能,包括省电、CPU保护等不明显的功能。

自动化脚本

如果不想了解那么多细节的话,可以直接通过一个脚本自动化的完成上述的修改。

#!/bin/sh
VERSION="$(sudo strings /sys/firmware/acpi/tables/DSDT | grep -i 'windows ' | sort | tail -1)"
echo 'Linux kernel command-line options required: acpi_osi=! "acpi_osi='$VERSION'"'
read -p "Do you want to add this setting (y/n) ? " answer
if [ x$answer != xY -a x$answer != xy ]; then
exit 1
fi
echo "Existing Command Line: ` sed -n '/.*linux[[:space:]].*root=\(.*\)/{s//BOOT_IMAGE=\1/ p;q;}' /boot/grub/grub.cfg `"
if grep -m 1 'acpi_osi=Windows' -q /etc/default/grub; then
echo "There is already an entry; please remove it from /etc/default/grub and redo 'sudo update-grub' then re-run this script"
exit 2
fi
sudo sed -i "s/^\(GRUB_CMDLINE_LINUX=.*\)\"$/\1 acpi_osi=! \\\\\"acpi_osi=$VERSION\\\\\"\"/" /etc/default/grub
echo "Modified Command Line: ` sed -n '/.*linux[[:space:]].*root=\(.*\)/{s//BOOT_IMAGE=\1/ p;q;}' /boot/grub/grub.cfg `"
sudo update-grub

保存为.sh文件执行即可。

终于可以愉快的休眠了,这个功能对笔记本来说太重要了。

  1. https://forums.developer.nvidia.com/t/solution-for-nvidia-sleep-wake-issue-in-linux/110911
  2. https://iam.tj/prototype/enhancements/Windows-acpi_osi.html

Ubuntu/Liinux睡眠无法唤醒解决方法:ACPI设置的更多相关文章

  1. windows8 8.1 安装完 ubuntu无法挂载 ntfs分区 解决方法

    windows8 8.1 安装完 ubuntu无法挂载 ntfs分区 解决方法: 最近安装完发现8.1系统后,ubuntu无法加载以前的ntfs分区了,特别是我添加到了/etc/fstab里面了 导致 ...

  2. ubuntu boot空间不足的解决方法

    ubuntu boot空间不足的解决方法 2013年12月11日 11:11:39 yypony 阅读数:17000 标签: ubuntu内存boot内核更多 个人分类: linux_usageubu ...

  3. Ubuntu几种常见乱码解决方法

    一.网页中的flash乱码:        ubuntu默认浏览器是Firefox,但是Ubuntu默认不安装像flash这种带版权的软件,所以当你浏览像youku或网页播放器时,这种带有 flash ...

  4. VMware 12虚拟机下Ubuntu 16连不上网解决方法

    打开自带Firefox浏览器,显示连接不上网,终端下 ping 也显示 unkown   解决方法: 1.打开虚拟机的“编辑”选项,选择“虚拟网络编辑器” 2.选择VMnet8(我不知道为啥VMnet ...

  5. win7远程连接ubuntu,出现灰屏解决方法

      问题: win7远程虚拟机ubuntu 12.04出现灰色屏幕 打开windows自带的远程桌面连接.输入ubuntu虚拟机的IP地址 可以连接上,输入username和password 点击OK ...

  6. Ubuntu里node命令无效解决方法

    在ubuntu里用sudo apt-get install nodejs安装Node.js后, 会发现terminals里运行node命令(比如node –-version)时候会有No such f ...

  7. VMware上安装的Ubuntu不显示全屏解决方法

    花费了好一会才把电脑上的Vmware装上,把Ubuntu装到虚拟机上,谁知道Ubuntu不显示全屏,我调了分辨率,奈何Ubuntu里面固定的分辨率没有跟我电脑匹配的,然后开始寻找解决方法,在网上找了很 ...

  8. ubuntu安装bower失败的解决方法

    1.安装nodejs 2.安装npm 3.安装bower 最开始使用 npm install bower -g / sudo npm install bower -g 安装bower后 命令行输入bo ...

  9. ubuntu/debian gpg error no_pubkey 解决方法

    GPG error: http://ppa.launchpad.net precise Release: The following signatures couldn’t be verified b ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:Qt Designer中部件的enabled属性

    enabled属性非常简单,最开始老猿没准备介绍该属性的,因为大家都应该知道,但仔细看了看官网文章,觉得还是有些细节可能很少有人注意到,因此还是在此介绍一下. enabled属性用于表示部件是否可用, ...

  2. 基于CefSharp开发(六)浏览器网页缩放

    一.网页缩放分析 缩放入口 1.Ctrl + 鼠标滑轮缩放 2.菜单中缩放子菜单缩放 3.搜索框中网页缩放按钮缩放 缩放属性及命令 ChromiumWebBrowser 提供了缩放量值.缩放级别.放大 ...

  3. ollvm在VS2017下编译

    0x1,首先介绍一下编译环境配置 1.UE4.25 2.vs2017(15.9),注:2019编译总是出现错误 3.cmake3.18.5,cmake的作用是为ollvm源码编译成适合于在vs2017 ...

  4. Docker环境复现利用Redis未授权访问漏洞 >> 批量扫描检测利用

    关于Redis Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库 ...

  5. Linux的一些基本操作

    1. 解压,对于tar格式和zip格式不同,后者是unzip test.zip ,如果要解压到指定路径是 unzip test.zip -d ../

  6. LeetCode初级算法之数组:48 旋转图像

    旋转图像 题目地址:https://leetcode-cn.com/problems/rotate-image/ 给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: ...

  7. AcWing 326. XOR和路径

    大型补档计划 题目链接 如果整体来做,发现既有加法,也有整体异或,这样不容易搞. 考虑异或,各个位置互不干扰,按位考虑一下. 枚举每一位 \(k\) 发现如果设 \(f[u]\) 为这一位的期望结果还 ...

  8. 【python接口自动化】- 使用json及jsonpath转换和提取数据

    前言 ​ JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.它可以让人们很容易的进行阅读和编写,同时也方便了机器进行解析和生成,适用于进行数据交互的场景,比如 ...

  9. springboot:异步调用@Async

    在后端开发中经常遇到一些耗时或者第三方系统调用的情况,我们知道Java程序一般的执行流程是顺序执行(不考虑多线程并发的情况),但是顺序执行的效率肯定是无法达到我们的预期的,这时就期望可以并行执行,常规 ...

  10. mysql 8.0 改变数据目录和日志目录(一)

    一.背景 原数据库数据目录:/data/mysql3306/data,日志文件目录:/data/mysql3306/binlog 变更后数据库目录:/mysqldata/3306/data,日志文件目 ...