我有一个在监狱中运行的带有 xorg-x11 的整个系统。我唯一的问题是,当 X 运行时,我无法添加或删除键盘或鼠标。如果我重新启动 X,新连接的键盘或鼠标就可以正常工作。我不想重新启动 X。如果我在裸机上运行我的系统,它会按预期工作。只有当我从监狱运行它时才会发生这种情况。
我看到这些设备是在我插入或拔出它们时创建的:
/dev/input/event*
/dev/usb/*
/dev/ukbd*
/dev/kbd*
/dev/ums*
/dev/ugen*
我正在运行 dbus,但无论出于何种原因,Xorg 似乎都没有看到它们。
如果我跟踪 /var/log/Xorg.0.log,则在插入或拔出键盘或鼠标时,我看不到任何指示添加或删除键盘或鼠标的消息。
编辑#1:
我对这个监狱的 devfs 规则是:
add path 'dri*' unhide
add path 'drm*' unhide
add path 'dsp*' unhide
add path 'mixer*' unhide
add path 'speaker*' mode 0660 group operator unhide
# USB drives
add path 'da*' unhide
编辑#1:回答答案中的问题:
- 我的 devfs 规则与监狱 devfs 规则 ID 匹配。
- 当我拔下并回复键盘和鼠标时,Xorg.0.log 没有显示任何事件。相反,主机系统显示键盘和鼠标被拔出并重新插入。
- 主机系统是最小安装,它有管理包和视频驱动程序,仅此而已。它没有完整的 Xorg 安装。
编辑#2:
- 我安装了 inputplug 并运行: DISPLAY=:0 inputplug -d --debug -c echo ,当我插入键盘并拔下它时,它没有打印任何输出。
- 同样,基础/主机系统上的 dmesg 显示键盘正在插入和拔出。
- 监狱显示 /dev/ukbd1 下的设备与主机匹配。
- 监狱显示还显示了 /dev/input/event7 下新添加的设备。
- xinput 列表前后没有显示出任何差异。
嗯,我无法在监狱中以 root 身份在 /dev 中创建任何文件。这是一个延伸,但监狱本身没有权限创建它需要的任何设备节点,而是依赖主机来创建它们吗?
答案1
devsfs规则
我首先怀疑的是devfs规则已设置。
您可以使用以下方法检查您的监狱设置了哪些规则:
# jls -j <jailname> -n devfs_ruleset
devfs_ruleset=0
您可以在 中查看默认规则/etc/defaults/devfs.rules
并在 中设置您自己的规则/etc/devfs.rules
。
在监狱中启用音频的典型示例是:
# /etc/devfs.rules
[devfsrules_my_fine_x_jail=42]
add include $devfsrules_hide_all
add include $devfsrules_unhide_basic
add include $devfsrules_unhide_login
add path 'mixer*' unhide
add path 'dsp*' unhide
请记住service devfs restart
,如果您违反规则。请注意,您不应堆叠/嵌套你的规则集,但要像上面那样明确。
然后在监狱配置中设置规则集:
# /etc/jail.conf
myjail {
devfs_ruleset = 42;
}
在这种情况下,它们可能足够好(TM),特别是如果它在 X 重新启动后工作。然而值得一提的是,因为据称这些设备是在 中看到的/dev
。没有说明的是这是否在监狱内或主机上得到验证。此外,我们没有看到连接 kbd/鼠标时实际添加的内容的差异。
X配置
假设主机和监狱中使用完全相同的 X 设置。但没有提及它是如何设置的。如今,X 非常擅长自动检测一切。再次假设我们使用的是最新的 FreeBSD 14 和新的 X。
配置 X 的现代方法不是拥有一个大的 xorg.conf,而是仅在我们真正需要时添加部分。如果我们有一个/usr/local/etc/X11/xorg.conf.d/input.conf
设置,如果有的话,选择什么设备路径和驱动程序,那就很有趣了。部分原因是为了确保我们不会做一些奇怪的事情,例如禁用自动添加设备。
在这种情况下,我假设没有设置。但是,如果重新启动 X 时它可以工作,那么查看/var/log/Xorg.0.log
以确定实际拾取的鼠标/键盘设备路径和驱动程序是很有趣的。如果在主机上启动,我们使用的是否与在监狱中相同。主机上触发了哪些未在监狱中拾取的事件?这将帮助我们缩小寻找范围。
开发怪癖
从前面我们不知道实际使用的是什么设备。也许设备运行良好,但这是一个配置问题evdev
。我们是否使用一个乌德夫翻译层?也许翻译层在监狱内有一个边缘问题,就像 Linux chroot 环境一样在这里看到需要绑定挂载 udev 的地方。
最后一招
如果无法使用 Xorg 进行良好的自动检测,我们仍然可以选择避免完全重新启动 X 服务器。X输入可以作为命令运行。究竟需要什么咒语取决于所使用的设备。也许简单的--enable
设备名称就足够了。如果这种情况很少发生,则只需切换 VT(如果可能)并执行jexec xinput
.
devd
或者,如果值得的话,全力以赴,编写一个 hacky脚本。哈基,是的。最后的手段,是的。看如何在 FreeBSD 上配置 devd 以在连接 USB 键盘时运行程序?