FRR编译安装打包及配置

  本文基于官方文档进行编译安装,采用CentOS7操作系统,其中部分爬坑过程在此记录一下,本文最新状态可点击查看源站文章链接

  • frr源码打包

  如果需要给frr打包rpm,可以参看官方文档Packaging Red Hat

  • frr二进制包直接安装

  如果读者需要直接采用rpm包安装,可以参看frr Release地址,直接下载rpm包,或者通过添加源来安装。

# possible values for FRRVER: frr-6 frr-7 frr-stable
# frr-stable will be the latest official stable release
FRRVER="frr-stable"
# add RPM repository on CentOS 6
curl -O https://rpm.frrouting.org/repo/$FRRVER-repo-1-0.el6.noarch.rpm
sudo yum install ./$FRRVER*
# add RPM repository on CentOS 7
curl -O https://rpm.frrouting.org/repo/$FRRVER-repo-1-0.el7.noarch.rpm
sudo yum install ./$FRRVER*
# add RPM repository on CentOS 8
curl -O https://rpm.frrouting.org/repo/$FRRVER-repo-1-0.el8.noarch.rpm
sudo yum install ./$FRRVER*
# install FRR
sudo yum install frr frr-pythontools

1. 编译安装问题排查

  1. 本文采用CentOS7 默认Git版本为1.8,版本过早,导致编译之前一些依赖无法安装,报错如下图和代码。解决方法是升级Git版本。升级方法可参看文章https://turbock79.cn/?p=165


此时用make/make install,出现如下报错;

error: unknown option `first-parent'
用法:git describe [选项] <提交号>*
  1. 需要安装libjson-c

  如果报错如下

CLIPPY   bgpd/bgp_debug_clippy.c
lib/clippy: error while loading shared libraries: libjson-c.so.5: cannot open shared object file: No such file or directory

  解决方法

  • 读者可以尝试yum install libjson-c-devel json-c-devel.x86_64解决问题

  • 本文采用源码安装,读者可参看文章https://turbock79.cn/?p=1923.

#libjson-c安装路径/usr/local/lib64添加到环境变量
find / -name "libjson-c.so.5"
/usr/local/lib64/libjson-c.so.5
echo "/usr/local/lib64" >> /etc/ld.so.conf
ldconfig

  读者可以参考该篇文章error while loading shared libraries: xxx.so.x"错误的原因和解决办法

  1. systemd以及readline开发环境依赖
#报错如下:
configure: error: enable systemd has been specified but systemd development env not found on your system
#解决方法:需要安装systemd的开发依赖
yum install systemd-devel

#报错如下:
configure: error: libreadline (needed for vtysh) not found and/or missing dependencies
#解决方法:需要安装readline和其开发依赖库,可以通过yum search readline搜索相应库
yum install readline readline-devel.x86_64
  1. 需要安装libyang库

  FRR依赖libyang库提供YANG/NETCONF的支持。用户可以采用rpm包安装和源码安装两种方式安装libyang;读者可在官方安装文档中根据不同操作系统搜索libyang,然后寻找相应的安装包建议。例如centos的rpm包下载路径是https://ci1.netdef.org/browse/LIBYANG-LY1REL-CENTOS7AMD64-4/artifact

  1. 官方文档http://docs.frrouting.org/projects/dev-guide/en/latest/building-frr-for-centos7.html ,其中可能安装frr服务和初始化文件存在问题。无法找到路径redhat/frr.service中文件,现在已转移到tools目录下面。同时没有frr.init文件生成,此处可忽略。

  2. 启动服务后,可以动态启动其中插件

  修改文件/etc/frr/daemons。例如启动bgpd则修改如下图,然后通过命令service frr reload热加载配置。通过netstat -tunlp| grep bgpd可以查看是否开启bgp守护进程。

2. FRR下载编译及安装

  整篇安装文章可以参看官方文档http://docs.frrouting.org/en/latest/setup.html

  • 构建
git clone https://github.com/frrouting/frr.git frr
cd frr

# CentOS7安装依赖项,打包还需安装rpm-build net-snmp-devel pam-devel python3-sphinx
yum install -y git autoconf automake libtool make systemd-devel
yum install -y readline readline-devel texinfo net-snmp-devel groff
yum install -y net-snmp-devel pkgconfig json-c-devel pam-devel bison flex pytest
yum install -y c-ares-devel systemd-devel libcap-devel
yum install -y python3 python3-devel python3-sphinx
# CentOS8根据情况,安装如下
dnf --enablerepo=PowerTools install json-c-devel texinfo python3-sphinx

# 增加用户组和用户
sudo groupadd -g 92 frr
sudo groupadd -r -g 85 frrvty
sudo useradd -u 92 -g 92 -M -r -G frrvty -s /sbin/nologin \
  -c "FRR FRRouting suite" -d /var/run/frr frr

#根据configure.ac实现配置依赖检查,生成configure文件
./bootstrap.sh #根据版本,可有可无.若无该文件并编译报错,尝试运行命令autoreconf -i。

#执行./configure,生成Makefile文件,这里makefile.am是链接其他编译模块的重点
./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 \
    --with-pkg-git-version \
    --with-pkg-extra-version=-MyOwnFRRVersion \
    SPHINXBUILD=/usr/bin/sphinx-build

make
#make check (可选)
sudo make install

#make install命令之后
#sudo find . -name frr.service (可选)
# 安装该frr.service到系统服务
install -p -m 644 ./tools/frr.service /usr/lib/systemd/system/frr.service
# 注册该文件
sudo systemctl preset frr.service
#sudo cp ./tools/frr.service /etc/systemd/system/frr.service

  在编译的过程中,configure.ac定义了检查当前系统环境,并配置各种(包含第三方)依赖项检查和相关函数,通过./bootstrap.sh运行autoreconf,并将根据configure.ac参数生成configure脚本文件;然后运行该脚本文件configure,并结合makefile.am生成我们熟知的Makefile文件。在makefile里面定义了编译当前项目需要的源码文件以及各种依赖头文件,编译输出等等。
参考文档http://docs.frrouting.org/projects/dev-guide/en/latest/building-frr-for-centos7.html#install-required-packages

  • 打包
# 1.make distribution tar.gz
./bootstrap.sh
./configure --with-pkg-extra-version=-MyRPMVersion
make dist
# 2.Create RPM directory structure and populate with sources
mkdir rpmbuild
mkdir rpmbuild/SOURCES
mkdir rpmbuild/SPECS
cp redhat/*.spec rpmbuild/SPECS/
cp frr*.tar.gz rpmbuild/SOURCES/
# 3.Edit rpmbuild/SPECS/frr.spec with configuration as needed.
# 4.Build the RPM
rpmbuild --define "_topdir `pwd`/rpmbuild" -ba rpmbuild/SPECS/frr.spec
#构建完文件位于rpmbuild/RPMS

3. FRR配置文件及权限

#./configure命令之后
mkdir -p /etc/frr
sudo chmod -R 777 /etc/frr
mkdir -p /var/run/frr
sudo chmod -R 777 /var/run/frr

sudo mkdir /var/log/frr
sudo mkdir /etc/frr
sudo touch /etc/frr/zebra.conf
sudo touch /etc/frr/bgpd.conf
sudo touch /etc/frr/ospfd.conf
sudo touch /etc/frr/ospf6d.conf
sudo touch /etc/frr/isisd.conf
sudo touch /etc/frr/ripd.conf
sudo touch /etc/frr/ripngd.conf
sudo touch /etc/frr/pimd.conf
sudo touch /etc/frr/nhrpd.conf
sudo touch /etc/frr/eigrpd.conf
sudo touch /etc/frr/babeld.conf
sudo chown -R frr:frr /etc/frr/
sudo touch /etc/frr/vtysh.conf
sudo chown frr:frrvty /etc/frr/vtysh.conf
sudo chmod 640 /etc/frr/*.conf

4. 配置文件及修改

sudo install -p -m 644 tools/etc/frr/daemons /etc/frr/
sudo chown frr:frr /etc/frr/daemons

  创建frr默认配置文件/etc/frr/daemon,修改相关配置如下。判断是否开启zebra、bgp等功能;设置watchfrr_enable=... 和zebra=...为yes。查看官方文档http://docs.frrouting.org/en/latest/basic.html#common-invocation-options

  修改/etc/frr/daemons配置文件,本文将bgp开启,并启动FD最大数量。

#这里开启bpg
bgpd=yes
zebra=yes
ospfd=no
ospf6d=no

vtysh_enable=yes
zebra_options="  -A 127.0.0.1 -s 90000000 -n"
bgpd_options="   -A 127.0.0.1 -f /etc/frr/bpgd.conf --log file:/var/log/frr/bgpd.log"
ospfd_options="  -A 127.0.0.1"
ospf6d_options=" -A ::1"
ripd_options="   -A 127.0.0.1"
ripngd_options=" -A ::1"
isisd_options="  -A 127.0.0.1"
pimd_options="   -A 127.0.0.1"
ldpd_options="   -A 127.0.0.1"
nhrpd_options="  -A 127.0.0.1"
eigrpd_options=" -A 127.0.0.1"
babeld_options=" -A 127.0.0.1"
sharpd_options=" -A 127.0.0.1"
pbrd_options="   -A 127.0.0.1"
staticd_options="-A 127.0.0.1"
bfdd_options="   -A 127.0.0.1"
fabricd_options="-A 127.0.0.1"
vrrpd_options="  -A 127.0.0.1"

#开启文件的数量
MAX_FDS=1024

5. 开启IP转发和frr服务

  • 启动IP转发

创建文件/etc/sysctl.d/90-routing-sysctl.conf,并写入如下内容

# Sysctl for routing
#
# Routing: We need to forward packets
net.ipv4.conf.all.forwarding=1
net.ipv6.conf.all.forwarding=1

载入修改的systemctl到系统:

sudo sysctl -p /etc/sysctl.d/90-routing-sysctl.conf
  • 启动frr服务

  启动服务frr(systemctl start frr)后,通过修改配置文件,修改配置。通过命令systemctl reload frr热加载配置。配置文件都在/etc/frr目录中通过命令vtysh进入frr操作界面。

sudo systemctl start frr
sudo systemctl enable frr
#然后通过CLI登录,登录CLI交互接口
vtysh
#登录某具体进程交互接口
vtysh -d bgpd
#配置进程读取配置文件进行配置
vtysh -f /etc/frr/test.conf
#bash中配置进程执行某条具体命令但不登录进入vtysh交互接口
vtysh -c "show running-config"

6. frr热重载和重启

参见官方文档

6.1 热重载

在不重启进程的情况下,热加载新配置内容到当前进程,确保链接不断开。

  1. 重载frr所有进程
#热加载,主要使用在有frr.conf集成文件场景下
systemctl reload frr
systemctl status frr -l 查看报错

如果报错,一般是因为缺少集成文件/etc/frr/frr.conf。在frr中可以设置集成配置文件,可以通过如下命令自动生成该集成文件。如果默认配置文件目录/etc/frr中有该集成文件frr.conf,则会将所有守护进程配置存于frr.conf中。默认情况下,是各自进程配置文件存于各自配置文件中,例如bgpd.conf。

vtysh -w
vtysh -c "write integrated"
  1. 热重载指定进程的配置

这里执行指定进程加载指定文件的方式实现。如此,仅需编写指定守护进程的配置文件,即可热加载该配置内容,同时不会影响其他已建立连接,该配置文件可位于任意位置。编写配置文件的内容格式,同已有的***.conf文件的格式一样。

vtysh -d bgpdd -f /etc/frr/bgp123321.conf

6.2 重启

  1. 重启frr所有进程
systemctl restart frr
  1. 重启frr中指定守护进程

因为frr中已有守护进程watchfrr,所以仅需要杀掉指定进程,它即可自动拉起并启动指定守护进程。

ps -ef | grep frr/bgpd | grep -v grep | awk '{print $2}'|xargs kill -9

若发生意外,对于单独指定进程重启,可以直接删除,然后重启。

/usr/lib/frr/bgpd -d -F traditional -A 127.0.0.1 --log file:/var/log/frr/bgpd.log

发表评论

邮箱地址不会被公开。 必填项已用*标注