Internet Small Computer System Interface (iSCSI) to protokół sieciowy używany do współdzielenia zasobów dyskowych przez sieć IP przy wykorzystaniu komend SCSI. Klienci widzą zasób dyskowy tak jak lokalnie podłączony dysk i mogą używać zwykłych narzędzi do partycjonowania, formatowania i montowania dysku. iSCSI Storage Area Network (SAN) to tania alternatywa wobec kosztownego rozwiązania Fibre Channel SAN. W przeciwieństwie do Fibre Channel nie wymaga specjalnie dedykowanego okablowania, przełączników ani kontrolerów, używa istniejącej infastruktury IP do współdzielenia zasobów dyskowych.
Protokół komunikuje się przez port 3260 TCP. W przeciwieństwie do NFS i CIFS zasoby dyskowe udostępniane są przez iSCSI jako urządzenie blokowe bez systemu plików. Klient dopiero dzieli na partycje zasób i formatuje na jaki system plików mu pasuje.
Terminologia iSCSI SAN.
IQN – unikalna nazwa służącą do identyfikowania targetów i intiatorów.
Target – usługa na serwerze iSCSI, która udostępnia zasób dyskowy.
Initiator – klient iSCSI identyfikowany przez IQN, który podłącza się do targetu.
Backstore – (backend storage) urządzenie dyskowe udostępniane przez target, może to być cały dysk fizyczny, partycja, lvm lub macierz raid.
ACL – lista kontroli dostępu (access control list), która kontroluje dostęp do LUN targetu.
LUN – logiczny numer jednostki (logical unit number), reprezentuje pojedynczy możliwy do zaadresowania logiczny dysk udostępniony przez target. Z perspektywy klienta LUN to zwykły dysk podłączony do klienta.
Portal – kombinacja adresu IP i portu, na których target nasłuchuje a do których inicjator nawiązuje połączenie.
TPG – (target portal group) kolekcja adresów IP i portów, na których nasłuchuje target.
Discovery – proces, w którym inicjator odnajduje target ze skonfigurowanym portalem.
Login – autentykacja, która przyznaje inicjatorowi dostęp do LUN targetu.
Zarządzanie serwerem iSCSI Target.
Do celów zarządzania targetem służy komenda targetcli, pozwala ona wyświetlać, tworzyć modyfikować i kasować LUNy na targecie.
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 |
# targetcli targetcli shell version 2.1.fb34 Copyright 2011-2013 by Datera, Inc and others. For help on commands, type 'help'. /> Run help at the tool’s prompt to view available subcommands: /> help …… . . AVAILABLE COMMANDS ===================== The following commands are available in the current path: - bookmarks action [bookmark] - cd [path] - clearconfig [confirm] - exit - get [group] [parameter…] - help [topic] - ls [path] [depth] - pwd - refresh - restoreconfig [savefile] [clear_existing] - saveconfig [savefile] - sessions [action] [sid] - set [group] [parameter=value…] - status - version |
Komenda | Opis |
ls |
Wyświetla widok z aktualnego położenia w drzewie. |
pwd |
Wyświetla aktualne położenie w drzewie. |
cd |
Nawigowanie po drzewie. |
get / set |
Pobranie / ustawienie atrybutów konfiguracji. |
sessions |
Dokładne informacje o aktualnie otwartej sesji. |
saveconfig |
Zapisanie konfiguracji. |
exit |
Wyjście z interfejsu targetcli. |
Więcej informacji: # man targetcli
.
Zarządzanie iSCSI Initiator.
Podstawowym narzędziem do wyszukiwania (discover) targetów iSCSI, logowania się na nie, zarządzania bazą discovery iSCSI jest komenda iscsiadm. Komenda współpracuje z demonem iscsid i czyta konfigurację z pliku /etc/iscsi/iscsid.conf.
Komenda ma cztery tryby działania:
- Discovery – przepytuje określony portal o dostępne targety w oparciu o konfigurację zdefiniowaną w pliku: /etc/iscsi/iscsid.conf.
- Node – zestawia sesje z targetem i tworzy korespondujące urządzenie dla każdego odnalezionego na targecie LUN.
- Session – wyświetla aktualne informacje o sesji.
- Iface – definiuje portal sieciowy.
Więcej informacji: # man iscsiadm
.
Pliki konfiguracyjne.
/etc/iscsi/iscsid.conf
– plik konfiguracyjny inicjatora iSCSI, który określa jak sterować iniccjatorem przez komendę iscsiadm. Przykładowa zawartość poniżej.
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 |
iscsid.startup = /bin/systemctl start iscsid.socket iscsiuio.socket node.startup = automatic node.leading_login = No node.session.timeo.replacement_timeout = 120 node.conn[0].timeo.login_timeout = 15 node.conn[0].timeo.logout_timeout = 15 node.conn[0].timeo.noop_out_interval = 5 node.conn[0].timeo.noop_out_timeout = 5 node.session.err_timeo.abort_timeout = 15 node.session.err_timeo.lu_reset_timeout = 30 node.session.err_timeo.tgt_reset_timeout = 30 node.session.initial_login_retry_max = 8 node.session.cmds_max = 128 node.session.queue_depth = 32 node.session.xmit_thread_priority = -20 node.session.iscsi.InitialR2T = No node.session.iscsi.ImmediateData = Yes node.session.iscsi.FirstBurstLength = 262144 node.session.iscsi.MaxBurstLength = 16776192 node.conn[0].iscsi.MaxRecvDataSegmentLength = 262144 node.conn[0].iscsi.MaxXmitDataSegmentLength = 0 discovery.sendtargets.iscsi.MaxRecvDataSegmentLength = 32768 node.conn[0].iscsi.HeaderDigest = None node.session.nr_sessions = 1 node.session.iscsi.FastAbort = Yes |
/etc/iscsi/initiatorname.iscsi
– plik jest czytany przez demona iscsid podczas startu i jest używany do określenia nazw węzłów i ich aliasów. Przykładowa zawartość pliku znajduje się poniżej.
1 2 |
InitiatorName=iqn.2014-09.net.example.server5:mdblun01 InitiatorAlias=”LUN01 for MariaDB Database Files” |
Ćwiczenie 1. Konfiguracja iSCSI Target LUN w oparciu o dysk i podłączenie na inicjatorze.
Strona Target.
1. Instalacja targetcli:
1 |
[target]# yum –y install targetcli |
2. Uruchomienie powłoki targetcli i wyświetlenie drzewa. Po drzewie targetcli można
1 2 3 4 5 6 7 8 9 10 |
/> ls o- / .................................................. [...] o- backstores ....................................... [...] | o- block ........................... [Storage Objects: 0] | o- fileio .......................... [Storage Objects: 0] | o- pscsi ........................... [Storage Objects: 0] | o- ramdisk ......................... [Storage Objects: 0] o- iscsi ..................................... [Targets: 0] o- loopback .................................. [Targets: 0] /> |
3. wejście do /backstores/block
aby utworzyć backstore o nazwie iscsidisk1 wykorzystując dysk /dev/vdb.
1 2 3 4 |
/> cd /backstores/block /backstores/block> create block1 /dev/vdb Created block storage object block1 using /dev/vdb. |
3. Utworzenie targetu iSCSI z adresem iqn.2015-01.com.example:iscsidisk1 na backstore iscsidisk1 w domyślnym TPG:
1 2 3 4 5 |
/backstores/block> cd /iscsi /iscsi> create iqn.2015-01.com.example:iscsidisk1 Created target iqn.2015-01.com.example:iscsidisk1. Created TPG 1. |
Nazewnictwo IQN jest bardzo restrykcyjne, jeżeli np. numer miesiąca wpiszesz jako pojedynczą cyfrę otrzymasz komunikat “WWN not valid”.
4. Wyłączenie autentykacji dzięki czemu każdy inicjator będzie mógł podłączyć się do LUN.
1 2 3 4 5 |
/iscsi/iqn.20…sidisk1/tpg1> set attribute authentication=0 demo_mode_write_protect=0 generate_node_acls=1 Parameter demo_mode_write_protect is now '0'. Parameter authentication is now '0'. Parameter generate_node_acls is now '1'. |
Wyłączenie demo_mode_write_protect=0
zezwala na zapis do LUN.
Atrybut generate_node_acls=1
włącza autentykacje TPG, która wyłącza wszelkie zdefiniowane przez użytkowników ACLki.
5. Utworzenie LUN o nazwie lun0 i wyeksportowanie:
1 2 3 |
/iscsi/iqn.20…sidisk1/tpg1> luns/ create /backstores/block/block1 Created LUN 0 |
6. Utworzenie portalu z adresem IP 192.168.0.120 i domyślnym portem:
1 2 3 4 5 |
/iscsi> cd iqn.2015-01.com.example:iscsidisk1/tpg1 /iscsi/iqn.20…sidisk1/tpg1> portals/ create 192.168.0.120 Using default IP port 3260 Created network portal 192.168.0.120:3260. |
Przy tworzeniu portalu nazwa hosta musi być wpisany adres IP, nie można tutaj wpisać nazwy domenowej hosta, bo nie będzie to działać.
7. Wyjście z powłoki targetcli. Domyślnie włączona jest dyrektywa auto_save_on_exit
a więc konfiguracja zostanie zapisana automatycznie.
1 2 3 4 5 |
/> exit Global pref auto_save_on_exit=true Last 10 configs saved in /etc/target/backup. Configuration saved to /etc/target/saveconfig.json |
Konfiguracja zapisana została w pliku /etc/target/saveconfig.json
jak wskazała powłoka targetcli po wyjściu.
8. Odblokowanie na firewallu usługi iscsi-target (port 3260/tcp):
1 2 |
[target]# firewall-cmd --permanent --add-service iscsi-itarget [target]# firewall-cmd --reload |
9. Jeżeli w systemie nie ma zdefiniowej usługi firewalld iscsi-target to trzeba taką zdefiniować:
1 2 3 4 5 6 7 8 |
[target]# vi /etc/firewalld/services/iscsi-target.xml <?xml version="1.0" encoding="utf-8"?> <service> <short>iSCSI</short> <description>This is to permit the iSCSI traffic to pass through the firewall</description> <port protocol="tcp" port="3260"/> </service> |
10. Autostart, uruchomienie i status usługi target.
1 2 3 |
[target]# systemctl enable target [target]# systemctl start target [target]# systemctl status target |
Strona initiator.
11. Instalacja iscsi-initiator-utils:
1 |
[initiator]# yum install iscsi-initiator-utils -y |
12. Edycja pliku konfiguracyjnego:
1 2 3 |
[initiator]# vim /etc/iscsi/initiatorname.iscsi InitiatorName=iqn.2015-01.com.example:scsidisk1 |
13. Włączenie, autostart i status demona iscsid:
1 2 3 |
[initiator]# systemctl start iscsid [initiator]# systemctl enable iscsid [initiator]# systemctl status iscsid |
14. Ponieważ składnia komendy iscsiadm jest dosyć zawiła najlepiej skopiować całe poniższe polecenie z man i tylko wstawić swoje parametry:
1 2 3 4 |
[initiator]# man iscsiadm [initiator]# iscsiadm –-mode discoverydb –-type sendtargets –-portal 192.168.0.120 –discover 192.168.0.120:3260,1 iqn.2015-01.com.example:iscsidisk1 |
I znów kopiowanie z man komendy login:
1 2 |
[initiator]# man iscsiadm [initiator]# iscsiadm –-mode node –-targetname iqn.2015-01.com.example:scsidisk1 –-portal 192.168.0.120:3260 –login |
15. Dodatkowe informacje :
1 |
[initiator]# iscsiadm -m session -P 3 |
16. Wyświetlenie dostępnych urządzeń SCSI w systemie:
1 |
[initiator]# lsscsi |
17. Utworzenie partycji z ext4 na podłączonym zasobie dyskowym i podmontowanie nowej partycji w oparciu o jej UUID:
1 2 3 4 5 6 7 8 9 |
[initiator]# fdisk /dev/sdb Creating a 2024MB partition [initiator]# partprobe -s [initiator]# mkfs.ext4 /dev/sdb1 [initiator]# mkdir /mnt/iscsi [initiator]# blkid | grep sdb1 [initiator]# vim /etc/fstab UUID=XYZ /mnt/iscsi ext4 _netdev 0 0 [initiator]# mount -a |
18. Dodatkowe informacje:
1 2 3 |
[initiator]# watch -d ‘iscsiadm -m session -P 3 | grep Attached’ Attached scsi disk sdb : state: running |
Ćwiczenie 2. Konfiguracja iSCSI Target LUN w oparciu plik i podłączenie na inicjatorze.
Strona Target.
1. Instalacja targetcli:
1 |
[target]# yum –y install targetcli |
2. Uruchomienie powłoki targetcli i wyświetlenie drzewa.
1 2 3 4 5 6 7 8 9 10 |
/> ls o- / .................................................. [...] o- backstores ....................................... [...] | o- block ........................... [Storage Objects: 0] | o- fileio .......................... [Storage Objects: 0] | o- pscsi ........................... [Storage Objects: 0] | o- ramdisk ......................... [Storage Objects: 0] o- iscsi ..................................... [Targets: 0] o- loopback .................................. [Targets: 0] /> |
3. Wejście do /backstores/fileio
aby utworzyć plik IO o nazwie file1 w katalogu /usr
:
1 2 3 4 |
/> cd /backstores/fileio /backstores/fileio> create file1 /usr/file1.img 50M Created fileio file1 with size 52428800 |
3. Utworzenie targetu iSCSI z adresem iqn.2015-01.com.example:iscsifile1 na backstore file1 w domyślnym TPG:
1 2 3 4 5 |
/backstores/fileio> cd /iscsi /iscsi> create iqn.2015-01.com.example:iscsifile1 Created target iqn.2015-01.com.example:iscsifile1. Created TPG 1. |
4.Tworzymy ACL ponieważ chcemy ograniczyć dostęp do targetu.
/iscsi> cd iqn.2015-01.com.example:iscsifile1/tpg1
/iscsi/iqn.20…sidisk1/tpg1> acls/ create iqn.2015-01.com.example:iscsifile1
5. Utworzenie LUN o nazwie lun0 i wyeksportowanie:
1 2 3 |
/iscsi/iqn.20…sidisk1/tpg1> luns/ create /backstores/fileio/file1 Created LUN 0 |
6. Zezwalamy na dostęp do targetu tylko dla hostów z podsieci 192.168.0.0/24.
1 2 |
/iscsi/iqn.20…sidisk1/tpg1> portals/ delete 0.0.0.0 3260 /iscsi/iqn.20…sidisk1/tpg1> portals/ create 0.0.0.0.255 3260 |
0.0.0.0.255 to maska wildcard, tutaj jest to odpowiednik maski podsieci 255.255.255.0 czyli 24 bitowej.
7. Wyjście z powłoki targetcli.
1 2 3 4 5 |
/> exit Global pref auto_save_on_exit=true Last 10 configs saved in /etc/target/backup. Configuration saved to /etc/target/saveconfig.json |
8. Odblokowanie na firewallu usługi iscsi-target (port 3260/tcp):
1 2 |
[target]# firewall-cmd --permanent --add-service iscsi-itarget [target]# firewall-cmd --reload |
9. Autostart, uruchomienie i status usługi target.
1 2 3 |
[target]# systemctl enable target [target]# systemctl start target [target]# systemctl status target |
Strona initiator.
10. Instalacja iscsi-initiator-utils:
1 |
[initiator]# yum install iscsi-initiator-utils -y |
11. Edycja pliku konfiguracyjnego:
1 2 3 |
[initiator]# vim /etc/iscsi/initiatorname.iscsi InitiatorName=iqn.2015-01.com.example:iscsifile1 |
12. Włączenie, autostart i status demona iscsid:
1 2 3 |
[initiator]# systemctl start iscsid [initiator]# systemctl enable iscsid [initiator]# systemctl status iscsid |
13. Ponieważ składnia komendy iscsiadm jest dosyć zawiła najlepiej skopiować całe poniższe polecenie z man i tylko wstawić swoje parametry:
1 2 3 |
[initiator]# iscsiadm -m discoverydb –t st –p 192.168.0.120 192.168.0.120:3260,1 iqn.2015-01.com.example:iscsidisk1 192.168.0.120:3260,1 iqn.2015-01.com.example:iscsifile1 |
lub (opcje w wersji pełnej)
1 |
[initiator]# iscsiadm –-mode discoverydb –-type sendtargets –-portal 192.168.0.120 –discover |
Teraz login:
1 |
[initiator]# iscsiadm –m node –T iqn.2015-01.com.example:scsidisk1 –p 192.168.0.120:3260 –l |
lub (opcje w wersji pełnej)
1 |
[initiator]# iscsiadm –-mode node –-targetname iqn.2015-01.com.example:scsidisk1 –-portal 192.168.0.120:3260 –login |
14. Dodatkowe informacje :
1 |
[initiator]# iscsiadm -m session -P 3 |
15. Wyświetlenie dostępnych urządzeń SCSI w systemie:
1 |
[initiator]# lsscsi |
16. Utworzenie partycji z ext4 na podłączonym zasobie dyskowym i podmontowanie nowej partycji w oparciu o jej UUID:
1 2 3 4 5 6 7 8 9 |
[initiator]# fdisk /dev/sdb Creating a 2024MB partition [initiator]# partprobe -s [initiator]# mkfs.ext4 /dev/sdb1 [initiator]# mkdir /mnt/iscsi [initiator]# blkid | grep sdb1 [initiator]# vim /etc/fstab UUID=XYZ /mnt/iscsi ext4 _netdev 0 0 [initiator]# mount -a |
17. Dodatkowe informacje:
1 2 3 |
[initiator]# watch -d ‘iscsiadm -m session -P 3 | grep Attached’ Attached scsi disk sdb : state: running |