【问题标题】:How to set group id of a device file in Linux kernel?如何在 Linux 内核中设置设备文件的组 ID?
【发布时间】:2017-09-22 09:23:44
【问题描述】:

我的声音设备如下所示:

# ls -l /dev/snd                                                                                                                    
crw-rw----    1 root     root      116,   0 Jan  1 00:00 controlC0                                                                  
crw-rw----    1 root     root      116,  24 Jan  1 00:00 pcmC0D0c                                                                   
crw-------    1 root     root      116,  33 Jan  1 00:00 timer                                                                      

但在普通的 Linux 内核上应该是这样的(注意组是“音频”):

# ls -l /dev/snd                                                                                                                    
crw-rw----    1 root     audio      116,   0 Jan  1 00:00 controlC0                                                                  
crw-rw----    1 root     audio      116,  24 Jan  1 00:00 pcmC0D0c                                                                   
crw-------    1 root     audio      116,  33 Jan  1 00:00 timer                                                                      

我知道有 udev 可以在添加设备时应用规则来更改组,但由于我完全控制内核代码,我想在内核中修改它,可能还有设备驱动程序代码。

我该怎么做?添加设备时Linux如何分配组?

PS:我正在使用带有 4.1 版的嵌入式内核。第一个来自它。第二个来自我的 Ubuntu 电脑,我没有看到它使用 udev 规则。我看过一本书说用户/组属性是在创建文件时由进程ID/GID分配的,那么为什么Ubuntu pc有不同的组?

【问题讨论】:

  • SO 不是免费的编码服务。您必须自己尝试解决问题。如果您无法使其正常工作,请发布您尝试过的内容,我们会帮助您解决问题。
  • 内核如何知道哪个组是audio 组?这取决于 /etc/group 文件中的内容。
  • @Barmar 是的,我在 /etc/group 中添加了类似 audio::200: 的行,但它仍然需要在设备上设置一个音频组才能工作。我还修改了驱动程序代码中的结构属性和其他数据,但没有运气。我已经用谷歌搜索了一段时间,但大多数答案都是关于使用 udev。我不需要代码,可能一些关于阅读的内容就足够了。
  • 我会做更多的尝试,看看有什么变化。我的下一个尝试可能是 sysfs 或 kobjects。
  • 我的意思是内核对特定组一无所知。您必须将数字 200 硬编码到您的设备驱动程序中才能进行此更改,这是一个坏主意。你应该在用户代码中处理这种事情,而不是内核。

标签: linux linux-kernel device-driver


【解决方案1】:

在 Linux 中,声音设备通常通过 ALSA 工作,并且来自 ALSA wiki

udev 是管理 /dev 目录的标准方式,旨在解决以前 /dev 实现的一些问题,并提供一条稳健的前进道路。

udev 规则灵活且非常强大。编写 udev 规则应该可以解决常见的 Alsa 问题,由几个人报告:

在插入或拔出设备时,为多个音频设备分配相同的 hwplug:x,y 编号。 使用设备的产品 ID 或 USB 总线 ID 识别两个相同的音频设备。 将固件上传到特殊设备。

根据上述,我通过在我的 Ubuntu 电脑上运行以下命令做了一些实验:

sudo udevadm control --stop-exec-queue

我发现这些组变成了 root 但不再是音频了。

所以总的来说,到目前为止,ALSA 已经使用 udev 来处理音频组的修改,并且驱动程序中应该没有组修改代码。我将使用 udev 解决我的问题,感谢您的帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 2020-05-02
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    相关资源
    最近更新 更多