Небольшое количество предыстории:
У меня небольшая медиа-файловая система, в которой я храню различные фильмы и телепередачи, которые используются для моей настройки 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
?
dconvert=single
за один кусок делает только то, чего я боялся, и удаляет известную хорошую копию. :(Ответы:
Хорошо, я понял это с помощью этой ссылки Trello . В случае, если кто-то еще хочет сделать это, вот процедура.
Процедура
Из массива RAID1 из двух дисков, один из
/dev/sda
которых неисправен, а другой/dev/sdc
заведомо исправен:/etc/fstab
, перезагрузите компьютер . По сути, мы хотим, чтобы btrfs забыл, что этот массив существует, поскольку есть ошибка, при которой он все равно будет пытаться использовать один из дисков, если он отключен.Теперь, когда ваш массив размонтирован, выполните:
echo 1 | sudo tee /sys/block/sda/device/delete
замена
sda
на неисправное имя устройства. Это заставляет диск вращаться вниз (вы должны проверить это в dmesg) и стать недоступным для ядра.В качестве альтернативы : просто выньте диск из компьютера перед загрузкой! Я решил не выбирать этот метод, так как вышеописанное прекрасно работает для меня.
-o degraded
режима.sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint
. Это позволит реорганизовать экстенты на исправном диске и преобразовать их вsingle
(не RAID). Это займет почти день, в зависимости от скорости вашего диска и размера массива. (у меня было ~ 700 ГиБ, и он перебалансировался со скоростью 1 1 ГБ куска в минуту) К счастью, эта операция может быть приостановлена и будет поддерживать массив во время его выполнения.sudo btrfs device remove missing /mountpoint
удалить «отсутствующее» неисправное устройство.sudo btrfs balance start -mconvert=dup /mountpoint
восстановления избыточности метаданных. Это занимает несколько минут в моей системе.single
режиме со всей избыточностью удален.Исправление проблем
источник
,soft
после каждого,convert=
чтобы пропустить фрагменты, которые уже имеют целевой профиль (который должен быть всем).Спасибо за ваш пост. У меня была идея, что я могу протестировать рейд, вытащить диск из моего отсека для горячей замены, использовать другой диск, а затем снова вставить рейдовый диск. Оглядываясь назад, это была плохая идея, и теперь мне нужен мой отсек для горячей замены.
Вот что я нашел. Как корень:
Обратите внимание на устройство, указанное для каждого диска. Человек для баланса brtrfs привел меня к варианту devid, взял пару попыток выяснить, как работают фильтры (сначала попытался devid = / dev / sdb1). Итак, ваша первая попытка будет выглядеть примерно так.
Который дал мне ошибку.
Вот ошибка из dmesg:
Так что это финал, который работал:
Надеюсь, это поможет кому-то еще.
источник
btrfs replace
.devid=
-sconvert
чтобы преобразовать системные блоки.|
вместо того, чтобы,
на странице руководства для баланса было сказано:profiles=<profiles>
Balances only block groups with the given profiles. Parameters are a list of profile names separated by "|" (pipe)