Вопрос или проблема
Аннотация
У меня есть массив BTrFS raid0 на основе нескольких LV LVM. Уменьшение устройств BTrFS работает, но LV не удается уменьшить, так как BTrFS сообщает о размере всего массива вместо выделенного пространства для каждого устройства, в результате чего LVM отказывается от уменьшения с сообщением вроде “Невозможно уменьшить LV до 512GiB, так как он содержит FS размером 1TiB” (хотя это 1TiB распределено по 2*512GiB устройствам BTrFS).
Уровень массива требуется на уровне BTrFS, так как мне нужно также добавить другой BTrFS RAID1 на те же диски, который должен находиться на уровне BTrFS, чтобы иметь возможность выразить свою аппаратную избыточность (суть raid1).
Настройка
У меня есть два диска. Каждый из них настроен как PV LVM, определяет свой собственный VG, состоящий только из одного PV и простого LV внутри. Эти два LV (по одному на каждом диске) используются для создания массива BTrFS raid0:
LVM
HDD0
pv0
vg0
lv0
HDD1
pv1
vg1
lv0
BTrFS
raid0
devid 1 lv0
devid 2 lv1
Каждый диск имеет объем 1TiB; LV настроены на 100% БЕСПЛАТНО, поэтому каждый также составляет 1TiB. Результирующий BTrFS raid0 составляет 2TiB.
Проблема
Если я уменьшаю файловую систему BTrFS на обоих устройствах до, скажем, 512GiB, моя результирующая FS составляет 1TiB. Мое (твердое) предположение заключается в том, что выделение блоков для каждого устройства уменьшается до 512GiB.
Однако попытка уменьшить соответствующий LV
lvreduce -L 512G vg0/lv0
приводит к следующей ошибке LVM:
Файловая система btrfs обнаружена на vg0/lv0.
Размер файловой системы (1.00 TiB) больше запрашиваемого размера (512 GiB).
Уменьшение файловой системы требуется и не поддерживается (btrfs).
Иными словами, BTrFS сообщает общий (raid0, сумма обоих устройств) размер файловой системы, когда LVM запрашивает размер одного конкретного устройства BTrFS для уменьшения базового LV.
Это ясно говорит о том, что BTrFS и LVM здесь совершенно не понимают друг друга. Существует ли обходной путь к этой проблеме или это делает невозможным уменьшение базовых LV массива BTrFS raid0 (пока используется более 1 участник в массиве)? Большое спасибо заранее.
Согласно комментариям: потому что вы используете RAID0 через BTrFS, вы не можете легко согласовать размеры обоих LV. Вы не можете перемещать блоки, так как они находятся в разных VG. Не уверен, что BTrFS может предоставить вам такую возможность тоже.
Для меня лучше всего создать резервную копию файлов, затем создать RAID0 через LVM (один VG, один LV) и затем создать файловую систему и восстановить файлы.
Как вы упоминаете, вы хотите использовать некоторые специфические параметры от BTrFS, поэтому вы можете создать эту файловую систему на двух разделах (на HDD0 и HDD1, с разделами, измененными на желаемый размер), а затем восстановить из резервной копии.
Как вы уже заметили, LVM не может решить эту проблему автоматически, так как он не может сопоставить структуру LV, о которой ему известно, с ID устройств btrfs, которые ему нужны для того, чтобы иметь возможность изменить размер правильного устройства btrfs.
Однако вы можете сделать это вручную. Это включает в себя переопределение проверок безопасности LVM перед изменением размера LV, поэтому убедитесь, что вы понимаете, что делаете, прежде чем рисковать уничтожением ваших данных!
-
Определите устройство btrfs, которое вам нужно изменить. Обычно я делаю это с помощью чего-то подобного:
$ sudo btrfs device usage <mount-path> /dev/dm-4, ID: 2 Размер устройства: 4.87TiB Свободное пространство: 0.00B Данные, RAID1: 1.60TiB Метаданные, RAID1C3: 3.00GiB Система, RAID1C3: 32.00MiB Неallocated: 3.27TiB /dev/mapper/pi-av2, ID: 3 Размер устройства: 4.75TiB Свободное пространство: 0.00B Данные, RAID1: 189.00GiB Метаданные, RAID1C3: 3.00GiB Система, RAID1C3: 32.00MiB Неallocated: 4.56TiB
Обратите внимание, что вывод непоследователен в том, использует ли он форму
/dev/dm-*
или форму/dev/mapper/*
для пути к устройству; вы можете запуститьls -l /dev/mapper/
, чтобы подтвердить, какие устройства какие. В любом случае, как только вы выясните, какое устройство хотите изменить, вам нужно записать номер ID рядом с ним. -
Измените размер устройства btrfs:
sudo btrfs filesystem resize <id>:<newsize> <mount-path>
<id>
— это номер ID, который вы записали на предыдущем шаге.<newsize>
— это новый размер, который вы хотите для раздела; вы также можете запросить уменьшение раздела на указанное количество, например, чтобы уменьшить/dev/dm-4
на 4GB, вы использовали быbtrfs filesystem resize 2:-4G <mount-path>
. -
Снова выполните
sudo btrfs device usage <mount-path>
и подтвердите, что строка “Свободное пространство” теперь имеет ожидаемое количество свободного места. -
Измените размер LV:
sudo lvresize --fs ignore -L <new-size> <lv>
Опять же, вы можете указать размер как абсолютный размер или относительный, например,
lvresize --fs ignore -L -4G pi/av1
.Не уменьшайте LV на более чем на количество свободного пространства, которое
btrfs
отчитал. Обычноlvresize
предотвратит это, но аргумент--fs ignore
говорит ему пропустить эту проверку безопасности. Уменьшение LV так, чтобы он стал меньше файловой системы, которую он содержит, очень вероятно приведет к потере ваших данных.
Ответ или решение
Уменьшение LVM LVs, используемых для массива Btrfs RAID0
Введение
При работе с файловой системой Btrfs в режиме RAID0, развернутой на нескольких логических томах (LV) LVM, может возникнуть сложная ситуация, связанная с уменьшением логических томов после изменения размера файловой системы. В данной статье мы рассмотрим, как успешно уменьшить LVM LV, использующиеся для массива Btrfs RAID0, и обсудим потенциальные проблемы и решения.
Описание проблемы
Как показано в вашем вопросе, у вас есть два диска, каждый из которых настроен как физический том (PV) LVM и содержит собственную группу томов (VG) с одним логическим томом (LV). Эти два LV используются для создания массива Btrfs в режиме RAID0, который объединяет пространство обоих томов.
Ситуация осложняется тем, что при уменьшении размерности Btrfs, система учитывает общий размер массива, а не индивидуальный размер каждого устройства. Таким образом, при попытке уменьшить размер LV с помощью команды lvreduce
, возникнет ошибка, так как LVM не может определить, что каждое устройство в массиве может быть уменьшено до нужного размера.
Решение проблемы
Для успешного уменьшения LVM LV, следует выполнить несколько ключевых шагов. Это потребует временного отключения некоторых стандартных проверок безопасности, поскольку Btrfs и LVM физически не "общаются" друг с другом о размерах.
Шаги для уменьшения LVM LV
-
Проверка использования Btrfs:
Для начала, получите информацию о текущем использовании пространства Btrfs с помощью команды:sudo btrfs device usage <mount-path>
Это позволит вам увидеть, сколько пространства занимает ваш массив Btrfs, а также размер каждого устройства (в данном случае ваш LV).
-
Изменение размера файловой системы Btrfs:
Уменьшите размер файловой системы до желаемого значения. Для этого выполните:sudo btrfs filesystem resize <id>:<newsize> <mount-path>
Где
<id>
– это номер идентификатора устройства, который вы получили на первом шаге, а<newsize>
– это новый размер, который вы хотите установить. -
Подтверждение изменений:
После изменения размера файловой системы выполните команду, чтобы проверить, правильно ли изменился размер устройства:sudo btrfs device usage <mount-path>
-
Уменьшение размера LV:
Используя опцию--fs ignore
, чтобы избежать стандартных проверок LVM, выполните команду:sudo lvresize --fs ignore -L <new-size> <lv>
Например:
sudo lvresize --fs ignore -L 512G vg0/lv0
Обратите внимание, что вы не должны уменьшать LV больше, чем на пространстве, которое осталась доступным в Btrfs.
-
Подтверждение состояния LV:
Проверьте состояние логического тома и способность файловой системы корректно взаимодействовать с изменениями.
Важные замечания
- Перед выполнением этих действий обязательно сделайте резервную копию всех данных. Операции по изменению размера могут привести к потере данных, если что-то пойдет не так.
- В случае фиксирования ошибок или сложностей, возможно, будет необходимо рассмотреть альтернативные варианты, такие как создание нового массива RAID0 с использованием LVM вместо Btrfs.
Заключение
Уменьшение LVM LVs, используемых для массива Btrfs RAID0, требует внимательного подхода и манипуляциями с командами, которые могут обойти стандартные проверки. Следуя вышеперечисленным шагам и рекомендациям, можно успешно выполнить данные операции. Обязательно учитывайте потенциальные риски и всегда поддерживайте актуальные резервные копии вашей информации.