st(4) Device Drivers Manual st(4)

st - SCSI-Bandgerät

ÜBERSICHT

#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);

Der st-Treiber stellt eine einheitliche Schnittstelle für diverse SCSI-Bandlaufwerke zur Verfügung. Derzeit übernimmt der Treiber die Kontrolle über alle erkannten Geräte, auf die nur »sequenziell« zugegriffen werden kann. Der st-Treiber verwendet die Major-Gerätenummer 9.

Jedes Gerät verwendet acht Minor-Gerätenummern. Die untersten fünf Bits in den Minor-Nummern werden nacheinander in der Reihenfolge der Erkennung zugeordnet. Im Kernel 2.6 werden die Bits über den acht untersten Bits mit den fünf untersten Bits verkettet, um die Nummer des Bands zu bilden. Die Minor-Nummern lassen sich in zwei Gruppen von vier Nummern aufteilen: die Haupt-Minor-Gerätenummern für automatisches Rückspulen und die Gerätenummern ohne Rücklauf (n + 128, no-rewind). Mit der Hauptgerätenummer geöffnete Geräten wird ein REWIND-Befehl gegeben, wenn sie geschlossen werden. Diesen Befehl erhalten mit der no-rewind-Gerätenummer geöffnete Geräte nicht. (Beachten Sie, dass ein Rückspulgerät mit mt nicht positioniert werden kann: das Band wird nach dem mt-Befehl zurückgespult und der nächste Befehl hat als Ausgangspunkt den Anfang des Bands.)

Innerhalb jeder Gruppe stehen vier Minor-Nummern zur Verfügung, um Geräte mit unterschiedlichen Eigenschaften zu definieren (Blockgröße, Kompression, Dichte usw.). Wenn das System startet, steht nur das erste Gerät zur Verfügung. Die anderen drei werden standardmäßig aktiviert, wenn die Merkmale definiert sind (siehe unten). (Durch die Änderung von Kompilierungs-Konstanten ist es möglich, die Balance zwischen der maximalen Anzahl von Bandlaufwerken und der Anzahl der Minor-Nummern für jedes Laufwerk zu ändern. Die Standard-Zuweisung ermöglicht die Steuerung von 32 Bandlaufwerken. Beispielsweise ist es möglich, bis zu 64 Bandlaufwerke mit zwei Minor-Nummern für verschiedene Optionen zu steuern.)

Geräte werden üblicherweise mit


mknod -m 666 /dev/st0 c 9 0
mknod -m 666 /dev/st0l c 9 32
mknod -m 666 /dev/st0m c 9 64
mknod -m 666 /dev/st0a c 9 96
mknod -m 666 /dev/nst0 c 9 128
mknod -m 666 /dev/nst0l c 9 160
mknod -m 666 /dev/nst0m c 9 192
mknod -m 666 /dev/nst0a c 9 224

erstellt. Es gibt kein entsprechendes blockorientiertes Gerät.

Der Treiber benutzt einen internen Puffer, der groß genug sein muss, um mindestens einen Band-Block aufzunehmen. Vor Linux 2.1.121 wird der Puffer als ein zusammenhängender Block zugewiesen. Dies beschränkt die Blockgröße auf den größten zusammenhängenden Speicherblock, den der Kernel-Allocator vergeben kann. Die Grenze ist derzeit 128 kB für 32-Bit-Architekturen und 256 kB für 64-Bit-Architekturen. In neueren Kerneln teilt der Treiber den Puffer in mehrere Teile, wenn nötig. Standardmäßig ist die maximale Anzahl der Teile 16. Das bedeutet, dass die maximale Blockgröße sehr groß ist (2 MB, wenn die Zuteilung von 16 Blöcken zu je 128 kB gelingt).

Die interne Puffergröße des Treibers wird durch eine Compiler-Konstante bestimmt, die aber mit einer Kernel-Startoption überschrieben werden kann. Darüber hinaus versucht der Treiber, zur Laufzeit im Bedarfsfall einen größeren temporären Puffer bereitzustellen. Es ist aber durchaus möglich, dass zur Laufzeit die Zuteilung von großen, zusammenhängenden Speicherblöcken fehlschlägt. Daher ist es ratsam, sich nicht zu sehr auf dynamische Pufferzuweisung in Linux vor 2.1.121 zu verlassen. (Das gilt auch für das bedarfsweise Laden des Treibers mit kerneld oder kmod.)

Der Treiber unterstützt nicht speziell bestimmte Marken oder Geräte. Nach dem Systemstart werden die Geräte-Optionen von der Firmware des Laufwerks bestimmt. Wenn z. B. die Firmware Blöcke fester Größe wählt, arbeitet das Bandlaufwerk im Festblock-Modus. Die Optionen können mit expliziten Aufrufen von ioctl(2) geändert werden und bleiben in Kraft, wenn das Gerät geschlossen und wieder geöffnet wird. Das Einstellen der Optionen betrifft Geräte sowohl mit als auch ohne Rückspulfunktion.

Für die verschiedenen Geräte innerhalb der Vierer-Untergruppen können unterschiedliche Optionen angegeben werden. Die Optionen werden wirksam, wenn das Gerät geöffnet wird. Zum Beispiel kann der Systemadministrator festlegen, dass ein Gerät mit einer bestimmten Blockgröße im Festblock-Modus schreibt und ein anderes Gerät mit variabler Blockgröße betrieben wird (wenn das Laufwerk beide Modi unterstützt).

Wenn das Gerät mit Band-Partionen umgehen kann, wird das vom Treiber unterstützt. (Beachten Sie, dass Band-Partitionen nichts mit Festplatten-Partitionen zu tun haben. Ein partitioniertes Band kann als mehrere logische Bänder innerhalb eines Mediums angesehen werden.) Die Unterstützung von Partitionen muss mit einem Aufruf von ioctl(2) aktiviert werden. Der Treiber merkt sich im Fall von Partitionswechseln die Positionen auf dem Band. Die Partition für die nachfolgenden Bandoperationen wird mit einem Aufruf von ioctl(2) ausgewählt. Der Wechsel der Partition wird zusammen mit der nächsten Bandoperation ausgeführt, um unnötige Bandbewegungen zu vermeiden. Die maximale Anzahl der Partitionen auf einem Band wird durch eine Compiler-Konstante (ursprünglich vier) definiert. Der Treiber enthält einen ioctl(2), der ein Band mit einer oder zwei Partitionen formatieren kann.

Das Gerät /dev/tape wird üblicherweise als harter oder symbolischer Link auf das Standard-Bandgerät des Systems angelegt.

Seit Linux 2.6.2 exportiert der Treiber im sysfs-Verzeichnis /sys/class/scsi_tape die vorhandenen Geräte und einige ihrer Parameter.

Der Treiber unterstützt den Betrieb sowohl im Festblock-Modus als auch im variablen Modus (wenn das Laufwerk dazu imstande ist). Im Festblock-Modus schreibt das Laufwerk Blöcke der angegebenen Größe, wobei die Blockgröße nicht abhängig von der Byteanzahl der Schreib-Systemaufrufe ist. Bei variabler Blockgröße wird für jeden Schreibaufruf ein Block geschrieben, die Byteanzahl des Aufrufs bestimmt die Größe des entsprechenden Blocks auf dem Band. Beachten Sie, dass die Blöcke auf dem Band keine Informationen über den Schreibmodus enthalten: Beim Lesen ist das einzig Wichtige, Befehle zu verwenden, die Blockgrößen auf dem Band erkennen und danach handeln können.

Bei variabler Blockgröße muss die Anzahl gelesener Bytes nicht exakt zur Bandblockgröße passen. Wenn die Byteanzahl größer ist als der nächste Block auf dem Band, gibt der Treiber die Daten zurück und die Funktion liefert die aktuelle Blockgröße. Wenn der Block größer ist als die angeforderte Anzahl von Bytes, wird ein Fehler zurückgegeben.

Im Festblock-Modus kann die Anzahl der zu lesenden Bytes beliebig sein, wenn Pufferung aktiviert ist, oder ein Vielfaches der Blockgröße des Bandes, wenn Pufferung deaktiviert ist. Linux vor 2.1.121 ermöglicht Schreibvorgänge mit beliebiger Byteanzahl bei aktivierter Pufferung. In allen anderen Fällen (Linux vor 2.1.121 mit deaktivierter Pufferung oder neuere Kernel) muss die Anzahl der zu schreibenden Bytes ein Vielfaches der Blockgröße des Bands sein.

In Linux 2.6 versucht der Treiber direkte Transfers zwischen dem Benutzerpuffer und dem Gerät. Wenn das nicht möglich ist, wird der Treiber seinen internen Puffer verwenden. Die Gründe dafür, keine direkten Transfers zu verwenden, umfassen falsche Ausrichtung des Benutzerpuffers (Vorgabe sind 512 Byte, aber diese kann durch den HBA-Treiber geändert werden), eine oder mehrere vom SCSI-Adapter nicht erreichbare Seiten des Benutzerpuffers, etc.

Wenn die letzte Bandoperation vor dem Schließen ein Schreibvorgang war, wird automatisch eine Dateimarke geschrieben.

Wenn beim Lesen eine Dateimarke angetroffen wird, geschieht folgendes: Wenn noch Daten im Puffer sind, wenn die Dateimarke gefunden wird, werden die gepufferten Daten zurückgegeben. Der nächste Leseaufruf gibt null Byte zurück. Der übernächste Leseaufruf gibt Daten aus der nächsten Datei zurück. Das Ende der aufgezeichneten Daten wird durch Rückgabe von null Byte für zwei aufeinanderfolgende Leseaufrufe signalisiert. Ein dritter Aufruf gibt einen Fehler zurück.

Der Treiber unterstützt drei verschiedene ioctl(2)-Aufrufe. Alle vom st-Treiber nicht erkannten Aufrufe werden an den SCSI-Treiber weitergereicht. Die folgenden Definitionen wurden aus /usr/include/linux/mtio.h entnommen:

Diese Operation verarbeitet ein Argument vom Typ (struct mtop *). Nicht alle Laufwerke unterstützen jede der möglichen Anweisungen. Der Treiber gibt ein EIO zurück, wenn das Laufwerk die Anweisung nicht unterstützt.


/* Struktur für den MTIOCTOP-Befehl an das Bandlaufwerk */
struct mtop {
    short   mt_op;      /* im Folgenden definierte Operationen */
    int     mt_count;   /* Anzahl der Operationen */
};

Operationen für den Normalbetrieb von Bandlaufwerken:

um mt_count Dateimarken zurückspringen
um mt_count Dateimarken zurückspringen; Medium auf die EOT-Seite der letzten Dateimarke positionieren
um mt_count Datensätze (Bandblöcke) zurückspringen
um mt_count »Setmarks« zurückspringen
Wenn mt_count ungleich Null ist, wird die Kompression der Banddaten durch das Laufwerk aktiviert. Ist mt_count gleich Null, wird die Kompression deaktiviert. Dieser Befehl verwendet die »MODE page 15«, welche von den meisten digitalen Magnetbandgeräten (Digital Audio Tape, DAT) unterstützt wird.
positioniert auf das Ende der aufgezeichneten Daten (um Dateien anzufügen)
Das Band wird gelöscht, Mit Linux 2.6 wird »kurz gelöscht« (short erase), wenn das Argument gleich Null ist. Anderenfalls wird alles gelöscht (erase all).
um mt_count Dateimarken vorwärtsspringen
um mt_count Dateimarken vorwärtsspringen; das Medium auf die BOT-Seite der letzten Dateimarke setzen
um mt_count Datensätze (Bandblöcke) vorwärtsspringen
um mt_count »Setmarks« vorwärtsspringen
führt den SCSI-Ladebefehl aus. Für einige HP-Bandwechsler steht eine spezielle Option zur Verfügung. Wenn mt_count gleich der Konstante MT_ST_HPLOADER_OFFSET plus einer Zahl ist, wird die Zahl an das Laufwerk gesendet, um den Bandwechsler zu steuern.
den Einschub des Bandlaufwerkes verriegeln
formatiert das Band in ein oder zwei Partitionen. Wenn mt_count positiv ist, gibt es die Größe der Partition 1 an und Partition 2 umfasst den Rest des Bands. Wenn mt_count Null ist, wird auf dem Band eine Partition angelegt. Seit Linux 4.6 legt ein negativer mt_count die Größe der Partition 0 fest und der Rest des Bandes umfasst Partition 1. Die physische Reihenfolge der Partitionen hängt vom Laufwerk ab. Dieser Befehl ist nur für Laufwerke zulässig, wenn die Unterstützung von Partitionen für das Laufwerk aktiviert ist (siehe MT_ST_CAN_PARTITIONS weiter unten).
Nichts tun — als Seiteneffekt wird der Puffer des Treibers geleert. Die Option sollte genutzt werden, bevor der Status mit MTIOCGET ausgelesen wird.
zurückspulen und Bandlaufwerk vom Netz nehmen
Laufwerk zurücksetzen
Band neu spannen
zurückspulen
sucht nach dem Bandblock mit der Nummer mt_count. Diese Anweisung erfordert ein SCSI-2-Bandlaufwerk, welches den LOCATE-Befehl unterstützt (gerätespezifische Adresse) oder ein Tandberg-kompatibles SCSI-1-Laufwerk (Tandberg, Archive, Viper, Wangtek, etc.). Die Blocknummer sollte vorher von MTIOCPOS zurückgegeben worden sein, wenn gerätespezifische Adressen verwendet werden.
setzt die Blockgröße des Laufwerks auf den Wert von mt_count. Eine Blockgröße von 0 setzt das Laufwerk auf variable Blockgröße.
setzt die Schreibdichte (tape density) auf den Wert in mt_count. Die Kodierung der von einem Laufwerk unterstützten Schreibdichte finden Sie in der Laufwerksdokumentation.
Die aktive Partition wird auf mt_count gesetzt. Die Partitionen werden von Null gezählt. Dieser Befehl ist nur für ein Laufwerk zulässig, wenn die Partitionsunterstützung für das Laufwerk aktiviert ist (siehe MT_ST_CAN_PARTITIONS weiter unten).
führt den SCSI-Entladebefehl aus. (Das Band wird nicht ausgeworfen).
entriegelt den Einschub des Bandlaufwerks
schreibt mt_count Dateimarken
schreibt mt_count »Setmarks«

Magnetband-Aktionen für das Setzen von Geräte-Optionen (für den Superuser):

setzt diverse Geräte- und Treiberoptionen gemäß den in mt_count kodierten Bits. Diese umfassen den Puffer-Modus des Laufwerks, einen Satz von booleschen Treiberoptionen, den Schreibschwellwert des Treiberpuffers, Vorgabewerte für Blockgröße und Schreibdichte, Zeitschranken (Zeitüberschreitungen, erst seit Kernel 2.1). Eine einzelne Aktion kann nur ein Element dieser Aufzählung beeinflussen (die booleschen Werte werden dabei als ein Wert angesehen).
Ein Wert mit Nullen in den oberen (high-order) vier Bits wird zum Setzen des Puffermodus des Laufwerks verwendet. Die Modi sind:
0
Das Laufwerk gibt erst dann einen GOOD-Status zurück, wenn die Datenblöcke tatsächlich auf das Medium geschrieben wurden.
1
Das Laufwerk darf den Status GOOD für Schreibbefehle melden, sobald alle Daten in den internen Laufwerkspuffer übertragen wurden.
2
Das Laufwerk darf den Status GOOD für Schreibbefehle melden, sobald (a) alle Daten in den internen Laufwerkspuffer übertragen wurden und (b) alle in dem Laufwerkspuffer (aus verschiedenen Aufrufen) zwischengespeicherten Daten erfolgreich auf das Medium geschrieben wurden.
Der Schreibschwellwert wird über mt_count gesteuert: mt_count muss in den unteren 28 Bit die Konstante MT_ST_WRITE_THRESHOLD bitweise ODER-verknüpft mit einer Blockzahl enthalten. Der Blockzähler zählt 1024 Byte große Blöcke, nicht die physische Blockgröße auf dem Band. Der Schwellwert kann die interne Puffergröße des Treibers nicht überschreiten (siehe BESCHREIBUNG).
Um die booleschen Optionen zu setzen oder zu löschen, muss der Wert in mt_count entweder eine der Konstanten MT_ST_BOOLEANS, MT_ST_SETBOOLEANS, MT_ST_CLEARBOOLEANS oder MT_ST_DEFBOOLEANS bitweise ODER-verknüpft mit einer beliebigen gewünschten Kombination der folgenden Optionen enthalten. Mit MT_ST_BOOLEANS können die Optionen auf die Werte in den entsprechenden Bits gesetzt werden. Mit MT_ST_SETBOOLEANS können die Optionen gezielt eingestellt und mit MT_ST_DEFBOOLEANS gelöscht werden.
Die Standardoptionen für ein Bandgerät werden mit MT_ST_DEFBOOLEANS gesetzt. Ein nicht aktives Bandgerät (z.B. ein Gerät mit den Minor-Nummern 32 oder 160) wird aktiviert, wenn seine Standardoptionen das erste Mal definiert werden. Ein aktiviertes Gerät erbt von dem beim Systemstart aktivierten Gerät alle nicht explizit gesetzten Optionen.
Die booleschen Aktionen sind:
puffert im Festblock-Modus alle Schreibaktionen. Hat diese Option den Wert false und das Laufwerk verwendet eine feste Blockgröße, müssen alle Schreibaktionen mit einem Vielfachen der Blockgröße durchgeführt werden. Diese Option muss auf false gesetzt werden, um zuverlässig Archive über mehrere Bänder hinweg zu erstellen.
Ist diese Option auf true gesetzt, geben Schreibaktionen umgehend die Kontrolle an das aufrufenden Programm zurück, ohne auf den Transfer der Daten zum Laufwerk zu warten, wenn die Daten in den Puffer des Treibers passen. Der Schreibschwellwert bestimmt den »Füllstand« des Puffers, ab dem ein neuer SCSI-»write«-Befehl erteilt wird. Alle Fehlermeldungen des Laufwerks werden gesammelt und bei der nächsten Laufwerksaktion ausgegeben. Diese Option muss auf false gesetzt werden, um zuverlässig Archive über mehrere Bänder hinweg zu erstellen.
Diese Option veranlasst den Treiber, im Festblock-Modus Daten vorausschauend zu lesen (read-ahead) und die gelesenen Daten zwischenzuspeichern (read buffering). Wird diese Option auf false gesetzt und das Laufwerk arbeitet mit einer festen Blockgröße, müssen alle Leseaktionen mit einem Vielfachen der Blockgröße durchgeführt werden.
Diese Option beeinflusst das Treiberverhalten beim Schließen einer Datei. Normalerweise wird eine einzelne Dateimarke geschrieben. Wird diese Option auf »true« gesetzt, schreibt der Treiber zwei Dateimarken und springt zum zweiten.
Achtung: Weil QIC-Bandlaufwerke nicht in der Lage sind, Dateimarken zu überschreiben, sollte die Option für diese nicht auf true gesetzt werden. Diese Laufwerke erkennen das Ende der geschriebenen Daten nicht an zwei aufeinanderfolgenden Dateimarken, sondern an unbeschriebenen Bandbereichen. Die Mehrzahl der anderen aktuellen Laufwerke erkennen ebenfalls das Ende des Datenbereichs und die Verwendung von zwei Dateimarken ist normalerweise nur dann notwendig, wenn Bänder mit anderen Systemen ausgetauscht werden.
Diese Option bewirkt, dass der Treiber diverse Debug-Meldungen ausgibt. (Sie wirkt sich nur aus, wenn beim Kompilieren des Treibers DEBUG ungleich Null definiert war.)
Diese Option bewirkt, dass die MTEOM-Anweisung direkt zum Laufwerk geschickt wird. Dadurch wird die Aktion möglicherweise schneller, der Treiber kann aber die aktuelle Dateinummer, die normalerweise von der MTIOCGET-Anfrage zurückgegeben wird, nicht mehr nachverfolgen. Wenn MT_ST_FAST_EOM »false« ist, wird der Treiber auf eine MTEOM-Anfrage durch Vorwärtsspringen über Dateien reagieren.
Ist diese Option auf true gesetzt, wird das Laufwerk verriegelt, wenn die Gerätedatei geöffnet und entsperrt, wenn sie geschlossen wird.
Die Bandoptionen (Blockgröße, Modus, Kompression, etc.) können sich beim Wechsel von einem an ein Laufwerk angeschlossenen Gerät zu einem anderen an demselben Laufwerk angeschlossenen Gerät ändern. Die Änderung der Optionen hängt von der Definition der Geräte ab. Diese Option definiert, wann die Änderungen durch den Treiber mittels SCSI-Befehlen durchgeführt werden und wann sich auf die Fähigkeiten der Laufwerke zur automatischen Erkennung verlassen wird. Wenn diese Option false ist, sendet der Treiber die SCSI-Befehle sofort, wenn das Gerät gewechselt wird. Wenn die Option true ist, werden die SCSI-Befehle nicht gesendet, bis ein Schreiben beantragt wird. In diesem Fall darf die Firmware des Laufwerks die Bandstruktur beim Lesen ermitteln und die SCSI-Befehle werden nur benutzt, um sicherzustellen, dass ein Band nach der richtigen Spezifikation geschrieben wird.
Wenn Read-Ahead verwendet wird, muss auf dem Band manchmal rückwärts zur richtigen Position gesprungen werden, wenn das Gerät geschlossen und der SCSI-Befehl für das Rückwärtsspringen über Datensätze für diesen Zweck verwandt wird. Einige ältere Laufwerke können diesen Befehl nicht zuverlässig verarbeiten. Mit dieser Option kann der Treiber angewiesen werden, diesen Befehl nicht zu verwenden. Das bedeutet also, dass mit Read-Ahead und Festblock-Modus das Band möglicherweise nicht korrekt in einer Datei positioniert werden kann, wenn das Gerät geschlossen wird. In Linux 2.6 ist die Standardeinstellung true für Laufwerke, die SCSI-3 unterstützen.
Einige Laufwerke akzeptieren den SCSI-Befehl READ BLOCK LIMITS nicht. Wenn diese Option verwendet wird, wird der Treiber den Befehl nicht verwenden. Der Nachteil ist, dass der Treiber nicht vor dem Senden von Befehlen prüfen kann, ob die gewählte Blockgröße für das Laufwerk zulässig ist.
Diese Option aktiviert die Unterstützung für mehrere Partitionen auf einem Band. Die Option gilt für alle mit dem Laufwerk verbundenen Geräte.
Diese Option weist den Treiber an, die im SCSI-2-Standard festgelegten logischen Block-Adressen zu verwenden, wenn er die Aktion »seek« und »tell« durchführt (sowohl mit den Befehlen MTSEEK und MTIOCPOS als auch beim Wechsel der Band-Partition). Andernfalls werden die gerätespezifischen Adressen verwendet. Es wird dringend empfohlen, diese Option zu setzen, wenn das Laufwerk die logischen Adressen unterstützt, weil sie auch Dateimarken zählen. Es gibt einige Laufwerke, die nur die logischen Block-Adressen unterstützen.
Wenn diese Option aktiviert ist, verwenden die Bandgeräte die System-V-Semantik. Andernfalls wird die BSD-Semantik verwendet. Der wichtigste Unterschied zwischen den Semantiken ist, was passiert, wenn ein zum Lesen verwendetes Gerät geschlossen wird: mit der System-V-Semantik wird auf dem Band vorwärts über die nächste Dateimarke hinweg gesprungen, wenn das nicht während der Verwendung des Gerätes geschah. Mit der BSD-Semantik wird das Band nicht neu positioniert.
Aktiviert den »sofort«(immediate)-Modus für einige Befehle (z. B. zurückspulen). Es wird also die Ausführung des Befehls nicht abgewartet.

Ein Beispiel:


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);

Die Standard-Blockgröße für ein Gerät kann mit MT_ST_DEF_BLKSIZE und der Code für die Standarddichte mit MT_ST_DEFDENSITY eingestellt werden. Die Werte für die Parameter werden mit dem Aktions-Code ODER-verknüpft.

Mit Linux 2.1.x und neuer können die Zeitüberschreitungswerte mit dem Unterbefehl MT_ST_SET_TIMEOUT mit der Zeitüberschreitung in Sekunden oder-verknüpft werden. Die großen Zeitüberschreitungswerte (für Zurückspulen und andere Befehle, die eine lange Zeit dauern können) kann mit MT_ST_SET_LONG_TIMEOUT eingestellt werden. Die Kernel-Standardwerte sind sehr groß, um sicherzustellen, dass ein erfolgreich ausgeführter Befehl nicht auf einem beliebigen Laufwerk gestoppt wird. Aus diesem Grund kann der Treiber selbst als aufgehängt erscheinen, wenn er nur auf die Zeitüberschreitung wartet. Diese Befehle können verwendet werden, um realistischere Werte für ein bestimmtes Laufwerk zu setzen. Die für ein Gerät gesetzten Zeitüberschreitungen gelten für alle an dasselbe Laufwerk angeschlossenen Geräte.

Seit den Linux-Versionen 2.4.19 und 2.5.43 unterstützt der Treiber ein Status-Bit, ob das Laufwerk eine Reinigung anfordert. Die Methode, mit der das Laufwerk Reinigungsinformationen zurückgibt, wird mit dem Unterbefehl MT_ST_SEL_CLN festgelegt. Ist der Wert gleich Null, ist das Reinigungs-Bit immer Null. Wenn der Wert gleich eins ist, werden die im SCSI-3-Standard festgelegten TapeAlert-Daten in der SCSI-3-Norm verwendet (noch nicht implementiert). Die Werte von 2 bis 17 sind reserviert. Wenn die niedrigsten acht Bit >= 18 sind, werden Bits aus den erweiterten Status-Daten verwendet. Die Bits 9-16 bestimmen eine Maske, mit der die betrachteten Bits ausgewählt werden; die Bits 17-23 geben das Suchmuster an. Wenn das Bitmuster Null ist, zeigen ein oder mehrere Bits unter der Maske die Reinigungsanfrage an. Wenn das Muster ungleich Null ist, muss das Muster dem maskierten Sensor-Datenbyte entsprechen.

Dieser Aufruf erfordert ein Argument des Typs (struct mtget *).


/* Struktur für den MTIOCGET-Befehl - »mag tape get status« */
struct mtget {
    long    mt_type;
    long    mt_resid;
    /* Die folgenden Register sind laufwerksabhängig. */
    long    mt_dsreg;
    long    mt_gstat;
    long    mt_erreg;
    /* Die folgenden zwei Felder werden nicht immer verwendet. */
    daddr_t    mt_fileno;
    daddr_t    mt_blkno;
};
Die Header-Datei definiert viele Werte für mt_type, aber der aktuelle Treiber berichtet nur die generischen Typen MT_ISSCSI1 (Generic SCSI-1 tape) und MT_ISSCSI2 (Generic SCSI-2 tape).
enthält die Nummer der aktuellen Band-Partition.
gibt die aktuellen Laufwerkseinstellungen für die Blockgröße (in den unteren 24 Bit) und die Schreibdichte (in den oberen 8 Bit) aus. Diese Felder sind durch MT_ST-BLKSIZE_SHIFT, MT_ST_BLKSIZE_MASK, MT_ST_DENSITY_SHIFT und MT_ST_DENSITY_MASK definiert.
gibt allgemeine (laufwerksunabhängige) Statusinformationen aus. Die Header-Datei definiert Makros für die Auswertung dieser Status-Bits:
Die Bandposition ist direkt hinter einer Dateimarke positioniert (immer false nach einer MTSEEK-Aktion).
Das Band ist auf den Anfang der ersten Datei positioniert (immer false nach einer MTSEEK-Aktion).
Eine Bandaktion hat das physische Ende des Bandes erreicht (EOT).
Das Band ist aktuell auf ein »setmark« positioniert (immer false nach einer MTSEEK-Aktion).
Das Band ist an das Ende der geschriebenen Daten positioniert.
Das Laufwerk ist schreibgeschützt. Bei manchen Laufwerken kann damit auch gemeint sein, dass das Laufwerk kein Schreiben auf das aktuelle Medium unterstützt.
Das letzte open(2) hat festgestellt, dass ein Medium eingelegt ist und das Laufwerk betriebsbereit ist.
Diese »allgemeine« Statusinformation gibt nur die aktuelle Schreibdichte für 9-Spur-½"-Laufwerke aus.
Es ist kein Band eingelegt.
Sofortberichtmodus - Dieses Bit wird gesetzt, wenn nicht garantiert ist, dass die Daten physisch auf das Band geschrieben wurden, wenn der Rücksprung aus dem Schreibaufruf erfolgt. Es wird nur auf Null gesetzt, wenn der Treiber Daten nicht puffert und das Laufwerk auch nicht puffern soll.
Das Laufwerk hat eine Reinigung angefordert; implementiert in Linux seit 2.4.19 und 2.5.43.
Das einzige definierte Feld in mt_erreg ist der »Fehlerzähler« (es werden nur behobene Fehler gezählt) in den unteren 16 Bits (wie durch MT_ST_SOFTERR_SHIFT and MT_ST_SOFTERR_MASK definiert). Da dieser Zähler keinem Standard unterliegt (also von Laufwerk zu Laufwerk unterschiedlich sein kann), wird er nicht oft benutzt. (Standardmäßig berichten die meisten Laufwerke keine weichen Fehler, dies kann aber mit einem »SCSI MODE SELECT«-Befehl geändert werden.)
Ausgabe der aktuellen Dateinummer (nullbasiert). Dieser Wert wird auf -1 gesetzt, wenn die Dateinummer nicht bekannt ist (z. B. nach MTBSS oder MTSEEK).
Ausgabe der Blocknummer innerhalb der aktuellen Datei (nullbasiert). Dieser Wert wird auf -1 gesetzt, wenn die Blocknummer nicht bekannt ist (z. B. nach MTBSF, MTBSS oder MTSEEK).

Dieser Aufruf erfordert ein Argument vom Typ (struct mtpos *) und gibt die aktuelle Blocknummer auf dem Band (aus Sicht des Laufwerks) aus. Diese ist nicht die gleiche wie mt_blkno, welche von MTIOCGET zurückgegeben wird. Das Laufwerk muss ein SCSI-2-Laufwerk sein und den READ POSITION-Befehl unterstützen (laufwerksabhängige Adresse) oder ein Tandberg-kompatibles SCSI-1-Laufwerk (Tandberg, Archive, Viper, Wangtek, usw.).


/* Struktur für den MTIOCPOS-Befehl »get position« */
struct mtpos {
    long mt_blkno;    /* aktuelle Blocknummer */
};

Es wurde versucht, auf ein schreibgeschütztes Medium zu schreiben oder es zu löschen. (Dieser Fehler wird nicht während einem open(2) erkannt.)
Das Laufwerk wird schon benutzt oder der Treiber konnte keinen Puffer reservieren.
Die Befehlsparameter zeigen auf Speicher, der nicht zum aufrufenden Prozess gehört.
Einem ioctl(2)-Aufruf wurde ein ungültiges Argument übergeben oder die angeforderte Blockgröße ist unzulässig.
Die angeforderte Aktion konnte nicht abgeschlossen werden.
Die Byteanzahl von read(2) ist kleiner als der nächste physische Block auf dem Band. (Vor Linux 2.2.18 und 2.4.0 wurden die zusätzlichen Bytes stillschweigend ignoriert.)
Eine Schreibaktion konnte nicht beendet werden, da das Ende des Mediums (EOT) erreicht wurde.
unbekannter ioctl(2)-Aufruf
Beim Öffnen wurde festgestellt, das das Laufwerk nicht vorhanden ist.
Es wurde versucht, einen Block variabler Länge zu lesen oder zu schreiben. Der Block ist größer als der interne Puffer des Treibers.
Es wurde versucht, das schreibgeschützte Laufwerk O_WRONLY oder O_RDWR zu öffnen.

/dev/st*
SCSI-Bandlaufwerke, die automatisch zurückspulen
/dev/nst*
SCSI-Bandlaufwerke, die nicht zurückspulen

Beim Austausch von Daten zwischen Systemen müssen sich beide Systeme auf die physische Blockgröße der Bänder einigen. Die Parameter eines Laufwerks nach dem Start sind oft nicht diejenigen, die die meisten Betriebssysteme mit diesen Geräten verwenden. Die meisten Systeme nutzen die Laufwerke mit variabler Blockgröße, wenn das Laufwerk diesen Modus unterstützt. Dies gilt für die meisten modernen Laufwerke, einschließlich DAT, 8mm-Helical-Scan-Laufwerke, DLTs usw. Es kann ratsam sein, diese Laufwerke auch unter Linux mit variabler Blockgröße (d. h. beim Systemstart mit MTSETBLK oder MTSETDEFBLK diesen Modus festlegen) zu betreiben, zumindest für den Austausch von Daten mit einem fremden System. Der Nachteil davon ist, dass eine ziemlich große Bandblockgröße verwendet werden muss, um akzeptable Übertragungsraten auf dem SCSI-Bus zu erreichen.
Viele Programme (beispielsweise tar(1)) ermöglichen dem Benutzer, die Blockgröße auf der Befehlszeile anzugeben. Beachten Sie, dass sich das nur dann auf die physische Blockgröße auswirkt, wenn Blöcke variabler Größe verwendet werden.
Um SCSI-Bandlaufwerke zu verwenden, müssen der grundlegende SCSI-Treiber, ein SCSI-Adapter-Treiber und der SCSI-Treiber für Bandlaufwerke entweder im Kernel konfiguriert sein oder als Module geladen werden. Wenn der SCSI-Laufwerkstreiber nicht vorhanden ist, wird das Laufwerk erkannt, aber die in dieser Seite beschriebene Bandunterstützung ist nicht verfügbar.
Der Treiber schreibt Fehlermeldungen auf die Konsole/in die Protokolldatei. Die SENSE-Codes werden automatisch in Text übersetzt, wenn bei der Kernel-Konfiguration ausführliche SCSI-Meldungen aktiviert wurden.
Die interne Pufferung des Treibers ermöglicht guten Durchsatz im Festblock-Modus auch mit kleinen Bytezahlen für read(2) und write(2). Bei direkten Transfers ist das nicht möglich und kann eine Überraschung bei der Umstellung auf den 2.6-Kernel verursachen. Die Lösung ist, die Software anzuweisen, größere Übertragungen zu verwenden (oft werden größere Blöcke benutzt). Wenn das nicht möglich ist, können direkte Transfers deaktiviert werden.

mt(1)

Die Datei drivers/scsi/README.st oder Documentation/scsi/st.txt (Kernel >= 2.6) im Linux-Kernelquelltext-Verzeichnis enthält die aktuellsten Informationen über den Treiber und seine Konfigurationsmöglichkeiten.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von Christian Schmidt <c.schmidt@ius.gun.de>, Martin Eberhard Schauer <Martin.E.Schauer@gmx.de>, Mario Blättermann <mario.blaettermann@gmail.com> und Helge Kreutzmann <debian@helgefjell.de> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer.

2. Mai 2024 Linux man-pages 6.8