ISCSI Target(Server) unter Linux mit targetcli

Datum

ISCSI ist die Technik, SCSI Datenpakete über TCP zu versenden. Damit ist es möglich remote Festplatten einzubinden und ein SAN zu erstellen.

Hierfür benötigt man das Target, welches den Server des Storages darstellt und den Initiator, dieser bezeichnet das System wo die Festplatte anschließend remote gemountet wird.

Es wurde hierfür ein Ubuntu 16.04. mit HWE Kernel verwendet. Um Fehler zu vermeide, nutze ich in der Beschreibung absolute Pfade.

notwendige Pakete installieren

Es wird targetcli benötigt, welche durch das eigene Commandlineinterface die Sache vereinfacht. Das Paket ist in den Repositorys vorhanden.

apt install targetcli

Device heraussuchen

Für den Test habe ich ein eigenes Device eingeplant. vda ist für das System und vdb für das Backend.

Daher 2× 32GB Partitionen über VirtIO:

root@scsi1:~# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vdb    252:16   0   32G  0 disk
sr0     11:0    1  829M  0 rom
vda    252:0    0   32G  0 disk
├─vda2 252:2    0    4G  0 part [SWAP]
├─vda3 252:3    0   26G  0 part /home
└─vda1 252:1    0    2G  0 part /boot
Backend erstellen

Nun kann mit targetcli das Commandlineinterface geöffnet werden.

Ein ls schafft schon einmal Überblick:
Ausschnitte dieser Übersicht füge ich unter jedem Schritt bei.

/> ls
o- / ......................................................................................................................... [...]
  o- backstores .............................................................................................................. [...]
  | o- fileio ................................................................................................... [0 Storage Object]
  | o- iblock ................................................................................................... [0 Storage Object]
  | o- pscsi .................................................................................................... [0 Storage Object]
  | o- rd_mcp ................................................................................................... [0 Storage Object]
  o- ib_srpt ........................................................................................................... [0 Targets]
  o- iscsi ............................................................................................................. [0 Targets]
  o- loopback .......................................................................................................... [0 Targets]
  o- qla2xxx ........................................................................................................... [0 Targets]
  o- tcm_fc ............................................................................................................ [0 Targets]
  o- usb_gadget ........................................................................................................ [0 Targets]
  o- vhost ............................................................................................................. [0 Targets]

Das Backend kann bestehen aus:

fileio – Erstellt eine Datei auf einem gemounteten Filesystem. Sofern nicht anders angegeben /. Es wird eine maximale Größenangabe benötigt, diese wird aber nicht reserviert, daher kann Überprovisioniert werden.

iblock – Blockdevice / LVM Logicalvolume

pscsi – „Linux pass-through SCSI devices“ Devices welche ohne SCSI Emulation auskommen, welche mit lsscsi angezeigt werden oder unter /proc/scsi/scsi gelistet sind, wie zb. SCSI/SAS Festplatten.

rd_mcp – erstellt eine RAMdisk, welche als Backend genutzt werden kann.

Hierfür springt man in den entsprechenden Ordner cd backstores/<Backendart> und führt create mit entsprechenden Optionen durch.

fileiocreate <Backendname> <Dateiname> <Größe in M/G/T>
iblockcreate <Backendname> <Pfad zum Device>
pscsicreate <Backendname> <Pfad zum Device>
rd_mcpcreate <Backendname> <Größe in M/G/T>

In meinem Falle ist dies dann create disk01 /dev/vdb.

| o- fileio ..
| o- iblock ..
| | o- disk01 
| o- pscsi ...
| o- rd_mcp ..

ls / zeigt auch das vorhandene Backend nun:

 | o- iblock .....
 | | o- disk01 ...
ISCSI Targetnamen erstellen

Hierfür muss nun unter /iscsi gesprungen werden. Der Targetname kann als IQN (iSCSI qualified name) oder EUI (extended unique identifier) erfolgen. Näheres gibt es hier zu lesen.

Sollte kein bestimmtes Namensschema notwendig sein, reicht ein einfaches create. Es wird nun ein Name erzeugt.
In meinem Fall war dies iqn.2003-01.org.linux-iscsi.scsi1.x8664:sn.cd8d515c6661.

o- ib_srpt ..................................................
o- iscsi ....................................................
| o- iqn.2003-01.org.linux-iscsi.scsi1.x8664:sn.cd8d515c6661 
|   o- tpg1 .................................................
|     o- acls ...............................................
auf IP binden

Es muss dem Target noch angegeben werden, über welche IP Adresse es angesprochen werden kann.

Da ich auf den Maschinen nur ein Netzwerkinterface habe, sehe ich keinen Vorteil, das ISCSI über ein anderes IP Subnetz zu routen. Daher lege ich das Target auf die IP des Systems.

Hierzu muss man nun mit cd /iscsi/<Targetname>/tpg1/portals in das entsprechende Verzeichnis, für den create <zu benutzende IP Adresse>. Die IP Adresse muss auf dem System hochgefahren sein, da hier nur ein entsprechender Port geöffnet wird.

netstat
tcp        0      0 192.168.xxx.xxx:3260     0.0.0.0:*               LISTEN      -
 o- portals ................
   o- 192.168.xxx.xxx:3260 ..
LUN erstellen

Die LUN entspricht der Logical Unit Number, welches eines physischen Festplattenplatzes gleicht. Jedes SCSI Gerät wird über eine logische Nummer identifiziert. Es ist eine eindeutige Kennung für eine einzelne oder ein Verbund von Festplatten.
Es können für ein Target mehrere LUNs eingestellt werden.

Für die Erstellung muss wieder mit cd /iscsi/<Targetname>/tpg1/luns in das entsprechende Verzeichnis springen und create /backstores/<Backendart>/<Backendname> das LUN erstellen. Hierbei wird fortlaufend die Nummer vergeben.

 o- luns ..........
 | o- lun0 ........
Zugriffsschutz

Damit nicht jeder auf den Storage zugreifen kann, muss angeben werden, welcher ISCSI Initiator erlaubt ist.

Nun wieder in den entsprechenden Pfad wechseln cd /iscsi/<Targetname>/tpg1/acls. Hier muss nun der SCSI Initiatorname hinterlegt werden mit create <Initiatorname>.

In meinem Aufbau habe ich den Initiator, fast die gleichen Name gegeben. Nur den Hostname gewechselt, von scsi1 zu scsi2.

 o- tpg1 .......................................................
   o- acls .....................................................
   | o- iqn.2003-01.org.linux-iscsi.scsi2.x8664:sn.cd8d515c6661 
   |   o- mapped_lun0 ..........................................

Hier wird auch gleich lun0 gemappt.

Zusätzlich kann noch ein User mit Passwort angelegt werden. Dafür in den Ordner des Initiatornamens wechseln cd /iscsi/<Targetname>/tpg1/acls/<Initiatorname > und set auth userid=<Username> gefolgt von set auth password=<Passwort>.

Es handelt sich um reine User für das ISCSI, dieser User wird nicht für das Betriebssystem angelegt.

Configuration sichern

Wenn man targetcli normal über Strg + D beendet oder exit wird man gefragt, ob die Konfiguration gespeichert werden soll. Y ist default und kann entsprechend direkt mit Enter ausgewählt werden.

Um Zwischenschritte zu sichern, kann auch saveconfig verwendet werden.

Damit die Einstellungen rebootfest werden, muss vor dem Speicher in das Rootverzeichnis mit cd / gewechselt werden. Wenn man sich in einem Unterordner befindet, werden nicht alle Einstellungen dauerhaft gespeichert!

Autor
Kategorien Dateisysteme, Linux

PRTG Map