假设我的程序尝试读取 ZFS 文件系统上文件中的字节。ZFS 可以找到必要块的副本,但无法找到具有有效校验和的任何副本(它们都已损坏,或者存在的唯一磁盘具有损坏的副本)。就读取的返回值和它尝试读取的字节而言,我的程序看到了什么?有没有办法影响行为(在 Solaris 或任何其他实现 ZFS 的操作系统下),即使用可能损坏的数据强制失败或强制成功?
问问题
464 次
3 回答
5
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”标志转储文件内容。
于 2009-11-25T04:50:03.040 回答
2
索拉里斯 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 将拒绝向您提供损坏的数据。正如它应该。
于 2010-04-24T03:34:21.440 回答
1
在文件系统特定的低级数据救援实用程序之外,如何返回除EIO
错误之外的任何内容?read()
低级数据救援实用程序需要使用除打开/读取/写入/关闭之外的操作系统和 FS 特定 API 来访问文件。它需要的语义与读取普通文件根本不同,因此它需要一个专门的 API。
于 2009-11-12T20:40:04.330 回答