Linux BTRFS - конвертировать в один с неисправным диском

12

Небольшое количество предыстории:

У меня небольшая медиа-файловая система, в которой я храню различные фильмы и телепередачи, которые используются для моей настройки HTPC. Первоначально он был настроен с использованием btrfsвнешнего накопителя WD емкостью 1 ТБ.

Позже я решил приобрести другой диск, чтобы дать этой файловой системе возможности зеркалирования RAID1. Этот диск является Seagate Barracuda (2TB, BARRACUDA 7200.14 FAMILY). К сожалению, это был неудачный выбор. Вскоре накопитель начал создавать большое количество ошибок чтения, хотя BTRFS удалось их исправить.

В последнее время количество ошибок чтения с этого диска резко возросло, а его состояние постоянно ухудшалось. BTRFS теперь начинает падать:

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

Я хотел бы удалить неисправный диск из массива RAID1, возвращаясь к резервированию на одном диске. К сожалению, кажется, что не хватает документации о том, как это сделать.

Я знаю, что можно запустить следующее:

sudo btrfs balance start -dconvert=single /media

преобразовать профиль данных в singleрежим, но я не уверен, где именно будут размещены данные. Поскольку один из дисков выходит из строя, я хотел бы быть в состоянии убедиться, что BTRFS не покорно удаляет все данные на хорошем диске, и поместить одну копию на плохой диск - вместо этого я хотел бы просто вести себя так, как будто другой диск никогда не существовал (например, преобразовать обратно в мою старую настройку)

Это не работает:

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

Что мне делать? Помощь будет принята с благодарностью.

TL; DR: запустил 1 диск в BTRFS single, добавил другой диск, сделал его RAID1, другой диск теперь работает с ошибками, как мне вернуться только к одному диску (в частности, к известному удачному) с single?

eeeeeta
источник
Обновление: попытка сделать это dconvert=singleза один кусок делает только то, чего я боялся, и удаляет известную хорошую копию. :(
eeeeeta

Ответы:

11

Хорошо, я понял это с помощью этой ссылки Trello . В случае, если кто-то еще хочет сделать это, вот процедура.

Процедура

Из массива RAID1 из двух дисков, один из /dev/sdaкоторых неисправен, а другой /dev/sdcзаведомо исправен:

  1. Отключите автонастройку этого массива в /etc/fstab, перезагрузите компьютер . По сути, мы хотим, чтобы btrfs забыл, что этот массив существует, поскольку есть ошибка, при которой он все равно будет пытаться использовать один из дисков, если он отключен.
  2. Теперь, когда ваш массив размонтирован, выполните:

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

    замена sdaна неисправное имя устройства. Это заставляет диск вращаться вниз (вы должны проверить это в dmesg) и стать недоступным для ядра.

    В качестве альтернативы : просто выньте диск из компьютера перед загрузкой! Я решил не выбирать этот метод, так как вышеописанное прекрасно работает для меня.

  3. Смонтируйте ваш массив с помощью -o degradedрежима.
  4. Начните операцию балансировки с sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint. Это позволит реорганизовать экстенты на исправном диске и преобразовать их в single(не RAID). Это займет почти день, в зависимости от скорости вашего диска и размера массива. (у меня было ~ 700 ГиБ, и он перебалансировался со скоростью 1 1 ГБ куска в минуту) К счастью, эта операция может быть приостановлена ​​и будет поддерживать массив во время его выполнения.
  5. Как только это будет сделано, вы можете sudo btrfs device remove missing /mountpointудалить «отсутствующее» неисправное устройство.
  6. Начните второй ребаланс с sudo btrfs balance start -mconvert=dup /mountpointвосстановления избыточности метаданных. Это занимает несколько минут в моей системе.
  7. Вы сделали! Ваш массив теперь в singleрежиме со всей избыточностью удален.
  8. Выведите свой неисправный диск на улицу и бейте его молотком.

Исправление проблем

  • Помогите, btrfs попытался записать на мой неисправный диск, выдал ошибку и принудительно прочитал ее!
    • Вы выполнили шаг 1 и перезагрузились, прежде чем продолжить? Вполне вероятно, что btrfs по-прежнему считает, что диск, который вы вращали, присутствует. Перезагрузка заставит btrfs забыть обо всех ошибках и позволит вам продолжить.
eeeeeta
источник
2
Это не работает Я на Ubuntu 16.04 (ядро 4.4). dmesg говорит, что «отсутствующие устройства (1) превышают лимит (0), монтируемое монтирование запрещено». Таким образом, я застрял на этапе «mount -o degraded»
HelloSam
@HelloSam: Может быть, это ошибка. См. Bbs.archlinux.org/viewtopic.php?id=210541
jaltek
Попробуйте добавить ,softпосле каждого, convert=чтобы пропустить фрагменты, которые уже имеют целевой профиль (который должен быть всем).
Том Хейл
9

Спасибо за ваш пост. У меня была идея, что я могу протестировать рейд, вытащить диск из моего отсека для горячей замены, использовать другой диск, а затем снова вставить рейдовый диск. Оглядываясь назад, это была плохая идея, и теперь мне нужен мой отсек для горячей замены.

Вот что я нашел. Как корень:

# 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

Обратите внимание на устройство, указанное для каждого диска. Человек для баланса brtrfs привел меня к варианту devid, взял пару попыток выяснить, как работают фильтры (сначала попытался devid = / dev / sdb1). Итак, ваша первая попытка будет выглядеть примерно так.

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

Который дал мне ошибку.

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

Вот ошибка из dmesg:

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

Так что это финал, который работал:

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

Надеюсь, это поможет кому-то еще.

PG
источник
Если вы хотите просто заменить один диск на другой, вы можете сделать это с помощью btrfs replace.
dma_k
Это сработало для меня год назад или около того, но не сегодня. Неважно, что я devid=
печатаю
Также проверьте, -sconvertчтобы преобразовать системные блоки.
Том Хейл
Рассмотрите возможность использования |вместо того, чтобы ,на странице руководства для баланса было сказано:profiles=<profiles> Balances only block groups with the given profiles. Parameters are a list of profile names separated by "|" (pipe)
Том Хейл,