• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Labeln LTO mit DD und Label lesen

cbr

Member
Irgendwie hab ich noch nicht durchschaut mit welcher Blockgröße ich DD anweisen soll, das Label zu schreiben.
laut "/dev/ns0 status" schreibt das LTO Laufwerk mit 1024 Byte. Wenn ich in mehrere Archive schreibe, positioniere und lese klappt
das wunderbar. Wenn ich aber mit diesem Standard Blocksize das Label schreibe und wieder
lesen möchte bekomme ich nichts runter. Setze ich bspw. vor dem Label schreiben "setblk 0" kann ich das Label schreiben und lesen,
aber auf das folgende TAR Archiv kann ich werde positionieren noch lesen.
Das folgende Script zählt zu meinen "Hausaufgaben" und soll einfach das Label
schreiben, ein TAR danach archivieren, rückspulen, Label anzeigen und das folgende
TAR Archiv lesen. Wo liegt da mein Denkfehler ? Bekomme am Anfang des Scriptes ein "dd: Schreiben von „/dev/nst0“: Das Argument ist ungültig", was schmeckt ihm daran nicht?
Code:
SaveDir="/home/erde/Backup/"							# Backup Verzeichnis
Wochentag=`date +%A`								# Wochentag
Datum=`date +%F`								        # Datum 
Zeit=`date +%R`									# Uhrzeit
Programm=TAR									# Sicherungsprogrammes
LabelNeu="/home/erde/Backup/LabelNeu.dat"				# Variablen
LabelAlt="/home/erde/Backup/LabelAltdat"					# Variablen
#
# Bereitstellung eines Bandlabels mit aktuellem Datum für die akt. Sicherung
#
echo -e "Wochentag:$Wochentag\nDatum:$Datum\nZeit:$Zeit\nSicherungsprogramm:$Programm" > $LabelNeu
echo $LabelNeu
#
#Labeln des Bandes mit aktuellen Daten
#
mt -f /dev/nst0 rewind								# Rückspulen des Bandes
#mt -f /dev/nst0 setblk 0							 
dd if=$LabelNeu of=/dev/nst0 count=1					# Beschreibung des Bandes mit akt. Label
tar cfv - /home/erde/.kde/ -b 1024 | mbuffer -s 1048576 -m 400M -p 98 > /dev/nst0
mt -f /dev/nst0 rewind								# Rückspulen des Bandes
dd if=/dev/nst0 of=LabelTest count=1 						# Auslesen gelabeltes Band
#echo "Gelesenes Label vom Band" 
cat LabelTest									       # Was für ein Label war auf dem Band
mt -f /dev/nst0 fsf 1								       # Positionierung am Anfang der 1. TAR Sicherung
tar -tf /dev/nst0
Als Ausgabe des Scripts bekomme ich:
Code:
./test
/home/erde/Backup/LabelNeu.dat
dd: Schreiben von „/dev/nst0“: Das Argument ist ungültig
0+1 Datensätze ein
0+0 Datensätze aus
0 Bytes (0 B) kopiert, 0,000686236 s, 0,0 kB/s
tar: Entferne führende „/“ von Elementnamen
/home/erde/.kde/
:::::::::::
mbuffer: warning: output does not support syncing: omitted.
in @ 2044 kB/s, out @ 2044 kB/s, 1024 kB total, buffer   0% full
summary: 1536 kB in 2.1 sec - average of 736 kB/s
1+0 Datensätze ein
1+0 Datensätze aus
512 Bytes (512 B) kopiert, 2,24456 s, 0,2 kB/s
home/erde/.kde/0000700000175000001440000000000011052743321012370 5ustar  erdeuserstar: +: Nicht im Archiv gefunden.
tar: Lesen: Nicht im Archiv gefunden.
tar: des: Nicht im Archiv gefunden.
tar: Bandinhaltes: Nicht im Archiv gefunden.
tar: Fehler beim Beenden, verursacht durch vorhergehende Fehler.
PS: Bin mit dem Scripten noch am Anfang, wenns auch eigentlich trivial ist naja hat ja jeder mal angefangen.
 
A

Anonymous

Gast
Hab jetzt nicht alles durchgesehen, gerade im Moment wenig Zeit auf die schnell nur so viel
mt -f /dev/nst0 rewind # Rückspulen des Bandes
dd if=/dev/nst0 of=LabelTest count=1 # Auslesen gelabeltes Band
#echo "Gelesenes Label vom Band"
cat LabelTest # Was für ein Label war auf dem Band
mt -f /dev/nst0 fsf 1 # Positionierung am Anfang der 1. TAR Sicherung
tar -tf /dev/nst0
hatte das glaube schon im anderen Beitrag angedeutet, ist wohl untergegangen, jeder Schreibbefehl erzeugt beim beenden ein EOD also auch dd. Wenn du das Label gelesen hast, bleibt das Band an dieser Stelle auf dem EOD stehen, das Archiv fängt genau dort an. Vorspulen um ein EOF müßtest du wenn du dich am Bandanfang befindest und das Label nicht lesen möchtest.
So wie es jetzt im Script steht würde es das 2. Archiv lesen.

die Blocksize. Ließ nochmal ganz genau http://wiki.linux-club.de/opensuse/Bandlaufwerke_und_LINUX#Die_richtige_Blockgr.C3.B6.C3.9Fe
Die Blockgröße wird im Bandlaufwerke eingestellt, das heißt sie bleibt so lange aktiv solange das Bandlaufwerk nicht resetet wird, oder ein anderer Befehl das wieder ändert. Wenn im LW 1024 fest eingestellt ist, kannst du in dd, tar oder mbuffer einstellen was du willst, das Laufwerk arbeitet intern (meist ersteinmal unbemerkt) immer mit 1024. Solange nur durch 1024 teilbare Blockgrößen an das Laufwerk kommen, funktioniert das auch scheinbar prima, macht allerdings alle deine Benühungen um Blockgrößen zu nichte. Also einmal auf 0 stellen, vorsichtshalber am Anfang des Scriptes und dann kannst du in den Programmen das einsetzten was du möchtest.

robi
 
OP
C

cbr

Member
Hi robi, danke das Du noch mal drüber guckst wenn Du Zeit hast. Ich denke ich habe keinen Fehler gemacht, deshlab noch mal Detail meine Vorgehensweise.
mt -f /dev/nst0 rewind & mt -f /dev/nst0 status
Code:
drive type = Generic SCSI-2 tape
drive status = 1073742848
sense key error = 0
residue count = 0
file number = 0
block number = 0
Tape block size 1024 bytes. Density code 0x40 (unknown).
Soft error count since last status=0
General status bits on (41010000):
 BOT ONLINE IM_REP_EN
Blocksize steht auf 1024 bytes
Inhalt der erstellten Label Datei:
Code:
cat LabelNeu.dat
Wochentag:Donnerstag
Datum:2008-09-04
Zeit:10:32
Sicherungsprogramm:TAR
Schreiben mit DD
Code:
dd if=LabelNeu.dat of=/dev/nst0 count=1
dd: Schreiben von „/dev/nst0“: Das Argument ist ungültig
0+1 Datensätze ein
0+0 Datensätze aus
0 Bytes (0 B) kopiert, 0,00124066 s, 0,0 kB/s
Wobei an dieser Stelle
Code:
dd: Schreiben von „/dev/nst0“: Das Argument ist ungültig
kommt.
Er hat also nix kopiert und deshal kann ich so wohl auch nix lesen. Mach ich in der Anwendung von DD was verkehrt ?
 
A

Anonymous

Gast
cbr schrieb:
Er hat also nix kopiert und deshal kann ich so wohl auch nix lesen. Mach ich in der Anwendung von DD was verkehrt ?

Ja, ganz einfach in dem du dich nicht an die Ratschläge und Links hältst, die dir gegeben werden.

1. Tape block size 1024 bytes + 512Byte von default dd + nur ganz wenige Byte zu schreiben, gibt scheinbar einen Fehler im st-Treiber weil nicht ein einziger Block voll geworden ist. Diesen Fehler kann dann dd gar nicht interpretieren, desshalb kommt
"dd: Schreiben von „/dev/nst0“: Das Argument ist ungültig"
ist dadurch zu verhindern indem man auf variable Blockgröße umgestellt. also diese Zeile hier am Anfang vom Script aktiv schalten
#mt -f /dev/nst0 setblk 0

2. ich habe geschrieben Blockgröße bei LTO am besten immer 256K was macht du wieder daraus.
tar cfv - /home/erde/.kde/ -b 1024 | mbuffer -s 1048576 -m 400M -p 98 > /dev/nst0
also bei tar 512KB und mit mbuffer 1MB Blockgröße, das funktioniert bei dir nur genau so lange du im Laufwerk eine feste Blockgröße eingestellt hast, bei dir also default die 1024Byte. Bei dieser Einstellung ist es aber vollkommen egal mit welcher Blockgröße du das Laufwerk ansprichst, das Laufwerk macht immer aus allem 1024Byte große Blöcke. Mit dieser viel zu kleinen Blockgröße kannst du das Laufwerk überhaupt nicht innerhalb einigermaßen akzeptabler Betriebsbedingungen betreiben. Stellst du dein Script jedoch auf variable Blockgröße um, dann meckert der SCSI-Treiber, weil bei Linux die maximale Blockgröße per default auf 256K gestellt ist, dein mbuffer aber mit 1MB darauf zugreifen will. Damit hast du den Fehler warum dein Tar nicht schreibt wenn du auf variable Blockgröße umstellst. Alles im oben verlinkten Wikibeitrag enthalten und erklärt.

3. die Option -p 98 ist beim Schreiben falsch, richtig währe großes -P also -P 98, außer du hast noch eine Uraltversion (kleiner als Version 20060728 ) von mbuffer auf deinem Rechner. Nachschauen könnte man das auch im verlinken Wikibeitrag unter den getesteten Befehlen von mbuffer.

4. Zum Schluss noch ein Schönheitsfehler: bei tar bitte auf eine saubere Schreibweise der Optionen achten, tar ist zwar unwahrscheinlich flexibel und kann durchaus auch erahnen was man mit seinen Optionen erreichen will. Wenn tar strenger währe wurde es bei dir die Datei v als Ausgabedatei interpretieren. Die Dateien oder Verzeichnisse die gesichert werden sollen, sollten das Ende der Optionskette darstellen, da hier eventuell die Bash noch Ersetzungen vornehmen kann. Wenn du mal einen Tarbefehl mit einigen Optionen mehr schreibst, und tar nicht mehr annähnerd das macht was es soll, kannst du wegen solcher Kleinigkeiten und Schlampereien stundenlang scheinbar dubiose Fehler suchen.

nimm also mal oben im Script die variabel Blockgröße herein und ändere weiter unten die Blockgrößen von tar und mbuffer auf 256kByte. und eventuell das -p noch bei mbuffer, und schon wird er sichern. Wenn dann noch richtig positioniert wird, und beim Lesen bei jedem einzelnem Befehl wieder genau mit der selben Blockgröße gearbeitet wird, mit der geschrieben wurde, sollte es auch funktionieren.

robi
 
Oben