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: начался с одного диска в BTRFS single , добавлен другой диск, сделал его RAID1 , другой диск теперь работает с ошибками, как мне вернуться только к одному диску (особенно известному хорошему) с single?

2 ответа2

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 забыть обо всех ошибках и позволит продолжить.
8

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

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

# 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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .