FRR7.2之后的版本,增加了sysrepo对其的管理,最新版本已对支持到bfd,bgp协议管理,是越来越完善。有兴趣的伙伴可以参阅frr最新代码https://github.com/FRRouting/frr.git。主要还是聊聊frr是如何支持sysrepo对不同协议的管理的。简单画一个FRR的逻辑层次图,支持sysrepo模式是在FRR原来的基础上扩展通过netconf协议下发XML命令的功能。VTY_CLI模式是单机管理模式,XML模式是跨平台,跨网络的统一管理模式。这点对于SDN网络,这点就特别重要,通过支持的netconf协议将路由的配置下发不同的网元节点上。支持sysrepo的实现,是增加了一种网元设备的管理方法。
图1 FRR简易逻辑层次图
1 sysrepo集成编译
源码下载后,接FRR的说明文档安装各类依赖包:
本地直接安装模式:
1、./bootstrap.sh
2、./configure \
--bindir=/usr/bin \
--sbindir=/usr/lib/frr \
--sysconfdir=/etc/frr \
--libdir=/usr/lib/frr \
--libexecdir=/usr/lib/frr \
--localstatedir=/var/run/frr \
--with-moduledir=/usr/lib/frr/modules \
--enable-snmp=agentx \
--enable-multipath=64 \
--enable-user=frr \
--enable-group=frr \
--enable-vty-group=frrvty \
--enable-systemd=yes \
--disable-exampledir \
--disable-ldpd \
--enable-fpm \
--enable-sysrepo \ //划重点,必须带上“--enable-sysrepo”,否则未实现sysrepo的集成
--with-pkg-git-version \
--with-pkg-extra-version=-fump \
SPHINXBUILD=/usr/bin/sphinx-build
3、make
4、make check
5、sudo make install
RPM包安装模式:
修改{$frr}\redhat\frr.spec.in文件,关键之处添加“--enable-sysrepo”,请参考:
增加如下编译选项,应该都能看懂在哪添加,不详细指出位置
%{!?with_sysrepo: %global with_sysrepo 1 }
%if %{with_sysrepo}
--enable-sysrepo \
%else
--disable-sysrepo \
%endif
%if %{with_sysrepo}
%{_libdir}/frr/modules/sysrepo.so
%endif
接官方文档步骤参考编译,简单写了一个一健编译的方法,可以参考
#!/usr/bin/env bash
#
# frr rpm build script
#
# PROVIDE: fump
##
if [ "$1" == "clean" ]
then
echo "clean frr"
make clean
exit 1
elif [ "$1" == "build" ]
then
echo "build frr rpm"
rm -fr frr-*.rpm
./bootstrap.sh
./configure --with-pkg-extra-version=-fump
make dist
LOCAL_LC_TIME=$LC_TIME
export LC_TIME="en_US.UTF-8"
FRRVERSION=frr-7.5-fump
mkdir -p rpms/{BUILD,RPMS,SOURCES,SPECS,SRPMS,tmp}
mv frr-7.5-dev-fump.tar.gz rpms/SOURCES
sed -e '7d' redhat/frr.spec > rpms/SPECS/frr.spec
rpmbuild --ba rpms/SPECS/frr.spec --define "_topdir `pwd`/rpms"
mv rpms/RPMS/x86_64/frr-*.rpm .
rm -fr rpms/
export LC_TIME=$LOCAL_LC_TIME
else
echo "Usage: ./rpm.sh clean or ./rpm.sh build"
exit 1
fi
Deb包的编译类似,修改编译rule, {$frr}\debian\rules,再按步骤编译生成deb包。
加载frr相应库到sysrepo后启动进程,其中加载的脚本实现
#!/bin/bash
#
# frr sysrepo-yang module auto-install script
#
# PROVIDE: fump
##
set -eu -o pipefail
shopt -s failglob
OPER=$1
MODNAME=$2
: ${SYSREPOCTL:=sysrepoctl}
: ${SYSREPOCTL_ROOT_PERMS:=-o root:root -p 666}
: ${YANG_DIR:=/lib/frr/yang}
echo "$OPER, $MODNAME"
is_yang_module_installed() {
module=$1
module_name=${module%%@*}
$SYSREPOCTL -l | grep --count "$module_name" > /dev/null
}
#install
if [ "$OPER" == "install" ]
then
if ! is_yang_module_installed $MODNAME; then
echo "- Installing module $MODNAME ..."
$SYSREPOCTL -i -g ${YANG_DIR}/$MODNAME.yang $SYSREPOCTL_ROOT_PERMS
else
echo "- Module $MODNAME already installed."
fi
elif [ "$OPER" == "uninstall" ]
then
if ! is_yang_module_installed $MODNAME; then
echo "- Module $MODNAME has not installed."
else
echo "- Uninstalling module $MODNAME ..."
$SYSREPOCTL -u --module=$MODNAME
fi
else
echo "Usage $0 <sysrepoctl-path> <install or uninstall> <module-name>"
frr-bgp y入sysrepo库 ./setup.sh install frr-bgp
从sysrepo中卸载frr-interface库: ./setup.sh uninstall frr-interface
完成入库后,启动bgpd进程,通过-M 可选参数将sysrepo模块加载并启动bgp进程。
/usr/lib/frr/bgpd -d -M sysrepo:/usr/lib64/frr/modules/ --log-level debugging
完成启动后,就有两种模式可配置bgp咯。
本章只是简单如何在frr中使用集成sysrepo,接下来一章,分析frr是怎么实现sysrepo功能.