Ubuntu/Liinux睡眠无法唤醒解决方法:ACPI设置
最近给笔记本换了一个固态,顺便就重装了一下系统,版本是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 2009
,Windows 2012
,Windows 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文件执行即可。
终于可以愉快的休眠了,这个功能对笔记本来说太重要了。
- https://forums.developer.nvidia.com/t/solution-for-nvidia-sleep-wake-issue-in-linux/110911
- https://iam.tj/prototype/enhancements/Windows-acpi_osi.html
Ubuntu/Liinux睡眠无法唤醒解决方法:ACPI设置的更多相关文章
- windows8 8.1 安装完 ubuntu无法挂载 ntfs分区 解决方法
windows8 8.1 安装完 ubuntu无法挂载 ntfs分区 解决方法: 最近安装完发现8.1系统后,ubuntu无法加载以前的ntfs分区了,特别是我添加到了/etc/fstab里面了 导致 ...
- ubuntu boot空间不足的解决方法
ubuntu boot空间不足的解决方法 2013年12月11日 11:11:39 yypony 阅读数:17000 标签: ubuntu内存boot内核更多 个人分类: linux_usageubu ...
- Ubuntu几种常见乱码解决方法
一.网页中的flash乱码: ubuntu默认浏览器是Firefox,但是Ubuntu默认不安装像flash这种带版权的软件,所以当你浏览像youku或网页播放器时,这种带有 flash ...
- VMware 12虚拟机下Ubuntu 16连不上网解决方法
打开自带Firefox浏览器,显示连接不上网,终端下 ping 也显示 unkown 解决方法: 1.打开虚拟机的“编辑”选项,选择“虚拟网络编辑器” 2.选择VMnet8(我不知道为啥VMnet ...
- win7远程连接ubuntu,出现灰屏解决方法
问题: win7远程虚拟机ubuntu 12.04出现灰色屏幕 打开windows自带的远程桌面连接.输入ubuntu虚拟机的IP地址 可以连接上,输入username和password 点击OK ...
- Ubuntu里node命令无效解决方法
在ubuntu里用sudo apt-get install nodejs安装Node.js后, 会发现terminals里运行node命令(比如node –-version)时候会有No such f ...
- VMware上安装的Ubuntu不显示全屏解决方法
花费了好一会才把电脑上的Vmware装上,把Ubuntu装到虚拟机上,谁知道Ubuntu不显示全屏,我调了分辨率,奈何Ubuntu里面固定的分辨率没有跟我电脑匹配的,然后开始寻找解决方法,在网上找了很 ...
- ubuntu安装bower失败的解决方法
1.安装nodejs 2.安装npm 3.安装bower 最开始使用 npm install bower -g / sudo npm install bower -g 安装bower后 命令行输入bo ...
- ubuntu/debian gpg error no_pubkey 解决方法
GPG error: http://ppa.launchpad.net precise Release: The following signatures couldn’t be verified b ...
随机推荐
- 【科技】位运算(bitset)优化最长公共子序列算法
最长公共子序列(LCS)问题 你有两个字符串 \(A,B\),字符集为 \(\Sigma\),求 \(A, B\) 的最长公共子序列. 简单动态规划 首先有一个广为人知的 dp:\(f_{i,j}\) ...
- hashmap为什么是二倍扩容?
这个很简单,首先我们考虑一个问题,为什么hashmap的容量为2的幂次方,查看源码即可发现在计算存储位置时,计算式为: (n-1)&hash(key) 容量n为2的幂次方,n-1的二进制会全为 ...
- PsySH作为调试器
PsySH作为调试器 PsySH可以用来在脚本中设置一个断点,在这个断点处它将暂停并提供对shell的访问,以检查变量并在断点所在位置的上下文中运行命令.目前它不支持逐步调试(如xdebug),但在需 ...
- asp.net在线人数限制
1.网站启动初始化在线人数变量 Application["WebsiteCount"] = 0; 2.新的会话进来 只有在全新的会话进来的时候,该方法才会执行.可以过滤掉某些不需要 ...
- 【Go语言绘图】图片的旋转
在上一篇中,我们了解了gg库的基本使用,包括调整大小.调整圆形参数.设置颜色.保存图片.加载图片和裁剪.这一篇我们来学习一下图片的旋转. 加载图片 首先,我们先来一张黄图. func TestRota ...
- [日常摸鱼]poj2417 DiscreteLogging-BSGS算法
在这题TLE了一天-T_T BSGS裸题-不知道为什么一直挂 第二天(也就是今天)换成黄学长博客里的写法就过掉了 题意:解关于$x$的方程:$a^x \equiv b \pmod{p}$,$p$为质数 ...
- 详述网络中ARP安全的综合功能
组网图形 ARP安全简介 ARP(Address Resolution Protocol)安全是针对ARP攻击的一种安全特性,它通过一系列对ARP表项学习和ARP报文处理的限制.检查等措施来保证网络设 ...
- ADO.NET 帮助类 参数传递 存储过程 分页
SQLHelper public class SqlHelper { private readonly string _constr = ConfigurationManager.Connection ...
- 对路径binroslyn..的访问被拒绝
一开始的解决办法就是把bin下的文件都删除了,但是roslyn文件夹下的部分文件一直被占用,必须进程中把vbcscompiler进程干掉,才能删除,再重新编译,就没问题了.
- Winform程序及dll打包成一个可执行的exe
使用场景 通常开发的Winform程序,引用了其他类库后,在输出目录下都会产生很多DLL文件,exe执行时必须依赖这些DLL.想要Winform程序只有一个可执行exe文件,又不想打包成安装包,就可以 ...