• 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
  • 相关阅读:
    C#中ArrayList 与 string、string[]数组 的转换
    C#int转成string,string转成int...获取listbox中的值...ListBox 如何循环赋值
    windows下定时利用bat脚本实现ftp备份上传
    Matlab中的静态文本框中显示多行内容
    matlab gui edit text 多行输出
    matlab的GUI中用全局变量来终止循环
    windows下定时利用bat脚本实现ftp上传和下载
    利用MATLAB绘制置信区域
    用MATLAB做聚类分析
    递归、斐波拉契数列、快速排序、八皇后
  • 原文地址:https://www.cnblogs.com/zengjfgit/p/7402823.html
Copyright © 2020-2023  润新知