st(4) 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);

BESCHREIBUNG

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 Minor-Gerätenummern für automatisches Rückspulen, (n, principal) und die Gerätenummern ohne Rücklauf (n + 128, no-rewind). Mit der Principal-Gerätenummer geöffneten 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ückspul-Gerä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. In Kerneln vor 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 von 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 mit Kerneln 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 Kernel 2.6.2 exportiert der Treiber im sysfs-Verzeichnis /sys/class/scsi_tape die vorhandenen Geräte und einiger ihrer Parameter.

Datenübertragung

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, werden die angeforderten Bytes zurückgegeben und der Rest des Blocks verworfen.

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. Kernel vor 2.1.121 ermöglichen Schreibvorgänge mit beliebiger Byteanzahl bei aktivierter Pufferung. In allen anderen Fällen (Kernel 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.

Mit 2.6-Kerneln 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 aufeinander folgende Leseaufrufe signalisiert. Ein dritter Aufruf gibt einen Fehler zurück.

Aufrufe von ioctl(2)

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:

MTIOCTOP --- führt eine Bandoperation aus

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:

MTBSF
um mt_count Dateimarken zurücksetzen
MTBSFM
um mt_count Dateimarken zurücksetzen; Medium auf die EOT-Seite der letzten Dateimarke positionieren
MTBSR
um mt_count Datensätze (Bandblöcke) zurücksetzen
MTBSS
um mt_count »Setmarks« zurücksetzen
MTCOMPRESSION
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.
MTEOM
positioniert auf das Ende der aufgezeichneten Daten (um Dateien anzufügen)
MTERASE
Das Band wird gelöscht, Mit einem 2.6er Kernel wird »kurz gelöscht« (short erase), wenn das Argument gleich Null ist. Anderenfalls wird alles gelöscht (erase all).
MTFSF
um mt_count Dateimarken nach vorn positionieren
MTFSFM
um mt_count Dateimarken nach vorn positionieren; das Medium auf die BOT-Seite der letzten Dateimarke setzen
MTFSR
um mt_count Datensätze (Bandblöcke) nach vorn positionieren
MTFSS
um mt_count »Setmarks« nach vorn positionieren
MTLOAD
führt den SCSI-Befehl »load« 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.
MTLOCK
den Einschub des Bandlaufwerkes verriegeln
MTMKPART
formatiert das Band in ein oder zwei Partitionen. Wenn mt_count ungleich Null ist, gibt es die Größe der ersten Partition an und die zweite Partition umfasst den Rest des Bands. Wenn mt_count Null ist, wird auf dem Band eine Partition angelegt. 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).
MTNOP
Nichts tun – als Seiteneffekt wird der Puffer des Treibers geleert. Die Option sollte genutzt werden, bevor der Status mit MTIOCGET ausgelesen wird.
MTOFFL
zurückspulen und Bandlaufwerk vom Netz nehmen
MTRESET
Laufwerk zurücksetzen
MTRETEN
Band neu spannen
MTREW
zurückspulen
MTSEEK
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ätepezifische Adressen verwendet werden.
MTSETBLK
setzt die Blockgröße des Laufwerks auf den Wert von mt_count. Eine Blockgröße von 0 setzt das Laufwerk auf variable Blockgröße.
MTSETDENSITY
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.
MTSETPART
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).
MTUNLOAD
führt den SCSI-Befehl »unload« aus. (Das Band wird nicht ausgeworfen).
MTUNLOCK
entriegelt den Einschub des Bandlaufwerks
MTWEOF
schreibt mt_count Dateimarken
MTWSM
schreibt mt_count »Setmarks«

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

MTSETDRVBUFFER
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 (timeouts, nur für Kernel 2.1 und später). Eine einzelne Operation 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 physikalische 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 Operationen sind:
MT_ST_BUFFER_WRITES (Vorgabewert: true)
puffert im Festblock-Modus alle Schreiboperationen. Hat diese Option den Wert false und das Laufwerk verwendet eine feste Blockgröße, müssen alle Schreiboperationen 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.
MT_ST_ASYNC_WRITES (Vorgabewert: true)
Ist diese Option auf true gesetzt, geben Schreiboperationen 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 Laufwerksoperation ausgegeben. Diese Option. Eine mögliche Fehlermeldung wird erst nach der nächsten Anweisung zurückgegeben. Diese Option muss auf false gesetzt werden, um zuverlässig Archive über mehrere Bänder hinweg zu erstellen.
MT_ST_READ_AHEAD (Vorgabewert: true)
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 Schreiboperationen mit einem Vielfachen der Blockgröße durchgeführt werden.
MT_ST_TWO_FM (Vorgabewert: false)
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 positioniert das Band anschließend an den Anfang der zweiten (backspace over the second one).
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.
MT_ST_DEBUGGING (Vorgabewert: false)
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.)
MT_ST_FAST_EOM (Vorgabewert: false)
Diese Option bewirkt, dass die MTEOM-Anweisung direkt zum Laufwerk geschickt wird. Dadurch wird die Operation möglicherweise schneller, der Treiber kann aber die aktuelle Dateinummer, die normalerweise von der MTIOCGET-Anfrage zurückgegeben wird, nicht mehr verfolgen. Wenn MT_ST_FAST_EOM gleich»false« ist, wird der Treiber eine MTEOM Anfrage mit »forward spacing over files« reagieren.
MT_ST_AUTO_LOCK (Vorgabewert: false)
Ist diese Option auf true gesetzt, wird das Laufwerk verriegelt, wenn das Gerät geöffnet und entsperrt, wenn es geschlossen wird.
MT_ST_DEF_WRITES (Vorgabewert: false)
Die Bandoptionen (Blockgröße, Modus, Kompression, etc.) können sich beim Wechsel von einem an ein Laufwerk angeschlossenem 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-Befehle 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.
MT_ST_CAN_BSR (Vorgabewert: false)
Wenn Read-Ahead verwendet wird, muss das Band manchmal rückwärts auf die richtige Position gesetzt werden, wenn das Gerät geschlossen und dafür der SCSI-Befehl für das Zurücksetzen über Datensätze hinweg verwendet 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. Mit Kernel 2.6 ist die Standardeinstellung true für Laufwerke, die SCSI-3 unterstützen.
MT_ST_NO_BLKLIMS (Vorgabewert: false)
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.
MT_ST_CAN_PARTITIONS (Vorgabewert: false)
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.
MT_ST_SCSI2LOGICAL (Vorgabewert: false)
Diese Option weist den Treiber an, die im SCSI-2-Standard festgelegten logischen Block-Adressen zu verwenden, wenn er die Operationen »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.
MT_ST_SYSV (Vorgabewert: false)
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 das Band vorwärts über die nächste Dateimarke positioniert, wenn das nicht während der Verwendung des Gerätes geschah. Mit der BSD-Semantik wird das Band nicht neu positioniert.
MT_NO_WAIT (Vorgabewert: false)
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 Operations-Code ODER-verknüpft.
Mit den Kerneln 2.1.x und höher können die Timeout-Werte mit dem Unterbefehl MT_ST_SET_TIMEOUT mit den Timeout in Sekunden oder-verknüpft werden. Die großen Timeout-Werte (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 den Timeout wartet. Diese Befehle können verwendet werden, um realistischere Werte für ein bestimmtes Laufwerk zu setzen. Die für ein Gerät gesetzten Timeouts gelten für alle an dasselbe Laufwerk angeschlossenen Geräte.
Seit den Kernel-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.

MTIOCGET --- Get status

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;
};
mt_type
Die Header-Datei definiert viele Werte für mt_type, aber der aktuelle Treiber unterstützt nur die generischen Typen MT_ISSCSI1 (Generic SCSI-1 tape) und MT_ISSCSI2 (Generic SCSI-2 tape).
mt_resid
enthält die Nummer der aktuellen Band-Partition.
mt_dsreg
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.
mt_gstat
gibt allgemeine (laufwerksunabhängige) Statusinformationen aus. Die Header Datei definiert Makros für die Auswertung dieser Status-Bits:
GMT_EOF(x): Die Bandposition ist direkt hinter einer Dateimarke (immer
false nach einer MTSEEK-Operation).
GMT_BOT(x): Das Band ist auf den Anfang der ersten Datei positioniert (immer false nach einer MTSEEK-Operation).
GMT_EOT(x): Eine Bandoperation hat das physikalische Ende des Bandes
erreicht (EOT).
GMT_SM(x): Das Band ist aktuell auf ein »setmark« positioniert (immer
false nach einer MTSEEK-Operation.
GMT_EOD(x): Das Band ist an das Ende der geschriebenen Daten
positioniert.
GMT_WR_PROT(x): Das Laufwerk ist schreibgeschützt. Bei manchen
Laufwerken kann damit auch gemeint sein, dass das Laufwerk kein Schreiben auf das aktuelle Medium unterstützt.
GMT_ONLINE(x): Das letzte open(2) hat festgestellt, dass ein Medium
eingelegt ist und das Laufwerk betriebsbereit ist.
GMT_D_6250(x), GMT_D_1600(x), GMT_D_800(x): Diese "allgemeine" Statusinformation gibt nur die aktuelle Schreibdichte für
9-Spur-½"-Laufwerke aus.
GMT_DR_OPEN(x): kein Band eingelegt
GMT_IM_REP_EN(x): 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.
GMT_CLN(x): Das Laufwerk hat eine Reinigung angefordert; implementiert
in Kerneln seit 2.4.19 und 2.5.43.
mt_erreg
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.
mt_fileno
Ausgabe der aktuellen Dateinummer (zero-based). Dieser Wert wird auf -1 gesetzt, wenn die Dateinummer nicht bekannt ist (z. B. nach MTBSS oder MTSEEK).
mt_blkno
Ausgabe der Blocknummer innerhalb der aktuellen Datei (zero-based). Dieser Wert wird auf -1 gesetzt, wenn die Blocknummer nicht bekannt ist (z. B. nach MTBSF, MTBSS oder MTSEEK).

MTIOCPOS --- Get tape position

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 dvon 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 */
};

RÜCKGABEWERT

EACCES
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.)
EBUSY
Das Laufwerk wird schon benutzt oder der Treiber konnte keinen Puffer reservieren.
EFAULT
Die Befehlsparameter zeigen auf Speicher, der nicht zum aufrufenden Prozess gehört.
EINVAL
Einem ioctl(2)-Aufruf wurde ein ungültiges Argument übergeben oder die angeforderte Blockgröße ist unzulässig.
EIO
Die angeforderte Operation konnte nicht abgeschlossen werden.
ENOMEM
Die Byteanzahl von read(2) ist kleiner als der nächste physische Block auf dem Band. (Vor 2.2.18 und 2.4.0-test6 wurden die zusätzlichen Bytes stillschweigend ignoriert.)
ENOSPC
Eine Schreiboperation konnte nicht beendet werden, da das Ende des Mediums (EOT) erreicht wurde.
ENOSYS
unbekannter ioctl(2)-Aufruf
ENXIO
Beim Öffnen wurde festgestellt, das das Laufwerk nicht vorhanden ist.
EOVERFLOW
Es wurde versucht, einen Block variabler Länge zu lesen oder zu schreiben. Der Block ist größer als der interne Puffer des Treibers.
EROFS
Es wurde versucht, das schreibgeschützte Laufwerk O_WRONLY oder O_RDWR zu öffnen.

DATEIEN

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

ANMERKUNGEN

1.
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.
2.
Viele Programme (beispielsweise tar(1)) ermöglichen dem Benutzer, die Blockgröße auf der Befehlszeile festzulegen. Beachten Sie, dass sich das nur dann auf die physikalische Blockgröße auswirkt, wenn Blöcke variabler Größe verwendet werden.
3.
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.
4.
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.
5.
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 verwenden (oft werden größere Blöcke benutzt). Wenn das nicht möglich ist, können direkte Transfers deaktiviert werden.

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 4.06 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von Christian Schmidt <[email protected]>, Martin Eberhard Schauer <[email protected]> und Mario Blättermann <[email protected]> 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 <[email protected]>.