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

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
wiki:btrfs [2019/07/06 12:42]
[Проверка сумм]
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/​Разрежённый_файл|разреженных файлов]]. ​
   * Полностью распределенное блокирование.   * Полностью распределенное блокирование.
   * Поддержка ACL.   * Поддержка ACL.
   * Защита от потери данных.   * Защита от потери данных.
-  * Выбор хэш-алгоритма (в планах,​ сейчас используется CRC-32 и изменить это нельзя). 
   * Поддержка NFS (пока не полная).   * Поддержка NFS (пока не полная).
   * Флаги совместимости,​ необходимые для изменения дискового формата в новых версиях btrfs с сохранением совместимости со старыми.   * Флаги совместимости,​ необходимые для изменения дискового формата в новых версиях btrfs с сохранением совместимости со старыми.
Строка 91: Строка 91:
  
 Вот мы и получили в /mnt площадку для экспериментов с btrfs. Можно приступать к изучению возможностей этой файловой системы. Вот мы и получили в /mnt площадку для экспериментов с btrfs. Можно приступать к изучению возможностей этой файловой системы.
-====== Возможности btrfs ======сле окончания записи.+ 
 +======Возможности btrfs======
 <note important>​Авторы статьи рекомендуют сначала ознакомится с возможностями btrfs, а уже после этого (со знанием дела) подходить к вопросам по установке системы на btrfs или по использованию btrfs как хранилища данных.</​note>​ <note important>​Авторы статьи рекомендуют сначала ознакомится с возможностями btrfs, а уже после этого (со знанием дела) подходить к вопросам по установке системы на btrfs или по использованию btrfs как хранилища данных.</​note>​
  
Строка 105: Строка 106:
   cp --reflink <​оригинальный файл>​ <​теневая копия>​   cp --reflink <​оригинальный файл>​ <​теневая копия>​
   ​   ​
-Оба файла после такой команды будут хранить свое содержимое в одном месте (почти как hard-link), но как только в оригинальный файл будут записаны новые данные - он изменится,​ а теневая копия - сохранит оригинальное содержимое. Фактически,​ такое копирование - это просто создание новой записи в каталоге файлов. Копирования данных не происходит. А значит даже очень большой файл копируется (а точнее клонируется) практически мгновенно. ​Но, с точки зрения использования,​ такая теневая копия файла ничем не отличается от обычной копии. ​+Оба файла после такой команды будут хранить свое содержимое в одном месте (почти как hard-link), но как только в оригинальный файл будут записаны новые данные - он изменится,​ а теневая копия - сохранит оригинальное содержимое. Фактически,​ такое копирование - это просто создание новой записи в каталоге файлов. Копирования данных не происходит. А значит даже очень большой файл копируется (а точнее клонируется) практически мгновенно. ​ 
  
-Используя рекурсивное копирование (cp -r) можно создавать мгновенные копии каталогов вместе со всеми их вложениями. И такое копирование тоже будет занимать очень мало времени независимо от объема ​банных хранящихся в копируемом/​клонируемом каталоге. Однако может так статься,​ что какие-то файлы нельзя скопировать клонированием,​ например на файле отключен COW или файл находится в другой ФС смонтированной где-то внутри копируемого каталога. Можно указать --reflink=auto - тогда все, что нельзя скопировать ​"​быстро" ​будет копироваться как обычно.  ​+Используя рекурсивное копирование (cp -r) можно создавать мгновенные копии каталогов вместе со всеми их вложениями. И такое копирование тоже будет занимать очень мало времени независимо от объема ​данныххранящихся в копируемом/​клонируемом каталоге. Однако может так статься,​ что какие-то файлы нельзя скопировать клонированием,​ например на файле отключен COW или файл находится в другой ФС смонтированной где-то внутри копируемого каталога. Можно указать --reflink=auto - тогда все, что нельзя скопировать ​клонированием ​будет копироваться как обычно.  ​
  
 Сделать теневую копию сразу целого [[https://​help.ubuntu.ru/​wiki/​btrfs#​%D0%BF%D0%BE%D0%B4%D1%82%D0%BE%D0%BC%D0%B0|подтома]] можно с использованием [[https://​help.ubuntu.ru/​wiki/​btrfs#​%D1%81%D0%BD%D0%B8%D0%BC%D0%BA%D0%B8|снимков]]). Сделать теневую копию сразу целого [[https://​help.ubuntu.ru/​wiki/​btrfs#​%D0%BF%D0%BE%D0%B4%D1%82%D0%BE%D0%BC%D0%B0|подтома]] можно с использованием [[https://​help.ubuntu.ru/​wiki/​btrfs#​%D1%81%D0%BD%D0%B8%D0%BC%D0%BA%D0%B8|снимков]]).
Строка 113: Строка 114:
 COW также позволяет "​размазать запись"​ по носителю,​ что полезно для SSD. Многократная перезапись файла будет на деле осуществляться каждый раз в новые блоки устройства. COW также позволяет "​размазать запись"​ по носителю,​ что полезно для SSD. Многократная перезапись файла будет на деле осуществляться каждый раз в новые блоки устройства.
  
-Однако,​ у COW есть и "​подводные камни"​. Если файл обновляется не целиком,​ а изменяется только часть в его середине,​ то эта середина уже однозначно будет хранится не в том же месте, где голова и хвост. Таки образом,​ такая запись разбивает файл как минимум на три фрагмента,​ раскиданных по разным блокам устройства. Т.е. файл стал фрагментированным,​ и если на ssd это не имеет особого значения,​ то на HDD высокая фрагментация файлов приводит к снижению производительности файловой системы. Об этом недостатке COW стоит не забывать. ​Но, если COW начинает мешать,​ то его можно ​и отключить ([[https://​help.ubuntu.ru/​wiki/​btrfs#​%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8|см раздел "​Настройки"​]]). ​И да, это приведет к тому, что содержимое файла не будет записываться каждый раз в новые блоки (запись будет производиться поверх старых данных),​ однако ​и быстрое журналирование данных ​вы теряете вместе с отключением COW.+Однако,​ у COW есть и "​подводные камни"​. Если файл обновляется не целиком,​ а изменяется только часть в его середине,​ то эта середина уже однозначно будет хранится не в том же месте, где голова и хвост. Таким образом,​ такая запись разбивает файл как минимум на три фрагмента,​ раскиданных по разным блокам устройства. Т.е. файл стал фрагментированным,​ и если на ssd это не имеет особого значения,​ то на HDD высокая фрагментация файлов приводит к снижению производительности файловой системы. Об этом недостатке COW стоит не забывать. ​ 
 + 
 +Если COW начинает мешать,​ то его можно отключить ([[https://​help.ubuntu.ru/​wiki/​btrfs#​%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8|см раздел "​Настройки"​]]). ​Это приведет к тому, что содержимое файла не будет записываться каждый раз в новые блоки (запись будет производиться поверх старых данных), ​т.о. вместе с отключением COW, вы теряете ​быстрое журналирование данных.
 ===== Подтома ===== ===== Подтома =====
 Внутри файловой системы btrfs можно создать несколько выделенных файловых систем - подтомов. Свободное пространство делится между всеми такими подтомами,​ а также могут совместно использоваться одинаковые данные (при выполнении копирования с опцией --reflink, дедубликации или при использовании снимков). При необходимости на подтома можно установить квоты (ограничить размер). Так же у подтомов могут быть настроены разные механизмы сжатия и некоторые другие свойства. Т.о. подтома btrfs - это вполне полноценная замена нескольким файловым системам,​ размещенным на отдельных разделах диска. ​ Внутри файловой системы btrfs можно создать несколько выделенных файловых систем - подтомов. Свободное пространство делится между всеми такими подтомами,​ а также могут совместно использоваться одинаковые данные (при выполнении копирования с опцией --reflink, дедубликации или при использовании снимков). При необходимости на подтома можно установить квоты (ограничить размер). Так же у подтомов могут быть настроены разные механизмы сжатия и некоторые другие свойства. Т.о. подтома btrfs - это вполне полноценная замена нескольким файловым системам,​ размещенным на отдельных разделах диска. ​
Строка 131: Строка 134:
 Удаляется подтом командой ​ Удаляется подтом командой ​
   btrfs subvolume delete {путь по которому смонтирована btrfs}/​{путь и имя удаляемого подтома}   btrfs subvolume delete {путь по которому смонтирована btrfs}/​{путь и имя удаляемого подтома}
 +  ​
 +В последнних версиях btrfs удалить подтом можно также командой rm -r или rmdir. ​  
 +С точки зрения файловой системы подтом и каталог различаются только методом создания (ранее различались еще удалением). Во всем остальном подтома не отличаются от каталогов.
 +Переименовывается подтом обычной командой mv.
  
-С точки зрения файловой системы подтом и каталог различаются только методами создания и удаления. Во всем остальном подтома не отличаются от каталогов. +<note tip>​Несмотря на то, что подтом и каталог не различимы с точки зрения пользователя (если не считать команды создания),​ для администратора подтом дает значительно больше возможностей,​ чем каталог. Ведь подтом,​ по сути, - независимая файловая система,​ в которой можно настроить отличные параметры от родительского подтома,​ а также можно установить квоты или делать снимки (т.е. быстрые резервные копии).</​note>​
-К примеру,​ переименовать подтом можно просто командой mv. +
- +
-<note tip>​Несмотря на то, что подтом и каталог не различимы с точки зрения пользователя (если не считать команд создания и удаления), для администратора подтом дает значительно больше возможностей,​ чем каталог. Ведь подтом,​ по сути, - независимая файловая система,​ в которой можно настроить отличные параметры от родительского подтома,​ а также можно установить квоты или делать снимки (т.е. быстрые резервные копии).</​note>​+
  
  
Строка 402: Строка 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 раза или меньше
Строка 428: Строка 432:
   * если возможно:​ если флаг COMPRESS установлен (chattr +c) на файле или унаследовал его от каталога при создании нового файла.   * если возможно:​ если флаг COMPRESS установлен (chattr +c) на файле или унаследовал его от каталога при создании нового файла.
   * если возможно:​ если файловая система смонтирована c **-o compress**   * если возможно:​ если файловая система смонтирована c **-o compress**
 +
 +Отдельно стоит уточнить,​ что означает "​если возможно":​ дело в том, что btrfs не станет упаковывать файл, если начав его упаковку обнаружит что выигрыша от упаковки нет. Так к примеру практически никогда не упаковываются JPEG-файлы - сам формат JPEG подразумевает достаточно эффективную упаковку данных внутри файла. Однако монтирование с **-o compress-force** будет заставлять упаковывать даже JPEG-файлы (скорее всего с 0-вым эффектом,​ но с затратами процессорного времени на упаковку\распаковку). ​
  
 Учтите что монтирование с опцией compress не устанавливает атрибут +c файла. ​ Учтите что монтирование с опцией compress не устанавливает атрибут +c файла. ​
  
-<note tip>​Существующие файлы которые не перезаписываются никак не меняют свое состояние сжатия,​ несмотря ни на опции монтирования,​ ни на свойства которые на них устанавливают. Если нужно упаковать всю ФС или наоборот распаковать все файлы, то нужно воспользоваться дефрагментацией с ключом -c. +<note tip>​Существующие файлы которые не перезаписываются никак не меняют свое состояние сжатия,​ несмотря ни на опции монтирования,​ ни на свойства которые на них устанавливают. Если нужно упаковать всю ФС, то нужно воспользоваться дефрагментацией с ключом -c. 
-  btrfs filesystem ​defrag -r -c lzo {путь куда смонтирован подтом btrfs} ​   # упаковка всех файлов на ФС +  btrfs fi defrag -rc {путь куда смонтирован подтом btrfs} ​   # упаковка всех файлов на ФС 
-  btrfs filesystem defrag -r -c ""​ {путь ​куда смонтирован подтом ​btrfs} ​    # распаковка всех файлов ФС+Распаковка файлов ​с помощью команды 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 (совместное использование данных в подтомах и снимках,​ а также дедупликация данных) вообще делают невозможным однозначно определить,​ какое место на диске занимают данные того или иного отдельно взятого подтома/​снимка.\\
Строка 563: Строка 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
Строка 597: Строка 624:
   btrfs balance start -dconvert=raid1,​soft -mconvert=raid1,​soft -sconvert=raid1,​soft --force /mnt   btrfs balance start -dconvert=raid1,​soft -mconvert=raid1,​soft -sconvert=raid1,​soft --force /mnt
  
 +Обо всех возможностях команды btrfs balance можно узнать в
 +  man btrfs-balance ​  
 =====Btrfs на нескольких устройствах===== =====Btrfs на нескольких устройствах=====
  
Строка 629: Строка 658:
  
 ====Режим DUP==== ====Режим DUP====
-DUP - это дублирование данных в файловой системе (обычно только для метаданных). С версии btrfs-progs 4.5 допустимо использовать DUP и для данных, только утилита предупредит, если избыточность метаданных меньше,​ чем данных (например,​ метаданные в single, a данные в dup).+DUP - это дублирование данных в файловой системе (обычно только для метаданных). С версии btrfs-progs 4.5 допустимо использовать DUP и для данных. Однако, если при ​конвертировании способа хранения (балансировка с фильтрамиизбыточность метаданных меньше,​ чем данных (например,​ метаданные в single, a данные в dup), то утилита будет ругаться. Обойти эту ругань утилиты можно опцией --force.
  
-Про DUP важно понимать,​ что он не отслеживает,​ где именно хранятся копии, т.е. если у вас файловая система работает на двух устройствах,​ то DUP не гарантирует,​ что копии будут храниться на разных устройствах. Поэтому сфера использования этого режима - дублирование метаданных в одно-дисковой конфигурации на обычных жестких дисках (на ssd метаданные - в режиме single для сокращения числа записей на носитель).+Про DUP важно понимать,​ что он не отслеживает,​ где именно хранятся копии, т.е. если у вас файловая система работает на двух устройствах,​ то DUP не гарантирует,​ что копии будут храниться на разных устройствах. Поэтому ​обычно ​сфера использования этого режима - дублирование метаданных в одно-дисковой конфигурации на обычных жестких дисках (на ssd метаданные - в режиме single для сокращения числа записей на носитель).
  
 ====Режимы RAID==== ====Режимы RAID====
-В btrfs встроена поддержка RAID 0, 1, 10, 5, 6. Поддержка ​RAID5/6 - пока считается экспериментальной. RAID0/1/10 работают ​достаточно ​стабильно.+В btrfs встроена поддержка RAID 0, 1, 10, 5, 6. В RAID5/6 - пока ​есть еще некоторые нерешенные проблемы ​и их не рекомендуется использовать в промышленной ​эксплуатации. RAID0/​1/​10 ​- серьезных проблем не имеют и работают стабильно.
  
 <note important>​В Ubuntu до 13.10 (да и в некоторых более поздних) в initramfs могут не встроиться утилиты btrfs-tools,​ поэтому система может не загрузится с RAID или не подхватывать диски автоматом.\\ <note important>​В Ubuntu до 13.10 (да и в некоторых более поздних) в initramfs могут не встроиться утилиты btrfs-tools,​ поэтому система может не загрузится с RAID или не подхватывать диски автоматом.\\
Строка 654: Строка 683:
 При создании btrfs на нескольких устройствах типы хранения данных и метаданных (ну или хотя бы только данных) стоит задавать вручную (иначе вы можете получить не совсем ожидаемые результаты). Выбрать тип хранения для системных данных лучше доверить драйверу. При создании btrfs на нескольких устройствах типы хранения данных и метаданных (ну или хотя бы только данных) стоит задавать вручную (иначе вы можете получить не совсем ожидаемые результаты). Выбрать тип хранения для системных данных лучше доверить драйверу.
  
-  # Создать сборку из устройств - последовательное заполнение данными обоих дисков без дублирования +  # Создать сборку из устройств ​(JBOD) ​заполнение данными и метаданными обоих дисков без дублирования 
-  mkfs.btrfs -d single /dev/sdb /dev/sdc+  mkfs.btrfs ​-m single ​-d single /dev/sdb /dev/sdc
   ​   ​
-  # Создать RAID0 - равномерное распределение данных с чередованием записи/​чтения +  # Создать RAID0 - равномерное распределение ​данных и метаданных с чередованием записи/​чтения ​между двумя дисками 
-  mkfs.btrfs -d raid0 /dev/sdb /dev/sdc+  mkfs.btrfs ​-m raid0 -d raid0 /dev/sdb /dev/sdc
        
-  # Использовать RAID1 (зеркало) и для данных и для ​метаданных+  # Использовать RAID1 (зеркало) и для данных и метаданных
   mkfs.btrfs -m raid1 -d raid1 /dev/sdb /dev/sdc   mkfs.btrfs -m raid1 -d raid1 /dev/sdb /dev/sdc
        
-  # Использовать RAID10 и для данных и для ​метаданных+  # Использовать RAID10 и для данных и метаданных
   mkfs.btrfs -m raid10 -d raid10 /dev/sdb /dev/sdc /dev/sdd /dev/sde   mkfs.btrfs -m raid10 -d raid10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
        
Строка 788: Строка 817:
 Установщик Ubuntu не позволяет (пока) выбрать все опции ФС, и в частности указать,​ что на btrfs-разделе нужно использовать сжатие. Можно поставить систему на btrfs-раздел без сжатия и включить его после установки (указав нужные ключи монтирования). Но в этом случае сжиматься будут только новые и изменяемые файлы. ​ Установщик Ubuntu не позволяет (пока) выбрать все опции ФС, и в частности указать,​ что на btrfs-разделе нужно использовать сжатие. Можно поставить систему на btrfs-раздел без сжатия и включить его после установки (указав нужные ключи монтирования). Но в этом случае сжиматься будут только новые и изменяемые файлы. ​
  
-Сжать записанные ранее файлы поможет дефрагментация с ключом -с<​тип сжатия ​lzo или gzip>. При этом дефрагментацию можно выполнить только на смонтированном подтоме,​ и даже с открытыми на нём файлами (например,​ с корнем,​ с которого загружена сама ОС), дефрагментатор не уплотнит те файлы, которые открыты в данный момент,​ и выдаст предупреждение об этом.+Сжать записанные ранее файлы поможет дефрагментация с ключом -с<​тип сжатия>​. При этом дефрагментацию можно выполнить только на смонтированном подтоме,​ и даже с открытыми на нём файлами (например,​ с корнем,​ с которого загружена сама ОС), дефрагментатор не уплотнит те файлы, которые открыты в данный момент,​ и выдаст предупреждение об этом.
  
 Но можно сразу поставить систему на том с компрессией,​ это можно сделать 2-мя способами. Но можно сразу поставить систему на том с компрессией,​ это можно сделать 2-мя способами.
Строка 830: Строка 859:
  
 Вот собственно и всё. Потом устанавливаем ОС, выбрав для разделов btrfs. Сразу после установки (не перегружаясь) нужно добавить опции монтирования со сжатием - compress=lzo в fstab только что установленной системы (который будет находиться в /​target/​etc/​fstab). Вот собственно и всё. Потом устанавливаем ОС, выбрав для разделов btrfs. Сразу после установки (не перегружаясь) нужно добавить опции монтирования со сжатием - compress=lzo в fstab только что установленной системы (который будет находиться в /​target/​etc/​fstab).
 +=====btrfs и GRUB=====
 +В состав GRUB входят драйвера btrfs. Однако это очень урезанный драйвер и он не поддерживает запись. А отсутствие записи не позволяет GRUB-у записать служебную переменную recordfail. GRUB проверяет значение этой переменной и если она не сброшена,​ то обязательно показывается меню загрузки. Каждый раз когда GRUB начинает загружать ОС он устанавливает эту переменную в 1, а сбрасывает ее скрипт который запускается после загрузки системы.
 +
 +Т.к. сохранить значение 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>​
  
-Предположим что btrfs у нас на одном устройстве ​и у нас подходящая версия ядра 5.0+, дальше все довольно просто:+Начиная с версии ядра 5.0+ на btrfs можно создать swap-файл, но с некоторыми ограничениями:​ swap-файл должен располагаться целиком ​на одном устройстве ​((его ​нельзя будет ​создать на любом типе ​хранения кроме single)), создаваться обязательно с отключенным COW и сжатием((На btfs-wiki указано,​ что отключение COW блокирует возможность архивирования))Кроме того swap-файл не может попасть в снимок((Если swap-файл смонтирован то невозможно ​сделать снимок с подома где он расположен,​ отключенный swap-файл дает сделать снимок ​вместе со swap-файлом,​ но больше такой swap-файл ​не подключить)). В перспективе предполагается снять часть ​ограничений.\\
  
-  ​touch /swap           ​# создаем пустой файл /swap - COW можно отключить только на пустом файле ​   +С учетом озвученного,​ пока не сняты ограничения,​ swap-файл стоит создавать в отдельном (специально для него созданном под-томе). 
-  chattr +C /swap       ​# отключаем COWа отключение COW блокирует ​и возможность компрессии файла + 
-  ​truncate -s 4G /swap  создаем пустой файл ​размером ​4Gib +Предположим что у нас btrfs на одном устройстве и у нас подходящая версия ядра 5.0+, дальше все довольно просто:​ 
-  mkswap /swap          # создаем внутреннюю разметку в файле для swap-а  + 
-  swapon /swap          # подключаем swap+  btrfs su cr /swap                        # создаем отдельный под-том 
 +  ​touch /swap/swap                          ​# создаем пустой файл /swap - COW можно отключить только на пустом файле ​   
 +  chmod go-r /​swap/​swap ​                    # swap должен иметь права 600, а touch проставляет права 644 
 +  chattr +C /swap/swap                      ​# отключаем COW (сжатие тоже ​отключается при отключении COW) 
 +  ​fallocate ​/swap/swap -l4g                 выделяем место ​под ​файл 4Gib 
 +  mkswap /swap/swap                        ​# создаем внутреннюю разметку в файле для swap-а  
 +  swapon /swap/swap                        ​# подключаем swap 
 + 
 +<note important>​Важно выделять место под swap-файл именно командой fallocate. Если создать пустой файл командой truncate, то он фактически останется пустым т.к. в btrfs используется механика [[https://​ru.wikipedia.org/​wiki/​Разрежённый_файл|sparse files]] и mkswap отработает успешно,​ но swapon сообщит,​ что в файле есть "​дырки",​ т.е. не размеченные на диск области файла.</​note>​
  
 Для автоматического монтирования файла в последующем нужно в /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-файл через 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 можно отключить только на пустом файле 
-  chattr +C /swap          # отключаем COWа отключение COW блокирует ​и возможность компрессии файла +  chmod go-r /swap           # swap должен иметь права 600, а touch проставляет права 644 
-  ​truncate -s 4G /swap     ​создаем пустой файл размером 4Gib +  chattr +C /swap            # отключаем COW (сжатие тоже ​отключается при отключении COW) 
-  swapfile=$(losetup -f)   ​# находим первое свободное loop-устройство  +  ​fallocate ​swap -l4g        ​выделяем место ​под ​файл размером 4Gib 
-  losetup $swapfile /swap  # настраиваем доступ к файлу /swap через loop-устройство  +  swapfile=$(losetup -f)     ​# находим первое свободное loop-устройство  
-  mkswap ​ $swapfile ​       # создаем внутреннюю разметку для swap-а на loop-устройстве +  losetup $swapfile /swap    # настраиваем доступ к файлу /swap через loop-устройство  
-  swapon ​ $swapfile ​       # подключаем swap+  mkswap ​ $swapfile ​         # создаем внутреннюю разметку для swap-а на loop-устройстве 
 +  swapon ​ $swapfile ​         # подключаем swap
  
 Для подключения такого swap после перезагрузки добавьте код начиная с swapfile=$(losetup -f) в файл /​etc/​rc.local (до строки exit 0). Для подключения такого swap после перезагрузки добавьте код начиная с swapfile=$(losetup -f) в файл /​etc/​rc.local (до строки exit 0).
 +
 +<note important>​И все же для ядер младше 5.0 предпочтительнее использовать swap на разделе диска.</​note>​
 ======Обслуживание btrfs====== ======Обслуживание btrfs======
 Как и любая другая ФС, btrfs может работать много лет, не требуя какого-то особого обслуживания,​ однако мы озвучим те действия,​ которые полезно периодически проводить для поддержания "​здоровья"​ btrfs. Как и любая другая ФС, btrfs может работать много лет, не требуя какого-то особого обслуживания,​ однако мы озвучим те действия,​ которые полезно периодически проводить для поддержания "​здоровья"​ btrfs.
Строка 870: Строка 915:
   sudo btrfs balance start /mnt   sudo btrfs balance start /mnt
  
-Если возникают критические проблемы с fs (ядро выдаёт нечто {{:​wiki:​trap.png?​linkonly|подобное}}),​ то переходим к разделу "​Восстановление btrfs"​.+Узнать подробности о состоянии файловой системы ftrfs можно командой:​ 
 + 
 +  btrfs check --force --readonly /​dev/<​раздел на котором расположена btrfs> 
 + 
 +тут --force используется для того, что бы подавить ошибку запуска утилиты на уже смонтированном разделе,​ но не надо опасаться - по умолчанию btrfs check выполняется в режиме только чтения (ключ --readonly указан тут чисто для душевного спокойствия). 
 + 
 +Если возникают критические проблемы с fs (при загрузке ​выдаётся нечто {{:​wiki:​trap.png?​linkonly|подобное}}),​ то переходим к разделу "​Восстановление btrfs"​. 
 + 
 +Еще полезно периодически запускать пересчет контрольных сумм (btrfs crub). В процессе работы (особенно если выключать компьютер по питанию,​ а не через shutdown) контрольные суммы могут потерять свою актуальность. Поэтому периодически запускать их пересчет - не такая и плохая идея. А нужно ли вам запускать пересчет контрольных сумм можно узнать из проверки файловой системы командой:​
  
 +  btrfs check --check-data-csum --force --readonly /​dev/<​раздел на котором расположена btrfs>
 ======Восстановление btrfs====== ======Восстановление btrfs======
  
Строка 975: Строка 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}}