Pregunta

Di mi programa intenta una lectura de un byte en un archivo en un sistema de archivos ZFS. ZFS puede encontrar una copia del bloque es necesario, pero no pueden localizar cualquier copia con una suma de comprobación válida (todos están corrompidos, o los únicos discos presentes han corrompido copias). ¿Qué ver mi programa, en términos del valor de retorno de la lectura, y el byte se trató de leer? Y hay una manera de influir en el comportamiento (en Solaris, o cualquier otro sistema operativo ZFS-aplicación), es decir, la fuerza de fracaso o el éxito forzar, con datos potencialmente corruptos?

¿Fue útil?

Solución

EIO es de hecho la única respuesta con las implementaciones actuales de ZFS.

Una ZFS abierta "error", se pregunta por alguna forma de leer los datos dañada: http://bugs.opensolaris.org/bugdatabase/printableBug.do?bug_id=6186106

Creo que esto ya es factible mediante la utilidad ZDB fuente indocumentado pero abierto. Echar un vistazo a http://www.cuddletech.com/blog/pivot /entry.php?id=980 explicaciones sobre cómo volcar un contenido de archivos utilizando la opción -R ZDB y "r" bandera.

Otros consejos

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

Debe exportar / importar la piscina prueba porque, si no, la sobreescritura directa (corrupción de la piscina) será echado de menos desde que el archivo todavía se almacenan en caché en la memoria del sistema operativo.

Y no, actualmente ZFS se negará a darle datos dañados. Como debiera.

¿Cómo sería volver otra cosa que un error EIO del sentido read() hacen fuera de un sistema de archivo de la utilidad específica de recuperación de datos de bajo nivel?

La utilidad de rescate bajo nivel de datos tendría que usar un sistema operativo y FS API específica que no sea abierta / leer / escribir / cerca de acceder al fichero. La semántica que necesitaría son fundamentalmente diferentes de la lectura de archivos normales, por lo que necesitarían un API especializado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top