背光
屏幕背光可能难以控制。在某些机器上,物理硬件开关缺失,软件解决方案可能无法很好地工作。然而,通常可以为给定的硬件找到一个功能性的方法。本文旨在总结所有可能的调整背光的方法。
有许多方法可以控制显示器、笔记本电脑或集成面板(如 iMac)的亮度。根据这些 讨论和这个维基页面,控制方法可以分为以下几类:
- 亮度由供应商指定的快捷键控制,操作系统没有接口可以调整亮度。
- 亮度由 ACPI、图形或平台驱动程序控制。在这种情况下,背光控制通过
/sys/class/backlight暴露给用户,用户空间背光工具可以使用它。 - 亮度通过写入图形卡寄存器来控制,可以使用setpci。
硬件接口
ACPI
屏幕背光的亮度是通过设置背光 LED 或阴极的功率级别来调整的。功率级别通常可以使用视频的 ACPI 内核模块来控制。该模块的接口通过/sys/class/backlight/下的sysfs(5)目录提供。
目录的名称取决于显卡型号。
$ ls /sys/class/backlight/
acpi_video0
在这种情况下,背光由 ATI 显卡管理。对于 Intel 显卡,目录名为intel_backlight。在以下示例中,使用了acpi_video0。如果您使用 Intel 显卡,只需在示例中将acpi_video0替换为intel_backlight。
该目录包含以下与亮度相关的文件:
$ ls /sys/class/backlight/acpi_video0/*brightness
actual_brightness brightness max_brightness
可以像这样从max_brightness读取最大亮度:
$ cat /sys/class/backlight/acpi_video0/max_brightness
15
可以通过向brightness写入数字来设置亮度。但是,它的值通常与actual_brightness不同,并且依赖于设备。(另见#最近(2025)的 AMD 更改。)
# echo 5 > /sys/class/backlight/acpi_video0/brightness
尝试设置大于最大值的亮度会导致错误。默认情况下,只有root可以通过此方法更改亮度。为了允许video组中的用户更改亮度,可以使用以下udev规则(注销/重启可能需要更改生效):
/etc/udev/rules.d/backlight.rules
ACTION=="add", SUBSYSTEM=="backlight", RUN+="/bin/chgrp video $sys$devpath/brightness", RUN+="/bin/chmod g+w $sys$devpath/brightness"
内核命令行参数
有时由于不同的主板实现和 ACPI 缺陷,ACPI 工作不正常。这会导致例如不准确的亮度通知。这包括一些带有双显卡(例如,带有 Intel/AMD 集成 GPU 的 NVIDIA/AMD 独立 GPU)的笔记本电脑。此外,ACPI 有时需要注册自己的acpi_video0背光,即使已存在一个(如intel_backlight),这可以通过添加以下内核参数之一来完成:
acpi_backlight=video acpi_backlight=vendor acpi_backlight=native
Udev 规则
如果 ACPI 接口可用,则可以在启动时使用udev规则设置背光级别。
/etc/udev/rules.d/81-backlight.rules
# Set backlight level to 8
SUBSYSTEM=="backlight", ACTION=="add", KERNEL=="acpi_video0", ATTR{brightness}="8"
setpci
在某些情况下(例如 Intel Mobile 945GME [1]),可以设置显卡寄存器来调整背光。这意味着您通过直接操作硬件来调整背光,这可能存在风险,并且通常不是一个好主意。并非所有显卡都支持此方法。
使用此方法时,您需要先使用lspci来找出您的显卡位置。
# setpci -s 00:02.0 F4.B=0
外部显示器
显示数据通道命令接口(DDC/CI)可用于通过I2C与实现监视器控制命令集(MCCS)的外部显示器进行通信。DDC可以控制支持的显示器的亮度、对比度、输入等。通常也可以通过DDC管理屏幕显示(OSD)面板提供的设置。如果/dev/i2c-*设备不存在,可能需要加载i2c-dev内核模块。
ddcutil可用于查询和设置亮度设置。
# ddcutil capabilities | grep "Feature: 10"
Feature: 10 (Brightness)
# ddcutil getvcp 10
VCP code 0x10 (Brightness ): current value = 60, max value = 100
# ddcutil setvcp 10 70
或者,可以使用ddcci-driver-linux-dkmsAUR在sysfs中公开外部显示器。然后,在加载ddcci内核模块后,可以使用任何背光工具。
- 同时使用
ddcci和i2c-dev可能会导致资源冲突,例如Device or resource busy错误。 - NVIDIA 专有驱动程序的用户可能需要在Xorg 配置的
Device部分或nvidia模块的NVreg_RegistryDwords=RMUseSwI2c=0x01;RMI2cSpeed=100内核模块参数中添加Option "RegistryDwords" "RMUseSwI2c=0x01; RMI2cSpeed=100"。请参阅[2]和[3]。 - 如果监视器上启用了自动调整某些 VCP 功能(例如动态对比度或 BenQ 的Eye Care技术),
ddcutil将无法设置这些 VCP 功能。 - 如果安装了ddcutil,它提供了
/usr/share/ddcutil/data/90-nvidia-i2c.conf文件,可以将其复制到/etc/X11/xorg.conf.d/而不是手动编辑Xorg配置文件。它还为udev规则提供了/usr/share/ddcutil/data/60-ddcutil-i2c.rules和/usr/share/ddcutil/data/60-ddcutil-usb.rules。
关闭背光
关闭背光(例如锁定笔记本时)有助于节省电池电量。理想情况下,以下命令应适用于任何Xorg图形会话:
$ xset dpms force off
背光应在鼠标移动或键盘输入时重新打开。或者,xset s可以用于类似的效果。
如果之前的命令不起作用,那么vbetool可能会起作用。但请注意,在这种情况下,必须手动重新激活背光。命令如下:
$ vbetool dpms off
要重新激活背光:
$ vbetool dpms on
例如,这可以用于使用acpid关闭笔记本盖时。
保存和恢复功能
systemd软件包包含systemd-backlight@.service服务,该服务默认启用且是“静态的”。它会在关机时保存背光亮度级别,并在启动时恢复。该服务使用#ACPI中描述的 ACPI 方法,为在/sys/class/backlight/中找到的每个文件夹生成服务。例如,如果有一个名为acpi_video0的文件夹,它将生成一个名为systemd-backlight@backlight:acpi_video0.service的服务。在使用其他方法在启动时设置背光时,建议通过设置内核参数systemd.restore_state=0来阻止 systemd-backlight 恢复背光。有关详细信息,请参阅systemd-backlight@.service(8)。
acpi_video1,则为systemd-backlight@backlight:acpi_video1)。此外,brilloAUR和lightAUR工具支持保存和恢复功能。如果希望按用户基础恢复屏幕亮度,这两个工具可能更有用,但没有提供 systemd 单元来完成此操作。
背光工具
video(或input)组的成员修改亮度。| 软件包名称 | 控制键盘背光 | 响应环境亮度 | 语言 | 许可证 | 备注 |
|---|---|---|---|---|---|
| acpi-backlight-notifyAUR | 否 | 否 | C | MIT | ACPI 接口的简单通知守护程序(读取/sys/class/backlight/) |
| acpilightAUR | 是 | 否 | Python3 | GPL-3.0-or-later | 提供“xbacklight”可执行文件 |
| backlight_controlAUR | 否 | 否 | C | MIT | 极小且简单。支持相对调整。 |
| blightAUR | 是 | 否 | Python3 | ISC | 使用 logind 接口。仅限于本地用户,但不需要 suid 或 video 组成员身份。 |
| brightdAUR | 否 | 否 | C | GPL-2.0 | 在一段时间内没有用户输入时使屏幕变暗。 |
| brightnessctl | 是 | 否 | C | MIT | - |
| brilloAUR | 是 | 否 | C | GPL-3.0-only | 支持平滑和相对调整。 |
| clightAUR | 是 | 是 | C | GPL-3.0-or-later | 管理屏幕温度(仅限Xorg)并在超时后平滑调暗亮度。支持环境光传感器[4]。可以将网络摄像头变成环境光传感器。 |
| enlighten-gitAUR | 是 | 否 | C | GPL-3.0-or-later | - |
| illum-gitAUR | 否 | 否 | C | AGPL-3.0 | 响应按键。 |
| lightAUR | 是 | 否 | C | GPL-3.0-only | 无依赖。不依赖 X 服务器。 |
| luxAUR | 否 | 否 | Shell | MIT | - |
| macbook-lighterAUR | 是 | 是 | Bash | GPL | Macbook 屏幕/键盘背光 CLI 和环境光自动调整。 |
| wlr-brightness-gitAUR | 否 | 否 | C | MIT | 也支持需要伽马校正的新型 OLED 显示器。使用 wlroots。 |
| wlumaAUR | 是 | 是 | Rust | ISC | 基于屏幕内容和环境光的自动亮度调整。可以使用网络摄像头或时间来模拟环境光传感器。支持键盘和外部显示器。使用 wlroots。 |
| xbacklight-notifyAUR | 否 | 否 | C | MIT | X11 的简单通知守护程序(读取 RandR 背光属性) |
| ybacklightAUR | 否 | 否 | Perl | GPL-2.0 | 一个小的 Perl 脚本,类似于 xbacklight,但使用 sysfs 驱动程序。 |
light
将背光亮度提高 5%
$ light -A 5
将背光亮度降低 5%
$ light -U 5
将背光亮度设置为 100%
$ light -S 100
在 GNOME 中使用 DBus
也可以像 GNOME 控制那样调整亮度。使用此方法所做的更改会在 GNOME UI 中反映出来。
$ gdbus call --session --dest org.gnome.SettingsDaemon.Power --object-path /org/gnome/SettingsDaemon/Power --method org.freedesktop.DBus.Properties.Set org.gnome.SettingsDaemon.Power.Screen Brightness "<int32 50>"
使用此方法也可以实现键盘控制的亮度步进。
$ gdbus call --session --dest org.gnome.SettingsDaemon.Power --object-path /org/gnome/SettingsDaemon/Power --method org.gnome.SettingsDaemon.Power.Screen.StepUp $ gdbus call --session --dest org.gnome.SettingsDaemon.Power --object-path /org/gnome/SettingsDaemon/Power --method org.gnome.SettingsDaemon.Power.Screen.StepDown
在 KDE 中使用 DBus
请参阅https://userbase.kde.org/KDE_Connect/Tutorials/Useful_commands#Brightness_settings。
色彩校正
颜色校正不会改变背光功率,它只会修改视频查找表:这意味着您的电池寿命不会受到更改的影响。尽管如此,当没有背光控制可用时(台式电脑或配备 OLED 屏幕的笔记本电脑)它可能很有用。
- Clight — 用户守护程序实用程序,旨在完全管理您的显示器。它可以根据一天中的当前时间管理屏幕色温,就像 redshift 一样。它尝试使用geoclue来检索用户位置,如果配置文件中未设置纬度或经度。它还支持固定的日出和日落时间。
- colord-brightness — 通过 colord-daemon 和 ICC-profile 在 Wayland 和 Xorg 上设置亮度(类似于 icc-brightness,但性能更好)。
- Gammastep — 色温调整工具,Redshift 的一个分支。
- icc-brightness — 通过应用 ICC 颜色配置文件来控制 OLED 显示器亮度。
- Monica — 显示器校准工具。它作为 xgamma 的前端来调整伽马校正。
- https://web.archive.org/web/20090815224839/http://www.pcbypaul.com/software/monica.html || monicaAUR
- xcalib — 轻量级显示器校准加载器,可以加载一个 ICC 显示器配置文件,并在桌面应用程序之间共享。
- xgamma — 调整显示器的伽马校正。
Wayland
Redshift 不支持 Wayland(尽管存在一个补丁集)。但可以在启动合成器之前在tty中应用所需的色温。例如:
$ redshift -m drm -PO 3000
否则,一些合成器可以在运行时应用颜色校正:
- 在 GNOME 中,可以使用内置的夜间模式。
- 在 KDE Plasma 中,可以使用内置的KDE#夜间模式。
- 在 Sway 和其他基于 wlroots 的合成器以及 Orbital 上,可以使用 Redshift 的分支 gammastep、wlsunset、clightAUR 或 wl-gammarelayAUR。
Xorg:使用 xrandr 调整感知亮度
xrandr 可用于调整感知亮度。
调整感知亮度超过其最大级别(关于 Nvidia 的相同警告也适用于此)
$ xrandr --output output_name --brightness 2
这大约会使图像的亮度加倍。它会牺牲颜色质量来换取亮度,但对于环境光非常亮(例如阳光)的情况尤其适用。
这也可用于在黑暗房间中通过指定小于 1 的值(例如 0.5)来降低感知亮度,这在没有背光控制可用时(例如台式机)很有用。
连接设备的输出名称可以通过调用xrandr来确定。
$ xrandr | grep -w connected | cut -f '1' -d ' '
用户可能会发现将此实现为别名很方便。
$ alias b='echo -e "enter brightness:\n"; read val; xrandr --output output name --brightness "${val}"'
要自动调用 xrandr 以响应背光文件更改,可以使用oled_shmoledAUR,如下所示:
$ oled_shmoled output_name
NVIDIA 设置
NVIDIA 专有驱动程序的用户可以通过“X Server Color Correction”下的nvidia-settings实用程序更改显示器亮度。但是,请注意,这与背光(强度)完全无关,它仅调整颜色输出。(当所有其他选项都失败时,通过此方式降低亮度是低效的最后手段;增加亮度会完全破坏您的颜色输出,类似于曝光过度的照片。)
故障排除
背光 PWM 调制频率(仅限 Intel i915)
带有 LED 背光的笔记本电脑有时会出现屏幕闪烁。这是因为控制 LED 背光亮度的最有效方法是快速地打开和关闭 LED,并改变它们亮起的时间。
然而,开关频率,即所谓的 PWM(脉冲宽度调制)频率,可能不足以让眼睛感知为单一亮度,而是看到闪烁。这会导致一些人出现头痛和眼部疲劳等症状。
如果您使用的是 Intel i915 GPU,那么可能可以通过调整 PWM 频率来消除闪烁。
PWM 的周期(与频率成反比)存储在0xC8254寄存器的 2 个高位字节中(如果您使用的是 Intel GM45 芯片组,请改用地址0x61254)。要操作寄存器值,请安装intel-gpu-tools软件包。
要增加频率,必须减小周期。例如:
# intel_reg read 0xC8254
0xC8254 : 0x12281228
然后,要将 PWM 频率加倍,将 2 个高位字节(4 个高十六进制数字)除以 2 并写回结果值,同时保持低位字节不变:
# intel_reg write 0xC8254 0x09141228
您可以使用在线计算器来计算所需的值 https://devbraindom.blogspot.com/2013/03/eliminate-led-screen-flicker-with-intel.html[死链接 2025-03-15—HTTP 404]
要自动设置新频率,可以考虑编写 udev 规则或安装intelpwm-udevAUR。
反转亮度(仅限 Intel i915)
症状:输入/输出错误。
- 安装xf86-video-intel后,systemd-backlight.service 会在启动期间关闭背光。
- 可能的解决方案:屏蔽 systemd-backlight.service
- 从 X 切换到另一个 VT 会关闭背光。
- 亮度键反转(即增加亮度会使屏幕变暗)。
可以通过将i915.invert_brightness=1添加到内核参数列表中来解决此问题。
无法控制 eDP 面板亮度(仅限 Intel i915)
嵌入式显示端口(eDP)v1.2 引入了一种新的显示面板控制协议,用于通过 AUX 通道进行背光和其他控制 [5]
默认情况下,i915 驱动程序尝试使用 PWM 来控制背光亮度,这可能不起作用。
要通过写入 DPCD 寄存器并使用 AUX 通道来设置背光,请将i915.enable_dpcd_backlight=1作为内核参数。
sysfs 已修改但亮度未改变
在某些系统上,键盘上的亮度热键可以正确修改/sys/class/backlight/acpi_video0/actual_brightness中 acpi 接口的值,但屏幕亮度未改变。来自桌面环境的亮度小程序也可能显示更改但无效。
如果您已测试了推荐的内核参数,并且只有xbacklight有效,那么您可能遇到了 BIOS 和内核驱动程序之间的不兼容问题。
在这种情况下,唯一的解决方案是等待 BIOS 或 GPU 驱动程序制造商提供修复。
一种解决方法是使用 inotify 内核 API,在/sys/class/backlight/acpi_video0/actual_brightness的值每次更改时触发xbacklight。
首先安装inotify-tools。然后创建一个围绕 inotify 的脚本,该脚本将在每次启动时启动或通过自启动启动。
/usr/local/bin/xbacklightmon
#!/bin/sh
path=/sys/class/backlight/acpi_video0
luminance() {
read -r level < "$path"/actual_brightness
factor=$(printf "$max" | awk '{print 100/$1}')
printf "$level $factor" | awk '{print int($1*$2)}'
}
read -r max < "$path"/max_brightness
xbacklight -set "$(luminance)"
inotifywait -me modify --format '' "$path"/actual_brightness | while read; do
xbacklight -set "$(luminance)"
done
sysfs 和 xbacklight 均不起作用
检查 dmesg,如果您看到类似以下内容:
i915 0000:00:02.0: [drm] *ERROR* [CONNECTOR:114:DSI-1] Failed to get the SoC PWM chip
将/etc/mkinitcpio.conf更改为如下:
/etc/mkinitcpio.conf
... MODULES=(i915 pwm-lpss-platform) ...
MATE 中背光不工作
确保mate-power-manager软件包已安装。
笔记本电脑上功能键的背光控制不工作
一些笔记本电脑型号,例如 Razer Blade 14、Lenovo Yoga Slim 7、Lenovo IdeaPad Gaming 3 和 Acer AN517-41 在背光控制方面存在问题,请将acpi_backlight=video和/或amdgpu.backlight=0作为内核参数传递。
Xfce 中背光键不工作
在 xfce4 中,Xfce4 Power Manager处理亮度键。
在某些 Xfce 安装中,“Handle display brightness keys”设置可能默认关闭。
要重新启用亮度键,请打开 Xfce 电源管理器对话框 并启用“处理显示亮度键”
$ xfce4-power-manager -c
xbacklight 返回:没有输出具有背光属性
根据安装的显卡,有时来自 xorg-xbacklight 的 xbacklight 会返回消息“没有输出具有背光属性”。安装 acpilightAUR 提供了一个替代的 xbacklight,它可能按预期工作。
使用 amdgpu 驱动程序重启后,背光始终处于最大亮度
由于最近在 amdgpu 驱动程序中引入的 错误,背光的 actual_brightness 值被报告为 16 位整数,这超出了 max_brightness 指定的 8 位范围。这导致 systemd-backlight 服务在启动时尝试恢复一个过大的值,最终被截断为最大亮度(255)。
在错误得到解决之前,一个可能的解决方法是在恢复之前修改存储的亮度,使其在正确范围内。这可以通过一个脚本和一个服务单元来实现
fix-brightness.sh
#!/bin/bash
# Change the line below according to your hardware
BRIGHTNESS_FILE="/var/lib/systemd/backlight/pci-0000:04:00.0:backlight:amdgpu_bl0"
BRIGHTNESS=$(cat "$BRIGHTNESS_FILE")
BRIGHTNESS=$(($BRIGHTNESS*255/65535))
BRIGHTNESS=${BRIGHTNESS/.*} # truncating to int, just in case
echo $BRIGHTNESS > "$BRIGHTNESS_FILE"
fix-brightness.service
[Unit] Description=Convert 16-bit brightness values to 8-bit before systemd-backlight applies it Before=systemd-backlight@backlight:amdgpu_bl0.service [Service] Type=oneshot ExecStart=/path/to/fix-brightness.sh [Install] WantedBy=multi-user.target
在某些系统上,驱动程序报告的背光级别在正确范围 [0, 255] 内,但 systemd 仍然无法恢复正确的值。这可能是由于 内核 中的竞争条件。在这种情况下,截断亮度级别将无济于事,因为它已经在正确的范围内。相反,在关机前将亮度级别保存到 systemd 可能是个解决方法。这可以通过以下脚本和服务单元实现
fix-brightness.sh
#!/bin/sh # Backlight level from systemd's perspective (change if needed) readonly SYSTEMD_BACKLIGHT_FILE='/var/lib/systemd/backlight/pci-0000:04:00.0:backlight:amdgpu_bl0' # Backlight level from AMDGPU driver readonly AMDGPU_BACKLIGHT_FILE='/sys/class/backlight/amdgpu_bl0/brightness' # Read current value from the driver and apply it to systemd readonly AMDGPU_BACKLIGHT_VALUE=$(cat "$AMDGPU_BACKLIGHT_FILE") echo "$AMDGPU_BACKLIGHT_VALUE" > "$SYSTEMD_BACKLIGHT_FILE"
fix-brightness.service
[Unit] Description=Save brightness value from AMDGPU DefaultDependencies=no After=final.target [Service] Type=oneshot ExecStart=/path/to/fix-brightness.sh [Install] WantedBy=final.target
允许低于 5% 的亮度在重启后保持(禁用背光夹紧)
根据 systemd-backlight@.service(8),如果 udev 属性 ID_BACKLIGHT_CLAMP 未设置为 false,则亮度将被夹紧到至少 1% 或最大亮度的 5%(以较大者为准)。当内核允许用户空间可靠地设置一个不会关闭显示器的亮度值时,此限制将被移除。
要允许低于 5% 的亮度在重启后保持,请创建 udev 规则
/etc/udev/rules.d/99-backlight_clamp.rules
# Allow <5% brightness to persist on reboot (disable clamped value of 5%)
SUBSYSTEM=="backlight", ENV{ID_BACKLIGHT_CLAMP}="0"
最近(2025 年)的 AMD 更改
在 2025 年,AMD 笔记本电脑有两项更改,影响了内核 6.16 并反向移植到 6.15.5。首先,之前的最大亮度为 <= 255,但现在是 <= 65535。 [6] 请注意,这意味着使用此更改之前的背光值会导致亮度降低。
其次是 brightness 和 actual_brightness 的关系,位于 /sys/class/backlight/amdgpu_bl0 或类似路径下。在旧内核和新内核中,这两个值并不相同。在新行为中,实际亮度根据固件设置而变化。 [7] [8] 这是因为固件中的亮度曲线可能更能反映面板的特性。
要禁用此固件曲线,请设置以下 内核参数:amdgpu.dcdebugmask=0x40000