У меня есть диск, который выходит из строя в RAID1 btrfs, так что запись ненадежна, но чтение в основном работает. Как его заменить?

У меня есть диск, который выходит из строя в RAID1 btrfs, так что запись ненадежна, но чтение в основном работает. Как его заменить?

У меня двухдисковая файловая система btrfs, с данными и метаданными в RAID1 (через функцию btrfs, а не mdraid). Диски представляют собой USB3-накопители с dm-crypt наверху. Один из дисков выходит из строя (на нем несколько тысяч плохих секторов, и запись часто прерывается). Я приобрел третий USB-накопитель, чтобы заменить вышедший из строя, как его заменить?

решение1

Это оказалось королевским ПИТА. Во-первых, важно отметить, что теперь у btrfs есть правильная команда замены, которая намного лучше, чем add new, remove failed.

Сначала начните с разбиения нового диска на разделы и настройки dm-crypt на нем. Продолжайте и разблокируйте его.

Если бы на вашем диске не было тайм-аута записи (который, судя по всему, занимает 360 секунд каждая!), вы могли бы сделать просто:

btrfs replace start -r /dev/mapper/luks-BAD-disk-uuid              \
                       /dev/mapper/luks-NEW-disk-uuid /mount/path

Однако это приведет к выполнению рутинных операций записи на плохой диск, и если они приведут к тайм-ауту, вы увидите около 30 секунд быстрого копирования, за которыми последуют 6–12 минут простоя в ожидании тайм-аута.

Чтобы избежать записи на него, можно настроить снимок с помощью device-mapper. Чтение будет отправлено на базовое плохое устройство (что в основном нормально для чтения); запись будет отправлена ​​на хранилище копирования при записи (COW). Во-первых, вам нужно достаточно большое блочное устройство для хранилища COW. Я создал для него новый логический том ( Watt-sdj1_dmsnap). Любое блочное устройство должно работать — даже петлевое устройство должно подойти. Я лично предлагаю постоянное, просто на случай, если что-то пойдет не так, но если вы живете опасно и у вас достаточно оперативной памяти, подойдет RAM-диск.

Мой потребовал бы ~1,7 ГБ пространства COW (чтобы переместить 2,24 ТиБ с диска на 3 ТБ). Я бы рекомендовал быть щедрым с пространством COW; если оно закончится, это, вероятно, будет плохо, и вы сможете освободить его все, как только закончите.

Далее вам нужно размонтировать файловую систему btrfs, если она была смонтирована, и заблокировать (остановить) устройство dm-crypt. Я помещаю снимок ниже шифрования, потому что не хочу, чтобы незашифрованные данные записывались на диск.

В моем случае раздел — /dev/sdj1. Во-первых, чтобы избежать ошибок, установите его только для чтения:

blockdev --setro /dev/sdj1
blockdev --setro /dev/sdj

(Позже вы сможете вернуть его обратно с помощью --setrw). Теперь, собственно, настройте снимок:

dmsetup create sdj_divert --table "0 $(blockdev --getsz /dev/sdj1) snapshot /dev/sdj1 /dev/mapper/Watt-sdj1_dmsnap PO 8"

Чтобы быстро объяснить, что это значит, таблица сопоставления устройств имеет следующий формат:старт-сектор количество-секторов целевой тип целевые аргументы. Начальный сектор — 0; количество секторов равно размеру sdj1 (мы же хотим сделать все целиком); целевой тип — снимок. Цель снимка принимает несколько аргументов:источник-dev корова-дев режим размер куска. Мы даем исходное устройство /dev/sdj1; устройство COW — это тот логический том, который я создал; режим PO означаетпустойчивый (метаданные записываются на диск, поэтому их можно восстановить после перезагрузки) иоverflow (если мы запишем слишком много в снимок, восстановление возможно). Размер фрагмента определяет, насколько детализирован снимок; если мы запишем хотя бы один байт, весь фрагмент вокруг этого байта будет скопирован (и займет место в снимке). 8 — это 4 КБ, поэтому проблем с выравниванием не возникнет.

Теперь, наконец, снова разблокируйте устройство — но вместо разблокировки /dev/sdj1, разблокируйте /dev/mapper/sdj_divert. Затем продолжайте и снова монтируйте файловую систему btrfs.

Вы можете проверить использование снимка с помощью dmsetup status sdj_divert; это должно дать что-то вроде (но с гораздо меньшим числом перед косой чертой):

0 5860524928 snapshot 914216/545259520 3568

Первые три вещи — это начальный сектор, количество секторов и тип цели. Следующее число — это количество используемых секторов (до косой черты), а затем общее количество секторов (после косой черты). Так что это часть используемого пространства. Последнее число — это количество секторов, используемых для метаданных, которые уже включены в используемое количество.

Теперь, наконец, вы можете использовать эту простую btrfs replace startкоманду в верхней части ответа. Это вернет немедленно; следите за статусом, запустив btrfs replace status /mount/path.

Когда замена будет завершена, убедитесь, что плохое устройство было удалено из файловой системы (например, btrfs fi show /mount/path), а затем вы можете заблокировать/закрыть неисправный диск и удалить снимок ( dmsetup remove sdj_divert). Затем вы можете освободить пространство COW (после его очистки, если вы параноик).

Есть один последний, технически необязательный шаг: мое заменяющее устройство больше, но btrfs пока не использует дополнительное пространство. Чтобы сделать его доступным для btrfs, найдите devid в выводе btrfs fi show, а затем запустите

btrfs fi resize DEVID:max /mount/path

это должно произойти практически мгновенно.

Связанный контент