ImageVerifierCode 换一换
格式:DOCX , 页数:6 ,大小:20.53KB ,
资源ID:25823715      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25823715.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Quagga路由软件安装与命令行结构分析.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Quagga路由软件安装与命令行结构分析.docx

1、Quagga路由软件安装与命令行结构分析Quagga 路由软件安装与命令行结构分析 一Quagga 简介 Quagga 是一个路由软件套件,它提供了路由协议的TCP / IP 的路由支持服务,如RIPv1, RIPv2 的,RIPng,OSPFv2,OSPFv3,BGP - 4 的,和BGP 4。此外本软件除了支持IPv4 路由协议外,还支持IPv6 路由协议。Quagga 是GNU Zebra(由Kunihiro Ishiguro 开发)的一 个分支。 二 Quagga 基本结构 quagga 主要由bgpd、ripd、ripngd、ospfd、ospf6d、vtysh 等几个服务(这些服务

2、的名称被建 立之后,被挂上 Linux 使用时,通常在服务的名称之后会加上一个 d,这也就是 daemon 的 命名规则),根据实际需要我们选用相应的服务。但quagga 中Vtysh(也就是quagga 的shell) 是实现每个daemon 的集合。 Quagga 包含一个核心守护进程zebra,它作为Unix 底层核心的一个抽象层,表示为linux 上 的一些Zserv API 或Linux Quagga 客户端的TCP 流。这些Linux Quagga 客户端实现路由协 议并和zebra 守护程序交换路由更新信息。其中Zserv 客户端包括: Ospfd(实现OSPFv2)ripd(实

3、现RIPv1 和RIPv2)ospf6d(实现OSPFv3(IPv6) Ripngd(实现RIPv3(IPv6)Bgpd(实现BGP4+(包括对组播地址族和IPv6 地址族的支持) 注: 【1】daemon Unix 的术语,指一种在后台执行的程序。网络的服务器功能也多为后台程序,一种没有被显式激活,但处 于休眠状态,等待某种条件满足的程序。守护程序,无交互后台程序,UNIX 端口监督程序; 【2】 Zebra Zebra 是一个开源的 TCP/IP 路由软件,同 Cisco Internet 网络操作系统(IOS)类似。它灵活而且具有强 大的功能,可以处理路由信息协议(RIP)、开放式最短路

4、径优先协议(OSPF)和(BGP)边界网关协议以 及这些协议的所有变体。zebra 守护进程是实际的路由管理者,控制着其他模块;而且用户主要通过它进 行交互。我们最先需要配置 Zebra 守护进程。 启动某一服务则: 服务名 -d (例如:ripd -d) 三 任务要求 1. ubuntu 下guagga 软件的安装 2. 熟悉使用guagga 软件 四 详细阐述 1. buntu 下quagga 软件的安装 (一) 安装环境 A. 硬件环境:Windows xp B. 软件环境:虚拟机 ubuntu10.04 C. 安装路由软件quagga-0.99.16 (二) quagga 虚拟机与wi

5、ndows 下共享文件 A. 在虚拟机安装好后,在windows 下的某一一盘符(例如d)内建一个共享文 件夹,把guagga 源文件拷到共享文件夹(例如命名为linuxshare)里并解压。 B. 在虚拟机主界面选择option 选项中的sharefolders 中,按照提示设置共享文 件路径(例d:linuxshare)。 (三) quagga 配置 A. 打开终端并以root 用户进入 B. 安装guagga 时要用到g+,ubuntu10.04 没有安装须下载安装此软件包 rootubuntu:/# apt-get install g+ C. quagga 解压代码放在/mnt/hgf

6、s/linuxshare/ rootubuntu:/# cd /mnt/hgfs/linuxshare/quagga-0.99.16 D. root/mnt/hgfs/linuxshare/quagga-0.99.16#./configure -disable-ripd -disable-ripngd -disable-ospfd -disable-ospf6d -disable-watchquagga -disable-doc -enable-user=root -enable-group=root -enable-zebra -enable-vtysh 注: ./configure 是用来

7、检测你的安装平台的目标特征的(比如它会检查是否有编辑器、函数库, CC 或GCC 等等),并根据配置信息生产相应的makefile,它是个shell 脚本。 ./configure h 输入此命令会一一列出当前配置环境所有配置选项 此输入选项含义为, 启用相应服务程序,并对不用的服务程序进行关闭,其中 -enable-user=root -enable-group=root 是限定quagg 软件的使用权限。 配置时易出现如下错误: checking for perl. /usr/bin/perl checking for tputs in -ltermcap. no checking for

8、 tputs in -ltinfo. no checking for tputs in -lcurses. no checking for tputs in -lncurses. no checking for main in -lreadline. no configure: error: vtysh needs libreadline but was not found and usable on your system 解决方法: 看readline 软件包是否安装 是否安装ncurses 安装包 是否安装libncursesw-dev 或libncursesw5-de 软件包 (四)

9、quagga 编译 root/mnt/hgfs/linuxshare/quagga-0.99.16#make 注: make 是用编译命令,它从Makefile 中读取信息(呼叫原始码、函数库、编辑器) 进行编译。 (五) quagga 安装 root/mnt/hgfs/linuxshare/quagga-0.99.16#make install 注: make install 是安装命令,它也从Makefile 中读取指令,安装到指定的位置。 (六) 启动quagga 的核心守护进程 root/mnt/hgfs/linuxshare/quagga-0.99.16# Zebra d 注: a)

10、 说明quagga 相应服务程序已经运行,只要是虚拟机的不重启或 卸载(make uninstall), 他都会在后台运行。 b) 可能有以下错误: - zebra: error while loading shared libraries: libzebra.so.0: cannot open shared object file: No such file or directory 解决方法: 在/usr/local/lib 下有 lrwxrwxrwx 1 root root libzebra.so - libzebra.so.0.0.0 lrwxrwxrwx 1 root root li

11、bzebra.so.0 - libzebra.so.0.0.0 -rwxr-xr-x 1 root root libzebra.so.0.0.0 这可能是由于/lib 库出现问题:则 rootubuntu:/usr/local/lib# cp libzebra.* /lib rootubuntu:/usr/local/lib# rm libzebra.* Starting zebra. vty_read_config: failed to open configuration file /usr/local/etc/zebra.conf: Permission denied cant open

12、 configuration file /usr/local/etc/quagga/zebra.conf 解决方法: 可以看到/usr/local/etc/没有zebra.conf(它是存放zebra 相关用户,密码信息等),但 有zebra.conf.sample rootubuntu:/usr/local/etc# cp zebra.conf.sample zebra.conf (七) 执行quagga 的shell 程序 root/mnt/hgfs/linuxshare/quagga-0.99.16# vtysh 接着进入guagga 的shell 界面: Hello, this is

13、Quagga (version 0.99.16). Copyright 1996-2005 Kunihiro Ishiguro, et al. ubuntu# 注: 在相应 quagga 相应服务启动之后,输入 vtysh 作用就是通过相应界面,输入命令行控制后台执行的 相应操作。 2. 熟悉使用quagga 软件 (一) quagga 软件命令行部分结构 ripd AUTH_NODE, VIEW_NODE, cmd_element cmd ospd AUTH_ENABLE_NODE 。 ENABLE_NODE cmd_element .。 quagga osp6d CONFIG_NODE 。

14、 (zebra) 。 cmd_element cmd ripngd 。 HIDDENDEBUG_NODE, bgpd VTY_NODE Vtysh 是quagga 软件的一个shell,所有命令行由此输入执行。 以上_NODE、cmd_element、cmd 是层层嵌套,储存在结构体struct _vector 中 数据结构如下: /* struct for vector */ struct _vector unsigned int active; /* number of active slots */ unsigned int alloced; /* number of allocated

15、 slot */ void *index; /* index to data */ ; typedef struct _vector *vector; 注释:此处二级指针index 指向cmd_element 和vecto 数据结构。 现逐层分析: _NODE a) _NODE 数据结构 struct cmd_node enum node_type node; /* Node index. */ const char *prompt; /* Prompt character at vty interface. */ int vtysh; /* Is this nodes configurati

16、on goes to vtysh ? */ int (*func) (struct vty *); /* Nodes configuration write function */ vector cmd_vector; /* Vector of this nodes command list. */ ; b) _NODE 定义枚举类型、 enum node_type AUTH_NODE, /* Authentication mode of vty interface. */ VIEW_NODE, /* View node. Default mode of vty interface. */ A

17、UTH_ENABLE_NODE, /* Authentication mode for change enable. */ ENABLE_NODE, /* Enable node. c) _NODE 赋初值(以view_node 为例) static struct cmd_node view_node = VIEW_NODE, %s , ; vector cmdvec = NULL; d) _NODE 初始化(把节点都放到(struct _vector) cmdvec 数据结构中) (例: install_node (&view_node, NULL);) void install_node

18、(struct cmd_node *node, int (*func) (struct vty *) vector_set_index (cmdvec, node-node, node); node-func = func; node-cmd_vector = vector_init (VECTOR_MIN_SIZE); 注释: /把node 节点存放cmdvec 的index node-func = func; /为node 下cmd_vector 分配vector 结构,以存放(cmd_element) 现逐层分析:cmd_element a) cmd_element 数据结构 struc

19、t cmd_element const char *string; /* Command specification by string. */ int (*func) (struct cmd_element *, struct vty *, int, const char *); const char *doc; /* Documentation of this command. */ int daemon; /* Daemon to which this command belong. */ vector strvec; /* Pointing out each description v

20、ector. */ unsigned int cmdsize; /* Command index count. */ char *config; /* Configuration string */ vector subconfig; /* Sub configuration string */ u_char attr; /* Command attributes */ ; b) cmd_element 初始化(把cmd_element 放到_NODE 数据结构中) (例: install_element (VIEW_NODE, &config_list_cmd);) void install

21、_element (enum node_type ntype, struct cmd_element *cmd) struct cmd_node *cnode; if (!cmdvec) /* cmd_init hasnt been called */ return; cnode = vector_slot (cmdvec, ntype); if (cnode = NULL) fprintf (stderr, Command node %d doesnt exist, please check itn, ntype); exit (1); vector_set (cnode-cmd_vecto

22、r, cmd); if (cmd-strvec = NULL) cmd-strvec = cmd_make_descvec (cmd-string, cmd-doc); cmd-cmdsize = cmd_cmdsize (cmd-strvec); 注释:从cmdvec 中把ntype 类型节点对应的index 找到 把cmd 存放到cnode 的cmd_vector 中 md_make_descvec (cmd-string, cmd-doc) 作用就是把string 和doc 存放在strvec,其逻辑 结构为 active active *cmd alloced active *str

23、strvec alloced *index alloced *index *cmd *str *index active alloced *index 举例: cmd-string 为:route-map WORD (deny|permit) cmd -doc 为:create route-map or enter route-map command moden route map tagn route map denies set operationsn route map permits set operationsn sequence to insert to/delete from e

24、xisting route-map entryn 执行md_make_descvec (cmd-string, cmd-doc)函数后:active=4 active (1) alloced (1) *cmd: route-map active(4) *index *str:create route-map or enter route-map strve alloced(=4) active (1) alloced(1) *index *index *cmd: WORD *str: route map tag active (2) *cmd: deny alloced(2) *str: ro

25、ute map denies set operations *index *cmd: permit *str: route map permits set operations active (1) alloced (1) *index *cmd: *str: sequence to insert to/delete from existing route-map entry cmdsize 表示cmd 的大小,route-map WORD (deny|permit) 中cmdsize=4 cmd 的定义(是通过宏来实现的) a) 宏的数据结构 #define DEFUN(funcname,

26、cmdname, cmdstr, helpstr) DEFUN_CMD_FUNC_DECL(funcname) DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0) DEFUN_CMD_FUNC_TEXT(funcname) 注释:funcname: 命令的函数名 cmdname: 命令名字 cmdstr: 命令字符串 helpstr: 帮助信息 声明添加命令的执行函数 static int funcname (struct cmd_element *, struct vty *, int, const char *); 给cm

27、dname 赋值 struct cmd_element cmdname = .string = cmdstr, .func = funcname, .doc = helpstr, .attr = attrs, .daemon = dnum, ; 给出命令函数名及函数参数 static int funcname ( struct cmd_element *self _attribute_ (unused), struct vty *vty _attribute_ (unused), int argc _attribute_ (unused), const char *argv _attribut

28、e_ (unused) ) b) 应用举例: /* Hostname configuration */ DEFUN (config_hostname, hostname_cmd, hostname WORD, Set systems network namen This systems network namen) if (!isalpha(int) *argv0) vty_out (vty, Please specify string starting with alphabet%s, VTY_NEWLINE); return CMD_WARNING; if (host.name) XFRE

29、E (MTYPE_HOST, host.name); host.name = XSTRDUP (MTYPE_HOST, argv0); return CMD_SUCCESS; 替换相应宏的结果为: static int config_hostname (struct cmd_element *, struct vty *, int, const char *); struct cmd_element hostname_cmd = .string = hostname WORD, .func = config_hostname, .doc =Set systems network namenTh

30、is systems network namen, .attr = 0, .daemon = 0, ; static int config_hostname (struct cmd_element *self _attribute_ (unused), struct vty *vty _attribute_ (unused), int argc _attribute_ (unused), const char *argv _attribute_ (unused) ) if (!isalpha(int) *argv0) vty_out (vty, Please specify string st

31、arting with alphabet%s, VTY_NEWLINE); return CMD_WARNING; if (host.name) XFREE (MTYPE_HOST, host.name); host.name = XSTRDUP (MTYPE_HOST, argv0); return CMD_SUCCESS; (二) 添加命令行 1. 定义命令 #define DEFUN(funcname, cmdname, cmdstr, helpstr) DEFUN_CMD_FUNC_DECL(funcname) DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0) DEFUN_CMD_FUNC_TEXT(funcname) 2. 命令初始化 添加命令的节点 void install_node (struct cmd_node *node, int (*func) (struct vty *) 添加命令到指定的节点 void install_element (enum node_type ntype, struct cmd_element *cmd) (三) 在vtysh(shell)下命令的执行 A. 在运行quagga 开始,程序执行Vtysh_main(); 程序初始化后,最终在

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1