vold 和 udevd 的区别

Posted

技术标签:

【中文标题】vold 和 udevd 的区别【英文标题】:The difference between vold and udevd 【发布时间】:2014-06-21 10:26:03 【问题描述】:

我知道 android 使用 volume daemon 而不是 udevd。

因为这两个守护进程的行为类似于以下:

    使用netlink socket接收内核发送的uevents。

    处理文件节点以供进一步处理。

我不清楚这两个不同的守护进程之间的区别。

有人可以提供反馈吗?有利有弊都会很好。

谢谢

【问题讨论】:

【参考方案1】:

看了vold source code之后,我只能说它只是简单地替代了udevd。

你说得对,vold 正在使用 netlink 套接字从内核接收 uevents。但我想说它处理的是 block 子系统事件,而不是你说的“文件节点”。

在 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 子系统字符串与“块”进行比较。就我所见,这是与 udevd 的主要区别,因为 udevd 处理 所有 子系统,而 vold 是一个简单的守护进程,用于处理存储卡等块设备。

关于vold的精彩介绍:http://www.slideshare.net/wiliwe/android-storage-vold

编辑子系统

子系统是整个内核高级部分的表示。实际上,子系统只是内核kset 的一个包装器。在 LDD3 第 14.1 章 - Kobjects, Ksets, and Subsystems 中有一篇很好的文章。

例如,让我们在插入 U 盘时监控事件。

$ 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 输出,您可以看到以下子系统:

USB scsi scsi_host scsi_disk scsi_device scsi_generic bsg bdi 阻止

udev 将处理所有这些事件以在 /dev 下创建不同的条目,例如

/dev/disk/by-id/<entry> 将基于磁盘 SCSI WWN 创建 /dev/disk/by-path/<entry> 将根据 PCI 连接和 SCSI 主机信息创建。 等等

相比之下,vold 只对 block sybsystem 中的 uevents 感兴趣,它不关心 scsi、usb 或 bdi 的东西。

【讨论】:

avd,您介意解释一下有关模块和其他子系统的更多信息吗?提供一些例子会很好理解。【参考方案2】:

在 android 中没有 udevd,它被称为 ueventsd 。 Ueventsd 和vold 都存在于android 中。 Vold 是用于移除大容量存储,主要是 sdcard、pendrive 等。

【讨论】:

以上是关于vold 和 udevd 的区别的主要内容,如果未能解决你的问题,请参考以下文章

Android -- Vold机制简要分析

Android7.0 Vold 进程工作机制分析之整体流程

Android的存储系统—Vold与MountService分析

Android的存储系统—Vold与MountService分析

systemd-udevd

android 6.0 修改vold check sd卡同步改成异步机制