现在,事情不同了,你可以将这个唯一的IP地址配置在你的工作机上的同时,也可以让所有的其它设备使用。
步骤:现在假设你的BOX有三个网口,分别是两个以太口:eth0,eth1以及一个WIFI口:wlan0,下面是一系列的操作:
你拥有的唯一IP及其配套配置:
地址:192.168.10.79/24
网关:192.168.10.1
1.桥接所有这些口
brctl addbf br0
brctl addif br0 eth0
brctl addif br0 eth1
brctl addif br0 wlan0
2.为br0配置一个IP地址供WIFI使用(省略DHCP POOL以及DNS的配置过程)
接入设备数量限制一下:
ifconfig br0 172.20.1.1/28
3.可选1:为br0增加一个Secondary IP以便成功增加默认路由
ifconfig br0:0 192.168.10.255/23
注意,以上的prefix 23值得说明一下,原始的子网的掩码是255.255.255.0,现将prefix减少1位,此时你就可以使用原始网络中的broadcast地址作为一个IP地址了,这个地址不会和任何地址冲突。
route add default gw 192.168.10.1
4.可选2:使用force-onlink路由直接强制增加路由
ip route add 0.0.0.0/0 via 192.168.10.1 dev br0 onlink
5.增加地址转换规则,凡是WIFI包的源地址都转换成你唯一的那个IP地址
iptables -t mangle -A PREROUTING -m physdev --physdev-in wlan0 -j MARK --set-mark 100
iptables -t nat -A POSTROUTING -m mark --mark 100 -j SNAT --to-source 192.168.10.79
6.可选2的情况下增加arp
由于使用了force-onlink路由,意味着你的BOX上没有和192.168.10.0/24处于同网段的IP地址,那么当往192.168.10.1这个默认网关发包的时候,ARP请求将可能得不到回复,这涉及到默认网关的arp_filter或者等价配置的配置情况,因为arp请求的源是唯一的172.20.1.1这个地址,请求的是地址和它不在一个网段!
因此需要一条arptables规则:
arptables -t mangle -A OUTPUT -d 192.168.10.1 -j mangle --mangle-ip-s 192.168.10.79
事实上在可选1的情况下,你配置了一个192.168.10.255这个地址,对于原始网段来讲,它是一个广播,但是对于BOX来讲,它是一个常规IP,因此ARP请求可以发出,封装的源就是192.168.10.255,也可以正常回来,因为请求中的源是192.168.10.255,到达默认网关192.168.10.1后,与其掩码255.255.255.0相与得到192.168.10.0/24,显然属于同一个网段,检查通过,REPLY返回!
效果:整个BOX对于你的工作机就是一个HUB,它的工作毫不受到影响!另外BOX上的WIFI独自引出了一个子网,可以让多个设备接入,当这些设备发出的数据包外出时,BOX会将其源IP地址转换为你那唯一的IP地址,ip_conntrack机制可以保证所有的这些设备相关的流的五元组不会重复。
近几年,国内开源越闹越火,不仅软件开源,硬件也开源。去开源中国看看,已经有专门的硬件开源专区,61ic代码工厂提供了许多的硬件(ARM、DSP等)相关的代码。在这种趋势下,从头开始写一个软件或算法已经是上个世纪的事了,我们多多少少会从开源代码中借鉴点经验,甚至好的算法或中间件都会直接拿来用,当然,工程需要付费的就需要掏money了,不过提供开源免费代码的网站却还真不少,最有名的有sourceforge,github。我常常从github上下载别人的代码,尽管github中的代码良莠不齐,但长尾理论的告诉我们:除了Linux这种牛逼排名靠前的优秀源代码外,那些star较低的Repositories中也有许多好的可供我们学习甚至可以直接在工程中使用的代码,但需要我们去发现。
哎哟,扯远了,回到正题……因为我们现在有太多可用的代码,我们不用从头编写,而要做的大部分工作都是移植(更专业点的叫重构),这里将持续地将自己移植工程(主要是C/C++工程)中遇到的问题及解决过程记录下来,“掘地三尺非一日之功”,这是一个积累的过程。
1. 出现大量的 link error #10056: symbol "_fann_set_scaling_params" redefined
【情况】
在链接一个神经网络的C语言库fann时,出现大量的类似上面redefined错误,错误原因很明显,“_fann_set_scaling_params重复定义”,而我在工程里找遍了,发先确实都只在一处有定义。
【解释】
_fann_set_scaling_params是编译后.obj文件中的标识符号(symbol,一般这些符号开头带下划线),以上错误出现在链接的时候,这说明多个.obj文件中出现了_fann_set_scaling_params的定义。我们知道,C编译器是根据.c文件编译的(即一个.c文件生成一个.obj,c编译器不会主动去编译头文件)。而fann库有所不同,其中一个floatfann.c文件中有这样几行代码:
#include "fann.c" #include "fann_io.c" #include "fann_train.c" #include "fann_train_data.c" #include "fann_error.c" #include "fann_cascade.c"你没看错,c语言中也是可以包含.c文件的,包含的.c文件会当做共成文件也编译成.obj文件。这就明白了,我将上面包含的几个.c文件添加到了工程里面,而这里又包含了这几个.c文件,同一个.c文件编译了两次,当然会出现重复定义了。
【解决办法】
第一种方法,将上面使用include包含的.c文件从工程中移除,第二种方法,将上面的#include "**.c"注释掉,相应的源文件添加到工程中。
注:这是第一个问题,记得之前遇到过很多次类似的问题,每次都迷迷糊糊的弄了好久才解决,甚至程序编译通过后还迷迷糊糊不知道怎么就跑通了,真后悔没早作记录。这次在往DSP上移植fann时又遇到这个问题,谨记。
2. fatal error #5: could not open source file "fann.h"
【解释】
相对于上面的编译错误,这是链接错误,意思是说fann.h头文件打不开,要么压根就没有这个头文件(检查下头文件名有没有错误),要么就是头文件路径设置不对(编译器找到不头文件)。
【解决方法】
在确定有这个头文件的情况下,eclipse C/C++中解决问题的方法是,工程右键->Properities->Build->Compiler->Include Options,在-I选项中添加头文件所在目录。关于这一点,用过Linux下gcc编译器的就会对头文件搜索路径,库搜索路径这些内容特别敏感,因此,这里强烈推荐做软件(尤其是C/C++软件)的要学会gcc的使用,这对学会构建工程非常有用。
待增加中……
1、 检查存储资源是否被系统识别。
重新扫描设备
# cfgmgr –v
查看磁盘:(这里的hdisk可能是本地磁盘或者存储)
# lsdev –Cc disk
hdisk0 Available 01-08-00 SAS Disk Drive
hdisk1 Available 01-08-00 SAS Disk Drive
hdisk2 Available Other iSCSI Disk Drive
检查PV信息。
# lspv
hdisk0 00cb45e5678b2a2b rootvg active
hdisk1 00cb45e500864dcc None
hdisk2 None None
创建PV使设备能被系统使用给hdisk2分配一个PVID使 hdisk2可用
# chdev –l hdisk2 –a pv=yes
# lspv
hdisk0 00cb45e5678b2a2b rootvg active
hdisk1 00cb45e500864dcc None
hdisk2 00cb45e5115f3a33 None
其他相关命令
# lspv hdisk2 物理卷详细信息
# lspv -l hdisk2 物理卷上分配的逻辑卷信息
# lspv -p hdisk2 物理卷上物理分区分布的情况
# rmdev -l hdisk2 -d 从ODM库中彻底删除hdisk0
# extendvg rootvg hdisk1 向卷组中加一个物理卷
# migratepv -l lv01 hdisk0 hdisk1 把属于lv01的pp从hdisk0移动到hdisk1
创建VG并使用上PV
创建VG 使用hdisk2
# mkvg –y mqvg –d 6 –s 8 hdisk2
mqvg为VG名,-d 6 表示最多包含6个物理卷, -s 8 pp为8m , 包含物理卷为hdisk2。
# lspv
hdisk0 00cb45e5678b2a2b rootvg active
hdisk1 00cb45e500864dcc None
hdisk2 00cb45e5115f3a33 mqvg active
其他相关命令
# lsvg -l vgname 查看vg中包含的lv
# lsvg -p vgname 查看vg中包含的pv
# chvg -ay vgname 系统启动时自动激活vg
# chvg -an vgname 系统启动时不激活vg
# extendvg vgname hdisk9 向卷组中加一个物理卷
# reducevg datavg disk2 vg中删除一个物理卷,之前必须用rmlv删除该物理卷上的所有lv
如:
# mklv -y wolflv -t jsf rootvg 10
wolflv
# lsvg -l rootvg
rootvg:
LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT
hd5 boot 1 2 2 closed/syncd N/A
hd6 paging 12 24 2 open/syncd N/A
hd8 jfs2log 1 2 2 open/syncd N/A
hd4 jfs2 45 90 2 open/syncd /
hd2 jfs2 7 14 2 open/syncd /usr
hd9var jfs2 1 2 2 open/syncd /var
hd3 jfs2 20 40 2 open/syncd /tmp
hd1 jfs2 1 2 2 open/syncd /home
hd10opt jfs2 1 2 2 open/syncd /opt
hd11admin jfs2 1 2 2 open/syncd /admin
dzytest jfs 2 4 2 open/syncd /dzytest
loglv00 jfslog 1 2 2 &n