Frage

Sagen Sie mein Programm versucht eine Lese eines Bytes in einer Datei auf einem ZFS-Dateisystem. ZFS kann eine Kopie des erforderlichen Block finden, aber mit einer gültigen Prüfsumme jede Kopie nicht finden können (sie sind alle beschädigt, oder die einzigen Platten Kopien vorhanden sind beschädigt). Wie sieht mein Programm sehen, die in Bezug auf den Rückgabewert aus dem gelesenen, und dem Byte, es zu lesen versucht? Und gibt es eine Möglichkeit, das Verhalten zu beeinflussen (unter Solaris oder andere ZFS-Implementierung OS), das heißt, Kraft Versagen oder Kraft Erfolg, mit potenziell korrupten Daten?

War es hilfreich?

Lösung

EIO ist in der Tat die einzige Antwort mit aktuellen ZFS-Implementierungen.

Ein offener ZFS „Bug“, fragt nach einer Möglichkeit, beschädigte Daten zu lesen: http://bugs.opensolaris.org/bugdatabase/printableBug.do?bug_id=6186106

Ich glaube, das bereits machbar ist, die nicht dokumentiert, aber Open-Source-ZDB-Dienstprogramm. Werfen Sie einen Blick auf http://www.cuddletech.com/blog/pivot /entry.php?id=980 für Erklärungen darüber, wie eine Datei mit Inhalt ZDB Option -R und "r" Flag dump.

Andere Tipps

Solaris 10:

# Create a test pool
[root@tesalia z]# cd /tmp
[root@tesalia tmp]# mkfile 100M zz
[root@tesalia tmp]# zpool create prueba /tmp/zz

# Fill the pool
[root@tesalia /]# dd if=/dev/zero of=/prueba/dummy_file
dd: writing to `/prueba/dummy_file': No space left on device
129537+0 records in
129536+0 records out
66322432 bytes (66 MB) copied, 1.6093 s, 41.2 MB/s

# Umount the pool
[root@tesalia /]# zpool export prueba

# Corrupt the pool on purpose
[root@tesalia /]# dd if=/dev/urandom of=/tmp/zz seek=100000 count=1 conv=notrunc
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.0715209 s, 7.2 kB/s

# Mount the pool again
zpool import -d /tmp prueba

# Try to read the corrupted data
[root@tesalia tmp]# md5sum /prueba/dummy_file 
md5sum: /prueba/dummy_file: I/O error

# Read the manual
[root@tesalia tmp]# man -s2 read
[...]
RETURN VALUES
     Upon successful completion,  read()  and  readv()  return  a
     non-negative integer indicating the number of bytes actually
     read. Otherwise, the functions return -1 and  set  errno  to
     indicate the error.

ERRORS
     The read(), readv(), and pread() functions will fail if:
[...]
     EIO        A physical I/O error has occurred, [...]

Sie müssen den Test-Pool exportieren / importieren, da, wenn nicht, wird das direkte Überschreiben (Pool Korruption), da die Datei immer noch vermisst wird in OS-Speicher zwischengespeichert werden.

Und nein, zur Zeit ZFS wird sich weigern, Ihnen Daten beschädigt zu geben. Wie es sollte.

Wie würde alles zurückkehrt aber einen EIO Fehler von read() sinnvoll außerhalb eines Dateisystem spezifische niedriges Niveau Datenrettung Utility?

Die geringe Datenrettung Dienstprogramm müssten ein OS und FS spezifische API andere als offen / verwenden Lesen / Schreiben / schließen Sie die Datei auf zuzugreifen. Die Semantik es müßte unterscheidet sich grundlegend von normalen Dateien zu lesen, so dass es eine spezialisierte API benötigen würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top