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. 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 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 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 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. 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 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:
- MTBSF
- um mt_count Dateimarken zurückspringen
- MTBSFM
- um mt_count Dateimarken zurückspringen; Medium auf die
EOT-Seite der letzten Dateimarke positionieren
- MTBSR
- um mt_count Datensätze (Bandblöcke)
zurückspringen
- MTBSS
- um mt_count »Setmarks« zurückspringen
- 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 vorwärtsspringen
- MTFSFM
- um mt_count Dateimarken vorwärtsspringen; das Medium auf die
BOT-Seite der letzten Dateimarke setzen
- MTFSR
- um mt_count Datensätze (Bandblöcke)
vorwärtsspringen
- MTFSS
- um mt_count »Setmarks« vorwärtsspringen
- MTLOAD
- 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.
- MTLOCK
- den Einschub des Bandlaufwerkes verriegeln
- MTMKPART
- 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 Kernel Version 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).
- 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ätespezifische 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-Entladebefehl aus. (Das Band wird nicht
ausgeworfen).
- MTUNLOCK
- entriegelt den Einschub des Bandlaufwerks
- MTWEOF
- schreibt mt_count Dateimarken
- MTWSM
- schreibt mt_count »Setmarks«
Magnetband-Aktionen 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
(Zeitüberschreitungen, nur für Kernel 2.1 und neuer). 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:
- MT_ST_BUFFER_WRITES
(Vorgabewert: true)
- 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.
- MT_ST_ASYNC_WRITES
(Vorgabewert: true)
- 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.
- 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 Leseaktionen 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 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.
- 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 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.
- MT_ST_AUTO_LOCK
(Vorgabewert: false)
- Ist diese Option auf true gesetzt, wird das Laufwerk verriegelt, wenn die
Gerätedatei geöffnet und entsperrt, wenn sie 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 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.
- MT_ST_CAN_BSR
(Vorgabewert: false)
- 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. 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 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.
- 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 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.
- 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 Aktions-Code ODER-verknüpft.
-
- Mit den Kerneln 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 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.
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 berichtet 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 positioniert (immer false nach einer
MTSEEK-Aktion).
GMT_BOT(x): Das Band ist auf den Anfang der
ersten Datei positioniert (immer false nach einer MTSEEK-Aktion).
GMT_EOT(x): Eine Bandaktion hat das physische
Ende des Bandes erreicht (EOT).
GMT_SM(x): Das Band ist aktuell auf ein
»setmark« positioniert (immer false nach einer
MTSEEK-Aktion).
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.
(Standardmäßig berichten die meisten Laufwerke keine weichen
Fehler, dies kann aber mit einem »SCSI MODE SELECT«-Befehl
geändert werden.)
- mt_fileno
- Ausgabe der aktuellen Dateinummer (nullbasiert). 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 (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 */
};