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

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
Следующая версия Следующая версия справа и слева
wiki:btrfs [2019/07/30 13:47]
[Сжатие/упаковка данных]
wiki:btrfs [2020/01/22 23:27]
[COW - Copy On Write]
Строка 22: Строка 22:
   * Контроль целостности блоков данных и метаданных с помощью контрольных сумм.   * Контроль целостности блоков данных и метаданных с помощью контрольных сумм.
   * Зеркалирование метаданных даже в однодисковой конфигурации (отключается на ssd).   * Зеркалирование метаданных даже в однодисковой конфигурации (отключается на ssd).
 +  * Поддержка [[https://​ru.wikipedia.org/​wiki/​Разрежённый_файл|разреженных файлов]]. ​
   * Полностью распределенное блокирование.   * Полностью распределенное блокирование.
   * Поддержка ACL.   * Поддержка ACL.
Строка 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 - это вполне полноценная замена нескольким файловым системам,​ размещенным на отдельных разделах диска. ​
Строка 834: Строка 837:
  
 Вот собственно и всё. Потом устанавливаем ОС, выбрав для разделов 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 секунд. Изменить этот тайм-аут можно изменив в /​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-файл не может попасть в снимок. В перспективе предполагается снять часть ограничений.\\+Начиная с версии ​ядра ​5.0+ на btrfs можно создать swap-файл,​ но с некоторыми ограничениями:​ swap-файл должен располагаться целиком на одном устройстве,​ создаваться обязательно с отключенным COW и сжатием((На самом деле, если вчитаться в детали на btfs-wiki, то отключение COW блокирует возможность архивирования)). Кроме того swap-файл не может попасть в снимок. В перспективе предполагается снять часть ограничений.\\
  
-Предположим что ​btrfs у нас на одном устройстве и у нас подходящая версия ядра 5.0+, дальше все довольно просто:​+Предположим что у нас ​btrfs на одном устройстве и у нас подходящая версия ядра 5.0+, дальше все довольно просто:​
  
-  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 
-  mkswap /swap          # создаем внутреннюю разметку в файле для swap-а  +  chattr -c /swap              # отключаем компрессию файла 
-  swapon /swap          # подключаем swap+  ​fallocate swap -l4g          ​выделяем место ​под ​файл 4Gib 
 +  mkswap /swap                 ​# создаем внутреннюю разметку в файле для swap-а  
 +  swapon /swap                 ​# подключаем swap 
 + 
 +<note important>​Важно выделять место под swap-файл именно командой fallocate. Если создать пустой файл командой truncate, то он фактически останется пустым т.к. в btrfs используется механика [[https://​ru.wikipedia.org/​wiki/​Разрежённый_файл|sparse files]] и mkswap отработает успешно,​ но swapon сообщит,​ что в файле есть "​дырки",​ т.е. не размеченные на диск области файла.</​note>​
  
 Для автоматического монтирования файла в последующем нужно в /etc/fstab добавить следующую строку:​ Для автоматического монтирования файла в последующем нужно в /etc/fstab добавить следующую строку:​
Строка 849: Строка 861:
   /swap none swap swap 0 0   /swap none swap swap 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 
-  swapfile=$(losetup -f)   ​# находим первое свободное loop-устройство  +  chattr -c /swap            # отключаем компрессию файла 
-  losetup $swapfile /swap  # настраиваем доступ к файлу /swap через loop-устройство  +  ​fallocate ​swap -l4g        ​выделяем место ​под ​файл размером 4Gib 
-  mkswap ​ $swapfile ​       # создаем внутреннюю разметку для swap-а на loop-устройстве +  swapfile=$(losetup -f)     ​# находим первое свободное loop-устройство  
-  swapon ​ $swapfile ​       # подключаем swap+  losetup $swapfile /swap    # настраиваем доступ к файлу /swap через loop-устройство  
 +  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.