拥有一个USB口,而且价格便宜,是WR720N相对于其他能够刷openwrt的无线路由器的一个小小的比较优势。有些路由器能刷openwrt,价格也很便宜,但是一般没有USB口,有些路由器有USB口,那么一般价格就比较贵。而在笃信信价比至上的x丝人群的眼中,WR720N就那么闪亮的登场并俘获了许多粉丝。它很便宜,能刷openwrt,而且还带USB口!
之前买它的时候,并不知道USB口对于刷openwrt会有不小的作用,只是觉得,如果能接3G上网卡上网,也是很酷的一件事情。等到刷了机之后,才发现当初的这个决定是多么的英明和有前瞻性,不由得佩服得连连点头。
为什么在刷openwrt的路由器上有一个USB会很有用,其实也很简单。有了USB口就可以接各种各样的USB外设,比如摄像头,比如USB口的打印机,比如zigbee网关什么的。只有能想到的,一般就都能够被openwrt支持。这样,安装了openwrt的无线路由器的功能就再也不局限于路由器了!它能够摇身一变,成为一些听起来很高大上的东西,比如家庭网关..或者物联网平台。。不过对于我而言,上面的这些都太高大上了一点,我的需求很简单也很直接,我可以接U盘和硬盘到WR720N上去,这样就能扩展这个无线路由器的容量了!
因为WR720N的Flash只有4M,4M可以装的一下一个精简版的openwrt系统没有问题,我记得刷机之后4M的flash好像也就剩下几十K的大小了。这样的话,虽然基本的无线路由器系统能够正常运行没有问题,但是扩展起来真的就没什么空间了。很多的扩展功能是需要安装软件的,软件是需要空间存放的,如果空间都没有的话,那么说openwrt能实现再多的牛逼功能,那都是空谈加扯淡而已,巧妇难为无米之炊。所以,如果有了USB口的话,我们就能够接上USB口的大容量存储设备,而Openwrt是提供了方法能够将整个的文件系统或者部分的文件系统迁移到外部存储设备上的(真是贴心!)。这样的话,存储空间就再也不是问题,空间有多大,就看你愿买多大的U盘或者移动硬盘了。那你想装什么软件就装什么软件吧,想搞什么服务就搞什么服务吧,这时候我们只要考虑CPU,RAM吃不吃得消就行了,而存储空间,再也不是瓶颈。
而且对于我来说,一个很有用的Use Case是,有了大的存储空间,我就可以把我的那些照片啊,视频啊什么的,都存储在无线路由器上,这样内网的所有的机器都能够统一访问这些文件了,而且如果做了DDNS的话,那么在外网也能访问这些文件了!这不就是一个文件服务器么,虽然性能应该很烂。
多么诱人的想法!而这些想法,正是因为WR720N有了一个USB口,而变为了可能。多么的幸福,不由得再次连连点头。
那来瞧瞧,怎么样操作,Openwrt就能够将文件系统转移到外部的U盘上,也就是openwrt号称的overlay技术.
第一步:准备工作
根据openwrt的文档系统的说明,如果要让WR720N支持外接USB存储设备的话,需要将路由器上的那个物理开关拨到3G模式,要不然不行!
准备一个U盘,并将其分为两个分区,并将一个分区格式化为ext4文件系统(或者ext2,ext3分区都可以),另外一个作为swap分区。具体怎么分区,google一下,会有一大串操作说明。我是在linux虚拟机里面操作的。
分区结束之后,将U盘连到路由器上。
第二步:让Openwrt支持USB存储设备
Openwrt需要安装模块才能够支持外设的USB存储设备,使用下面的命令。
# opkg update # opkg install kmod-usb-storage
上面的操作完成之后,重启一下路由器,重启完成之后,应该就能在/dev/目录下发现类似叫做”sd1″的设备了,这就说明openwrt已经能够识别U盘了。
接着使用下面的命令,让openwrt支持EXT4文件系统和exroot.
# opkg update # opkg install block-mount kmod-fs-ext4
其中的kmod-fs-ext4是用来让openwrt支持EXT4文件系统的,安装完这个模块后,除了EXT4文件系统,同时也向下兼容EXT3和EXT2文件系统。
而block-mount模块是用来支持exroot的,就是让openwrt能够将文件系统转移到外部存储设备上。
然后重启让模块生效。
# reboot
第三步:overlay操作
在路由器重启完成之后,连接的U盘就已经能够完全被Openwrt系统识别和操作了。这时候我们就可以做overlay操作,也就是将文件系统搬移到U盘里面去!完成之后,文件系统的大小,就再也不是那个可怜的4M了,U盘有多大,文件系统就有多大!
overlay的展现形式,按照Openwrt文档上的描述,其实是有两种:
- 一种是完全拷贝,将文件系统完全拷贝到外部存储中,然后系统启动的时候,直接跳转到外部存储设备中启动(?)
- 还有一种形式是将文件系统的内容拷贝到外部存储设备中,然后编辑原文件系统中的fstab文件,让其在系统启动之后运行时将外部设备中的文件系统挂载为系统的根文件系统,覆盖一开始的文件系统。
我使用了后一种形式。将系统根目录下的/overlay这个节点里面的内容拷贝到外部U盘中,然后编辑fstab文件。
首先需要挂载外部U盘。假设U盘的设备节点是/dev/sda1的话,那么将其挂载到/mnt/sda1上。
# mkdir /mnt/sda1 # mount -t ext4 /dev/sda1 /mnt/sda1
然后将系统的/overlay目录下的所有的内容都拷贝到/mnt/sda1里面去。
# tar -C /overlay -cvf - . | tar -C /mnt/sda1 -xf -
接着使能fstab,并且更新/etc/config/fstab文件。
# /etc/init.d/fstab enable
将/etc/config/fstab文件配置成下面的样子。表示将/dev/sda1这个外部分区mount到系统的/overlay目录。
config 'global' option anon_swap '0' option anon_mount '0' option auto_swap '0' option auto_mount '0' option delay_root '5' option check_fs '0' config 'mount' option target '/overlay' option device '/dev/sda1' option uuid 'f4b31198-2681-42e9-b58c-aa1494aeb759' option fstype 'ext4' option options 'rw,sync' option enabled '1' option enabled_fsck 0
注意上面的auto_swap和auto_mount都被我置为0了,因为如果置为1的话,那么系统就会自动的去找和mount相应的设备,如果USB外设有多个分区的话,可能我们在’mount’里面的配置就会不起作用。其中上面的UUID,可能也不一定需要,因为已经指定了/dev/sda1了。但是最好加上去。至于原因,下面的第四步会说到。
重启一下
# reboot
重启完了之后,再用df -h命令看看,是不是系统的容量再也不是4M了?!是不是感觉无限的可能已经触手可及?是不是仿佛看到了美好的未来已经在招手?
好好享受吧。
第四步:扩展话题–如果想要同时接多个USB外设怎么办?
这是一个很有可能的Use Case.比如我,我有一个16M的U盘,还有一个320G的东芝移动硬盘,还有一个16G的Sony的CF卡。我就想把16M的U盘作为系统盘,然后把320G的东芝移动硬盘作为数据盘,有可能还会想要把CF卡通过USB转换器连上系统。
但是!想法虽然很美好,但是WR720N只有一个USB口,怎么办?这时我们需要一个USB的hub,这样一个USB口就能拖多个USB设备了!
那么怎么配置呢?其实也不复再,就是配置fstab文件呗。
但是,虽然不复杂,但是还是有点弯弯绕的东西在里面,因为挂载root系统和挂载数据盘还是有点区别的。可以看看下面的这张图.
上面这个图描述的是overlay过程中,根文件系统的迁移。首先路由器启动的时候,根文件系统是存放在路由器内置的4M Flash里面的,在启动过程中,路由器读取fstab文件的配置,然后将/dev/sda1设备(就是我的16M的U盘)/overlay目录下,从而完成了根文件系统从4M flash到16M的U盘的迁移。从此以后,4M flash里面的fstab文件就不起作用了,因为整个的文件系统已经被/dev/sda1里面的文件系统取代,所以这时候起作用的fstab文件就是邮编的绿颜色的文件,而非原始的左边那个红色的的!
这是很重要的,从这里我们能看到为什么根文件系统的配置和数据盘的配置是不一样的。因为根文件系统的配置是在红色的fstab文件里面配置的,在红色的fstab文件里面必须要指定/dev/sda1作为新的文件系统,从而系统能够把/dev/sda1给mount进来。这个时候,在红色的fstab里面当然也可以配置320G的移动硬盘和16G的TF卡,但是实际上即使配置了,也不会起作用,因为一旦/dev/sda1被mount到根文件系统之后,系统里面起作用的fstab文件就不再是红色的那个了,而是右边的绿色的那个!!
所以,根文件系统的overlay来源的配置,应该在左边的红色的fstab中配置,而数据盘的配置,应该是在右边的绿色的fstab文件中配置!!
这么一解释,操作起来其实就很简单了。
另外还有一个要说明的是,在使用USB hub的时候,fstab的配置对于每一个分区,最好使用UUID来区别,最好不要用设备号(如/dev/sda1之类的)区别,因为我已经发现过好多次,比如说USB的HUB上连接了3个USB设置,每次系统启动的时候,并不一定会给某个USB设备固定的设备号,而是很有可能随机的!!就是说有可能某次系统启动的时候,会给16M的U盘分配设备号为/dev/sda1,但是下次启动的时候,就有可能把这个设备号分配给320G的移动硬盘!
那么建议的操作如下。
配置红色的fstab。这个操作实际上在第三部已经做了,在这里不需要再做任何操作。只是需要注意的是,第三步里面的UUID信息,要保留。
配置绿色的fstab,实际是编辑的是/dev/sda1里面的fstab。不过其实不用特别注意这一点,因为如果overlay正常工作的话,我们登陆进系统,在根文件系统里面看到的fstab文件就是/dev/sda1里面的根文件系统,直接编辑它,将320G的移动硬盘盒16G的CF卡配置好就行了。使用下面的命令。
# vi /etc/config/fstab
将fstab的内容编程成类似下面的这样。
config global option anon_swap '0' option anon_mount '0' option auto_swap '1' option auto_mount '1' option delay_root '5' option check_fs '0' config 'mount' option target '/mnt/CF_16G_Sony/' option uuid 'a1eb4237-cace-4be4-948b-a35419fe198f' option fstype 'ext4' option options 'rw,sync' option enabled '1' config 'mount' option target '/mnt/IDE_320G_Hitachi/' option uuid 'edf432c5-cbdf-4d50-a76f-1f7246e264f8' option fstype 'ext4' option options 'rw,sync' option enabled '1'
上面的配置文件里面的target就是挂载点,uuid就是各自设备的uuid。
按照这样配置的话,我的16G的CF卡就会在系统启动的时候被挂载到”/mnt/CF_16G_Sony/”目录,320G的移动硬盘会被挂载到”/mnt/IDE_320G_Hitachi/”目录。
Tips:怎么样在openwrt系统里面获取设备的UUID信息?
在Openwrt里面有一个现成的命令叫做block,键入block info就能够查看设备的UUID。就是这么简单!
按照上面的步骤操作的话,重启系统,就能发现三个USB设备都在自己该在的位子啦!
第五步:扩展话题–如何设置硬盘自动休眠?
我的系统里面挂载了一个320G的移动硬盘,自从挂上了之后,移动硬盘只要上了电,磁头就一直在转,耗电不说,噪音也不小,而且又不是企业级的服务器硬盘,这么一天24小时的转,肯定撑不了多长时间。还有关键的一点是,实际上用到这个移动硬盘的时间很少,所以相当于一天大部分的时间,它都在空转,没有任何业务!
所以很自然的一个想法就是,能不能在不访问硬盘的时候,将它停掉?专业点说就是spin down! 我知道是有办法的,之前折腾开发板的时候就知道有些软件是可以让硬盘在空闲几分钟之后,自动停转的。
实际上现在的硬盘,有一些是自带休眠功能的,在空闲状态下,隔一段时间,就自动进入休眠状态了。但是我的这个老的东芝的硬盘,不知道是硬盘的问题,还是硬盘盒的问题,一旦上电了,就拼了命的转,完全不管是不是空闲状态。
搜集了一下网上的信息,有好几个软件都能够解决这个问题,比如HD-idle和Hdparm.
实践了一下,对于我这块东芝的移动硬盘,HD-idle不起作用,但是很意外的是Hdparm居然成功了!
使用下面的命令安装Hdparm.
# opkg update # opkg install hdparm
据说hdparm这个命令有时候会比较危险,所以尽量不要乱用,要不然硬盘挂掉都不知道是怎么弄得。
配置成自动休眠时间为20分钟。
hdparm -S 240 /dev/sda1
关于Hdparm命令的详细使用方法,直接在openwrt系统里面键入hdparm,就会有提示出来了,或者直接google就能查到了。
OK,这么操作的话,那么不出意外(硬盘的型号太多,还有各种乱七八糟的硬盘盒,所以很有可能会有意外)过了20分钟,整个世界就会清静了!
但是,总会有但是,我的这个东芝的破硬盘,还有一个问题,就是每次重启之后,之前配置的这个命令就失效了。所以,我必须在每次重启的时候执行一下这个命令。
我写了一个简单的脚本spin-down-hdd.sh,每次系统重启的时候都去调用这个脚本就行了(这个脚本只对我的这个东芝的HDD有效!不能直接使用!主要是通过UUID来获取device name的):
实际上也就是把这个命令”sh /root/spin-down-hdd.sh”放到/etc/rc.local这个文件里面去就行了。
#!/bin/sh #use this script to set the auto spin-down timeout for my Hitachi HDD only on Openwrt #do not use this script for anyother devices on anyother platform. #jun_deng@outlook.com #usage: ./spin-down-hdd.sh #parameter check if [ "$#" != 0 ];then echo "param error." exit 0 fi #UUID for my Hitachi HDD is 'edf432c5-cbdf-4d50-a76f-1f7246e264f8' #use openwrt specific command 'block' to get the device name DEVICE=`block info |grep 'edf432c5-cbdf-4d50-a76f-1f7246e264f8' |awk -F: '{print $1}'` if [ -z "$DEVICE" ];then echo "no Hitachi HDD found.exit!" exit 0 fi #set auto spin-down timeout timer to 20minuts echo "Hitachi HDD found and mounted!" echo "auto spin-down timer setted to 20 minutes!" hdparm -S 240 $DEVICE exit 0
OK。这样的话,基本上每次系统重启的时候,都能执行以下这个脚本,就能保证每次每次系统重启,都会配置休眠。但是,依然有但是,有时候会把硬盘盒的电源关掉,然后再次打开硬盘盒电源的时候,之前配置的休眠的命令又不起作用了!这种情况,暂时还没能解决,应该能通过openwrt的hotplug机制能够解决,但是我已经没心思搞这个了。就留着以后再弄吧。
不管怎么样,如果这么一步步的设置下来,到了这个地方,那么,我们基本上就已经能很开心的使用我们的USB存储设备了。
那么好的照片,好的片子,搞起来!