Linux BTRFS - convertir en simple avec lecteur en panne

12

Un peu de trame de fond:

J'ai un petit système de fichiers multimédias, sur lequel je stocke divers films et émissions de télévision qui sont utilisés pour ma configuration HTPC. Cela a été initialement configuré, en utilisant btrfs, sur un disque externe WD de 1 To.

Plus tard, j'ai décidé d'acheter un autre lecteur, pour donner à ce système de fichiers des capacités de mise en miroir RAID1. Ce lecteur est un Seagate Barracuda (2 To, BARRACUDA 7200.14 FAMILY). Malheureusement, ce n'était pas un bon choix de lecteur. Le lecteur a commencé à développer de grandes quantités d'erreurs de lecture sous peu, bien que BTRFS ait pu les corriger.

Récemment, le nombre d'erreurs de lecture de ce lecteur a augmenté, son état s'aggravant régulièrement. BTRFS commence maintenant à planter:

kernel: RSP: 0018:ffff88005f0e7cc0  EFLAGS: 00010282
kernel: RIP: 0010:[<ffffffffa0081736>]  [<ffffffffa0081736>] btrfs_check_repairable+0xf6/0x100 [btrfs]
kernel: task: ffff88001b5c4740 ti: ffff88005f0e4000 task.ti: ffff88005f0e4000
kernel: Workqueue: btrfs-endio btrfs_endio_helper [btrfs]
kernel: CPU: 1 PID: 3136 Comm: kworker/u8:3 Tainted: G           O    4.5.3-1-ARCH #1
kernel: invalid opcode: 0000 [#1] PREEMPT SMP 
kernel: kernel BUG at fs/btrfs/extent_io.c:2309!
kernel: ------------[ cut here ]------------
kernel: BTRFS info (device sdc1): csum failed ino 73072 extent 1531717287936 csum 3335082470 wanted 3200325796 mirror 0
kernel: ata3: EH complete
kernel: BTRFS error (device sdc1): bdev /dev/sda3 errs: wr 0, rd 18, flush 0, corrupt 0, gen 0
kernel: blk_update_request: I/O error, dev sda, sector 2991635296

Je voudrais supprimer le disque défectueux de la matrice RAID1, sans aucune redondance sur un seul disque. Malheureusement, il semble y avoir un manque de documentation sur la façon de procéder.

Je suis conscient que l'on peut exécuter ce qui suit:

sudo btrfs balance start -dconvert=single /media

pour convertir le profil de données en singlemode, mais je ne sais pas exactement OERE les données seront placées. Comme l'un des disques tombe en panne, je voudrais pouvoir m'assurer que BTRFS n'efface pas consciencieusement toutes les données sur le bon disque, et place une seule copie sur le mauvais disque - à la place, je voudrais simplement agir comme si l'autre disque n'avait jamais existé (comme dans, reconvertir à mon ancienne configuration)

Cela ne fonctionne pas:

$ sudo btrfs device delete /dev/sda3 /media
ERROR: error removing device '/dev/sda3': unable to go below two devices on raid1

Que dois-je faire? De l'aide serait grandement appréciée.

TL; DR: a commencé avec 1 lecteur dans BTRFS single, a ajouté un autre lecteur, l'a fait RAID1, un autre lecteur est maintenant en erreur, comment puis-je revenir à un seul lecteur (en particulier le bon connu) avec single?

eeeeeta
la source
Mise à jour: essayer cela dconvert=singlepour un seul morceau ne fait que ce que je craignais et supprime la bonne copie connue. :(
eeeeeta

Réponses:

11

D'accord, je l'ai compris à l'aide de ce lien Trello . Si quelqu'un d'autre souhaite le faire, voici la procédure.

Procédure

À partir d'une matrice RAID1 de deux disques, l'un /dev/sdadéfectueux et l'autre /dev/sdcconnu:

  1. Désactivez le montage automatique de cette baie dans /etc/fstab, redémarrez . Fondamentalement, nous voulons que btrfs oublie que ce tableau existe, car il y a un bogue où il essaiera toujours d'utiliser l'un des disques s'il est débranché.
  2. Maintenant que votre tableau est démonté, exécutez:

    echo 1 | sudo tee /sys/block/sda/device/delete

    remplacement sdapar le nom de périphérique défectueux. Cela provoque la rotation du disque (vous devez le vérifier dans dmesg) et devient inaccessible au noyau.

    Alternativement : il suffit de retirer le lecteur de l'ordinateur avant de démarrer! J'ai choisi de ne pas opter pour cette méthode, car ce qui précède fonctionne bien pour moi.

  3. Montez votre baie, avec le -o degradedmode.
  4. Commencez une opération de rééquilibrage avec sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint. Cela réorganisera les extensions sur le disque en bon état, en les convertissant en single(non RAID). Cela prendra presque un jour, selon la vitesse de votre disque et la taille de votre baie. (Le mien avait environ 700 Gio et rééquilibré à un taux de 1 morceau de 1 Gio par minute) Heureusement, cette opération peut être interrompue et gardera la baie en ligne pendant qu'elle se produit.
  5. Une fois cela fait, vous pouvez émettre sudo btrfs device remove missing /mountpointpour supprimer le périphérique défectueux «manquant».
  6. Commencez un deuxième rééquilibrage avec sudo btrfs balance start -mconvert=dup /mountpointpour restaurer la redondance des métadonnées. Cela prend quelques minutes sur mon système.
  7. Vous avez terminé! Votre baie est désormais en singlemode, toute redondance supprimée.
  8. Prenez votre lecteur défectueux à l'extérieur et battez-le avec un marteau.

Dépannage

  • Aide, btrfs a essayé d'écrire sur mon disque défectueux, s'est trompé et l'a forcé en lecture seule!
    • Avez-vous suivi l'étape 1 et redémarré avant de continuer? Il est probable que btrfs pense toujours que le lecteur que vous avez filé est présent. Le redémarrage fera oublier à btrfs toutes les erreurs et vous permettra de continuer.
eeeeeta
la source
2
Ça ne marche pas. Je suis sur Ubuntu 16.04 (Kernel 4.4). dmesg dit que "les périphériques manquants (1) dépassent la limite (0), le montage en écriture n'est pas autorisé". Ainsi je suis bloqué à l'étape "monter -o dégradé"
HelloSam
@HelloSam: C'est peut-être un bug. Voir bbs.archlinux.org/viewtopic.php?id=210541
jaltek
Pensez à ajouter ,softaprès chacun convert=pour ignorer les morceaux qui ont déjà le profil cible (qui devraient être tous).
Tom Hale
9

Merci pour votre message. J'ai eu cette idée que je pouvais tester le raid, sortir le lecteur de ma baie de hotswap, utiliser un autre lecteur, puis réinsérer le lecteur de raid. En rétrospective, c'était une mauvaise idée et maintenant j'ai besoin de ma baie de hotswap.

Voici ce que j'ai trouvé. En tant que root:

# sudo btrfs fi show
Label: 'disk'  uuid: 12817aeb-d303-4815-8bba-a3440e36c62c
Total devices 2 FS bytes used 803.10GiB
    devid    1 size 931.51GiB used 805.03GiB path /dev/sda1
    devid    2 size 931.51GiB used 805.03GiB path /dev/sdb1

Notez le devid répertorié pour chaque lecteur. Man for brtrfs balance m'a conduit à l'option devid, a pris quelques essais pour comprendre comment les filtres fonctionnaient (essayant initialement devid = / dev / sdb1). Donc, votre première tentative va ressembler à ceci.

# btrfs balance start -dconvert=single,devid=2 -mconvert=single,devid=2 /mnt

Ce qui m'a donné une erreur.

ERROR: error during balancing '/media/.media': Invalid argument
There may be more info in syslog - try dmesg | tail    

Voici l'erreur de dmesg:

BTRFS error (device sdb1): balance will reduce metadata integrity, use force if you want this

Voici donc la finale qui a fonctionné:

# btrfs balance start -f -dconvert=single,devid=2 -mconvert=single,devid=2 /mnt

J'espère que cela aide quelqu'un d'autre.

PG
la source
Si vous vouliez simplement remplacer un lecteur par un autre, vous pouvez le faire en utilisant btrfs replace.
dma_k
Cela a fonctionné pour moi il y a environ un an, mais pas aujourd'hui. Peu importe ce que je tape après devid=, les données uniques résultantes sont placées sur le périphérique 1.
YtvwlD
Vérifiez également -sconvertpour convertir les morceaux du système.
Tom Hale
Pensez à utiliser |au lieu de ,comme la page de manuel pour l'équilibre dit:profiles=<profiles> Balances only block groups with the given profiles. Parameters are a list of profile names separated by "|" (pipe)
Tom Hale