系统配置


一、      Rt3070 AP驱动编译过程及排错总结

1、  将ap的tar包解压到某目录下

2、  按照ap驱动解压目录下的INSTALL和README里的步骤,修改makefile中的kernel source目录路径及编译工具。一般在X86架构的系统上,不需要修改编译工具,默认为gcc。

3、  如果系统上没有kernel source,需要下载和系统内核版本一致的内核源代码,解压,然后确定kernel source目录,否则编译会报错

4、  Make

5、  Make完毕后驱动源码下的三个目录下会有三个ko结尾的驱动,拷贝出来按照load.6脚本里顺序insmod即可成功。

6、  网卡配置,修改/etc/Wireless/RT2870AP/下面的RT2870AP.dat文件(这个文件及目录原本是不存在的,需要自己创建目录,从驱动源码目录下将文件拷贝过去),里面的各个项可以通过看名称确定意义。或者查看驱动源码目录下的说明。

7、  网卡驱动编译排错:

问题1、刚装完系统,检查完驱动的makefile基本配置之后,确认内核目录、编译工具正确,进行make。

报错:rtmp_main.c : error : code model "kernel" not supported in the 32 bit mode

      rtmp_main.c : sorry.unimplemented : 64-bit mode not compiled in

是因为刚装完fedora15,内核目录/lib/modules/$(shell uname -r)/build下的.config文件中的选项没有载入到make menuconfig中,或者说是make menuconfig之后,exit前,没有save。到/lib/modules/$(shell uname -r)/build下make menuconfig一下,exit之后选择save。问题即可排除。

 

问题2、报错implicit declaration of function 'XXX'

某函数的隐式声明。其实就是没有找到这个函数的声明、定义。这种报错一般出现在内核版本比较新,驱动版本比较旧,一些老的函数在新内核头文件中,已经改用别的名字。比如init_MUTEX()改名为sema_init(sem,1) init_MUTEX_LOCKED改名为sema_init(sem,0),还有比较常见的是usb_buffer_free和usb_buffer_alloc它们分别被更名为usb_free_coherent和usb_alloc_coherent,参数没有变。可以通过报错的文件、行数找到这些函数,改成现在的名字,错误即可排除。

 

问题3、驱动编译完成,加载时,提示invalid module,用dmesg|tail命令查看后,发现是version magic报错。这个问题的原因一般是使用的内核版本与目前计算机上跑的内核版本不一致,在移植到嵌入式系统上的时候常出现。查证AP驱动的makefile里内核目录变量指向的是当前PC机所用内核目录。/lib/modules/`uname -r`/build

这一步没有错。那么说明驱动的makefile是正确的 切换到/lib/modules/`uname -r`/目录下,查看build(build在此处是一个符号链接), ls -al 发现build指向的目录是/usr/src/kernels/2.6.35.14-96.fc14.i686,问题在这里,虽然我用的目录是/lib/modules/`uname -r`/build 这个目录貌似与我当前内核版本(uname -r 即2.6.35.6-45.fc14.i686)一致,但是build这个符号链接指向的内核源码却是2.6.35.14-96.fc14.i686的,这样造成了编译出来的模块所带的version magic是2.6.35.14-96.fc14.i686这一版本,加载时与uname -r不符。   那么要解决这一问题,就需要修改一下内核源码里的version magic 。 驱动模块的version magic信息是怎么生成的: 2.6 内核下,在linux/vermagic.h中定义有VERMAGIC_STRING,VERMAGIC_STRING不仅包含内核版本号,还包含有内核 使用的gcc版本,SMP与PREEMPT等配置信息。模块在编译时,我们可以看到屏幕上会显示"MODPOST"。在此阶段, VERMAGIC_STRING会添加到模块的modinfo段。在内核源码目录下scripts\mod\modpost.c文件中可以看到模块后续处理部分的代码。模块编译生成后,通过`modinfo mymodule.ko`命令可以查看此模块的vermagic等信息。2.6 内核下的模块装载器里保存有内核的版本信息,在装载模块时,装载器会比较所保存的内核vermagic与此模块的modinfo段里保存的 vermagic信息是否一致,两者一致时,模块才能被装载。譬如Fedora core 4 与core 2 使用的都是2.6 版本内核,在Fedore Core 2下去加载Fedora Core4下编译生成的hello.ko,会出现"invalid module format" 错误。
只需要把/usr/src/kernels/2.6.35.14-96.fc14.i686/目录下源码中的include/linux/vermagic.h中的VERMAGIC_STRING修改成与当前PC内核uname -r一致即可。 修改如下: #define VERMAGIC_STRING                 \ "2.6.35.6-45.fc14.i686" ""      \ MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT  \ MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS \ MODULE_ARCH_VERMAGIC

具体的格式可以在modinfo yourmodule.ko查看之后再修改,修改完后重新make即可 加载后没有version magic报错提示。,重新make,就可以骗过version magic的检查。

问题4:驱动编译完成,加载后报错:invalid module,用dmesg|tail命令查看后,发现错误为:

module license unspecified tains kernel

接下来就是一个什么功能被disable了,然后一系列的 unknown symbol xxx()。

原因是驱动没有声明MODULE_LICENSE("GPL"); 可能因为没有这个声明,内核关闭了一些功能,导致一系列函数无法识别。找到usb_main_dev.c文件,加上GPL的声明即可。重新make,加载,可以驱动网卡。

 

问题5:fedora15上自带了对ralink rt2573和rt3070一系列网卡芯片的驱动模块,在插入网卡的时候,会自动加载,但是如果你要加载你自己的驱动,那么就跟系统自动加载的驱动冲突了,可能会死机

解决办法就是插入网卡的时候,不让系统自动加载自带的驱动。

先到/lib/modules下面找到module.dep文件,看rt2573相关驱动的依赖关系,也就是网卡插入时,到底哪些有关驱动被一起加载了,比如rt2573的,有rt73usb rt2x00usb rt2x00lib cfg80211等等。把这些名字添加到系统文件/etc/modprobe.d/blacklist.conf中,如blacklist rt73usb 这个语句就可以阻止系统在网卡插入usb时,自动加载rt73usb这个模块。记得要把所有有依赖关系的模块列全。

 

8、  当所有工作都做完,即驱动编译完成,Wireless目录下文件齐全并配置完毕后,按如下命令启动网卡:

insmod rtutil3070ap.ko

insmod rt3070ap.ko

insmod rtnet3070ap.ko

插上网卡后 iwconfig 会看到ra0出现

ifconfig ra0 up 192.168.1.1

启动网卡并设置IP为192.168.1.1

blacklist.conf,用于阻止内核自动加载自身所带的ralink驱动,影响我们自己编译的驱动,内核自带的驱动不太好用。RT2870AP.dat文件需要拷贝到/etc目录下面的,这样网卡起来的时候会去读这个目录下的配置,比如密码、wifi网络名称等。

 

二、      DHCP配置

1、  安装ubuntu的dhcp server软件

sudo apt-get install –y isc-dhcp-server

2)修改/etc/dhcp/dhcpd.conf

1)取消authoritative;的注释

2)subnet 192.168.1.0 netmask 255.255.255.0 {

  range 192.168.1.60 192.168.1.254;

  option routers 192.168.1.1;

  option domain-name-servers 192.168.1.1;

}

设定DHCP server分配IP的范围、并设定接入设备的默认网关和dns server为本ADFI设备

 

三、      DNS配置

1、  安装ubuntu的dns server软件

sudo apt-get install –y bind9

2、  修改/etc/bind/下面的dns配置文件

目前我们设备上的dns策略有两种

1)、ADFI设备无需上网,本地解析所有终端设备的dns请求,并将所有结果解析成192.168.1.1,即本机IP。

修改的配置文件:

Name.conf.local

zone "." {

        type master;

        file "/etc/bind/db.adfi";

};

修改根域名服务器为本地,这样就修改了所有的dns解析的解析途径,不去访问公网的根域名服务器,而是直接查询本地的/etc/bind/db.adfi文件

Name.conf.default.zones

//zone "." {

//  type hint;

//  file "/etc/bind/db.root";

//}

注释掉根域名服务器的默认查询文件

db.adfi

$TTL    120;2min

@   IN  SOA team. root.team. (

                  2      ; Serial

             604800     ; Refresh    7days

              86400     ; Retry    1days

            2419200     ; Expire    4*7days

             604800 )   ; Negative Cache TTL    1days

;

@   IN  NS  team.

*   IN  A   192.168.1.1

www IN  A   192.168.1.1

ftp IN  A   192.168.1.1

@   IN  AAAA    ::

这里定义了所有域名都解析为192.168.1.1的规则 

Named.conf.options

options {

    directory "/var/cache/bind";

 

    // If there is a firewall between you and nameservers you want

    // to talk to, you may need to fix the firewall to allow multiple

    // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

 

    // If your ISP provided one or more IP addresses for stable

    // nameservers, you probably want to use them as forwarders. 

    // Uncomment the following block, and insert the addresses replacing

    // the all-0's placeholder.

     forwarders {

        192.168.1.1;

     };

    allow-query{any;};

    auth-nxdomain no;    # conform to RFC1035

    listen-on-v6 { any; };

};

Forwarders定义为192.168.1.1

2)、ADFI设备需要上网,作为本地的dns server,代理终端去解析它们请求的域名,然后解析完毕后返回给局域网内终端相应的结果。具体过程可以参照dns解析的一般流程。

修改的配置文件和上面所述相同,但是因为域名不是本地改写了,所以根域名等服务器要恢复正常配置。

 

四、      3g网卡配置

1、  安装ubuntu常用的3g配置、拨号工具wvdial 以及ubuntu系统自带的3g模块识别数据库

sudo apt-get install -y usb-modeswitch usb-modeswitch-data wvdial

2、  在系统断电的情况下插上3g网卡和sim卡,lsusb可以看到网卡信息

3、  如果是M306网卡,需要再执行sudo usb_modeswitch -v 230d -p 0111 -u 2 其他网卡不需要

4、  Sudo wvdialconf进行网卡拨号配置的设置

5、  尝试拨号 sudo wvdial

6、  如果显示 ttyUSBx resource busy之类的提示,应该是已经有wvdial进程在运行,kill掉即可。

7、  如果显示 init failed 之类的提示,检查是否插上sim卡

8、  其他拨号提示 一般都是信号不好 检查馈线是否插好

 

五、      Squid配置

1、  安装squid

sudo apt-get install –y squid

2、  修改配置文件/etc/squid/squid.conf文件

#####add

acl adfi_network src 192.168.1.0/24

http_access allow adfi_network

#####end of add

http_access allow localhost

 

acl local_page dst 192.168.1.1

acl deny_rep_mime_flashvideo1 rep_mime_type video/x-flv

http_reply_access deny deny_rep_mime_flashvideo1 !local_page

acl deny_rep_mime_flashvideo2 rep_mime_type video/mp4

http_reply_access deny deny_rep_mime_flashvideo2 !local_page

acl deny_rep_mime_flashvideo3 rep_mime_type video/f4v

http_reply_access deny deny_rep_mime_flashvideo3 !local_page

acl deny_rep_mime_flashvideo4 rep_mime_type application/octet-stream

http_reply_access deny deny_rep_mime_flashvideo4 !local_page

acl deny_rep_mime_flashvideo5 rep_mime_type video/x-mp4

http_reply_access deny deny_rep_mime_flashvideo5 !local_page

         这段的主要功能是允许本地访问,阻止访问外网的视频,但是允许访问本地的视频。需要注意的是ADFI上也有视频,在阻止外面视频的同时,要添加判断!local_page ,也就是只要是访问local_page的视频,都不应当阻止。

         还有一条规则,限制下载公网数据的大小为1M,本地页面的数据下载大小不受限制:

reply_body_max_size 1048576 deny !local_page

 

六、      WEB服务配置

基本架构由LAMP + WP + ISOTherm组成。

1.         Linux

Linux使用的是Ubuntu桌面系统。

sudo apt-get install apache2

sudo apt-get install mysql-server

sudo apt-get install php5

sudo apt-get install phpmyadmin

2.         Apache

关键配置文件:
/etc/apache2/site-available/000-default
<VirtualHost *:80>
       ServerAdmin webmaster@localhost

       DocumentRoot /www
       <Directory /www>
               Options FollowSymLinks
               AllowOverride All
               Order deny,allow
               Deny from none
               Allow from all
       </Directory>

       ErrorLog ${APACHE_LOG_DIR}/error.log

       # Possible values include: debug, info, notice, warn, error, crit,
       # alert, emerg.
       LogLevel warn

       CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

3.         MYSQL

关键配置文件:
/etc/mysql/my.cnf
#datadir = /var/lib/mysql
datadir = /www/mysql

/etc/apparmor.d/usr.sbin.mysqld
#/var/lib/mysql/ r,
#/var/lib/mysql/** rwk,
/www/mysql/ r,
/www/mysql/** rwk,

需要注意的是,这两个配置文件中的路径必须是绝对路径,不能采用软链接!

4.         PHP

PHP代码位于/www/media目录下。

常见错误排除:

1.         Web服务无法访问:主要表现为浏览器无法访问http://192.168.1.1/,解决方法如下:

ssh到ADFI。

首先检查/www目录是否存在。

其次检查/www目录的权限是否正确,正确的权限是:

drwxr-xr-x 9 root root  4096 Sep 21 15:34 www

2.         数据库连接错误:主要表现为浏览器可以访问http://192.168.1.1/,但无法访问http://192.168.1.1/media。解决方法如下:

ssh到ADFI。

首先检查mysql服务是否启动:

ps aux | grep mysql

假如没有找到mysql,则证明服务没有成功启动,需要尝试手动启动服务:

/etc/init.d/mysql start

如果启动成功的话,终端有以下类似提示:

mysql start/running, process xxxx

这说明mysql服务没有在系统启动脚本中自动启动,需要检查系统启动脚本。

如果启动错误,则需要检查/www/mysql的权限。

ls /www/,得到的mysql的权限提示应该如下:

drwx------ 7     mysql mysql 4096 Sep 21 22:57 mysql

ls /www/mysql,得到的权限提示应该如下:

drwx------ 2 mysql mysql     4096 Aug 23 19:38 adfi_db

-rw-rw---- 1 mysql mysql        4 Sep 21 22:58 adf.pid

-rw-r--r-- 1 mysql mysql        0 Jun 12 10:28 debian-5.5.flag

-rw-rw---- 1 mysql mysql 35651584 Nov  6 17:54 ibdata1

-rw-rw---- 1 mysql mysql  5242880 Nov  6 17:54 ib_logfile0

-rw-rw---- 1 mysql mysql  5242880 Sep  3 17:03 ib_logfile1

drwx------ 2 mysql root       4096 Aug 23 18:56 mysql

-rw-rw---- 1 root   root          6 Aug 23 18:56 mysql_upgrade_info

drwx------ 2 mysql mysql     4096 Aug 23 18:56 performance_schema

drwx------ 2 mysql mysql      4096 May  9 13:51 phpmyadmin

drwx------ 2 mysql root       4096 May  8 20:48 test

如果权限不正确,请执行下面的命令:

chown mysql /www/mysql

chgrp mysql /www/mysql

chown mysql /www/mysql/adfi_db /www/mysql/adf.pid /www/mysql/debian-5.5.flag /www/mysql/ibdata1 /www/mysql/ib_logfile* /www/mysql/mysql /www/mysql/performance_schema /www/mysql/phpmyadmin /www/mysql/test -R

chgrp mysql /www/mysql/adfi_db /www/mysql/adf.pid /www/mysql/debian-5.5.flag /www/mysql/ibdata1 /www/mysql/ib_logfile* /www/mysql/performance_schema /www/mysql/phpmyadmin -R

chown root /www/mysql/mysql_upgrade_info

chgrp root /www/mysql/mysql /www/mysql/test /www/mysql/mysql_upgrade_info -R

3.         缩略图无法显示,主要表现为影音内容的缩略图无法显示,解决方法如下:

ssh到ADFI。

执行

ls /media/update-content/www/media/wp-content/themes/isotherm_free/ -l

得到的custom目录的权限应该如下:

drwxrwxrwx 5 root root   4096 Jul 14 01:03 custom

执行

ls /media/update-content/www/media/wp-content/themes/isotherm_free/ -l

得到的cache目录的权限应该如下:

drwxrwxrwx 2 root root 4096 Sep 17 00:52 cache

如果不正确,需要修改上述两个目录的权限。

 

七、      3g监测程序

语言:shell、awk等脚本 ppp_check.sh  redial.sh

每10秒ping一次8.8.8.8(谷歌的公开dns服务器),如果ping通,则说明3g通畅,将3g状态写入3g.state文件,通畅时3g.state文件内容是0,然后sleep 10秒后回到循环开头,继续ping。

若ping不通,计数器变量cnt+1,判断cnt的值,如果是6的倍数,说明超过60秒3g信号不通畅,很可能链路已经断开,将3g状态写入3g.state文件,网络不通畅时3g.state文件内容是1,判断redial.run文件中的内容,如果是0,说redial.sh没有在运行,也就是没有进行3g重拨,则将DNS策略改为本地改写,sleep 600秒后,后台运行redial.sh,并写1到redial.run文件,表示redial.sh已经在运行了,防止运行多个redial.sh,重新拨号。如果redial.run的内容是1,说明已经在进行拨号了,在运行redial.sh了,所以不做任何动作。cnt+1后继续循环ping。如果ping不通,cnt继续+1,ping通了,判断cnt的值,如果大于6,说明之前已经因为网络状态不好,把DNS策略改为远程请求,此时网络状态恢复正常,可以把DNS策略改回来了。然后将cnt清零。Sleep 10秒继续ping。

redial.sh是完成重拨的功能,检查3g.state文件内容,是0则说明3g链路质量正常,将redial.run的内容置0并退出;是1说明网络断开,进行重拨。

 

八、      流量统计程序

改程序语言为shell awk,功能为每五分钟统计一次用户流量,无流量的用户,踢下线。所谓的踢下线, 就是将iptables规则改为DNAT到192.168.1.1:80

脚本:acc_loop.sh  accounting1.sh  accounting2.sh

1、  读取所有在线用户的当前流量数,以包个数为单位,结果写入iptables.res文件

2、  如果iptables.res文件内容为空,说明无人在线,sleep 600秒后回到第一步

3、  如果iptables.re内容非空,说明有用户在线,执行accouting1.sh提取iptables.res内容到acc.res文件中,格式为IP  包个数

4、  Sleep 300秒 即五分钟 之后 读取所有当前在线用户流量信息,结果写入iptables.res(覆盖)文件

5、  执行accounting2.sh脚本,这个脚本的主要作用就是对比acc.res和iptables.res中内容,将五分钟里流量无变化的用户IP写入noflow.res文件。而五分钟内流量有增加(包括新出现的上网用户)的用户不做处理

6、  处理noflow.res文件,读出这些没有流量的IP,将它们的iptables规则修改成无上网权限,只能浏览本地内容的形式。

7、  回到第一步

 

九、      Iptables规则解释

iptables -t nat -A PREROUTING -p tcp -i ra0 -s $innet -j DNAT --to 192.168.1.1:80

$innet是目标IP,将对这个IP使用如上规则,这条规则的意思是,从ra0网络接口进入的包中,源IP是$innet的所有tcp协议的包,都重定向到192.168.1.1的80端口的服务程序中去。在我们的设备上,这个效果就是,内网的用户在浏览器里输入任何域名,只要域名能被顺利解释成IP,用户的访问就将被重定向到我们设备的ADFI页面。有点类似校园网关,没有上外网权限的时候,不论用户输入什么,都是定向到校园网认证页面。

iptables -t nat -A PREROUTING -p tcp -i ra0 -s $innet --dport 80  -j DNAT --to 192.168.1.1:3128

这条语句是在用户有上网权限的时候使用的

表示的是所有从ra0接口进入的、tcp协议并且目标端口为80的、源IP是$innet的包都转发给192.168.1.1的3128端口的服务程序。

在我们设备上的效果就是,当用户有上网权限时,就删除之前的转发到192.168.1.1:80的规则,转而使用这条规则,使用户所有的包都转发给squid(squid的监听端口是3128)。

iptables -t nat -A PREROUTING -m multiport -p udp -i ra0 -s $innet --dport 8000:8009  -j DNAT --to 192.168.1.1:3128

这条规则也是在用户有上网权限的时候用,适用的是源IP为$innet,目标端口是8000至8009,协议是udp的包,经过IP伪装(NAT)后,可直接在internet上传播。这条规则的作用是在用户有上网权限时,开放一些客户端的上网权限,比如QQ、微信等,有时候用到udp协议并且不是使用80端口,squid无法代理这些请求上网,所以直接采用masqurade进行NAT,这样有上网权限用户不仅可以浏览网页,也可以使用IM等客户端。

相关内容