Was sehen Programme, wenn ZFS nicht unbeschädigte Daten liefern können?
-
19-09-2019 - |
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?
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.