ZFS — лучшая файловая система (пока). ZFS в порядке сжатия и дедупликации linux 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. Надеюсь, эта информация была полезной для вас, если у вас остались вопросы, спрашивайте в комментариях!

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

WARNING!

Некоторые описываемые здесь команды способны необратимо уничтожить твои данные. Трижды проверяй введенное, прежде чем нажимать Enter.

Пожалуй, прежде чем перейти к практике, нужно дать некоторые пояснения, что собой представляют файловые системы нового поколения. Начну с ZFS. Эта ФС была разработана для Solaris и в настоящее время, поскольку Oracle закрыла исходный код, форкнута в версию OpenZFS. В дальнейшем под ZFS будет подразумеваться именно форк. Вот лишь некоторые из ключевых особенностей ZFS:

  • огромный до невообразимости максимальный размер ФС;
  • пулы хранения, которые позволяют объединять несколько разных устройств;
  • контрольные суммы уровня файловой системы, при этом есть возможность выбирать алгоритм;
  • основана на принципе COW - новые данные не перезаписывают старые, а размещаются в других блоках, что открывает такие возможности, как снапшоты и дедупликация данных;
  • сжатие данных на лету - как и в случае с контрольными суммами, поддерживается несколько алгоритмов;
  • возможность управлять файловой системой без перезагрузки.

Btrfs начала разрабатываться в пику ZFS компанией Oracle - еще до покупки Sun. Я не буду описывать ее особенности - они в ZFS и Btrfs, в общем-то, схожи. Отличия же от ZFS таковы:

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

Знакомство с ZFSonLinux

Для установки ZFSonLinux потребуется 64-разрядный процессор (можно и 32, но разработчики не обещают стабильности работы в таком случае) и, соответственно, 64-разрядный дистрибутив с ядром не ниже 2.6.26 - я использовал Ubuntu 13.10. Памяти тоже должно быть достаточно - не менее 2 Гб. Предполагается, что основные пакеты, необходимые для сборки и компиляции модулей и ядра, уже установлены. Накатываем дополнительные пакеты и качаем нужные тарболлы:

$ sudo apt-get install alien zlib1g-dev uuid-dev libblkid-dev libselinux-dev parted lsscsi wget $ mkdir zfs && cd $_ $ wget http://bit.ly/18CpniI $ wget http://bit.ly/1cEzO0V

Распаковываем оба архива, но сперва собираем SPL - слой совместимости с Solaris, а уж затем собственно ZFS. Отмечу, что, поскольку мы ставим свежайшую версию ZFSonLinux, DKMS (механизм, позволяющий автоматически перестраивать текущие модули ядра с драйверами устройств после обновления версии ядра) недоступен, и в случае обновления ядра придется собирать пакеты заново вручную.

$ tar -xzf spl-0.6.2.tar.gz $ tar -xzf zfs-0.6.2.tar.gz $ cd spl-0.6.2 $ ./configure $ make deb-utils deb-kmod

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

$ sudo dpkg -i *.deb

Наконец, собираем и ставим ZFS:

$ cd ../zfs-0.6.2 $ ./configure $ make deb-utils deb-kmod $ sudo dpkg -i *.deb


Перенос корневой ФС на ZFS с шифрованием и созданием RAIDZ

Предположим, ты хочешь получить безопасную, зашифрованную, но в то же время отказоустойчивую файловую систему. В случае с классическими ФС старого поколения тебе пришлось бы выбирать между шифрованием и отказоустойчивостью, поскольку эти вещи несколько несовместимы. В ZFS, однако, существует возможность «склеить» их между собой. Современная проприетарная реализация этой ФС поддерживает шифрование. Открытая реализация с версией пула 28 это не поддерживает - но ничто не мешает с помощью cryptsetup создать том (или несколько томов) LUKS и уже поверх них разворачивать пул. Что до отказоустойчивости ZFS, поддерживается создание мультидисковых массивов. Технология эта называется RAIDZ. Различные ее варианты позволяют пережить отказ от одного до трех дисков, и она, в силу некоторых особенностей ZFS, свободна от одного из фундаментальных недостатков традиционных stripe + parity RAID-массивов - write hole (ситуация с RAID 5 / RAID 6, когда при активных операциях записи и отключении питания данные на дисках в итоге отличаются).

INFO

Шифрование замедляет работу с данными. Не стоит его использовать на старых компьютерах.

Конечно, проще всего, если у тебя не стоит никакой системы - в этом случае заморачиваться придется меньше. Но живем мы не в идеальном мире, поэтому расскажу о том, как перенести уже установленную систему без раздела /boot на массив RAIDZ поверх томов LUKS.

Перво-наперво нужно создать сам этот раздел - без него перенос будет невозможен, поскольку система банально не загрузится. Предположим для простоты, что на диске имеется единственный раздел с Ubuntu, а хотим мы создать RAIDZ первого уровня (аналог RAID 5, для него требуется минимум три устройства, RAIDZ же больших уровней в домашних условиях смысла делать я не вижу). Создаем с помощью предпочитаемого редактора разделов два раздела - один размером 256–512 Мб, где и будет размещен /boot , и еще один, с размером не меньше текущего корневого, причем последнюю процедуру повторяем на всех трех жестких дисках. Перечитаем таблицу разделов командой

# partprobe /dev/disk/by-id/ata-VBOX_HARDDISK_VB203f5b52-a7ff5309

и создадим файловую систему (ext3) на разделе поменьше:

# mke2fs -j /dev/disk/by-id/ata-VBOX_HARDDISK_VB203f5b52-a7ff5309-part2 -L boot

Разумеется, в твоем случае идентификаторы жестких дисков будут другими. Вслед за этим нужно зашифровать раздел, на котором будет находиться том LUKS, и повторить эту процедуру для всех остальных разделов, на которых в конечном счете будет находиться массив RAIDZ:

# cryptsetup -h=sha512 -c=aes-cbc-essiv:sha256 -s=256 -y luksFormat /dev/disk/by-id/ata-VBOX_HARDDISK_VB203f5b52-a7ff5309-part3 # cryptsetup -h=sha512 -c=aes-cbc-essiv:sha256 -s=256 -y luksFormat /dev/disk/by-id/ata-VBOX_HARDDISK_VB2fdd0cb1-d6302c80-part1 # cryptsetup -h=sha512 -c=aes-cbc-essiv:sha256 -s=256 -y luksFormat /dev/disk/by-id/ata-VBOX_HARDDISK_VB781404e0-0dba6250-part1

Подключаем зашифрованные тома:

# cryptsetup luksOpen /dev/disk/by-id/ata-VBOX_HARDDISK_VB203f5b52-a7ff5309-part3 crypto0 # cryptsetup luksOpen /dev/disk/by-id/ata-VBOX_HARDDISK_VB2fdd0cb1-d6302c80-part1 crypto1 # cryptsetup luksOpen /dev/disk/by-id/ata-VBOX_HARDDISK_VB781404e0-0dba6250-part1 crypto2

И создаем пул ZFS:

# zpool create -o ashift=12 zroot raidz dm-name-crypto0 dm-name-crypto1 dm-name-crypto2

Следом создаем две вложенные друг в друга файловые системы:

# zfs create zroot/ROOT # zfs create zroot/ROOT/ubuntu-1310-root

Отмонтируем все файловые системы ZFS и устанавливаем некоторые свойства ФС и пула:

# zfs umount -a # zfs set mountpoint=/ zroot/ROOT/ubuntu-1310-root # zpool set bootfs=zroot/ROOT/ubuntu-1310-root zroot

Наконец, экспортируем пул:

# zpool export zroot



Перенос и конфигурация системы

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

# mkdir /mnt/boot # mount /dev/disk/by-label/boot /mnt/boot # cp -r /boot/* /mnt/boot/ # umount /mnt/boot

После этого перенесем grub на отдельный раздел /boot , для чего добавим в /etc/fstab cтрочку

# <...> LABEL=boot /boot ext3 errors=remount-ro 0 0

Монтируем и перегенерируем конфиг grub:

# grub-mkconfig -o /boot/grub/grub.cfg

Для проверки перезагружаемся. Если все нормально, удаляем старое содержимое каталога /boot , не забыв предварительно отмонтировать раздел.

Пришло время клонировать Ubuntu. Весь процесс клонирования описан в полной версии статьи, которую можно найти на сайте ][, здесь же затрону некоторые тонкости, относящиеся к ZFS. Для нормальной загрузки с пула ZFS нужны некоторые скрипты initramfs. К счастью, изобретать их не нужно - они лежат на GitHub. Скачиваем репозиторий (все действия производим в chroot):

# git clone http://bit.ly/1esoc8i

И копируем файлы в необходимые места. Я внес единственную правку: вместо пула rpool поставил zroot. Теперь нужно записать hostid в файл /etc/hostid . Это нужно сделать из-за того, что ZFS портирована с Solaris, и слой совместимости требует его наличия:

# hostid >/etc/hostid

Наконец, нужно сгенерировать initramfs. Ни в коем случае не используй update-initramfs . Он перезаписывает существующий файл, и, если возникнут трудности, загрузиться с нормальной системы будет проблематично. Вместо него используй команду

# mkinitramfs -o /boot/initrd.img-$(uname -r)-crypto-zfs

Раздел /boot должен быть подмонтирован.

Затем нужно добавить пункт меню в grub. По причине достаточно хитрой конфигурации (еще бы: три криптотома, поверх которых расположена не совсем типичная для Linux файловая система) в chroot это сделать не получилось, поэтому выходим из него в основную (пока еще) систему и добавляем примерно такие строчки:

# vi /etc/grub.d/40_custom menuentry "Ubuntu crypto ZFS" { # <...> linux /vmlinuz-3.11.0-14-generic boot=zfs rpool=zroot initrd /initrd.img-3.11.0-14-generic-crypto-zfs }

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

Тюнинг ZFS и полезные трюки c Btrfs

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

В случае же использования Btrfs никаких особых проблем не наблюдается. Тем не менее какие-то тонкости все же имеют место - в особенности если есть желание не просто «поставить и забыть», а задействовать новые возможности. О некоторых из них я и расскажу ниже.

Отключение изменения времени доступа к файлам и оптимизация для SSD-накопителей

Как известно, в *nix-системах каждый раз при обращении к файлам время доступа к ним меняется. Это всякий раз провоцирует запись на носитель. Если ты работаешь одновременно с множеством файлов или у тебя SSD-накопитель, это может оказаться неприемлемым. В классических файловых системах для отключения записи atime нужно было добавить параметр noatime в опции команды mount или в /etc/fstab . В ZFS же для отключения используется следующая команда (конечно, в твоем случае ФС может быть другой):

# zfs set atime=off zroot/ROOT/ubuntu-1310-root

В Btrfs, помимо вышеупомянутой опции noatime, имеется опция ssd и более оптимизирующая ssd_spread. Первая из них начиная с ядра 2.6.31, как правило, устанавливается автоматически, вторая предназначена для дешевых SSD-накопителей (ускоряет их работу).

ZFS - дублирование файлов

При работе с очень важными данными порой возникает пугающая мысль, что отключат электроэнергию или выйдет из строя один из жестких дисков. Первое в российских условиях очень даже возможно, а второе хоть и маловероятно, но тоже случается. К счастью, разработчики ZFS, по-видимому, сталкивались с подобным не раз и добавили опцию дублирования данных. Файлы при этом, если возможно, размещаются на независимых дисках. Предположим, у тебя есть ФС zroot/HOME/home-1310 . Для установки флага дублирования набери следующую команду:

# zfs set copies=2 zroot/HOME/home-1310

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

Отключение автомонтирования в ZFS

При подключении пула по умолчанию автоматом монтируются все вложенные файловые системы. Это может вызвать некоторый конфуз, поскольку, например, в случае с приведенной выше конфигурацией пользователю не нужен доступ ни к zroot , ни к zroot/ROOT . Существует возможность отключить автомонтирование с помощью двух следующих команд (для данного случая):

# zfs set canmount=noauto zroot/ROOT # zfs set canmount=noauto zroot

Сжатие данных

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

# zfs set compression=on zroot/ROOT/var-log

В Btrfs для включения сжатия нужно поставить опцию compress в /etc/fstab .

Автоматическое создание снапшотов в ZFS

Как известно, ZFS позволяет создавать снапшоты. Ручками, однако, их создавать лениво, да и есть вероятность попросту забыть об этом. В Solaris для автоматизации этой процедуры имеется служба Time Slider, но она - вот незадача! - хоть и использует функции ZFS, в ее состав не входит, поэтому в ZFSonLinux ее нет. Но огорчаться не стоит: имеется скрипт для автоматического их создания и для Linux. Скачаем его и установим нужные права:

# wget -O /usr/local/sbin/zfs-auto-snapshot.sh http://bit.ly/1hqcw3r # chmod +x /usr/local/sbin/zfs-auto-snapshot.sh

Изменим сперва префикс для снапшотов, поскольку по умолчанию он не особо «говорящий». Для этого изменим в скрипте параметр opt_prefix с zfs-auto-snap на snapshot . Затем установим некоторые переменные файловой системы:

# zfs set com.sun:auto-snapshot=true zroot/ROOT/ubuntu-1310-root # zfs set snapdir=visible zroot/ROOT/ubuntu-1310-root

Первый параметр нужен для скрипта, второй же открывает прямой доступ к снапшотам, что тоже нужно для скрипта.

Теперь можно уже создавать скрипт для cron (/etc/cron.daily/autosnap). Рассмотрим случай, когда нужно создавать снапшоты каждый день и хранить их в течение месяца:

#!/bin/bash ZFS_FILESYS="zroot/ROOT/ubuntu-1310-root" /usr/local/sbin/zfs-auto-snapshot.sh --quiet --syslog --label=daily --keep=31 "$ZFS_FILESYS"

Для просмотра созданных снапшотов используй команду zfs list -t snapshot , а для восстановления состояния - zfs rollback имя_снапшота.

ZFS - комплексный пример

Ниже будут приведены команды, создающие несколько ФС в пуле для разных целей и демонстрирующие гибкость ZFS.

# zfs create -o compression=on -o mountpoint=/usr zroot/ROOT/usr # zfs create -o compression=on -o setuid=off -o mountpoint=/usr/local /zroot/ROOT/usr-local # zfs create -o compression=on -o exec=off -o setuid=off -o mountpoint=/var/crash zroot/ROOT/var-crash # zfs create -o exec=off -o setuid=off -o mountpoint=/var/db zroot/ROOT/var-db # zfs create -o compression=on -o exec=off -o setuid=off -o mountpoint=/var/log zroot/ROOT/var-log # zfs create -o compression=gzip -o exec=off -o setuid=off -o mountpoint=/var/mail zroot/ROOT/var-mail # zfs create -o exec=off -o setuid=off -o mountpoint=/var/run zroot/ROOT/var-run # zfs create -o exec=off -o setuid=off -o copies=2 -o mountpoint=/home zroot/HOME/home # zfs create -o exec=off -o setuid=off -o copies=3 -o mountpoint=/home/rom zroot/HOME/home-rom

Дефрагментация Btrfs

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

# btrfs filesystem defrag /

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

RAID на Btrfs

Как и в случае с ZFS, Btrfs поддерживает многотомные массивы, но в отличие от ZFS называются они классически. На данный момент, однако, поддерживаются только RAID 0, RAID 1 и их комбинация, RAID 5 по-прежнему на этапе альфа-тестирования. Для создания нового массива RAID 10 попросту используй такую команду (с твоими устройствами):

# mkfs.btrfs /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1

Ну а если нужно сконвертировать существующую ФС в RAID, то и для этого есть команды:

# btrfs device add /dev/sdb1 /dev/sdc1 /dev/sdd1 / # btrfs balance start -dconvert=raid10 -mconvert=raid10 /

Первая команда добавляет устройства к файловой системе, вторая же как раз и перебалансирует все данные и метаданные для преобразования этого набора томов в массив RAID 10.

Снапшоты Btrfs

Естественно, Btrfs поддерживает снапшоты - причем помимо обычных снапшотов доступны снапшоты с возможностью записи (более того, они и создаются по умолчанию). Для создания снапшотов используется следующая команда:

# btrfs subvol snap -r / /.snapshots/2013-12-16-17-41

Подробнее о создании снапшотов, как ручном, так и автоматическом, можно прочитать в статье «Подушка безопасности», опубликованной в апрельском номере ][ за 2013 год. Здесь же я расскажу, как при наличии снапшота отследить, какие файлы изменились с момента его создания. Для этого в Btrfs есть так называемое поколение файлов. Возможность эта используется для внутренних целей, но есть команда, позволяющая смотреть список последних изменений - ею и воспользуемся. Сначала узнаем текущее поколение файлов:

# btrfs subvol find-new / 99999999

Если такого поколения нет (в чем можно практически не сомневаться), выведется последнее. Теперь эту же самую команду выполним над снапшотом:

# btrfs subvol find-new /.snapshots/2013-12-17-14-28 99999999

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

# btrfs subvol find-new / 96 | awk "{ print $17 }" | sort | uniq

NILFS2 - еще одна файловая система с поддержкой COW

Начиная с ядра 2.6.30 в Linux появилась поддержка еще одной ФС - NILFS2. Аббревиатура эта расшифровывается как new implementation of a log-structured file system. Основная особенность данной ФС заключается в том, что раз в несколько секунд в ней автоматически создаются чек-пойнты - примерный аналог снапшотов с одним отличием: спустя какое-то время они удаляются сборщиком мусора. Пользователь, тем не менее, может преобразовать как чек-пойнт в снапшот, в результате чего для сборщика мусора он становится невидимым, так и наоборот. Таким образом, NILFS2 можно рассматривать как своеобразную «Википедию», где фиксируются любые изменения. Из-за этой особенности - писать любые новые данные не поверх существующих, а в новые блоки - она прекрасно подходит для SSD-накопителей, где, как известно, перезапись данных не приветствуется.

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

Заключение

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

С другой стороны, как бы ни была хороша ZFS, по лицензионным соображениям она вряд ли когда-нибудь будет включена в mainline kernel. Так что, если не появится какой-нибудь еще конкурент, придется пользоваться Btrfs.

Facebook и Btrfs

В ноябре 2013 года лидер команды разработчиков Btrfs Крис Мейсон перешел на работу в Facebook. Это же сделал и Джозеф Бацик, мейнтейнер ветки btrfs-next. Они вошли в состав отдела компании, специализирующегося на низкоуровневых разработках, где и занимаются ныне ядром Linux - в частности, работают над Btrfs. Разработчики заявили также, что Facebook заинтересована в развитии 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. Причем получалось, что и памяти и процессора она требует не по детски. Остался вопрос - и зачем? Сразу скажу, что не претендую на полноту и пр. Что такое zfs можно взглянуть в Википедии. Заинтересовавшимся серьёзнее советую нагуглить zfs administration guide (вроде бы был и по русски). Моё намерение - объяснить зачем вдруг дома файловая система корпоративного уровня. Прим. У читателя, особенно второй части поcта, предполагается уверенное понимание того, что такое дисковые массивы, напр. RAID5. Если понимания нет - вряд ли такие массивы стоит дома самому строить и этот текст читать.


    1. Целостность файловой системы . Каждый сталкивался с ситуацией, когда файловую систему приходилось чинить. Успешно или не очень. zfs построена так, что в ней даже нет утилиты вроде виндовой chkdsk или линуксовой fsck. Ситуация, когда файловая система оказалась в противоречивом состоянии, просто невозможна. Реализовано через Copy-on-write (данные пишем не поверх старых, а выделяем новый блок, пишем туда, если все ОК - заменяем указатель со старых данных на новые. Подробнее - см гугл). В результате логическая структура диска не испортится из-за того, что-то не вовремя отключили или свет отрубился. Ну разве записанное в последние 10 сек пропадет. (впрочем, диск может и физически сгореть при играх с электричеством).

    2. Уверенность, что не прочитаешь мусор, думая, что читаешь данные . Железо несовершенно. Например, если дребезжат контакты на SATA кабелях, на диск будет записано совсем не то, что было в памяти. И никто, замечу, долгое время об этом не узнает. Мой профессиональный опыт связан с полиграфией. Не раз приходилось на выводе видеть картинку до середины нормальную - а дальше шум. zfs хранит с каждым блоком данных его контрольную сумму. При считывании данных сумма автоматически сличается. Казалось бы, так просто...

    3. Уверенность, что хранимые данные не протухли . Да, данные при хранении имеют тенденцию портиться. Что хорошо известно тем, кто поверил маркетингу производителей DVD болванок про 100 лет и записал на них свои архивы. Особенно это важно для "холодных" данных, долгое время лежащих без движения. Архивах, старых фото и т.п. Проверить данные вроде как просто - надо их считать и сличить контрольные суммы. Для zfs, понятно - достаточно файлы прочитать. Для регулярной проверки есть команда, в фоновом режиме все проверяющая.

    4. Снимки файловой системы. Легкость запоминания состояния файловой системы на данный момент времени, хранение таких снимков и откат к ним при необходимости. Защищает от дурацких действий человека. Модель Copy-on-write просто располагает к такой функциональности - блоки удаленных или перезаписанных данных просто не освобождаем, а ссылки на них храним в снимке. В результате снимок занимает места столько, сколько содержит измененных по сравнению текущим моментом данных, а не весь объем данных.

    Это все было для данных без избыточности, типа одиночного диска. Но zfs позволяет формировать массивы с избыточностью , подобные (и превосходящие) RAID1 (зеркало), RAID5 (избыточность в размере одного диска), RAID6 (двух) и даже "RAID7" (сохраняющий данные при выходе их строя любых трех дисков массива). Массивы можно объединять, получая что-то вроде RAID10 или RAID50. И чем же zfs массивы лучше?

    5. Аппаратная независимость . Чтобы сделать аппаратный RAID5, тем более RAID6, нужен дорогой RAID контроллер. zfs raidz - вариант программного RAID, требуются только доступ к дискам, например SATA порты. zfs raidz вполне может быть построен на портах разных контроллеров и из дисков разных моделей (в использовании разных моделей дисков есть и плюсы и минусы). И перенесен чуть не на любое железо, куда можно подключить диски. Я, например, неоднократно переставлял диски между SATA портами, прозрачно импортировал массив, созданный в режиме IDE на контроллере, в ACHI режиме и на SAS контроллере. Хотя операционная система нумерует диски по портам и определяет IDE, ACHI и SAS диски по-разному, zfs все это способен молча отработать (до определенных пределов, конечно. Сдуру что хочешь можно сломать.)

    6. Отсутствие Дыры по Записи . (Wiki) То есть разрушения данных, если диск массива не может принять данные. Дорогие RAID контроллеры оборудуют батарейками, которые позволяют много дней хранить данные, не успевшие попасть на диск, и записывать их в массив при появлении возможности.

    7. Устойчивость при сбое диска . Пусть у нас одинаковые RAID5 и zfs raidz1. В каждом из них сбоит один из дисков, меняем его на новый. И в процессе замены (а она занимает многие часы для больших массивов) не читается блок на одном из оставшихся дисков массива.

    Для RAID5 в большинстве случаев это катастрофа. Массив объявляется сбойным не читаемым, несем его профессионалам, которые за круглую сумму инфу будут восстанавливать.

    Для zfs raidz1 сообщается на какие файлы пришлись сбойные блоки, остальное синхронизируется. А если с заменяемого диска хоть что-то читается и от компа его не отключали - информация с него тоже будет использована для синхронизации. И с высокой степенью вероятности данные вообще не потеряем.

    8. Работа с полезными данными, а не всем массивом . Например, если я заменяю диск в RAID5 массиве, время восстановления зависит от объема массива. Если в zfs raid1 - от объема записанной в массив информации, тк не используемое для данных место не будет синхронизироваться.

    Преимуществ еще много, но мне для дома интереснее именно эти. В корпоративном применении - есть и другие (сжатие данных, дедупликация...). Упомяну важные для меня недостатки .

    1. Нарастить raidz массив на один диск нельзя . Можно заменить все терабайтные диски на тритеры - и увеличить объем. Можно собрать из 3 (и более) дисков еще один raidz и добавить его к существующему. Но превратить raidz1 из 5 дисков в raidz1 из 6 можно только слив куда-то информацию, разрушив массив и создав новый.

    2. Массив нельзя уменьшить . Можно только увеличивать. Например, заменить в массиве терабайтные винты на двухтерабайтные - можно. А на полутерабайтные - нельзя, даже если в массиве хранится 1 килобайт инфы.
    Можно подсоединить к массиву еще один - а отсоединить нельзя. Все такие процедуры - только через сохранение инфы куда-то вовне, разрушение массива и создание нового.

    3. Ресурсоемкость . zfs постоянно считает контрольные суммы, что создает нагрузку на процессор и жрет под кеши память. В корпоративном применении есть мнение - гигабайт памяти на терабайт массива. Дома мне хватает 330 атома и 4 Гб памяти (а раньше и на 2 Гб работало - особой разницы не увидел). Хотя атома для полной утилизации гигабитной сети мне не хватает, но 40-50мб/с мои потребности закрывает.. А вот если железо старое и еще значительно слабее - zfs не для Вас.

    Да, напомню, если понравилось - в NAS4free , которому и посвящен весь цикл постов, управление NAS, включая операции с zfs, идет через понятный новичку веб интерфейс.

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

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

    • 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 — это принципиально новая технология в индустрии файловых систем.



    
    Top