Установка и конфигурирование ZFS on Linux в Debian Jessie 8.1

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 мощная, масштабируема и проста в управлении.

Добавить комментарий