Linux下路由器的配置之四

TC的使用实例说明
下面我们提供一个利用TC来实现对在一个Linux服务器上的两个虚拟主机实行不同的带宽策略的例子 。在该例中,我们将讲述如何配置和测试TC 。
编译内核
至于如何编译一个新的内核已经不属于本章节讨论的范围,我们假设你已经知道如何重新编译一个内核 。
编译内核时将以下几个内核选项选中:"kernel/User netlink socket"和"Netlink device emulation" 。这样TC就可以利用netlink来与内核传送信息 。同时将所有的排队算法选上,位于包括
"Fair queueing"
"CBQ packet scheduler"
"CSZ packet scheduler"
"the simples PRIO pseudoscheduler"
"RED queue"
"SFQ queue"
"TBF queue"
"QoS support"
"rate estimator"
"packet classifier API"
"routing-tables-based classifier"
"U32 classifier"
"special RSVP classifier and special RSVP classifier for IPv6" 。
选中这些选项以后,按正常的编译内核步骤编译内核,然后安装新内核,并用新内核重新启动系统 。
编译TC软件包
可以在下面的地址下载到我们需要的软件,然后按照软件包里的说明编译它:
ftp://linux.wauug.org/pub/net/ip-routing/iproute2-current.tar.gz
通常我们要做的只是简单的输入make就可以了 。
TC 的设定
图1. CBQ 树图
图一是我们将配置的一个系统的简单的树形图示范 。两个叶子节点从父节点分配带宽,IP地址10.0.0.10(标识符1:1)和地址10.0.0.11(标识符1:2)是接口eth0上的IP别名,它们共同分享父节点(标识符1:0)的带宽 。这个例子里面只涉及到了对一个接口上的流量控制,大家可以仿照这个例子构造自己感兴趣的控制多个接口设备的配置 。
配置QoS特性的第一步就是将qdisc加入到一个接口上,例如本例子:
qdisc add dev eth0 root handle 1: ...
然后定义你需要区别的类别 。不同的类别对应不同的流量控制类型 。我们的例子中,使用如下的语句:
tc class add dev eth0 parent 1:0 classid X:Y ...
我们的例子中只使用了一层深的类别树 。当然,我们可以构造多层深度的复杂的树,基本的原则是一样的:就是一个子节点(如图1所示)继承一个父节点的资源同时进一步根据类的定义去分配父节点的资源 。例如,父类1:0拥有该设备的全部带宽,那么子节点1:1不可能获得超过10Mbits的带宽,当然本例子中是限制为1Mbps 。
最后定义"IP分组--类别"的映射规则,用来告诉系统的分类器,经过路由器调度的某IP分组该对应什么类型 。首先,将一个分类器与输出接口关联起来:
filter add dev eth0 parent 1:0 protocol ip ...
然后,定义"IP分组--类别"的映射规则 。本例子中,将利用IP分组的源地址来作为分类的关键词 。下面的脚本完成了这个功能 。关于脚本中TC等命令的参数,大家可以参考随机的文档,这里限于篇幅,不做介绍了 。
#! /bin/sh
#path to tc and the ip utilities;
#change to reflect yours.
TC=./iproute2/tc/tc
IP=./iproute2/ip/ip
##################################################
#Addresses to be aliased
#change;or;add more to reflect yours
#
ALIAS1=10.0.0.10
ALIAS2=10.0.0.11
##################################################
# add ip aliasing support
#uncomment if you want to use the ip utility to
#add ip-aliasing for you
#
#$IP addr add $ALIAS1 dev eth0
#$IP addr add $ALIAS2 dev eth0
##################################################
# Attaching a device queue discipline to an
# interface a device queue discipline is
# equivalent almost to a device manager
#
#Attach CBQ to eth0

推荐阅读