# 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"
```