Wrtnode开源openwrt固件挂载u盘

戴维营教育原创文章,转载请注明出处。我们的梦想是做最好的iOS开发培训!

WRTNode平台OpenWRT-14-07固件挂载U盘

OpenWRT系统环境介绍

由于OpenWRT官方稳定版BB固件默认集成的软件包以及内核驱动模块都非常少, 所以我们需要额外的去安装那些挂载U盘所必须的驱动模块和用户空间软件包。

挂载U盘所需驱动分析

  • 首先,U盘是一个接在USB总线上设备,故我们需要USB总线的驱动,在Linux内核代码中,USB总线的驱动集成到SCSI总线驱动的模块当中去啦。对应应该安装的驱动名是kmod-scsi-generic。USB控制器之类的驱动就是kmod-usb-ohci,kmod-usb-uhci,kmod-usb2
  • 其次,U盘是一个USB总线上的磁盘存储设备,Linux内核驱动代码中,对应的驱动模块是kmod-usb-storage,如果是其他USB读卡器设备,驱动模块是kmod-usb-storage-extras
  • 然后,U盘上的磁盘分区有文件系统,根据上面的分区文件系统不同,需要不同的驱动模块,一般来说,我们用来在PC上和WRTNode来复制文件的U盘大都是微软的FAT32或NTFS文件系统,对应的Linux内核的驱动模块是kmod-fs-vfat以及kmod-fs-ntfs,如果要对U盘里NTFS分区进行写入,最好安装NTFS-3G驱动。
  • 最后,我们的每种文件系统中,关于路径,文件名等数据的编码都是可以不同的,所以我们需要内核当中有我们U盘里文件系统中相应的编码模块,而在内核里的叫法叫做CodePage(内码表,代码页),我们现在Windows的FAT32文件系统的CodePage一般是代号437,后来微软在内码转向UTF-16之前新增定义了一系列的支持不同语言字符集的代码页,被称作"Windows(或ANSI)代码页"。代表性的是实现了ISO-8859-1的代码页1252。 其对应的2个内核模块是:kmod-nls-cp437 kmod-nls-iso8859-1

驱动模块和程序安装

根据前面的分析结果,我们用下面命令来安装这些必须的驱动和软件包:

opkg install kmod-scsi-generic kmod-usb-uhci kmod-usb-storage kmod-usb-storage-extras  kmod-fs-vfat kmod-fs-ntfs kmod-nls-cp437 kmod-nls-iso8859-1 ntfs-3g block-mount

安装完驱动之后,我们重启一下开发板或者路由器设备。

U盘手动挂载操作

插入我们的U盘,同时会在串口终端上看到有USB设备变动的信息,会在系统的/dev/目录下生成磁盘设备的文件sdaX这样的。运行下面命令进行挂载,比如挂载sda4到系的/mnt命令下:

mount /dev/sda4  /mnt/

就这样,U盘的分区就成功挂载到了系统的/mnt目录下面来了。我们可以运行ls /mnt命令来列出U盘里的文件信息。

U盘自动挂载操作

编辑这个文件/etc/hotplug.d/block/10-mount,使得其内容如下:

#!/bin/sh
# Copyright (C) 2009 OpenWrt.org  (C) 2010 OpenWrt.org.cn
/sbin/block hotplug

blkdev=`dirname $DEVPATH`
if [ `basename $blkdev` != "block" ]; then
device=`basename $DEVPATH`
case "$ACTION" in
add)
mkdir -p /mnt/$device
# vfat & ntfs-3g check
if  [ `which fdisk` ]; then
isntfs=`fdisk -l | grep $device | grep NTFS`
isvfat=`fdisk -l | grep $device | grep FAT`
isfuse=`lsmod | grep fuse`
isntfs3g=`which ntfs-3g`
else
isntfs=""
isvfat=""
fi

# mount with ntfs-3g if possible, else with default mount
if [ "$isntfs" -a "$isfuse" -a "$isntfs3g" ]; then
ntfs-3g -o nls=utf8 /dev/$device /mnt/$device
elif [ "$isvfat" ]; then
mount -t vfat -o iocharset=utf8,rw,sync,umask=0000,dmask=0000,fmask=0000 /dev/$device /mnt/$device
else
mount /dev/$device /mnt/$device
fi
if [ -f /dev/${device}/swapfile ]; then
mkswap /dev/${device}/swapfile
swapon /dev/${device}/swapfile
fi
;;
remove)
if [ -f /dev/${device}/swapfile ]; then
swapoff /dev/${device}/swapfile
fi
umount /dev/$device
;;
esac

fi

保存之后就可以进行U盘的插拔自动挂载啦。

戴维营学院(高级开发视频): http://v.diveinedu.com

潜心俱乐部(iOS面试必备): http://divein.club