本文基于官方文档进行编译安装,采用CentOS7操作系统,其中部分爬坑过程在此记录一下,本文最新状态可点击查看源站文章链接。
- frr源码打包
如果需要给frr打包rpm,可以参看官方文档Packaging Red Hat。
- frr二进制包直接安装
如果读者需要直接采用rpm包安装,可以参看frr Release地址,直接下载rpm包,或者通过添加源来安装。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 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. 编译安装问题排查
- 本文采用CentOS7 默认Git版本为1.8,版本过早,导致编译之前一些依赖无法安装,报错如下图和代码。解决方法是升级Git版本。升级方法可参看文章https://turbock79.cn/?p=165。
此时用make/make install,出现如下报错;
1 2 |
error: unknown option `first-parent' 用法:git describe [选项] <提交号>* |
- 需要安装libjson-c
如果报错如下
1 2 |
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.
1 2 3 4 5 |
#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"错误的原因和解决办法
- systemd以及readline开发环境依赖
1 2 3 4 5 6 7 8 9 |
#报错如下: 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 |
- 需要安装libyang库
FRR依赖libyang库提供YANG/NETCONF的支持。用户可以采用rpm包安装和源码安装两种方式安装libyang;读者可在官方安装文档中根据不同操作系统搜索libyang,然后寻找相应的安装包建议。例如centos的rpm包下载路径是https://ci1.netdef.org/browse/LIBYANG-LY1REL-CENTOS7AMD64-4/artifact;
-
官方文档http://docs.frrouting.org/projects/dev-guide/en/latest/building-frr-for-centos7.html ,其中可能安装frr服务和初始化文件存在问题。无法找到路径redhat/frr.service中文件,现在已转移到tools目录下面。同时没有frr.init文件生成,此处可忽略。
-
启动服务后,可以动态启动其中插件
修改文件/etc/frr/daemons。例如启动bgpd则修改如下图,然后通过命令service frr reload热加载配置。通过netstat -tunlp| grep bgpd可以查看是否开启bgp守护进程。
2. FRR下载编译及安装
整篇安装文章可以参看官方文档http://docs.frrouting.org/en/latest/setup.html
- 构建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
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 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 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配置文件及权限
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#./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. 配置文件及修改
1 2 |
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最大数量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#这里开启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,并写入如下内容
1 2 3 4 5 |
# Sysctl for routing # # Routing: We need to forward packets net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1 |
载入修改的systemctl到系统:
1 |
sudo sysctl -p /etc/sysctl.d/90-routing-sysctl.conf |
- 启动frr服务
启动服务frr(systemctl start frr)后,通过修改配置文件,修改配置。通过命令systemctl reload frr热加载配置。配置文件都在/etc/frr目录中通过命令vtysh进入frr操作界面。
1 2 3 4 5 6 7 8 9 10 |
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热重载和重启
参见官方文档
- 安装配置
- 基础配置,这个比较重要,需要好好看一下。
- CLI接口vtysh配置
- BGP进程配置
6.1 热重载
在不重启进程的情况下,热加载新配置内容到当前进程,确保链接不断开。
- 重载frr所有进程
1 2 3 |
#热加载,主要使用在有frr.conf集成文件场景下 systemctl reload frr systemctl status frr -l 查看报错 |
如果报错,一般是因为缺少集成文件/etc/frr/frr.conf。在frr中可以设置集成配置文件,可以通过如下命令自动生成该集成文件。如果默认配置文件目录/etc/frr中有该集成文件frr.conf,则会将所有守护进程配置存于frr.conf中。默认情况下,是各自进程配置文件存于各自配置文件中,例如bgpd.conf。
1 2 |
vtysh -w vtysh -c "write integrated" |
- 热重载指定进程的配置
这里执行指定进程加载指定文件的方式实现。如此,仅需编写指定守护进程的配置文件,即可热加载该配置内容,同时不会影响其他已建立连接,该配置文件可位于任意位置。编写配置文件的内容格式,同已有的***.conf文件的格式一样。
1 |
vtysh -d bgpdd -f /etc/frr/bgp123321.conf |
6.2 重启
- 重启frr所有进程
1 |
systemctl restart frr |
- 重启frr中指定守护进程
因为frr中已有守护进程watchfrr,所以仅需要杀掉指定进程,它即可自动拉起并启动指定守护进程。
1 |
ps -ef | grep frr/bgpd | grep -v grep | awk '{print $2}'|xargs kill -9 |
若发生意外,对于单独指定进程重启,可以直接删除,然后重启。
1 |
/usr/lib/frr/bgpd -d -F traditional -A 127.0.0.1 --log file:/var/log/frr/bgpd.log |
微信赞赏
支付宝赞赏