我知道Android使用的是卷守护程序而不是udevd。
由于这两个守护进程的作用类似如下:
使用netlink socket接收从内核发送的uevents。
处理文件节点以进行进一步处理。
我不清楚这两个不同守护进程之间的区别。
有人可以提供反馈吗?有利有弊,这将是伟大的。
由于
答案 0 :(得分:5)
在查看vold source code后,我只能说它只是udevd的简单替代品。
你是对的,vold正在使用netlink socket从内核接收uevent。但我要说它处理的是阻止子系统事件,而不是"文件节点"如你所说。
在NetlinkHandler.cpp中,您可以看到以下内容:
void NetlinkHandler::onEvent(NetlinkEvent *evt) {
VolumeManager *vm = VolumeManager::Instance();
const char *subsys = evt->getSubsystem();
if (!subsys) {
SLOGW("No subsystem found in netlink event");
return;
}
if (!strcmp(subsys, "block")) {
vm->handleBlockEvent(evt);
}
}
最后一行只是将uevent子系统字符串与" block"进行比较。这是与udevd的主要区别,因为udevd处理所有子系统,而vold是一个简单的守护进程来处理像存储卡这样的块设备。
关于vold的良好陈述:http://www.slideshare.net/wiliwe/android-storage-vold
编辑子系统
子系统是整个内核的高级部分的表示。实际上,子系统只是内核kset
的包装器。在LDD3中有一篇很好的文章,第14.1章 - Kobjects,Ksets和子系统。
例如,当我插入USB记忆棒时,让我们监控事件。
$ udevadm monitor -k
KERNEL[82215.299677] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1 (usb)
KERNEL[82215.299921] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0 (usb)
KERNEL[82215.300192] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10 (scsi)
KERNEL[82215.300226] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/scsi_host/host10 (scsi_host)
KERNEL[82216.339987] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0 (scsi)
KERNEL[82216.340047] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0 (scsi)
KERNEL[82216.340069] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0/scsi_disk/10:0:0:0 (scsi_disk)
KERNEL[82216.340088] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0/scsi_device/10:0:0:0 (scsi_device)
KERNEL[82216.340302] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0/scsi_generic/sg2 (scsi_generic)
KERNEL[82216.340445] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0/bsg/10:0:0:0 (bsg)
KERNEL[82217.110295] add /devices/virtual/bdi/8:16 (bdi)
KERNEL[82217.141629] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0/block/sdb (block)
要确定此输出中的子系统,请查看udevadm-monitor.c中的udev代码
static void print_device(struct udev_device *device, const char *source, int prop)
{
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
printf("%-6s[%llu.%06u] %-8s %s (%s)\n",
source,
(unsigned long long) ts.tv_sec, (unsigned int) ts.tv_nsec/1000,
udev_device_get_action(device),
udev_device_get_devpath(device),
udev_device_get_subsystem(device));
if (prop) {
struct udev_list_entry *list_entry;
udev_list_entry_foreach(list_entry, udev_device_get_properties_list_entry(device))
printf("%s=%s\n",
udev_list_entry_get_name(list_entry),
udev_list_entry_get_value(list_entry));
printf("\n");
}
}
在第一个printf中,udev_device_get_subsystem(device)
将在括号中的最后一个字段中输出sybsystem。
因此,对于udevadm monitor
输出,您可以看到以下子系统:
udev将处理所有这些事件,以在/ dev下创建不同的条目,例如
/dev/disk/by-id/<entry>
将基于磁盘SCSI WWN /dev/disk/by-path/<entry>
将基于PCI连接和SCSI主机信息创建。相比之下, vold 只对来自块 sybsystem的uevents感兴趣,它不关心scsi,usb或bdi的东西。
答案 1 :(得分:1)
在android中没有udevd,它被称为ueventsd。 Ueventsd和vold都存在于android中。 Vold适用于移动存储,主要是SD卡,pendrive等。