Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Следующая версия Следующая версия справа и слева | ||
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. |