btrfs Сравнение версий

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
wiki:btrfs [2020/01/25 01:10]
Отключать компрессию не нужно, так как она и так не работает при установленом +C
wiki:btrfs [2021/06/04 11:08] (текущий)
[swap файл на btrfs]
Строка 20: Строка 20:
   * [[https://​help.ubuntu.ru/​wiki/​btrfs#​cow_-_copy_on_write|Copy-on-write]] (COW) журналирование.   * [[https://​help.ubuntu.ru/​wiki/​btrfs#​cow_-_copy_on_write|Copy-on-write]] (COW) журналирование.
   * [[https://​help.ubuntu.ru/​wiki/​btrfs#​%D0%BA%D0%B2%D0%BE%D1%82%D1%8B|Лимиты]] (отдельно для каждого подтома или группы подтомов,​ по фактически занимаемому месту или по "​официальному"​)   * [[https://​help.ubuntu.ru/​wiki/​btrfs#​%D0%BA%D0%B2%D0%BE%D1%82%D1%8B|Лимиты]] (отдельно для каждого подтома или группы подтомов,​ по фактически занимаемому месту или по "​официальному"​)
-  * Контроль целостности блоков данных и метаданных с помощью контрольных сумм.+  * Контроль целостности блоков данных и метаданных с помощью ​ ​[[https://​help.ubuntu.ru/​wiki/​btrfs#​%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B|контрольных сумм]]. Можно выбрать один из 4 алгоритмов.
   * Зеркалирование метаданных даже в однодисковой конфигурации (отключается на ssd).   * Зеркалирование метаданных даже в однодисковой конфигурации (отключается на ssd).
   * Поддержка [[https://​ru.wikipedia.org/​wiki/​Разрежённый_файл|разреженных файлов]]. ​   * Поддержка [[https://​ru.wikipedia.org/​wiki/​Разрежённый_файл|разреженных файлов]]. ​
Строка 26: Строка 26:
   * Поддержка ACL.   * Поддержка ACL.
   * Защита от потери данных.   * Защита от потери данных.
-  * Выбор хэш-алгоритма (в планах,​ сейчас используется CRC-32 и изменить это нельзя). 
   * Поддержка NFS (пока не полная).   * Поддержка NFS (пока не полная).
   * Флаги совместимости,​ необходимые для изменения дискового формата в новых версиях btrfs с сохранением совместимости со старыми.   * Флаги совместимости,​ необходимые для изменения дискового формата в новых версиях btrfs с сохранением совместимости со старыми.
Строка 92: Строка 91:
  
 Вот мы и получили в /mnt площадку для экспериментов с btrfs. Можно приступать к изучению возможностей этой файловой системы. Вот мы и получили в /mnt площадку для экспериментов с btrfs. Можно приступать к изучению возможностей этой файловой системы.
-====== Возможности btrfs ======сле окончания записи.+ 
 +======Возможности btrfs======
 <note important>​Авторы статьи рекомендуют сначала ознакомится с возможностями btrfs, а уже после этого (со знанием дела) подходить к вопросам по установке системы на btrfs или по использованию btrfs как хранилища данных.</​note>​ <note important>​Авторы статьи рекомендуют сначала ознакомится с возможностями btrfs, а уже после этого (со знанием дела) подходить к вопросам по установке системы на btrfs или по использованию btrfs как хранилища данных.</​note>​
  
Строка 134: Строка 134:
 Удаляется подтом командой ​ Удаляется подтом командой ​
   btrfs subvolume delete {путь по которому смонтирована btrfs}/​{путь и имя удаляемого подтома}   btrfs subvolume delete {путь по которому смонтирована btrfs}/​{путь и имя удаляемого подтома}
 +  ​
 +В последнних версиях btrfs удалить подтом можно также командой rm -r или rmdir. ​  
 +С точки зрения файловой системы подтом и каталог различаются только методом создания (ранее различались еще удалением). Во всем остальном подтома не отличаются от каталогов.
 +Переименовывается подтом обычной командой mv.
  
-С точки зрения файловой системы подтом и каталог различаются только методами создания и удаления. Во всем остальном подтома не отличаются от каталогов. +<note tip>​Несмотря на то, что подтом и каталог не различимы с точки зрения пользователя (если не считать команды создания),​ для администратора подтом дает значительно больше возможностей,​ чем каталог. Ведь подтом,​ по сути, - независимая файловая система,​ в которой можно настроить отличные параметры от родительского подтома,​ а также можно установить квоты или делать снимки (т.е. быстрые резервные копии).</​note>​
-К примеру,​ переименовать подтом можно просто командой mv. +
- +
-<note tip>​Несмотря на то, что подтом и каталог не различимы с точки зрения пользователя (если не считать команд создания и удаления), для администратора подтом дает значительно больше возможностей,​ чем каталог. Ведь подтом,​ по сути, - независимая файловая система,​ в которой можно настроить отличные параметры от родительского подтома,​ а также можно установить квоты или делать снимки (т.е. быстрые резервные копии).</​note>​+
  
  
Строка 405: Строка 406:
 <note important>​Как [[http://​forum.ubuntu.ru/​index.php?​topic=269699.msg2221269#​msg2221269|показали эксперименты]] btrfs пока не очень приспособлена для хранения образов виртуальных машин. Так же плохо дело обстоит с torrent клиентами ((даже включенное предварительное резервирование не позволяет избежать ужасающей фрагментации)). Если основная функция файловой системы - именно хранение образов дисков виртуальных машин или место для скачивания торентов,​ то лучше воспользоваться XFS или хотя-бы отключить COW на соответствующих каталогах.</​note>​ <note important>​Как [[http://​forum.ubuntu.ru/​index.php?​topic=269699.msg2221269#​msg2221269|показали эксперименты]] btrfs пока не очень приспособлена для хранения образов виртуальных машин. Так же плохо дело обстоит с torrent клиентами ((даже включенное предварительное резервирование не позволяет избежать ужасающей фрагментации)). Если основная функция файловой системы - именно хранение образов дисков виртуальных машин или место для скачивания торентов,​ то лучше воспользоваться XFS или хотя-бы отключить COW на соответствующих каталогах.</​note>​
 ===== Сжатие/​упаковка данных ===== ===== Сжатие/​упаковка данных =====
-btrfs поддерживает автоматическую упаковку данных при записи и распаковку при чтении. Поддерживаются два (в перспективе ожидается триалгоритма сжатия:​+btrfs поддерживает автоматическую упаковку данных при записи и распаковку при чтении. Поддерживаются три алгоритма сжатия:​
   * [[https://​ru.wikipedia.org/​wiki/​Zlib|zlib]] - достаточно эффективное сжатие в 2,7-3 раза, но довольно медленные и упаковка/​распаковка   * [[https://​ru.wikipedia.org/​wiki/​Zlib|zlib]] - достаточно эффективное сжатие в 2,7-3 раза, но довольно медленные и упаковка/​распаковка
   * [[https://​ru.wikipedia.org/​wiki/​LZO|lzo]] - быстрая упаковка/​распаковка,​ но не слишком эффективное сжатие примерно - в 2 раза или меньше   * [[https://​ru.wikipedia.org/​wiki/​LZO|lzo]] - быстрая упаковка/​распаковка,​ но не слишком эффективное сжатие примерно - в 2 раза или меньше
Строка 437: Строка 438:
  
 <note tip>​Существующие файлы которые не перезаписываются никак не меняют свое состояние сжатия,​ несмотря ни на опции монтирования,​ ни на свойства которые на них устанавливают. Если нужно упаковать всю ФС, то нужно воспользоваться дефрагментацией с ключом -c. <note tip>​Существующие файлы которые не перезаписываются никак не меняют свое состояние сжатия,​ несмотря ни на опции монтирования,​ ни на свойства которые на них устанавливают. Если нужно упаковать всю ФС, то нужно воспользоваться дефрагментацией с ключом -c.
-  btrfs filesystem ​defrag -r -c lzo {путь куда смонтирован подтом btrfs} ​   # упаковка всех файлов на ФС+  btrfs fi defrag -rc {путь куда смонтирован подтом btrfs} ​   # упаковка всех файлов на ФС
 Распаковка файлов с помощью команды defrag на данный момент невозможна. ​   Распаковка файлов с помощью команды defrag на данный момент невозможна. ​  
 </​note>​ </​note>​
 +каталога compression
 Свойство файла/​каталога compression это аналог атрибута '​с'​ (из числа расширенных атрибутов файлов,​ управлять которыми можно через chattr/​lsattr).  ​ Свойство файла/​каталога compression это аналог атрибута '​с'​ (из числа расширенных атрибутов файлов,​ управлять которыми можно через chattr/​lsattr).  ​
-  chattr -R -c *   # снимает свойство compression со всех файлов рекурсивно,​ начиная с текущего каталога.+  chattr -R -c *   # сникаталога compressionмает свойство compression со всех файлов рекурсивно,​ начиная с текущего каталога.
 А вот установка свойства compression через расширенный атрибут '​c'​ позволяет установить только компрессию по умолчанию (zlib). Если хотите установить другой тип компрессии,​ то пользуйтесь командой **btrfs property set <​файл>​ compression "<​тип сжатия>"​**. А вот установка свойства compression через расширенный атрибут '​c'​ позволяет установить только компрессию по умолчанию (zlib). Если хотите установить другой тип компрессии,​ то пользуйтесь командой **btrfs property set <​файл>​ compression "<​тип сжатия>"​**.
   ​   ​
-<​note>​Нужно понимать - сжатие файлов может производиться по частям. Когда в часть сжатого файла записываются данные - они на ходу упаковываются. И размер упакованной старой части файла как правило не соответствует размеру упакованных новых данных. С применением технологи copy-on-write это не становится проблемой. Но если COW отключить для файла - то его частичная упаковка становится ​невозможной - перезапись в середине файла потребует перезаписи всей оставшейся ​части за измененной, что скажется ​драматически на производительности. Поэтому разработчики btrfs решили просто - если COW отключен,​ то такой файл не будет упаковываться ни при каких условиях.</​note>​+<​note>​Нужно понимать - сжатие файлов может производиться по частям. Когда в часть сжатого файла записываются данные - они на ходу упаковываются. И размер упакованной старой части файла как правило не соответствует размеру упакованных новых данных. С применением технологи copy-on-write это не становится проблемой. Но если COW отключить для файла - то его частичная упаковка становится проблематичной ​и это  драматически ​сказывается ​на производительности. Поэтому разработчики btrfs решили просто - если COW отключен,​ то такой файл не будет упаковываться ни при каких условиях.</​note>​
 =====Информация о файловой системе===== =====Информация о файловой системе=====
 Системная утилита df не может корректно показать данные об использованном пространстве на btrfs. Собственно,​ особенности хранения данных в btrfs (совместное использование данных в подтомах и снимках,​ а также дедупликация данных) вообще делают невозможным однозначно определить,​ какое место на диске занимают данные того или иного отдельно взятого подтома/​снимка.\\ Системная утилита df не может корректно показать данные об использованном пространстве на btrfs. Собственно,​ особенности хранения данных в btrfs (совместное использование данных в подтомах и снимках,​ а также дедупликация данных) вообще делают невозможным однозначно определить,​ какое место на диске занимают данные того или иного отдельно взятого подтома/​снимка.\\
Строка 568: Строка 569:
 ===== Контрольные суммы ===== ===== Контрольные суммы =====
 btrfs использует для контроля целостности данных контрольные суммы. Они в частности позволяют восстанавливать целостность данных на RAID массивах в случае,​ когда с одним из устройств временно пропадает связь (и при этом массив продолжает использоваться дальше в режиме degraded). btrfs использует для контроля целостности данных контрольные суммы. Они в частности позволяют восстанавливать целостность данных на RAID массивах в случае,​ когда с одним из устройств временно пропадает связь (и при этом массив продолжает использоваться дальше в режиме degraded).
 +
 +Поддерживаются алгоритм CRC32C по умолчанию и 3 дополнительных алгоритма (с версии ядра 5.5).
 +
 +CRC32C (32-бит) - По умолчанию,​ лучший в плане совместимости,​ очень быстрый (современные процессоры поддерживают его на уровне инструкций),​ не устойчивый к коллизиям,​ но вполне приличный уровень определения ошибок.
 +
 +XXHASH (64-бит) - хорошая замена CRC32C, очень быстрый (оптимизирован для использования инструкций современных процессоров),​ хорошая устойчивость к коллизиям и хороший уровень определения ошибок.
 +
 +SHA256 (256-бит) - криптографически устойчивый хэш, довольно медленный,​ но может быть ускорен аппаратными ускорителями,​ сертифицирован FIPS и довольно широко используется.
 +
 +BLAKE2b (256-бит) - криптографически устойчивый хэш, довольно быстрый при использовании SIMD расширений команд процессоров,​ не стандартизован,​ но основан на BLAKE - одном из финалистов конкурса SHA3, широко используется,​ алгоритм - часть BLAKE2b-256,​ который оптимизирован для 64-битных платформ.
 +
 +Размер хэша влияет на размер части блока данных хранящего контрольную сумму. Блок метаданных имеет фиксированный объем до 256 бит (32 байта),​ таким образом тут не возникает увеличения. Каждый блок данных имеет индивидуальную контрольную сумму, сохраняющуюся вместе с данными для организации b-tree листа.
 +
 +Сравнительные производительности алгоритмов,​ в сравнении с CRC32C на платформе Intel 3.5GHz:
 +
 +    Digest ​ Cycles/4KiB Ratio 
 +    CRC32C ​     1700     1.00
 +    XXHASH ​     2500     1.44
 +    SHA256 ​   105000 ​      61
 +    BLAKE2b ​   22000       13
 +
 Проверка/​пересчет контрольных сумм - длительная и потому фоновая операция (если не указать явно выполнять интерактивно). Поэтому отдельно можно запустить пересчёт (команда start), остановить (cancel) ​ и посмотреть статус (status). Пример команды запуска:​ Проверка/​пересчет контрольных сумм - длительная и потому фоновая операция (если не указать явно выполнять интерактивно). Поэтому отдельно можно запустить пересчёт (команда start), остановить (cancel) ​ и посмотреть статус (status). Пример команды запуска:​
   btrfs scrub start -Bd /home   btrfs scrub start -Bd /home
Строка 840: Строка 862:
 В состав GRUB входят драйвера btrfs. Однако это очень урезанный драйвер и он не поддерживает запись. А отсутствие записи не позволяет GRUB-у записать служебную переменную recordfail. GRUB проверяет значение этой переменной и если она не сброшена,​ то обязательно показывается меню загрузки. Каждый раз когда GRUB начинает загружать ОС он устанавливает эту переменную в 1, а сбрасывает ее скрипт который запускается после загрузки системы. В состав GRUB входят драйвера btrfs. Однако это очень урезанный драйвер и он не поддерживает запись. А отсутствие записи не позволяет GRUB-у записать служебную переменную recordfail. GRUB проверяет значение этой переменной и если она не сброшена,​ то обязательно показывается меню загрузки. Каждый раз когда GRUB начинает загружать ОС он устанавливает эту переменную в 1, а сбрасывает ее скрипт который запускается после загрузки системы.
  
-Т.к. сохранить значение recordfail GRUB на btrfs не может, то он считает,​ что каждая загрузка происходит после фейла прошлой загрузки (т.е. recordfail=1). И в таком случае меню загрузки показывается 10 секунд. Изменить этот тайм-аут можно изменив в /​etc/​default/​grub значение переменной GRUB_RECORDFAIL_TIMEOUT. После задания разумного таймаута в /​etc/​default/​grub нужно запустить update-grub с правами root-а чтобы пересоздать скрипты загрузки GRUB-а. ​   ​+Т.к. сохранить значение recordfail GRUB на btrfs не может, то он считает,​ что каждая загрузка происходит после фейла прошлой загрузки (т.е. recordfail=1). И в таком случае меню загрузки показывается 10 или даже 30 секунд. Изменить этот тайм-аут можно изменив в /​etc/​default/​grub значение переменной ​**GRUB_RECORDFAIL_TIMEOUT**. После задания разумного таймаута в /​etc/​default/​grub нужно запустить update-grub с правами root-а чтобы пересоздать скрипты загрузки GRUB-а. ​   ​
   ​   ​
 =====swap файл на btrfs===== =====swap файл на btrfs=====
-Начиная с версии ядра 5.0+ на btrfs можно создать swap-файл,​ но с некоторыми ограничениями:​ swap-файл должен располагаться целиком на одном устройстве,​ создаваться обязательно с отключенным COW и сжатием((На ​самом делеесли вчитаться в детали на btfs-wiki, ​то отключение COW блокирует возможность архивирования)). Кроме того swap-файл не может попасть в снимок. В перспективе предполагается снять часть ограничений.\\+<note important>​Наличие работающего swap-файла на подтоме не дает возможности делать снимки с этого подтома. Поэтому для использования снимков необходимо размещать swap-файл на отдельном подтоме. Например создать @swap подтом и монтировать его в /​swap.</​note>​ 
 + 
 +Начиная с версии ядра 5.0+ на btrfs можно создать swap-файл,​ но с некоторыми ограничениями:​ swap-файл должен располагаться целиком на одном устройстве ​((его нельзя будет создать на любом типе хранения кроме single)), создаваться обязательно с отключенным COW и сжатием((На ​btfs-wiki указано, что отключение COW блокирует возможность архивирования)). Кроме того swap-файл не может попасть в снимок((Если swap-файл смонтирован то невозможно сделать снимок с под-тома где он расположен,​ отключенный swap-файл дает сделать снимок вместе со swap-файлом,​ но больше такой swap-файл не подключить)). В перспективе предполагается снять часть ограничений.\\ 
 + 
 +С учетом озвученного,​ пока не сняты ограничения,​ swap-файл стоит создавать в отдельном (специально для него созданном под-томе).
  
 Предположим что у нас btrfs на одном устройстве и у нас подходящая версия ядра 5.0+, дальше все довольно просто:​ Предположим что у нас btrfs на одном устройстве и у нас подходящая версия ядра 5.0+, дальше все довольно просто:​
  
-  touch /swap                               ​# создаем пустой файл /swap - COW можно отключить только на пустом файле ​   +  ​btrfs su cr /swap                        # создаем отдельный под-том 
-  chmod go-r /swap                          # swap должен иметь права 600, а touch проставляет права 644 +  ​touch /swap/swap                          ​# создаем пустой файл /swap - COW можно отключить только на пустом файле ​   
-  chattr +C /swap                           ​# отключаем COW +  chmod go-r /swap/swap                     # swap должен иметь права 600, а touch проставляет права 644 
-  fallocate /swap -l4g                      # выделяем место под файл 4Gib +  chattr +C /swap/swap                      ​# отключаем COW (сжатие тоже отключается при отключении COW) 
-  mkswap /swap                              # создаем внутреннюю разметку в файле для swap-а  +  fallocate ​/swap/swap -l4g                 ​# выделяем место под файл 4Gib 
-  swapon /swap                              # подключаем swap+  mkswap /swap/swap                        ​# создаем внутреннюю разметку в файле для swap-а  
 +  swapon /swap/swap                        ​# подключаем swap
  
 <note important>​Важно выделять место под swap-файл именно командой fallocate. Если создать пустой файл командой truncate, то он фактически останется пустым т.к. в btrfs используется механика [[https://​ru.wikipedia.org/​wiki/​Разрежённый_файл|sparse files]] и mkswap отработает успешно,​ но swapon сообщит,​ что в файле есть "​дырки",​ т.е. не размеченные на диск области файла.</​note>​ <note important>​Важно выделять место под swap-файл именно командой fallocate. Если создать пустой файл командой truncate, то он фактически останется пустым т.к. в btrfs используется механика [[https://​ru.wikipedia.org/​wiki/​Разрежённый_файл|sparse files]] и mkswap отработает успешно,​ но swapon сообщит,​ что в файле есть "​дырки",​ т.е. не размеченные на диск области файла.</​note>​
Строка 858: Строка 885:
 Для автоматического монтирования файла в последующем нужно в /etc/fstab добавить следующую строку:​ Для автоматического монтирования файла в последующем нужно в /etc/fstab добавить следующую строку:​
  
-  /swap none swap swap 0 0+  /swap/swap none swap sw 0 0
  
 До версии 5.0 использование swap-файла на btrfs могло привести [[http://​forum.ubuntu.ru/​index.php?​topic=207432.msg2167728#​msg2167728|к разрушению структуры файловой системы]] (отключение COW и компрессии не помогало избежать проблем) и поэтому драйвер не дает активировать своп в swap-файле созданном на btrfs. Можно было создать не очень быстрый и с дополнительными расходами оперативной памяти((что в ситуации с переполнением памяти может привести к не совсем предсказуемым последствиям)) swap-файл через loop-устройство. Давайте рассмотрим пример создания своп-файла этим методом. До версии 5.0 использование swap-файла на btrfs могло привести [[http://​forum.ubuntu.ru/​index.php?​topic=207432.msg2167728#​msg2167728|к разрушению структуры файловой системы]] (отключение COW и компрессии не помогало избежать проблем) и поэтому драйвер не дает активировать своп в swap-файле созданном на btrfs. Можно было создать не очень быстрый и с дополнительными расходами оперативной памяти((что в ситуации с переполнением памяти может привести к не совсем предсказуемым последствиям)) swap-файл через loop-устройство. Давайте рассмотрим пример создания своп-файла этим методом.
  
-Несмотря на то, что отключение COW не помогает,​ но для избежания фрагментации swap-файла на HDD (на SSD это не так критично) стоит все-таки отключить COW. Компрессию тоже стоит отключить т.к. это еще сильнее затормозит и без того не быстрое решение.+Несмотря на то, что отключение COW не помогает,​ но для избежания фрагментации swap-файла на HDD (на SSD это не так критично) стоит все-таки отключить COW. Компрессию тоже стоит отключать т.к. это еще сильнее затормозит и без того не быстрое решение.
  
   touch /swap                # создаем пустой файл /swap - COW можно отключить только на пустом файле   touch /swap                # создаем пустой файл /swap - COW можно отключить только на пустом файле
   chmod go-r /swap           # swap должен иметь права 600, а touch проставляет права 644   chmod go-r /swap           # swap должен иметь права 600, а touch проставляет права 644
-  chattr +C /swap            # отключаем COW+  chattr +C /swap            # отключаем COW (сжатие тоже отключается при отключении COW)
   fallocate swap -l4g        # выделяем место под файл размером 4Gib   fallocate swap -l4g        # выделяем место под файл размером 4Gib
   swapfile=$(losetup -f)     # находим первое свободное loop-устройство ​   swapfile=$(losetup -f)     # находим первое свободное loop-устройство ​
Строка 1002: Строка 1029:
  
 [[https://​btrfs.wiki.kernel.org/​index.php/​Main_Page|Официальная вики]]\\ [[https://​btrfs.wiki.kernel.org/​index.php/​Main_Page|Официальная вики]]\\
-[[https://​btrfs.wiki.kernel.org/​index.php/​Mount_options|Параметры монтирования агл.]]\\+[[https://​btrfs.wiki.kernel.org/​index.php/​Manpage/​btrfs(5)#​MOUNT_OPTIONS|Параметры монтирования агл.]]\\
 [[http://​help.ubuntu.ru/​wiki/​fstab#​btrfs|Перевод параметров]]\\ [[http://​help.ubuntu.ru/​wiki/​fstab#​btrfs|Перевод параметров]]\\
  
 {{tag>​btrfs ext2 ext3 ext4 compression lzo gzip fstab}} {{tag>​btrfs ext2 ext3 ext4 compression lzo gzip fstab}}