在嵌入式设备上实现IPv6网络的接入

ARM 108浏览

注:转载自http://www.newmaker.com/art_11341.html

摘要:阐述如何在基于ARM的嵌入式设备上移植支持IPv6协议栈的Linux操作系统;重新编译Linux的网络相关工具程序,使之能在移植的操作系统上运行;通过隧道方式,将嵌入式设备接入IPv6网络。

关键词:ARM XScale Linux 交叉编译 IPv6

引 言

向下一代互联网过渡的进程已经开始。IPv6作为下一代互联网的核心协议,能够提供几乎无限的地址空间,从根本上克服了IPv4中地址空间不足的问题,也为在不远的将来把数量众多的嵌入式设备接入网络创造了条件。Linux的内核从2.4版就已经开始支持IPv6,同时,Linux作为开源的操作系统,也便于向不同的硬件平台移植。由于现有的网络基础设施运行的大都是IPv4协议栈,选择隧道方式接入IPv6网络,是一种充分利用现有设备的过渡手段。基于以上原因,本文选用支持IPv6的Linux内核,通过隧道方式把基于ARM的嵌入式设备接入IPv6网络。

1 编译支持IPv6的Linux内核

本文所用的硬件环境是Xscale的Sitsang开发板。要向ARM核的CPU移植Linux,首先要准备交叉编译环境,包括armlinuxgcc、armlinuxld、armlinuxas,以便在PC机上编译可运行于ARM核CPU的目标代码。实验选用的Linux内核源码包是linux2.4.19.tar.bz2,另外还有一个针对Sitsang 板的内核补丁(包括驱动程序)patch2.4.19sitsang2.gz。以下是编译支持IPv6的Linux内核的过程。

(1) 解开源码包并打专用补丁

#tar jvxf linux-2.4.19.tar.bz2
#ln -s linux-2.4.19 linux
#gzip -dc patch-2.4.19-sitsang2.gz | patch -p0

上述第2行命令建立符号链接,是为了第3行命令对Linux的标准内核进行打补丁的操作。

(2) 配置编译选项

现在得到的Linux内核版本是支持IPv6的,但是支持IPv6的模块默认并不是编译入内核的。在make menuconfig的时候,注意把Network Options下有关IPv6和隧道(tunnel)的模块选为内核模式,以便得到所需要的内核文件。其他选项不需要更改。

(3) 编译内核

#make dep
#make zImage
#make modules

以上命令分别表示建立内核中各模块的依赖关系,编译内核,编译驱动模块。编译无误,就在../linux/arch/arm/boot/目录下得到了所需的Linux内核文件zImage。

已经有了支持IPv6的内核,接下来的工作是把启动程序和内核文件外加一个精简的文件系统烧录到开发板上去,开发板就可以启动了。关于如何烧录启动程序、内核和文件系统并不是本文的主要内容,可参看其他嵌入式系统开发的资料。

2 重新编译工具程序

配置和测试网络环境需要ifconfig、ping、traceroute等工具程序。上面的精简文件系统并没有包括以上工具程序支持IPv6的版本,如ping6、traceroute6等,因此需要重新编译包含这些工具程序的源码包nettools和netutils。注意选用版本较新的源码包,以确保其支持IPv6。将源码包解开后,修改其Makefile文件,使之使用交叉编译工具链编译和链接,生成所需的目标代码。将编译生成的在ARM核的CPU上可执行的文件ifconfig、ping6和traceroute6拷贝到嵌入式设备文件系统的相应位置,以备下面的配置和测试时使用。

3 配置隧道将嵌入式设备接入IPv6网络

首先到以下地址申请一段IPv6的地址:http://knight.6test.edu.cn/tb/html/。在页面中点击“Register”,填写用户名、Email和所需的Subnet Prefix Length(64/128),提交之后就得到了一段IPv6地址。要开始使用这段申请到的地址,还得点击页面中的“Activate the tunnel”链接加以激活。假设申请到的地址是3ffe:321f:0:775::/64,Tunnel Broker Server的地址是202.38.99.9,下面就开始配置隧道。

由于上面申请到的地址需要激活才能使用,而对于一些没有图形界面的嵌入式设备通过Web方式激活不方便;另外,由于与Tunnel Broker Server直接隧道连接需要一个独立的IPv4地址,而申请到的地址总量巨大(64位地址总量达2的64次方),为避免浪费,本文采取了用一台PC机与Tunnel Broker Server连接充当IPv6网关,而包括Sitsang开发板在内的其他设备通过网关接入的办法。

实验中,作为网关的PC机运行的是RedHat Linux 9,有两块网卡,IPv4地址分别是166.111.249.184(eth0)和192.168.1.184(eth1),Sitsang开发板有一个以太网口,IPv4地址是192.168.2.231(eth0),默认网关是192.168.2.184。IPv4的路由已设置好,即Sitsang开发板已经能ping通外部的IPv4网络。

(1) 建立网关与Tunnel Broker Server的隧道

在网关PC机上执行以下命令:
#insmod ipv6
#iptunnel add sit1 mode sit remote 202.38.99.9 local 166.111.249.184
#ifconfig sit1 up
#ifconfig sit1 inet6 add 3ffe:321f:0:775::1/128
#route -A inet6 add 2000::/3 sit1
#echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

以上命令分别表示:

◆ 手动装入IPv6模块。RedHat 9的2.4.20内核默认并没有把IPv6模块装入内核;
◆ 建立与Tunnel Broker Server的隧道sit1;
◆ 激活sit1;
◆ 为sit1添加IPv6地址;
◆ 添加通过sit1的路由项;
◆ 设置所有网络接口都可以转发数据包。

以Web方式激活后,可以用ping6测试www.ipv6.org或www.6bone.net,确认连通性。

(2) 激活网关与嵌入式设备的自动隧道

分别在网关PC机和Sitsang开发板上执行以下命令,激活自动隧道:

#ifconfig sit0 up

sit0是一个自动隧道,激活之后就会添加相应的IPv4兼容的IPv6地址。其格式为::x.x.x.x(x.x.x.x是IPv4地址)。具体来说,网关PC机的sit0将会自动添加::166.111.249.184/96,::127.0.0.1/96,::192.168.2.184/96三个兼容地址;而Sitsang开发板上的sit0将会自动添加::127.0.0.1/96,::192.168.2.231/96两个兼容地址。

现在可以分别在网关PC机和Sitsang开发板上用ping6测试::166.111.249.184和::192.168.2.231,以确认自动隧道工作正常。

(3) 配置IPv6路由项

为嵌入式设备和网关PC机添加全局IPv6地址,并配置静态路由。在Sitsang开发板上:

#ifconfig inet6 sit0 add 3ffe:321f:0:775::192.168.2.231/128
#route -A inet6 ::/0 gw ::192.168.2.184

在网关PC机上:

# ifconfig inet6 sit1 add 3ffe:321f:0:775::192.168.2.184/128
#route -A inet6 3ffe:321f:0:775::192.168.2.231/128 gw ::192.168.2.231

至此,Sitsang开发板已经有了一个全局IPv6地址(ffe:321f:0:775::192.168.2.231/128),并且能够通过网关访问外部IPv6网络了。同样,可以在Sitsang开发板上用ping6测试www.ipv6.org或www.6bone.net确认。

结语

本文介绍了如何在采用XScale的Sitsang开发板的硬件环境下,使用交叉编译工具链移植支持IPv6的Linux操作系统;着重介绍了如何采用隧道方式,通过网关把嵌入式设备接入IPv6网络的方法。本文介绍的方法均已在硬件设备上实际调试通过。其基本方法适用于移植了Linux操作系统的各种嵌入式设备。

参考文献
1 [美] Joseph Davies. 理解IPv6. 张晓彤,晏国晟,曾庆峰译. 北京: 清华大学出版社,2004
2 [美]Pete Loshin. IPv6详解. 沙斐,程莉,周立等译. 北京: 机械工业出版社,2000
3 http://knight.6test.edu.cn/conf.html(end)