
У меня двухдисковая файловая система 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
это должно произойти практически мгновенно.