ST
Section : Manuel du programmeur Linux (
4)
Mise à jour de la version anglaise : 16 décembre 2007
Index
Menu principal
NOM
st - Lecteur de bandes SCSI
SYNOPSIS
#include <sys/mtio.h>
int ioctl(int fd, int request [, (void *)arg3]);
int ioctl(int fd, MTIOCTOP, (struct mtop *)mt_cmd);
int ioctl(int fd, MTIOCGET, (struct mtget *)mt_status);
int ioctl(int fd, MTIOCPOS, (struct mtpos *)mt_pos);
DESCRIPTION
Le pilote de périphérique
st
fournit une interface vers un grand nombre de lecteurs de bandes SCSI.
Actuellement, ce pilote prend le contrôle de tous les périphériques
détectés de type
« accès séquentiel ».
Le pilote
st
utilise un numéro majeur valant 9.
Chaque périphérique utilise huit numéros mineurs.
Les 5 bits de poids faibles des numéros mineurs sont assignés
séquentiellement dans l'ordre de détection.
Dans le noyau 2.6, les bits précédant les 8 bits de poid faible sont
concaténés en les 5 bits de poids faible pour former le numéro
du lecteur de bande.
Les numéros mineurs peuvent être groupés en deux ensembles de quatre
nombres : les numéros mineurs principaux des périphériques
(avec rembobinage automatique),
n,
et les numéros mineurs des périphériques sans rembobinage automatique
(n + 128).
Les périphériques ouverts avec le numéro principal recevront une commande
REWIND
à la fermeture.
Les périphériques ouverts avec le numéro « no-rewind »
ne la recevront pas.
(Notez qu'essayer de positionner la bande d'un périphérique avec rembobinage automatique
en utilisant par exemple, mt, ne conduit pas au résultat désiré :
la bande est à nouveau rembobinée après l'utilisation de la commande mt et la commande
suivante prend effet dès le début de la bande.
Au sein de chaque groupe, 4 numéros mineurs sont disponibles pour définir
des périphériques avec des caractéristiques différentes (taille de bloc,
compression, densité, etc.).
Lorsque le système démarre, seul le premier périphérique est disponible.
Les 3 autres sont activés lorsque les caractéristiques par défaut
sont définies (voir plus bas).
(En modifiant les constantes à la compilation, on peut modifier
la répartition entre le nombre maximal de lecteurs de bandes et le nombre
de numéros mineurs pour chaque lecteur.
Les allocations par défaut permettent de contrôler 32 lecteurs de bandes,
alors qu'il est possible de contrôler jusqu'à 64 lecteurs
avec deux numéros mineurs pour les options différentes.
Les fichiers spéciaux sont créés typiquement ainsi :
mknod -m 660 /dev/st0 c 9 0
mknod -m 660 /dev/st0l c 9 32
mknod -m 660 /dev/st0m c 9 64
mknod -m 660 /dev/st0a c 9 96
mknod -m 660 /dev/nst0 c 9 128
mknod -m 660 /dev/nst0l c 9 160
mknod -m 660 /dev/nst0m c 9 192
mknod -m 660 /dev/nst0a c 9 224
Il n'existe pas de périphériques blocs correspondants.
Le pilote utilise une mémoire tampon interne qui doit être assez grande
pour contenir au moins un bloc de données de la bande.
Dans les noyaux antérieurs au 2.1.121, le tampon était alloué sous forme
de bloc continu.
Cela limitait la taille de bloc au plus grand espace contigu disponible
allouable par le noyau.
Cette limite est actuellement de 128 Ko pour les architectures 32 bits
et 256 Ko pour les 64 bits.
Dans les noyaux plus récents, le pilote alloue la mémoire tampon
en plusieurs parties disjointes si nécessaire.
Par défaut, le nombre maximal de parties est 16.
Ceci signifie que la taille maximale de bloc est très grande
(2 Mo si l'allocation de 16 blocs de 128 Ko réussit).
La taille de la mémoire tampon interne est déterminée par une constante
à la compilation du noyau, que l'on peut supplanter par une option
au démarrage du système.
De plus, le pilote essaie d'allouer un tampon temporaire plus grand
lors de son exécution si cela s'avère nécessaire.
Toutefois l'allocation à l'exécution de grands blocs contigus
peut échouer, et il vaut mieux ne pas compter dessus avec les noyaux
antérieurs au 2.1.121 (cela s'applique également au chargement de module
à la demande avec kerneld ou kmod).
Le pilote ne gère pas spécifiquement un type ou une marque de lecteur
de bandes.
Après le démarrage du système, les options du périphérique sont définies
par le microcode du périphérique.
Par exemple, si celui-ci réclame un mode de blocs fixes,
le lecteur de bandes utilisera ce mode.
Les options peuvent être modifiées par des appels
ioctl(2)
explicites et restent effectives lorsque le périphérique est fermé puis
réouvert.
La configuration des options affecte aussi bien les périphériques
avec rembobinage automatique que ceux sans.
Des options différentes peuvent être fournies pour différents
périphériques au sein du sous-groupe de quatre.
Les options prennent effet à l'ouverture du périphérique.
Par exemple, l'administrateur peut définir un périphérique qui écrit des
blocs fixes d'une certaine taille, et un qui écrit avec des
blocs de longueur variables (si le périphérique accepte les deux modes).
Le pilote gère les
partitions de bandes
si elles sont acceptées par le lecteur.
(Notez que les partitions de bande n'ont rien à voir
avec les partitions de disques.
Une bande partitionnée peut être vue comme un ensemble de bandes logiques
dans le même support).
La gestion des partitions doit être activée par un
ioctl(2).
L'emplacement de la bande est sauvegardé au sein de chaque partition
au cours des changements de partitions.
La partition utilisée pour les opérations ultérieures est sélectionnée
avec un
ioctl(2).
Le changement de partition est effectué au moment de la prochaine opération
bande afin d'éviter les mouvements inutiles de la bande.
Le nombre maximal de partitions sur une bande est défini par une constante
à la compilation (4 à l'origine).
Le pilote contient un
ioctl(2)
qui peut formater une bande avec une ou deux partitions.
Le fichier spécial de périphérique
/dev/tape
est généralement un lien symbolique, ou même un lien matériel vers
le lecteur de bandes par défaut.
Depuis le du noyau 2.6.2, le pilote exporte dans le répertoire
/sys/class/scsi_tape
les périphériques attachés et certains de leurs paramètres.
Transfert de données
Le pilote accepte un fonctionnement aussi bien dans un mode de blocs fixes
que dans un mode de blocs de longueur variable
(si c'est accepté par le lecteur).
En mode de blocs fixes, le périphérique écrit les blocs de la taille
indiquée et la taille des blocs ne dépend pas de la quantité de données
transmises lors de l'appel système.
Dans le mode de longueur variable, un bloc de données est écrit
à chaque appel système write et le nombre d'octets transmis indique
la taille du bloc correspondant sur la bande.
Notez que les blocs de la bande ne contiennent aucune information
sur le mode d'écriture utilisé.
En lecture, la seule chose importante est d'utiliser une commande
qui accepte la taille des blocs de la bande.
En mode variable, le nombre d'octets à lire n'a pas besoin de correspondre
exactement à la taille du bloc de la bande.
Si le nombre demandé est plus grand que la taille du bloc suivant sur la
bande, l'appel système renverra la quantité de données effectivement lues.
Si la taille de bloc est plus grande que le nombre demandé,
l'appel système renverra les données demandées
et le reste du bloc est abandonné.
En mode fixe, le nombre d'octets demandé peut être arbitraire
si la mémoire tampon est activée, ou un multiple de la taille de bloc
si ce tampon est désactivé.
Les noyaux antérieurs au 2.1.121 permettent l'écriture avec un nombre
quelconque si les tampons sont activés.
Dans tous les autres cas (y compris les noyaux plus récents), le nombre
d'octets à écrire doit être un multiple de la taille des blocs.
Dans le noyau 2.6, le périphérique essaie d'utiliser des transferts
directs entre le tampon utilisateur et le périphérique.
Si cela n'est pas possible, le tampon interne du pilote est utilisé.
Les raisons de ne pas utiliser les transferts directs incluent
l'alignement incorrect du tampon utilisateur
(la valeur par défaut est 512 mais peut être modifiée par le pilote HBA),
une des pages du tampon utilisateur n'est pas accessible
à l'adaptateur SCSI, etc.
Une marque est automatiquement écrite sur la bande si la dernière opération
avant fermeture était une écriture.
Lorsqu'une telle marque est rencontrée en lecture, les choses suivantes
se produisent.
S'il reste des données dans le tampon, lorsqu'on trouve la marque,
les données en mémoire sont renvoyées.
La lecture suivante renvoie zéro octet.
La lecture suivante renvoie les données du fichier suivant.
La fin des données enregistrées est signalée par un retour de
zéro octet pour deux appels successifs en lecture.
Le troisième appel renvoie une erreur.
Ioctls
Le pilote supporte trois requêtes
ioctl(2).
Les requêtes non reconnues par
st
sont transmises au contrôleur
SCSI.
Les définitions ci-dessous sont extraites de
</usr/include/linux/mtio.h> :
MTIOCTOP --- Effectue une opération sur la bande.
Cette requête prend un argument du type
(struct mtop *)
indiquant l'opération à effectuer.
Certains contrôleurs ne permettent pas toutes les opérations.
Le contrôleur renvoie une erreur
EIO
s'il n'accepte pas l'opération.
/* Structure MTIOCTOP --- pour les opérations sur bande */
struct mtop {
short mt_op; /* opérations définies ci-dessous */
int mt_count; /* combien d'opérations */
};
Opérations sur bande magnétique lors d'une utilisation normale :
(Ndt : je conserve les termes de filemark, et setmark à
défaut de termes précis en français.)
- MTBSF
-
Reculer la bande de
mt_count
filemarks.
- MTBSFM
-
Reculer la bande de
mt_count
filemarks.
Repositionner la bande sur le côté EOT de la dernière filemark.
- MTBSR
-
Reculer la bande de
mt_count
enregistrements (blocs bande).
- MTBSS
-
Reculer la bande de
mt_count
setmarks.
- MTCOMPRESSION
-
Valider la compression des données sur bande dans le lecteur si
mt_count
est non nul, et désactiver la compression si
mt_count
est nul.
Cette commande utilise la page MODE 15 supportée par la plupart des DATs.
- MTEOM
-
Aller à la fin des enregistrements (ajouter des fichiers).
- MTERASE
-
Effacer la bande.
Avec les noyaux 2.6, un effacement rapide (marquer la bande vide)
est effectué si l'argument est zéro.
Autrement, c'est un effacement long (tout effacer) qui est réalisé.
- MTFSF
-
Avancer la bande de
mt_count
filemarks.
- MTFSFM
-
Avancer la bande de
mt_count
filemarks.
Positionner la bande du côté BOT de la dernière filemark.
- MTFSR
-
Avancer de
mt_count
enregistrements (blocs bande).
- MTFSS
-
Avancer de
mt_count
setmarks.
- MTLOAD
-
Exécuter la commande de chargement SCSI.
Un cas particulier est disponible pour certains chargeurs automatiques HP.
Si
mt_count
correspond à somme de la constante
MT_ST_HPLOADER_OFFSET
et d'un nombre, ce dernier est envoyé au pilote
pour contrôler le chargeur automatique.
- MTLOCK
-
Verrouiller la porte du lecteur de bande.
- MTMKPART
-
Formater la bande en une ou deux partitions.
Si
mt_count
est non nul, il correspond à la taille de la première partition,
et la seconde partition correspond au reste de la bande.
Si
mt_count
est nul, la bande n'est formatée qu'en une seule partition.
Cette commande n'est autorisée que si le support de partitionnement
est activé pour le lecteur (voir
MT_ST_CAN_PARTITIONS
plus bas).
- MTNOP
-
Ne rien faire --- Vider les tampons du pilote --- À utiliser
avant de lire le statut avec
MTIOCGET.
- MTOFFL
-
Rembobiner la bande et éteindre le lecteur.
- MTRESET
-
Réinitialiser le lecteur.
- MTRETEN
-
Retendre la bande.
- MTREW
-
Rembobiner la bande.
- MTSEEK
-
Rechercher sur la bande le bloc numéro
mt_count.
Cette opération nécessite soit un contrôleur SCSI-2 qui supporte la
commande
LOCATE
(adresse spécifique au périphérique), soit un lecteur SCSI-1 compatible
Tandberg (Tandberg, Archive Viper, Wangtek, ... ).
Le numéro de bloc devrait toujours être un numéro renvoyé précédemment par
MTIOCPOS
si les adresses spécifiques au lecteur sont utilisées.
- MTSETBLK
-
Positionner la longueur de blocs du lecteur à la valeur spécifiée dans
mt_count.
Une longueur de bloc nulle place le lecteur dans le mode de blocs de
tailles variables.
- MTSETDENSITY
-
Fixe la densité de la bande à celle codée dans
mt_count.
Les codes des densités acceptées par un lecteur sont disponibles
dans la documentation de celui-ci.
- MTSETPART
-
La partition active devient celle indiquée par
mt_count.
Les partitions sont numérotées depuis zéro.
Cette commande n'est autorisée que si le support de partitionnement
est activé pour le lecteur (voir
MT_ST_CAN_PARTITIONS
plus bas).
- MTUNLOAD
-
Exécuter la commande de déchargement SCSI (n'éjecte pas la bande).
- MTUNLOCK
-
Déverrouiller la porte du lecteur de bande.
- MTWEOF
-
Écrire
mt_count
filemarks.
- MTWSM
-
Écrire
mt_count
setmarks.
Fonctions de configuration du lecteur de bande magnétique
(pour le superutilisateur) :
- MTSETDRVBUFFER 8
-
Positionner diverses options du contrôleur ou du lecteur en fonction
des bits encodés dans
mt_count.
Ces options concernent le type de tampon du lecteur, un jeu d'options
booléennes du contrôleur, le seuil d'écriture du tampon, les valeurs
par défaut des tailles de blocs et de densité, ainsi que les délais
(noyaux >= 2.1).
Une fonction n'agit que sur un seul des éléments de la liste ci-dessus
à la fois.
-
Une valeur ayant ses 4 bits de poids forts à 0 sera utilisée
pour indiquer le type de tampon du lecteur.
Les types de tampon sont :
-
- 0
-
Le contrôleur ne renverra pas le statut
BON
en écriture avant que
les données ne soient réellement écrites sur le support.
- 1
-
Le contrôleur peut renvoyer le statut
BON
en écriture dès que les
données ont été transmises aux tampons internes du lecteur de bande.
- 2
-
Le contrôleur peut renvoyer le statut
BONen écriture dès que les
données ont été transmises aux tampons internes du lecteur de bande, si
toutes les écritures précédentes des tampons
sur le support se sont déroulées correctement.
-
Pour contrôler le seuil d'écriture, on doit inclure dans
mt_count
la constante
MT_ST_WRITE_THRESHOLD
associée avec le nombre de blocs dans
les 28 bits de poids faibles par un OU binaire « | ».
Le nombre de blocs concerne des blocs de 1024 octets, et non pas la
taille physique des blocs sur la bande.
Le seuil ne peut pas excéder la taille des tampons internes du contrôleur.
(voir DESCRIPTION plus haut).
-
Pour valider ou invalider les options booléennes, la valeur
mt_count
doit inclure l'une des constantes
MT_ST_BOOLEANS,
MT_ST_SETBOOLEANS,
MT_ST_CLEARBOOLEANS
ou
MT_ST_DEFBOOLEANS
associées par un
OU
binaire avec une combinaison des options décrites ci-dessous.
Avec
MT_ST_BOOLEANS,
les options sont définies avec les valeurs indiquées.
Avec
MT_ST_SETBOOLEANS,
les options sont activées sélectivement et inhibées avec
MT_ST_DEFBOOLEANS.
-
Les options par défaut pour un contrôleur de bande sont choisies avec
MT_ST_DEFBOOLEANS.
Un périphérique non actif (par exemple avec un numéro mineur de 32 ou 160)
est activé lorsque les options par défaut sont définies
pour la première fois.
Un périphérique actif hérite des options non fixées explicitement
du périphérique actif au démarrage.
Les options booléennes sont :
-
- MT_ST_BUFFER_WRITES (Défaut : vrai)
-
opérations d'écriture dans la mémoire tampon en mode de blocs fixes.
Si cette option est invalidée, et si l'enregistreur utilise une longueur
de bloc fixe, toutes les opérations d'écriture doivent se faire avec une
longueur multiple de celle du bloc.
Cette option doit être fausse pour créer des archives multivolumes
fiables.
- MT_ST_ASYNC_WRITES (Défaut : vrai)
-
Quand cette option est validée, les opérations d'écriture retournent
immédiatement si les données tiennent dans le tampon du pilote, sans
attendre que celles-ci soient effectivement transmises au lecteur de
bande.
Le seuil du tampon d'écriture détermine le taux de remplissage du
tampon avant d'effectuer une commande SCSI.
Toute erreur renvoyée par le périphérique sera conservée jusqu'à
l'opération suivante.
Cette option doit être fausse pour créer des archives multivolumes
fiables.
- MT_ST_READ_AHEAD (Défaut : vrai)
-
Cette option indique au pilote de fournir un cache en lecture, ainsi
qu'une lecture anticipée des données en mode de blocs fixes.
Si cette option est invalidée, et que le lecteur utilise une taille de
blocs fixe, toutes les opérations de lecture doivent se faire avec une
taille multiple de celle du bloc.
- MT_ST_TWO_FM (Défaut : faux)
-
Cette option modifie le comportement du pilote quand un fichier est fermé.
L'attitude normale consiste à écrire une seule filemark, néanmoins
si cette option est validée, le pilote écrira deux filemarks et
replacera la tête au-dessus de la seconde.
-
Note :
Cette option ne doit pas être utilisée avec les lecteurs de bandes QIC
car ils ne sont pas capables d'écraser une filemark.
Ces lecteurs détectent la fin des données enregistrées en cherchant
de la bande vierge à la place des deux filemarks consécutives habituelles.
La plupart des autres lecteurs courants détectent également la présence
de bande vierge, aussi l'utilisation des deux filemarks n'est généralement
utile que lors d'échange de bandes avec d'autres systèmes.
- MT_ST_DEBUGGING (Défaut : faux)
-
Cette option valide les divers messages de débogage du pilote,
si celui-ci a été compilé avec la constante
DEBUG
ayant une valeur non nulle).
- MT_ST_FAST_EOM (Défaut : faux)
-
Cette option indique que les opérations
MTEOM doivent être
envoyées directement au lecteur, ce qui peut accélérer les opérations,
mais aussi faire perdre au pilote le compte des pistes du fichier
en cours, normalement renvoyé par la requête
MTIOCGET.
Si
MT_ST_FAST_EOM
est fausse, le contrôleur répondra à une requête
MTEOM
en sautant en avant de fichiers en fichiers.
- MT_ST_AUTO_LOCK (Défaut : faux)
-
Lorsque cette option est vraie, la porte du lecteur est verrouillée
lorsque le fichier périphérique est ouvert,
et déverrouillée lorsque le périphérique est refermé.
- MT_ST_DEF_WRITES (Défaut : faux)
-
Les options de bande (taille de bloc, mode, compression...) peuvent varier
lorsque l'on passe d'un périphérique lié à un lecteur à un autre
périphérique correspondant au même lecteur.
Cette option définit si les changements sont fournis au pilote
en utilisant les commandes SCSI, et si les capacités d'auto-détection
du lecteur sont fiables.
Si l'option est fausse, le pilote envoie les commandes SCSI
immédiatement lorsque le périphérique change.
Si cette option est vraie, les commandes SCSI ne sont pas envoyées
avant une demande d'écriture.
Dans ce cas, le micro-code est habilité à détecter la structure de la
bande lors de la lecture, et les commandes SCSI ne sont utilisées que pour
être sûrs que la bande soit écrite correctement.
- MT_ST_CAN_BSR (Défaut : faux)
-
Lorsque la lecture anticipée est utilisée, la bande doit parfois être
ramenée en arrière en position correcte lors de la fermeture
du périphérique, et on utilise alors la commande SCSI pour sauter
en arrière par dessus les enregistrements.
Certains anciens lecteurs ne traitent pas correctement cette commande,
et cette option permet d'en avertir le pilote.
Le résultat final est qu'une bande avec bloc fixes et lecture anticipée
peut être mal positionnée dans un fichier lors de la fermeture
du périphérique.
Avec les noyaux 2.6, la valeur par défaut est vrai pour les lecteurs
supportant le SCSI-3.
- MT_ST_NO_BLKLIMS (Défaut : faux)
-
Certains lecteurs n'acceptent pas la commande de lecture des limites
de blocs.
Si l'on utilise cette option, le pilote n'invoque pas cette commande.
L'inconvénient est que le pilote ne peut pas vérifier, avant d'envoyer
des commandes, si la taille de bloc choisie est acceptée par le lecteur.
- MT_ST_CAN_PARTITIONS (Défaut : faux)
-
Cette option active le support des partitions multiples sur une bande.
Cette option s'applique à tous les périphériques liés au lecteur.
- MT_ST_SCSI2LOGICAL (Défaut : faux)
-
Cette option indique au pilote d'utiliser les adresses de blocs logiques
définies dans le standard SCSI-2, lors de opérations de positionnement
et de lecture de la position (aussi bien lors des commandes
MTSEEK
et
MTIOCPOS
que lors des changements de partitions).
Sinon il utilise les adresses spécifiques au périphérique.
Il est très recommandé d'activer cette option si le lecteur supporte
les adresses logiques car elles contiennent également les filemarks.
Il existe d'ailleurs quelques lecteurs qui ne supportent que les
adresses logiques.
- MT_ST_SYSV (Défaut : faux)
-
Lorsque cette option est validée, les périphériques de bande utilisent
la sémantique System V.
Sinon ils utilisent la sémantique BSD.
La différence principale est le comportement lors de la fermeture d'un
périphérique en lecture.
Avec System V, la bande est positionnée en avant à la suite de la filemark
suivante si cela n'a pas déjà eu lieu lors de la lecture.
Dans la sémantique BSD, la position ne change pas.
- MT_NO_WAIT (Défaut : faux)
-
Active le mode immédiat (c'est-à-dire, ne pas attendre que la commande soit
finie) pour certaines commandes (par exemple, rewind).
Un exemple :
struct mtop mt_cmd;
mt_cmd.mt_op = MTSETDRVBUFFER;
mt_cmd.mt_count = MT_ST_BOOLEANS |
MT_ST_BUFFER_WRITES | MT_ST_ASYNC_WRITES;
ioctl(fd, MTIOCTOP, mt_cmd);
-
La taille de bloc par défaut pour un périphérique peut être configurée
avec
MT_ST_DEF_BLKSIZE
et le code de densité par défaut avec
MT_ST_DEFDENSITY.
Les valeurs des paramètres sont associées par un OU logique
avec le code opératoire.
-
Avec les noyaux 2.1.x et ultérieurs, la valeur de délai maximum peut
être fournie avec la sous-commande
MT_ST_SET_TIMEOUT
associée par OU avec le délai en seconde.
Le délai long (utilisé pour les rembobinages ou les commandes pouvant
durer longtemps) peut être configuré avec
MT_ST_SET_LONG_TIMEOUT.
Les valeurs par défaut du noyau sont très longues pour être sûre qu'une
commande valide ne soit jamais interrompue pour dépassement de délai, et
ceci quelque soit le lecteur.
À cause de cela, le pilote peut parfois sembler gelé alors qu'il est en
attente de dépassement de délai.
Ces commandes permettent donc de fixer des valeurs plus pratiques
pour un lecteur donné.
Les délais fixés pour un périphérique s'appliquent à tous
les périphériques liés au même lecteur.
-
Introduit dans les noyaux 2.4.19 et 2.5.43, le pilote gère un bit d'état
qui indique si le lecteur a besoin d'un nettoyage.
La méthode utilisée par le lecteur pour renvoyer l'information
de nettoyage est configurée en utilisant la sous commande
MT_ST_SEL_CLN.
Si la valeur est zéro, le bit de nettoyage est toujours à zéro.
Si la valeur est un, la donnée TapeAlert définie dans la norme SCSI-3
est utilisée (pas encore implémentée).
Les valeurs 2-17 sont réservées.
Si les huit bits de poids faible sont supérieurs ou égal à 18,
les bits de la donnée « sense » étendue sont utilisés.
Les bits 9-16 forment un masque pour sélectionner les bits à
regarder et les bits 17-23 forment le motif de bits à rechercher.
Si le motif de bit est zéro, un ou plusieurs bits sous le masque indique
la requête de nettoyage.
Si le motif n'est pas zéro, le motif doit correspondre
à l'octet de donnée « sense » masqué.
MTIOCGET --- Obtenir le statut
Cette requête prend un argument du type
(struct mtget *).
/* Structure pour MTIOCGET --- Statut d'une bande magnétique */
struct mtget {
long mt_type;
long mt_resid;
/* Les registres suivants dépendent du matériel */
long mt_dsreg;
long mt_gstat;
long mt_erreg;
/* Ces deux derniers champs sont parfois inutilisés */
daddr_t mt_fileno;
daddr_t mt_blkno;
};
- mt_type
-
Le fichier d'entête définit plusieurs valeurs pour
mt_type,
mais le pilote actuel renvoie uniquement les types génériques
MT_ISSCSI1
(lecteur SCSI-1 générique) et
MT_ISSCSI2
(lecteur SCSI-2 générique).
- mt_resid
-
contient le numéro de partition courante.
- mt_dsreg
-
renvoie la configuration actuelle de la longueur de bloc
(dans les 24 bits de poids faibles)
et la densité (dans les 8 bits de poids forts).
Ces champs sont définis par
MT_ST_BLKSIZE_SHIFT,
MT_ST_BLKSIZE_MASK,
MT_ST_DENSITY_SHIFT,
et
MT_ST_DENSITY_MASK.
- mt_gstat
-
renvoie des informations génériques de statut
(indépendants du périphérique).
Le fichier d'entête définit les macros suivantes
pour tester les bits de statut :
-
-
GMT_EOF(x) :
- La bande est positionnée juste après une filemark
(toujours faux après une opération
MTSEEK).
-
GMT_BOT(x) :
- La bande est positionnée juste au début du premier fichier
(toujours faux après une opération
MTSEEK).
-
GMT_EOT(x) :
- Une opération a atteint la fin physique de la bande (End Of Tape).
-
GMT_SM(x) :
- La bande est positionnée sur une setmark
(toujours faux après une opération
MTSEEK).
-
GMT_EOD(x) :
- La bande est positionnée à la fin des données enregistrées.
-
GMT_WR_PROT(x) :
- La bande est protégée en écriture.
Pour certains enregistreurs, ceci signifie qu'ils ne supportent pas
l'écriture sur ce type de bande.
-
GMT_ONLINE(x) :
- La dernière opération
open(2)
a trouvé le lecteur prêt à agir, avec une bande à l'intérieur.
-
GMT_D_6250(x), GMT_D_1600(x),
GMT_D_800(x) :
- Ces informations « génériques » de statut renvoient la densité actuelle
des lecteurs de bandes 9-pistes ½" seulement.
-
GMT_DR_OPEN(x) :
- Le lecteur ne contient pas de bande.
-
GMT_IM_REP_EN(x) :
- Mode de rapport immédiat.
Ce bit est activé lorsqu'il n'y a aucune assurance que les données aient
été physiquement écrites sur la bande lors du retour de l'appel système.
Le bit est à zéro seulement lorsque le lecteur ne cache pas les données
et que le pilote est configuré pour ne pas faire de cache non plus.
-
GMT_CLN(x) :
- Le lecteur a demandé un nettoyage.
Implémenté dans les noyaux 2.4.19 et 2.5.43 et suivants.
- mt_erreg
-
Le seul champ défini dans
It_erreg
est le nombre d'erreurs corrigées, dans les 16 bits de poids faibles
(comme défini par les masques
MT_ST_SOFTERR_SHIFT
et
MT_ST_SOFTERR_MASK).
À cause d'incompatibilités dans les méthodes utilisées par les lecteurs
pour rendre compte des corrections d'erreur,
cette valeur n'est pas toujours fournie (la plupart des lecteurs
ne renvoient pas, par défaut, les erreurs corrigées, mais cela peut être
modifié avec la commande SCSI MODE SELECT).
- mt_fileno
-
renvoie le numéro du fichier en cours (commençant à 0).
La valeur est mise à -1 si le numéro du fichier est inconnu (par exemple,
après un
MTBSS
ou un
MTSEEK).
- mt_blkno
-
renvoie le numéro de bloc (commençant à 0) à l'intérieur
du fichier en cours.
Cette valeur est mise à -1 quand le numéro de bloc est inconnu
(par exemple, après un
MTBSF,
un
MTBSS
ou un
MTSEEK).
MTIOCPOS --- Obtenir la position de la bande
Cette requête prend un argument du type
(struct mtpos *)
et renvoie une valeur, spécifique au lecteur, correspondant au numéro
de bloc en cours, et qui n'est pas la même que
mt_blkno
renvoyée par
MTIOCGET.
Ce lecteur doit être un SCSI-2 qui supporte la commande
READ POSITION
ou un lecteur SCSI-1 compatible Tandberg
(Tandberg, Archive Viper, Wangtek, ... ).
/* Structure pour commande MTIOCPOS --- Obtenir la position */
struct mtpos {
long mt_blkno; /* current block number */
};
VALEUR RENVOYÉE
- EACCES
-
Tentative d'écriture ou d'effacement sur une bande protégée en écriture.
(Ceci ne peut pas être détecté lors de
open(2).)
- EBUSY
-
Le périphérique est déjà utilisé ou le pilote n'a pas assez de mémoire.
- EFAULT
-
Le paramètre de commande pointe en dehors de la mémoire adressable par
le processus appelant.
- EINVAL
-
Un appel système
ioctl(2)
a un argument invalide, ou la taille de bloc demandée était incorrecte.
- EIO
-
L'opération demandée a échoué.
- ENOMEM
-
Le nombre d'octet dans
read(2)
est plus petit que le prochain bloc physique sur la bande.
(Avant les noyaux 2.2.18 et 2.4.0-test6, les octets supplémentaires
étaient silencieusement ignorés.)
- ENOSPC
-
Une écriture a échoué car la fin de bande a été atteinte.
- ENOSYS
-
Appel système
ioctl(2)
inconnu.
- ENXIO
-
Durant l'ouverture, le lecteur de bande n'existe pas.
- EOVERFLOW
-
Tentative de lire ou d'écrire un bloc de longueur variable plus grand
que la taille des tampons internes du contrôleur.
- EROFS
-
On tente l'ouverture avec
O_WRONLY
ou
O_RDWR
alors que la bande est protégée en écriture.
FICHIERS
- /dev/st*
-
Les lecteurs de bandes SCSI à rembobinage automatique
- /dev/nst*
-
Les lecteurs de bandes SCSI sans rembobinage automatique
NOTES
- 1.
-
Lors d'un échange de données entre systèmes différents, il faut se
mettre d'accord sur la taille des blocs.
Les paramètres d'un lecteur après le démarrage sont souvent différents
de ceux qu'utilisent la plupart des autres systèmes d'exploitation.
La plupart utilisent un mode de blocs de longueur variable si le lecteur
le permet.
Ceci concerne la plupart des lecteurs modernes, y compris les DATs,
les lecteurs 8mm hélicoïdaux, les DLTs...
Il peut être judicieux d'utiliser ces lecteurs en mode de longueur
variable sous Linux aussi (en utilisant
MTSETLK
ou
MTSETDEFBLK
au démarrage), du moins lors de l'échange de données avec des
systèmes d'exploitation différents.
L'inconvénient de ceci est qu'il faut utiliser une taille de bloc assez
grande pour obtenir des taux de transfert acceptable sur un bus SCSI.
- 2.
-
Beaucoup de programmes (comme
tar(1)
par exemple) permettent à l'utilisateur de spécifier
le facteur de blocage sur la ligne de commande.
Notez que ceci détermine la taille de bloc physique uniquement
en mode de bloc de taille variable.
- 3.
-
Pour utiliser les lecteurs de bandes SCSI, le pilote SCSI de base,
un pilote d'adaptateur SCSI et le pilote du lecteur SCSI doivent tous
être configurés dans le noyau ou chargés comme modules.
Si le pilote des bandes SCSI n'est pas présent, le lecteur est reconnu,
mais le support de bande décrit dans cette page n'est pas disponible.
- 4.
-
Le pilote écrit les messages d'erreur sur la console et/ou les fichiers
de journalisation (log).
Les codes SENSE présents dans certains messages sont automatiquement
traduits en texte si les messages SCSI complets sont activés
dans la configuration du noyau.
- 5.
-
L'utilisation du tampon interne du pilote permet de bons débits
en mode de blocs fixes, même avec de petits nombres d'octets dans
read(2)
et
write(2).
Avec les transferts directs, cela n'est pas possible et peut provoquer une
surprise lors de la mise à jour vers le noyau 2.6.
La solution est d'indiquer au logiciel d'utiliser des transferts plus
importants (souvent en lui indiquant d'utiliser des blocs plus importants)
Si cela n'est pas possible, on peut désactiver les transferts directs.
VOIR AUSSI
mt(1)
Le fichier
drivers/scsi/README.st
ou
Documentation/scsi/st.txt
(pour les noyaux 2.6 et suivants) dans les
sources du noyau contient les informations
les plus récentes à propos du pilote et de ses capacités de configuration.
TRADUCTION
Ce document est une traduction réalisée par Christophe Blaess
<http://www.blaess.fr/christophe/> le 18 décembre 1996
et révisée le 17 juillet 2008.
L'équipe de traduction a fait le maximum pour réaliser une adaptation
française de qualité. La version anglaise la plus à jour de ce document est
toujours consultable via la commande : « LANG=C man 4 st ».
N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute
erreur dans cette page de manuel.
Index
- NOM
-
- SYNOPSIS
-
- DESCRIPTION
-
- Transfert de données
-
- Ioctls
-
- MTIOCTOP --- Effectue une opération sur la bande.
-
- MTIOCGET --- Obtenir le statut
-
- MTIOCPOS --- Obtenir la position de la bande
-
- VALEUR RENVOYÉE
-
- FICHIERS
-
- NOTES
-
- VOIR AUSSI
-
- TRADUCTION
-
Dernière mise à jour : 17 juillet 2008