¿Qué programas ven cuando ZFS no puede entregar los datos no corrompidos?
-
19-09-2019 - |
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?
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.