Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7693991
  • 博文数量: 637
  • 博客积分: 10265
  • 博客等级: 上将
  • 技术积分: 6165
  • 用 户 组: 普通用户
  • 注册时间: 2004-12-12 22:00
文章分类

全部博文(637)

文章存档

2011年(1)

2010年(1)

2009年(3)

2008年(12)

2007年(44)

2006年(156)

2005年(419)

2004年(1)

分类: LINUX

2006-01-11 21:30:07

人,很多时候可以等效于另外一个字“懒”。

我,我也不例外,就是一个字“懒”。

由于目前新的机器都有2个以上的网卡,这些网卡用来干吗呢?,一个接Lan一个接Internet?也不是所有的机器都有这个需求呀。后来想到一个办法,用来做冗余线路,防止单个交换机O了导致单点故障。

其实Linux下的桥接,好久之前也用过,当初配置OpenVPN的时候也使用过,但是都是使用一个shell脚本,执行一堆brctl命令,然后网桥起来了。

我一直很喜欢RH的风格,虽然很多人纷纷投向Debian Gentoo LFS 等等所谓NX的Linux系统,对于linux我现在只用FC,我个人觉得RH的配置很规范(大家不要撇砖头哦)。所以前几天就想找一些文章,看怎么配置后,网桥可以在启动network的时候自动启动起来,大家或许也看到了我的Blog转载过几篇文章,其中也有部分是要使用patch的。linux的启动都是通过脚本来执行命令的,其实看了之后就知道改怎么配置了,由于“懒”所以还是找现成的。

由于我不太喜欢给系统打补丁,我也不相信RH的启动脚本默认启动Bridge会有问题,所以一边按照别人的配置方法,一边看脚本,最后终于搞定了。

写一篇文章出来,以后大家可以参考参考(Fedora Core 4 )

注: FC3以前Bridge启动脚本在/sbin/ifup脚本中,FC4开始那段代码放到/etc/sysconfig/network-scripts/ifup-eth脚本里面了

下面开始吧:

ifup-eth 代码片断
===========================
if [ "${TYPE}" = "Bridge" ]; then
      if [ ! -x /usr/sbin/brctl ]; then
          echo $"Bridge support not available: brctl not found"
          exit 1
      fi
      /sbin/ip link set dev ${DEVICE} down 2>/dev/null
      /usr/sbin/brctl delbr ${DEVICE} 2>/dev/null
      /usr/sbin/brctl addbr ${DEVICE} 2>/dev/null
      # brctl doesn't report success/failure (BZ #104408)
      # Test for ourselves whether it worked.
      if ! /usr/sbin/brctl show | LANG=C grep -q "^${DEVICE}    " ; then
            echo $"Bridge support not available in this kernel"
            exit 1
      fi
      [ -n "${DELAY}" ] && /usr/sbin/brctl setfd ${DEVICE} ${DELAY}
      [ -n "${GCINT}" ] && /usr/sbin/brctl setgcint ${DEVICE} ${GCINT}
      [ -n "${STP}" ] && /usr/sbin/brctl stp ${DEVICE} ${STP}
fi
============================
从以上代码可以看出,碰到TYPE=Bridge的设备,直接当成网桥处理,使用brctl增加一个网桥设备,名字为DEVICE定义的。Bridge设备的TYPE一定为“Bridge”,同时注意大写小。
同时还可以通过定义STP来设置网桥是否STP打开(防止环路),设置DELAY来设置网桥的Forward Delay时间, /usr/sbin/brctl setgcint 这个选项在1.0.4-6版本里面没有找到,所以最好不要设置GCINT

ifup-eth代码片断:
============================
if [ -n "${BRIDGE}" -a -x /usr/sbin/brctl ]; then
      /sbin/ip addr flush dev ${DEVICE} 2>/dev/null
      /sbin/ip link set dev ${DEVICE} up
      /usr/sbin/brctl addif ${BRIDGE} ${DEVICE}
      # Upon adding a device to a bridge,
      # it's necessary to make radvd reload its config
      [ -r /var/run/radvd/radvd.pid ] && kill -HUP `cat /var/run/radvd/radvd.pid`
      exit 0
fi
============================
从代码中可以看到,如果设备中出现了BRIDGE,脚本会把这个设备上的IP地址清除,并且把该设备加入到BRIDGE所指定的网桥中。

分析上面代码后可以得出结论:
要使网桥在启动network脚本时启动,务必这么设置(假设网桥:br0,br0包含eth0 eth1):
ifcfg-eth0:
========================
DEVICE=eth0
ONBOOT=yes
TYPE=Ethernet
BRIDGE=br0
========================
ifcfg-eth1:
========================
DEVICE=eth1
ONBOOT=yes
TYPE=Ethernet
BRIDGE=br0
========================
ifcfg-br0:
========================
DEVICE=br0
BOOTPROTO=static
IPADDR=192.168.0.1
NETMASK=255.255.255.0
ONBOOT=yes
TYPE=Bridge
STP=on
========================

注: 网桥接口最好不要使用dhcp,因为RH的脚本在启动的时候就试图获得IP地址,但是由于网桥优先于eth0 eth1启动,所以在启动的时候没有任何一个网卡添加到网桥中,所以根本无法获得IP地址。不知道是否有其它解决办法。
阅读(8028) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~