Файловые системы ближайшего будущего. ZFS. Файловая система ZFS — основа надежного и недорогого хранилища данных Тюнинг ZFS и полезные трюки c Btrfs

(оригинал)

  • Безудержное нарушение принципа многоуровневости? (оригинал)
  • Карты пространства (оригинал)
  • ZFS Deduplication (англ.)
  • Тюнинг

    Вопросы новичка по 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

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

    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

    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), начиная с наиболее древних, пока не появится место (или пока не будут удалены все).

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

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

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

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

    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 - расположен на пуле и при попытке принудительного экспорта просто уводит весь нас в ребут.

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

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

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

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

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

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

    zpool

    Если традиционно файловые системы создают на разделах носителей информации, то ZFS объединяет произвольное множество физических накопителей и их логических частей в пространство без границ, проще говоря поле (англ. pool ). При этом решение низкоуровневых вопросов ZFS берёт на себя, позволяя создать зеркальный массив из двух накопителей одной командой:

    # zpool create pool mirror sdb sdc

    Когда дублирование информации пользователя не требуется, носители информации можно объединить, сложив их ёмкости и увеличив скорость доступа:

    # zpool create pool sdb sdc

    В вышеприведённых примерах pool - произвольное имя создаваемого информационного поля. sdb и sdc - сокращения от путей /dev/sdb и /dev/sdc . Заметим, что в таком случае на каждом устройстве будут созданы GPT разметка и разделы:

    Устр-во Start Конец Size Тип /dev/sdc1 2048 31487999 15G Solaris /usr & Apple ZFS /dev/sdc9 31488000 31504383 8M Solaris reserved 1

    Можно передавать команде zpool create и имена существующих разделов (как обычно), а так же файлов (вариант предусмотрен для экспериментов).

    Если поле создано на переносном накопителе, для безопасного отключения служит команда:

    # zpool export pool

    а для подключения:

    # zpool import pool

    Когда имя не известно, команда импорта выполняется без его указания и выводит список возможных.

    Архитектура ZFS такова, что извлечение физического накопителя без предварительного экспорта исключает повреждение информации пользователя. Механизм транзакций сохраняет изменения в свободных секторах без перезаписи оригинала. Таким образом гарантируется целостность ФС и допускается потеря лишь не в полной мере записанных данных. Например, при аварийном отключении энергии непосредственно в процессе сохранения отредактированного документа на диске окажется прежняя версия. Для дополнительной защиты данных от ошибок (в том числе аппаратуры) ZFS использует контрольные суммы.

    Запуск задачи очистки от повреждений производится командой:

    # zpool scrub pool

    а проверка состояния:

    # zpool status

    Произведённые операции сохраняются в журнале, для просмотра которого служит:

    # zpool history

    zfs

    Создав вышеизложенным способом pool, можно обнаружить, что в коневом разделе смонтирован каталог с соответствующим именем. На самом деле, ему соответствует одноимённая файловая система, в чём можно убедиться, дав команду:

    # zfs list

    В таком виде уже возможно использовать ZFS - как обычную ФС. Если желательно монтировать традиционно, командой mount и посредством /etc/fstab , то следует изменить соответствующее свойство таким образом:

    # zfs set mountpoint=legacy pool

    Для просмотра свойств предназначен вариант get , например, их перечень можно получить так:

    # zfs get all

    Ряд свойств должен быть знаком тем, кто редактировал файл /etc/fstab . ZFS хранит их поближе к характеризуемым структурам, что бы «инструкция по использованию» была под рукой. Но это не мешает использовать и привычный подход.

    Зачем нужна zfs, когда есть zpool?

    Как правило, предпочтительно отделять данные пользователя в /home от системных. В ряде случаев требования к гибкости файловой иерархии повышены, а заранее предугадать количество разделов не представляется возможным. ZFS избавляет пользователя от вопросов «какие лучше выбрать размеры разделам?» и позволяет организовать в едином поле произвольное множество файловых систем, распределяя общий объём памяти по мере надобности, а при необходимости даёт возможность добавить новые физические носители.

    В таких сценариях автоматически созданную ФС не используют непосредственно для хранения данных. Её рассматривают как родительскую: задают свойства, которые требуется унаследовать дочерним структурам, например:

    # zfs set compression=lz4 pool # zfs set acltype=posixacl pool # zfs set xattr=xa pool

    Заметим, что при указании некорректного значения свойства, в качестве подсказки будет выдан список возможных.

    # zfs create pool/ROOT # zfs create pool/ROOT/rosa-1 # zfs create -o mountpoint=/home pool/home

    Как видно, свойства можно задавать непосредственно при создании ФС, а не только менять позже. Отличная от legacy точка монтирования /home приведёт к тому, что pool/home окажется доступен по соответствующему пути в случае импорта, или команды zfs mount -a . Однако, нужно учитывать тонкость: свойство overlay по умолчанию off - если что-либо по заданному пути уже смонтировано, то оверлей создан не будет.

    Помимо pool/ROOT/rosa-1 можно создать pool/ROOT/rosa-2 и установить два варианта ОС. Копию можно создавать не только привычным методом, но и используя механизм мгновенных снимков состояния zfs snapshot и клонирования zfs clone . С учётом таких сценариев, а так же возможности chroot , вместо mountpoint=/ удобнее выбрать legacy (и если читатель выполнил пример из предыдущего раздела, то оно таким и унаследовано от pool )

    Запуск ОС Роса с ZFS

    Осуществляется просто, если на диске создан отдельный раздел /boot для grub2 и ядер ОС. В таком случае в grub.cfg в качестве параметра ядра root следует указать путь к корневому разделу, возможны различные варианты:

    Linux /vmlinuz-4.4.7-nrj-laptop-1rosa-x86_64 root=ZFS=pool/ROOT/rosa-1 ro linux /vmlinuz-4.4.7-nrj-laptop-1rosa-x86_64 root=zfs: ro zfs=pool/ROOT/rosa-1

    С этой задачей справляется update-grub2 из официальных репозиториев, но в некоторых случаях требуется недавняя beta версия. Так же желательно установить и соответствующее свойство:

    # zpool set bootfs=pool/ROOT/rosa-1

    ZFS в порядке сжатия и дедупликации linux

    каков порядок записи данных в файловую систему zfs в linux?

    единственный конкретный документ я нашел на http://docs.oracle.com/cd/E36784_01/html/E36835/gkknx.html говорит: When a file is written, the data is compressed, encrypted, and the checksum is verified. Then, the data is deduplicated, if possible.

    но если это правда, то дедупликация не будет дедупликации блоков, сжатых с различными алгоритмами сжатия.

    Я тестировал mysqlf, и я считаю, что порядок следующий: dedup, compress, encrypt .

    мой тест-настройка:

    Zpool create tank /dev/sdb zfs create tank/lz4 zfs create tank/gzip9 zfs set compression=lz4 tank/lz4 zfs set compression=gzip-9 tank/gzip9 zfs set dedup=on tank

    выход zfs list

    NAME USED AVAIL REFER MOUNTPOINT tank 106K 19,3G 19K /tank tank/gzip9 19K 19,3G 19K /tank/gzip9 tank/lz4 19K 19,3G 19K /tank/lz4

    сгенерируйте случайный файл с помощью dd if=/dev/urandom of=random.txt count=128K bs=1024

    131072+0 Datensätze ein 131072+0 Datensätze aus 134217728 Bytes (134 MB) kopiert, 12,8786 s, 10,4 MB/s

    вывод списка zpool в пустой пул:

    NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT tank 19,9G 134K 19,9G - 0% 0% 1.00x ONLINE -

    затем скопируйте файлы в наборы данных с различными алгоритмами сжатия:

    Cp random.txt /tank/lz4 cp random.txt /tank/gzip9

    выход zfs list после копирования:

    NAME USED AVAIL REFER MOUNTPOINT tank 257M 19,1G 19K /tank tank/gzip9 128M 19,1G 128M /tank/gzip9 tank/lz4 128M 19,1G 128M /tank/lz4

    выход zpool list afer копирование:

    NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT tank 19,9G 129M 19,7G - 0% 0% 2.00x ONLINE -

    коэффициент дедупликации 2.0 после копирование одного файла в разные наборы данных. На мой взгляд, это означает, что дедупликация выполняется на data -блоки перед сжатием и шифрованием.

    пожалуйста, кто-нибудь может проверить, правильно ли это?

    1 ответов

    когда файл записывается, данные сжимаются, шифруются, и контрольная сумма проверяется. Затем данные дедуплицируются, если это возможно.

    мое предположение со случайным файлом было неверным. Кажется, что ZFS прерывает сжатие, если не может достичь определенного минимального коэффициента сжатия.

    другая определенная вещь, котор нужно заметить что представление LZ4 на несжимаемых данных очень высоко. Это достигается путем включения механизма "раннего прерывания", который срабатывает, если LZ4 не может соответствовать ожидаемому минимальному коэффициенту сжатия (12,5% на ZFS).

    В наши дни все большей и большей популярности набирают файловые системы следующего поколения, которые имеют более широкую функциональность, чем в обычных файловых системах. Одни из таких файловых систем - это Btrfs и ZFS, Обе они уже стали достаточно стабильными и активно применяются пользователями. Для многих пользователей очень важна сохранность данных, и такие файловые системы могут обеспечить ее наилучшим образом.

    В одной из предыдущих статей мы рассматривали . В нашей сегодняшней статье мы остановимся на ZFS, эти файловые системы похожи по своему применению и назначению, но имеют некоторые отличия. Мы рассмотрим как установить эту файловую систему в вашем дистрибутиве, настроить ее и использовать для решения повседневных задач.

    ZFS - это файловая система, объединенная с менеджером логических томов.. Файловая система выпускалась под открытой лицензией Common Development and Distribution License (CDDL). Она была предназначена для высокопроизводительных серверов, поэтому уже тогда поддерживала мгновенные снимки и клонирование данных. Но после покупки ее компанией Oracle, исходный код был закрыт, а сообщество создало форк последней доступной версии под именем OpenZFS. Именно эту файловую систему сейчас и можно установить и использовать.

    Файловая система ZFS имеет обычные для таких файловых систем возможности. Это просто огромный размер одного раздела, и размер файла, поддерживается возможность хранения файлов на нескольких устройствах, проверка контрольных сумм для данных и шифрование на лету, а также запись новых данных в режиме COW, когда данные не переписываются, а пишутся в новое место, что позволяет делать мгновенные снапшоты.

    Возможности очень похожи на Btrfs, но есть кое-какие отличия. В Btrfs можно посмотреть все файлы, измененные с момента последнего снапшота. Второе отличие, это отсутствие в Btrfs логических блоков zvol.

    Установка ZFS

    В последних версиях Ubuntu файловая система ZFS была добавлена в официальный репозиторий и в установочный диск. Поэтому для того, чтобы ее установить будет достаточно выполнить несколько команд:

    sudo apt install -y zfs

    В других дистрибутивах. например, CentOS или Fedora ситуация немного сложнее, сначала вам придется добавить официальный репозиторий, а затем установка zfs и самого набора утилит и модулей ядра:

    sudo yum install http://download.zfsonlinux.org/epel/zfs-release.el7_3.noarch.rpm
    $ sudo yum install zfs

    Затем осталось включить загрузить модуль ядра с поддержкой этой файловой системы:

    sudo modprobe zfs

    Теперь файловая система установлена и готова к использованию. Дальше нам нужно выбрать разделы и создать на них файловые системы. Для настройки zfs используется утилита zpool, но для начала давайте рассмотрим ее синтаксис и возможности. Файловая система может быть расположена на нескольких разделах или жестких дисках, поэтому на уровне ядра формируется общий пул (куча), а к нему уже подключаются разделы. Тут можно провести аналогию с группой томов LVM.

    Команда zpool

    Это основной инструмент управления разделами и функциональными возможностями ZFS, поэтому вам важно его освоить. Общий синтаксис команды достаточно прост, но у нее есть множество подкоманд, которые имеют свой синтаксис и параметры:

    $ zpool команда параметры опции устройства

    Как я уже сказал, параметры и опции для каждой команды свои, а в качестве устройства может указываться пул или физический раздел на жестком диске. Теперь рассмотрим основные команды и их предназначение, чтобы вы могли немного ориентироваться, а более детальные параметры разберем уже на примерах:

    • add - добавить раздел к существующему пулу;
    • attach - добавить раздел или жесткий диск к пулу файловой системы;
    • clean - очистить все ошибки дисков;
    • create - создать новый пул из физического раздела, на котором будут размещены виртуальные диски;
    • destroy - удалить пул разделов zfs;
    • detach - отключить физический раздел от пула;
    • events - посмотреть сообщения ядра, отправленные модулем zfs;
    • export - экспортировать пул для переноса в другую систему;
    • get - посмотреть параметры пула;
    • set - установить значение переменной;
    • history - отобразить историю команд zfs;
    • import - импортировать пул;
    • iostat - отобразить статистику ввода/вывода для выбранного пула zfs;
    • list - вывести список всех пулов;
    • offline/online - выключить/включить физическое устройство, данные на нем сохраняются, но их нельзя прочитать или изменить;
    • remove - удалить устройство из пула;
    • replace - перенести все данные со старого устройства не новое;
    • scrub - проверка контрольных сумм для всех данных;
    • status - вывести статус пула.

    Это были все основные опции команды, которые мы будем использовать. Теперь рассмотрим примеры настройки zfs и управления разделами.

    Как пользоваться ZFS

    Настройка ZFS не очень сильно отличается от Btrfs, все базовые действия выполняются очень просто, вы сами в этом убедитесь.

    Создание файловой системы

    Сначала посмотрим есть ли уже созданные пулы ZFS. Для этого выполните такую команду:

    Если вы устанавливаете эту файловую систему в первый раз, то здесь будет пустой список. Теперь создадим пул на основе существующего раздела, мы будем использовать раздел /dev/sda6

    sudo zpool create -f pool0 /dev/sda6

    Хотя вы можете использовать не только раздел, а целый диск. Теперь смотрим еще раз список пулов:

    Затем смотрим состояние нашего пула с помощью команды status, здесь выводится больше подробной информации. Если у вас есть несколько дисков, вы можете настроить RAID массив, чтобы данные хранились не на одном разделе, а синхронно копировались на несколько, это может в несколько раз увеличить производительность.

    sudo zpool create pool0 zraid /dev/sda /dev/sdb /dev/sdc

    Обратите внимание, что диски должны иметь одинаковый раздел. Если вам не нужен RAID, вы можете настроить обычное зеркалирование на второй диск. Это увеличивает надежность хранения данных:

    sudo zpool create pool0 mirror sda sdb

    Теперь данные будут писаться на оба диска. Такую же вещь можно проделать с разделами, но здесь нет смысла, поскольку если жесткий диск накроется, то данные вы потеряете, а прироста производительности не увидите. Вы можете использовать даже файлы, для создания файловых систем.

    Вы можете добавить новый жесткий диск или раздел к пулу:

    sudo zpool attach pool0 /dev/sdd

    Или удалить устройство из пула:

    sudo zpool detach pool0 /dev/sdd

    Чтобы удалить пул используйте команду destroy:

    sudo zpool destroy pool0

    Для проверки раздела на ошибки используйте команду scrub:

    sudo zpool scrub pool0

    Статистику использования пула можно посмотреть с помощью команды iostat:

    sudo zpool iostat pool0

    Файловые системы ZFS

    Теперь нужно создать файловые системы на только что созданном пуле. Создадим три файловые системы, data, files и media. Для этого используется команда zfs:

    sudo zfs create pool0/data
    $ sudo zfs create pool0/files
    $ sudo zfs create pool0/media

    Монтирование ZFS

    Точка монтирования для пула и для каждой созданной в нем файловой системы создается в корневом каталоге. Например, в нашем случае точки монтирования выглядят так:

    Или можно использовать такую команду:

    Чтобы размонтировать файловую систему для одного из созданных разделов используйте команду zfs umount:

    sudo zfs umount /pool0/data

    Затем можно ее обратно примонтировать:

    sudo zfs mount pool0/data

    Параметры файловой системы

    Кроме всего прочего, вы можете настроить различные параметры файловой системы ZFS, например, можно изменить точку монтирования или способ сжатия. Вы можете посмотреть все текущие параметры для файловой системы или пула с помощью команды:

    sudo zfs get all pool0/files

    Сначала включим сжатие:

    sudo zfs set compression=gzip pool0/files

    Затем отключим проверку контрольных сумм:

    sudo zfs set checksum=off pool0/files

    Смотрим точку монтирования:

    sudo zfs get mountpoint pool0/files

    Затем установим свою:

    sudo zfs set mountpoint=/mnt pool0/files

    Теперь раздел будет монтироваться в /mnt, настройки можно изменить для каждого из разделов.

    Снимки состояния ZFS

    Снапшоты zfs или снимки состояния могут использоваться восстановления данных. Благодаря особенностям файловой системы снимки можно создавать мгновенно. Для создания снимка просто наберите:

    sudo zfs snapshot pool0/files pool0/files@shot1

    Для восстановления используйте:

    sudo zfs rollback pool0/files@shot1

    Посмотреть список снимков вы можете командой:

    sudo zfs list -t snapshot

    А удалить ненужный снимок:

    sudo zfs destory pool0/files@shot1

    Выводы

    В этой статье мы рассмотрели как работает файловая система zfs, как выполняется настройка zfs и как ее использовать. Это очень перспективная файловая система, с огромным набором функций, которая способна сравняться, а в некоторых областях и обойти Btrfs. Надеюсь, эта информация была полезной для вас, если у вас остались вопросы, спрашивайте в комментариях!

    Для операционной системы , перенос которой на другие платформы вызвало всплеск диаметрально разных эмоций у разработчиков: от бурного восхищения и ликования, до прямо противоположного — раздражения и ярости.

    Попробуем ознакомиться с точкой зрения каждой из сторон, а также в причинах существования столь полярных оценок этой файловой системы. Но, прежде чем мы это сделаем, давайте хотя бы в общих чертах ознакомимся с её особенностями и свойствами:

    • 128-битная файловая система, что даёт возможность хранения практически неограниченных объёмов информации. На практике это значит, что ZFS теоретически может хранить объёмы информации, которые превышают сегодняшние технологические возможности, при условии использования текущего подхода к организации хранения данных;
    • Очень большое внимание уделяется целостности и надежности хранения, как пользовательских данных, так и метаданных ФС, для этого используются продвинутые алгоритмы хэширования;
    • Поддержка снапшотов (snapshot) и пулов хранения (storage pools), благодаря чему ZFS сочетает в себе возможности файловой системы и системы управления томами (новая концепция storage-пулов);
    • Отсутствие необходимости в fsck благодаря этой ФС;
    • Традиционно считается, что ZFS — это достаточно производительная файловая система. Впрочем, это утверждение иногда ставится под сомнение. Как минимум, конкретные цифры очень сильно зависят от типа задачи, на которой производится подобное сравнительное тестирование производительности;
    • Возможности для избирательного сжатия и/или шифрования отдельных файлов или файловых систем;
    • Поддержка автоматического распознавания и объединения (исключения) файлов-дубликатов;
    • ZFS не поддерживает квоты. Вернее сказать, её поддержка квот несколько своеобразна: понятие «выделение квоты» значит в терминологии ZFS то, что вы ограничиваете размер создаваемой файловой системы. Дизайн системы таков, что каждому пользователю ZFS следует выделять свою собственную файловую систему со всеми сопутствующими ограничениями;
    • Определенные проблемы создает не техническая особенность ФС — несовместимая с GPL лицензия на код (CDDL);
    • Чтобы показать инновационность ZFS не только в области технических решений, приведу, как пример, возможность управлять основными возможностями ФС через веб-интерфейс;
    • И , так как, повторюсь — ZFS чрезвычайно велик в своих возможностях и особенностях, и перечислить всех их здесь просто не представляется возможным.

    Конечно, если смотреть на эти возможности по отдельности, то они во многом не новы и встречаются в том или ином виде в других файловых системах, но такой единый комплекс из приведенных возможностей впервые представлен только в ZFS, что и делает её столь уникальной и интересной на данный момент.

    Если добавить сюда её относительно зрелый возраст и очень хорошее состояние в плане стабильности кода — становятся понятны те бури эмоций, которые вызвали новости о публикация её кода под открытой лицензией, а также портирование этой инновационной ФС на такие популярные ОС, как FreeBSD, Linux, MacOS X.

    Что касается резко отрицательных откликов на эту, вне всяких сомнений, уже знаменитую файловую систему, то они сводятся в основном к следующим тезисам. Один из ведущих разработчиков Linux, кстати, ответственный за поддержку её дисковой подсистемы, (Andrew Morton), разразился гневными обличениями ZFS в «чудовищном нарушении уровней реализации».

    Эндрю Мортан , ведущий разработчик дисковой подсистемы ядра Linux

    Некоторые другие разработчики присоединилась к его обвинениям в «жутком дизайне» ZFS, и на данный момент можно констатировать, что Андрея Мортана в адрес ZFS — «ужасное нарушение уровней дизайна » и «необоснованная мешанина из кода » — стали уже своего рода интернет-мемами, на которые заочно уже попытались ответить разработчики из Oracle, Linux, RedHat, FreeBSD и других известных проектов.

    В качества ответа на эти выпады, ведущего разработчика ZFS (Jeff Bonwick):

    «Все эти обвинения в нарушении дизайна уровней реализации файловой системы, оттого, что ZFS комбинирует в себе одновременно функциональность файловой системы, менеджера томов и программного RAID-контроллера. Я полагаю, что ответ на эту претензию будет зависеть от того, что понимать под обвинением „нарушает дизайн уровней“.

    В процессе разработки ZFS мы установили, что стандартный дизайн абстрагированных уровней дискового стека провоцирует удивительное количество ненужной сложности и избыточной логики. В процессе рефакторинга мы пришли к мнению, что единственное решение проблемы — это фундаментальный пересмотр границ слоев и их отношений, — что делает все сразу намного более простым».

    Какую бы позицию в отношении ZFS не занимали лично вы, следует признать как минимум одно: ZFS — это принципиально новая технология в индустрии файловых систем.