Domanda

Di 'il mio programma tenta una lettura di un byte in un file su un file system ZFS. ZFS possono trovare una copia del blocco necessario, ma non è possibile individuare qualsiasi copia con un checksum valido (sono tutti corrotti, o gli unici dischi presenti hanno corrotto copie). Che cosa significa il mio programma vede, in termini di valore restituito dalla lettura, e il byte ha cercato di leggere? E c'è un modo di influenzare il comportamento (sotto Solaris, o di qualsiasi altro ZFS-implementazione del sistema operativo), cioè forzare il fallimento, o forzare il successo, con dati potenzialmente corrotti?

È stato utile?

Soluzione

OEI è infatti l'unica risposta con le implementazioni di ZFS attuali.

Uno ZFS aperto "bug" chiede un modo per leggere i dati danneggiati: http://bugs.opensolaris.org/bugdatabase/printableBug.do?bug_id=6186106

Credo che questo sia già fattibile utilizzando l'utilità fonte ZDB non documentata, ma aperto. Dai un'occhiata alla http://www.cuddletech.com/blog/pivot /entry.php?id=980 spiegazioni su come scaricare un contenuto di file utilizzando l'opzione ZDB -R e "r" bandiera.

Altri suggerimenti

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, [...]

È necessario esportare / importare la piscina test perché, in caso contrario, la sovrascrittura diretta (piscina corruzione) non sarà raggiunto in quanto il file sarà ancora memorizzato nella cache del sistema operativo.

E no, attualmente ZFS si rifiuterà di darvi dati danneggiati. Come dovrebbe.

Come sarebbe il ritorno tutt'altro che un errore EIO da read() ha senso al di fuori di un sistema di file specifico basso livello di utilità di salvataggio di dati?

L'utilità di salvataggio dati a basso livello avrebbe bisogno di utilizzare un sistema operativo e API specifica FS diverso aperto / lettura / scrittura / vicino per accedere al file. La semantica sarebbe bisogno sono fondamentalmente diversi da leggere i file normali, quindi sarebbe bisogno di un'API specializzata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top