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

上传人:tbuqq 文档编号:4741558 上传时间:2019-12-05 格式:PDF 页数:12 大小:121.14KB
返回 下载 相关 举报
Quagga路由软件安装与命令行结构分析.pdf_第1页
第1页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Quagga路由软件安装与命令行结构分析.pdf》由会员分享,可在线阅读,更多相关《Quagga路由软件安装与命令行结构分析.pdf(12页珍藏版)》请在三一文库上搜索。

1、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 客户端包括:Os

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

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

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

6、u:/# apt-get install g+ C. quagga 解压代码放在 /mnt/hgfs/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=ro

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

8、erl checking for tputs in -ltermcap. no checking for 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 软件包是否安装是否安装 ncurs

9、es 安装包是否安装 libncursesw-dev 或 libncursesw5-de 软件包(四) 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 的核心守护进

10、程 root/mnt/hgfs/linuxshare/quagga-0.99.16# Zebra d 注: a) 说明 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 l

11、ibzebra.so - libzebra.so.0.0.0 lrwxrwxrwx 1 root root libzebra.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 fil

12、e /usr/local/etc/zebra.conf: Permission denied cant open 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/linuxsh

13、are/quagga-0.99.16# vtysh 接着 进入 guagga 的 shell 界面:Hello, this is 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_ENA

14、BLE_NODE 。 ENABLE_NODE cmd_element .。 quagga osp6d CONFIG_NODE 。(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; /* nu

15、mber of active slots */ unsigned int alloced; /* number of allocated 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 c

16、haracter at vty interface. */ int vtysh; /* Is this nodes configuration 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 interf

17、ace. */ VIEW_NODE, /* View node. Default mode of vty interface. */ AUTH_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 )

18、 cmdvec 数据结构中)(例: install_node () void install_node (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 结构,以

19、存放(cmd_element) 现逐层分析: cmd_element a) cmd_element 数据结构struct 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 b

20、elong. */ vector strvec; /* Pointing out each description vector. */ 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 数据结构中)(例: i

21、nstall_element (VIEW_NODE, ) void install_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“, nt

22、ype); exit (1); vector_set (cnode-cmd_vector, 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 存放在 st

23、rvec ,其逻辑结构为active active *cmd alloced active *str 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

24、 permits set operationsn“ “sequence to insert to/delete from existing 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: W

25、ORD *str: route map tag active (2) *cmd: deny alloced(2) *str: route 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|perm

26、it) 中 cmdsize=4 cmd 的 定义(是通过宏来实现的)a) 宏的数据结构#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) 注释: funcname: 命令的函数名cmdname: 命令名字 cmdstr: 命令字符串helpstr: 帮助信息 声明添加命令 的执行函数static int fun

27、cname (struct cmd_element *, struct vty *, int, const char *); 给 cmdname 赋值 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_

28、(unused), int argc _attribute_ (unused), const char *argv _attribute_ (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 starti

29、ng 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; 替换相应宏的结果为: static int config_hostname (struct cmd_element *, struct vty *, int, const char *); struct cmd_element hostname_cmd = .string =

30、 hostname WORD, .func = config_hostname, .doc =Set systems network namenThis 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_ (

31、unused) ) if (!isalpha(int) *argv0) vty_out (vty, “Please specify string starting 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, h

32、elpstr) 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) (三) 在

33、vtysh(shell) 下命令的执 行 A. 在运行 quagga 开始,程序执行Vtysh_main (); 程 序初始化后,最终在while (vtysh_rl_gets () vtysh_execute (line_read); 死循环,等待命令的输入。 注释:等待 readline 函数传递输入的命令并传递给 line_read = readline (vtysh_prompt (); 如没有数据输入就 在此处等待vtysh_execute (line_read);的结构展开主要 为: cmd_execute_command (vline, vty, vtysh_execute_fu

34、nc (line, 1) vline = cmd_make_strvec (line); B. 程序把输入的命令传到给cmd_make_strvec (line) 函数,此函数功能是把输入进来的命令的每一部分分别存 放在 vector 的数据结构中,并返回其地址。 cmd_execute_command_real cmd_execute_command (vline, vty, cmd); (vline, vty, cmd_vector=vector_copy (cmd_node_vector (cmdvec, vty-node); 功能:把当前 节点的 cmd_node 数据结构赋值给cmd

35、_vector match = cmd_filter_by_completion (command, cmd_vector, index); 功能:把 cmd_vector 节点下的所有cmd_element 遍历一 遍,找到与command 相匹 配的命令如果不匹配直接把 cmd_element 从 cmd_vector 中删掉if (!matched) vector_slot (v, i) = NULL; ret = is_cmd_ambiguous (command, cmd_vector, index, match); 功能:进一步对部 分匹配所有cmd_element 中的cmd 两两比较,若比较结 果相同继续比较,若出错,直接返回报错处理。for (i = 0; i = cmd_element-cmdsize) matched_element = cmd_element; matched_count+; else incomplete_count+; 功能:找到vline 与 cmd_elemen 相匹配的的cmd

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1