就此而言,.net 中的一堆静态文件到底有什么问题/dev?对于开发人员来说,我现在重新发明这个轮子 3 次(devfs-> udev + HAL-> udev)显然不够令人满意,现在显然它也进入了 Grand Unified Init Program,所以四次。
我记得几年前我第一次开始使用 Linux 时感到惊讶,尽管声称“一切都是文件”,但没有/dev/eth0(后来是有道理的,因为它不是字符或块设备——尽管是“数据包”设备类型会很有趣...)。鉴于此,为什么处理字符和块设备文件树的程序还要负责网络设备?我已经看到对“灵活性”的模糊引用,但是这对 ifconfig(8) 仅通过查看所做的事情有何补充/proc/net/dev?例如,我知道 NetworkManager 不会很快出现在 Net 或 OpenBSD 中,因为它依赖于udev,这两个团队都不想编写;我不知道的/dev内核已经以多种方式公开了它们(并且它们都没有/dev!)。
仅仅是因为热插拔吗?内核只是侦听物理总线并在“添加设备”消息上加载适当的模块是否存在问题?或者,上帝保佑,实际管理员这样做?我确实记得早在 2000 年代初期,我的服务器有时会以意想不到的顺序初始化它们的网卡,我认为在用户空间中决定命名是有意义的(尽管当时修复并不是非常困难),但是这对蟑螂来说似乎是一把大锤。(或者,这个问题可能会影响到我认为比机架式服务器或 PC 更难的用例,这是我的经验。)
所以,简单地说一下我的问题:udev 实际解决了什么问题,devfs、HAL 和/或普通旧文件如何无法解决这些问题?许多不同的东西(热插拔、通用设备管理、网络设备管理、设备命名、驱动程序优先级等)都成为一个程序是否有特殊原因?
当我插入 USB 键盘但我的 udev 规则不起作用时,我试图加载新的键盘布局。
SUBSYSTEM=="input", ATTR{idVendor}=="062a", ATTR{idProduct}=="0201", GOTO="usb_xmodmap_auto"
标签=“usb_xmodmap_auto”
ACTION=="添加", RUN+="/usr/bin/xmodmap ~/.usbXmodmap"
ACTION=="移除", RUN+="/usr/bin/xmodmap ~/.pndXmodmap"
我已经使用以下方法重新加载了规则:
>sudo udevadm 控制 --reload-rules
并通过重新启动系统但是当我插入 USB 键盘时,原始 xmodmap 仍然加载,因此键盘布局是错误的,但是如果我在终端中运行命令
>/usr/bin/xmodmap ~/.usbXmodmap或者
>/usr/bin/xmodmap ~/.pndXmodmap
他们工作得很好。
希望有人能帮忙。
编辑:
为了提供更多帮助,我进行了一些 udevadm 测试:
>udevadm 测试 --action=add /devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10
输出:
运行命令:调用:测试
udevadm_test:版本 151
此程序仅用于调试,不运行任何程序,
由 RUN 键指定。它可能会显示不正确的结果,因为
某些值可能不同,或者在模拟运行时不可用。
[...]
parse_file: 读取“/etc/udev/rules.d/usb-keyboard.rules”作为规则文件
udev_rules_new:规则使用 100572 字节令牌(8381 * 12 字节),21523 字节缓冲区
udev_rules_new:临时索引使用了 35380 字节(1769 * 20 字节)
udev_device_new_from_syspath: 设备 0x3b4d8 有 devpath '/devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10'
udev_rules_apply_to_event: RUN '/sbin/modprobe -b $env{MODALIAS}' /etc/udev/rules.d/80-drivers.rules:5
udev_rules_apply_to_event: 运行 … 我正在尝试在 Ubuntu 13.10 下熟悉 udev。
这是我的第一个简单的 95.usbbackup.rules 规则:
ACTION=="add", SUBSYSTEMS="usb", RUN+="/usr/local/bin/my_backup.sh"
Run Code Online (Sandbox Code Playgroud)
这是脚本(已被 chmodded +x) my_backup.sh :
#!/bin/bash
touch /tmp/test
Run Code Online (Sandbox Code Playgroud)
当我插入外部驱动器时,什么也没有发生。如果规则被触发,我如何检查(日志、命令、任何东西)?
非常感谢
我正在尝试设置一个脚本以在每次插入 USB 设备时运行。我创建了文件/etc/udev/rules.d/90-local.rules并添加了以下规则:
ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"
Run Code Online (Sandbox Code Playgroud)
问题是当驱动器连接时,什么也没有发生。出于调试目的,该脚本被操纵以使用通知发送发送通知,该通知已安装并在终端上正常工作。
脚本的路径是正确的,因为我在终端中运行了那个确切的命令,没有任何问题。
在 Linux 中自动挂载设备的方法不断变化,谷歌搜索返回了相当多的解决方案,对现代基于 systemd 的机器具有不同程度的适用性。
似乎存在以下方法:
/etc/fstab以通过 UUID/标签/设备添加每个驱动器的安装。udev 规则(显然“原始规则”可能与现有的 systemd 策略冲突)thunar+thunar-volman包,或nautilus在 Gnome 中使用gnome-volume-manager包自动挂载(显然它们依赖udisks)。选择可能是压倒性的,目前尚不清楚哪种方法是推荐的。此外,似乎不同的自动挂载子系统可能会相互冲突,导致分区由一个工具挂载,然后在几秒钟内被另一个工具自动卸载。
对于具有桌面环境的系统,这很简单,因为它们中的大多数会自动处理 USB 挂载,因此除了在设置中启用自动挂载选项外,不需要额外的操作。
对于主要在文本模式下运行的无头系统,当前的方法是什么?
所有我发现的选项摆弄后usbmount,以(几乎)刚刚工作后,我编辑 /lib/systemd/system/systemd-udevd.service和改变MountFlags=slave,以MountFlags=shared在描述这个问题(???? UPDATE:对于最近的systemd版本PrivateMounts=no,而应使用!)。无需手动向任何配置文件添加任何 UUID 或标签。缺点是它创建的挂载点/media/usbN并不完美,所以我已经切换到automount-usb非常容易设置(只需运行configure.sh脚本)并创建挂载文件夹,/media/<device>_<disk_label>例如像/media/sda2_mylabel(???? UPDATE :automount-usb似乎不可维护)。
相关链接:
我想/media根据磁盘的 UUID挂载 USB 驱动器。如何在 udev 规则文件中使用 USB 驱动器的 UUID,以及使用 UUID 编号作为文件夹名称安装 USB 驱动器的 udev 规则是什么。
该blkid命令仅在安装时输出磁盘的 UUID。
在我的基于 debian 的机器上,我有一个有效的multiseat configuration。
到目前为止我无法解决的一个烦人的细节是我连接的任何 USB 硬件总是分配给主要座位。
网上搜了下,看来解决这个问题的办法是在机器上接一个USB集线器,把它的“所有权”分配给次席。这样,任何连接到集线器的设备都将被控制到次要座位。但是,我对如何分配所有权有点困惑。
lsusb 允许我跟踪集线器的总线位置:
Bus 002 Device 004: ID 1a40:0201 Terminus Technology Inc. Hub
Run Code Online (Sandbox Code Playgroud)
如果有人能从这里引导我,我将不胜感激......
PS:最初我认为我必须调整xorg.conf设置,但阅读 conf.xorg 文档我找不到任何相关的内容。在其他一些帖子中,我也阅读了有关 using 的内容udev,但同样......我没有找到关于如何实现这一点的明确方法。
升级到 ubuntu 14.04 后,我在 dmesg 中看到了这个
[ 1.538887] systemd-udevd[105]: starting version 204
[ 19.074098] systemd-udevd[310]: starting version 204
[ 19.271342] systemd-udevd[381]: failed to execute '/lib/udev/socket:@/org/freedesktop/hal/udev_event' 'socket:@/org/freedesktop/hal/udev_event': No such file or directory
[ 19.279385] systemd-udevd[395]: failed to execute '/lib/udev/socket:@/org/freedesktop/hal/udev_event' 'socket:@/org/freedesktop/hal/udev_event': No such file or directory
[...]
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?
我正在尝试解决 Wheezy 中网络摄像头的问题,并且我需要使用命令 获取有关驱动器的一些信息udevinfo。问题是:这个可执行文件在哪里?
如果我运行sudo udevinfo结果是:
udevinfo:找不到命令
有什么建议吗?
如果在启动前连接,我的外部显示器(通过 Thunderbolt 连接到我的笔记本电脑)工作正常。但是,一旦以任何方式拔下或断开连接,xrandr 将不再检测重新连接的显示器。
我正在运行Arch Linux,bumblebee用于图形卡处理。外卡通过 Thunderbolt 连接器连接。有人能告诉我这台机器出了什么问题,我怎样才能使热插拔工作?谢谢。
【调试细节】
在下面的多线程bumblebee和udevadm,我做了一些测试,并提出了热插拔脚本。然而问题仍然没有解决。结果发布如下。
对于大黄蜂,我没有做太多调整,因为第二台显示器在未热插拔时检测良好。
对于热插拔相关问题。我做了以下事情:
当显示器正常工作时,xrandr --query返回
Screen 0: minimum 8 x 8, current 2944 x 1080, maximum 32767 x 32767
eDP1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 382mm x 215mm
1920x1080 60.02*+
...
DP1 connected 1024x768+1920+0 (normal left inverted right x axis y axis) 0mm x 0mm
1024x768 60.00*
...
Run Code Online (Sandbox Code Playgroud)
从 DP2 上拔下显示器并udevadm monitor --environment --udev …