udev的规定让我很紧张..。有时他们工作,有时他们不工作..。
再说一次,今天它们不起作用了。
我总是在网上复制东西,然后调整它,最后得到一个工作配置,几周/几个月后,它们就停止工作了。
一劳永逸,我真的很想得到一个确定性的解决方案.
( a)获得了我的USB键盘设备信息:
# lsusb |grep Dell
Bus 001 Device 045: ID 413c:2107 Dell Computer Corp.
( b)在我的/etc/udev/rules.d es.d/90-键盘_swapcaps.Rule中,我添加了:
## DEBUG
ACTION=="change", ATTRS{idVendor}=="413c", ATTRS{idProduct}=="2107", RUN+="/bin/sh -c 'echo == >> /tmp/udev-env.txt; env >> /tmp/udev-env.txt'"
# ACTUAL
ACTION=="change", ATTRS{idVendor}=="413c", ATTRS{idProduct}=="2107", ENV{XKBLAYOUT}="fr", ENV{XKBOPTIONS}+="ctrl:swapcaps", ENV{XKBOPTIONS}+="compose:lwin"
然后我跑了:
# udevadm control --reload-rules && udevadm trigger
( a) kbd配置中没有任何更改。
b)监测
# udevadm monitor -u
...
UDEV [10555.979594] add /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55 (input)
UDEV [10555.989903] add /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::numlock (leds)
UDEV [10555.992442] add /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0/0003:046D:C077.001D/input/input54 (input)
UDEV [10555.994812] add /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::scrolllock (leds)
UDEV [10556.001225] add /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/hidraw/hidraw1 (hidraw)
UDEV [10556.003513] add /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0/0003:046D:C077.001D/input/input54/mouse1 (input)
UDEV [10556.005834] add /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0/0003:046D:C077.001D/hidraw/hidraw0 (hidraw)
UDEV [10556.010005] add /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::capslock (leds)
UDEV [10556.019614] change /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::numlock (leds)
UDEV [10556.021307] change /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::scrolllock (leds)
UDEV [10556.022045] add /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/event20 (input)
UDEV [10556.024438] change /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::capslock (leds)
UDEV [10556.026259] bind /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E (hid)
这表明这个设备被检测到了&是正确的吗?
( c)在/tmp/udev-env.txt中,许多行类似于:
...
==
ID_FOR_SEAT=leds-pci-0000_00_14_0-usb-0_1_2_1_0
ACTION=change
TRIGGER=kbd-scrolllock
SEQNUM=17431
USEC_INITIALIZED=10059229961
TAGS=:seat:
XKBLAYOUT=fr
XKBOPTIONS=ctrl:swapcaps compose:lwin
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001C/input/input53/input53::scrolllock
SUBSYSTEM=leds
ID_PATH=pci-0000:00:14.0-usb-0:1.2:1.0
ID_PATH_TAG=pci-0000_00_14_0-usb-0_1_2_1_0
PWD=/
这就告诉我规则是匹配的&是适用的。
那么,我到底做了什么不改变我的kbd配置?
如果我在LinuxMint 20下面。
谢谢你的帮助!
发布于 2020-09-04 05:22:10
环境变量只从父进程传播到子进程,而不是从子进程传播到父进程。从udev规则运行的任何内容通常都无法访问GUI会话的环境。
在您的示例中,由udev规则的RUN+=
部分启动的shell进程当然设置了XKBLAYOUT
和XKBOPTIONS
环境变量所需的方式。但是一旦RUN+=...
中的命令完成,这个shell就会退出.而这些修改后的环境变量也会随之消亡,而不会对任何事情产生任何影响。
只有当这些环境变量中的信息传递给setxkbmap
命令或类似的信息时,这些环境变量才会生效。在您的发行版中,它可能会作为X11会话设置的一个标准部分发生。仅仅设置变量本身,而不以某种方式将它们的值传递给X11服务器,对键盘布局没有任何影响。
由于X11会话设置通常来源于/etc/profile
和类似的shell启动文件,以便为GUI应用程序提供一个合理的环境,因此,可能仅仅在/etc/profile.d/*.sh
或类似的设置中设置这些变量就能工作。但是实际的魔力不是在变量中,而是在X11会话设置过程中,它将根据这些变量的值执行setxkbmap -layout $XKBLAYOUT ...
或等效的操作。这是你在udev规则中根本没有提供的部分。
udev规则的执行上下文与GUI会话的执行上下文完全无关。因此,即使添加了使用这些变量将更改传递给X11服务器的setxkbmap
命令,由udev规则启动的shell也不会有引用GUI会话的DISPLAY
或XAUTHORITY
变量,因此命令只会发出Cannot open display
错误消息。
( DISPLAY
变量和X会话cookie文件,无论是在~/.Xauthority
还是在XAUTHORITY
环境变量指向的自定义位置,都是成为X11 GUI会话的一部分或以任何方式向该会话发送命令所必需的。)
令人沮丧的是,几乎有一个功能可以巧妙地解决这个问题。您可以创建一个名为/etc/udev/hwdb.d/70-keyboard.hwdb
的文件,其内容如下:
evdev:input:b????v413Cp2107e*
XKB_FIXED_LAYOUT="fr"
# XKB_FIXED_OPTIONS="ctrl:swapcaps compose:lwin" # Unfortunately this part has not been implemented yet!
据我所知,这将只允许为特定键盘指定X11键盘布局,即使系统有其他带有其他布局的键盘。不幸的是,允许指定XKB键盘布局规范中的选项部分(我猜这部分对您来说很重要)的部分没有实现。
https://unix.stackexchange.com/questions/607822
复制