首页 > 代码库 > 编译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