标签: udev

检测打开的文件/设备是否已被替换/删除

假设在Linux下存在以下情况:

从USB串行转换器设备(/dev/ttyUSB0)连续读取过程。该设备突然被拔出并再次插入(或出于某种原因而将其自身重置)。进程继续具有有效的文件句柄,/dev/ttyUSB0但除非重新打开设备(因为udev已删除并重新创建设备节点),否则它将不会从设备接收任何数据。

是否有检测这种情况的直接方法(即不是通过检测数据流中的超时来间接检测),以便进程知道必须重新打开设备?难道是可靠监控的修改时间/dev/ttyUSB0使用stat()

额外细节:

该过程使用标准open()功能打开设备文件。

/dev是由所tmpfs控制udev

注意:我不想为此使用任何udev规则,而是希望在过程中直接实现的解决方案。

linux filesystems monitoring usbserial udev

5
推荐指数
1
解决办法
1113
查看次数

如何使用udev识别设备

我想用libudev来监视某些设备.具体来说,我想监控可移动存储:USB硬盘,USB密钥,SD卡等.如果你知道设备的父系统的'子系统'和'devtype',libudev API可以让你找到一个设备.我在我的计算机上尝试了这些设备并使用udevadm发现所有存储类型都有'block' - >'scsi'的设备子系统,但我不知道这些设备有什么样的devtype.是否有一个devtypes和子系统的列表,我可以在某处使用它作为参考,或者是一个更好的方法来查找devtype?

linux usb udev

5
推荐指数
1
解决办法
7613
查看次数

连接/断开电源时使用 udev 激活脚本

当我连接/断开电源时,我试图让 udev 运行几个小脚本。我在 /etc/udev/rules.d/50-caff.rules 中有以下代码:

SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_STATUS}=="Charging", RUN+="/home/haukur/rules/off.sh"
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_STATUS}=="Discharging", RUN+="/home/haukur/rules/on.sh"
Run Code Online (Sandbox Code Playgroud)

这是on.sh:

#!/bin/sh
caffeine -a
Run Code Online (Sandbox Code Playgroud)

和off.sh:

#!/bin/sh
caffeine -d
Run Code Online (Sandbox Code Playgroud)

不管怎样,我写了这些,写进udevadm control --reload-rules了 bash ……什么也没发生。当我插上或拔下电源时,咖啡因似乎根本没有激活。

根据/var/log/syslog(Ubuntu 的替代品/var/log/messages),udev 在我拔下插头时会识别:

Feb 26 08:44:52 (none) udevd[3838]: starting '/home/haukur/rules/off.sh'
Run Code Online (Sandbox Code Playgroud)

但是当它尝试运行 off.sh(它本身尝试运行咖啡因)时,它返回此错误:

udevd[2719]: '/home/haukur/rules/off.sh'(err) '** (caffeine:3840): WARNING **: Command line `dbus-launch --autolaunch=62907743a139af9b3c86412e00000026 --binary-syntax --close-stderr' exited with non-zero exit status 1: Autolaunch error: X11 initialization failed.\n'
Run Code Online (Sandbox Code Playgroud)

你知道有什么方法可以解决这个问题吗?使用 xmonad WM 运行 Ubuntu 12.04 LTS。

linux udev

5
推荐指数
1
解决办法
2595
查看次数

我的 Perl 脚本如何对使用 UDev 而不是 HAL 的任意设备做出反应?

我想使用一个简单的 Perl 脚本在每次连接(例如我的蓝牙耳机)时进行一些配置。我尝试使用Net::DBus,但我的操作系统/DE(Fedora 17、GNOME3)不再使用 HAL。

我真的不想为此安装 HAL,那么我该怎么办?到目前为止我的想法:

  • (首选):使用DBus;只需监听 UDev 事件而不是org.freedesktop.Hal. 问题:我找不到相应的服务,org.freedesktop.UDisks似乎只监视磁盘(废话)。UDev 是否​​会为其他设备发送 DBus 消息?如果没有,我可以对其进行配置吗?
  • 使用 UDev 规则触发另一个脚本。我喜欢将我的脚本放在一个地方,以便轻松过渡到新的操作系统安装,所以我宁愿避免这种情况。
  • 我最好使用Python 直接收听 UDev吗?
  • 或者我可以使用 Perl 来做到这一点吗?CPAN 搜索“udev”没有产生任何有用的结果。

或者我可能完全不在状态,而 UDev 甚至不是我所需要的。文档和谷歌在这件事上都没有真正的帮助。解决方法是如果有人知道如何让 GNOME3 默认将音频输出切换到新连接的蓝牙耳机,但无论如何我想学习类似的脚本内容。

预先感谢您的任何指点!
A。

PS:顺便说一下,Google&Co. 声称 UDev 获取设备并向 HAL 发送消息,HAL 进而通知 DBus。事实绝对不是这样,因为 HAL 甚至不在 Fedora Repos aymore 中。

linux perl dbus device udev

5
推荐指数
1
解决办法
903
查看次数

UDEV-如何获取子设备属性的值

我正在编写一个 udev 规则来设置两个串行端口的名称。我想在符号链接中使用属性bInterfaceNumber的值。

我的规则是:

子系统==“usb”,驱动程序==“usb”,ATTRS {idVendor} ==“0403”,ATTRS {idProduct}==“6010”,SYMLINK + =“toto%s {bInterfaceNumber}”

规则与设备匹配,但从未找到属性值。

以下是一台设备的层次结构视图:

console@host:udevadm info --name=/dev/ttyUSB0 --attribute-walk
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0':
    KERNELS=="1-1:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="ftdi_sio"
    ATTRS{bInterfaceNumber}=="00"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-1':
    KERNELS=="1-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{idVendor}=="0403"
    ATTRS{idProduct}=="6010"
Run Code Online (Sandbox Code Playgroud)

提前致谢

linux serial-port udev

5
推荐指数
1
解决办法
8529
查看次数

udev .rules 文件以每个用户的本地身份运行?

我的代码会在每次 udev 检测到新 USB 时运行。

当我以本地用户身份运行它时,我的代码工作正常。

但是当我使用 udev.rules 文件时它失败了,因为它以 root 身份运行我的脚本。

如何以本地用户身份运行“.rules”?

linux rules local udev

5
推荐指数
0
解决办法
966
查看次数

当设备在启动时已连接时,不会触发带有 ACTION=="add" 的 Udev 规则

这是我的简单 udev 规则:

ACTION=="add",SUBSYSTEM=="usb",DEVPATH=="/devices/pci0000:00/0000:00:14.0/usb3/3-13",RUN+="/opt/usb-libvirt-hotplug/ usb-libvirt-hotplug.sh debian_testing" ACTION=="add",SUBSYSTEM=="usb",DEVPATH=="/devices/pci0000:00/0000:00:14.0/usb3/3-14",RUN+=" /opt/usb-libvirt-hotplug/usb-libvirt-hotplug.sh debian_testing"

这个被调用的脚本不是我的,但它只是计算出该端口上的 USB 设备的设备总线和编号,并将其添加到 libvirt 来宾 xml。

问题是当我在端口 13 或 14 上物理插入一些东西时,这工作正常,但是当 PC 启动并且 USB 设备已经插入时,这些规则不适用并且脚本不会被调用。

我该如何解决?

先感谢您。

linux libvirt udev

5
推荐指数
0
解决办法
515
查看次数

未找到 libudev 开发包

我正在编写一个应用程序自动检测设备是否插入/拔出。

我在 Qt 框架中使用了 C++。libudev.h包含在我的代码中。我实际上通过sudo apt-get install libudev-dev以下方式成功安装了 libudev-dev 包,但 QtCreator 仍然有一条错误消息:libudev development package not found

文件.pro:

...
CONFIG   += console c++11
CONFIG   -= app_bundle
unix: CONFIG += link_pkgconfig
unix: PKGCONFIG += libudev
HEADERS += DeviceManager.h
SOURCES += main.cpp \
  DeviceManager.cpp
...
Run Code Online (Sandbox Code Playgroud)

设备管理器.h文件:

#ifndef DEVICEMANAGER_H
#define DEVICEMANAGER_H

#include <QObject>
#include <QDebug>
#include <QSet>
#include <libudev.h>

#include "DeviceModel.h"

class DeviceManager : public QObject
{
    Q_OBJECT
public:
    explicit DeviceManager(QObject *parent = 0);

    QSet<DeviceModel *> getDevices();
    QStringList getDevicePaths(); …
Run Code Online (Sandbox Code Playgroud)

linux qt udev qt5 libudev

5
推荐指数
2
解决办法
6611
查看次数

任务中的 Flutter 构建错误:app:copyFlutterAssetsDebug

在我的 Linux 机器上构建 Flutter 应用程序时,我遇到了以下错误:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:copyFlutterAssetsDebug'.
> Could not copy file '/FwzFiles/GitHub/nilai_sekolah/build/app/intermediates/flutter/debug/android-arm64/flutter_assets' to '/FwzFiles/GitHub/nilai_sekolah/build/app/intermediates/merged_assets/debug/mergeDebugAssets/out/flutter_assets'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
Run Code Online (Sandbox Code Playgroud)

我必须使用本教程设置我的 Android 设备 (Google Pixel 2) (这需要我更改 udev 权限),那么这是否与错误有关?我能够将文件pull保存push到我的设备上。

我该如何修复这个错误?

android udev flutter

5
推荐指数
1
解决办法
3391
查看次数

udev 规则使用链接名称中的 ATTRS{serial} 为 USB 设备生成符号链接

我有一个 udev 规则,可以/dev根据 USB 设备的序列号为它们生成符号链接(我有多个其他方面相同的设备,但需要可重现的设备端点)。

目前我需要为每个新序列号添加一条规则,如下所示:

SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="S101", SYMLINK+="ttyS101"
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="S102", SYMLINK+="ttyS102"
...
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种使用单个规则来执行此操作的方法,所有可动态访问的都是%k%n%c,但我发现无法访问任何其他值。使用PROGRAM=""可能是一种方法,但我如何从那里访问 ATTRS?

我试过这个:

SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="S101", PROGRAM="/bin/sh -c 'udevadm info /dev/%k | grep ID_SERIAL_SHORT= | cut -d= -f 2'" SYMLINK+="tty%c"
Run Code Online (Sandbox Code Playgroud)

但它看起来/dev/%k在程序运行时不可用,所以这也不起作用。

有什么办法可以用于ATTRS{serial}我的SYMLINK+=""吗?

linux usb udev

5
推荐指数
1
解决办法
3936
查看次数

标签 统计

udev ×10

linux ×9

usb ×2

android ×1

dbus ×1

device ×1

filesystems ×1

flutter ×1

libudev ×1

libvirt ×1

local ×1

monitoring ×1

perl ×1

qt ×1

qt5 ×1

rules ×1

serial-port ×1

usbserial ×1