Comment remplacer un disque dans un pool ZFS non redondant?

8

J'ai fait un peu de lecture, et il semble que ZFS n'aime pas que les disques soient supprimés des baies non redondantes :

Vous pouvez utiliser la zpool detachcommande pour détacher un périphérique d'un pool de stockage en miroir. Par exemple:

# zpool detach zeepool c2t1d0

Cependant, cette opération est refusée s'il n'existe aucune autre réplique valide des données. Par exemple:

# zpool detach newpool c1t2d0
cannot detach c1t2d0: only applicable to mirror and replacing vdevs

Le problème de base est compréhensible: la suppression de la seule copie d'un élément de données (qu'il s'agisse de métadonnées ou de données utiles) d'un tableau rendrait ces données indisponibles.

Les exemples de remplacement de périphériques dans un pool de stockage ZFS donnent une description de base étape par étape de la façon de remplacer un périphérique dans un pool de stockage: déconnectez le disque, retirez le disque, insérez le disque de remplacement, exécutez zpool replacepour informer ZFS de la modification et en ligne le disque. Cela nécessite évidemment que la baie ne dépende pas du disque à remplacer, donc la baie doit avoir une redondance; si elle dépend du lecteur en question, cette approche présente le même problème que ci-dessus.

Quelle est la méthode recommandée pour remplacer un disque dans une baie ZFS non redondante ?

Supposons que le disque existant fonctionne correctement et supposons que le disque de remplacement est au moins de la même taille que le disque à remplacer. (Si le disque existant est tombé en panne, il est clair que tout ce que vous pouvez faire est d'ajouter un nouveau disque et de restaurer tous les fichiers affectés par l'échec du disque à partir de la sauvegarde.)

un CVn
la source

Réponses:

3

Je ne sais pas si les choses étaient si différentes en `13 mais 'zfs replace' fonctionne sur des pools non redondants. Vous exécutez simplement la commande 1 au lieu de vous détacher en premier.

d1 est 1G, d2 est 2G, les deux sont des fichiers vides dans / tmp:

/t/test #> zpool create test /tmp/test/d1
/t/test #> zpool set autoexpand=on test
/t/test #> zpool status
  pool: test
 state: ONLINE
  scan: none requested
config:

    NAME            STATE     READ WRITE CKSUM
    test            ONLINE       0     0     0
      /tmp/test/d1  ONLINE       0     0     0

errors: No known data errors
/t/test #> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test   1008M   258K  1008M         -     0%     0%  1.00x  ONLINE  -


/t/test #> zpool replace test /tmp/test/d1 /tmp/test/d2


/t/test #> zpool status
  pool: test
 state: ONLINE
  scan: resilvered 61K in 0h0m with 0 errors on Sun Sep 18 18:55:32 2016
config:

    NAME            STATE     READ WRITE CKSUM
    test            ONLINE       0     0     0
      /tmp/test/d2  ONLINE       0     0     0

errors: No known data errors
/t/test #> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test   1.98G   408K  1.98G         -     0%     0%  1.00x  ONLINE  -
alaricljs
la source
12
zpool attach pool old-disk new-disk

Cela convertira l'ancien disque en un miroir avec l'ancien disque et le nouveau disque et commencera la réargenture après quoi vous pourrez détacher l'ancien disque.

zpool detach pool old-disk

Testé avec des dispositifs en boucle:

# truncate -s 1G a b
# truncate -s 1200M c
# losetup  /dev/loop0 a
# losetup  /dev/loop1 b
# losetup  /dev/loop2 c
# zpool create test loop{0,1}
# zpool attach test loop1 loop2
# zpool status
      pool: test
 state: ONLINE
  scan: resilvered 62K in 0h0m with 0 errors on Wed Jul 31 13:43:19 2013
config:

        NAME        STATE     READ WRITE CKSUM
        test        ONLINE       0     0     0
          loop0     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            loop1   ONLINE       0     0     0
            loop2   ONLINE       0     0     0
# zpool detach test loop1
# zpool status
  pool: test
 state: ONLINE
  scan: resilvered 62K in 0h0m with 0 errors on Wed Jul 31 13:43:19 2013
config:

        NAME        STATE     READ WRITE CKSUM
        test        ONLINE       0     0     0
          loop0     ONLINE       0     0     0
          loop2     ONLINE       0     0     0
Stéphane Chazelas
la source
Vous dites donc que ZFS ne prend pas en charge une telle opération en natif? Semble bizarre. (Il semblerait que tout ce qui est nécessaire soit d'avoir les deux disques connectés, puis d'informer ZFS que l'ancien disque est sur le point d'être mis hors ligne, ce qui lui donne la possibilité de migrer les données qu'il contient vers d'autres disques de la même manière que pour le faire. si c'était une réargenture dans un tableau redondant.)
un CVn
@ MichaelKjörling, je ne dis pas cela. Je dis simplement que ce qui précède devrait fonctionner car je ne vois aucune raison pour laquelle cela ne devrait pas.
Stéphane Chazelas
Cela dit, il semble que ZFS le supporte en effet. Réponse mise à jour.
Stéphane Chazelas
Génial! C'est le genre de réponse que je cherchais et espérais obtenir. Je vous donnerais un autre +1 pour l'essayer si je le pouvais.
un CVn le