Home > Tips n' tricks > iSCSI czyli Fibre Channel dla ubogich

iSCSI czyli Fibre Channel dla ubogich

Babciu, po co to wszystko? Przecież jest FC….

W dobie wszechobecnej wirtualizacji i coraz większej popularyzacji wszelkiej maści rozwiązań HA współdzielenie urządzeń blokowych staje się konkretnym problemem wielu administratorów. Jeśli pracujesz w firmie, którą stać na FC – możesz sobie odpuścić ten artykuł. Nawet Novell promując technologię iSCSI mówi wprost: jeśli możesz wybierać – wybierz FC. Ale jeśli nie… to postaram się przedstawić jak w kilku krokach zbudować własną „macierz”  iSCSI. Całą operację przeprowadzę na systemie SLES10SP2, ale będę unikał narzędzi dedykowanych dla tej dystrybucji (kto lubi – może to wyklikać w programie YaST) tak, aby opis był w miarę uniwersalny. A więc zaczynamy…

Jak to działa

iSCSI to protokół opierający się o enkapsulacje poleceń SCSI wewnątrz protokołu TCP/IP. Jest to więc swego rodzaju wirtualizacja dostępu do urządzenia blokowego. Z podobnych technologii można wspomnieć HyperSCSIczy ATAoE – protokoły przekazujące odpowiednio polecenia SCSI i ATA bezpośrednio w ramkach Ethernet. W odróżnieniu od nich iSCSI może być rutowane (ale ma w związku z tym większy narzut w postaci dodatkowych nagłówków TCP/IP). Ponadto iSCSI pozwala na obustronne uwierzytelnienie za pomocą protokołu CHAP.

Zasada działanie jest bardzo prosta. Po stronie serwera (w terminologii iSCIS – target) działa demon ietd (iSCSI Enterprise Target), który eksportuje wskazane urządzenia blokowe. Po stronie klienta działa demon open-iscsi (inicjator), którego zadaniem jest nawiązanie połączenia i komunikacja z targetem oraz utworzenie urządzeń blokowych (np. sdb, sdc, itd.) w katalogu /dev. Utworzone przez inicjator urządzenia widoczne są w systemie klienckim jak zwyczajne dyski SCSI czy SATA.

Konfiguracja targetu

Po stronie naszej macierzy należy doinstalować demona ietd oraz moduł do jądra z obsługą protokołu iSCSI. W systemie SLES jądro zawiera wszystkie potrzebne moduły, a demon ietd znajduje się w pakiecie iscsitarget. Osobom pracującym na systemie  SLES polecam jeszcze pakiet yast2-iscsi-server zawierający moduł YaSTa do konfiguracji targetu.

Przed przystąpieniem do konfiguracji serwera iSCSI należy przygotować urządzenia blokowe, które będą eksportowane. Można do tego celu wykorzystać całe dyski, poszczególne partycje, albo wolumeny LVM. Ta ostatnia metoda jest wygodna ze względu na elastyczność zarządzania warstwą urządzeń blokowych oraz możliwość wykonywania snapshot’ów.

W tym artykule posłużę się przykładem konfiguracji pod klaster HA. Załóżmy więc że potrzebujemy jeden wolumen na dane konfiguracyjne (powiedzmy pod klastrowy system plików), trzy wolumeny jako dyski dla maszyn wirtualnych oraz dysk pod serwer plików. Wtakim układzie najlepej będzie skonfigurować dwa targety:

  • pierwszy z wolumenem współdzielonym pod klastrowy system plików i trzema wolumenami dla maszyn wirtualnych
  • drugi z jednym wolumenem pod serwer plików

Konfiguracja wolumenów LVM:

host03:~ # dd if=/dev/zero of=/dev/sdb  bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1,0 MB) copied, 0,006733 seconds, 156 MB/s
host03:~ # pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created
host03:~ # pvscan
  PV /dev/sdb1               lvm2 [93,13 GB]
  Total: 1 [93,13 GB] / in use: 0 [ 0 MB ] / in no VG: 1 [93,13 GB]

host03:~ # vgcreate iSCSI /dev/sdb
  Volume group "iSCSI" successfully created

host03:~ # vgdisplay
  --- Volume group ---
  VG Name               iSCSI
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  6
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                5
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               100,00 GB
  PE Size               4,00 MB
  Total PE              25600
  Alloc PE / Size       12850 / 50,20 GB
  Free  PE / Size       12750 / 49,80 GB
  VG UUID               Wlx3d1-DHqd-6P7U-ASIP-4HVD-jDQc-pSErYA

host03:~ # lvcreate -n samba iSCSI -L 20G
  Logical volume "samba" created
host03:~ # lvcreate -n config iSCSI -L 200M
  Logical volume "config" created
host03:~ # lvcreate -n xen1 iSCSI -L 10G
  Logical volume "xen1" created
host03:~ # lvcreate -n xen2 iSCSI -L 10G
  Logical volume "xen2" created
host03:~ # lvcreate -n xen3 iSCSI -L 10G
  Logical volume "xen3" created
host03:~ #
host03:~ # ls -l /dev/iSCSI/
razem 0
lrwxrwxrwx 1 root root 24 2009-10-27 15:12 config -> /dev/mapper/iSCSI-config
lrwxrwxrwx 1 root root 23 2009-10-27 15:11 samba -> /dev/mapper/iSCSI-samba
lrwxrwxrwx 1 root root 22 2009-10-27 15:12 xen1 -> /dev/mapper/iSCSI-xen1
lrwxrwxrwx 1 root root 22 2009-10-27 15:12 xen2 -> /dev/mapper/iSCSI-xen2
lrwxrwxrwx 1 root root 22 2009-10-27 15:12 xen3 -> /dev/mapper/iSCSI-xen3
host03:~ #

Po przygotowaniu wolumenów można przystąpić do konfiguracji demona ietd. W tym celu w pliku /etc/ietd.conf należy dodać następujące wpisy:

Target iqn.2009-10.com.vnet:host03-samba
         Lun 0 Path=/dev/mapper/iSCSI-samba,Type=fileio
Target iqn.2009-10.com.vnet:host03-xen
         Lun 0 Path=/dev/mapper/iSCSI-config,Type=fileio
         Lun 1 Path=/dev/mapper/iSCSI-xen1,Type=fileio
         Lun 2 Path=/dev/mapper/iSCSI-xen2,Type=fileio
         Lun 2 Path=/dev/mapper/iSCSI-xen3,Type=fileio

Po zapisaniu konfiguracji można uruchomić serwer iscsi i sprawdzić czy wszystkie targety/LUNy są widoczne:

host03:~ # rciscsitarget start
Starting iSCSI target service:                                        done
host03:~ # cat /proc/net/iet/volume
tid:2 name:iqn.2009-10.com.vnet:host03-xen
	lun:0 state:0 iotype:fileio iomode:wt path:/dev/mapper/iSCSI-config
	lun:1 state:0 iotype:fileio iomode:wt path:/dev/mapper/iSCSI-xen1
	lun:2 state:0 iotype:fileio iomode:wt path:/dev/mapper/iSCSI-xen2
tid:1 name:iqn.2009-10.com.vnet:host03-samba
	lun:0 state:0 iotype:fileio iomode:wt path:/dev/mapper/iSCSI-samba
host03:~ #

Voila! Serwer działa i eksportuje to co chcemy, więc pozostaje nam tylko skonfigurować klienta…

Konfiguracja klienta

Po stronie klienta również wymagany jest odpowiedni moduł jądra oraz pakiet z demonem – w systemie SLES nosi on nazwę open-iscsi.  Podobnie jak w przypadku serwera iSCSI, w SLESie można wyklikać wszystko w odpowiednim module programu YaST (wymaga to doinstalowania pakietu yast2-iscsi-client) . Jak zaznaczyłem na początku będę unikał YaSTa więc przedstawię narzędzia uniwersalne.

Do zarządzania dyskami podpiętymi poprzez iSCSI służy polecenie ietadm. Oto przykład wykrywania i podpinania dysków przez protokół iSCSI:

rico:~ # /etc/init.d/open-iscsi start
Starting iSCSI initiator service:                                     done
Setting up iSCSI targets:                                             unused
rico:~ # iscsiadm -m discovery -t st --portal 10.0.0.103
10.0.0.103:3260,1 iqn.2009-10.com.vnet:host03-xen
10.0.0.103:3260,1 iqn.2009-10.com.vnet:host03-samba
rico:~ #
rico:~ # iscsiadm -m node -T iqn.2009-10.com.vnet:host03-xen --login
Logging in to [iface: default, target: iqn.2009-10.com.vnet:host03-xen, portal: 10.0.0.103,3260]
Login to [iface: default, target: iqn.2009-10.com.vnet:host03-xen, portal: 10.0.0.103,3260]: successful
rico:~ #
rico:~ # ls -l /dev/disk/by-path/
total 0
lrwxrwxrwx [...] ip-10.0.0.103:3260-iscsi-iqn.2009-10.com.vnet:host03-xen-lun-0 -> ../../sda
lrwxrwxrwx [...] ip-10.0.0.103:3260-iscsi-iqn.2009-10.com.vnet:host03-xen-lun-1 -> ../../sdb
lrwxrwxrwx [...] ip-10.0.0.103:3260-iscsi-iqn.2009-10.com.vnet:host03-xen-lun-2 -> ../../sdc
[...]
rico:~ #

Następnym krokiem (w zależności od potrzeb) może być konfigurowania automatycznego logowania się do wybranych targetów zaraz po uruchomieniu demona open-iscsi:

rico:~ # iscsiadm -m node -T iqn.2009-10.com.vnet:host03-xen  -o update -n node.conn[0].startup -v automatic

Od tej chwili demon open-iscsi będzie automatycznie logował się do wskazanego targetu zaraz po uruchomieniu:

rico:~ # /etc/init.d/open-iscsi start
Starting iSCSI initiator service:                                     done
Attempting discovery on target at 10.0.0.103:                         done
Setting up iSCSI targets: Logging in to [iface: default, target: iqn.2009-10.com.vnet:host03-xen, portal: 10.0.0.103,3260]
Login to [iface: default, target: iqn.2009-10.com.vnet:host03-xen, portal: 10.0.0.103,3260]: successful
                                                                      done
rico:~ #

Dodatkowe możlilwości

W zależności od potrzeb, serwer iSCSI pozwala nam na skonfigurowanie uwierzytelniania (w dwie strony) oraz ograniczenie ilości równocześnie podpiętych do targetu inicjatorów. W naszym przykładzie wolumen przeznaczony na serwer plików można by zabezpieczyć przed przypadkowym podmontowaniem na kilku maszynach ustawiając maksymalną ilość połączeń na 1. Takie zabezpieczenie jest bardzo wskazane jeśli nie stosujemy klastrowego systemu plików.

Podsumowanie

Technologia  iSCSI jest ciekawą alternatywą dla tych, których nie stać na Fibre Channel. Za jej pomocą możemy zbudować funkcjonalną i niedrogą „macierz” , a korzystając z pakietów DRBD oraz Heartbeat – można zbudować wysokowydajną macierz replikowaną w czasie rzeczywistym. Należy jednak pamiętać, że serwer iSCSI nie kontroluje równoczesnego dostępu do urządzeń więc równoczesne wykorzystanie wolumenów na kilku maszynach wymaga zastosowania dodatkowych mechanizmów zabezpieczających jak np. klastrowy system plików.

Categories: Tips n' tricks Tags: , ,
  1. Brak komentarzy
  1. Brak jeszcze trackbacków