跳转至内容

背光

来自 ArchWiki

屏幕背光可能难以控制。在某些机器上,物理硬件开关缺失,软件解决方案可能无法很好地工作。然而,通常可以为给定的硬件找到一个功能性的方法。本文旨在总结所有可能的调整背光的方法。

有许多方法可以控制显示器、笔记本电脑或集成面板(如 iMac)的亮度。根据这些 讨论和这个维基页面,控制方法可以分为以下几类:

  • 亮度由供应商指定的快捷键控制,操作系统没有接口可以调整亮度。
  • 亮度由 ACPI、图形或平台驱动程序控制。在这种情况下,背光控制通过/sys/class/backlight暴露给用户,用户空间背光工具可以使用它。
  • 亮度通过写入图形卡寄存器来控制,可以使用setpci
注意 由于 OLED 屏幕没有背光,因此无法通过改变配备 OLED 屏幕的笔记本电脑的背光功率来控制亮度。在这种情况下,可以通过 PWM 控制(Linux 内核中未实现)或通过软件颜色校正来调整感知的屏幕亮度。

硬件接口

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"

本文或本章节的准确性存在争议。

原因:解释为什么无法使用GROUP="video", MODE="0664"更改文件权限。(在Talk:Backlight#Udev rules for permissions of brightness doesn't work中讨论)

内核命令行参数

有时由于不同的主板实现和 ACPI 缺陷,ACPI 工作不正常。这会导致例如不准确的亮度通知。这包括一些带有双显卡(例如,带有 Intel/AMD 集成 GPU 的 NVIDIA/AMD 独立 GPU)的笔记本电脑。此外,ACPI 有时需要注册自己的acpi_video0背光,即使已存在一个(如intel_backlight),这可以通过添加以下内核参数之一来完成:

acpi_backlight=video
acpi_backlight=vendor
acpi_backlight=native
提示
  • 在 Nvidia Optimus 笔记本上,内核参数nomodeset可能会影响背光调整能力。
  • 在 Asus 笔记本上,您可能还需要加载asus-nb-wmi内核模块
  • 禁用 Dell XPS13 上的旧版启动会破坏背光支持。
  • 自 Linux 6.1 起,背光子系统已进行了改造,如果在更新后背光不工作,请先尝试删除现有的acpi_backlight内核参数。在某些 Optimus 笔记本上,您可以尝试使用acpi_backlight=nvidia_wmi_ec启动。

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"
注意 systemd-backlight 服务会在启动时恢复之前的背光亮度级别。为防止与上述规则冲突,请参阅#保存和恢复功能
提示 要根据电源状态设置背光,请参阅Power management#Using a script and a udev rule,并在脚本中使用您喜欢的背光工具

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-dkmsAURsysfs中公开外部显示器。然后,在加载ddcci内核模块后,可以使用任何背光工具

  • 同时使用ddccii2c-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

关闭背光

本文或章节候选合并到DPMS

注释:相同主题。(在Talk:Backlight中讨论)

关闭背光(例如锁定笔记本时)有助于节省电池电量。理想情况下,以下命令应适用于任何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)

注意 某些笔记本电脑有多个显卡(例如 Optimus),并且背光恢复失败。尝试屏蔽某个服务实例(例如,对于acpi_video1,则为systemd-backlight@backlight:acpi_video1)。

此外,brilloAURlightAUR工具支持保存和恢复功能。如果希望按用户基础恢复屏幕亮度,这两个工具可能更有用,但没有提供 systemd 单元来完成此操作。

背光工具

注意 下表中列出的工具可用于控制屏幕亮度。它们都兼容 Wayland 且不需要 X。其中一些(如brightnessctllightAUR)会添加 udev 规则,允许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 驱动程序。
提示 可以将涉及这些实用程序的命令绑定到XF86MonBrightnessUpXF86MonBrightnessDown键盘按键,如Keyboard shortcuts#Xorg中所述。

light

安装lightAUR并将您的用户添加到video用户组

将背光亮度提高 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

色彩校正

本文章或章节需要扩充。

原因:哪些实用程序需要Xorg,哪些在Wayland下工作?(在Talk:Backlight中讨论)

颜色校正不会改变背光功率,它只会修改视频查找表:这意味着您的电池寿命不会受到更改的影响。尽管如此,当没有背光控制可用时(台式电脑或配备 OLED 屏幕的笔记本电脑)它可能很有用。

  • Clight — 用户守护程序实用程序,旨在完全管理您的显示器。它可以根据一天中的当前时间管理屏幕色温,就像 redshift 一样。它尝试使用geoclue来检索用户位置,如果配置文件中未设置纬度或经度。它还支持固定的日出和日落时间。
https://github.com/FedeDP/Clight || clightAUR
  • colord-brightness — 通过 colord-daemon 和 ICC-profile 在 Wayland 和 Xorg 上设置亮度(类似于 icc-brightness,但性能更好)。
https://github.com/Nikl174/colord-brightness || colord-brightnessAUR
  • Gammastep — 色温调整工具,Redshift 的一个分支。
https://gitlab.com/chinstrap/gammastep || gammastep
  • icc-brightness — 通过应用 ICC 颜色配置文件来控制 OLED 显示器亮度。
https://github.com/udifuchs/icc-brightness || icc-brightness-gnome-gitAUR
  • Monica — 显示器校准工具。它作为 xgamma 的前端来调整伽马校正。
https://web.archive.org/web/20090815224839/http://www.pcbypaul.com/software/monica.html || monicaAUR
  • Redshift — 色温调整工具。它根据周围环境调整屏幕的色温。如果您在夜间使用屏幕,这可能有助于减轻眼睛疲劳。该程序受f.lux的启发。
http://jonls.dk/redshift/ || redshift
  • xcalib — 轻量级显示器校准加载器,可以加载一个 ICC 显示器配置文件,并在桌面应用程序之间共享。
https://github.com/OpenICC/xcalib || xcalib
  • xgamma — 调整显示器的伽马校正。
https://xorg.freedesktop.org/ || xorg-xgamma

Wayland

Redshift 不支持 Wayland(尽管存在一个补丁集)。但可以在启动合成器之前在tty中应用所需的色温。例如:

$ redshift -m drm -PO 3000

否则,一些合成器可以在运行时应用颜色校正:

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)

本文章或章节需要扩充。

原因:现代使用 IPS 面板的 LED 显示器通常使用 DC 调光而不是 PWM 调光。这可以通过 0xC8254 寄存器 0x0001 的前两个字节来指示,这意味着频率几乎是无穷大。(在Talk:Backlight中讨论)

带有 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作为内核参数

注意 该参数在linux 5.4 中从 bool 更改为 int。

sysfs 已修改但亮度未改变

注意 此行为及其解决方法已在 Dell M6700(Nvidia K5000m,BIOS 版本早于 A10)和 Clevo P750ZM(Eurocom P5 Pro Extreme,Nvidia 980m)上得到确认。

在某些系统上,键盘上的亮度热键可以正确修改/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)
...

然后重新生成 initramfs

MATE 中背光不工作

确保mate-power-manager软件包已安装

笔记本电脑上功能键的背光控制不工作

一些笔记本电脑型号,例如 Razer Blade 14Lenovo Yoga Slim 7Lenovo 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 更改

本文章或章节需要扩充。

原因:在新的 LTS 版本发布一段时间之前保留“Recent 2025”。(在 Talk:Backlight 中讨论)

在 2025 年,AMD 笔记本电脑有两项更改,影响了内核 6.16 并反向移植到 6.15.5。首先,之前的最大亮度为 <= 255,但现在是 <= 65535。 [6] 请注意,这意味着使用此更改之前的背光值会导致亮度降低。

其次是 brightnessactual_brightness 的关系,位于 /sys/class/backlight/amdgpu_bl0 或类似路径下。在旧内核和新内核中,这两个值并不相同。在新行为中,实际亮度根据固件设置而变化。 [7] [8] 这是因为固件中的亮度曲线可能更能反映面板的特性。

要禁用此固件曲线,请设置以下 内核参数amdgpu.dcdebugmask=0x40000

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.