首页 > 代码库 > 编译openwrt无线路由挂载U盘搭建samba服务器

编译openwrt无线路由挂载U盘搭建samba服务器

环境:物理机+ubuntu12.04

路由器型号:TP-LINK TL-WR703N(ttl线已经改好引出)

U盘:Kingston DT 101 G2(8G)

 

一. 搭建环境并获取openwrt源码

  首先需要安装很多软件包,详细可以参考openwrt官网:http://wiki.openwrt.org/doc/howto/buildroot.exigence

我用的是trunk版本源码,步骤如下:(详见:https://dev.openwrt.org/wiki/GetSource)

 

$mkdir openwrt$cd openwrt$svn co svn://svn.openwrt.org/openwrt/trunk/

  

下载全部源码会比较耗时间(跟本地网速有关系),而且很可能频繁出现中断下载的情况(可能是用国外服务器的原因)。有一个办法可以缓解这些问题的出现:打开“Ubuntu软件中心”,打开“编辑”->“软件源”,更改“软件源”窗口的“Ubuntu软件”选项卡中“下载自:主服务器”为“中国的服务器”。

  同步好源码到本地之后会在openwrt文件夹中出现一个trunk文件夹。进入trunk文件夹,执行以下命令更新源码(svn up)并更新安装一些额外的软件包(feeds)。

$svn up$.scripts/feeds update -a$.scripts/feeds install -a

 

二. 根据需求配置编译openwrt固件

  做好以上准备之后,执行下面的命令以检查是否有缺失的依赖软件包或编译苦,如果有缺失按提示逐个安装上。

$make deconfig$make prereq

  接下来就是执行make menuconfig进入openwrt图形配置界面,跟linux内核配置界面是类似的。

1. 选择CPU型号

  Target System-->Atheros AR7xxx/AR9xxx

2. 选择路由型号

  Target Profile-->TP-LINK TL-WR703N

3. Base system中的选择(后面添加samba用户用到)

  Base system-->busybox-->Login/Password Management Utilities--> <*>adduser

4. Kernel modules中的选择(挂载U盘用,有些是默认的没有列出来)

  Block devices--> <*>kmod-scsi-core

  Filesystems--> <*>kmod-fs-vfat

  Native Language Support--> <*>kmod-nls-cp437

              --> <*>kmod-nls-iso8859-1

                --> <*>kmod-nls-utf8  

  USB Support--><*>kmod-usb-core

         --><*>kmod-usb-storage

           --><*>kmod-usb-storage-extras

        --><*>kmod-usb2

5. Netwok中的选择

  <*>samba36-server  

  到这里本次项目需要的东西基本已经选择好了,其他的默认不修改。

退出make menuconfig选择提示中的yes得到.config文件,然后执行make V=99,如果没有意外就能在trunk/bin/ar71xx目录下得到相应的软件包和两个固件。

附加--修改源码中的文件,使得openwrt系统默认开启wifi:

修改package/kernel/mac80211/files/lib/wifi/mac80211.sh

option disabled 1改成0,默认开启wifi。

 

三. 路由器刷机过程

 1. 主机准备

(1). 安装配置好tftp服务器;

(2). 将配置编译好的固件放在tftp共享目录中,并修改名称为fw.bin(方便输入);

(3). 用网线连接路由器和PC主机并设置好网卡。

以上tftp服务器搭建步骤详见:http://ei.vstu.cn/forum.php?mod=viewthread&tid=336&extra=page%3D1

 2.开始刷机

(1). 用USB -TTL连接路由器引出的ttl线,USB插入PC,用minicom打开终端;

(2). 重启路由器,并在终端快速按下t,p,l三个按键,则进入u-boot命令行模式;

(3). 输入print查看u-boot环境变量,设置路由器的serverip为主机PC的ip,确保与路由器的ipaddr在同一网段;

以下是图示刷机步骤:

通过tftp将fw.bin下载到路由器的内存0x80000000处:

擦除flash中固件的存放空间,从地址0x9f020000处开始,大小为0x3c0000(3.75M),并从内存0x80000000处复制大小为0x3c0000的数据到flash的0x9f020000处:

到此刷机完毕,输入reset重启路由即可。

 

四. 挂载U盘并配置samba服务器

1. 挂载U盘

  启动路由器之后插上U盘,会有提示如下:

说明可以识别挂载U盘,对应的设备节点为/dev/sda4。执行挂载时提示“codepage cp437 not found”这是因为一开始编译的时候没有将kmod-nls-cp437模块编译进内核中;

解决上一个问题之后,又遇到了这个问题,“IO charset iso8859-1 not found”,因为没有选上kmod-nls-iso8859-1。选上之后编译的固件就可以成功挂载了!

注:中文乱码尚未解决。

 

2. 修改配置samba文件

  以下是/etc/config/samba文件修改过后的内容:(其中udisk是用来共享的!udisk的mode为777

更改完之后重启samba服务,/etc/init.d/samba restart。windows用户通过连接路由器的wifi信号OpenWrt暂时还不可以访问共享的内容。还需要添加用户,因为smb.conf文件中的security = user,安全等级为用户认证级别,非无需认证的share!

3. 添加用户

  使用命令adduser wh21添加一个系统用户,并用smbpasswd -a wh21(随后提示设置SMB密码)将wh21添加进入smbpasswd文件中,这样wh21就是samba用户了。(查看smb.conf文件就会发现smb passed file这一项指定了/etc/samba/smbpasswd作为密码认证文件)

  此时再重新启动samba就可以通过wh21这个用户去访问共享目录udisk了。结果是能通过用户认证并从udisk中复制文件到windows主机中!速度在4M/s-5.8M/s之间。但是不能上传!!

  回想一下,wh21只是一个普通的用户,添加时没有指定分组,查看/etc/passwd文件发现它的组为“Linux User,,,”。但是在执行挂载命令时,是root用户进行的,查看挂载目录udisk的属性,是drwxr-xr-x,用户和用户组均为root。所以wh21这个用户只有可读可执行的权限。于是我修改passwd文件中wh21对应的分组为root,这样wh21就属于root分组的了。但是重启samba再次访问,问题依旧!原因还是权限,root用户组里的非root用户访问udisk文件夹的权限依旧是可读可执行。

  那剩下的问题就是由mount这个命令引起的了。通过翻阅以前收集的资料,发现可以在执行mount时指明一些参数。详见:hi.baidu.com/st_ask/item/443ad735f2e372f62784f42c 使用以下命令,可以使udisk的属性变为drwxrwxrwx。

mount -t vfat -o iocharset=utf8,umask=0000,dmask=0000,fmask=0000 /dev/sda4 /mnt/udisk

 这样一来root用户组里的wh21就可以对udisk进行读写了!不过从windows中下载文件时,速度降到了2.6M/s-4M/s 。

 

经过以上的种种工作,基于openwrt的无线路由器U盘共享功能就实现了!

 

设置服务自启动,可以修改/etc/rc.local文件,在exit 0 前面添加如下代码:

if [ ! -e /mnt/udisk ]; then    mkdir -m 777 /mnt/udiskfi  mount -t vfat -o iocharset=utf8,umask=0000,dmask=0000,fmask=0000 /dev/sda[0-9] /mnt/udisk     sleep 1  /etc/init.d/samba restart

 

附加--在windows系统中,经常使用winscp来备份或复制文件,就像ftp软件一样可以直接拉取,非常方便。在ubuntu下有openssh-client支持scp命令,openwrt中也有dropbear支持scp命令。不过都是通过命令行形式来实现的:scp  [option]  [user@host1:]file  [user@host2:]file2(从源地址到目标地址,可省略相应的当前主机直接键入文件绝对路径或相对路径)。有关于scp详见:http://www.vpser.net/manage/scp.html

 

参考:

  http://bbs.ybty.net/thread-496-1-1.html

  http://blog.chinaunix.net/uid-22731254-id-3948456.html