mdev USB disk auto mount demo

/*********************************************************************
 *                mdev USB disk auto mount demo
 * 说明:
 *     之前有分析过mdev,这次富林写了一个demo,跟一下,不过呢,在看过之后
 * 觉得,需要优化,后面提供了一种兼容eMMC、SD、U盘、SATA自动挂载的方式,
 * 在功能上可以进步的进行优化,其中的eMMC、SD卡功能需要加强区分,这份脚本
 * 中没有进一步识别区分,这份参考来自参考文档第二点链接。
 *
 *                                   2017-8-21 深圳 龙华樟坑村 曾剑锋
 ********************************************************************/

一、参考文档:
    1. MDEV Primer
        http://www.cnblogs.com/zengjfgit/p/5133307.html
    2. [Linux] Auto mount 自動掛載 usb disk & SD card
        http://www.awaysu.acsite.org/linux/linux-auto-mount-usb-disk-sd-card/
    3. SD card automount for Embedded Linux
        http://infosoure.blogspot.com/2011/04/sd-card-automount-for-embedded-linux.html
    4. How to mount removable media in /media/<LABEL> automatically when inserted, without any desktop environment?
        https://unix.stackexchange.com/questions/44454/how-to-mount-removable-media-in-media-label-automatically-when-inserted-with

二、代码阅读:
    1. /etc/mdev.conf
        ...
        sda1   0:0 0660       @/etc/usb_disk1_insert
        sda    0:0 0660       $/etc/usb_disk1_remove
        sdb1   0:0 0660       @/etc/usb_disk2_insert
        sdb    0:0 0660       $/etc/usb_disk2_remove
        ...
    2. /etc/usb_disk1_insert
        #!/bin/sh
        
        if [ ! -e /media/sda1 ]; then
            mkdir /media/sda1 -p
        fi
        
        mount -t vfat /dev/sda1  /media/sda1
    3. /etc/usb_disk1_remove
        #!/bin/sh
        
        umount  /media/sda1
        
        if [ -d /media/sda1 ]; then
            rm /media/sda1 -rf
        fi
    4. /etc/usb_disk2_insert
        #!/bin/sh

        if [ ! -e /media/sdb1 ]; then
            mkdir /media/sdb1 -p
        fi

        mount -t vfat /dev/sdb1  /media/sdb1
    5. /etc/usb_disk2_remove
        #!/bin/sh
        
        umount  /media/sdb1
        
        if [ -d /media/sdb1 ]; then
            rm /media/sdb1 -rf
        fi
    
三、更好的处理方式:
    1. /etc/mdev.conf 
        ...
        sd[a-z][0-9] 0:0 600 *(/etc/init.d/automount.sh $MDEV &)
        mmcblk0p[0-9] 0:0 600 *(/etc/init.d/automount.sh $MDEV &)
        ...
    2. /etc/init.d/automount.sh
        #!/bin/sh
        
        # 挂载路径
        MOUNT_PATH=""
        # 信息输出串口
        MSG_PATH="/dev/ttyS0"
        
        # 设备节点为空检查,退出
        if [ $1 == "" ]; then
            echo "[AutoMount] automount.sh parameter is none" > $MSG_PATH
            exit 0
        # eMMC或者SD卡挂载
        elif [ $1 == "mmcblk0p1" ]; then
            MOUNT_PATH="/mnt/sdcard"
        # 其他类型的盘挂载
        else
            name=$1
            check=${name%[1-9]}
            vendor=`cat /sys/block/$check/device/vendor`
            # SATA挂载
            if [ $vendor == "ATA" ]; then
               MOUNT_PATH="/mnt/hdd/"$name
            # U盘挂载
            else
               MOUNT_PATH="/mnt/usb/"$name
            fi  
        fi
        # 将挂载点信息输出到串口
        echo "[AutoMount] mount path : $MOUNT_PATH" >> $MSG_PATH
        
        # 获取当前需要挂载、卸载的分区格式
        FORMAT=`/sbin/fdisk -l | grep $1`
        # 查看是否已经有挂载设备了,如果已经挂载,那当前次就要卸载
        OLD_MOUNT_PATH=`mount | grep $MOUNT_PATH`
        
        # 未挂载,那么当前次就是需要进行挂载
        if [ "$OLD_MOUNT_PATH" == "" ]; then
        
            # 如果挂载点不存在,那么就自动创建挂载点
            if [ ! -x $MOUNT_PATH ]; then
                mkdir -p $MOUNT_PATH
            fi 
        
            # 针对格式进行挂载
            for token in $FORMAT
            do
                if [ $token == "FAT32" ]; then
                    mount -t vfat /dev/$1 $MOUNT_PATH
                    echo "[AutoMount] mount -t vfat /dev/$1 $MOUNT_PATH" > $MSG_PATH
                elif [ $token == "FAT16" ]; then
                    mount -t vfat /dev/$1 $MOUNT_PATH
                    echo "[AutoMount] mount -t vfat /dev/$1 $MOUNT_PATH" > $MSG_PATH
                elif [ $token == "HPFS/NTFS" ]; then
                    if [ -f /usr/app/ntfs-3g ]; then
                        echo "[AutoMount] /usr/app/ntfs-3g /dev/"$1" "$MOUNT_PATH > /var/log/automount/mount.log
                        export LD_LIBRARY_PATH=/lib/:${LD_LIBRARY_PATH}
                        /usr/app/ntfs-3g /dev/$1 $MOUNT_PATH
                        echo "[AutoMount] /usr/app/ntfs-3g /dev/$1 $MOUNT_PATH" > $MSG_PATH
                    else
                        mount -t ntfs /dev/$1 $MOUNT_PATH
                        echo "[AutoMount] mount -t ntfs /dev/$1 $MOUNT_PATH" > $MSG_PATH
                    fi
                # 没有针对的格式,直接进行挂载
                elif [ $token == "Linux" ]; then
                    mount /dev/$1 $MOUNT_PATH
                    echo "[AutoMount] mount /dev/$1 $MOUNT_PATH" > $MSG_PATH
                fi
            done
        # 自动卸载
        else
            umount $MOUNT_PATH
            echo "[AutoMount] umount "$MOUNT_PATH > $MSG_PATH
        fi
    3. 插入U盘,输出信息:
        [rootzengjf init.d]# [ 1233.252058] usb 1-1.2: new high-speed USB device number 5 using musb-hdrc
        [ 1233.372824] usb 1-1.2: New USB device found, idVendor=0781, idProduct=556b
        [ 1233.380358] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
        [ 1233.388402] usb 1-1.2: Product: Cruzer Edge
        [ 1233.393128] usb 1-1.2: Manufacturer: SanDisk
        [ 1233.397922] usb 1-1.2: SerialNumber: 2005395413192CA2C0DB
        [ 1233.411004] usb-storage 1-1.2:1.0: USB Mass Storage device detected
        [ 1233.450259] scsi host2: usb-storage 1-1.2:1.0
        [ 1234.455868] scsi 2:0:0:0: Direct-Access     SanDisk  Cruzer Edge      1.27 PQ: 0 ANSI: 6
        [ 1234.476271] sd 2:0:0:0: [sdc] 15431338 512-byte logical blocks: (7.90 GB/7.36 GiB)
        [ 1234.523098] sd 2:0:0:0: [sdc] Write Protect is off
        [ 1234.548813] sd 2:0:0:0: [sdc] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
        [ 1234.603919]  sdc: sdc1
        [ 1234.625862] sd 2:0:0:0: [sdc] Attached SCSI removable disk
        [AutoMount] mount path : /mnt/usb/sdc1
        [ 1234.922506] FAT-fs (sdc1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
        [AutoMount] mount -t vfat /dev/sdc1 /mnt/usb/sdc1

 

posted on 2017-08-21 10:06  zengjf  阅读(1024)  评论(0编辑  收藏  举报

导航