Linux(Ubuntu)无法调节亮度的终极解决方案(还原Fn组合键调节方法

5年前我花了一周时间也没解决的问题,现在只用了2个小时就完美解决了

重要提示

这篇文章展示了我的思考及尝试过程,其中一些诸如文件保存的方法等简单操作没有加入,如果你很着急或是刚刚接触Linux,请参考这篇精简版【地址摸我】

参考资料:[1]https://blog.csdn.net/u013991521/article/details/49562365
[2]https://askubuntu.com/questions/762764/cant-change-brightness-in-ubuntu-16-04-lts

本人的一台联想昭阳E46G笔记本(无独显),在被换上i5 520M、4G内存、120G ssd之后继续延续着他第8年的使命。
尽管如此,但即便是windows7也无法流畅的在这台老机器上运行了。于是,我重新给他装上了Linux系统(5年前尝试了基于Debian 8 某Linux发行版,这次是Ubuntu 18.04 LTS)

不出所料,5年前的BUG又一次的出现了!!

只能在结束boot界面后到Ubuntu的logo出现的那短短几秒的时间可以通过Fn组合键调节亮度!!进入系统后使用Fn调节亮度,屏幕的亮度调节滑块正常显示,但屏幕背光没有丝毫改变

全亮与一格亮度对比【没有任何变化】
全亮与一格亮度对比【没有任何变化】

然而这个现象在我的另一台笔记本上却没有出现。

附上未出BUG机器的配置:
Model:ASUS X84L
CPU:intel B815 @1.60GHz
RAM:2G DDR3
HDD:320G WD
GPU:AMD HD6470m 1G

在查阅多方资料与不断尝试后,我发现是因为Intel集成显卡的原因。
原因如下:

fn调节的是/sys/class/backlight/acpi_video0/brightness文件,而Intel的文件是/sys/class/backlight/intel_backlight/brightness
-------来自参考资料[1]

参考资料[1]中给出了两种解决方案:
1)通过修改/etc/default/grub 来实现对Intel显卡的支持
2)手动通过命令修改

然而第1种方案对我无效,而我喜欢经常调节亮度,法2实在过于麻烦。

参考资料[2]中也有一种方案,但依旧对我无效。

由于发现是外文资料,且国内好像无人翻译,现翻译在另一篇文章上,可以先尝试一下【地址摸我】

解决思路

经过实验发现,在通过Fn组合键促发亮度调节功能时,系统的亮度logo会有正常响应
在这里插入图片描述
而且,/sys/class/backlight/acpi_video0/brightness 会有变化

!我可以写一个程序监控/sys/class/backlight/acpi_video0/brightness ,然后反手把读出来的值经过处理写到/sys/class/backlight/intel_backlight/brightness!

观察得出:
我的/sys/class/backlight/acpi_video0/brightness 值的范围在[0,10],且0时为最暗但不是黑屏,10为最亮

我的/sys/class/backlight/intel_backlight/brightness值的范围在[0,4882],且0时为最暗且为黑屏,4882为最亮

写入超出范围的值均会触发写入错误。
注:图片仅为文件格式展示,不代表最低/高值

注:图片仅为文件格式展示,不代表最低/高值

于是就有了第一代程序

import time
import os
# 先赋777权限(其实这里给高了,不过没关系
os.system("sudo chmod -R 777 /sys/class/backlight/intel_backlight/brightness")
while True:
	# 先读取Fn组合键保存的文件
	acpi_l = open("/sys/class/backlight/acpi_video0/brightness")
	# 简单的线性调整,偏置值+20 为了在调至最暗时不至于黑屏 480权重请自己测试,不同机型可能不一样
	brightness= str(int(acpi_l.read()) * 480 + 20)
	acpi_l.close()
	
	# 以“w”模式打开,方便清空
	intel_l = open("/sys/class/backlight/intel_backlight/brightness","w")
	intel_l.write(brightness)
	intel_l.close()
	# 等待0.5s,在不过多占用系统资源的情况下获得较好的体验
	time.sleep(0.5)

先解释下为什么要每次给写入权限:因为sys目录里的权限掉电会还原,所以每次都要打上。
然而这样的操作很麻烦,每次先不说要打开一个文件,还要输密码,而且还要给他一个单独的shell占用着。

拓展1

我先创建了/etc/rc.local文件(Ubuntu16.10以后就没有了)
加入了

# 注:为了精简,这里的/etc/rc.local文件内容仅包含有实际意义的部分
sudo chmod -R 777 /sys/class/backlight/intel_backlight/brightness
python /etc/auto_brightness/change.py

然后重启

结果卡死在启动界面!!
赶紧进入可读写的单用户模式把rc.local删了。

分析原因

Linux的开机启动项目必须执行完才能进入桌面,然而 while True。。。。

难道这与开机自启无缘了吗?

拓展2

其实用screen就可以完美解决!
要使用screen,请先执行

sudo apt-get install screen

然后建立一个sh文件

screen_name="auto_run"

screen -dmS $screen_name
#以下路径为python程序的路径
cmd="python3 /etc/auto_run/change.py";

screen -x -S $screen_name -p 0 -X stuff "$cmd"  

screen -x -S $screen_name -p 0 -X stuff '\n'   

在/etc/rc.local中加入
如果没找到/etc/rc.local,请参考https://blog.csdn.net/weixin_43599336/article/details/85970601

sudo chmod -R 777 /sys/class/backlight/intel_backlight/brightness
# 刚刚的sh文件路径
sh /etc/auto_run/auto_run.sh

重启

sudo reboot

问题解决!

在这里插入图片描述
通过反光就看得出来!!!

拓展3

你以为就这么结束了吗?
其实我觉得个人喜欢的亮度范围在[500,2500]之间,如果用线性变化有时会出现加一格嫌亮,降一格觉得暗的情况。
于是我就开始用了一个新的处理函数
10.8x2 + 299x + 201
整个程序就变成了这样

import time
while True:
        acpi_l = open("/sys/class/backlight/acpi_video0/brightness")
        l = int(acpi_l.read())
        brightness = str(int(10.8 * l * l + 299 * l + 201))

        intel_l = open("/sys/class/backlight/intel_backlight/brightness","w")
        intel_l.write(brightness)
        intel_l.close()
        time.sleep(0.5)

这个函数可以使亮度调节的中后段调节更加的细腻,更符合我的个人习惯
要注意的一点是:一点要确保当l在[0,10]时,你的函数值不会小于0或溢出最大值(我的是4880)

猜你喜欢

转载自blog.csdn.net/weixin_43599336/article/details/85981442