33.Linux-实现U盘自动挂载(详解)

 1.当我们每次插入u盘后,都会自动创键U盘的设备节点/dev/sda%d

这是因为里面调用了device_create()实现的, busybox的mdev机制就会根据主次设备号等信息,在/dev下创建设备节点,如下图所示:

 

而想使用上面的sda1设备节点,读写数据时,还需要使用mount /dev/sda1  /mnt,来挂载u盘才行,会显得非常麻烦,如下图所示:

 

 

 

 

2.其实,可以在/etc/mdev.conf文件里加入一行语句就能实现自动装载u盘,也可以在里面干其它与设备节点相关的事

2.1而/etc/mdev.conf又是什么?

它是属于mdev的一个配置文件,而mdev之前就讲过了,它主要的功能是管理/dev目录底下的设备节点

当系统中有自动注册设备节点的时候,mdev就会调用/etc/mdev.conf一次, 该文件可以实现与设备节点相关的事,比如自动装载usb,打印创建的设备节点信息等

 

3.我们首先来分析device_create(),是如何来调用到/etc/mdev.conf的,后面再讲如何使用mdev.conf(也可以直接跳过,直接看下面第4小节,如何使用)

(PS: 之前创建字符设备节点用的class_device_create(),其实是和device_create功能差不多)

3.1 device_create()最终调用了:device_create()->device_register()->device_add():

复制代码
device_create()->device_register()->device_add()函数如下所示:  int class_device_add(struct class_device *class_dev) {        ... ...        kobject_uevent(&class_dev->kobj, KOBJ_ADD);         // KOBJ_ADD是一个枚举值               //调用了kobject_uevent_env(kobj, action, NULL);              // action=KOBJ_ADD }
复制代码

3.2 device_create()->device_register()->device_add()->kobject_uevent_env()函数如下所示:

复制代码
int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,char *envp_ext[]) {        char **envp;        char *buffer;        char *scratch;        int i = 0;        ... ...         /* 通过KOBJ_ADD获取字符串"add",所以action_string="add"  */        action_string = action_to_string(action);              // action=KOBJ_ADD                                                              /* environment index */        envp = kzalloc(NUM_ENVP * sizeof (char *), GFP_KERNEL);      //分配一个环境变量索引值       /* environment values */     buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL);     //分配一个环境变量缓冲值      /* event environemnt for helper process only *//*设置环境变量*/        envp[i++] = "HOME=/";        envp[i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";        scratch = buffer;        envp [i++] = scratch;        scratch += sprintf(scratch, "ACTION=%s", action_string) + 1;  //"ACTION= add"        envp [i++] = scratch;        scratch += sprintf (scratch, "DEVPATH=%s", devpath) + 1;        envp [i++] = scratch;        scratch += sprintf(scratch, "SUBSYSTEM=%s", subsystem) + 1;        ... ...        /*调用应用程序,比如mdev*/       if (uevent_helper[0]) {             char *argv [3];               argv [0] = uevent_helper;       // uevent_helper[]= "/sbin/hotplug";               argv [1] = (char *)subsystem;               argv [2] = NULL;               call_usermodehelper (argv[0], argv, envp, 0);        //调用应用程序,根据传入的环境变量参数来创建设备节点        } }
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信