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

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
wiki:btrfs [2019/07/06 02:15]
[COW - Copy On Write]
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>​
  
Строка 103: Строка 104:
 Создать "​теневую копию"​ данных (т.е. сделать дополнительную ссылку на те же данные на которые ссылается iNode существующего файла) можно командой:​ Создать "​теневую копию"​ данных (т.е. сделать дополнительную ссылку на те же данные на которые ссылается iNode существующего файла) можно командой:​
  
-  cp -reflink <​оригинальный файл>​ <​теневая копия>​+  cp --reflink <​оригинальный файл>​ <​теневая копия>​
   ​   ​
-Оба файла после такой команды будут хранить свое содержимое в одном месте (почти как hard-link), но как только в оригинальный файл будут записаны новые данные - он изменится,​ а теневая копия - сохранит оригинальное содержимое.+Оба файла после такой команды будут хранить свое содержимое в одном месте (почти как hard-link), но как только в оригинальный файл будут записаны новые данные - он изменится,​ а теневая копия - сохранит оригинальное содержимое. ​Фактически,​ такое копирование - это просто создание новой записи в каталоге файлов. Копирования данных не происходит. А значит даже очень большой файл копируется (а точнее клонируется) практически мгновенно.  ​
  
-Сделать теневую копию сразу целого подтома ​() можно с использованием ​снимков ([[https://​help.ubuntu.ru/​wiki/​btrfs#​%D1%81%D0%BD%D0%B8%D0%BC%D0%BA%D0%B8|см.Сделать радел "Снимки"]]).+Используя рекурсивное копирование (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|снимков]]).
  
 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 можно создать несколько выделенных файловых систем - подтомов. Свободное пространство делится между всеми такими подтомами,​ а также могут совместно использоваться одинаковые данные (при выполнении дедубликации или при использовании снимков). При необходимости на подтома можно установить квоты. Так же у подтомов могут быть настроены разные механизмы сжатия и некоторые другие свойства. Т.о. подтома btrfs - это вполне полноценная замена нескольким файловым системам,​ размещенным на отдельных разделах диска. ​+Внутри файловой системы btrfs можно создать несколько выделенных файловых систем - подтомов. Свободное пространство делится между всеми такими подтомами,​ а также могут совместно использоваться одинаковые данные (при выполнении ​копирования с опцией --reflink, ​дедубликации или при использовании снимков). При необходимости на подтома можно установить квоты ​(ограничить размер). Так же у подтомов могут быть настроены разные механизмы сжатия и некоторые другие свойства. Т.о. подтома btrfs - это вполне полноценная замена нескольким файловым системам,​ размещенным на отдельных разделах диска. ​
  
 Дополнительное преимущество от использования подтомов на HDD-диске (по сравнению с разделами) заключается в том, что btrfs начинает заполнять предоставленный ей объем на диске с начала,​ и в одной и той же зоне располагается информация сразу всех подтомов. Т.о. головкам диска не нужно бегать по всему диску (как они бы бегали между разделами),​ когда нужны данные из разных разделов. Дополнительное преимущество от использования подтомов на HDD-диске (по сравнению с разделами) заключается в том, что btrfs начинает заполнять предоставленный ей объем на диске с начала,​ и в одной и той же зоне располагается информация сразу всех подтомов. Т.о. головкам диска не нужно бегать по всему диску (как они бы бегали между разделами),​ когда нужны данные из разных разделов.
Строка 129: Строка 134:
 Удаляется подтом командой ​ Удаляется подтом командой ​
   btrfs subvolume delete {путь по которому смонтирована btrfs}/​{путь и имя удаляемого подтома}   btrfs subvolume delete {путь по которому смонтирована btrfs}/​{путь и имя удаляемого подтома}
 +  ​
 +В последнних версиях btrfs удалить подтом можно также командой rm -r или rmdir. ​  
 +С точки зрения файловой системы подтом и каталог различаются только методом создания (ранее различались еще удалением). Во всем остальном подтома не отличаются от каталогов.
 +Переименовывается подтом обычной командой mv.
  
-С точки зрения файловой системы ​подтом и каталог различаются только методами создания и удаления. Во всем остальном подтома не отличаются от каталогов. +<note tip>​Несмотря на то, что подтом и каталог ​не различимы ​с точки зрения пользователя (если не считать команды ​создания), для администратора подтом ​дает значительно больше возможностей, чем каталог. Ведь ​подтом, по сути, - независимая файловая система, в которой можно настроить отличные параметры ​от родительского ​подтома, а также ​можно ​установить ​квоты или делать снимки (т.е. быстрые резервные копии).</​note>​
-К примеру, переименовать подтом можно ​просто командой mv.+
  
-<note tip>​Несмотря на то, что подтом и каталог не различимы с точки зрения пользователя (если не считать команд создания и удаления),​ для администратора подтом дает значительно больше возможностей,​ чем каталог. Ведь подтом,​ по сути, - независимая файловая система,​ в которой можно настроить отличные параметры от родительского подтома,​ а также можно установить квоты или делать снимки (т.е. быстрые резервные копии).</​note>​ 
  
 +<note tip>​Обратите внимание:​ подтома могут создаваться на любом уровне вложенности,​ причем не только внутри другого подтома,​ но и внутри любого вложенного каталога. Например,​ может существовать такой путь: <​root>/​svol1/​dirA/​svol5/​file - тут файл file находится внутри подтома svol5, который размещен в каталоге dirA подтома svol1. ​
 +Причем вам не нужно заботиться о том, что бы вся структура вложенных подтомов была правильно смонтирована внутри подтома верхнего уровня - монтируете подтом верхнего уровня и все его вложенные подтома уже сразу будут на месте.</​note>​
  
-<note tip>​Обратите внимание: ​подтома могут создаваться ​на любом уровне вложенности, причем не только ​внутри другого подтомано и внутри любого вложенного каталогаНапример, может существовать ​такой путь: <​root>/​svol1/​dirA/​svol5/​file - тут файл ​file находится внутри подтома svol5, который размещен в каталоге dirA подтома svol1.+Если необходимо, то любой ​подтом ​аже уже смонтированный командой mount или смонтированный ​внутри другого смонтированного подтома) можно смонтировать ​еще раз в другое место. Это кардинально ​отличает подтома btrfs от большинства других ​файловых систем (обычно файловую систему можно смонтировать только один раз)
  
-Причем вам не нужно заботиться о том, что бы вся структура вложенных ​подтомов была правильно смонтирована внутри подтома верхнего уровня - монтируете ​подтом ​верхнего уровня и все его вложенные подтома уже сразу будут ​на месте.</​note>​+Таким образом, подтома - чрезвычайно гибкий ​инструмент для управления системой хранения 
  
 Посмотреть список подтомов можно командой:​ Посмотреть список подтомов можно командой:​
Строка 155: Строка 164:
 Что бы получить в точке монтирования ФС конкретный подтом,​ нужно в опциях монтирования указать имя (или ID) подтома,​ который нужно монтировать. Пример:​ Что бы получить в точке монтирования ФС конкретный подтом,​ нужно в опциях монтирования указать имя (или ID) подтома,​ который нужно монтировать. Пример:​
  
-  mount -o subvol=@ /dev/sda2 /mnt+  mount -o subvol=@ /dev/sda2 /mnt     # или -o subvolid=257 - если монтировать по ID подтома.
   ls /mnt   ls /mnt
   bin    dev   ​initrd.img ​     lib64  opt   ​run ​  ​sys ​ var   bin    dev   ​initrd.img ​     lib64  opt   ​run ​  ​sys ​ var
Строка 161: Строка 170:
   cdrom  home  lib             ​mnt ​   root  srv   ​usr ​ vmlinuz.old   cdrom  home  lib             ​mnt ​   root  srv   ​usr ​ vmlinuz.old
  
-Именно так прописывает монтирование подразделов стандартный установщик в [[manual:​fstab|fstab]]. Пример строк ​[[manual:fstab|fstab]], которые обычно создает установщик:​+Именно так прописывает монтирование подразделов стандартный установщик в [[wiki:​fstab|fstab]]. Пример строк fstab, которые обычно создает установщик:​
   UUID=0260463a-1468-422b-8bbb-f80e98e34001 /   btrfs subvol=@ ​      ​1 ​     1   UUID=0260463a-1468-422b-8bbb-f80e98e34001 /   btrfs subvol=@ ​      ​1 ​     1
   UUID=0260463a-1468-422b-8bbb-f80e98e34001 /home   btrfs subvol=@home 0       2   UUID=0260463a-1468-422b-8bbb-f80e98e34001 /home   btrfs subvol=@home 0       2
Строка 174: Строка 183:
  
 <​note>​Изменение подтома по умолчанию вовсе не отменяет возможность монтировать подтом,​ указывая его имя.</​note>​ <​note>​Изменение подтома по умолчанию вовсе не отменяет возможность монтировать подтом,​ указывая его имя.</​note>​
-<note important>​Абсолютное большинство инструкций для работы с подтомами и снимками написаны исходя из того, что подтом по умолчанию - это подтом с ID=5. +<note important>​Абсолютное большинство инструкций для работы с подтомами и снимками, которые вы можете найти в этой статье или в других статьях в интернете, ​написаны исходя из того, что подтом по умолчанию - это подтом с ID=5. 
 Поэтому не меняйте подтом по умолчанию без особой нужды, а если вы изменили подтом по умолчанию,​ то учитывайте это. Не забывайте при монтировании корневого подтома btrfs указывать опцию **-o subvol=/** или **-o subvolid=5**.</​note>​ Поэтому не меняйте подтом по умолчанию без особой нужды, а если вы изменили подтом по умолчанию,​ то учитывайте это. Не забывайте при монтировании корневого подтома btrfs указывать опцию **-o subvol=/** или **-o subvolid=5**.</​note>​
  
Строка 189: Строка 198:
   btrfs subvolume snapshot [-r] <​подтом с которого делается снимок>​ <​путь и имя снимка>​   btrfs subvolume snapshot [-r] <​подтом с которого делается снимок>​ <​путь и имя снимка>​
  
-В момент создания снимка, в снимке ​запоминается ​состояние (версияметаданных оригинального подтома,​ все дальнейшие изменения,​ происходящие в подтоме,​ (а также в снимке) выполняются по [[https://​help.ubuntu.ru/​wiki/​btrfs#​cow_-_copy_on_write|алгоритму Copy On Write]]. Таким образом на диске все те данные,​ которые в томе и снимке не изменялись хранятся в одной ​общей структуре данных, а все новые и перезаписанные данные хранятся в независимых,​ разных структурах (у оригинального подтома они свои и у снимка - свои собственные).+В момент создания снимка создается ​"теневая" копия метаданных оригинального подтома ​(inode снимка содержит копии ссылок из inode оригинального подтома), все дальнейшие изменения,​ происходящие в подтоме,​ (а также в снимке) выполняются по [[https://​help.ubuntu.ru/​wiki/​btrfs#​cow_-_copy_on_write|алгоритму Copy On Write]]. Таким образом на диске все те метаданные и данные,​ которые в томе и снимке не изменялись хранятся в общем месте, а все новые и перезаписанные ​данные и метаданные хранятся в независимых,​ разных структурах (у оригинального подтома они свои и у снимка - свои собственные).
  
 То, что снимки работают в режиме RW полностью размывает различие между снимком и подтомом. Снимок,​ представляет собой точно такую же отдельную ФС как и подтом. Фактически создание снимка - это создание тома, только в отличии от btrfs subvolume cereate, создающего пустой подтом,​ btrfs subvolume snapshot создает новый подтом как копию/​клон ранее существовавшего. ​   То, что снимки работают в режиме RW полностью размывает различие между снимком и подтомом. Снимок,​ представляет собой точно такую же отдельную ФС как и подтом. Фактически создание снимка - это создание тома, только в отличии от btrfs subvolume cereate, создающего пустой подтом,​ btrfs subvolume snapshot создает новый подтом как копию/​клон ранее существовавшего. ​  
Строка 397: Строка 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 раза или меньше
Строка 423: Строка 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 (совместное использование данных в подтомах и снимках,​ а также дедупликация данных) вообще делают невозможным однозначно определить,​ какое место на диске занимают данные того или иного отдельно взятого подтома/​снимка.\\
Строка 556: Строка 567:
 Например указанный размер **+2g** увеличит ФС на 2 гигабайта,​ **-1g** - уменьшит на 1 гигабайт,​ а **40g** - установит полный размер ФС в 40 гигабайт. Например указанный размер **+2g** увеличит ФС на 2 гигабайта,​ **-1g** - уменьшит на 1 гигабайт,​ а **40g** - установит полный размер ФС в 40 гигабайт.
  
-===== Проверка ​сумм =====+===== Контрольные суммы =====
 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
Строка 563: Строка 595:
   # -d  Выводить результаты (только при -B)   # -d  Выводить результаты (только при -B)
  
 +Все опции команды btrfs scrub можно посмотреть в 
 +  man btrfs-scrub
 =====Балансировка===== =====Балансировка=====
 При балансировке на btrfs пере-создаются метаданные и пере-распределяются данные файлов. Запускается балансировка командой:​ При балансировке на btrfs пере-создаются метаданные и пере-распределяются данные файлов. Запускается балансировка командой:​
Строка 590: Строка 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 на нескольких устройствах=====
  
Строка 622: Строка 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 или не подхватывать диски автоматом.\\
Строка 647: Строка 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
        
Строка 781: Строка 817:
 Установщик Ubuntu не позволяет (пока) выбрать все опции ФС, и в частности указать,​ что на btrfs-разделе нужно использовать сжатие. Можно поставить систему на btrfs-раздел без сжатия и включить его после установки (указав нужные ключи монтирования). Но в этом случае сжиматься будут только новые и изменяемые файлы. ​ Установщик Ubuntu не позволяет (пока) выбрать все опции ФС, и в частности указать,​ что на btrfs-разделе нужно использовать сжатие. Можно поставить систему на btrfs-раздел без сжатия и включить его после установки (указав нужные ключи монтирования). Но в этом случае сжиматься будут только новые и изменяемые файлы. ​
  
-Сжать записанные ранее файлы поможет дефрагментация с ключом -с<​тип сжатия ​lzo или gzip>. При этом дефрагментацию можно выполнить только на смонтированном подтоме,​ и даже с открытыми на нём файлами (например,​ с корнем,​ с которого загружена сама ОС), дефрагментатор не уплотнит те файлы, которые открыты в данный момент,​ и выдаст предупреждение об этом.+Сжать записанные ранее файлы поможет дефрагментация с ключом -с<​тип сжатия>​. При этом дефрагментацию можно выполнить только на смонтированном подтоме,​ и даже с открытыми на нём файлами (например,​ с корнем,​ с которого загружена сама ОС), дефрагментатор не уплотнит те файлы, которые открыты в данный момент,​ и выдаст предупреждение об этом.
  
 Но можно сразу поставить систему на том с компрессией,​ это можно сделать 2-мя способами. Но можно сразу поставить систему на том с компрессией,​ это можно сделать 2-мя способами.
Строка 823: Строка 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.
Строка 863: Строка 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======
  
Строка 968: Строка 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}}