Базовая документация по ZFS

Статьи разработчиков ZFS и сетевых гуру

Цикл научно-популярных статей об устройстве и принципах работы zfs от её создателя Джеффа Бонвика

Тюнинг

Тюнинг ZFS на FreeBSD Martin Matuška (рус.)

Русскоязычная интерпретация ZFS On-Disk Specification от Юрия Воинова:

Анатомия ZFS (часть 1, часть 2, часть 3, часть 4, часть 5, часть 6) Можно изучить для более глубокого понимания структуры файловой системы zfs.

Обширная презентация по ZFS

ZFS Tutorial LISA 2011 (англ.)

Вопросы новичка по zfs

Каковы аппаратные требования для zfs?

Минимальные, чтобы только включилось - 512 М памяти и 32 бит процессор. Минимальные рабочие - 64 бит процессор (напр двух ядерный атом) и 1Гб памяти. Желательно - процессоры Sandy или Ivy Bridge, можно младшие. Памяти чем больше, тем лучше, но в домашних условиях больше 8 Гб вряд ли нужно. (Не забудьте сделать тюнинг, если памяти много, см ниже.) Часто приходится слышать рекомендацию “гигабайт памяти на терабайт массива”. Но пока ни в одном из заслуживающих доверия источников этой рекомендации найти не удалось. Так что, возможно, это городская легенда. В идеале и в production память ECC, но у подавляющего большинства камрадов память обычная. Прим. Для режима дедупликации требуются очень большие, иногда непредсказуемо большие, объемы памяти, см ниже.

Попытки использования в домашних условиях SSD для кеширования как чтения, так и записи не дали заметных позитивных результатов. MikeMac

Какие есть варианты массивов (пулов) zfs?

Массив строится как набор виртуальных устройств (vdev). Часто пул состоит из одного vdev. Виды vdev (Прим. для краткости говорим, что vdev состоят из дисков, хотя это могут быть и разделы дисков и файлы и пр.)

  • stripe - страйп, нечто среднее между RAID0 и JBOD. Не имеет избыточности, вся информация теряется при смерти любого из дисков.
  • mirror - зеркало, примерный аналог RAID1. Каждый диск зеркала содержит полную копию всей информации. Выдерживает смерть одного любого диска. Возможно и тройное зеркало.
  • raidz1 - примерный аналог RAID5, требует минимум 3 дисков, объем одного диска уходит на избыточность. Выдерживает смерть одного любого диска.
  • raidz2 - примерный аналог RAID6, требует минимум 4 диска, объем двух дисков уходит на избыточность. Выдерживает смерть двух любых дисков.
  • raidz3 - требует минимум 5 дисков, объем трёх дисков уходит на избыточность. Выдерживает смерть трёх любых дисков.

Если в пул входит несколько vdev, то они объединяются в страйп из vdev. Так можно сделать примерный аналог RAID10 (страйп из зеркал) или RAID60 (страйп из raidz2). Входящие в пул vdev могут иметь разный размер, но строго рекомендуются одного типа (хотя технически возможно собрать пул из разных типов vdev). Например, не рекомендуется объединять в пул raidz1 и страйп из-за падения надёжности. MikeMac

Каковы сравнительные достоинства и недостатки различных типов vdev?

  • stripe
    • + используется всё пространство дисков; увеличение производительности аналогично RAID0
    • - низкая надежность, вся информация теряется при смерти любого из дисков.
  • mirror
    • + высокая производительность и надежность
    • - половина объема уходит на избыточность (2/3 для тройного зеркала)
  • raidz1
    • + Экономное использование дискового пространства при обеспечении избыточности
    • - некоторое снижение производительности по сравнению с зеркалом; при смерти одного из дисков до окончания перестроения на новый диск имеем страйп в смысле надежности
  • raidz2
    • + высокая надежность, расчёты показывают, что более высокая, чем у зеркала - если вы и потеряете массив, то не из-за выхода дисков из строя, а из-за проблем с другими компонентами
    • - два диска уходят на избыточность
  • raidz3
    • + параноидальная надежность, излишняя практически всегда
    • - три диска на избыточность. MikeMac

И какой вариант мне предпочесть?

  • stripe для малоценной или легко восстанавливаемой информации (оцените и затраты своего времени)
  • mirror для высокой нагрузки случайного чтения/записи
  • raidz1 как базовый вариант для файлопомойки
  • raidz2 как премиум вариант

NB: Никакой RAID не заменяет Backup. Важная, невосстановимая информация должна быть сохранена куда-то вовне. MikeMac

Подробнее о vdev

Подробнее о том, что такое vdev, виртуальное устройство zfs. WearWolf

Какие OS поддерживают zfs?

В production - Solaris, FreeBSD, Linux. Под Linux также разрабатывается чем-то подобный вариант - BTRFS. Поддержки под Windows нет, MS разрабатывает свой чем-то подобный вариант - ReFS. MikeMac

Можно ли в raidz объединить диски разного размера? Всё пространство будет видно?

Сделать raidz из нескольких дисков разного размера можно. По доступному месту массив будет равен массиву из дисков размером с самый маленький из использованных.

Например, raidz1 из 1х2T и 4х3T дисков даст тот же полезный объём, то массив из 5х2T, а именно грубо 8T. MikeMac

Можно ли расширить zfs пул? Уменьшить? Изменить тип?

Расширение - это два вопроса.

Как расширить пул? Добавить в пул ещё один vdev. Например, добавив зеркало к зеркалу, получить аналог RAID10 или аналог RAID50 из двух и более raidz1. При этом, в отличие от RAID50, добавляемый vdev может быть и больше и меньше первого, может содержать другое число дисков. После добавления система автоматически распределяет нагрузку между всеми vdev пула. Технически, можно собрать пул из разнородных vdev, но это настоятельно НЕ рекомендуется.

Как расширить vdev?

  • raidz - добавить ещё один диск в raidz нельзя. Можно заменить каждый из дисков raidz на бОльший - и размер vdev увеличится.
  • stripe (страйп) можно расширить и путем добавления дисков и путем замены меньшего диска на больший (но чем больше дисков - тем ниже надежность) stripe из одного диска можно превратить в зеркало, добавив второй диск достаточного размера.
  • mirror (зеркало) можно, аналогично raidz, расширить заменой каждого диска на бОльший.

При добавлении к зеркалу отдельного диска достаточного размера зеркало можно сделать тройным.

Из зеркала можно изъять диск. Тройное зеркало станет обычным, двойное - страйпом.

Нет способа (кроме разрушения и пересборки массива) превратить зеркало в raidz1 или наоборот (raidz1 в raidz2 и т.п).

Никаким образом объём zfs пула нельзя уменьшить. В частности, нельзя удалять диски из raidz с сохранением избыточности, нельзя заменять диски на меньшие, нельзя удалять из пулов vdev. Все подобные операции - только через сохранение всей информации вовне, разрушение пула, создание нового и закачки информации назад. MikeMac

ZFS на сырых дисках или gpt разделах. Что лучше и почему?

Описано три варианта обработки дисков для создания zfs массива

  • на сырых дисках (напр. zpool create example /dev/da0)
  • на gpt разделах (см 2.4.1 Особенности создания zfs-пула на gpt разделах)
  • на geom метках (применимо только для BSD, см 2.4.2 Zpool на RAW-устройствах с использованием меток устройств)

В этой ветке сформировалось (не единогласное) мнение о предпочтительности варианта на gpt разделах. Подробнее MikeMac

Дедупликацию включать?

Dedupe (дедупликация) даётся не даром англ. оригинал, перевод MikeMac

Распространенно заблуждение о том, что ZFS дедупликацию запросто можно использовать для экономии пространства на вашей файловой системе ZFS / zvols / zpools. Ничто не может быть дальше от истины. В отличие от ряда других реализаций дедупликации, ZFS дедупликация производится на лету, в то время как данные считываются и записываются. Это создает ряд архитектурных задач, которые команда ZFS решила. Но использованные методы приводят к значительным, а иногда и неожиданно высоким требованиям объему оперативной памяти.

Каждый блок данных в дедуплицированной файловой системе может в конечном итоге иметь запись в базе данных известной как DDT (DeDupe таблица). DDT записи используют RAM. Вовсе не редкость для DDT вырасти до размера, большего объёма свободной оперативной памяти для совсем небольших пулов (пара терабайт). Если запросы в DDT не обслуживаются с использованием памяти или быстрого SSD, производительность быстро падает до ужасного уровня. Поскольку включение / выключение дедупликации в ZFS никаким образом не влияет на данные, уже находящиеся на диске, не включайте дедупликацию без полного понимания её требований и архитектуры. Избавиться от неё впоследствии может быть затруднительно.

См. также О порядке удаления датасета с дедупликацией

Сжатие включать?

Oleg Pyzhov: какие разделы сжимать, какие нет определил опытным путем. Проц у меня атомный поэтому без вариантов тип сжатия lzjb

  • storage1/system 6,74G compressratio 1.71x (тут лежат скрипты, а также каталоги для FreeBSD: /usr/src, /usr/obj, /usr/ports)
  • storage1/soft 61,6G compressratio 1.17x (тут дистрибьютивы)
  • storage1/document 302G compressratio 1.16x (тут много мелких файлов: DWG,DOC,XLS,JPG)
  • storage1/timemachine сжатие не испольщую, тк неэффективно .. MacOSX и так походу сжимает свой Backup)
  • storage1/media не сжимаю, тк неэффективно

Sergei V. Sh: размеры датасета с кучей фото

  • 93.2G (ashift=9 compresion=on)
  • 95.0G (ashift=9 compresion=off)
  • 94.5G (ashift=12 compresion=on)
  • 96.1G (ashift=12 compresion=off)

Как переименовать пул?

zpool export poolname
zpool import poolname newname

Как удалить файл, если нет места на диске с ZFS

http://mediaunix.com/2012/08/21/kak-udalit-fajl-esli…s-zfs-na-freebsd/

dd if=/dev/null of=file.avi
rm file.avi

UPD от MikeMac На практике оказалось, что первым пунктом следует проверить наличие снапшотов

zfs list -t snapshot

Если снапшоты есть, то их следует удалять (http://docs.oracle.com/cd/E19253-01/819-5461/gbcya/index.html), начиная с наиболее древних, пока не появится место (или пока не будут удалены все).

Если же проводить операцию по усечению файла как выше - то в случае наличия его копии в снапшоте операция не высвободит места.

Кроме того, практика показывает что усечение файла лучше проводить над небольшими файлами.

Как узнать точный размеры пула?

  • Как определить полный объем пула, доступный пользователю (т.е. за вычетом ушедшего на избыточность)?
zfs list

USED - объем занятого пространства AVAIL - сколько осталось

  • Сиди складывай USED + AVAIL?
  • в байтах для датасета zpool/var:
 zfs get -Hp -o value avail,used zpool/var | awk '{ s+=$1; } END { print s; }'
  • в терабайтах:
 zfs get -Hp -o value avail,used zpool/var |  awk '{ s+=$1; } END { printf "%.3f Tb.\n", s/(1048576*1048576); }'

От WearWolf.

Заменил все диски на бОльшие, но размер пула не изменился, что делать?

Наиболее простой для новичка способ - перезагрузить систему. Если это не помогает

zpool online -e <имя пула> <имя любого диска из этого пула>

Если задать автоувеличение при помощи команды

zpool set autoexpand=on <имя пула>

Пул будет сам вырастать. Sergei V. Sh

Автоувеличение пула не работало перепробовал все трюки - включение autoexpand=on, экспорт-импорт, ребут импорт пула был невозможен пока не деинсталировал VirtualBox - расположен на пуле и при попытке принудительного экспорта просто уводит весь нас в ребут.

Рекомендация отсюда помогла.

zpool online -e media gpt/SUWS gpt/ZAS ...

От sagem830

От продвинутых участников форума

Создаем пул на gpt разделах

NAS своими руками (часть 6), #2978 - Особенности создания zfs-пула на gpt разделах дисков с AF от axel77

Для создания пула устройств хранения данных используется команда zpool create. В качестве аргументов используется имя пула и любое количество виртуальных устройств.

Прежде чем создавать пул необходимо подготовить диски. Это связано с рядом причин.

  1. Во-первых, на дисках могут присутствовать метаданные о существующих разделах и zfs-пулах, в состав которых входили диски ранее. С целью избежать каких-либо недоразумений в будущем, такую информацию желательно удалить. Для удаления метаданных о zfs-пулах необходимо выполнить команду zpool labelclear, которая кроме того удалит существующую таблицу разделов.

  2. Во-вторых, при использовании дисков с «advanced format» (далее в соответствующем контексте – AF), имеющих реальный размер сектора 4КБ, а для файловой системы эмулирующих 512Б сектор, целесообразно указать системе работать с сектором, равным 4КБ. В момент создания пула ZFS определяет геометрию диска и в свойства пула прописывает соответствующее значение: для 512Б сектора (по-умолчанию) – ashift=9 (2^9 = 512), для 4КБ сектора – ashift=12 (2^12 = 4096). Создать необходимую (для ashift=12) геометрию можно при помощи утилиты gnop с параметром «-S 4096». В случае, если в состав пула входит несколько дисков, файл геометрии достаточно создать только для одного.

  3. В-третьих, (не рассматривая случая создания zfs-пула на «сырых» дисках) при разметке диска необходимо контролировать смещение раздела относительно физического начала диска, а также размер создаваемого раздела. Для дисков с AF достаточно смещение и размер раздела определить кратным . Для этого при выполнении команды gpart add определить параметры «-b» (начало раздела) и «-s» (размер раздела) кратными 8 блокам (8*512=4К). Однако это не всегда удобно (приходится самостоятельно подбирать значения), проще указать параметр «-a», который автоматически подберет необходимые значения (смещение и размер раздела).

  4. В-четвертых, т.к. FreeBSD «нумерует» диски в порядке их «появления» в системе, то может сложиться ситуация когда «нумерация» дисков может измениться и ZFS не сможет корректно подключить пул. Для исключения подобной ситуации, а также для удобного представления дисков в zfs-пуле рекомендуется при создании разделов на дисках, определять для них метки. Метка может содержать информацию о расположении диска, его производителе, модели или серийном номере. Метки также удобны при наличии на диски нескольких разделов. Например, при разметки системного диска я определяю 3 раздела: boot0, swap0 и root0 и тогда не нужно запоминать какой по счету раздел для чего выделен (что из них ada0p1, ada0p2, ada0p3).

После «подготовки» дисков можно создавать пул выполнив команду zpool create, указав в качестве первого vdev файл геометрии (*.nop).

После создания zfs-пула файл геометрии более не нужен (ashift уже определен и записан в свойствах пула) и его можно удалить, предварительно выполнив экспорт пула.

Импорт пула теперь необходимо выполнять с указанием в параметре «-d» пути к файлам меток (как правило – /dev/gpt) чтобы в выводе информации о пуле фигурировали не диски, а их метки.

Пример создания raidz на 3-х дисках с AF:

удаляем метаданные:

zpool labelclear /dev/da0
zpool labelclear /dev/da1
zpool labelclear /dev/da2

создаем «выравненные» разделы и определяем метки:

gpart create -s GPT /dev/da0
gpart create -s GPT /dev/da1
gpart create -s GPT /dev/da2
gpart add -t freebsd-zfs -l disk11WDG2576 -a 4K /dev/da0
gpart add -t freebsd-zfs -l disk12WDG1708 -a 4K /dev/da1
gpart add -t freebsd-zfs -l disk21SSP0628 -a 4K /dev/da2

задаем «нужную» геометрию:

gnop create -S 4096 /dev/gpt/disk11WDG2576

создаем пул и определяем его свойства (при необходимости):

zpool create -m /mnt/teststor teststor raidz /dev/gpt/disk11WDG2576.nop /dev/gpt/disk12WDG1708 /dev/gpt/disk21SSP0628
zfs set atime=off teststor
zfs set checksum=fletcher4 teststor

удаляем файлы геометрии дисков:

zpool export teststor
gnop destroy /dev/gpt/disk11WDG2576.nop
zpool import -d /dev/gpt teststor

Проверить значение ashift можно выполнив команду zdb.

Примечание:

  1. Если в пуле диски с AF и без AF, то рекомендуется делать ashift=12.
  2. ashift=12 рекомендуется делать и для пулов на дисках без AF. Рано или поздно придется заменить диск(и) в пуле (будь то увеличение массива или замена вышедшего из строя), а новые диски с большой долей вероятности будут с AF.

Создаем пул на gpt разделах в ZFS on Linux

ZoL GPT раздел создаст сам при создании пула. Для задания размера сектора есть специальный параметр - ashift (9 для 512 байт и 12 - для 4КБ). Пример команды создания RAIDZ:

zpool create -m /mnt/zp -O atime=off -O utf8only=on -O normalization=formD -o ashift=12 ZP raidz scsi-... ... scsi-...

Где scsi-… - это ID диска из /dev/disk/by-id/

От bormental.

Пул на метках устройств

NAS своими руками (часть 6), #4001 Zpool на RAW-устройствах с использованием меток устройств от iZEN. Пример по этой методике. NB Способ пригоден для FreeBSD. Если такой пул экспортировать в Solaris, получим пул на сырых дисках, метки будут затерты.

Дедупликация - команда zbd

Общая справка по zdb во FreeBSD от RU_Taurus

Особенности параметра sync

Опция sync для zfs-пула, влияние надежность и производительность от RU_Taurus

Снимки системы автоматом

Скрипт для автоматизации выполнения snapshot по расписанию от Oleg Pyzhov

Резервная копия zfs

Скрипт для backup zfs с помощью zfs send/receive от Oleg Pyzhov

Потери места при создании raidz и raidz2

Таблица замера накладных расходов raidz/raidz 2 от thedix

Проблемы и решения

Нетривиальная проблема с массивом

Успешно решенная kostya_1983 Отсюда и ниже.

Или лучше сразу к разбору полетов.

Перенос пула

При переносе пула, созданного во FreeBSD, тут и тут отмечено, что диск ada2 определяется как c7t2d0_s_2, статус в пуле UNAVAIL (не доступен). Обходной путь - при переносе не использовать ada2 в составе пула.

ZFS on Linux после перезагрузки пул не монтируется автоматически

В файле /etc/default/zfs устанавливаем:

ZFS_MOUNT = 'yes'
ZFS_UNMOUNT = 'yes'

Подробнее.

Данная рекоммендация, по всей видимости, не актуальна для новых версий ZoL.

Для настоящих знатоков извращений :)

Перед тем как реализовывать рекомендуется 7 раз подумать.

Q. Купить разом все хдд не имею возможности, а ухудшать конфиг не хочу
A. мой случай… я сделал себе 8+2 (raidz2 из 10 дисков) - но дисков сразу не имею

Q. А какими командами FreeBSD поделить 2T диск на половинки для этого?
A. например, так

Q. имею raidz1 на 2T дисках. Заменить каждый на 4T - ноль проблем. Но в выхлопе остается несколько шт 2T дисков. Печалька.
A. NAS своими руками (часть 6), #2895

Q. Имею 2 диска, хочу raidz1 из трех дисков, но третий докупить потом - так можно? Вариант вопроса - имею зеркало, купил еще один диск, хочу превратить зеркало в raidz, других дисков нет - как?
A. Можно и так извратиться используя фиктивный диск. До окончания процесса избыточности НЕ будет. Идея разыскана Archer13 и сохранена тут zfs on fake disk