Maszyny wirtualne a fizyczne serwery
25 września 2007 09:56
Patryk Królikowski
Posiadając bogaty wachlarz maszyn wirtualnych coraz częściej zachodzi potrzeba wyprowadzenia ich do zewnętrznych repozytoriów danych. Często np. w niewielkich firmach rolę takich "macierzy" przejmują wyposażone w dużą ilość zasobów dyskowych serwery. Powstaje problem - jak w prosty sposób zapewnić bardzo szybkie i niezawodne łącze pomiędzy serwerem maszyn wirtualnych i macierzą?
Jedną z metod, które można zaprząc do pracy jest technika zwana agregacją interfejsów lub tzw. bondingiem lub teamingiem. Pomysł polega na połączeniu kilku fizycznych interfejsów w jedno logiczne łącze, którego możliwości - np. szybkość - będą połączeniem tych oferowanych przez pojedyncze interfejsy. Stosując bonding możemy zwielokrotnić szybkość łącza oraz zapewnić nadmiarowość w razie awarii którejś z kart sieciowych. Najprościej i najtaniej jest przyprowadzić tą operację z pomocą Linuksa. Nic więcej nie jest potrzebne.
Aby osiągnąć pełnię profesjonalizmu możemy postawić jeszcze switcha (zwłaszcza jeżeli chcemy zwielokrotnić przepustowość) zdolnego obsłużyć agregację. Znalezienie takiego przełącznika nie jest trudne - wystarczy szukać modeli, które wspierają standard 802.3ad i radzą sobie z protokołem LACP (Link Aggregation Control Protocol). Wybierając switcha należy też pamiętać o zapewnieniu odpowiedniej liczby portów. Dla przykładu, jeżeli mamy dwie maszyny, a w każdej z nich agregujemy 3 interfejsy fizyczne to na switchu musimy zarezerwować 6 portów. Jeszcze drobna uwaga co do kart sieciowych - powinny posiadać takie same parametry np. 1 Gbit/Full Duplex, a także mieć możliwość zmiany adresów MAC. Jeżeli będziemy chcieli poeksperymentować na maszynie wirtualnej (np. w VmWare Workstation), to niestety sztuka ta -ze względu na ostatnie wymaganie co do kart sieciowych- nie uda się.
Linux w nowszych odmianach np. z jądrem 2.6.X poradzi sobie z bondingiem bez większego problemu. W części dystrybucji np. CentOS-ie (którym posłużymy się w przykładzie) bonding jest już wkompilowany w jądro. W innym przypadku (np. w Gentoo) należy ręcznie włączyć jego obsługę (make menuconfig (w katalogu ze źródłami jądra) -> menu Network device support -> Bonding driver support). Wsparcie musi być koniecznie aktywowane jako moduł. W przeciwnym razie przekazywanie parametrów do interfejsu (o czym za chwilę) nie będzie możliwe. Do konfiguracji bondingu przyda się również narzędzie ifenslave(w niektórych przypadkach będzie ono niezbędne). Jeżeli nie musieliśmy kompilować jądra to i najprawdopodobniej ifenslave będzie dostępny w systemie. Jeżeli jednak kompilacja była niezbędna to i o to narzędzie będziemy musieli zadbać sami. Możemy zbudować je z źródeł (w takiej samej wersji jak kernel, w ostateczności starszej - nigdy nowszej):
# gcc -Wall -O -I/usr/src/linux/include ifenslave.c -o ifenslave
# cp ifenslave /sbin/ifenslave
lub zainstalować korzystając z narzędzi systemowych (np. apt w Debianie).
Należy też upewnić się, że wszystkie interfejsy fizyczne, które chcemy połączyć funkcjonują prawidłowo. Możemy to zrobić za pomocą chociażby mii-tool-a.
Teraz możemy już przystąpić do właściwej konfiguracji bondingu. Jak wspominaliśmy wcześniej dołączając wsparcie dla bondingu w jądrze w postaci modułu uzyskujemy możliwość przekazywania parametrów poprzez plik /etc/modprobe.conf. Tutaj wskazujemy nazwę interfejsu, który będzie odpowiedzialny za bonding (w naszym przypadku bond0):
alias bond0 bonding
Dalej wskazujemy tryb w jakim będziemy chcieli połączyć interfejsy. Trybów do dyspozycji mamy 7. Z punktu widzenia zwielokrotnienia przepustowości najbardziej interesujący jest tryb szósty balance-alb lub czwarty 802.3ad (wymaga odpowiedniego switcha):
alias bond0 bonding
options bond0 mode=6
Dalej wskazujemy, co jaki czas (w milisekundach) będzie sprawdzany stan ifterfejsu (czy jest "up" albo "down").
alias bond0 bonding
options bond0 mode=6 miimon=80
Teraz należy dokonać modyfikacji w konfiguracji interfejsów fizycznych zmieniając wartości kilku skryptów w /etc/sysconfig/network-scripts. Jeżeli łączymy interfejsy eth0 i eth1 to odpowiednio obróbce należy poddać pliki ifcfg-eth0 i ifcfg-eth1 w następujący sposób:
Musimy również stworzyć plik konfiguracji interfejsu bond0:
DEVICE=bond0
IPADDR=192.168.0.20
NETMASK=255.255.255.0
NETWORK=192.168.0.0
BROADCAST=192.168.0.255
ONBOOT=yes
BOOTPROTO=static
GATEWAY=192.168.0.1
TYPE=Ethernet
Na koniec wystarczy ponownie uruchomić skrypt /etc/init.d/network i sprawdzić wyniki naszej pracy.
Komentarze
Redakcja NetWorld nie ponosi odpowiedzialności za wypowiedzi Internautów opublikowane na stronach serwisu oraz zastrzega sobie prawo do redagowania, skracania bądź usuwania komentarzy zawierających treści zabronione przez prawo, uznawane za obraźliwie lub naruszające zasady współżycia społecznego. Osoby zamieszczające wypowiedzi naruszające prawo lub prawem chronione dobra osób trzecich mogą ponieść z tego tytułu odpowiedzialność karną lub cywilną.
Ta wiadomość nie ma jeszcze żadnych komentarzy. Twój może być pierwszy...