Назад | Перейти на главную страницу

Файловая система BTRFS на нескольких устройствах с дисками разного размера

У меня есть существующая файловая система BTRFS, состоящая из одного диска емкостью 500 ГБ, и я только что купил диск на 2 ТБ, чтобы увеличить емкость моего домашнего сервера, и я хочу добавить новый диск к существующей файловой системе. Из того, что я читал, похоже, что никакая установка BTRFS не может обрабатывать диски разных размеров, не теряя разницы в размерах между большим и меньшим дисками, но я новичок в BTRFS, и, возможно, я что-то пропустил, так что есть установка что может позволить мне объединить два диска в файловую систему без потери места?

Это зависит от того, какой профиль вы используете для блоков данных файловой системы Btrfs с несколькими устройствами.

  • Когда вы используете RAID0 (по умолчанию для блоков данных), каждый диск может быть заполнен только до емкости самого маленького диска в массиве.

  • Когда вы используете «одиночный» профиль для блоков данных, каждый диск будет заполнен до полной емкости. например mkfs.btrfs -d single /dev/sda /dev/sdb

У меня есть файловый сервер с диском 2 ТБ и 3 ТБ. Он загружает Ubuntu 12.10 с USB-накопителя. Сначала я создал файловую систему Btrfs без -d single вариант:

mkfs.btrfs /dev/sda /dev/sdb

В результате я мог хранить только около 4 ТБ (3,45 двоичных данных файла).

# btrfs fi show
Label: none  uuid: 3a63a407-dd3c-46b6-8902-ede4b2b79465
 Total devices 2 FS bytes used 3.22TB
 devid    2 size 2.73TB used 1.82TB path /dev/sdb
 devid    1 size 1.82TB used 1.82TB path /dev/sda
# btrfs fi df /mnt/btrfs1/
Data, RAID0: total=3.45TB, used=3.22TB
Data: total=8.00MB, used=0.00
System, RAID1: total=8.00MB, used=264.00KB
System: total=4.00MB, used=0.00
Metadata, RAID1: total=94.00GB, used=4.29GB
Metadata: total=8.00MB, used=0.00
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb        4.6T  3.3T  241G  94% /mnt/btrfs1

Обратите внимание used 1.82TB для диска 3 ТБ.

Затем я использовал команду «balance» для преобразования блоков данных из RAID0 в «одиночный» профиль:

btrfs balance start -dconvert=single /mnt/btrfs1

На балансировку данных размером 4 ТБ ушло очень много времени (около 30 часов). Но после его завершения я мог использовать все 5 ТБ (данные файла в двоичном формате 4,36 ТБ).

# btrfs fi show
Label: none  uuid: 3a63a407-dd3c-46b6-8902-ede4b2b79465
 Total devices 2 FS bytes used 4.34TB
 devid    2 size 2.73TB used 2.73TB path /dev/sdb
 devid    1 size 1.82TB used 1.82TB path /dev/sda
# btrfs fi df /mnt/btrfs1/
Data: total=4.36TB, used=4.34TB
System, RAID1: total=40.00MB, used=500.00KB
System: total=4.00MB, used=0.00
Metadata, RAID1: total=94.00GB, used=4.01GB
Metadata: total=8.00MB, used=0.00
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb        4.6T  4.4T   27G 100% /mnt/btrfs1

Btrfs может использовать разные уровни рейда для данных и метаданных:

по умолчанию (даже для одного диска) raid1 для метаданных (каталогов и т. д.) и raid0 для данных.

Если вы не меняли это, то, вероятно, у вас не будет проблем с добавлением второго диска и выполнением перебалансировки. потому что на оба диска будут скопированы только метаданные (вы можете увидеть размер метаданных с помощью btrfs filesystem df /). Просто имейте в виду, что если один из ваших дисков выйдет из строя, вы потеряете данные.

поскольку диск емкостью 2 ТБ намного больше, чем 500 г, возможно, у вас будет больше шансов, если вы добавите новый, а затем удалите старый (вероятность отказа одного конкретного диска намного меньше, чем вероятность любого из дисков не работает).

если вы планируете создать массив raid позже (с дисками большего размера), вы можете воссоздать файловую систему на новом диске с raid1 как для данных, так и для метаданных, а затем скопировать все заново. потом, когда у вас будет больше денег, купите второй диск емкостью 2 ТБ.

ps: использование raid1 на одиночном диске означает, что данные будут храниться в двух местах на этом одном диске (для защиты от повреждения) и уменьшит пространство для хранения (это действительно хорошая идея для метаданных).

pss: серьезно, не поддавайтесь соблазну не использовать raid1 для метаданных. psss: очень высока вероятность, что btrfs получит возможность динамически изменять уровни рейда.

Я использовал несколько устройств с btrfs в Ubuntu, и он работал нормально. Имейте в виду, что btrfs фактически не поддерживает стандартные уровни RAID. Он реализует дополнительное чередование и зеркалирование, но не настоящий RAID.

В btrfs можно комбинировать диски разного размера.
Но в настоящее время btrfs не очень хорошо обрабатывает ENOSPC (на устройстве не осталось места).

Например. Я установил 3 диска в массив RAID0 (чередующийся). 1x500 ГБ, 1x250 ГБ, 1x160 ГБ.
Вы можете предположить, что у вас будет место на диске от 800 до 900 ГБ.

Это то, что df -h показывает:
/ dev / sdf 848G 615G 234G 73% / media / btrfs

Но я не могу больше хранить данные в массиве. (Нет места)

btrfs filesystem df /media/btrfs показывает мне это:
Данные: всего = 612,51 ГБ, использовано = 612,51 ГБ
Метаданные: всего = 1,62 ГБ, использовано = 990,73 МБ
Система: всего = 12,00 МБ, использовано = 48,00 КБ

Даже ребалансировка не помогла.

В списке рассылки я увидел такой расчет:
размер наименьшего диска * количество дисков в массиве
(хотя у меня есть немного места: 612 ГБ вместо 160 * 3 = 480 ГБ)

Таким образом, на текущем этапе разработки есть вероятность, что вы не сможете использовать все имеющееся у вас пространство, даже если btrfs поддерживает разные размеры в одном массиве.

Я использую Ubuntu 10.10 с общим ядром 2.6.35-22.

обновление: ответ ниже был написан до выпуска Linux 3.0. Linux 3.0 включает патч квази-циклического перебора.

Когда вы выполняете зеркальное отображение или чередование данных, второй зеркальный или чередующийся фрагмент необходимо разместить на другом устройстве со свободным пространством. BTRFS распределяет блоки по устройствам в циклическом режиме, что может привести к потере места, если у вас есть устройства разных размеров.

Eсть квази-круговой патч в разработке, чтобы улучшить это. Конечно, по-прежнему невозможно объединить все блоки на разных устройствах, если у вас есть диск емкостью 500 ГБ и 2 ТБ. Патч больше предназначен для таких ситуаций, как 1 x 1 ТБ + 2 x 500 ГБ, где каждый маленький диск должен предпочитать зеркальное отображение / разделение на большой диск, а не на другой маленький диск.

В вашей ситуации я бы просто использовал "одиночный" режим для ваших данных (mkfs.btrfs -d single). В этом режиме чанки не соединяются, поэтому я думаю, что проблем с устройствами разного размера не возникнет. Но я не тестировал.

Эта проблема применима только к настройкам btrfs-raid1 из Попался страница:

  • Распределение осуществляется по круговой схеме. Если у вас есть стратегия raid1 для тома, состоящего из несовпадающих дисков (томов разного размера), ваш меньший том может заполниться, а на единственном самом большом диске останется много свободного места. Вы можете убедиться, что это проблема если есть какие-либо расхождения между 'df' и 'btrfs filesystem df [mountpoint]' И если последняя команда также показывает, что «всего» и «использовано» в строке «Данные» совпадают. Ребалансировка может смягчить эту проблему. (2.6.33)
    • Если ваш том действительно заполняется таким образом, перебалансировка может быстро вызвать ошибку ENOSPC («Ошибка, на устройстве не осталось SPaCe»). Возможно, вам придется удалить относительно большой файл, чтобы разрешить этот тупик, тогда перебалансировка будет успешной. (2.6.33)
    • Повторная балансировка может вызвать очень интенсивную загрузку ЦП в течение продолжительных периодов времени. (2.6.34 и 2.6.35)