Table of Contents

FreeBSD: Initiateur iSCSI et configuration cible

iSCSI est un moyen de partager le stockage, de rendre l'espace disque sur une machine (le serveur, dans la nomenclature iSCSI connu sous le nom de cible) disponible pour d'autres (clients, appelés initiateurs dans iSCSI). La principale différence par rapport à NFS est que NFS fonctionne au niveau du système de fichiers, tandis que iSCSI fonctionne au niveau du périphérique de bloc. Pour les initiateurs, les disques distants servis via iSCSI sont comme des disques physiques. Leurs nœuds de périphérique apparaissent dans /dev/ et doivent être montés séparément.

Cible iSCSI

la cible iSCSI native est prise en charge à partir de FreeBSD 10.0-RELEASE. Pour utiliser iSCSI dans les anciennes versions de FreeBSD, installer une cible dans l'espace utilisateur à partir de la Collection de Ports, telle que net/istgt. Ce chapitre ne décrit que la cible native.

Opération de base

La configuration d'une cible iSCSI est simple : créer le fichier de configuration /etc/ctl.conf, ajouter une ligne appropriée à /etc/rc.conf pour s'assurer que le démon ctld est automatiquement lancé au démarrage, puis démarrer le démon.

Un simple fichier de configuration ctl.conf ressemble à ceci :

portal-group pg0 {
	discovery-auth-group no-authentication
	listen 0.0.0.0
	listen [::]
}

target iqn.2012-06.com.example:target0 {
	auth-group no-authentication
	portal-group pg0

	lun 0 {
		path /data/target0-0
		size 4G
	}
}

La première entrée définit le portal-group pg0. Les groupes de portails définissent les adresses réseau sur lesquelles le démon ctld écoutera. discovery-auth-group no-authentication signifie que chaque initiateur est autorisé à effectuer la découverte iSCSI SendTargets sans aucune authentification. Les deux lignes suivantes font que ctld écoute sur toutes les adresses IPv4 (listen 0.0.0.0) et IPv6 (listen [::]) sur le port par défaut (3560). Il n'est pas nécessaire de définir un nouveau portal-group ; il y en a un par défaut, appelé par défaut. La différence entre default et pg0 ci-dessus est qu'avec default, la découverte iSCSI SendTargets est toujours refusée, alors qu'avec pg0 elle est toujours autorisée.

La deuxième entrée définit une cible unique. « Target » a deux significations : c'est une machine servant iSCSI, mais aussi un groupe nommé de LUN. Dans cet exemple, on utilise ce dernier sens. iqn.2012-06.com.example:target0 est le nom de la cible. À des fins de test, il peut être laissé tel quel ; sinon, com.example doit être remplacé par le vrai nom de domaine, inversé ; le 2012-06 est l'année et le mois d'acquisition du contrôle de ce nom de domaine, et target0 peut être à peu près n'importe quoi. N'importe quel nombre de cibles peut être défini dans le fichier de configuration.

auth-group no-authentication permet à tous les initiateurs de se connecter à cette cible. portal-group pg0 rend la cible accessible via le portal-group pg0.

Après cela viennent les LUN. Pour l'initiateur, chaque LUN sera visible en tant que périphérique de disque séparé, comme /dev/da0, /dev/da1 et ainsi de suite. Plusieurs LUN peuvent être définis pour chaque cible. Les LUN sont identifiés par des numéros ; LUN 0 est obligatoire. La première ligne de configuration LUN (chemin /data/target0-0) définit le chemin complet vers un fichier ou ZVOL supportant le LUN. Le fichier doit exister avant de démarrer ctld. La deuxième ligne est facultative et spécifie la taille.

Pour s'assurer que le démon ctld est lancé au démarrage, ajouter cette ligne à /etc/rc.conf :

ctld_enable="YES"

Sur un nouveau serveur configuré comme cible iSCSI, ctld peut être démarré en exécutant cette commande en tant que root :

# service ctld start

Le démon ctld lit le fichier ctl.conf au démarrage. Pour que les modifications de configuration prennent effet immédiatement, forcer ctld à les relire :

# service ctld reload

Authentification

L'exemple ci-dessus est intrinsèquement non sécurisé : il n'utilise aucune authentification, accordant à quiconque un accès complet à toutes les cibles. Pour exiger un nom d'utilisateur et un mot de passe pour accéder aux cibles, modifier la configuration :

auth-group ag0 {
	chap username1 secretsecret
	chap username2 anothersecret
}

portal-group pg0 {
	discovery-auth-group no-authentication
	listen 0.0.0.0
	listen [::]
}

target iqn.2012-06.com.example:target0 {
	auth-group ag0
	portal-group pg0
	lun 0 {
		path /data/target0-0
		size 4G
	}
}

La section auth-group définit les paires nom d'utilisateur et mot de passe. Un initiateur essayant de se connecter à iqn.2012-06.com.example:target0 doit spécifier l'un ou l'autre. La découverte SendTargets est toujours autorisée sans aucun type d'authentification ; pour le changer, définir discovery-auth-group sur autre chose.

Un cas courant pour iSCSI est d'avoir une seule cible exportée pour chaque initiateur. Pour résumer la syntaxe ci-dessus, le nom d'utilisateur et le mot de passe peuvent être spécifiés directement dans l'entrée cible :

target iqn.2012-06.com.example:target0 {
	portal-group pg0
	chap username1 secretsecret

	lun 0 {
		path /data/target0-0
		size 4G
	}
}

Initiateur iSCSI

L'initiateur iSCSI actuel est pris en charge à partir de FreeBSD 10.0-RELEASE. Pour utiliser l'initiateur iSCSI disponible dans les anciennes versions, se reporter à iscontrol. Ce chapitre s'applique uniquement au nouvel initiateur.

L'initiateur iSCSI nécessite l'exécution du démon iscsid. Il n'utilise pas de fichier de configuration. Pour le démarrer automatiquement au démarrage, ajouter cette ligne à /etc/rc.conf:

iscsid_enable="YES"

Sur une nouvelle machine configurée en tant qu'initiateur iSCSI, iscsid peut être démarré en exécutant cette commande en tant que root :

# service iscsid start

La connexion à une cible peut se faire avec ou sans fichier de configuration iscsi.conf.

Connexion à une cible sans fichier de configuration

Pour que l'initiateur se connecte à une seule cible, exécuter cette commande en tant que root :

# iscsictl -A -p 10.10.10.10 -t iqn.2012-06.com.example:target0

Pour vérifier si la connexion a réussi, l'exécuter sans arguments. La sortie devrait ressembler à ceci :

Target name                                     Target portal   State
iqn.2012-06.com.example:target0                 10.10.10.10     Waiting for iscsid(8)

Cela montre que la session iSCSI a été établie avec succès, avec /dev/da0 représentant le LUN attaché. Si la cible iqn.2012-06.com.example:target0 exporte plusieurs LUN, plusieurs nœuds de périphérique seront affichés dans la sortie iscictl:

Connected: da0 da1 da2

Toutes les erreurs sont signalées dans les journaux système et également visibles dans la sortie iscictl. Par exemple, cela signifie généralement que le démon iscsid n'est pas en cours d'exécution :

Target name                                     Target portal   State
iqn.2012-06.com.example:target0                 10.10.10.10     Waiting for iscsid(8)

Ce qui suit suggère un problème au niveau du réseau, tel qu'une adresse IP ou un port incorrect :

Target name                                     Target portal   State
iqn.2012-06.com.example:target0                 10.10.10.11     Connection refused

Cela signifie que le nom de cible spécifié était incorrect :

Target name                                     Target portal   State
iqn.2012-06.com.example:atrget0                 10.10.10.10     Not found

Cela signifie que la cible nécessite une authentification :

Target name                                     Target portal   State
iqn.2012-06.com.example:target0                 10.10.10.10     Authentication failed

Pour spécifier un nom d'utilisateur et un secret CHAP, utiliser cette syntaxe :

# iscsictl -A -p 10.10.10.10 -t iqn.2012-06.com.example:target0 -u user -s secretsecret

Connexion à une cible avec un fichier de configuration

Pour se connecter à l'aide d'un fichier de configuration, créer /etc/iscsi.conf avec un contenu comme celui-ci :

t0 {
	TargetAddress   = 10.10.10.10
	TargetName      = iqn.2012-06.com.example:target0
	AuthMethod      = CHAP
	chapIName       = user
	chapSecret      = secretsecret
}

t0 spécifie un pseudonyme pour la section du fichier de configuration, utilisé du côté de l'initiateur pour spécifier la configuration à utiliser. Les lignes suivantes spécifient divers paramètres utilisés lors de la connexion. L'adresse et le nom de la cible sont obligatoires, d'autres sont facultatifs. Dans cet exemple, le nom d'utilisateur et le secret CHAP sont affichés.

Pour se connecter à la cible définie ci-dessus, utiliser :

# iscsictl -An t0

Pour se connecter à toutes les cibles définies dans le fichier de configuration, utiliser :

# iscsictl -Aa

Pour que l'initiateur se connecte automatiquement à toutes les cibles dans /etc/iscsi.conf, ajouter ce qui suit à /etc/rc.conf :

iscsictl_enable="YES"
iscsictl_flags="-Aa"