zpool 导入时缺少缓存设备

zpool 导入时缺少缓存设备

本来打算尝试 SmartOS,部分原因是我对 FreeNAS 的使用不满意。在旧的缓存驱动器上为 SmartOS 区域创建了新的 zpool。这些只是背景故事。关键是现在无法在 Ubuntu 15.04 上导入旧的 FreeNAS 池。

  pool: pool5                                                            
    id: 14850262647910895720                                              
 state: UNAVAIL                                                           
status: The pool was last accessed by another system.                     
action: The pool cannot be imported due to damaged devices or data.       
  see: http://zfsonlinux.org/msg/ZFS-8000-EY                              
config:                                                                   

    pool5                               UNAVAIL  missing device        
      raidz2-0                          ONLINE                         
        ata-WL3000GSA6472_WOL240282406  ONLINE                         
        ata-WL3000GSA6472_WOL240282471  ONLINE                         
        ata-WL3000GSA6472_WOL240282504  ONLINE                         
        ata-WL3000GSA6472_WOL240282506  ONLINE                         
        ata-WL3000GSA6472_WOL240282472  ONLINE                         
    cache                                                              
      ata-ST31500341AS_6VS073SA                                        

  pool: zones                                                             
    id: 513536768382594111                                                
 state: ONLINE                                                            
status: The pool was last accessed by another system.                     
action: The pool can be imported using its name or numeric identifier and 
       the '-f' flag.                                                     
  see: http://zfsonlinux.org/msg/ZFS-8000-EY                              
config:                                                                   

       zones                        ONLINE                                
         ata-ST31500341AS_6VS073SA  ONLINE                                   

从那时起我就摧毁了区域。

尝试了大多数强制选项和组合,结果类似:

$ sudo zpool import pool5
cannot import 'pool5': pool may be in use from other system, it was last accessed by freenas.local (hostid: 0x8120288a) on Tue Oct 27 16:24:56 2015
$ sudo zpool import -f pool5
cannot import 'pool5': one or more devices is currently unavailable
$ sudo zpool import -Ff pool5
cannot import 'pool5': one or more devices is currently unavailable
$ sudo zpool import -fm pool5
cannot import 'pool5': one or more devices is currently unavailable
$ sudo zpool import -FfmX pool5
cannot import 'pool5': one or more devices is currently unavailable
$ sudo zpool import -fD pool5
cannot import 'pool5': no such pool available
$ sudo zpool import -nF pool5
cannot import 'pool5': pool may be in use from other system, it was last accessed by freenas.local (hostid: 0x8120288a) on Tue Oct 27 16:24:56 2015
use '-f' to import anyway
$ sudo zpool import -m pool5
cannot import 'pool5': pool may be in use from other system, it was last accessed by freenas.local (hostid: 0x8120288a) on Tue Oct 27 16:24:56 2015
use '-f' to import anyway

$ sudo zdb -e pool5说:

Configuration for import:
        vdev_children: 2
        version: 5000
        pool_guid: 14850262647910895720
        name: 'pool5'
        state: 0
        hostid: 2166368394
        hostname: 'freenas.local'
        vdev_tree:
            type: 'root'
            id: 0
            guid: 14850262647910895720
            children[0]:
                type: 'raidz'
                id: 0
                guid: 142933150631883837
                nparity: 2
                metaslab_array: 33
                metaslab_shift: 37
                ashift: 12
                asize: 15002891714560
                is_log: 0
                create_txg: 4
                children[0]:
                    type: 'disk'
                    id: 0
                    guid: 79266291072794538
                    whole_disk: 1
                    DTL: 356
                    create_txg: 4
                    path: '/dev/disk/by-id/ata-WL3000GSA6472_WOL240282406-part1'
                children[1]:
                    type: 'disk'
                    id: 1
                    guid: 1087294782673888508
                    whole_disk: 1
                    DTL: 258
                    create_txg: 4
                    path: '/dev/disk/by-id/ata-WL3000GSA6472_WOL240282471-part1'
                children[2]:
                    type: 'disk'
                    id: 2
                    guid: 2219503574895013140
                    whole_disk: 1
                    DTL: 257
                    create_txg: 4
                    path: '/dev/disk/by-id/ata-WL3000GSA6472_WOL240282504-part1'
                children[3]:
                    type: 'disk'
                    id: 3
                    guid: 6460403329296563235
                    whole_disk: 1
                    DTL: 202
                    create_txg: 4
                    path: '/dev/disk/by-id/ata-WL3000GSA6472_WOL240282506-part1'
                children[4]:
                    type: 'disk'
                    id: 4
                    guid: 9844978706073275260
                    whole_disk: 1
                    DTL: 167
                    create_txg: 4
                    path: '/dev/disk/by-id/ata-WL3000GSA6472_WOL240282472-part1'
            children[1]:
                type: 'missing'
                id: 1
                guid: 0
zdb: can't open 'pool5': No such device or address

版本:

libzfs2    0.6.5.3-1~vivid amd64 Native OpenZFS filesystem library for Linux
ubuntu-zfs 9~vivid         amd64 Native ZFS filesystem metapackage for Ubuntu.
zfs-dkms   0.6.5.3-1~vivid amd64 Native OpenZFS filesystem kernel modules for Linux
zfsutils   0.6.5.3-1~vivid amd64 Native OpenZFS management utilities for Linux

尝试从 devnodes 导入:

~/tmp$ ln -s $(for link in /dev/disk/by-id/ata-WL3000GSA6472_WOL240282406* /dev/disk/by-id/ata-WL3000GSA6472_WOL240282471* /dev/disk/by-id/ata-WL3000GSA6472_WOL240282504* /dev/disk/by-id/ata-WL3000GSA6472_WOL240282506* /dev/disk/by-id/ata-WL3000GSA6472_WOL240282472* ; do readlink -f "${link}" ; done) ./
~/tmp$ ls
sdb  sdb1  sdb9  sdc  sdc1  sdc9  sdd  sdd1  sdd9  sde  sde1  sde9  sdf  sdf1  sdf9
~/tmp$ sudo zpool import -d ./ pool5
cannot import 'pool5': pool may be in use from other system, it was last accessed by freenas.local (hostid: 0x8120288a) on Tue Oct 27 16:24:56 2015
use '-f' to import anyway
~/tmp$ sudo zpool import -fd ./ pool5
cannot import 'pool5': one or more devices is currently unavailable

还有奇怪的部分(ada1 是什么?哦,可能是 freebsd devnode):

$ sudo zpool import -d tmp
   pool: pool5
     id: 14850262647910895720
  state: UNAVAIL
 status: The pool was last accessed by another system.
 action: The pool cannot be imported due to damaged devices or data.
   see: http://zfsonlinux.org/msg/ZFS-8000-EY
 config:

        pool5        UNAVAIL  missing device
          raidz2-0   ONLINE
            sde      ONLINE
            sdc      ONLINE
            sdd      ONLINE
            sdb      ONLINE
            sdf      ONLINE
        cache
          ada1

我可以重新初始化缓存设备以便再次找到它吗?缓存设备存储了多少有关其池的信息?只需创建另一个 zpool 并将其作为缓存添加到其中就可以了吗?zdb 似乎没有列出它的 guid - 它只会占用一个空闲的缓存驱动器吗?我可以创建一个缓存驱动器并将其符号链接到 ada1 并让它拾取它吗?

答案1

Linux 上的 ZFS 是什么版本?使用缺失的缓存设备导入是一项“较新”的功能(现在不是那么新了,但 ZoL 过去落后了不少)

另外,如果您不需要它,请尝试销毁“zones”池,这样“pool5”中的缓存设备就不会被锁定。您可能会遇到奇怪的情况,因为该设备实际上并没有丢失,只是因为被其他池锁定而无法使用。

其他要尝试的事情:zpool import -m pool5(只需要用于丢失的日志设备,而不是丢失的缓存设备)

zpool 导入-nF pool5

答案2

我不太确定,但经过我们在问题评论中的反复讨论,我认为问题可能是设备存在,但不是缓存设备,并且这在某种程度上混淆了 ZFS 工具链,以至于无法正常导入池。

如果这就是你的问题的根源,那么您很可能能够通过从不同的目录导入来解决该问题。

为此,请创建一个临时目录,并在其中重新创建必要的设备符号链接。例如:

# mkdir /tmp/zfs
# cd /tmp/zfs
# ln -s $(for link in /dev/disk/by-id/ata-WL3000GSA6472_WOL240282406* /dev/disk/by-id/ata-WL3000GSA6472_WOL240282471* /dev/disk/by-id/ata-WL3000GSA6472_WOL240282504* /dev/disk/by-id/ata-WL3000GSA6472_WOL240282506* /dev/disk/by-id/ata-WL3000GSA6472_WOL240282472* ; do readlink -f "${link}" ; done) ./
# zpool import -d /tmp/zfs

(长ln命令只是重新创建ata-WL...链接并确保它们指向正确的设备节点。)

如果一切顺利的话,最终zpool import -d ...应该输出类似下面的内容:

  pool: pool5
    id: 14850262647910895720
 state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:

    pool5                               ONLINE
      raidz2-0                          ONLINE
        ata-WL3000GSA6472_WOL240282406  ONLINE
        ata-WL3000GSA6472_WOL240282471  ONLINE
        ata-WL3000GSA6472_WOL240282504  ONLINE
        ata-WL3000GSA6472_WOL240282506  ONLINE
        ata-WL3000GSA6472_WOL240282472  ONLINE
    cache
      ...something... MISSING (was ata-ST31500341AS_6VS073SA)

我不知道zpool import丢失缓存设备的输出的具体格式(它甚至可能根本不显示),因此对这部分内容持怀疑态度,它可能仍会抱怨池“正在使用”,但希望这将使 ZFS 有机会查找池并且不会被缓存设备混淆,因为 ZFS 将在缓存设备甚至不存在的地方进行查找。

如果此方法有效,您应该能够使用导入池-d /tmp/zfs -f(您将需要使用,-f因为之前没有导出该池,但我建议您先尝试不使用它,因为使用-fZFS 是往往不是你想做的事除非你确切知道你想使用它,并且为什么如果你想使用它,请使用 之类的方法从池中删除缓存设备zpool detach pool5 ...something...,导出池,然后正常重新导入池。然后,你可以根据需要重新添加缓存设备(尽管我强烈建议不要将主轴用作缓存设备)。

在您能够正常重新导入池(无需使用-d)后,您可以安全地删除上面创建的 /tmp/zfs(或其他临时)目录。

另外,如果这个方法有效,我鼓励你向项目问题追踪器. 对于实际上的易失性数据存储,不需要这种解决方法。

相关内容