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.
fileio
– create <Backendname> <Dateiname> <Größe in M/G/T>
iblock
– create <Backendname> <Pfad zum Device>
pscsi
– create <Backendname> <Pfad zum Device>
rd_mcp
– create <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!