st(4) Device Drivers Manual st(4) BEZEICHNUNG st - SCSI-Bandgerat UBERSICHT #include 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 fur diverse SCSI-Bandlaufwerke zur Verfugung. Derzeit ubernimmt der Treiber die Kontrolle uber alle erkannten Gerate, auf die nur >>sequenziell<< zugegriffen werden kann. Der st-Treiber verwendet die Major-Geratenummer 9. Jedes Gerat verwendet acht Minor-Geratenummern. Die untersten funf Bits in den Minor-Nummern werden nacheinander in der Reihenfolge der Erkennung zugeordnet. Im Kernel 2.6 werden die Bits uber den acht untersten Bits mit den funf 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-Geratenummern fur automatisches Ruckspulen und die Geratenummern ohne Rucklauf (n + 128, no-rewind). Mit der Hauptgeratenummer geoffnete Geraten wird ein REWIND-Befehl gegeben, wenn sie geschlossen werden. Diesen Befehl erhalten mit der no-rewind-Geratenummer geoffnete Gerate nicht. (Beachten Sie, dass ein Ruckspulgerat mit mt nicht positioniert werden kann: das Band wird nach dem mt-Befehl zuruckgespult und der nachste Befehl hat als Ausgangspunkt den Anfang des Bands.) Innerhalb jeder Gruppe stehen vier Minor-Nummern zur Verfugung, um Gerate mit unterschiedlichen Eigenschaften zu definieren (Blockgrosse, Kompression, Dichte usw.). Wenn das System startet, steht nur das erste Gerat zur Verfugung. Die anderen drei werden standardmassig aktiviert, wenn die Merkmale definiert sind (siehe unten). (Durch die Anderung von Kompilierungs-Konstanten ist es moglich, die Balance zwischen der maximalen Anzahl von Bandlaufwerken und der Anzahl der Minor-Nummern fur jedes Laufwerk zu andern. Die Standard-Zuweisung ermoglicht die Steuerung von 32 Bandlaufwerken. Beispielsweise ist es moglich, bis zu 64 Bandlaufwerke mit zwei Minor-Nummern fur verschiedene Optionen zu steuern.) Gerate werden ublicherweise 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 Gerat. Der Treiber benutzt einen internen Puffer, der gross genug sein muss, um mindestens einen Band-Block aufzunehmen. Vor Linux 2.1.121 wird der Puffer als ein zusammenhangender Block zugewiesen. Dies beschrankt die Blockgrosse auf den grossten zusammenhangenden Speicherblock, den der Kernel-Allocator vergeben kann. Die Grenze ist derzeit 128 kB fur 32-Bit-Architekturen und 256 kB fur 64-Bit-Architekturen. In neueren Kerneln teilt der Treiber den Puffer in mehrere Teile, wenn notig. Standardmassig ist die maximale Anzahl der Teile 16. Das bedeutet, dass die maximale Blockgrosse sehr gross ist (2 MB, wenn die Zuteilung von 16 Blocken zu je 128 kB gelingt). Die interne Puffergrosse des Treibers wird durch eine Compiler-Konstante bestimmt, die aber mit einer Kernel-Startoption uberschrieben werden kann. Daruber hinaus versucht der Treiber, zur Laufzeit im Bedarfsfall einen grosseren temporaren Puffer bereitzustellen. Es ist aber durchaus moglich, dass zur Laufzeit die Zuteilung von grossen, zusammenhangenden Speicherblocken fehlschlagt. Daher ist es ratsam, sich nicht zu sehr auf dynamische Pufferzuweisung in Linux vor 2.1.121 zu verlassen. (Das gilt auch fur das bedarfsweise Laden des Treibers mit kerneld oder kmod.) Der Treiber unterstutzt nicht speziell bestimmte Marken oder Gerate. Nach dem Systemstart werden die Gerate-Optionen von der Firmware des Laufwerks bestimmt. Wenn z. B. die Firmware Blocke fester Grosse wahlt, arbeitet das Bandlaufwerk im Festblock-Modus. Die Optionen konnen mit expliziten Aufrufen von ioctl(2) geandert werden und bleiben in Kraft, wenn das Gerat geschlossen und wieder geoffnet wird. Das Einstellen der Optionen betrifft Gerate sowohl mit als auch ohne Ruckspulfunktion. Fur die verschiedenen Gerate innerhalb der Vierer-Untergruppen konnen unterschiedliche Optionen angegeben werden. Die Optionen werden wirksam, wenn das Gerat geoffnet wird. Zum Beispiel kann der Systemadministrator festlegen, dass ein Gerat mit einer bestimmten Blockgrosse im Festblock-Modus schreibt und ein anderes Gerat mit variabler Blockgrosse betrieben wird (wenn das Laufwerk beide Modi unterstutzt). Wenn das Gerat mit Band-Partionen umgehen kann, wird das vom Treiber unterstutzt. (Beachten Sie, dass Band-Partitionen nichts mit Festplatten-Partitionen zu tun haben. Ein partitioniertes Band kann als mehrere logische Bander innerhalb eines Mediums angesehen werden.) Die Unterstutzung 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 fur die nachfolgenden Bandoperationen wird mit einem Aufruf von ioctl(2) ausgewahlt. Der Wechsel der Partition wird zusammen mit der nachsten Bandoperation ausgefuhrt, um unnotige Bandbewegungen zu vermeiden. Die maximale Anzahl der Partitionen auf einem Band wird durch eine Compiler-Konstante (ursprunglich vier) definiert. Der Treiber enthalt einen ioctl(2), der ein Band mit einer oder zwei Partitionen formatieren kann. Das Gerat /dev/tape wird ublicherweise als harter oder symbolischer Link auf das Standard-Bandgerat des Systems angelegt. Seit Linux 2.6.2 exportiert der Treiber im sysfs-Verzeichnis /sys/class/scsi_tape die vorhandenen Gerate und einige ihrer Parameter. Datenubertragung Der Treiber unterstutzt den Betrieb sowohl im Festblock-Modus als auch im variablen Modus (wenn das Laufwerk dazu imstande ist). Im Festblock-Modus schreibt das Laufwerk Blocke der angegebenen Grosse, wobei die Blockgrosse nicht abhangig von der Byteanzahl der Schreib-Systemaufrufe ist. Bei variabler Blockgrosse wird fur jeden Schreibaufruf ein Block geschrieben, die Byteanzahl des Aufrufs bestimmt die Grosse des entsprechenden Blocks auf dem Band. Beachten Sie, dass die Blocke auf dem Band keine Informationen uber den Schreibmodus enthalten: Beim Lesen ist das einzig Wichtige, Befehle zu verwenden, die Blockgrossen auf dem Band erkennen und danach handeln konnen. Bei variabler Blockgrosse muss die Anzahl gelesener Bytes nicht exakt zur Bandblockgrosse passen. Wenn die Byteanzahl grosser ist als der nachste Block auf dem Band, gibt der Treiber die Daten zuruck und die Funktion liefert die aktuelle Blockgrosse. Wenn der Block grosser ist als die angeforderte Anzahl von Bytes, wird ein Fehler zuruckgegeben. Im Festblock-Modus kann die Anzahl der zu lesenden Bytes beliebig sein, wenn Pufferung aktiviert ist, oder ein Vielfaches der Blockgrosse des Bandes, wenn Pufferung deaktiviert ist. Linux vor 2.1.121 ermoglicht Schreibvorgange mit beliebiger Byteanzahl bei aktivierter Pufferung. In allen anderen Fallen (Linux vor 2.1.121 mit deaktivierter Pufferung oder neuere Kernel) muss die Anzahl der zu schreibenden Bytes ein Vielfaches der Blockgrosse des Bands sein. In Linux 2.6 versucht der Treiber direkte Transfers zwischen dem Benutzerpuffer und dem Gerat. Wenn das nicht moglich ist, wird der Treiber seinen internen Puffer verwenden. Die Grunde dafur, keine direkten Transfers zu verwenden, umfassen falsche Ausrichtung des Benutzerpuffers (Vorgabe sind 512 Byte, aber diese kann durch den HBA-Treiber geandert werden), eine oder mehrere vom SCSI-Adapter nicht erreichbare Seiten des Benutzerpuffers, etc. Wenn die letzte Bandoperation vor dem Schliessen 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 zuruckgegeben. Der nachste Leseaufruf gibt null Byte zuruck. Der ubernachste Leseaufruf gibt Daten aus der nachsten Datei zuruck. Das Ende der aufgezeichneten Daten wird durch Ruckgabe von null Byte fur zwei aufeinanderfolgende Leseaufrufe signalisiert. Ein dritter Aufruf gibt einen Fehler zuruck. Ioctls Der Treiber unterstutzt 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 -- fuhrt eine Bandoperation aus Diese Operation verarbeitet ein Argument vom Typ (struct mtop *). Nicht alle Laufwerke unterstutzen jede der moglichen Anweisungen. Der Treiber gibt ein EIO zuruck, wenn das Laufwerk die Anweisung nicht unterstutzt. /* Struktur fur den MTIOCTOP-Befehl an das Bandlaufwerk */ struct mtop { short mt_op; /* im Folgenden definierte Operationen */ int mt_count; /* Anzahl der Operationen */ }; Operationen fur den Normalbetrieb von Bandlaufwerken: MTBSF um mt_count Dateimarken zuruckspringen MTBSFM um mt_count Dateimarken zuruckspringen; Medium auf die EOT-Seite der letzten Dateimarke positionieren MTBSR um mt_count Datensatze (Bandblocke) zuruckspringen MTBSS um mt_count >>Setmarks<< zuruckspringen 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 Magnetbandgeraten (Digital Audio Tape, DAT) unterstutzt wird. MTEOM positioniert auf das Ende der aufgezeichneten Daten (um Dateien anzufugen) MTERASE Das Band wird geloscht, Mit Linux 2.6 wird >>kurz geloscht<< (short erase), wenn das Argument gleich Null ist. Anderenfalls wird alles geloscht (erase all). MTFSF um mt_count Dateimarken vorwartsspringen MTFSFM um mt_count Dateimarken vorwartsspringen; das Medium auf die BOT-Seite der letzten Dateimarke setzen MTFSR um mt_count Datensatze (Bandblocke) vorwartsspringen MTFSS um mt_count >>Setmarks<< vorwartsspringen MTLOAD fuhrt den SCSI-Ladebefehl aus. Fur einige HP-Bandwechsler steht eine spezielle Option zur Verfugung. 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 Grosse 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 Grosse der Partition 0 fest und der Rest des Bandes umfasst Partition 1. Die physische Reihenfolge der Partitionen hangt vom Laufwerk ab. Dieser Befehl ist nur fur Laufwerke zulassig, wenn die Unterstutzung von Partitionen fur 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 zuruckspulen und Bandlaufwerk vom Netz nehmen MTRESET Laufwerk zurucksetzen MTRETEN Band neu spannen MTREW zuruckspulen MTSEEK sucht nach dem Bandblock mit der Nummer mt_count. Diese Anweisung erfordert ein SCSI-2-Bandlaufwerk, welches den LOCATE-Befehl unterstutzt (geratespezifische Adresse) oder ein Tandberg-kompatibles SCSI-1-Laufwerk (Tandberg, Archive, Viper, Wangtek, etc.). Die Blocknummer sollte vorher von MTIOCPOS zuruckgegeben worden sein, wenn geratespezifische Adressen verwendet werden. MTSETBLK setzt die Blockgrosse des Laufwerks auf den Wert von mt_count. Eine Blockgrosse von 0 setzt das Laufwerk auf variable Blockgrosse. MTSETDENSITY setzt die Schreibdichte (tape density) auf den Wert in mt_count. Die Kodierung der von einem Laufwerk unterstutzten Schreibdichte finden Sie in der Laufwerksdokumentation. MTSETPART Die aktive Partition wird auf mt_count gesetzt. Die Partitionen werden von Null gezahlt. Dieser Befehl ist nur fur ein Laufwerk zulassig, wenn die Partitionsunterstutzung fur das Laufwerk aktiviert ist (siehe MT_ST_CAN_PARTITIONS weiter unten). MTUNLOAD fuhrt 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 fur das Setzen von Gerate-Optionen (fur den Superuser): MTSETDRVBUFFER setzt diverse Gerate- und Treiberoptionen gemass den in mt_count kodierten Bits. Diese umfassen den Puffer-Modus des Laufwerks, einen Satz von booleschen Treiberoptionen, den Schreibschwellwert des Treiberpuffers, Vorgabewerte fur Blockgrosse und Schreibdichte, Zeitschranken (Zeituberschreitungen, erst seit Kernel 2.1). Eine einzelne Aktion kann nur ein Element dieser Aufzahlung 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 zuruck, wenn die Datenblocke tatsachlich auf das Medium geschrieben wurden. 1 Das Laufwerk darf den Status GOOD fur Schreibbefehle melden, sobald alle Daten in den internen Laufwerkspuffer ubertragen wurden. 2 Das Laufwerk darf den Status GOOD fur Schreibbefehle melden, sobald (a) alle Daten in den internen Laufwerkspuffer ubertragen wurden und (b) alle in dem Laufwerkspuffer (aus verschiedenen Aufrufen) zwischengespeicherten Daten erfolgreich auf das Medium geschrieben wurden. Der Schreibschwellwert wird uber mt_count gesteuert: mt_count muss in den unteren 28 Bit die Konstante MT_ST_WRITE_THRESHOLD bitweise ODER-verknupft mit einer Blockzahl enthalten. Der Blockzahler zahlt 1024 Byte grosse Blocke, nicht die physische Blockgrosse auf dem Band. Der Schwellwert kann die interne Puffergrosse des Treibers nicht uberschreiten (siehe BESCHREIBUNG). Um die booleschen Optionen zu setzen oder zu loschen, 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-verknupft mit einer beliebigen gewunschten Kombination der folgenden Optionen enthalten. Mit MT_ST_BOOLEANS konnen die Optionen auf die Werte in den entsprechenden Bits gesetzt werden. Mit MT_ST_SETBOOLEANS konnen die Optionen gezielt eingestellt und mit MT_ST_DEFBOOLEANS geloscht werden. Die Standardoptionen fur ein Bandgerat werden mit MT_ST_DEFBOOLEANS gesetzt. Ein nicht aktives Bandgerat (z.B. ein Gerat mit den Minor-Nummern 32 oder 160) wird aktiviert, wenn seine Standardoptionen das erste Mal definiert werden. Ein aktiviertes Gerat erbt von dem beim Systemstart aktivierten Gerat 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 Blockgrosse, mussen alle Schreibaktionen mit einem Vielfachen der Blockgrosse durchgefuhrt werden. Diese Option muss auf false gesetzt werden, um zuverlassig Archive uber mehrere Bander hinweg zu erstellen. MT_ST_ASYNC_WRITES (Vorgabewert: true) Ist diese Option auf true gesetzt, geben Schreibaktionen umgehend die Kontrolle an das aufrufenden Programm zuruck, ohne auf den Transfer der Daten zum Laufwerk zu warten, wenn die Daten in den Puffer des Treibers passen. Der Schreibschwellwert bestimmt den >>Fullstand<< des Puffers, ab dem ein neuer SCSI->>write<<-Befehl erteilt wird. Alle Fehlermeldungen des Laufwerks werden gesammelt und bei der nachsten Laufwerksaktion ausgegeben. Diese Option muss auf false gesetzt werden, um zuverlassig Archive uber mehrere Bander 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 Blockgrosse, mussen alle Leseaktionen mit einem Vielfachen der Blockgrosse durchgefuhrt werden. MT_ST_TWO_FM (Vorgabewert: false) Diese Option beeinflusst das Treiberverhalten beim Schliessen 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 uberschreiben, sollte die Option fur 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 Bander 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 moglicherweise schneller, der Treiber kann aber die aktuelle Dateinummer, die normalerweise von der MTIOCGET-Anfrage zuruckgegeben wird, nicht mehr nachverfolgen. Wenn MT_ST_FAST_EOM >>false<< ist, wird der Treiber auf eine MTEOM-Anfrage durch Vorwartsspringen uber Dateien reagieren. MT_ST_AUTO_LOCK (Vorgabewert: false) Ist diese Option auf true gesetzt, wird das Laufwerk verriegelt, wenn die Geratedatei geoffnet und entsperrt, wenn sie geschlossen wird. MT_ST_DEF_WRITES (Vorgabewert: false) Die Bandoptionen (Blockgrosse, Modus, Kompression, etc.) konnen sich beim Wechsel von einem an ein Laufwerk angeschlossenen Gerat zu einem anderen an demselben Laufwerk angeschlossenen Gerat andern. Die Anderung der Optionen hangt von der Definition der Gerate ab. Diese Option definiert, wann die Anderungen durch den Treiber mittels SCSI-Befehlen durchgefuhrt werden und wann sich auf die Fahigkeiten der Laufwerke zur automatischen Erkennung verlassen wird. Wenn diese Option false ist, sendet der Treiber die SCSI-Befehle sofort, wenn das Gerat 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 ruckwarts zur richtigen Position gesprungen werden, wenn das Gerat geschlossen und der SCSI-Befehl fur das Ruckwartsspringen uber Datensatze fur diesen Zweck verwandt wird. Einige altere Laufwerke konnen diesen Befehl nicht zuverlassig 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 moglicherweise nicht korrekt in einer Datei positioniert werden kann, wenn das Gerat geschlossen wird. In Linux 2.6 ist die Standardeinstellung true fur Laufwerke, die SCSI-3 unterstutzen. 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 prufen kann, ob die gewahlte Blockgrosse fur das Laufwerk zulassig ist. MT_ST_CAN_PARTITIONS (Vorgabewert: false) Diese Option aktiviert die Unterstutzung fur mehrere Partitionen auf einem Band. Die Option gilt fur alle mit dem Laufwerk verbundenen Gerate. 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<< durchfuhrt (sowohl mit den Befehlen MTSEEK und MTIOCPOS als auch beim Wechsel der Band-Partition). Andernfalls werden die geratespezifischen Adressen verwendet. Es wird dringend empfohlen, diese Option zu setzen, wenn das Laufwerk die logischen Adressen unterstutzt, weil sie auch Dateimarken zahlen. Es gibt einige Laufwerke, die nur die logischen Block-Adressen unterstutzen. MT_ST_SYSV (Vorgabewert: false) Wenn diese Option aktiviert ist, verwenden die Bandgerate die System-V-Semantik. Andernfalls wird die BSD-Semantik verwendet. Der wichtigste Unterschied zwischen den Semantiken ist, was passiert, wenn ein zum Lesen verwendetes Gerat geschlossen wird: mit der System-V-Semantik wird auf dem Band vorwarts uber die nachste Dateimarke hinweg gesprungen, wenn das nicht wahrend der Verwendung des Gerates geschah. Mit der BSD-Semantik wird das Band nicht neu positioniert. MT_NO_WAIT (Vorgabewert: false) Aktiviert den >>sofort<<(immediate)-Modus fur einige Befehle (z. B. zuruckspulen). Es wird also die Ausfuhrung 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-Blockgrosse fur ein Gerat kann mit MT_ST_DEF_BLKSIZE und der Code fur die Standarddichte mit MT_ST_DEFDENSITY eingestellt werden. Die Werte fur die Parameter werden mit dem Aktions-Code ODER-verknupft. Mit Linux 2.1.x und neuer konnen die Zeituberschreitungswerte mit dem Unterbefehl MT_ST_SET_TIMEOUT mit der Zeituberschreitung in Sekunden oder-verknupft werden. Die grossen Zeituberschreitungswerte (fur Zuruckspulen und andere Befehle, die eine lange Zeit dauern konnen) kann mit MT_ST_SET_LONG_TIMEOUT eingestellt werden. Die Kernel-Standardwerte sind sehr gross, um sicherzustellen, dass ein erfolgreich ausgefuhrter Befehl nicht auf einem beliebigen Laufwerk gestoppt wird. Aus diesem Grund kann der Treiber selbst als aufgehangt erscheinen, wenn er nur auf die Zeituberschreitung wartet. Diese Befehle konnen verwendet werden, um realistischere Werte fur ein bestimmtes Laufwerk zu setzen. Die fur ein Gerat gesetzten Zeituberschreitungen gelten fur alle an dasselbe Laufwerk angeschlossenen Gerate. Seit den Linux-Versionen 2.4.19 und 2.5.43 unterstutzt der Treiber ein Status-Bit, ob das Laufwerk eine Reinigung anfordert. Die Methode, mit der das Laufwerk Reinigungsinformationen zuruckgibt, 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 ausgewahlt 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 -- fragt den Status ab Dieser Aufruf erfordert ein Argument des Typs (struct mtget *). /* Struktur fur den MTIOCGET-Befehl - >>mag tape get status<< */ struct mtget { long mt_type; long mt_resid; /* Die folgenden Register sind laufwerksabhangig. */ 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 fur 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 enthalt die Nummer der aktuellen Band-Partition. mt_dsreg gibt die aktuellen Laufwerkseinstellungen fur die Blockgrosse (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 (laufwerksunabhangige) Statusinformationen aus. Die Header-Datei definiert Makros fur 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 schreibgeschutzt. Bei manchen Laufwerken kann damit auch gemeint sein, dass das Laufwerk kein Schreiben auf das aktuelle Medium unterstutzt. 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 fur 9-Spur-1/2"-Laufwerke aus. GMT_DR_OPEN(x) Es ist 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 Rucksprung 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 Linux seit 2.4.19 und 2.5.43. mt_erreg Das einzige definierte Feld in mt_erreg ist der >>Fehlerzahler<< (es werden nur behobene Fehler gezahlt) in den unteren 16 Bits (wie durch MT_ST_SOFTERR_SHIFT and MT_ST_SOFTERR_MASK definiert). Da dieser Zahler keinem Standard unterliegt (also von Laufwerk zu Laufwerk unterschiedlich sein kann), wird er nicht oft benutzt. (Standardmassig berichten die meisten Laufwerke keine weichen Fehler, dies kann aber mit einem >>SCSI MODE SELECT<<-Befehl geandert 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). MTIOCPOS -- fragt die Bandposition ab 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 zuruckgegeben wird. Das Laufwerk muss ein SCSI-2-Laufwerk sein und den READ POSITION-Befehl unterstutzen (laufwerksabhangige Adresse) oder ein Tandberg-kompatibles SCSI-1-Laufwerk (Tandberg, Archive, Viper, Wangtek, usw.). /* Struktur fur den MTIOCPOS-Befehl >>get position<< */ struct mtpos { long mt_blkno; /* aktuelle Blocknummer */ }; RUCKGABEWERT EACCES Es wurde versucht, auf ein schreibgeschutztes Medium zu schreiben oder es zu loschen. (Dieser Fehler wird nicht wahrend 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 gehort. EINVAL Einem ioctl(2)-Aufruf wurde ein ungultiges Argument ubergeben oder die angeforderte Blockgrosse ist unzulassig. EIO Die angeforderte Aktion konnte nicht abgeschlossen werden. ENOMEM Die Byteanzahl von read(2) ist kleiner als der nachste physische Block auf dem Band. (Vor Linux 2.2.18 und 2.4.0 wurden die zusatzlichen Bytes stillschweigend ignoriert.) ENOSPC Eine Schreibaktion konnte nicht beendet werden, da das Ende des Mediums (EOT) erreicht wurde. ENOSYS unbekannter ioctl(2)-Aufruf ENXIO Beim Offnen wurde festgestellt, das das Laufwerk nicht vorhanden ist. EOVERFLOW Es wurde versucht, einen Block variabler Lange zu lesen oder zu schreiben. Der Block ist grosser als der interne Puffer des Treibers. EROFS Es wurde versucht, das schreibgeschutzte Laufwerk O_WRONLY oder O_RDWR zu offnen. DATEIEN /dev/st* SCSI-Bandlaufwerke, die automatisch zuruckspulen /dev/nst* SCSI-Bandlaufwerke, die nicht zuruckspulen ANMERKUNGEN o Beim Austausch von Daten zwischen Systemen mussen sich beide Systeme auf die physische Blockgrosse der Bander einigen. Die Parameter eines Laufwerks nach dem Start sind oft nicht diejenigen, die die meisten Betriebssysteme mit diesen Geraten verwenden. Die meisten Systeme nutzen die Laufwerke mit variabler Blockgrosse, wenn das Laufwerk diesen Modus unterstutzt. Dies gilt fur die meisten modernen Laufwerke, einschliesslich DAT, 8mm-Helical-Scan-Laufwerke, DLTs usw. Es kann ratsam sein, diese Laufwerke auch unter Linux mit variabler Blockgrosse (d. h. beim Systemstart mit MTSETBLK oder MTSETDEFBLK diesen Modus festlegen) zu betreiben, zumindest fur den Austausch von Daten mit einem fremden System. Der Nachteil davon ist, dass eine ziemlich grosse Bandblockgrosse verwendet werden muss, um akzeptable Ubertragungsraten auf dem SCSI-Bus zu erreichen. o Viele Programme (beispielsweise tar(1)) ermoglichen dem Benutzer, die Blockgrosse auf der Befehlszeile anzugeben. Beachten Sie, dass sich das nur dann auf die physische Blockgrosse auswirkt, wenn Blocke variabler Grosse verwendet werden. o Um SCSI-Bandlaufwerke zu verwenden, mussen der grundlegende SCSI-Treiber, ein SCSI-Adapter-Treiber und der SCSI-Treiber fur 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 Bandunterstutzung ist nicht verfugbar. o Der Treiber schreibt Fehlermeldungen auf die Konsole/in die Protokolldatei. Die SENSE-Codes werden automatisch in Text ubersetzt, wenn bei der Kernel-Konfiguration ausfuhrliche SCSI-Meldungen aktiviert wurden. o Die interne Pufferung des Treibers ermoglicht guten Durchsatz im Festblock-Modus auch mit kleinen Bytezahlen fur read(2) und write(2). Bei direkten Transfers ist das nicht moglich und kann eine Uberraschung bei der Umstellung auf den 2.6-Kernel verursachen. Die Losung ist, die Software anzuweisen, grossere Ubertragungen zu verwenden (oft werden grossere Blocke benutzt). Wenn das nicht moglich ist, konnen direkte Transfers deaktiviert werden. SIEHE AUCH mt(1) Die Datei drivers/scsi/README.st oder Documentation/scsi/st.txt (Kernel >= 2.6) im Linux-Kernelquelltext-Verzeichnis enthalt die aktuellsten Informationen uber den Treiber und seine Konfigurationsmoglichkeiten. UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Christian Schmidt , Martin Eberhard Schauer , Mario Blattermann und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.8 2. Mai 2024 st(4)