如何在 Linux 内核中设置设备文件的组 ID?

How to set group id of a device file in Linux kernel?

我的声音设备是这样的:

# 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 内核上应该是这样的(注意组是 'audio'):

# 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 规则。我看过一本书说 user/group 属性是在创建文件时由进程 ID/GID 分配的,那么为什么 Ubuntu pc 有不同的组?

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

udev is the standard way of managing /dev directories, designed to clear up some issues with previous /dev implementations, and provide a robust path forward.

udev rules are flexible and very powerful. Writing udev rules should solve common Alsa problems, reported by several people:

Assign several audio devices the same hwplug:x,y numbers, whenever you plug-in or plug-out a device. Identify two identical audio devices using the product ID or the USB bus ID of the device. Upload firmware to a special device.

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

sudo udevadm control --stop-exec-queue

而且我发现这些组变成了根,但不再是音频。

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