2009年4月16日星期四

用LVS构架负载均衡Linux集群系统


Redhat Linux ES 5.0下面安装:
1. 因为2.6内核已经集成IPVS内核补订了,所以不再需要重新编译内核.
2. 下载ipvsadm-1.24-6.src.rpm放到某个目录
3. root用户执行 ln -s /usr/src/kernels/2.6.18-53.el5-xen-i686 /usr/src/linux,把内核连接到/usr/src/linux目录
4. rpm -iph ipvsadm-1.24-6.src.rpm,解压安装ipvs代码包
5. 修改/usr/src/redhat/SPECS下面的ipvsadm.spec文件,把这一行Copyright: GNU General Public Licence 替换成 License: GNU General Public Licence
6. 执行 rpmbuild -ba /usr/src/redhat/SPECS/ipvsadm.spec,等待build完成
7. 最后执行rpm -ivh /usr/src/redhat/RPMS/i386/ipvsadm-1.24-6.i386.rpm 安装刚刚编译的包
8. 执行ipvsadm检查是否安装成功。

DR直连方式实例:
Director物理地址: 192.168.145.128
RealServer1物理地址: 192.168.145.129
RealServer2物理地址: 192.168.145.130
虚拟地址:192.168.145.132,端口都是80,httpd服务。
只要在三个服务器上运行相应的脚本,就可以实现LVS服务:
Director:
[root@localhost LVS]# cat lvs_dr.sh
#/bin/bash
# set ip_forward OFF for vs-dr director (1 on, 0 off)
echo 0 > /proc/sys/net/ipv4/ip_forward
ifconfig  eth0:0 192.168.145.132 netmask 255.255.255.255 broadcast 192.168.145.132 up
/sbin/route add -host 192.168.145.132 dev eth0:0
ipvsadm -C
ipvsadm -A -t 192.168.145.132:80 -s rr
# Set Real Server
ipvsadm -a -t 192.168.145.132:80 -r 192.168.145.129:80 -g
ipvsadm -a -t 192.168.145.132:80 -r 192.168.145.130:80 -g
ipvsadm

Real Server后台服务器:
[root@localhost LVS]# cat realserver
#!/bin/sh
VIP=192.168.145.132
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p













下面看看lvs控制台的基本命令


添加一个Service



  1. # ipvsadm -A -t 192.168.8.100:80 -s rr      
  2. rr:表示轮询的方法,缺省为wcl  


添加一个realserver



  1. # ipvsadm -a -t 192.168.8.100:80 -r 192.168.8.180:80 -g    
  2. -a:添加一个realserver   
  3. -r:realserver的地址   
  4. -g:缺省参数   


修改realserver



  1. # ipvsadm -e -t 192.168.8.100:80 -r 192.168.8.180:80 -w 100   
  2. -e:修改-r参数的realserver   
  3. -w:lvs转发通道的处理能力 














 用LVS构架负载均衡Linux集群系统


最近有客户需要一个负载均衡方
案,笔者对各种软硬件的负载均衡方案进行了调查和比较,从IBM sServer Cluster、Sun Cluster
PlatForm等硬件集群,到中软、红旗、TurboLinux的软件集群,发现无论采用哪个厂商的负载均衡产品其价格都是该客户目前所不能接受的。于
是笔者想到了开放源项目Linux Virtual Server(简称LVS)。经过对LVS的研究和实验,终于在Red Hat
9.0上用LVS成功地构架了一组负载均衡的集群系统。整个实现过程整理收录如下,供读者参考。

选用的LVS实际上是一种Linux操作系统上基于IP层的负载均衡调度技术,它
在操作系统核心层上,将来自IP层的TCP/UDP请求均衡地转移到不同的服务器,从而将一组服务器构成一个高性能、高可用的虚拟服务器。使用三台机器就
可以用LVS实现最简单的集群,如图1所示。

图1显示一台名为Director的机器在集群前端做负载分配工作;后端两台机器
称之为Real
Server,专门负责处理Director分配来的外界请求。该集群的核心是前端的Director机器,LVS就是安装在这台机器上,它必须安装
Linux。Real Server则要根据其选用的负载分配方式而定,通常Real
Server上的设置比较少。接下来介绍Director机器上LVS的安装过程。


图1 LVS实现集群系统结构简图


安装

LVS的安装主要是在Director机器上进行,Real Server只需针对不同的转发方式做简单的设定即可。特别是对LVS的NAT方式,Real Server惟一要做的就是设一下缺省的网关。所以构架集群的第一步从安装Director机器开始。

首先要在Director机器上安装一个Linux操作系统。虽然早期的一些Red
Hat版本,如6.2、7.2、8.0等自带Red
Hat自己的集群软件,或者是在内核中已经支持LVS,但是为了更清楚地了解LVS的机制,笔者还是选择自行将LVS编入Linux内核的方式进行安
装,Linux版本采用Red Hat 9.0。

如果用户对Red Hat的安装比较了解,可以选择定制安装,并只安装必要的软件包。安装中请选择GRUB做为启动引导管理软件。因为GRUB在系统引导方面的功能远比LILO强大,在编译Linux内核时可以体会它的方便之处。

LVS是在Linux内核中实现的,所以要对原有的Linux内核打上支持LVS的
内核补丁,然后重新编译内核。支持LVS的内核补丁可以从LVS的官方网站http://www.linuxvirtualserver.org下载,下
载时请注意使用的Linux核心版本,必须下载和使用的Linux内核版本相一致的LVS内核补丁才行。对于Red Hat
9.0,其Linux内核版本是2.4.20,所以对应内核补丁应该是http://www.linuxvirtualserver.org
/software/kernel-2.4/linux-2.4.20-ipvs-1.0.9.patch.gz。笔者经过多次实验,使用Red
Hat
9.0自带的Linux源代码无法成功编译LVS的相关模组。由于时间关系笔者没有仔细研究,而是另外从kernel.org上下载了一个tar包格式的
2.4.20内核来进行安装,顺利完成所有编译。下面是整个内核的编译过程:

1.删除Red Hat自带的Linux源代码







# cd /usr/src
# rm -rf linux*



2.下载2.4.20内核







# cd /usr/src
# wget ftp://ftp.kernel.org/pub/linux/kernel/v2.4/linux-2.4.20.tar.bz2



3.解压到当前目录/usr/src







# cd /usr/src
# tar -xjpvf linux-2.4.20.tar.bz2



4.建立链接文件







# cd /usr/src
# ln -s linux-2.4.20 linux-2.4
# ln -s linux-2.4.20 linux



5.打上LVS的内核补丁







# cd /usr/src
# wget http://www.linuxvirtualserver.org/software/kernel-2.4/linux-2.4.20-ipvs-1.0.9.patch.gz
# gzip -cd linux-2.4.20-ipvs-1.0.9.patch.gz
# cd /usr/src/linux
# patch -p1 < ../linux-2.4.20-ipvs-1.0.9.patch



在打补丁时,注意命令执行后的信息,不能有任何错误信息,否则核心或模组很可能无法成功编译。

6.打上修正ARP问题的内核补丁







# cd /usr/src
# wget http://www.ssi.bg/~ja/hidden-2.4.20pre10-1.diff
# cd /usr/src/linux
# patch -p1 < ../hidden-2.4.20pre10-1.diff



这一步在Director机器上可以不做,但是在使用LVS/TUN和LVS/DR方式的Real Server上必须做。

7.为新核心命名

打开/usr/src/linux/Makefile。注意,在开始部分有一个变量
EXTRAVERSION可以自行定义。修改这个变量,比如改成“EXTRAVERSION=-LVS”后,编译出的核心版本号就会显示成2.4.20-
LVS。这样给出有含义的名称将有助于管理多个Linux核心。

8.检查源代码







# make mrproper



这一步是为确保源代码目录下没有不正确的.o文件及文件的互相依赖。因为是新下载的内核,所以在第一次编译时,这一步实际可以省略。

9.配置核心选项







# make menuconfig



命令执行后会进入一个图形化的配置界面,可以通过这个友好的图形界面对内核进行定
制。此过程中,要注意对硬件驱动的选择。Linux支持丰富的硬件,但对于服务器而言,用不到的硬件驱动都可以删除。另外,像Multimedia
devices、Sound、Bluetooth support、Amateur Radio support等项也可以删除。

注意,以下几项配置对LVS非常重要,请确保作出正确的选择:

(1)Code maturity level options项

对此项只有以下一个子选项,请选中为*,即编译到内核中去。







[*]Prompt for development and/or incomplete code/drivers



(2)Networking options项

对此项的选择可以参考以下的配置,如果不清楚含义可以查看帮助:







<*> Packet socket
[ ] Packet socket: mmapped IO
< > Netlink device emulation
[*] Network packet filtering (replaces ipchains)
[ ] Network packet filtering debugging
[*] Socket Filtering
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: multicasting
[*] IP: advanced router
[*] IP: policy routing
[ ] IP: use netfilter MARK value as routing key
[ ] IP: fast network address translation
<M> IP: tunneling
[*] IP: broadcast GRE over IP
[ ] IP: multicast routing
[ ] IP: ARP daemon support (EXPERIMENTAL)
[ ] IP: TCP Explicit Congestion Notification support
[ ] IP: TCP syncookie support (disabled per default)
IP: Netfilter Configuration --->
IP: Virtual Server Configuration --->



(3)Networking options项中的IP: Virtual Server Configuration项

如果打好了LVS的内核补丁,就会出现此选项。进入Virtual Server Configuration选项,有以下子选项:







<M> virtual server support (EXPERIMENTAL)      
[*] IP virtual server debugging
(12) IPVS connection table size (the Nth power of 2)
--- IPVS scheduler
<M> round-robin scheduling
<M> weighted round-robin scheduling
<M> least-connection scheduling scheduling
<M> weighted least-connection scheduling
<M> locality-based least-connection scheduling
<M> locality-based least-connection with replication scheduling
<M> destination hashing scheduling
<M> source hashing scheduling
<M> shortest expected delay scheduling
<M> never queue scheduling
--- IPVS application helper
<M> FTP protocol helper



以上所有项建议全部选择。

(4)Networking options项中的IP: Netfilter Configuration项

对于2.4版本以上的Linux
Kernel来说,iptables是取代早期ipfwadm和ipchains的更好选择,所以除非有特殊情况需要用到对ipchains和
ipfwadm的支持,否则就不要选它。本文在LVS/NAT方式中,使用的就是iptables,故这里不选择对ipchains和ipfwadm的支
持:





< > ipchains (2.2-style) support                
< > ipfwadm (2.0-style) support



10. 编译内核

(1)检查依赖关系







# make dep



确保关键文件在正确的路径上。

(2)清除中间文件







# make clean



确保所有文件都处于最新的版本状态下。

(3)编译新核心







# make bzImage



(4)编译模组







# make modules



编译选择的模组。

(5)安装模组







# make modules_install
# depmod -a



生成模组间的依赖关系,以便modprobe定位。

(6)使用新模组







# cp System.map  /boot/System.map-2.4.20-LVS
# rm /boot/System.map
# ln -s /boot/System.map-2.4.20-LVS /boot/System.map
# cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.20-LVS
# rm /boot/vmlinuz
# ln -s /boot/vmlinuz-2.4.20-LVS /boot/vmlinuz
# new-kernel-pkg --install --mkinitrd --depmod 2.4.20-LVS



(7)修改GRUB,以新的核心启动

执行完new-kernel-pkg命令后,GRUB的设置文件/etc/grub.conf中已经增加了新核心的启动项,这正是开始安装Linux时推荐使用GRUB做引导程序的原因。







grub.conf中新增内容如下:
title Red Hat Linux (2.4.20-LVS)
root (hd0,0)
kernel /boot/vmlinuz-2.4.20LVS ro root=LABEL=/
initrd /boot/initrd-2.4.20LVS.img



将Kernel项中的root=LABEL=/改成 root=/dev/sda1 (这里的/dev/sda1是笔者Linux的根分区,读者可根据自己的情况进行不同设置)。

保存修改后,重新启动系统:







# reboot



系统启动后,在GRUB的界面上会出现Red Hat
Linux(2.4.20-LVS)项。这就是刚才编译的支持LVS的新核心,选择此项启动,看看启动过程是否有错误发生。如果正常启动,ipvs将作为
模块加载。同时应该注意到,用LVS的内核启动后在/proc目录中新增了一些文件,比如/proc/sys/net/ipv4/vs/*。

11.安装IP虚拟服务器软件ipvsadm

用支持LVS的内核启动后,即可安装IP虚拟服务器软件ipvsadm了。用户可以
用tar包或RPM包安装,tar包可以从以下地址http://www.linuxvirtualserver.org/software
/kernel-2.4/ipvsadm-1.21.tar.gz下载进行安装。

这里采用源RPM包来进行安装:







# wget http://www.linuxvirtualserver.org/software/kernel-2.4/ipvsadm-1.21-7.src.rpm
# rpmbuild --rebuild ipvsadm-1.21-7.src.rpm
# rpm -ivh /usr/src/redhat/RPMS/i386/ipvsadm-1.21-7.i386.rpm



注意高版本的rpm命令去掉了--rebuild这个参数选项,但提供了一个rpmbuild命令来实现它。这一点和以前在Red Hat 6.2中以rpm—rebuild XXX.src.rpm来安装源RPM包的习惯做法有所不同。

安装完,执行ipvsadm命令,应该有类似如下的信息出现:







# ipvsadm
IP Virtual Server version 1.0.9 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn



出现类似以上信息,表明支持LVS的内核和配置工具ipvsadm已完全安装,这台Director机器已经初步安装完成,已具备构架各种方式的集群的条件。

原理

接下来的工作是根据实际需求选择采用何种负载分配方式和调度算法。目前LVS主要有
三种请求转发方式和八种调度算法。根据请求转发方式的不同,所构架集群的网络拓扑、安装方式、性能表现也各不相同。用LVS主要可以架构三种形式的集群,
分别是LVS/NAT、LVS/TUN和LVS/DR,可以根据需要选择其中一种。在选定转发方式的情况下,采用哪种调度算法将决定整个负载均衡的性能表
现,不同的算法适用于不同的应用场合,有时可能需要针对特殊场合,自行设计调度算法。LVS的算法是逐渐丰富起来的,最初LVS只提供4种调度算法,后来
发展到以下八种:

1.轮叫调度(Round Robin)

调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

2.加权轮叫(Weighted Round Robin)

调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器能处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

3.最少链接(Least Connections)

调度器通过“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。

4.加权最少链接(Weighted Least Connections)

在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

5.基于局部性的最少链接(Locality-Based Least Connections)

“基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于
Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器
不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。

6.带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)

“带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要
用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务
器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发
送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组
有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

7.目标地址散列(Destination Hashing)

“目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

8.源地址散列(Source Hashing)

“源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

了解这些算法原理能够在特定的应用场合选择最适合的调度算法,从而尽可能地保持Real Server的最佳利用性。当然也可以自行开发算法,不过这已超出本文范围,请参考有关算法原理的资料。



实例

理解了上述关于请求转发方式和调度算法的基本概念后,就可以运用LVS来具体实现几
种不同方式的负载均衡的集群系统。LVS的配置是通过前面所安装的IP虚拟服务器软件ipvsadm来实现的。ipvsadm与LVS的关系类似于
iptables和NetFilter的关系,前者只是一个建立和修改规则的工具,这些命令的作用在系统重新启动后就消失了,所以应该将这些命令写到一个
脚本里,然后让它在系统启动后自动执行。网上有不少配置LVS的工具,有的甚至可以自动生成脚本。但是自己手工编写有助于更深入地了解,所以本文的安装没
有利用其它第三方提供的脚本,而是纯粹使用ipvsadm命令来配置。

下面就介绍一下如何配置LVS/NAT、LVS/TUN、LVS/DR方式的负载均衡集群。

1.设定LVS/NAT方式的负载均衡集群

NAT是指Network Address
Translation,它的转发流程是:Director机器收到外界请求,改写数据包的目标地址,按相应的调度算法将其发送到相应Real
Server上,Real
Server处理完该请求后,将结果数据包返回到其默认网关,即Director机器上,Director机器再改写数据包的源地址,最后将其返回给外
界。这样就完成一次负载调度。

构架一个最简单的LVS/NAT方式的负载均衡集群如图2所示。


图2 LVS/NAT方式的集群简图


Real
Server可以是任何的操作系统,而且无需做任何特殊的设定,惟一要做的就是将其默认网关指向Director机器。Real
Server可以使用局域网的内部IP(192.168.0.0/24)。Director要有两块网卡,一块网卡绑定一个外部IP地址
(10.0.0.1),另一块网卡绑定局域网的内部IP(192.168.0.254),作为Real Server的默认网关。

这里将所有LVS的配置命令写到一个可执行脚本中,脚本如下:







#!/bin/bash
# Open IP Forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# To make the load balancer forward the masquerading packets
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -d 0.0.0.0/0 -o eth0 -j MASQUERADE
ipvsadm -C
# Choose the Weighted Round Robing
ipvsadm -A -t 10.0.0.1:80 -s wrr
# Set Real Server
ipvsadm -a -t 10.0.0.1:80 -r 192.168.0.1:873 -m -w 2
ipvsadm -a -t 10.0.0.1:80 -r 192.168.0.2:873 -m -w 3
ipvsadm



将该脚本保存为/root/lvs_nat.sh,然后加上可执行属性,执行它:







# chmod a+x /root/lvs_nat.sh
# /root/lvs_nat.sh



运行该脚本后,一个简单的LVS/NAT方式的负载均衡集群已经成功架设。模拟多个用户从外界访问10.0.0.1的80端口,用ipvsadm可以观看到以下信息:







# ipvsadm
IP Virtual Server version 1.0.9 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.1:http wrr
-> 192.168.0.1:http Masq 3 2 0
-> 192.168.0.2:http Masq 2 1 0



其中ActiveConn表示对应的Real Server当前有多少个正在活动的连接,InActConn表示不活动的连接数。从这里我们可以看到有3个HTTP请求,被分别分配在不同的Real Server上,表明这个负载均衡集群正在成功运行中。

本例完成了这样一个简单的LVS/NAT集群,由此可以看出,LVS/NAT方式实
现起来最为简单,而且Real Server使用的是内部IP,可以节省Real
IP的开销。但因为执行NAT需要重写流经Director的数据包,在速度上有一定延迟;另外,当用户的请求非常短,而服务器的回应非常大的情况下,会
对Director形成很大压力,成为新的瓶颈,从而使整个系统的性能受到限制。

2.设定LVS/TUN方式的负载均衡集群

TUN是指IP Tunneling,它的转发流程是:Director机器收到外界请求,按相应的调度算法将其通过IP隧道发送到相应Real Server,Real Server处理完该请求后,将结果数据包直接返回给客户。至此完成一次负载调度。

最简单的LVS/TUN方式的负载均衡集群架构如图3所示。

LVS/TUN使用IP
Tunneling技术,在Director机器和Real Server机器之间架设一个IP Tunnel,通过IP
Tunnel将负载分配到Real Server机器上。Director和Real
Server之间的关系比较松散,可以是在同一个网络中,也可以是在不同的网络中,只要两者能够通过IP
Tunnel相连就行。收到负载分配的Real
Server机器处理完后会直接将反馈数据送回给客户,而不必通过Director机器。实际应用中,服务器必须拥有正式的IP地址用于与客户机直接通
信,并且所有服务器必须支持IP隧道协议。


图3 LVS/TUN方式的集群简图


这里将所有LVS的配置命令写到一个可执行脚本,脚本内容如下:







#!/bin/bash
# Close IP Forwarding
echo 0 > /proc/sys/net/ipv4/ip_forward
ifconfig eth0 down
ifconfig eth0 192.168.0.253 netmask 255.255.255.0 broadcast 192.168.0.255 up
ifconfig eth0:0 192.168.0.254 netmask 255.255.255.255 broadcast 192.168.0.254 up
ipvsadm -C
ipvsadm -A -t 192.168.0.254:80 -s wlc
ipvsadm -a -t 192.168.0.254:80 -r 192.168.0.1 -i -w 3
ipvsadm -a -t 192.168.0.254:80 -r 192.168.1.201 -i -w 1
ipvsadm



将上面的脚本保存为/root/lvs_tun.sh。然后加上可执行属性,执行它:







# chmod a+x /root/lvs_tun.sh
# /root/lvs_tun.sh



运行此脚本之后应该出现如下信息:







# ./lvs-tun.sh
IP Virtual Server version 1.0.9 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.254:http wlc
-> 192.168.1.201:http Tunnel 1 0 0
-> 192.168.0.1:http Tunnel 1 0 0



另外在每台Real Server上还要执行如下的命令:







ifconfig tunl0 192.168.0.254 netmask 255.255.255.255 broadcast 192.168.0.254 up
route add -host 192.168.0.254 dev tunl0
echo 1 > /proc/sys/net/ipv4/conf/all/hidden
echo 1 > /proc/sys/net/ipv4/conf/tunl0/hidden



注意Real Server的内核必须打上修正ARP问题的内核补丁,如Linux2.4.20的内核是hidden-2.4.20pre10-1.diff,编译内核的方法参见Director机器。

通过本例来简单评价一下LVS/TUN方式。该方式中Director将客户请求分
配到不同的Real Server,Real
Server处理请求后直接回应给用户,这样Director就只处理客户机与服务器的一半连接,极大地提高了Director的调度处理能力,使集群系
统能容纳更多的节点数。另外TUN方式中的Real
Server可以在任何LAN或WAN上运行,这样可以构筑跨地域的集群,其应对灾难的能力也更强,但是服务器需要为IP封装付出一定的资源开销,而且后
端的Real Server必须是支持IP Tunneling的操作系统。

3.设定LVS/DR方式的负载均衡集群

DR是指Direct Routing,它的转发流程是:Director机器收到外界请求,按相应的调度算法将其直接发送到相应Real Server,Real Server处理完该请求后,将结果数据包直接返回给客户,完成一次负载调度。

构架一个最简单的LVS/DR方式的负载均衡集群如图4所示。

Real
Server和Director都在同一个物理网段中,Director的网卡IP是192.168.0.253,再绑定另一个
IP:192.168.0.254作为对外界的virtual IP,外界客户通过该IP来访问整个集群系统。Real
Server在lo上绑定IP:192.168.0.254,同时加入相应的路由。

Director端的实现脚本如下:







#!/bin/bash
# set ip_forward OFF for vs-dr director (1 on, 0 off)
echo 0 > /proc/sys/net/ipv4/ip_forward
ifconfig eth0:0 192.168.0.254 netmask 255.255.255.255 broadcast 192.168.0.255 up
ipvsadm -C
ipvsadm -A -t 192.168.0.254:80 -s wlc
# Set Real Server
ipvsadm -a -t 192.168.0.254:80 -r 192.168.0.1:873 -g
ipvsadm -a -t 192.168.0.254:80 -r 192.168.0.2:873 -g
ipvsadm




图4 LVS/DR方式的集群简图


将脚本保存为/root/lvs_dr.sh,加上可执行属性,执行它:







# chmod a+x /root/lvs_dr.sh
# /root/lvs_dr.sh



运行此脚本之后可以看到如下信息:







# ./lvs_dr.sh
IP Virtual Server version 1.0.9 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.254:http wlc
-> 192.168.0.2:http Route 1 0 0
-> 192.168.0.1:http Route 1 0 0



另外每台Real Server上要执行如下命令:







ifconfig lo:0 192.168.0.254 netmask 255.255.255.255 broadcast 192.168.0.255 up
route add -host 192.168.0.254 dev lo:0
echo 1 > /proc/sys/net/ipv4/conf/all/hidden
echo 1 > /proc/sys/net/ipv4/conf/lo/hidden



注意Real Server的内核也必须打上修正ARP问题的内核补丁,编译内核的方法参见Director机器。

同样通过本例来简单评价一下LVS/DR方式。LVS/DR方式与前面的LVS
/TUN方式有些类似,前台的Director机器也是只需要接收和调度外界的请求,而不需要负责返回这些请求的反馈结果,所以能够负载更多的Real
Server,提高Director的调度处理能力,使集群系统容纳更多的Real
Server。但LVS/DR需要改写请求报文的MAC地址,所以所有服务器必须在同一物理网段内。

结束语

其实集群架设到此还不能达到正式应用的要求,至少还需要解决三个问题:

1. 安装监视软件

集群运作时,应当监视集群中所有Real
Server的运行情况并对其中的变化作出反应。如果发现Real
Server突然down机,需要将其从集群队列中删除,等恢复后再重新加入。mon就是这样一个系统资源监控程序,可以监控网络服务可用性、服务器问题
等。用户可以对其进行定制和扩展。

2. 后台Real Server节点的数据一致性问题和更新方法

比如一个提供Web服务的集群系统,每台服务器的Web资料必须一致,如果对Web
资料的内容进行更新、增加或删除,如何使所有服务器之间数据同步呢?对于这种数据同步问题,一是采用网络镜像,如借用Mirror、FTP等来自行编写脚
本进行镜像;另一种是使用网络文件系统,如coda等。

3. 提高可用性

以上示例中,Director机器只有一台,一旦Director机器down掉,整个集群也就崩溃了,所以要考虑使用两台机器做一个HA(High-Availability)。比如,配合使用Linux的另一个软件heartbeat来实现HA。

实际运行中,面对的问题可能不只以上这些,相关内容在此就不再详述,欢迎大家共同探讨。

(责任编辑:赵纪雷)





















VMware5安装集群LVS实战解析


环境描述:本文在配置LVS时使用三台linux,虚拟VIP:192.168.8.11


 


一台做Directorserver(192.168.8.2) ,操作系统RedhatAS4


 


两台做realserver(192.168.8.5,192.168.8.6) 操作系统RedhatAS4


 


在配置lvs+heartbeat时,又添加了一台(192.168.8.3)做为备份主节点, 操作系统Fedora7


 


Virtual IP: 192.168.8.11


Load Balancer: 192.168.8.2


 


Backup: 192.168.8.3


 


Real Server 1: 192.168.8.5


Real Server 2: 192.168.8.6


 


软件列表:


ipvsadm-1.24.tar.gz: http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz


 


ipvsadm-1.24-8.1.i386.rpm


 


ftp://rpmfind.net/linux/fedora/releases/7/Everything/i386/os/Fedora/ipvsadm-1.24-8.1.i386.rpm


libnet.tar 下载地址:http://www.packetfactory.net/libnet/ 稳定版本是:1.1.2.1


 


heartbeat-2.0.2.tar.gz: http://linux-ha.org/download/heartbeat-2.0.8.tar.gz


 


2.6内核已经集成IPVS内核补订了,所以不再需要重新编译内核.


 


配置此集群分以下几种情况


 


一、配置基于DR模式Lvs集群


 


1、下载ipvsadm管理程序


http://www.linuxvirtualserver.org/software/


注意对应自己的内核版本


ipvsadm-1.24.tar.gz


tar zxvf ipvsadm-1.24.tar.gz


cd ipvsadm-1.24


make && make install


注意在make时可能会出现很多错误的信息,请按照如下操作就可以心编译正常


ln -s /usr/src/kernels/2.6.9-22.EL-i686/ /usr/src/linux


 


cd ipvsadm-1.24


 


make && make install


 


2.配置VIP脚本


 


[root@test7 chang]#vi LvsDR


 


#!/bin/sh


 


VIP=192.168.8.11


 


RIP1=192.168.8.6


 


RIP2=192.168.8.5


 


/etc/rc.d/init.d/functions


 


case "$1" in


 


start)


 


echo "start LVS of DirectorServer"


#Set the Virtual IP Address


 


/sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up


 


/sbin/route add -host $VIP dev eth0:1


 


#Clear IPVS Table


 


/sbin/ipvsadm -C


 


#Set Lvs


 


/sbin/ipvsadm -A -t $VIP:80 -s rr


 


/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g


 


/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g


 


#Run Lvs


 


/sbin/ipvsadm


 


;;


 


stop)


 


echo "close LVS Directorserver"


 


/sbin/ipvsadm -C


 


;;


 


*)


 


echo "Usage: $0 {start|stop}"


 


exit 1


 


esac


 


(-s rr 是使用了轮叫算法,可以自行选择相应的算法,默认是-wlc, -g 是使用lvs工作DR直接路由模式,ipvsadm -h查看帮助)。


 


3、配置realserver脚本


 


[root@test5 chang]#vi realserver


 


#!/bin/sh


 


VIP=192.168.8.11


 


/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up


 


/sbin/route add -host $VIP dev lo:0


 


echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore


 


echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce


 


echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore


 


echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce


 


sysctl –p


 


如果有多个realserver直接添加就可以了,之后启动此脚本就可以了.


 


测试:分别启动realserver上的httpd服务


在realserver1 执行 echo "This is realserver1" >> /var/www/html/index.html


在realserver2 执行 echo "This is realserver2" >> /var/www/html/index.html


 


打开IE浏览器输入http://192.168.8.11 应该可以分别看到:This is realserver1 和 This is realserver2.




二、配置基于隧道模式Lvs集群


 


1.配置LVS directorserver 脚本


 


[root@test7 chang]#vi TunLVS


 


#!/bin/sh

VIP=192.168.8.11


 


RIP1=192.168.8.5


 


RIP2=192.168.8.6


 


/etc/rc.d/init.d/functions


 


case "$1" in


 


start)


 


echo "Start Lvs of DirectorServer"


 


#set vip server


 


/sbin/ifconfig tunl0 $VIP broadcast $VIP netmask 255.255.255.255 up


 


/sbin/route add -host $VIP dev tunl0


 


#clear IPVS table


 


/sbin/ipvsadm -C


 


#set lvs


 


/sbin/ipvsadm -A -t $VIP:80 -s rr


 


/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -i


 


/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -i


 


#Run Lvs


 


/sbin/ipvsadm


 


;;


 


stop)


 


echo "Close Lvs DirectorServer "


 


ifconfig tunl0 down


 


/sbin/ipvsadm -C


 


;;


 


*)


 


echo "Usage: $0 {start|stop}"


 


exit 1


 


esac


 


2. 配置realserver


 


[root@test5 chang]#


 


#!/bin/sh


 


VIP=192.168.8.11


 


/etc/rc.d/init.d/functions


 


case "$1" in


 


start)


 


echo "tunl port starting"


 


/sbin/ifconfig tunl0 $VIP broadcast $VIP netmask 255.255.255.255 up


 


/sbin/route add -host $VIP dev tunl0


 


echo "1" > /proc/sys/net/ipv4/ip_forward


 


echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore


 


echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_announce


 


echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore


 


echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce


 


sysctl -p


 


;;


 


stop)


 


echo "tunl port closing"


ifconfig tunl0 down


 


echo "1" > /proc/sys/net/ipv4/ip_forward


 


echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce


 


;;


 


*)


 


echo "Usege: $0 {start|stop}"


 


exit 1


 


esac


 


此脚本分别在realserver上执行,目的使realserver忽略arp响应,并设定vip.


 


三、配置基于高可用Lvs+heartbeat


 


确定LVS使用DR或/tun模式,请对照上面的配置,本例使用DR模式


 


1.配置LVS directorserver 脚本


 


#!/bin/sh


 


VIP=192.168.8.11


 


RIP1=192.168.8.6


 


RIP2=192.168.8.5


 


/etc/rc.d/init.d/functions


 


case "$1" in


 


start)


 


echo "start LVS of DirectorServer"


 


#Set the Virtual IP Address


 


/sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up


 


/sbin/route add -host $VIP dev eth0:1


 


#Clear IPVS Table


 


/sbin/ipvsadm -C


 


#Set Lvs


 


/sbin/ipvsadm -A -t $VIP:80 -s rr


 


/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g


 


/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g


 


#Run Lvs


 


/sbin/ipvsadm


 


;;


 


stop)


 


echo "close LVS Directorserver"


 


/sbin/ipvsadm -C


 


;;


 


*)


 


echo "Usage: $0 {start|stop}"


 


exit 1



esac


 


2. realserver端同样使用上面的配置文件就可以。


 


3.安装heartbeat


 


3.1 安装


 


tar -zxvf libnet.tar.gz


cd libnet


./configure


make


make install


 


groupadd -g 694 haclient


useradd -u 694 -g haclient hacluster


 


tar zxf heartbeat-1.99.4.tar.gz


cd heartbeat-1.99.4


./ConfigureMe configure


make


make install


cp doc/ha.cf doc/haresources doc/authkeys /etc/ha.d/


cp ldirectord/ldirectord.cf /etc/ha.d/


 


3.2配置主文件/etc/ha.d/ha.cf


 


logfile /var/log/ha-log


 


keepalive 2


 


deadtime 60


 


warntime 10


 


initdead 120


 


udpport 694


 


bcast eth0 # Linux


 


auto_failback on


 


ping_group group1 192.168.8.2 192.168.8.3


 


respawn root /usr/lib/heartbeat/ipfail


 


apiauth ipfail gid=root uid=root


 


hopfudge 1


 


use_logd yes


 


node test7


 


node test8


 


crm on


 


3.3资源文件/etc/ha.d/ haresources


 


test7 192.168.8.11 httpd




设置test7为主节点,集群服务器的ip地址为192.168.8.11 集群服务有httpd


 


3.4认证文件(/etc/ha.d/authkeys),选取一种认证方式,这个文件的权限必须是600


 


auth 1


1 crc


#2 sha1 sha1_any_password


#3 md5 md5_any_password


 


chmod 600 /etc/ha.d/ haresources


 


3.5编辑主机名:/etc/hosts


 


192.168.8.2 test8


 


192.168.8.3 test7


 


备份节点192.168.8.3 上的heartbeat和apache的配置与节点1要完全相同,lvs配置也要相同


 


完装完毕进行测试,关闭主节点机器,另一台自动接管,主节点恢复后自动接管回服务。如果以上测试没有问题,那么开始和lvs整合。


 


4.配置Ldirectord


Ldirectord的作用是监测Real Server,当Real Server失效时,把它从Load Balancer列表中删除,恢复时重新添加,在安装heartbeat时已经安装了Ldirectord。


 


配置(/etc/ha.d/ldirectord.cf):


 


checktimeout=3


 


checkinterval=1


 


fallback=127.0.0.1:80


 


autoreload=yes


 


logfile="/var/log/ldirectord.log"


 


quiescent=yes


 


# Sample for an http virtual service


 


virtual=192.168.8.11:80


 


real=192.168.8.6:80 gate


 


real=192.168.8.5:80 gate


 


fallback=127.0.0.1:80 gate


 


service=http


 


request="index.html"


 


receive="Test Page"


 


protocol=tcp


 


checktype=negotiate


 


checkport=80


 


在每个Real Server的中添加监控页:


echo "Test Page" >> /var/www/html/index.html


 


修改/etc/ha.d/haresources


 


test7 192.168.8.11 ipvsadm ldirectord httpd


 


现在可以在主节点启动heartbeat


/etc/init.d/heartbeat start


 


并在备份节点启动heartbeat


 


/etc/init.d/heartbeat start


 


测试:关闭主节点,备份节点将自动接管directorserver服务。


至此配置完毕。









茶和茶叶的选购

茶和茶叶的选购









茶叶的选购技巧









    茶叶的选购不是易事,要想得到好茶叶,需要掌握大量的知识,如各类茶叶的等级标准,价格与行情,以及茶叶的审评、检验方法等。茶叶的好坏,主要从色、香、味、形四个方面鉴别,但是对于普通饮茶之人,购买茶叶时,一般只能观看干茶的外形和色泽,闻干香,使得判断茶叶的品质更加不易。这里粗略介绍一下鉴别干茶的方法。干茶的外形,主要从五个方面来看,即嫩度、条索、色泽、整碎和净度。


    1.嫩度:嫩度是决定品质的基本因素,所谓“干看外形,湿看叶底”,就是指嫩度。一般嫩度好的茶叶,容易符合该茶类的外形要求(如龙井之“光、扁、平、直”)。此外,还可以从茶叶有无锋苗去鉴别。锋苗好,白毫显露,表示嫩度好,做工也好。如果原料嫩度差,做工再好,茶条也无锋苗和白毫。但是不能仅从茸毛多少来判别嫩度,因各种茶的具体要求不一样,如极好的狮峰龙井是体表无茸毛的。再者,茸毛容易假冒,人工做上去的很多。芽叶嫩度以多茸毛做判断依据,只适合于毛峰、毛尖、银针等“茸毛类”茶。这里需要提到的是,最嫩的鲜叶,也得一芽一叶初展,片面采摘芽心的做法是不恰当的。因为芽心是生长不完善的部分,内含成份不全面,特别是叶绿素含量很低。所以不应单纯为了追求嫩度而只用芽心制茶。


    2.条索:条索是各类茶具有的一定外形规格,如炒青条形、珠茶圆形、龙井扁形、红碎茶颗粒形等等。一般长条形茶,看松紧、弯直、壮瘦、圆扁、轻重;圆形茶看颗粒的松紧、匀正、轻重、空实;扁形茶看平整光滑程度和是否符合规格。一般来说,条索紧、身骨重、圆(扁形茶除外)而挺直,说明原料嫩,做工好,品质优;如果外形松、扁(扁形茶除外)、碎,并有烟、焦味,说明原料老,做工差,品质劣。以杭州地区绿茶条索标准为例:一级     二级        三级     四级 五级 六级

细紧有锋 苗紧细尚有锋 苗尚紧实 尚紧 稍松 粗松


    可见,以紧、实、有锋苗为上。


    3.色泽:茶叶色泽与原料嫩度、加工技术有密切关系。各种茶均有一定的色泽要求,如红茶乌黑油润、绿茶翠绿、乌龙茶青褐色、黑茶黑油色等。但是无论何种茶类,好茶均要求色泽一致,光泽明亮,油润鲜活,如果色泽不一,深浅不同,暗而无光,说明原料老嫩不一,做工差,品质劣。


    茶叶的色泽还和茶树的产地以及季节有很大关系。如高山绿茶,色泽绿而略带黄,鲜活明亮;低山茶或平地茶色泽深绿有光。制茶过程中,由于技术不当,也往往使色泽劣变。


    购茶时,应根据具体购买的茶类来判断。比如龙井,最好的狮峰龙井,其明前茶并非翠绿,而是有天然的糙米色,呈嫩黄。这是狮峰龙井的一大特色,在色泽上明显区别于其它龙井。因狮峰龙井卖价奇高,茶农会制造出这种色泽以冒充狮峰龙井。方法是在炒制茶叶过程中稍稍炒过头而使叶色变黄。真假之间的区别是,真狮峰匀称光洁、淡黄嫩绿、茶香中带有清香;假狮峰则角松而空,毛糙,偏黄色,茶香带炒黄豆香。不经多次比较,确实不太容易判断出来。但是一经冲泡,区别就非常明显了。炒制过火的假狮峰,完全没有龙井应有的馥郁鲜嫩的香味。


    4.整碎:整碎就是茶叶的外形和断碎程度,以匀整为好,断碎为次。


    比较标准的茶叶审评,是将茶叶放在盘中(一般为木质),使茶叶在旋转力的作用下,依形状大小、轻重、粗细、整碎形成有次序的分层。其中粗壮的在最上层,紧细重实的集中于中层,断碎细小的沉积在最下层。各茶类,都以中层茶多为好。上层一般是粗老叶子多,滋味较淡,水色较浅;下层碎茶多,冲泡后往往滋味过浓,汤色较深。










茶叶的选购









    茶叶的品质好坏,在没有科学仪器和方法鉴定的时候,可以通过色、香、形四个方面的来评价。而用这四个方面来评定茶叶质量的优劣,通常采用看、闻、摸、品进行鉴别。即看外形、色泽,闻香气,摸身骨,开汤品评。



    色泽----不同茶类有不同的色泽特点。绿茶中的炒青应呈黄绿色,烘青应呈深绿色蒸青应呈翠绿色,龙井则应在鲜绿色中略带米黄色;如果绿茶色泽灰暗、深褐,质量必定不佳。绿茶的汽色应呈浅绿或黄绿,清澈明亮;若为暗黄或混浊不清,也定不是好茶。红茶应乌黑油润,汤色红艳明亮,有些上品工夫红茶,其茶汤可在茶杯四周形成一圈黄色的油环,俗称“金圈”;若汤色时间暗淡,混浊不清,必是下等红茶。乌龙茶则以色泽青褐光润为好。



    香气----各类茶叶本身都有香味,如绿茶具清香,上品绿茶还有兰花香、板栗香等,红茶具清香及甜香或花香;乌龙茶具熟桃香等。若香气低沉,定为劣质茶;有陈气的为陈茶;有霉气等异味的为变质茶。就是苦丁茶,嗅起来也具有自然的香气。花茶则更以浓香吸引茶客。



    口味----或者叫茶叶的滋味,茶叶的本身滋味由苦、涩、甜、鲜、酸等多种成分构成。其成分比例得当,滋味就鲜醇可口,同时,不同的茶类,滋味也不一样,上等绿茶初尝有其苦涩感,但回味浓醇,令口舌生津;粗老劣茶则淡而无味,甚至涩口、麻舌。上等红茶滋味浓厚、强烈、鲜爽;低级红茶则平淡无味。苦丁茶入口是很苦的,但饮后口有回甜。



    外形----从茶叶的外形可以判断茶叶的品质,因为茶叶的好坏与茶采摘的鲜叶直接相关,也与制茶相关,这都反应在茶叶的外形上。如好的龙井茶,外形光、扁平、直,形似碗钉;好的珠茶,颗粒圆紧、均匀;好的工夫红茶条索紧齐,红碎茶颗粒齐整、划一;好的毛峰 茶芽毫多、芽锋露等等。如果条索松散,颗粒松泡,叶表粗糙,身骨轻飘,就算不上是好茶了。











茶叶选购的基本知识














    茶叶选购知识:茶叶的种类很多,该买什么茶叶才适合自己呢?如果您希望摄取较多的维他命C,而且喜欢那种新鲜蔬草香味,可以买绿茶。如果觉得绿茶带“菁味”不喜欢,而偏好具兰、桂花的清香,那就买“包种茶”。认为绿茶,包种茶都太“生”,怕自己的胃喝了不舒服,那就选择发酵稍重,香气、甘酵兼具的乌龙茶。喜欢劲道十足,回甘力强,喉韵令人低回不已的茶友,可选购“铁观音茶”。 不论向茶庄或茶农买茶叶,一般以茶叶名称、分级、价格标示清楚,以“标准泡法”(三公克冲入150cc热开水浸泡五或六分钟)泡茶,以供顾客试饮的业者,比较货真价实。茶叶品质好坏,虽多少掺有饮用者主观的成份,但仍有一定的标准。



    茶叶干燥是否良好 
    以手轻握茶叶微感刺手,用姆指与食指轻捏会碎的茶叶,表示茶叶干燥程度良好,茶叶含水量在5%以下;如用力重捏茶叶不易碎,则是茶叶已受潮回软,茶叶品质会受到影响。



    茶叶叶片整齐度 
    茶叶叶片形状、色泽整齐均匀的较好,茶梗、簧片、茶角、茶末和杂质含量比例高的茶叶,大多会影响茶汤品质,以少为佳。




    茶叶外观色泽 
    各种茶叶成品都有其标准的色泽,一般以带有油光宝色或有白毫白毫乌龙及部份绿茶为佳,包种茶以呈现有灰白点之青蛙皮颜色为贵。而茶叶的外型条索则随茶叶种类而异,龙井呈剑片状,文山包种茶为条型自然卷曲,冻顶茶呈半球型紧结,铁观音茶则为球型,白毫乌龙自然卷曲而色泽带五种颜色(白、绿、黄、红、黑),香片与红茶呈细条或细碎型。



    闻茶叶香气 
    这是决定茶叶品质的主要条件之一,各类茶由于制法及发酵程度(Degreeoffermentation)不同,干茶的香气也不一样,绿茶取其清香,包种茶具花香,乌龙茶则具特有之熟果香,红茶带有一种焦糖香,花茶则应有熏花之花香和茶香混合之强烈香气,茶汤香气以纯和浓郁为上。另外茶叶如有油臭味、焦味、菁臭味、陈旧味、火味、闷味或其它异味者为劣品。



    尝茶滋味 
    由于各类茶之不同,其滋味亦异,有的须清香醇和,有的重在入口要刺激而稍带苦涩,有的则讲究甘润而有回味,总之,以少苦涩、带有甘滑醇味,能让口腔有充足的香味或喉韵者为好茶。若苦涩味重、陈旧味或火味重者则非佳品。



    观茶汤色 
    茶叶因发酵程度重而呈现不同的水色,一般绿茶呈蜜绿色,红茶鲜红色,白毫乌龙呈琥珀色,冻顶乌龙金黄色,包种茶呈蜜黄色,除其标准水色外,茶汤要澄清鲜亮带油光,不能有混浊或沉淀物产生。




看茶叶叶底(泡后茶叶渣) 
    
· 叶面展开度冲泡后很快开展的茶叶,大都是粗老之茶,条索不紧结,泡水甚薄,茶汤多平淡无味且不耐泡。泡后茶叶逐次开展者,系幼嫩鲜叶所制成,且制造技术良好,茶汤浓郁,冲泡次数亦多。叶面不开展或经多次冲泡仍只有小程度之开展的茶叶,则不是培火失败就是已经放置一段时间之陈茶。但白毫乌龙或龙井茶系以茶芽为重,因揉捻轻微,泡后叶底自然较易展开。 
    
· 叶形整碎:叶底形状以整齐为佳,碎叶多为次级品。  
    
· 茶身弹性:以手指捏叶底,一般以弹性强者为佳,表示茶菁幼嫩,制造得宜。叶脉突显,触感生硬者为老茶菁或陈茶。  
    
· 叶之新旧新茶叶底颜色新鲜明澈,陈旧茶叶底黄褐色或暗黑色。  
    
· 发酵程度红茶系全发酵茶,叶底应呈红鲜艳为佳;乌龙茶属半发酵茶,绿茶镶红边以各叶边缘都有红边,叶片中部成淡绿为上;清香型乌龙茶及包种茶为轻度发酵茶,其叶在边缘锯齿稍深位置呈红边,其它部份呈淡绿色为正常。


















如何选购乌龙茶











    茶叶种类繁多,那么,如何较好地选购茶叶呢?这里简要介绍了乌龙茶的选购方法,茶客们可以以此为鉴。  


    乌龙茶的选购不外乎望、闻、沏、开汤冲泡。选购时可以对此一一检视。  


    首先,观其外形。将干茶捧在手上对着明亮的光线检视,无论条形或球形,茶颜色应鲜活。有砂绿白霜像青蛙皮那样才好;注意是否隐存红边,红边是发酵适度的讯号;冬茶颜色翠绿,春茶则墨绿;如果茶干灰暗枯黄当然不好;而那些颗粒微小、油亮如珠,白毫绿叶犹存者,那是发酵不足的嫩芽典型的外观,这茶泡起来带青味,稍微浸泡就会苦涩伤胃。  


    检视干茶的同时还注意手感,球型茶手握柔软是干燥不足;拿在手上抖动要觉得有分量,太轻者滋味淡薄,太重者易苦涩;条型包种茶,如叶尖有刺手感,是茶青太嫩或退青不足造成“积水”的现象,喝起来会苦涩。手捧干茶,埋头贴紧着闻,吸三口气,如果香气持续甚至愈来愈强劲,便是好茶;较次者则香气不足,而有青气或杂味者当然不选。  


    其次,开汤冲泡。这是试茶最要紧的步骤。  


    茶商们试茶通常抓一大把茶叶,将茶壶塞满,这当然是商家的瞒天过海之术。买茶试茶只要一只磁杯,5g茶叶,冲150cc的开水静置5分钟。然后取一支小汤匙,拔开茶叶看汤色如何,如果浑浊,就是炒青不足;淡薄,则因嫩采和发酵不足。若炒得过火,则叶片焦黄碎裂。好的茶汤,汤色明亮浓稠,依品种及制法不同,由淡黄、蜜黄到金黄都显得鲜艳可爱。把汤匙拿起来闻,注意不要有草青味,好茶即使茶汤冷却,香气依然存在。茶汤含在嘴里,仔细分辨老板所言的“清香”是不是萎调不足的草青味,草青味是当前乌龙茶制程不够严谨所造成的,有草青味的茶,一旦增大投茶量,再稍加久浸,必然滋味苦涩,汤色变深。  


    总之,购茶选茶的原则是少投叶、多冲水、长浸泡,这样茶叶的优缺点就充分呈现,一览无余。



























绿茶选购的四个步骤












  茶友是经常要去买茶的,有人习惯于固定在某家店里买茶,熟人熟路,不会上当受骗;有人则喜欢到很多家茶叶店里去转,每次都货比三家,碰到自己喜欢的就买一些回来,有时候也能碰到一些新奇的事情。这亦是购茶之乐。 

   
    一般来说,春季是绿茶产销两旺的季节。对一个常年喝绿茶的人来说,第一杯春茶总会让人有些许期待和感慨。春天到来之时,我们也会在很多茶叶店门前看到“春茶上市”的牌子。无论是茶农还是茶商还是茶人,第一批的春茶,总是寄托着太多的期待和希望。 

     
    当然茶友在期待新绿茶的时候也要擦亮眼睛。因为并不是每个茶商都是善良的,或者说不是每个茶商都是那么的真诚。所以茶友有必要学一些知识来保护自己的利益和身体。本着最大限度地攫取利润的目的,有的茶商想要提高姿色平平的绿茶的香气和汤色,就采用作假的手段,例如添加香精和色素;。这样的茶不仅会骗人付出更多的金钱,更会带来健康方面的问题。下面就介绍一下如果去分辨这些做假的茶。 

    
    基本的分辨方法,可以采用
望、闻、问、沏四个步骤。 

    
    
:看茶的外形,是不是看起来让人服。 

    对于大多数的茶友来说,记住每种茶的具体特征是不可能的任务,但是对某个茶有个什么感官的第一印象却是我们判断的重要标准。首先,我们要做的就是看这款茶叶的外形,看起来是不是让人感觉愉快、舒服,同时也可以检查一下断碎的茶叶是不是很多,是不是有些发黄发黑的茶叶夹杂在中间,整个茶叶是否看起来没有光泽或者光泽较差。如果茶叶的视觉效果都不好,听从自己的心声,不要听信商家的忽悠,应该马上放弃。一般来说,也只有通过了这第一关,才有令人驻足,进一步考察的基础。 [next]

   
    
:好茶的香气应该纯正而无夹杂其他的异味(闻起来让人不舒服的味道,如香水香精味或其他非自然的香气)。 

    如果茶叶里含有高扬的香气,甚至有一种烤焦的味道,这时就需要仔细分辨一下了,一般来说这种茶往往多少有点问题,当然有时并不影响饮用,甚至成为某个特点。比如我到一个茶区去访茶,他们拿出一款茶出来请我品尝,茶入口确实香,然后续味道却不能很好的接上。我问制茶师傅,是不是故意把香气做上去的?因为根据判断,这个香气高的很有把握,而不像是犯了错误而出现的问题。制茶师傅承认是因为这一个时期的茶感觉不是那么好,所以想在香气方面做足一点,达到一种平衡。像这样的茶还是值得喝的,并且这茶的价钱也不会很高。需要注意的是,有的茶商会拿一些陈茶来再次烘焙,提高香气,从而达到以陈充新,赚取利润的目的。 

   
    
:无论是茶商还是茶友,对自己手里的茶应该是有一个基本的了解。

    每一种茶叶都应该有一个相对来说比较清楚的来路,特别是应季的绿茶,因为是新茶,商家更应该清楚其来路才对,否则就有问题。当然以次充好的商人不会笨到连编个说法都做不出来的地步,真假就要茶友自己分辨了。如果能事先找些相关资料,对基本问题有了解,用自己心里有底的问题咨询卖家,那就好办多了,上当的机会也会少很多。

    
    
:茶既然是喝的,要分辨自然少不了开汤沏茶。 

    “沏”字诀看起来简单,但是在使用的时候,有个问题要注意。有很多茶友发现,在茶庄喝的茶买回去自己泡就不是那个味了,而怀疑茶庄做了手脚。事实上,从根本上戒除这种疑虑的方法,掌握在茶友自己手中。 

    
    茶叶买回去,肯定是自己泡着喝,所以自己亲手泡出来的茶,才是我们需要了解的该茶的真实口味。茶友需要做的是,自己动手,现场沏茶。这样做还有一个好处,就是若我们泡这个茶的方法有误,懂行的商家也会指导我们冲泡的。如此一来,非但买了茶,也学到了这种茶的正确泡法,我们可以由此发现更多的冲泡技巧和窍门,这是一个非常好的学习途径。 

    
    在绿茶里,有一个简单的做假,那就是把隔年的茶当新茶贩卖。有很多商家,在下半年绿茶淡季来临之前,发现自己的库存无法售完,就会把茶叶通过冷冻的方式储存起来。而通过这个方式储存起来的茶叶,从干茶颜色上来看和新茶差不多,一般消费者很难分辨。不过,如果通过冲泡,这个问题就好解决了。这样隔年的茶叶,一泡就会露馅。这种茶经在冲泡过程中,香气往往是一泡就消失,冲泡后的叶底,会有明显的发黄,且弹性差。茶汤入口,感觉茶味较淡,苦涩而无回甘或者回甘很弱。有时候商家的言之凿凿反而是心怀鬼胎。我也曾经上过这样的当。














怎么鉴别绿茶











    茶的品质差别较大,可根据外观和泡出的茶汤、叶底进行鉴别。新茶和陈茶新茶的外观色泽鲜绿、有光泽,闻有浓味茶香;泡出的茶汤色泽碧绿,有清香、兰花香、熟板栗香味等,滋味甘醇爽口,叶底鲜绿明亮。





    陈茶的外观色黄暗晦、无光泽,香气低沉,如对茶叶用口吹热气,湿润的地方叶色黄且干涩,闻有冷感;泡出的茶汤色泽深黄,味虽醇厚但不爽口,叶底陈黄欠明亮。 




春茶、夏茶和秋茶春茶外形芽叶硕壮饱满、色墨绿、润泽,条索紧结、厚重;泡出的茶汤味浓、甘醇爽口,香气浓,叶底柔软明亮。 




    夏茶外形条索较粗松,色杂,叶芽木质分明;泡出的茶汤味涩,叶底质硬,叶脉显露,夹杂铜绿色叶子。




    秋茶外形条索紧细、丝筋多、轻薄、色绿;泡出的茶汤色淡,汤味平和、微甜,香气淡,叶底质柔软,多铜色单片。 




    高山茶和平地茶高山茶外形条索厚重,色绿、富光泽;泡出的茶汤色泽绿亮,香气持久,滋味浓厚,叶底明亮,叶质柔软。




    平地茶外形条索细瘦、露筋、轻薄,色黄绿;泡出的茶汤色清淡,香气平淡,滋味醇和,叶质较硬,叶脉显露。








绿茶的选购和冲泡要点






    绿茶是一种健康饮品,为了指导广大消费者正确选购和饮用绿茶,国家质检总局为消费者提供了一些绿茶小常识。

    消费者选购绿茶时,可从茶叶形状、色泽、干茶香气等方面来鉴别,有条件的还可经过冲泡、嗅其香气、尝其滋味、观其汤色及茶渣老嫩、色泽等来鉴别。

    高档绿茶通常指的是名优绿茶,鲜叶原料细嫩或肥嫩,含芽率高,一般为一芽一、二叶。外观色泽嫩绿或翠绿,有些因满披白毫而呈银绿色;香气以嫩香为主,兼有花香或清香,汤色嫩绿清澈,滋味鲜爽,回味有余甘。

中档绿茶鲜叶原料尚嫩,以一芽二、三叶为主,兼有嫩的单叶,芽稍显瘦。外观色泽以深绿为主,白毫较少;香气常带高火香,汤色黄绿明亮,滋味浓欠鲜爽。

    低档绿茶鲜叶原料欠嫩欠匀,芽少,以较成熟呈展开状的叶片为主。外观色泽黄中稍带绿,常显枯,无白毫;香气低淡或带粗气,汤色黄稍有绿意,滋味平淡。

    绿茶可选用陶瓷茶壶、盖碗、玻璃杯等茶具沏泡,茶水比例1:50左右,根据个人口味可适当增减,冲泡水温90摄氏度左右。幼嫩名优绿茶可用玻璃杯冲泡,既可品尝茶汤的甘醇,又可欣赏茶芽在水中伸展的优美姿态。

    茶叶极易吸湿、吸异味,同时在高温高湿、阳光照射及充足氧气条件下,会加速茶叶内含成分的变化,降低茶叶的品质,甚至在短时间内使茶叶陈化变质。

    绿茶贮藏须注意防潮防高温、避光避氧气和远离异味。名优绿茶贮藏不当极易陈化而失去光润的色泽及特有的香气。家庭贮藏名优绿茶,可采用生石灰吸湿贮藏法,即选择密封容器(如瓦缸、瓷坛等),将生石灰块装在布袋中并置于容器内,茶叶用牛皮纸包好放在布袋上,密封容器口,容器应放置在阴凉干燥环境中。有条件的还可将生石灰吸湿后的茶叶用镀铝复合袋包装,内置除氧剂,封口后置于冰箱中,可一年以上保持茶叶品质基本不变。














如何选购绿茶 







    一看颜色。凡色泽绿润,茶叶肥壮厚实,或有较多白毫者一般是春茶; 

    二看外形。扁形绿茶茶条扁平挺直,光滑,无黄点、无青绿叶梗是好茶;卷曲形或螺状绿茶,条索细紧,白毫或锋苗显露说明原料好,做工精细; 

    三闻香气。香气清新馥郁、略带熟栗香的是好茶。 

    由于绿茶是属于不发酵茶,所以保存了大部分的茶叶成分和营养,被许多人视为保健身体的佳品,但相较于其他茶叶,也是最容易氧化及变质的茶叶。由于绿茶强调新鲜清新的风味,所以保存期限是最短的,买回来后应尽速喝完,不喝时也要冷藏保存,以免破坏原有的味道和营养成分。 

◆了解产地 
    由于各种茶适合生长的地势、土质不同,因此不同地方所产出的茶叶品质也有差别。如果你对喝茶很有讲究、味蕾也很敏锐,可以自己选购试喝,另外,也可选购著名产地的茶叶。 

◆采摘时节 
    绿茶于春茶最佳,其次才是冬茶,因此你要购买好的绿茶,最好在春季购买较好、也较新鲜。若是在夏秋两季购买,不但数量不多,而且春茶存放至此时,通常也不太新鲜了。 

◆选择白毫茶叶 
    绿茶通常是摘采嫩芽制成,该嫩芽经过烘焙过程,会形成白色茸毛,我们称为白毫或银毫。因此带有白毫的茶叶,表示是摘采茶青嫩芽制成的,是较好的茶叶。 

◆观察茶叶颜色 
    因为绿茶和其他茶叶比起来容易氧化,所以如果你购买的是散装茶叶,选购时更要注意新鲜度,新鲜的绿茶颜色墨绿带光泽,不新鲜的绿茶则是黄褐色、没有光泽。 

◆注意制造日期 
    因为容易氧化,所以在选购包装好的绿茶时,应特别注意制造日期和保存期限,原则上越新鲜越好,一旦开封后也要尽快喝完,以免失去绿茶的清新香味和营养。 

    绿茶由于未经萎凋及搅拌的发酵过程,所以保留大量的叶绿素、维他命C及咖啡因等茶叶成分,比较容易刺激神经,容易失眠或胃弱的人最好不要饮用。


CISCO仿真模拟器Dynamips

CISCO仿真模拟器Dynamips


一、一些软件介绍


    1、dynamips-0.2.8-RC2-cygwin_CISCO.zip:Cisco仿真模拟器Dynamips程序,包括dynamips-wxp.exe,dynamips-w2000.exe,nvram_export.exe,cygwin1.dll,README-0.2.8.txt文件。

    2、Dynamips_CISCO_c2900XL-c3h2s-mz-120.5.2-XU.bin、Dynamips_CISCO_c3640-is-mz_120-7_t.bin、Dynamips_CISCO_C7200.bin:不同设备的CISCO IOS bin文件。

    3、Dynamips_CISCO_dynagen-0.11.0_win_setup.exe:基于dynamips的一个可以用脚本来配置dynamips的工具。

    4、Dynamips_CISCO_DynamipsGUI_2.8_CN.rar:基于dynamips的一个可以用GUI图形方式来配置dynamips的工具。它跟第3工具一样的功能。


二、dynagen的简单试用

    套用网上非常流行的一段话:Dynamips,
这绝对不是一般的cisco路由器模拟器。dynamips和boson netsim的区别在于:boson是模拟出IOS的命令行,而
dynamips是模拟出cisco7200路由器的硬件环境,然后在这个环境中直接运行Cisco的IOS。换句话讲,dynamips模拟出的是真实
的路由器,就象你在PC上用街机模拟器玩街机游戏一样。

最近上BCN所做的实验都在Dynamips上完成的,Dynamips的确是非常强的工具,当然Dynamips还是不能替代真实的路由器的,还是有些命令是不同的。



    想要使用Dynamips首先就要安装winpcap,winpcap有什么用呢?其实我也不知道,google上查到它为win32应用程序提供访问网络底层的能力,也许是让真实环境和虚拟路由器通信的东东吧!!!

    然后再安装Dynamips这个软件(有win版和linux版,这里我装的是win版),默认就在c盘了。

    再然后就把cisco的ios文件拷到c:\...\Dynamips\images下(目前我就只有3660和7200)




    一切准备都做好了,就等需要的实验拓扑图了(也就是sample_labs中的.net文件的内容),这里拿一个全面的说明图来演示。(注意红色部分为.net文件中的内容


# 项目实践拓扑结构


autostart = False    # 是否所有的设备均自动启动?有true和false两个选项,默认是true。能够被每设备的配置所替代。

# model = 7200     # 设置实验室中的所有路由器的默认型号。目前可以选择的有3620,3640,3660和7200。


[localhost:7200]    # 服务器的主机名或者ip地址,以及所使用的控制端口。如果你不指明的话,默认使用7200。

    # port = 7200     # 老式的设置控制端口的方法,可选,默认为7200。

    console = 2001    # 基本控制端口。新开启的实例如果没有指明控制端口,默认会使用这个值+实例号。默认值为2000。

    workingdir = C:\Program Files\Dynamips\sample_labs\test    # 设置Dynamips所保存所有设备文件的目录。它和运行dynamips的系统的绝对路径有关。

    udp = 10000    # 设置NIO使用的基本UDP端口。

    

    [[7200]]

        image = C:\Program Files\Dynamips\images\c7200-is-mz.123-10d.bin    # 7200路由器的ios文件的绝对路径。

        ram = 128    # 每个路由器实例的虚拟内存数。

        nvram = 128    # NVRAM的大小

        # disk0 = 64       # Set size of PCMCIA ATA disk0

        # disk1 = 64       # Set size of PCMCIA ATA disk1

        # cnfg = None      # Configuration file to import. This is the fully qualified path relative to the system running dynamips.

        confreg = 0x2102

        npe = npe-400    # NPE类型。("npe-100", "npe-150", "npe-175", "npe-200", "npe-225", "npe-300" or "npe-400")

        midplane = vxr    # 可选"std" or "vxr"

        mmap = True    # 设置为false将在为每个路由器产生虚拟内存时使用真实的内存替代磁盘文件。节省内存时是以牺牲性能为代价的。默认选项为True。

    # idlepc = 0x607f1630 # 设置cpu空闲的值

    # exec_area = 64   # Set the exec area size

    # configuration = ... # 基本的64位加密的IOS配置。当前只能在7200下使用。 

    

    [[3620]]

        image = C:\Program Files\Dynamips\images\c3620-is-mz.122-16.bin    # 3620的ios的完全路径。

        ram = 64    # 每个路由器的实例的虚拟内存数。

        rom = 4    # ROM的大小

        nvram = 128    # NVRAM的大小

        # disk0 = 64       # Set size of PCMCIA ATA disk0

        # disk1 = 64       # Set size of PCMCIA ATA disk1

        # iomem = 5        # 路由器内存中分配给iomem的百分比。仅仅应用于3600系列的路由器。

        # cnfg = None      # Configuration file to import. This is the fully qualified path relative to the system running dynamips.

        confreg = 0x2102    # Set the configuration register

        mmap = True    # 设置为false将在为每个路由器产生虚拟内存时使用真实的内存替代磁盘文件。节省内存时是以牺牲性能为代价的。默认选项为True。

    # idlepc = 0x60719b98 # Set the Idle PC value

    # exec_area = 64   # Set the exec area size

    

    [[3640]]

        image = C:\Program Files\Dynamips\images\c3640-jk9o3s-mz.123-10.bin    # 3640的ios的完全路径。

        ram = 96    # 每个路由器的实例的虚拟内存数。

        rom = 4    # ROM的大小

        nvram = 128    # NVRAM的大小

        # disk0 = 64       # Set size of PCMCIA ATA disk0

        # disk1 = 64       # Set size of PCMCIA ATA disk1

        # iomem = 5        # 路由器内存中分配给iomem的百分比。仅仅应用于3600系列的路由器。

        # cnfg = None      # Configuration file to import. This is the fully qualified path relative to the system running dynamips.

        confreg = 0x2102    # Set the configuration register

        mmap = True    # 设置为false将在为每个路由器产生虚拟内存时使用真实的内存替代磁盘文件。节省内存时是以牺牲性能为代价的。默认选项为True。

    # idlepc = 0x60719b98 # Set the Idle PC value

    # exec_area = 64   # Set the exec area size

    

    [[3660]]

        image = C:\Program Files\Dynamips\images\c3660-is-mz.124-10a.bin    # 3660的ios的完全路径。

        ram = 96    # 每个路由器的实例的虚拟内存数。

        rom = 4    # ROM的大小

        nvram = 128    # NVRAM的大小

        # disk0 = 64       # Set size of PCMCIA ATA disk0

        # disk1 = 64       # Set size of PCMCIA ATA disk1

        # iomem = 5        # 路由器内存中分配给iomem的百分比。仅仅应用于3600系列的路由器。

        # cnfg = None      # Configuration file to import. This is the fully qualified path relative to the system running dynamips.

        confreg = 0x2102    # Set the configuration register

        mmap = True    # 设置为false将在为每个路由器产生虚拟内存时使用真实的内存替代磁盘文件。节省内存时是以牺牲性能为代价的。默认选项为True。

    # idlepc = 0x60640290    # Set the Idle PC value

    # exec_area = 64   # Set the exec area size

    

    [[Router B1-F2-S1]]

        model = 3660

        slot1 = NM-16ESW

        idlepc = 0x60640eb8

    

    [[Router B1-D-S1]]

        model = 3660

        slot1 = NM-16ESW

        idlepc = 0x60640eb8


    [[Router B1-D-S2]]

        model = 3660

        slot1 = NM-16ESW

        idlepc = 0x60640eb8


    [[Router B1-D-S1-R]]

        model = 3620

        idlepc = 0x60424f48


    [[Router B1-D-S2-R]]

        model = 3620

        idlepc = 0x60424f48


    [[Router C-S1]]

        model = 3660

        slot1 = NM-16ESW

        idlepc = 0x60640eb8


    [[Router C-S2]]

        model = 3660

        slot1 = NM-16ESW

        idlepc = 0x60640eb8


    [[Router B2-F2-S1]]

        model = 3660

        slot1 = NM-16ESW

        idlepc = 0x60640eb8

    

    [[Router B2-D-S1]]

        model = 3660

        slot1 = NM-16ESW

        idlepc = 0x60640eb8


    [[Router B2-D-S2]]

        model = 3660

        slot1 = NM-16ESW

        idlepc = 0x60640eb8


    [[Router B2-D-S1-R]]

        model = 3620

        idlepc = 0x60424f48


    [[Router B2-D-S2-R]]

        model = 3620

        idlepc = 0x60424f48


    #[[Router r1]]

        #model = 3660

        #slot1 = NM-16ESW

        #idlepc = 0x60640eb8


    #[[Router r2]]

        #model = 7200

        #idlepc = 0x607f1630

    

    #[[Router r3]]

        #model = 3640

        #idlepc = 0x604593cc

    

    #[[Router r4]]

        #model = 3620

        #idlepc = 0x60424f48



#后面的为说明文字,不影响该文件


下面我们来新建个拓扑图,在sample_labs文件夹中新建一个txt文本然后把扩展名改为.net

用写字板打开.net文件,写入:


# switching


autostart = no    # 是否所有的设备均自动启动?有true和false两个选项,默认是true。能够被每设备的配置所替代。

# model = 7200     # 设置实验室中的所有路由器的默认型号。目前可以选择的有3620,3640,3660和7200。


[localhost]    # 服务器的主机名或者ip地址,以及所使用的控制端口。如果你不指明的话,默认使用7200。

    

    [[3660]]

        image = C:\Program Files\Dynamips\images\c3660-is-mz.124-10a.bin    # 3660的ios的完全路径(3660有交换模块,此s1和s2为交换机)。

        ram = 96    # 每个路由器的实例的虚拟内存数。


    [[router s1]]

        model = 3660

        slot1 = NM-16ESW

        idlepc = 0x60640eb8

        f1/1 = s2 f1/1

    

    [[router s2]]

        model = 3660

        slot1 = NM-16ESW

        idlepc = 0x60640eb8


    这里有2台交换机,交换机s1的f1/1端口接在s2的f1/1上面,如果还需要更多交换机,可以直接在后面加。


    配置完成后,保存关闭,运行桌面上的dynamips Server,然后再运行你所配置的.net文件。ok了,这时你就可以用list命令查看,telnet登录了。



    

    

    由于dynamips非常占用内存资源,一台512M内存的电脑最多可以开4台模拟的路有器,因此我们就需要在几台PC上同时运行模拟路由器,并且让他们相互连接,今天小吴老师刚把这个方法交给我们。


拓扑图文件是这样的:(这几台电脑必须在一个局域网内)



# Working with multiple dynamips servers


[192.168.6.50]     #自己的IP地址


       [[3660]]

            image = E:\***.bin     #自己的IOS文件位置

            ram = 96     #模拟路由器的内存大小


       [[ROUTER R1]]

            model = 3660

            s2/0 = R2 s2/0

            idlepc = 0x60640eb8



[192.168.6.58]     #其它PC的IP地址

      workingdir = \***\test     #在192.168.6.58这台PC上新建一个test文件夹,用于存放产生的临时文件


       [[3660]]

            image = E:\***.bin     #192.168.6.58这台PC的IOS文件位置

            ram = 96


       [[ROUTER R2]]

            model = 3660

            idlepc = 0x60640eb8


注意:192.168.6.58这台PC要运行桌面上的dynamips Server,然后再在6.50这台上进行实验。


 


三、DynamipsGUI的入门配置

    声明:本文主要是为刚刚认识dynamips这个模拟器的朋友.我写这个东西也是因为这个模拟器比较有实用价值.希望大家用好这个模拟器.完成学习.有什么问题欢迎大家在本论坛发帖.

    不说废话了直接进入主题吧,看门见图:


首先我按图中序号对每个区域进行介绍:
①:此区域是选择交换机和路由器的个数(有点废话)
②:这个地方是选择设备类型,IOS路径,idle-p值NPE类型,虚拟(表示虚拟设备的RAM所占的内存大小,因为dynamips在模拟时候需要将主机的物理内存模拟成模拟设备的RAM)
③:此区域是配置分布式的dynamips的设置区域(请看分布式专题),对谛率掷此?这个区域暂时还用不到.
④:这里可以选择一些不需要IOS的模拟设备。如:FrameRelay交换机ATM交换机,以太网交换机(现在已经有支持交换的模块NM-16ESW).由模拟器自己提这些功能.
⑤:设备类型,选择你所需要模拟的设备,以上的设备为dynamips目前支持的类型,其他的都不支持.
⑥:这里可以设置连接到主机通信(下文详细介绍)
⑦:可以直接读取真实设备里的NVRAM里的配置文件(.ini格式)
⑧:输出目录(自己先建立).



(根据上面这个拓扑来介绍,希望大家在弄懂基本东西以后,可以在举一反三吧.东西是活的,活学活用)

    接下来,我从起始配置到最后开始实验在做逐步讲解.
    1.
首先选择根据上面这个拓扑图(建立在做实验的时候在草稿纸上画好拓扑图,注释好个端口设备的IP).我们来用dynamipsGUI来配置脚本文件(注
意:现在的dynamipsGUI和dynamipsee都是可以视化的写dynamips的脚本程序.不是模拟器.有的初学者.总以为这两个程序是模拟
器.真正的模拟器是dynamips 点击进入作者BLGO).未安装的朋友请点下载.下载好安装.点击桌面DynamipsGUI图标打开.


    2.好了,打开以后,根据上面的图我们假设R1,R2,R3都使用3640,而R4使用7200.那么我们选择路由器个数为4,并选择桥接到PC.在⑤设备类型里钩选3640 和7200.如图:




    3.在②设备配置区域里下拉选择7200,然后浏览选择你的IOS文件点击下载IOS(cisco ios文件夹).
(注意IOS在网上下载后,后缀名为BIN,大家需要将后缀名字改为RAR,然后在解压出来,这样在运行模拟设备时候就避免了再解压)接一下步是最让初学
者感到困惑的地方.计算idle-pc值(idle-pc只为了解决在开启模拟设备时不至于你的CPU占有率达到100%,所以这个值对于能做好实验很重
要).好.指定好IOS路径以后.我们点击计算idle-pc,确定IOS文件存在.之后在弹出窗口中按任意键继续.如图:




    之后看到的就是设备的启动了(如同真实设备一样).然后在设备的用户模式下(Router>)下先按组合键ctrl+] 接着在单独按i键.记住不要三个键一起按.按完以后就是等待了.如图:




    等待一会儿,出现下图:




    看到下面出现一排值.这就是我们所需要的idle-pc值.那么这么多我们怎么选择呢?好!注意看count等于后面的数字.找到一个count最大值.然
后记下前面的一串16进制数.例如上面这图.count=72,这个里面有两个72的值,我们同时记下这两个值.0x605c33fc
和0x605c345c.然后在回到dynamipsGUI界面.将0x605c33fc(或者0x605c345c)填入.(说一下这地方的原则:大家
不要一味的相信最大值就是必须要选择的值.这要看情况而定.如果当你选择一个最大值,然后在后面开设备的时候却出现了CPU100%的情况,那么这个时候
你就应该重新去计算idle-pc值,只到CPU占有率维持在一个正常值.我上面说的选取最大的count值是应该理解为从最大的count值开始去试.
这样一直到找到一个合适的idle-pc值)
    

    4.接下来是NPE类型这里
dynamipsGUI已经有默认值了.我们不需要在去设置它.而在虚拟内存这里dynamipsGUI作者也给出了各个类型模拟器的默认值.大家可以根
据IOS的大小去更改.也要根据自己的物理内存而定.而后面的参数128 --disk0 4
,128的意思是拿128MB的物理内存来作为虚拟设备的RAM, --disk0 4是dynamips的参数在说明文件中的解释为:
--disk0  : Set PCMCIA ATA disk0:
size.这是节省内存的参数.不过3600不支持这个参数.大家如果想深入研究可以读说明文档内容,如下:
The emulator currently supports the following platforms:
  - Cisco 7200 (NPE-100 to NPE-400)
  - Cisco 3600 (3620, 3640 and 3660)
  - Cisco 2691
  - Cisco 3725
  - Cisco 3745
  - Cisco 2600(2610/2611/2620/2621/2610XM/2620XM/2650XM)

To emulate another platform, use the "-P" command line option (for example,
"-P 3725" or "-P 3600").

For the 7200, you can change the NPE type with the "-t" option.
It is possible to select "npe-100", "npe-150", "npe-175", "npe-200",
"npe-225", "npe-300" and "npe-400". The "npe-g1" is not working.

For the 3600, a 3640 with 128 Mb is emulated by default. You can change this
with the "-t" option and by specifying "3620" or "3660".
Don't forget to set the chassis type depending on your IOS image,
a c3660 image will not run on c3640 hardware and vice-versa.

Remark: PCMCIA card emulation is not supported yet with Cisco 3600.

    还有一个要说明的,大家如果在以后碰到dynamipsGUI界面的虚拟碰到后面跟一个参数-X(注意为大写)比如96 –X
意思是不使用一个模拟的RAM文件,这样可以使用速度更快.原说明文档也有介绍:-X : Do not use a file to
simulate RAM (faster)
    我对新手的建议:关于NPE绾紊柚?大家在使用dynamipsGUI时就使用默认的.关于虚拟大小如何设置.主要还是根据你的IOS大小来定.dynamipsGUI也给了默认值.


    5.
接下来我要拿来单讲的就是这个寄存器的值了.很多人在做实验的时候都问,为什么copy run
start以后.下次重新启动虚拟设备时.设置没有被保存.主要就是这个地方的设置问题了.学思科的人都清楚0x2142和0x2102了.
0x2142启动时是不从NVRAM读配置.而0x2102相反.因为dynamips默认是0x2142
所以我们需要在这个地方改为0x2102就可以了.然后在到虚拟的路由设备里面在show
ver看看,你会发现寄存器的值0x2142(虽然我们这之前在dynamipsGUI已经配置过)但还是要重新在改一次寄存器的值才能最后的保存你的配
置命令:config-register 0x2102
然后再配置在copy run start,再reload看看.你就会发现设置保存成功!
    

    6.
好的.上面已经把7200都配置好了.完了以后点寄存器下面的确定.3640也是一样(其它的设备也是如此配置)配置完后确定.
OK!两个设备都配置完毕.接下来.哦还记得我上面的那个拓扑图吧。对,还有一个桥接到本地PC与我们自己的主机通信(我要说明一下.不一定非要桥接到
PC.我这里是故意弄一个PC桥接,因为很多朋友这个地方搞不清楚).我们选择⑥区域里的下拉.选择NIC-O(dynamips可以支持多块网卡桥
接),然后点击计算桥接参数.在弹出的界面里已经有很详细的说明.如图:




    在这里我就不在重复了(免得说我罗嗦!
).只说一点.例如这张图中我们应该选择的是第三个网卡信息,即本地网卡信息而不应该选择第二个(是PPPOE拨号的).OK。如本图应该为:
\Device\NPF_{36CC519A-AAF8-4C53-A9EC-7E0B88D917D6},记下网卡信息最好填到dynamipsGUI
界面相应位置.好了.现在选择一个输出目录吧.下一步!!

    6.这里就是确定设备名字和telnet端口还有各个slot模块信息.关于slot的模块可以参见我的帖子(下面我不在作模块介绍了):配置好每个设备点击确定配置.好根据上面那个拓扑图我也配置一下.首先是R4(7200)根据图中要求如图:




    然后是3640 三个都是一样的:



    这里我解释一下界面下面的控制台输出(操作系统我不废话了,不会还有哪个连自己是什么系统不知道的),如果选择TCP输出则需要用telnet连接.推荐使用SecureCRT 点击下载.
        如果是直接输出,就是不用telnet连接了,就是直接在窗口下输出CLI界面,就是•••(没办说清楚了,大家自己去用用看就知道了).完事!下一步。


    7.根据拓扑连设备吧.我没什么好说的了.就是将拓扑图中各个相连的端口连起来(废话),我也连了一下.发个图.新手自己慢慢体会吧.呵呵(注:图中XPC就是主机)



    

    最后完事点生成BAT文件.在到你的输出目录里去吧.生成的文件如图:



    

    然后依次点R1.bat,R2,bat,R3,bat,R4.bat 意思是打开这四个模拟路由器!.
然后就用SecureCRT连接了IP地址是:127.0.0.1 端口根据配置的console的值!
例如本教程中R1路由器端口设置的是2001 下面我们使用SecureCRT来登陆.

    

    安装好SecureCRT 打开. 点在标签中建立连接
如下图:




点新会话看下图:

接着下图:


下一步如图:


接着在下一步就可以了,最后在连接就看到下图了:


好了,写到这里已经不需要写下去了.在下面都应该是一个ciscoer(学思科的人)知道的了.



四、Dynamips程序的说明


Help for Cisco router simulator (dynamips-0.2.8)
================================================
Authors of this document: Fabien Devaux, Christophe Fillot, MtvE

Emulated hardware
*****************

The emulator currently supports the following platforms:
  - Cisco 7200 (NPE-100 to NPE-400)
  - Cisco 3600 (3620, 3640 and 3660)
  - Cisco 2691
  - Cisco 3725
  - Cisco 3745
  - Cisco 2600 (2610 to 2650XM)
  - Cisco 1700 (1710 to 1760)

By default, a Cisco 7206VXR with NPE-200 (256 Mb of DRAM) is emulated.

To emulate another platform, use the "-P" command line option (for example,
"-P 3725" or "-P 3600").

For the 7200, you can change the NPE type with the "-t" option.
It is possible to select "npe-100", "npe-150", "npe-175", "npe-200",
"npe-225", "npe-300" and "npe-400". The "npe-g1" is not working.

For the 3600, a 3640 with 128 Mb is emulated by default. You can change this
with the "-t" option and by specifying "3620" or "3660".
Don't forget to set the chassis type depending on your IOS image,
a c3660 image will not run on c3640 hardware and vice-versa.

Remark: PCMCIA card emulation is not supported yet with Cisco 3600.


Command Line Options overview
*****************************

  -l <log_file>      : Set logging file (default is dynamips_log.txt)
  -j                 : Disable the JIT compiler, very slow
  --exec-area <size> : Set the exec area size (default: 64 Mb)
  --idle-pc <pc>     : Set the idle PC (default: disabled)
  --timer-itv <val>  : Timer IRQ interval check (default: 1000)

  -i <instance>      : Set instance ID
  -r <ram_size>      : Set the virtual RAM size
  -o <rom_size>      : Set the virtual ROM size
  -n <nvram_size>    : Set the NVRAM size
  -c <conf_reg>      : Set the configuration register
  -m <mac_addr>      : Set the MAC address of the chassis
                       (default: automatically generated)
  -C <cfg_file>      : Import an IOS configuration file into NVRAM
  -X                 : Do not use a file to simulate RAM (faster)
  -R <rom_file>      : Load an alternate ROM (default: embedded)
  -k <clock_div>     : Set the clock divisor (default: 4)

  -T <port>          : Console is on TCP <port>
  -U <si_desc>       : Console in on serial interface <si_desc>
                       (default is on the terminal)

  -A <port>          : AUX is on TCP <port>
  -B <si_desc>       : AUX is on serial interface <si_desc>
                       (default is no AUX port)

  --disk0 <size>     : Set PCMCIA ATA disk0: size
  --disk1 <size>     : Set PCMCIA ATA disk1: size

  -a <cfg_file>      : Virtual ATM switch configuration file
  -f <cfg_file>      : Virtual Frame-Relay switch configuration file
  -E <cfg_file>      : Virtual Ethernet switch configuration file
  -b <cfg_file>      : Virtual bridge configuration file
  -e                 : Show network device list of the host machine

Options specific to the Cisco 7200 series:

  -t <npe_type>      : Select NPE type (default: "npe-200")
  -M <midplane>      : Select Midplane ("std" or "vxr")
  -p <pa_desc>       : Define a Port Adapter
  -s <pa_nio>        : Bind a Network IO interface to a Port Adapter

Options specific to the Cisco 3600 series ("dynamips -P 3600 --help"):

  -t <chassis_type>  : Select Chassis type (default: "3640")
  --iomem-size <val> : IO memory (in percents, default: 5)
  -p <nm_desc>       : Define a Network Module
  -s <nm_nio>        : Bind a Network IO interface to a Network Module

Options specific to the Cisco 2691 series ("dynamips -P 2691 --help"):

  --iomem-size <val> : IO memory (in percents, default: 5)
  -p <nm_desc>       : Define a Network Module
  -s <nm_nio>        : Bind a Network IO interface to a Network Module

Options specific to the Cisco 3725 series ("dynamips -P 3725 --help"):

  --iomem-size <val> : IO memory (in percents, default: 5)
  -p <nm_desc>       : Define a Network Module
  -s <nm_nio>        : Bind a Network IO interface to a Network Module

Options specific to the Cisco 3745 series ("dynamips -P 3745 --help"):

  --iomem-size <val> : IO memory (in percents, default: 5)
  -p <nm_desc>       : Define a Network Module
  -s <nm_nio>        : Bind a Network IO interface to a Network Module



Command Line Options details
****************************

-k <clock_div> :

   Specify the clock divider (integer) based on the host clock.
   Alter the value to match the CISCO clock with the real time.
   The command "show clock" at the IOS' CLI will help you set this value.

--idle-pc <pc> :

   The "idle PC" feature allows you to run a router instance without having
   a 100% CPU load. This implies that you can run a larger number of instances
   per real machine.

   To determine the "idle PC", start normally the emulator with your Cisco IOS
   image, and a totally IOS empty configuration (although not mandatory, this
   will give better results). When the image is fully booted, wait for the
   "Press RETURN to get started!" message prompt, but do not press Enter key.
   Wait about 5 seconds, then press "Ctrl-] + i". Some statistics will be
   gathered during 10 seconds. At the end, the emulator will display a list of
   possible values to pass to the "--idle-pc" option. You may have to try some
   values before finding the good one. To check if the idle PC value is good,
   just boot the Cisco IOS image, and check your CPU load when the console
   prompt is available. If it is low, you have found a good value, keep it
   preciously.

   Important remarks:
   ==================

      * An "idle PC" value is *specific* to a Cisco IOS image. You cannot
        boot a different IOS image without proceeding as described above.

      * Do not run the process while having the "autoconfiguration" prompt.


--exec_area <size> :

   The exec area is a pool of host memory used to store pages translated by
   the JIT (they contain the native code corresponding to MIPS code pages).



Cisco 7200 Port Adapter Description "<pa_desc>":
------------------------------------------------
   Format: slot:pa_driver

   slot: the number of the physical slot (starts from 0)

   pa_driver: the name of a Port Adapter driver in:
        - C7200-IO-FE  (FastEthernet, slot 0 only)
        - PA-FE-TX     (FastEthernet, slots 1 to 6)
        - PA-4E        (Ethernet, 4 ports)
        - PA-8E        (Ethernet, 8 ports)
        - PA-4T+       (Serial, 4 ports)
        - PA-8T        (Serial, 8 ports)
        - PA-A1        (ATM)


Cisco 3600 Network Module Description "<nm_desc>":
--------------------------------------------------
   Format: slot:nm_driver

   slot: the number of the physical slot (starts from 0)

   nm_driver: the name of a Network Module driver in:
        - NM-1E        (Ethernet, 1 port)
        - NM-4E        (Ethernet, 4 ports)
        - NM-1FE-TX    (FastEthernet, 1 port)
        - NM-4T        (Serial, 4 ports)
        - NM-16ESW     (Ethernet switch module, 16 ports)
        - Leopard-2FE  (Cisco 3660 FastEthernet in slot 0, automatically used)


Cisco 2691/3725/3745 Network Module Description "<nm_desc>":
------------------------------------------------------------
   Format: slot:nm_driver

   slot: the number of the physical slot (starts from 0)

   nm_driver: the name of a Network Module driver in:
        - NM-1FE-TX    (FastEthernet, 1 port)
        - NM-4T        (Serial, 4 ports)
        - NM-16ESW     (Ethernet switch module, 16 ports)
        - GT96100-FE   (2 integrated ports, automatically used)


NIO binding to Port Adapter "<pa_nio>" and Network Modules "<nm_nio>":
----------------------------------------------------------------------

   Format: slot:port:netio_type[:netio_parameters]

   slot       : the number of the physical slot (starts from 0)
   port       : the port in the specified slot (starts from 0)

   netio_type : host interface for communication

        unix:<local_sock>:<remote_sock>
           Use unix sockets for local communication.
           <local_sock> is created and represents the local NIC.
           <remote_sock> is the file used by the other interface.
           (ex. "/tmp/local:/tmp/remote")

        vde:<control_sock>:<local_sock>
           For use with UML (User-Mode-Linux) or VDE switches.
           VDE stands for "Virtual Distributed Ethernet".
           Please refer to : http://sourceforge.net/projects/vde/

        tap:<tap_name>
           Use a virtual ethernet device for communication.
           <tap_name> is the name of the tap device (ex. "tap0")

        gen_eth:<dev_name>
           Use a real ethernet device for communication, using libpcap 0.9
           or WinPcap. Works on Windows and Unix systems.          

           <dev_name> is the name of the Ethernet device (ex. "eth0")

           The device list can be found using the "-e" option.

        linux_eth:<dev_name>
           Use a real ethernet device for communication (Linux specific).
           <dev_name> is the name of the Ethernet device (ex. "eth0")

        udp:<local_port>:<remote_host>:<remote_port>
           Use an UDP socket for connection between remote instances.
           <local_port> is the port we listen to.
           <remote_host> is the host listening the port you want to connect to.
           <remote_port> is the port you want to connect to.
       (ex. "1000:somehost:2000" and "2000:otherhost:1000" on the other
           side)

        tcp_cli:<host>:<port>
           Client side of a tcp connection.
           <host> is the ip address of the server.
           <port> is the port to connect to.

        tcp_ser:<port>
           Server side of a tcp connection.
           <port> is the port to listen to.

        null
           Dummy netio (used for testing/debugging), no parameters needed.



VTTY binding to real serial port device "<si_desc>":
----------------------------------------------------

   Format: <device>{:baudrate{:databits{:parity{:stopbits{:hwflow}}}}}}

   device: character device name, e.g. /dev/ttyS0
   baudrate: baudrate
   databits: number of databits.
   parity: data parity: N=none, O=odd, E=even,
   stopbits: number of stop bits
   hwflow: hardware flow control (0=disable, 1=enable)

   Note that the device field is mandatory, however other fields are optional.
   (dynamips will default to 9600, 8, N, 1, no hardware flow control)

   Note that access to the escape commands (described below) through a serial
   port are deliberately prevented, as the escape commands interfere with
   serial encapsulation protocols.


Escape commands
***************

You can press ^] (Ctrl + ]) at any time, followed by one of these characters:

o : Show the VM object list
d : Show the device list
r : Dump MIPS CPU registers
t : Dump MIPS TLB entries
m : Dump the latest memory accesses
s : Suspend CPU emulation
u : Resume CPU emulation
q : Quit the emulator
b : Dump the instruction block tree
h : JIT hash table statistics
l : MTS64 cache statistics
c : Write IOS configuration to disk (ios_cfg.txt)
j : Non-JIT mode statistics
i : Determine an idling pointer counter
x : Experimentations (can crash the box!)
^]: Send ^]

If you press an unrecognized key, help will be shown.

Note: on Windows, it may be the "Ctrl + $" sequence.


Virtual Bridge
**************

The virtual bridge is used to emulate a shared network between emulator
instances.

Any emulator instance can act as a virtual bridge.

The configuration file (specified by the "-b" option) contains a list of
NetIO descriptors, with the following syntax:
 
   interface_name:netio_type[:netio_parameters]

Example:

# Connection to instance "I0"
I0:udp:10000:127.0.0.1:10001

# Connection to instance "I1"
I1:udp:10002:127.0.0.1:10003

# Connection to instance "I2"
I2:udp:10004:127.0.0.1:10005

The "I0" instance would be launched with the following parameters:

   dynamips ios.bin -p 1:PA-FE-TX -s 1:0:udp:10001:127.0.0.1:10000


Virtual Ethernet switch
***********************

The virtual ethernet switch is used to emulate an Ethernet network between
emulator instances. This switch supports access and trunk ports (802.1Q).
ISL will be available in a future release.

Any emulator instance can act as a virtual ethernet switch.

The configuration file (specified by the "-E" option) contains a list of
NetIO descriptors (representing interfaces) and a list of interface properties
(access/trunk port, VLAN info...)

The interface definition is similar to Port Adapters:

   IF:interface_name:netio_type[:netio_parameters]

1) Configuring an Access Port

syntax: ACCESS:interface_name:vlan_id

2) Configuration a 802.1Q Trunk Port

syntax: DOT1Q:interface_name:native_vlan

The native VLAN is not tagged. On Cisco devices, by default the native VLAN
is VLAN 1.

Example of configuration file:

IF:E0:udp:10000:127.0.0.1:10001
IF:E1:udp:10002:127.0.0.1:10003
IF:E2:gen_eth:eth0

DOT1Q:E0:1
ACCESS:E1:4
DOT1Q:E2:1


Virtual ATM switch
******************

The virtual ATM switch fabric is used to emulate an ATM backbone between
emulator instances. The use of this virtual switch is not mandatory, you
can directly connect emulator instances for point-to-point ATM connections.
Please note that only basic VP/VC switching is supported, there is no
support for ILMI/QSAAL/... or other specific ATM protocols.

Any emulator instance can act as a virtual ATM switch.

Example of configuration file (specified by the "-a" option):

# Virtual Interface List
IF:A0:udp:10001:127.0.0.1:10000
IF:A1:udp:10002:127.0.0.1:10003
IF:A2:udp:10004:127.0.0.1:10005

# VP connection between I0 and I1
VP:A0:10:A1:20
VP:A1:20:A0:10

# VP connection between I0 and I2
VP:A0:11:A2:30
VP:A2:30:A0:11

# VC connection between I1 and I2
VC:A1:5:2:A2:7:3
VC:A2:7:3:A1:5:2

In this example, we have 3 virtual interfaces, A0, A1 and A2. The syntax
for interface definition is similar to Port Adapters:

   IF:interface_name:netio_type[:netio_parameters]

You can do VP switching or VC switching:

1) VP switching

syntax: VP:input_if:input_vpi:output_if:output_vpi

2) VC switching

syntax: VC:input_if:input_vpi:input_vci:output_if:output_vpi:output_vci


Testing the Virtual ATM switch with one dynamips instance
*********************************************************
(Contribution of Mtv Europe)

Virtual ATM switch configuration file ("atm.cfg"):

IF:A0:udp:10003:127.0.0.1:10001
IF:A1:udp:10004:127.0.0.1:10002                                                
# a0/vpi=1/vci=100 connects to a1/vpi=2/vci=200
VC:A0:1:100:A1:2:200                                                           
VC:A1:2:200:A0:1:100

Invoking dynamips:

./dynamips -p 1:PA-A1 -s 1:0:udp:10001:127.0.0.1:10003 \
           -p 2:PA-A1 -s 2:0:udp:10002:127.0.0.1:10004 \
           -a atm.cfg IOS.BIN

(note input ports of IOS interfaces are output ports of ATM switch
interfaces, and vice versa).

IOS configuration:

ip cef
ip vrf test
 rd 1:1
 route-target both 1:1
int a1/0
 no shut
int a1/0.2 p
 ip addr 1.1.1.1 255.255.255.0
 pvc 1/100
interface a2/0
 no shut
interface a2/0.2 p
 ip vrf forwarding test
 ip addr 1.1.1.2 255.255.255.0
 pvc 2/200
!

# ping 1.1.1.2
!!!!!


Virtual Frame-Relay switch
**************************

The virtual Frame-Relay switch fabric is used to emulate a Frame-Relay
backbone between emulator instances. The use of this virtual switch is not
mandatory, you can directly connect emulator instances with appropriate IOS
configuration.

Any emulator instance can act as a virtual Frame-Relay switch.

There is only a basic implementation of the LMI protocol (ANSI Annex D), which
is probably not conforming but works with Cisco IOS. Fortunately, Cisco IOS
is able to detect automatically the LMI protocol.

Example of configuration file (specified by the "-f" option):

# Virtual Interface List
IF:S0:udp:10001:127.0.0.1:10000
IF:S1:udp:10002:127.0.0.1:10003

# DLCI switching between S0 and S1
VC:S0:200:S1:100
VC:S1:100:S0:200

In this example, we have 2 virtual interfaces, S0 and S1. The syntax
for interface definition is similar to Port Adapters:

   IF:interface_name:netio_type[:netio_parameters]

DLCI switching syntax:

   VC:input_if:input_dlci:output_if:output_dlci

In the example above, the switch is configured to switch packets
received on interface S0 with DLCI 200 to interface S1 with DLCI 100,
and vice-versa.

== EOF ==