Bugünkü yazımda, Linux İşletim Sisteminde Network yedekliliği (redundant links, fault tolerance) olarak bilinen Linux Bonding konusu hakkında bilgilendirme yapacağım.

Bonding Linux için kullanılan terimdir. Diğer işletim sistemlerinde Teaming (Windows), Network dünyasındaTrunking olarak bilinmektedir.
Linux bonding
Bonding birden fazla Network interface (NIC)’in bir mantıksal gurup olarak tek bir interface olarak kullanablmemize olanak sağlar.

Bonding yedeklilik sağladığı gibi, band genişliğini (load balancing networks) artırmak için de kullanılabilmektedir.
Linux interface bonding
Bu işlemleri Windows altında donanım üreticileri tarafından sağlanan yazılımlarla yapmak mümkün. Bir takım kısıtlarla birlikte sorunsuz denilebilecek seviyede çalışabilmektedir. Aslen araya bir balancer koymadığınız takdirde yazılım bile olsa tam olarak yük dengelemesi yapılamamaktadır. Donanım üreticilerinin bu konudaki yazılımlarınada ihtiyaç duymamaktayız. Linux bunu kendi yeteneği ile yapabilmektedir.

Bonding modülü Linux işletim sistemi çekirdeği desteği ile gelir. Ethernet kartı standartı olarak IEEE 802 kullanılır.

Bonding modülünün 7 farklı şekilde çalışma yapısı bulunur, Kullanılan Mod’a bağlı olarak Bonding Layer 2 veya Layer 3 OSI Network katmanında kullanılmakta.

mode = 0 (balance-rr) : Round-robin çalışır. Yani ağ trafiğini çalışan arayüzlere sırası ile göndermektedir. Yük paylaşımı ve hata toleransı sağlar.

mode = 1 (active-backup) : Aktif-yedek mantığı ile çalışır. Sadece bir arayüz aktiftir. Diğerleri sadece ve sadece asıl olan çalışmaz ise devreye girer. Hata toleransı sağlar.

mode = 2 (balance-xor) : XOR formüle dayalı olarak paketleri iletir. Bu modda paketler kaynak MAC adresi ve hedef MAC adresi ile handle edilir. Tüm hedef MAC adresleri için aynı aynı istemciyi seçer ve yük dengeleme ve hata toleransı sağlar.

mode = 3 (broadcast) : Bu mod ile tüm interfaceler üzerinden paketler iletilir. Bu mod genelde sık kullanılmaz (sadece belirli bir amaçlar için kullanılır). Diğer modlar gibi hata tolefansı sağlamaktadır.

mode = 4 (802.3ad) : IEEE 802.3ad Dynamic link aggregation. Belirtilen standarda göre çalışır. Çalışması için sürücülerinin ethtool desteğinin olması gerekir. Ayrıca anahtarlama cihazı üzerinde de 802.3ad ayarlarının yapılması gerekir.

mode = 5 (balance-tlb) : Bu modda ise toplam yük her arayüzün kendi yüküne göre paylaşılır. Her arayüzün yükü hızına oranla ölçülür. Gelen trafik aktif ilk arayüz tarafından alınır. Eğer bu arayüz çalışmaz ise herhangi diğer bir arayüz aynı MAC adresi ile işlemi devralır. Çalışması için sürücülerinin ethtool desteğinin olması gerekir.

mode=6 (balance-alb) : Bu modda ise hem gidiş hemde geliş trafiği yük paylaşımı yapılır ve özel bir anahtarlama cihazı desteği gerektirmez. IPv4 üzerinden bu işlemi gerçekleştirir.

Şimdi bir örnek yapalım; Örneğimizi, Oracle Enterprise Linux 6.4 üzerinde iki interface eth0 ev eth1’i bond0 olarak yapılandıracağız.

1.) Öncelikle “NetworkManager” servisimizi durduruyoruz. “Bonding” yapılandırmamızı manuel bir araç olmadan elle yapacağımız için ve ayarlarımızın sunucumuzu yeniden başlattığımızda silinmemesi için servisimizin durdurulması gerekmektedir.

 [root@localhost ~]# /etc/init.d/NetworkManager stop Stopping NetworkManager daemon: [ OK ] 

 

2.) Sunucumuzu yeniden başlattığımızda servisimizin yeniden başlamaması için kapalı duruma getiriyoruz.

 [root@localhost ~]# chkconfig NetworkManager off 

 

3.) Bond işlemi için bir bond0 adında sanal interface oluşturuyoruz. Bond yapılandırılması yapılmadan önce ağ kartlarına atanmış bir TCP/IP adresi varsa bunlar temizlenmelidir. İşletim sisteminde “root” kullanıcısı ile oturum açıyoruz.
Verilen IP Adresi, Netmask ve DNS gibi değerler örnek olarak yazılmıştır. Bunları kendi ağ ayarlarınıza göre düzenlemelisiniz.

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond0 
DEVICE="bond0"
IPADDR=192.168.100.105
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
DNS1=192.168.100.1
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
BONDING_OPTS="mode=1 miimon=100"

miimon = Ne kadar milisaniyede interface durumunu kontrol etsin.

mode = Bond interface’in çalışma prensibi

 

4.) Oluşturduğumuz “bond0” interface’e dahil edeceğimiz bond üyesi kartları yapılandırıyoruz. Bu işlemi “eth0” gibi “eth1”, “eth2” gibi diğer kartlarımızda da aşağıdaki gibi yapmalıyız.

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:1B:1E:97
BOOTPROTO=none
ONBOOT=yes
NM_CONTROLLED=no
USERCTL=no
MASTER=bond0
SLAVE=yes
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
HWADDR=00:0C:29:1B:1E:A1
BOOTPROTO=none
ONBOOT=yes
NM_CONTROLLED=no
USERCTL=no
MASTER=bond0
SLAVE=yes

ifcfg-* dosyası içinde kısaca kullanabileceğimiz parametreleri tanıyacak olursak;
DEVICE : Sürücüye vereceğimiz isim.

HWADDR : Ethernet kartının mac adresi

TYPE : Sürücü cinsi. (Ethernet, IPsec vb)

• UUID : Universal Unique Identifier

• ONBOOT : Reboot olduktan sonra otomatik açılmasını istiyor musunuz yoksa manuel mi açacaksınız.

• NM_CONTROLLED : NetworkManager tarafından yönetilip yönetilmediğini belirler.

• BOOTPROTO : Kısaca DHCP kullanıp kullanmayacağımızı soruyor.

• IPADDR : Tanımladığımız ip adresi.

• GATEWAY : Ağ geçidi.

• NETMASK : Ağ maskemiz.

• USERCTL : root kullanıcısı dışındaki kullanıcılar etherneti kullanabilsinminin cevabını verir.

• MASTER : Bu parametre SLAVE parametresiyle birlikte kullanılır ve ethernetin bağlı olduğu bondingi belirler.

• SLAVE : Bu ethernet’in bonding tarafından kontrol edilip edilmediğini belirler.

 

5.) Bonding ayarlarının yapmak için bond interface kartının alias ve diğer ayarları yazacağımız conf dosyasını oluşturuyoruz.

[root@localhost ~]# cat /etc/modprobe.d/bonding.conf
alias bond0 bonding
alias netdev-bond0 bonding

• bond0 = Oluşturduğumuz bond interface ismi.

 

6.) Bonding işleminin aktif olabilmesi için modülün kernele yüklenmesini sağlıyoruz.

[root@localhost ~]# modprobe bonding

 

7.) Yapmış olduğumuz ayarların aktif edilebilmesi için; network servisinin restart edilesi gerekektedir.

service network restart

 

8.) ifconfig ile baktığımızda gördüğünüz gibi bond0’ın geldiğini görürüz.

[root@localhost ~]# ifconfig 
bond0     Link encap:Ethernet  HWaddr 00:0C:29:1B:1E:97  
          inet addr:192.168.100.105  Bcast:192.168.100.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe1b:1e97/64 Scope:Link
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:506 errors:0 dropped:45 overruns:0 frame:0
          TX packets:362 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:48649 (47.5 KiB)  TX bytes:44635 (43.5 KiB)

eth0      Link encap:Ethernet  HWaddr 00:0C:29:1B:1E:97  
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:414 errors:0 dropped:0 overruns:0 frame:0
          TX packets:347 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:38412 (37.5 KiB)  TX bytes:42453 (41.4 KiB)

eth1      Link encap:Ethernet  HWaddr 00:0C:29:1B:1E:97  
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:92 errors:0 dropped:45 overruns:0 frame:0
          TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:10237 (9.9 KiB)  TX bytes:2570 (2.5 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:78 errors:0 dropped:0 overruns:0 frame:0
          TX packets:78 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:6180 (6.0 KiB)  TX bytes:6180 (6.0 KiB)

 

9. “/proc/net/bonding/bond0” dosyasının çıktısı (bonding durumunu) aşağıdaki komut ile öğrenilebilir.

[root@localhost ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:1b:1e:97
Slave queue ID: 0

Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:1b:1e:a1
Slave queue ID: 0
[root@localhost ~]# less /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:1b:1e:97
Slave queue ID: 0

Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:1b:1e:a1
Slave queue ID: 0

10.) Bonding durumunu anlık görüntülemek için aşağıdaki komut uygulanır.

watch cat /proc/net/bonding/bond0

Linux Ethernet bonding ayarlanması

NOT : Bu işlemler tamamlandıktan sonra bonding işleminde oluşan default gateway sorununu “Static Route” parametresi ekleyerek çözüyoruz. Genelde ortamlarda birden fazla vlan var ve her vlanda tanımlanmış farklı bir gateway varsa sunucuya kendi vlan’ı dışındanda makinelerin erişebilmesi için aşağıdaki ayarları giriyoruz. Ayrıca isim çözümlemesi için “resolv.conf” dosyamızda gerekli düzenlemeleri yapıyoruz.

 # vim /etc/rc.d/rc.local /sbin/route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.2.1 
vim /etc/resolv.conf
DNS1=192.168.2.1
DNS2=192.168.2.2
shutdown -r now

Referanslar;
http://ensunucu.com/?p=68
http://www.koraykey.com/?p=298
https://www.brennan.id.au/04-Network_Configuration.html
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/ch-configure_network_bonding

İyi Çalışmalar…
Mustafa Bektaş Tepe

Loading