代码之家  ›  专栏  ›  技术社区  ›  Jay Kominek

当ZFS无法提供未损坏的数据时,程序会看到什么?

  •  4
  • Jay Kominek  · 技术社区  · 15 年前

    假设我的程序尝试读取ZFS文件系统上文件中的一个字节。ZFS可以找到所需数据块的副本,但无法找到任何具有有效校验和的副本(它们都已损坏,或者只有存在的磁盘具有损坏的副本)。从读取的返回值和试图读取的字节来看,我的程序看到了什么?有没有一种方法可以影响行为(在Solaris或任何其他ZFS实现操作系统下),即强制失败或强制成功,以及潜在的损坏数据?

    3 回复  |  直到 15 年前
        1
  •  5
  •   jlliagre    15 年前

    EIO确实是当前ZFS实现的唯一答案。

    打开的ZFS“错误”要求以某种方式读取损坏的数据: http://bugs.opensolaris.org/bugdatabase/printableBug.do?bug_id=6186106

    看看 http://www.cuddletech.com/blog/pivot/entry.php?id=980

        2
  •  2
  •   G. Cito    11 年前

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

    您必须导出/导入测试池,因为如果不导出,直接覆盖(池损坏)将丢失,因为文件仍将缓存在操作系统内存中。

    不,目前ZFS将拒绝向您提供损坏的数据。应该如此。

        3
  •  1
  •   ndim    15 年前

    除了一张支票,你怎么还 EIO 错误来自 read() 在特定于文件系统的低级数据救援实用程序之外是否有意义?