1. 程式人生 > 其它 >第六章 frr整合sysrepo概述

第六章 frr整合sysrepo概述

技術標籤:# Sysrepo-1.4.2原始碼解讀

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=-ctyun \
 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 uninstallfrr-interface

完成入庫後,啟動bgpd程序,通過-M 可選引數將sysrepo模組載入並啟動bgp程序。

/usr/lib/frr/bgpd -d -M sysrepo:/usr/lib64/frr/modules/ --log-level debugging

完成啟動後,就有兩種模式可配置bgp咯。

本章只是簡單如何在frr中使用整合sysrepo,接下來一章,分析frr是怎麼實現sysrepo功能.