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);
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
faible des numéros mineurs sont assignés séquentiellement dans l’ordre
de détection. Avec le noyau 2.6, les bits au-delà des 8 bits de poids
faible sont concaténés aux 5 bits de poids faible pour former le numéro
de lecteur de bande. Les numéros mineurs peuvent être groupés en deux
ensembles de quatre numéros : 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 produit pas le 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 par lecteur. Les allocations par défaut permettent
de contrôler 32 lecteurs de bandes. Par exemple, 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
avant le 2.1.121, le tampon était alloué sous forme de bloc continu.
Cela limitait la taille de bloc au plus grand espace contigu allouable
par le noyau. Cette limite est actuellement de 128 Ko pour les
architectures 32 bits et 256Ko 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 variable (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é 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 suivante 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 par défaut). 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 un matériel vers le lecteur de bandes par défaut.
Depuis le noyau 2.6.2, le pilote exporte dans le répertoire de sysfs
/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é : la
seule chose importante est d’utiliser lors de la lecture 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 mémoires tampons sont
activées. Dans tous les autres cas (les noyaux antérieurs au 2.1.121
sans mémoire tampon ou 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 pilote essaie de transférer les données
directement entre la mémoire tampon de l’utilisateur et le
périphérique. Si cela n’est pas possible, la mémoire tapon interne au
pilote de périphérique est utilisée. Les raisons de ne pas utiliser des
transferts directs sont entre autres un mauvais alignement de la
mémoire tampon de l’utilisateur (par défaut 512 octets mais cela peut
être changé par le pilote HBA), l’adaptateur SCSI ne peut pas atteindre
un ou plusieurs blocs de la mémoire tampon de l’utilisateur, etc.
Une marque « filemark » est automatiquement écrit sur la bande si la
dernière opération avant fermeture était une écriture.
En lecture, une marque « filemark » provoque les événements suivants :
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. Enfin, le troisième appel
renvoie une erreur.
Ioctls
Le pilote gère 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 paramètre de type (struct mtop *). Certains
contrôleurs ne gèrent pas toutes les opérations. Le pilote renvoie une
erreur EIO si le périphérique 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; /* nombre d’opérations */
};
Opérations sur bande magnétique lors d’une utilisation normale :
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 marque.
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, désactiver la
compression si mt_count est nul. Cette commande utilise
la page MODE 15 supportée par la plupart des DAT.
MTEOM Aller à la fin des enregistrements (ajouter des
fichiers).
MTERASE Efface la bande. Avec un noyau 2.6, un effacement rapide
(bande marquée vide) est effectué si le paramètre est
zéro. Sinon, un effacement long (effacement complet) est
effectué.
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 marque.
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 prévu pour certains chargeurs
automatiques HP. Si mt_count correspond à la 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
n’est pas 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 l’état 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 Définit 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 Définit 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 la gestion du
partitionnement est activée 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
Définit diverses options du pilote ou du lecteur en fonction
des bits codés dans mt_count. Ces options concernent le type de
tampon du lecteur, des options booléennes du pilote, le seuil
d’écriture du tampon, les valeurs par défaut des tailles de
blocs et de densité, ainsi que les délais de réponse (pour les
noyaux 2.1 et ultérieurs). Une fonction n’agit que sur un seul
des éléments de la liste ci-dessus à la fois (l’ensemble des
booléens constitue un élément).
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 l’état BON en écriture
avant que les données ne soient réellement écrites sur
le support.
1 Le contrôleur peut renvoyer l’état 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 l’état BON en é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 bas).
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)
Les opérations d’écriture en mode de bloc fixes sont
mises en cache. 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 : true) 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 est é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 blocs fixes et lecture anticipée
peut être mal positionnée dans un fichier lors de la
fermeture du périphérique. Avec un noyau 2.6, l’option
est activée par défaut pour les lecteurs qui gèrent la
norme SCSI-3.
MT_ST_NO_BLKLIMS (Défaut : faux)
Certains lecteurs n’acceptent pas la commande SCSI READ
BLOCK LIMITS 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
d’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 activée, les périphériques de
bande utilisent les sémantiques System V. Dans le cas
contraire, 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 (i.e. n’attend pas la fin de la
commande) pour certaines commandes comme le rembobinage.
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 afin de s’assurer
qu’une commande valide n’est jamais interrompue pour
dépassement de délai, et ceci quel que 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.
A partir des noyaux 2.4.19 et 2.5.43, le pilote gère un bit
d’état qui indique si le lecteur demande un nettoyage. La
méthode utilisée par le lecteur pour renvoyer l’information sur
le nettoyage est fixée en utilisant la sous-commande
MT_ST_SEL_CLN. Si la valeur est zéro, le bit du nettoyage vaut
toujours zéro. Si la valeur est 1, la donnée TapeAlert définie
dans le standard SCSI-3 est utilisée (pas encore implémenté).
Les valeurs 2 à 17 sont réservées. Si les 8 bits de poids
faible donnent une valeur supérieure à 18, les bits des données
« extended sense » sont utilisés. Les bits 9 à 16 forment un
masque pour sélectionner les bits à observer et les bits 17 à
23 indiquent un motif de bits à rechercher. Si le motif de bits
est nul, un bit ou plus sous le masque indique la requête de
nettoyage. Si le motif est non nul, le motif doit correspondre
à l’octet des données « sense » masqué.
MTIOCGET — Obtenir l’état
Cette requête prend un paramètre du type (struct mtget *).
/* Structure pour MTIOCGET - État de la 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’en-tê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’en-tê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é
depuis les noyaux 2.4.19 et 2.5.43.
mt_erreg Le seul champ défini dans mt_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 paramètre 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 modèle SCSI-2 qui supporte la commande READ
POSITION ou un lecteur SCSI-1 compatible Tandberg (Tandberg, Archive
Viper, Wangtek, ... ).
/* Structure pour MTIOCPOS - Commande pour obtenir la position */
struct mtpos {
long mt_blkno; /* numéro du bloc courant */
};
VALEUR RENVOYÉE
EACCES Tentative d’écriture ou d’effacement sur une bande
protégée en écriture. (Cette erreur ne peut pas
être détectée 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) avait un paramètre non
valable ou la taille de bloc demandée était
incorrecte.
EIO L’opération demandée a échoué.
ENOMEM Le nombre d’octet lu par read(2) est plus petit
que le prochain bloc physique sur la bande. (Avant
2.2.18 et 2.4.0-test6 les octets supplémentaires
étaient ignorés sans rien dire.)
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
DAT, les lecteurs 8mm hélicoïdaux, les DLTs, etc. Il peut
être judicieux d’utiliser ces lecteurs en mode de longueur
variable sous Linux aussi (en utilisant MTSETBLK 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
acceptables sur un bus SCSI.
2. Beaucoup de programmes (comme par exemple tar(1)) permettent
à l’utilisateur de spécifier le facteur de bloc 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 permet de bons débits en
mode blocs fixes même avec peu d’octets lus (avec read(2))
ou écrits (avec 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 de demander
au logiciel d’utiliser des transferts plus importants
(souvent en lui indiquant d’utiliser de plus gros blocs). Si
ce n’est pas possible, les transferts directs peuvent être
désactivés.
VOIR AUSSI
mt(1)
Le fichier drivers/scsi/README.st ou Documentation/scsi/st.txt
(pour les noyaux >= 2.6) dans les sources du noyau contient les
informations les plus récentes à propos du pilote et de ses
capacités de configuration.
COLOPHON
Cette page fait partie de la publication 3.23 du projet
man-pages Linux. Une description du projet et des instructions
pour signaler des anomalies peuvent être trouvées à l’adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par
Christophe Blaess <http://www.blaess.fr/christophe/> entre 1996
et 2003, puis par Alain Portal <aportal AT univ-montp2 DOT fr>
jusqu’en 2006, et mise à disposition sur
http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans
Debian sont directement gérées par Simon Paillard
<simon.paillard@resel.enst-bretagne.fr> et l’équipe francophone
de traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue
sur le paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce
document en utilisant la commande « man -L C
<section> <page_de_man> ».