Ramadoni: оригинал
Перевод: Алексей Федорчук
ZFS — это комбинация файловой системы и системы управления логическими томами. Среди её функций — защита от повреждения данных, поддержка больших хранилищ данных, эффективное их сжатие, интеграция файловой системы и управления томами, снапшоты и клоны с «копированием при записи», непрерывная проверка целостности файловой системы и автоматическое восстановление, RAID-Z и «родные» ACL в NFSv4.
ZFS создавалась как открытый софт, распространяемый под Common Development and Distribution License (CDDL).
При рассмотрении ZFS выделяются следующие ключевые моменты:
целостность данных;
простое управление хранилищами с помощью всего двух команд — zpool
и zfs
;
возможность выполнения любых действий online (то есть без перезагрузки системы).
Полное описание всех доступных функций ZFS можно увидеть в подробной статье на Wikipedia (англ., русская версия здесь).
В этом руковостве дана пошаговая инструкция по установке файловой системы ZFS в Debian 8.1 (Jessie). Будут описаны создание и настройка пулов типа RAID0 (stripe — «с расщеплением»), RAID1 (Mirror — с зеркалированием) и RAID-Z (parity — с контролем чётности), а также настройка файловых систем с ZFS.
Согласно сведениям официального сайта проекта ZFS on Linux, ZFS поддерживается только для 64-разрядных процессоров AMD и Intel. Начнём с установки.
Требования
Debian 8.1 с 64-разрядным ядром;
права администратора.
Шаг 1: апдейт репозиториев и системы Debian Linux
Для установки ZFS нужно скачать и установить пакет zfsonlinux
. Это добавит в систему файлы /etc/apt/sources.list.d/zfsonlinux.list
и /etc/apt/trusted.gpg.d/zfsonlinux.gpg
. После этого zfs
устанавливается как любой другой пакет командой apt-get
(или apt
). Преимущество использования официального репозитория — в возможности автоматического обновления с помощью apt-get update && apt-get upgrade
.
Авторизуйте на машине Debian, получите права администратора и выполните следующие команды:
# uname -a Linux debian-zfs 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1 (2015-05-24) x86_64 GNU/Linux # wget http://archive.zfsonlinux.org/debian/pool/main/z/zfsonlinux/zfsonlinux_6_all.deb # dpkg -i zfsonlinux_6_all.deb # apt-get update
Шаг 2: установка zfsonlinux
Zfsonlinux имеет много зависимостей, которые будут автоматически разрешаться с помощью apt
, что займёт некоторое время. Когда установка будет завершена, потребуется перезагрузить машину.
# apt-get install lsb-release # apt-get install debian-zfs # shutdown -r now
Шаг 3: создание и настройка пула
После перезагрузки убедитесь, что zfsonlinux установлен и работает правильно:
# dpkg -l | grep zfs ii debian-zfs 7~jessie amd64 Native ZFS filesystem metapackage for Debian. ii libzfs2 0.6.5.2-2 amd64 Native ZFS filesystem library for Linux ii zfs-dkms 0.6.5.2-2 all Native ZFS filesystem kernel modules for Linux ii zfsonlinux 6 all archive.zfsonlinux.org trust package ii zfsutils 0.6.5.2-2 amd64 command-line tools to manage ZFS filesystems
Данный вывод показывает, что zfsonlinux
установлен нормально, и можно создавать первый пул.
Далее в пул добавляется 5 дисков, по 2 ГБ каждый. Сначала — проверка их доступности:
# ls /dev/sd* /dev/sda /dev/sda1 /dev/sda2 /dev/sda5 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg
Мы видим диски с /dev/sda
по , однако
/dev/sda
используется самим Debian’ом. Так что в пул ZFS будут включены диски с /dev/sdb
по .
Теперь создаём пул, для первого раза — типа RAID0 (stripe).
Сначала у нас ничего нет:
# zpool list no pools available
Затем:
# zpool create -f pool0 /dev/sdb # zpool list NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT pool0 1.98G 64K 1.98G - 0% 0% 1.00x ONLINE -
Команда zpool list
показывает, что пул типа RAID0, с именем pool0
, объёмом 2 ГБ, создан успешно.
Затем из оставшихся дисков создаётся пул типа RAID1 (mirror):
# zpool create -f pool1 mirror /dev/sdc /dev/sdd # zpool list NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT pool0 1.98G 64K 1.98G - 0% 0% 1.00x ONLINE - pool1 1.98G 64K 1.98G - 0% 0% 1.00x ONLINE -
Теперь можно видеть два пула, pool0
типа raid0
и pool1
типа raid1
.
Для проверки статуса пулов используется следующая команда:
# zpool status pool: pool0 state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM pool0 ONLINE 0 0 0 sdb ONLINE 0 0 0 errors: No known data errors pool: pool1 state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM pool1 ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 errors: No known data errors
В выводе команды zpool status
видно различие между pool0
и pool1
: pool0
имеет только один диск, а pool1
имеет два диска типа зеркало.
Затем мы создадим пул с RAID-Z — это схема распределения данных с контролем чётности, подобно RAID 5, но использующая динамическое «расщепление»: каждый блок имеет свою собственную «полосу пропускания», независимо от его размера. В результате каждая запись в RAID-Z выглядит как запись с полным «расщеплением».
RAID-Z требует минимум три жёстких диска, и представляет собой компромисс между RAID 0 и RAID 1. Если если один диск в пуле RAID-Z умирает, просто замените его, и ZFS автоматически перестроит данные на основе информации о чётности с других дисков. Потеря всей информации в пуле RAID-Z происходит только при смерти двух дисков хранения, два диска должны были бы умереть. Для ещё большей избыточности можно использовать RAID 6 (RAID-Z2 в случае ZFS), обеспечивающий двойной контроль чётности.
Однако давайте создадим пул RAID-Z с одинарным паритетом:
# zpool create -f poolz1 raidz sde sdf sdg # zpool list poolz1 NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT poolz1 5.94G 117K 5.94G - 0% 0% 1.00x ONLINE -
Проверим результат:
# zpool status poolz1 pool: poolz1 state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM poolz1 ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 sde ONLINE 0 0 0 sdf ONLINE 0 0 0 sdg ONLINE 0 0 0 errors: No known data errors
И поглядим на размер пула:
# df -h /poolz1 Filesystem Size Used Avail Use% Mounted on poolz1 3.9G 0 3.9G 0% /poolz1
Из чего видно, что при суммарном объёме дисков в 6 ГБ объём пула составляет 4 ГЮ, а 2ГБ используется для хранения контрольных сумм.
Теперь создадим RAID-Z2 (aka RAID 6). Дл я этого потребуется удалить существующие пулы, потому что доступных дисков больше нет:
# zpool list NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT pool0 1.98G 64K 1.98G - 0% 0% 1.00x ONLINE - pool1 1.98G 64K 1.98G - 0% 0% 1.00x ONLINE - poolz1 5.94G 117K 5.94G - 0% 0% 1.00x ONLINE -
Для удаления пула используется команда zpool destroy
:
# zpool destroy pool0 # zpool destroy pool1 # zpool destroy poolz1 # zpool list no pools available
По удалении бывших пулдов можно создать новый пул RAID-Z2:
# zpool create poolz2 raidz2 sdb sdc sdd sde # zpool list NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT poolz2 7.94G 135K 7.94G - 0% 0% 1.00x ONLINE -
Смотрим объём:
# df -h /poolz2 Filesystem Size Used Avail Use% Mounted on poolz2 3.9G 0 3.9G 0% /poolz2
Проверяем статус:
# zpool status poolz2 pool: poolz2 state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM poolz2 ONLINE 0 0 0 raidz2-0 ONLINE 0 0 0 sdb ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors
Можно видеть, что при суммарном объёме дисков в 8 ГБ пул занимает 4 ГБ, а 4 ГБ используются для хранения удвоенного количества контрольных сумм.
Шаг 4: моделирование дисковых сбоев
Здесь мы воспроизведём ситуацию с фатальным отказом одного из дисков в пуле poolz2
. Для чего создаём в нём файл:
# echo "Test Only" > /poolz2/test.txt # cat /poolz2/test.txt Test Only
Перед моделированием отказа следует проверить статус пула poolz2
и всех входящих в него дисков, всё это должно быть в статусе Online.
Сам отказ моделируется записью случайных данных на устройство /dev/sdb
командой dd
:
# dd if=/dev/urandom of=/dev/sdb bs=1024 count=20480 # zpool scrub poolz2 # zpool status pool: poolz2 state: ONLINE status: One or more devices has experienced an unrecoverable error. An attempt was made to correct the error. Applications are unaffected. action: Determine if the device needs to be replaced, and clear the errors using 'zpool clear' or replace the device with 'zpool replace'. see: http://zfsonlinux.org/msg/ZFS-8000-9P scan: scrub repaired 17K in 0h0m with 0 errors on Tue Dec 8 22:37:49 2015 config: NAME STATE READ WRITE CKSUM poolz2 ONLINE 0 0 0 raidz2-0 ONLINE 0 0 0 sdb ONLINE 0 0 25 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors
Как можно видеть, на одном или нескольких дисках произошла неустранимая ошибка. В данном случае диск /dev/sdb заменяется на диск /dev/sdr
:
# zpool replace poolz2 sdb sdf # zpool status pool: poolz2 state: ONLINE scan: resilvered 49.5K in 0h0m with 0 errors on Tue Dec 8 22:43:35 2015 config: NAME STATE READ WRITE CKSUM poolz2 ONLINE 0 0 0 raidz2-0 ONLINE 0 0 0 sdf ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors
После замены дисков сообщение об ошибке исчезло, и созданный ранее тестовый файл опять доступен:
# cat /poolz2/test.txt Test Only
Так что теперь мы знаем, как создавать и настраивать пулы ZFS.
Шаг 5: создание и настройка файловых систем ZFS
Теперь узнаем, как создавать и настраивать файловые системы ZFS.
# zfs list NAME USED AVAIL REFER MOUNTPOINT poolz2 105K 3.83G 26.1K /poolz2
То есть одна файловая систему уже есть, она была создана автоматически при создании пула ZFS. Теперь создадим другие файловые системы:
# zfs create poolz2/tank # zfs list NAME USED AVAIL REFER MOUNTPOINT poolz2 132K 3.83G 26.1K /poolz2 poolz2/tank 25.4K 3.83G 25.4K /poolz2/tank
Проверим объём:
# df -h | grep poolz2 poolz2 3.9G 128K 3.9G 1% /poolz2 poolz2/tank 3.9G 128K 3.9G 1% /poolz2/tank
Просто, не так ли? Была создана новая файловая система ZFS с именем tank, автоматически смонтированная в /poolz2/tank
. Для определения более иной точки монтирования ту же команду надо дать в таком виде:
# zfs create poolz2/data -o mountpoint=/data # df -h | grep poolz2 poolz2 3.9G 0 3.9G 0% /poolz2 poolz2/tank 3.9G 0 3.9G 0% /poolz2/tank poolz2/data 3.9G 0 3.9G 0% /data
Если требуется изменить указанную ранее точку монтирования, используется такая команда:
# zfs set mountpoint=/tank poolz2/tank # df -h | grep poolz2 poolz2 3.9G 0 3.9G 0% /poolz2 poolz2/data 3.9G 0 3.9G 0% /data poolz2/tank 3.9G 0 3.9G 0% /tank
Дляьщтеирования и отмонтирования файловых систем используются такие команды:
# zfs unmount /data # df -h | grep poolz2 poolz2 3.9G 0 3.9G 0% /poolz2
и
# zfs mount poolz2/data # df -h | grep poolz2 poolz2 3.9G 0 3.9G 0% /poolz2 poolz2/tank 3.9G 0 3.9G 0% /tank poolz2/data 3.9G 0 3.9G 0% /data
Удаление файловых систем делается очень просто:
# zfs destroy poolz2/data # zfs list NAME USED AVAIL REFER MOUNTPOINT poolz2 152K 3.83G 26.1K /poolz2 poolz2/tank 25.4K 3.83G 25.4K /tank
Файловая система /data
удалена.
Заключение
ZFS — революционная файловая система, которая принципиально меняет способы управления файловыми системами в Unix-подобных операционках. ZFS мощная, масштабируема и проста в управлении.