在这里,特别感谢韦东山老师的指导。
Q:
请教个问题 在看hotplug_uevent时,有这样疑问:
驱动程序中调用class_device_create最终会调用到mdev
(假设系统里使用的是mdev)来创建设备节点,为啥我将文件系统里的mdev删掉后 系统开机后 一样会有设备节点存在?
A:
你执行 cat /proc/mounts ,贴图。
R:
root@Jalyn:~$ cat /proc/mounts
ubi0:rootfs / ubifs rw,relatime 0 0
devtmpfs /dev devtmpfs rw,relatime,size=125288k,nr_inodes=31322,mode=755 0 0
proc /proc proc rw,relatime 0 0
devpts /dev/pts devpts rw,relatime,gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs rw,relatime,mode=777 0 0
tmpfs /tmp tmpfs rw,relatime 0 0
tmpfs /run tmpfs rw,nosuid,nodev,relatime,mode=755 0 0
sysfs /sys sysfs rw,relatime 0 0
A:
执行 mount -t devtmpfs none /mnt
ls /mnt
R:
root@Jalyn:~$ ls /mnt/
autofs ram11 tty35
bus ram12 tty36
console ram13 tty37
cpu_dma_latency ram14 tty38
fd ram15 tty39
full ram2 tty4
fuse ram3 tty40
hwrng ram4 tty41
i2c-1 ram5 tty42
input ram6 tty43
kmsg ram7 tty44
log ram8 tty45
loop-control ram9 tty46
loop0 random tty47
loop1 rtc0 tty48
loop2 shm tty49
......
A:
你看到了吧?它使用的是devtmpfs虚拟文件系统创建设备节点的。
对话,到这里;问题也清晰了,是devtmpfs虚拟文件系统创建的设备节点。没有udev/mdev啥事。
问题产生的根本原因,在于对整个Linux文件系统认知的欠缺和学习的信息稍有些过时了。
其实udev/mdev不是主用来动态生成设备节点用的,udev的本质是用来接收一个kset加入离开系统这样的事件,简单点说是用来捕捉内核空间某些设备加入移除等事件,udev/mdev据此做一些处理,比如加载卸载相应的模块。动态设备节点的生成其实在内核中是由"devtmpfs"来完成的,跟xdev一点关系没有。
具体到device_create,它生成动态设备节点的调用链是:
device_create --> device_create_vargs --> device_register --> device_add --> devtmpfs_create_node
所以系统有没有xdev都不会影响设备节点的生成。(基于内核4.14版本分析)
2009年devtmpfs出现之前,/dev/下面的设备节点应该都是udev-daemon收到内核的事件后用mknod程序或者直接调mknod()系统调用创建出来的;现在基本上不走udev/mdev了,几乎所有的设备文件(比如/dev/sda1)都是内核直接创建的。这样可以缩短Linux的开机时间。
接下来,了解下什么是devtmpfs?
-
devtmpfs 概述
devtmpfs 的功用是在 Linux 核心 启动早期建立一个初步的 /dev,令一般启动程序不用等待 udev,缩短 GNU/Linux 的开机时间。
-
devtmpfs 解释
Devtmpfs lets the kernel create a tmpfs very early at kernel
initialization, before any driver core device is registered.
Every device with a major/minor will have a device node created
in this tmpfs instance. After the rootfs is mounted by the kernel,
the populated tmpfs is mounted at /dev. In initramfs, it can be
moved to the manually mounted root filesystem before /sbin/init is executed.
-
内核中加入devtmpfs支持
make menuconfig
Device Drivers --->
Generic Driver Options --->
[*] Maintain a devtmpfs filesystem to mount at /dev
[*] Automount devtmpfs at /dev, after the kernel mounted the rootfs
devtmpfs,通过devtmpfs_create_node(),唤醒了个内核线程来做设备结点的创建,删除!至于更具体设备节点的创建分析,可移步:devtmpfs文件系统创建设备节点。
到这里,你可能又会有这样的疑问:
现在为什么采用devtmpfs这种策略?将所有的信息通过uevent发送到用户空间,让用户空间自行选择对应的动作,将策略排除出内核中,udev就是为了这个目的引进的.不知道现在采用devtmpfs来创建有什么原因吗?
更多devtmpfs的讨论可以移步:The return of devfs。
网友评论