国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Linux > 正文

詳解Linux實(shí)現(xiàn)U盤自動(dòng)掛載(圖文教程)

2020-10-28 18:44:22
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1.當(dāng)我們每次插入u盤后,都會(huì)自動(dòng)創(chuàng)鍵U盤的設(shè)備節(jié)點(diǎn)/dev/sda%d

這是因?yàn)槔锩嬲{(diào)用了device_create()實(shí)現(xiàn)的, busybox的mdev機(jī)制就會(huì)根據(jù)主次設(shè)備號(hào)等信息,在/dev下創(chuàng)建設(shè)備節(jié)點(diǎn),如下圖所示:

而想使用上面的sda1設(shè)備節(jié)點(diǎn),讀寫(xiě)數(shù)據(jù)時(shí),還需要使用mount /dev/sda1 /mnt,來(lái)掛載u盤才行,會(huì)顯得非常麻煩,如下圖所示:

2.其實(shí),可以在/etc/mdev.conf文件里加入一行語(yǔ)句就能實(shí)現(xiàn)自動(dòng)裝載u盤,也可以在里面干其它與設(shè)備節(jié)點(diǎn)相關(guān)的事

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

它是屬于mdev的一個(gè)配置文件,而mdev之前就講過(guò)了,它主要的功能是管理/dev目錄底下的設(shè)備節(jié)點(diǎn)

當(dāng)系統(tǒng)中有自動(dòng)注冊(cè)設(shè)備節(jié)點(diǎn)的時(shí)候,mdev就會(huì)調(diào)用/etc/mdev.conf一次, 該文件可以實(shí)現(xiàn)與設(shè)備節(jié)點(diǎn)相關(guān)的事,比如自動(dòng)裝載usb,打印創(chuàng)建的設(shè)備節(jié)點(diǎn)信息等

3.我們首先來(lái)分析device_create(),是如何來(lái)調(diào)用到/etc/mdev.conf的,后面再講如何使用mdev.conf(也可以直接跳過(guò),直接看下面第4小節(jié),如何使用)

(PS: 之前創(chuàng)建字符設(shè)備節(jié)點(diǎn)用的class_device_create(),其實(shí)是和device_create功能差不多)

3.1 device_create()最終調(diào)用了:device_create()->device_register()->device_add():

device_create()->device_register()->device_add()函數(shù)如下所示:int class_device_add(struct class_device *class_dev){ ... ... kobject_uevent(&class_dev->kobj, KOBJ_ADD); // KOBJ_ADD是一個(gè)枚舉值 //調(diào)用了kobject_uevent_env(kobj, action, NULL); // action=KOBJ_ADD}

3.2 device_create()->device_register()->device_add()->kobject_uevent_env()函數(shù)如下所示:

int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,char *envp_ext[]){  char **envp;  char *buffer;  char *scratch;  int i = 0;  ... ...  /* 通過(guò)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);  //分配一個(gè)環(huán)境變量索引值  /* environment values */    buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL);  //分配一個(gè)環(huán)境變量緩沖值  /* event environemnt for helper process only *//*設(shè)置環(huán)境變量*/  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;  ... ...  /*調(diào)用應(yīng)用程序,比如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);  //調(diào)用應(yīng)用程序,根據(jù)傳入的環(huán)境變量參數(shù)來(lái)創(chuàng)建設(shè)備節(jié)點(diǎn)  }}

從上面的代碼和注釋來(lái)看,最終通過(guò)*argv[], *envp[]兩個(gè)字符串?dāng)?shù)組里面存的環(huán)境變量參數(shù)來(lái)創(chuàng)建設(shè)備節(jié)點(diǎn)的

3.2接下來(lái)便在kobject_uevent_env()函數(shù)里添加打印信息, 然后重新燒內(nèi)核:

3.3然后我們以注冊(cè)一個(gè)按鍵驅(qū)動(dòng)為例

輸入 insmod key.ko,打印了以下語(yǔ)句:

class_device: argv[0]=/sbin/mdev        //調(diào)用mdevclass_device: argv[1]=sixth_dev      //類名class_device: envp[0]=HOME=/class_device: envp[1]=PATH=/sbin:/bin:/usr/sbin:/usr/binclass_device: envp[2]=ACTION=add          //add:表示添加設(shè)備節(jié)點(diǎn),  若=remove:表示卸載設(shè)備節(jié)點(diǎn)class_device: envp[3]=DEVPATH=/class/sixth_dev/buttons   //設(shè)備的路徑class_device: envp[4]=SUBSYSTEM=sixth_dev       //類名class_device: envp[5]=SEQNUM=745class_device: envp[6]=MAJOR=252       //主設(shè)備號(hào)class_device: envp[7]=MINOR=0

3.4最終這些參數(shù)根據(jù)/sbin/mdev就進(jìn)入了busybox的mdev.c的mdev_main()函數(shù)里:

int mdev_main(int argc, char **argv){... ...action = getenv("ACTION");     //獲取傳進(jìn)來(lái)的執(zhí)行參數(shù),它等于“add”,則表示創(chuàng)建設(shè)備節(jié)點(diǎn)env_path = getenv("DEVPATH");     //獲取設(shè)備的路徑“/class/sixth_dev/buttons”sprintf(temp, "/sys%s", env_path); //指定temp (真正設(shè)備路徑)為“/sys/class/sixth_dev/buttons”if (!strcmp(action, "remove"))   //卸載設(shè)備節(jié)點(diǎn)     make_device(temp, 1);else if (!strcmp(action, "add")) {  //創(chuàng)建設(shè)備節(jié)點(diǎn)      make_device(temp, 0); ... ... }

3.5最終調(diào)用mdev_main ()->make_device()函數(shù)來(lái)創(chuàng)建/卸載設(shè)備節(jié)點(diǎn),該函數(shù)如下所示:

static void make_device(char *path, int delete) //delete=0:創(chuàng)建, delete=1:卸載{  /*判斷創(chuàng)建的設(shè)備節(jié)點(diǎn)是否是有效的設(shè)備*/  if (!delete) {    strcat(path, "/dev");    len = open_read_close(path, temp + 1, 64);    *temp++ = 0;    if (len < 1) return;  }device_name = bb_basename(path); //通過(guò)設(shè)備路徑,來(lái)獲取要?jiǎng)?chuàng)建/卸載的設(shè)備節(jié)點(diǎn)名稱      //例: path =“/sys /class/sixth_dev/buttons”,那么device_name=“buttons”type = path[5]=='c' ? S_IFCHR : S_IFBLK;  //判斷如果是在/sys/class/目錄下,那么就是字符設(shè)備            //因?yàn)閴K設(shè)備,是存在/sys/block/目錄下的/* 如果配置了支持mdev.conf選項(xiàng),那么就解析里邊內(nèi)容并執(zhí)行 */ if (ENABLE_FEATURE_MDEV_CONF) {   /* mmap the config file */fd = open("/etc/mdev.conf", O_RDONLY);  //調(diào)用/etc/mdev.conf配置文件       ... ...   //開(kāi)始操作 mdev.conf配置文件}  if (!delete) {     //如果是創(chuàng)建設(shè)備節(jié)點(diǎn)    if (sscanf(temp, "%d:%d", &major, &minor) != 2) return; //獲取主次設(shè)備號(hào)        /*調(diào)用mknod ()創(chuàng)建字符設(shè)備節(jié)點(diǎn)*/if (mknod(device_name, mode | type, makedev(major, minor)) && errno != EEXIST)      bb_perror_msg_and_die("mknod %s", device_name);    if (major == root_major && minor == root_minor)      symlink(device_name, "root");    /*若配置了支持mdev.conf選項(xiàng),則調(diào)用chown命令來(lái)改變屬主,默認(rèn)uid和gid=0 */    if (ENABLE_FEATURE_MDEV_CONF) chown(device_name, uid, gid);}  if (delete) unlink(device_name);   //如果是卸載設(shè)備節(jié)點(diǎn)}

從上面的代碼和注釋分析到,要使用mdev.conf配置文件,還需要配置busybox的menuconfig, 使mdev支持mdev.conf選項(xiàng)才行

如下圖,進(jìn)入busybox目錄,然后輸入make menuconfig,發(fā)現(xiàn)我們已經(jīng)配置過(guò)了該選項(xiàng)了

4.接下來(lái),便來(lái)看看如何使用mdev.conf, 參考busybox-1.7.0/docs/mdev.txt文檔

使用方法如下所示:

the format:

<device regex> <uid>:<gid> <octal permissions> [<@|$|*> <command>]

The special characters have the meaning:

@ Run after creating the device.

$ Run before removing the device.

* Run both after creating and before removing the device.

大概就是:

配置文件格式:

<device regex> <uid>:<gid> <octal permissions> [<@|$|*> <command>]

各個(gè)參數(shù)代表的含義如下:

deviceregex:

正則表達(dá)式,來(lái)表達(dá)哪一個(gè)設(shè)備,正則表達(dá)式講解鏈接:https://deerchao.net/tutorials/regex/regex.htm

uid:

owner (uid,gid:注冊(cè)設(shè)備節(jié)點(diǎn)時(shí),就會(huì)被chown命令調(diào)用,來(lái)改變?cè)O(shè)備的屬主,默認(rèn)都填0即可)

gid:

組ID

octalpermissions:

以八進(jìn)制表示的權(quán)限值,會(huì)被chmod命令調(diào)用,來(lái)更改設(shè)備的訪問(wèn)權(quán)限,默認(rèn)填660即可

@ :創(chuàng)建設(shè)備節(jié)點(diǎn)之后執(zhí)行命令

$ : 刪除設(shè)備節(jié)點(diǎn)之前執(zhí)行命令

* :創(chuàng)建設(shè)備節(jié)點(diǎn)之后和刪除設(shè)備節(jié)點(diǎn)之前執(zhí)行命令

command :要執(zhí)行的命令

5.接下來(lái)便來(lái)使用mdev.conf,實(shí)現(xiàn)u盤自動(dòng)裝載

vi /etc/mdev.conf

添加以下一句:

sda[1-9]+ 0:0 660 * if [ $ACTION = "add" ]; then mount /dev/$MDEV /mnt; else umount /mnt; fi

[1-9]:匹配1~9的數(shù)字,

+ : 重復(fù)匹配一次或更多次

$ACTION=="add" :表示注冊(cè)設(shè)備節(jié)點(diǎn),否則就是注銷設(shè)備節(jié)點(diǎn)

/dev/$MDEV    :表示要?jiǎng)?chuàng)建/注銷的那個(gè)設(shè)備節(jié)點(diǎn)

所以當(dāng)我們插上u盤,自動(dòng)創(chuàng)建了/dev/sda1時(shí),mdev便會(huì)進(jìn)入/etc/mdev.conf配置文件,然后執(zhí)行mount /dev/ 命令,即可自動(dòng)裝載U盤,如下圖所示:

輸入ls /dev/sda1 -l,可以看到都是通過(guò)mdev.conf里配置信息來(lái)創(chuàng)建的設(shè)備節(jié)點(diǎn),如下圖所示:

而取出u盤時(shí),同樣自動(dòng)umount /mnt來(lái)卸載。

總結(jié)

以上所述是小編給大家介紹的Linux實(shí)現(xiàn)U盤自動(dòng)掛載,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)武林網(wǎng)網(wǎng)站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 五莲县| 从化市| 扶沟县| 辰溪县| 汝阳县| 陆丰市| 沂水县| 都江堰市| 郎溪县| 巧家县| 遂平县| 巴楚县| 家居| 绍兴市| 民丰县| 和硕县| 舟山市| 武清区| 曲靖市| 中山市| 榆林市| 宝丰县| 疏附县| 安达市| 康定县| 文水县| 信阳市| 乡宁县| 积石山| 丰原市| 抚松县| 乌审旗| 从江县| 稻城县| 南江县| 娄底市| 平江县| 青河县| 伊春市| 滕州市| 岐山县|