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

 

时间: 2024-10-13 18:41:03

mdev USB disk auto mount demo的相关文章

ASM disk group mount fails with ORA-15036: disk is truncated [ID 1077175.1]

  ASM disk group mount fails with ORA-15036: disk is truncated [ID 1077175.1] --------------------------------------------------------------------------------     修改时间 05-OCT-2011     类型 PROBLEM     状态 PUBLISHED   In this Document   Symptoms   Change

VC++ 6.0 C8051F340 USB PC侧通信 Demo

// HelloWorld.cpp : Defines the entry point for the console application. // /*************************************************************************** * VC++ 6.0 C8051F340 USB 通信 Demo * 声明: * 1. 本程序另外需要C8051F340单片机程序配合: * 2. 本程序是在拥有SiUSBXp.h.SiUSBX

如何使用USB闪盘安装PowerLinux

PowerLinux 的安装大部分情况下和 x86 Linux 安装几乎一样的方便.但有些情况下可能有一点点麻烦,例如,一台 Power 服务器没有安装 VIOS,没有内置光驱,也没有找到兼容的 USB 外置光驱,除了烦琐的网络安装,我们该如何安装它. 这里,介绍一下如何利用 USB 闪盘来启动安装 PowerLinux. 首先,我们要有一个大一点的 USB 闪盘,至少 4GB,能够装下一张 PowerLinux DVD 镜像文件.鉴于可能的兼容性问题,建议您用 IBM 服务器或存储设备上自带的

Win Setup From USB使用教程

WinSetupFromUSB 是个功能非常强大的自启动U盘制作工具,可以完成WinXP/Vista/Win7的U盘安装,完成同盘多Windows安装源的U盘制作以及Linux 启动安装等功能.用WinSetupFromUSB安装的U盘成功率极高,可谓百试百灵.而且它相较UltraISO还有个好处就是并不需要安装盘的 ISO镜像,只需要有安装文件的I386目录即可. 最新版本,增加了对NTFS的支持,建议使用该版.安装完成后插上要制作镜像的U盘并运行 首先将下载的系统光盘镜像解压到空白分区根目录

linux中mount命令参数详解(nfs 参数)

1,命令格式mount命令的格式如下: mount [-t vfstype] [-o  options] device dir mount命令参数非常多,如下为与NFS相关的参数. (1)-a:把/etc/fstab中列出的路径全部挂载.(2)-t:需要mount的类型,如nfs等.(3)-r:将mount的路径定为read only.(4)-v mount:过程的每一个操作都有message传回到屏幕上.(5)rsize=n:在NFS服务器读取文件时NFS使用的字节数,默认值是1 024个字节

centos-CentOS 6.5 安装完成之后所有USB设备都不管用了,只有笔记本自带都键盘和鼠标管用

问题描述 CentOS 6.5 安装完成之后所有USB设备都不管用了,只有笔记本自带都键盘和鼠标管用 CentOS 6.5 安装完成之后所有USB设备都不管用了,只有笔记本自带都键盘和鼠标管用,大家帮帮忙,需要怎么办啊? 解决方案 http://www.oschina.net/question/592514_71990 解决方案二: 是不是usb设备被禁用了,, 解决方案三: 你要在Linux里使用U盘的话,你需要mount才行,不然它不会自动给你加载的!http://www.tecmint.c

VC++ 6.0 C8051F340 USB 通信 CAN 数据解析

// HelloWorld.cpp : Defines the entry point for the console application. // /***************************************************************************** * VC++ 6.0 C8051F340 USB 通信 CAN 数据解析 * 声明: * 1. 这是在<VC++ 6.0 C8051F340 USB PC侧通信 Demo>的基础上的代码:

LINUX 常见问题1000个详细解答_unix linux

一. 如何建立多用户 提醒大家一句,别一直使用root用户,因为root用户在系统中有着至高无上的权力,一不小心 就可能破坏系统.比如我们想删除/temp目录下的文件却将命令不小心输成"rm / temp(在'/'后多了一个空格)",那么就极可能删去根目录下的所有文件.再者,"Linux是一个真正意义上的多 任务.多用户系统",不体会一下Linux的特色岂不可惜.为了方便自己和别人使用,就在Linux系统 下多建几个用户吧. 输入"adduser newu

Linux系统磁盘的分区、格式化、检验与挂载

磁盘分区 - fdisk fdisk的命令不需要记,因为输入m后,就会看到详细的帮助信息,如下所示: [root@lx15 /data ]# fdisk /dev/sda The number of cylinders for this disk is set to 36404. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems wi