最近给笔记本换了一个固态,顺便就重装了一下系统,版本是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. 为什么要有 Servlet ,什么是 Servlet 容器,什么是 Web 容器?

    本文已收录至 https://github.com/yessimida/yes ,这里有我的所有文章分类汇总,欢迎 star! 以下代码相信大家都很熟悉,大学时学 Java Web 都写过这样的代码. ...

  2. centos 7.0下安装MySQL 5.7.26

    1.下载MySQL 5.7.26安装包,卸载自带MySQL数据库 yum remove mariadb-libs -y yum install -y libaio-devel 2.上传MySQL 5. ...

  3. oracle DG搭建

    Oracle DG 搭建1. 环境 OS IP hostname db_name DB_UNIQUE_NAME主库 RHEL 5.4 192.168.12.20 edgzrip1.oracle.com ...

  4. 面试 11-00.JavaScript高级面试

    11-00.JavaScript高级面试 #前言 一.基础知识: ES 6常用语法:class .module.Promise等 原型高级应用:结合 jQuery 和 zepto 源码 异步全面讲解: ...

  5. 容器编排系统之DaemonSet、Job和CronJob控制器

    前文我们了解了k8s上的pod控制器中的常用的两种控制器ReplicaSet和Deployment控制器的相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/ ...

  6. SpringCloud 的版本问题 (深入)

    学过SpringCloud 的 同学 ,就应该知道,SpringCloud是一个生态 . Spring Cloud是一个由众多独立子项目组成的大型综合项目,每个子项目都维护着自己的发布版本号.Spri ...

  7. 关于BAPI_ACC_DOCUMENT_POST解读

    BAPI_ACC_DOCUMENT_POST是SAP ERP提供生成会计凭证的标准BAPI,这个BAPI可以用到多种场景生成会计凭证,实际项目中一般情况下更多的是生成应收和应付的会计凭证,分别对应客户 ...

  8. 微信小程序--相对路径和绝对路径

    相对路径: ../表示返回访问上一级目录 如:../../components/like/index 绝对路径: 以"/"开头 表示从根目录开始寻找文件 如:/components ...

  9. 服务器挂掉导致需要对k8s新增节点

    [导读]今日是周六,本想午休起来之后写篇有关kubernetes service的文章,没想到两台虚拟机接连挂掉,所以又重新创建了两台虚拟机.新建时又一直黑屏,所以只能克隆. 由于虚拟机是新建的,所以 ...

  10. SQL语句中case,when,then的用法

    用法如下bai: 复制代码 SELECT s.s_id, s.s_name, s.s_sex, CASE WHENs.s_sex='1'THEN'男' WHENs.s_sex='2'THEN'女' E ...