Linux
树莓派3B 采用Samba + Cockpit搭建NAS
Linux 修改开机启动 boot splash logos
Linux 下将 .po 文件编译成 .mo 文件
Python 使用 gettext 模块实现国际化
XFCE 桌面优化配置
香橙派3B 使用 WiringOP 读取 MPU6050
香橙派4 LTS 安装 WiringPi
Linux 图形界面切换到 FB 界面
校表仪 tg-timer 算法笔记
Linux 安装 EtherCat Igh
EetherCat Igh 常用指令
树莓派镜像 DIY 制作
树莓派5B 安装64位实时系统 preempt RT 补丁
linux 的 lightdm 桌面管理器下隐藏光标(鼠标)
Linux 上使用 MPD (Music Player Daemon)
Linux 自动化交互式命令行工具 —— expect
Linux GTK 界面开发
Debian系统中修改主机名
使用Python + GTK3.0 开发嵌入式GUI
Raspberry Pi 5修改系统内存分页大小解决安装esp-matter 出现的<jemalloc>: Unsupported systeom page size 错误
树莓派 linux 安装和使用clash 做VPN
树莓派自动挂载硬盘
非控制台或ssh登录用户尝试启动Xorg图形服务器
XFCE4 电源管理器配置管理
Linux PulseAudio 声卡配置和检测
IBUS修改输入法和设置切换快捷键
在 Moode Audio 中实现开机自动启动 `startx`
crontab 任务
树莓派外设耗电检测
linux 终端自动登录
linux创建新用户
linux service通过xinit启动GTK应用程序
Linux 非桌面的图形环境安装和配置
香橙派3b板载音频输出没有声音调试
使用 udev 规则修改权限实现屏幕亮度调节
Linux udev 介绍
鲁班猫4 ubuntu22.04 屏幕背光 udev 自动配置化
ubuntu22.04 动态壁纸配置
使用 udisksctl 的可靠 USB 自动挂载方案(基于 systemd-run)
通过udev规则U盘自动挂载
OpenWRT 磊科N60pro路由器刷机
本文档使用 MrDoc 发布
-
+
首页
鲁班猫4 ubuntu22.04 屏幕背光 udev 自动配置化
``` #!/bin/bash # Fixed backlight permission script with proper device name handling # Script Name: fix-brightness-perms.sh # Requires: root privileges set -euo pipefail # 检查root权限 if [[ $EUID -ne 0 ]]; then echo "❌ 此脚本必须以root权限运行" >&2 exit 1 fi # 检测背光设备 - 修复设备名称返回问题 detect_backlights() { local backlights=() # 使用通配符获取所有背光设备 for device in /sys/class/backlight/backlight*; do # 检查是否是目录(符号链接指向的目录) if [[ -d "$device" ]]; then backlights+=("$device") fi done if [[ ${#backlights[@]} -eq 0 ]]; then echo "❌ 未检测到背光设备" >&2 echo " 尝试手动检查: ls -l /sys/class/backlight/" >&2 return 1 fi echo "检测到以下背光设备:" >&2 for i in "${!backlights[@]}"; do local device_name=$(basename "${backlights[$i]}") # 获取实际设备路径 local real_path=$(readlink -f "${backlights[$i]}") echo " [$i] $device_name -> $real_path" >&2 done # 让用户选择设备 local selected_index=-1 while [[ $selected_index -lt 0 || $selected_index -ge ${#backlights[@]} ]]; do read -p "请选择要配置的设备编号 (0-$(( ${#backlights[@]} - 1 ))): " selected_index # 验证输入是否为数字 if ! [[ "$selected_index" =~ ^[0-9]+$ ]]; then echo "⚠️ 请输入有效的数字" >&2 selected_index=-1 continue fi if [[ $selected_index -lt 0 || $selected_index -ge ${#backlights[@]} ]]; then echo "⚠️ 无效的选择,请重新输入" >&2 fi done # 只返回设备名称,不返回其他信息 local selected_device=$(basename "${backlights[$selected_index]}") echo "$selected_device" # 只输出设备名称 } # 创建udev规则 create_udev_rule() { local kernel_name="$1" local rule_file="/etc/udev/rules.d/90-backlight-permissions.rules" # 创建规则文件如果不存在 touch "$rule_file" # 检查规则是否已存在 if grep -q "KERNEL==\"$kernel_name\"" "$rule_file" 2>/dev/null; then echo "ℹ️ 规则已存在,更新配置..." >&2 # 删除旧规则 sed -i "/KERNEL==\"$kernel_name\"/,/RUN+/d" "$rule_file" fi # 添加新规则 cat >> "$rule_file" <<EOF # 配置设备: $kernel_name (自动生成于 $(date)) ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="$kernel_name", \\ RUN+="/bin/chgrp video /sys/class/backlight/%k/brightness" ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="$kernel_name", \\ RUN+="/bin/chmod g+w /sys/class/backlight/%k/brightness" EOF echo "$rule_file" } # 主函数 main() { echo "🔍 检测背光设备..." >&2 local device_name device_name=$(detect_backlights) || exit 1 echo "✅ 已选择设备: $device_name" >&2 echo "📝 创建/更新udev规则..." >&2 local rule_path rule_path=$(create_udev_rule "$device_name") echo "✅ 规则已写入: $rule_path" >&2 echo "🔄 重新加载udev规则..." >&2 udevadm control --reload-rules udevadm trigger --subsystem-match=backlight echo "✅ udev规则已重新加载" >&2 # 立即应用权限更改 local brightness_path="/sys/class/backlight/$device_name/brightness" if [[ -f "$brightness_path" ]]; then chgrp video "$brightness_path" chmod g+w "$brightness_path" echo "⚡ 已更新当前权限: $(stat -c '%A %G %U' "$brightness_path")" >&2 else echo "⚠️ 亮度文件不存在: $brightness_path" >&2 echo " 尝试备用路径: /sys/class/backlight/$device_name/actual_brightness" >&2 local alt_path="/sys/class/backlight/$device_name/actual_brightness" if [[ -f "$alt_path" ]]; then chgrp video "$alt_path" chmod g+w "$alt_path" echo "⚡ 已更新备用亮度文件权限: $(stat -c '%A %G %U' "$alt_path")" >&2 fi fi # 添加用户到video组 local current_user current_user=$(logname || echo "$SUDO_USER") if [[ -z "$current_user" ]]; then echo "⚠️ 无法确定当前用户,跳过组配置" >&2 else if ! groups "$current_user" | grep -q '\bvideo\b'; then usermod -aG video "$current_user" echo "👥 用户 $current_user 已加入video组" >&2 else echo "ℹ️ 用户 $current_user 已在video组中" >&2 fi fi cat <<EOF 🎉 配置完成!请执行以下操作: 1. 完全注销并重新登录(或重启系统) 2. 验证权限: ls -l /sys/class/backlight/$device_name/brightness 应显示: -rw-rw---- 1 root video 3. 测试亮度调节: echo 100 > /sys/class/backlight/$device_name/brightness (替换100为实际亮度值,参考max_brightness文件) 4. 如果使用备用亮度文件: cat /sys/class/backlight/$device_name/actual_brightness echo 50 > /sys/class/backlight/$device_name/actual_brightness EOF } # 执行主函数 main ``` ### 主要修复: 1. **输出重定向问题**: - 在 `detect_backlights` 函数中,所有非设备名称的输出都重定向到 `>&2`(标准错误) - 只有设备名称本身通过 `echo` 输出(标准输出) 2. **主函数输出修正**: - 所有状态消息都重定向到 `>&2`,避免污染函数返回值 - 确保只有设备名称被正确传递 3. **规则文件格式修正**: - 确保规则文件中只包含有效的设备名称(如 `backlight0` 或 `backlight1`) - 避免在规则文件中包含多余的描述信息 ### 使用说明: 1. **保存脚本**: ``` sudo nano /usr/local/bin/fix-brightness-perms ``` 粘贴上述修正后的脚本内容 2. **赋予执行权限**: ``` sudo chmod +x /usr/local/bin/fix-brightness-perms ``` 3. **运行脚本**: ``` sudo fix-brightness-perms ``` 4. **选择设备**: ``` 🔍 检测背光设备... 检测到以下背光设备: [0] backlight0 -> /sys/devices/platform/backlight0/backlight/backlight0 [1] backlight1 -> /sys/devices/platform/backlight1/backlight/backlight1 请选择要配置的设备编号 (0-1): 1 ``` 5. **验证规则文件**: ``` cat /etc/udev/rules.d/90-backlight-permissions.rules ``` 现在应该显示: ``` # 配置设备: backlight1 (自动生成于 ...) ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="backlight1", \ RUN+="/bin/chgrp video /sys/class/backlight/%k/brightness" ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="backlight1", \ RUN+="/bin/chmod g+w /sys/class/backlight/%k/brightness" ``` 这个修正版本解决了设备名称污染规则文件的问题,确保生成的 udev 规则是干净有效的。
qingkai
2025年5月30日 11:28
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码