Что видят программы, когда ZFS не может предоставить неповрежденные данные?

StackOverflow https://stackoverflow.com/questions/1725171

Вопрос

Допустим, моя программа пытается прочитать байт из файла в файловой системе ZFS.ZFS может найти копию необходимого блока, но не может найти ни одной копии с допустимой контрольной суммой (все они повреждены, или только на имеющихся дисках есть поврежденные копии).Что видит моя программа с точки зрения возвращаемого значения из прочитанного и байта, который она пыталась прочитать?И есть ли способ повлиять на поведение (в Solaris или любой другой ОС, реализующей ZFS), то есть принудительно выполнить сбой или принудительный успех с потенциально поврежденными данными?

Это было полезно?

Решение

EIO действительно является единственным ответом при текущих реализациях ZFS.

Открытая "ошибка" ZFS запрашивает какой-либо способ чтения поврежденных данных:http://bugs.opensolaris.org/bugdatabase/printableBug.do?bug_id=6186106

Я полагаю, что это уже выполнимо с помощью недокументированной, но с открытым исходным кодом утилиты zdb.Взгляните на http://www.cuddletech.com/blog/pivot/entry.php?id=980 для получения объяснений о том, как создать дамп содержимого файла, используя опцию zdb -R и флаг "r".

Другие советы

Солярис 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, [...]

Вы должны экспортировать / импортировать тестовый пул, потому что в противном случае прямая перезапись (повреждение пула) будет пропущена, поскольку файл по-прежнему будет кэшироваться в памяти операционной системы.

И нет, в настоящее время ZFS отказывается предоставлять вам поврежденные данные.Как и должно быть.

Как можно вернуть что-либо, кроме EIO ошибка от read() имеет смысл вне специфичной для файловой системы низкоуровневой утилиты восстановления данных?

Низкоуровневой утилите восстановления данных потребуется использовать специфичный для ОС и FS API, отличный от open / read / write / close to, для доступа к файлу.Семантика, которая ему потребуется, принципиально отличается от чтения обычных файлов, поэтому для этого потребуется специализированный API.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top