Главная
Главная Руководства FreeBSD › FreeBSD 10, работаем с zfs



Автор:

Статья опубликована: 2017-02-03 20:45:53
Последние правки: 2018-07-17 15:31:38

FreeBSD 10, устанавливаем на файловую систему zfs.

  • Сначала немного теории

    Основой ZFS является пул хранения данных [zpool]. В нем может быть одно или объединяться несколько физических устройств хранения – дисков или дисковых разделов, причём рекомендуется использовать диски.

    Пул состоит из одного или нескольких виртуальных устройств [vdev]. В качестве таковых могут выступать устройства без избыточности (то есть всё те же диски и/или их разделы), или устройства с избыточностью – зеркала [mirror] и массивы типа RAID-Z.

    Зеркало – виртуальное устройство, хранящее на двух или более физических устройствах, но при чётном их количестве, идентичные копии данных на случай отказа диска.

    RAID-Z – виртуальное устройство на нескольких физических устройствах, предназначенное для хранения данных и их контрольных сумм с однократным или двойным контролем чётности. В первом варианте теоретически требуется не менее двух, во втором – не менее трёх физических устройств.

    На виртуальных устройствах размещаются наборы данных [dataset]. Они бывают следующих видов:

    • файловая система [filesystem] – набор данных, смонтированный в определённой точке и ведущий себя подобно любой другой файловой системе;
    • снапшот [snapshot] – моментальный снимок текущего состояния файловой системы, доступный только для чтения;
    • клон [clone] – точная копия файловой системы в момент её создания; создаётся на основе снимка, но, в отличие от него, доступная для записи;
    • том [volume] – набор данных, эмулирующий физическое устройство, например, раздел подкачки.

    Главных команд для работы с zfs две: zpool для создания и управления пулами, и zfs для создания и управления наборами данных.


  • Установка FreeBSD 10 на zfs

    В FreeBSD 10 при установке появился пунктик для разбивки дисков в zfs, поэтому там выбираем два диска по 500 Gb и делаем на их основе mirror-0. Все сделается в автоматическом режиме, после завершения установки получим:
    # geom disk list
    Geom name: ada0
    Providers:
    1. Name: ada0
       Mediasize: XXXXXXXXXXXXX (500G)
       Sectorsize: 512
       Stripesize: 4096
       Stripeoffset: 0
       Mode: r2w2e4
       descr: INTEL XXXXXXXXXXXXX
       lunid: XXXXXXXXXXXXX
       ident: XXXXXXXXXXXXX
       fwsectors: 63
       fwheads: 16
    
    Geom name: ada1
    Providers:
    1. Name: ada1
       Mediasize: XXXXXXXXXXXXX (500G)
       Sectorsize: 512
       Stripesize: 4096
       Stripeoffset: 0
       Mode: r1w1e2
       descr: INTEL XXXXXXXXXXXXX
       lunid: XXXXXXXXXXXXX
       ident: XXXXXXXXXXXXX
       fwsectors: 63
       fwheads: 16
    
    # gpart show
    =>       34  468862061  ada0  GPT  (500G)
             34          6        - free -  (3.0K)
             40        128     1  freebsd-boot  (64K)
            168   33554432     2  freebsd-swap  (16G)
       33554600  435307488     3  freebsd-zfs  (484G)
      468862088          7        - free -  (3.5K)
    
    =>       34  468862061  ada1  GPT  (500G)
             34          6        - free -  (3.0K)
             40        128     1  freebsd-boot  (64K)
            168   33554432     2  freebsd-swap  (16G)
       33554600  435307488     3  freebsd-zfs  (484G)
      468862088          7        - free -  (3.5K)
    
    # df -h
    Filesystem        Size    Used   Avail Capacity  Mounted on
    tank1/root        500G    8.0G    492G     4%    /
    devfs             1.0K    1.0K      0B   100%    /dev
    tank1/root/tmp    492G    248K    492G     0%    /tmp
    tank1/root/var    492G    164M    492G     0%    /var
    
    # zpool status
      pool: tank1
     state: ONLINE
    status: Some supported features are not enabled on the pool. The pool can
            still be used, but some features are unavailable.
    action: Enable all features using 'zpool upgrade'. Once this is done,
            the pool may no longer be accessible by software that does not support
            the features. See zpool-features(7) for details.
      scan: none requested
    config:
    
            NAME        STATE     READ WRITE CKSUM
            tank1       ONLINE       0     0     0
              mirror-0  ONLINE       0     0     0
                ada0p3  ONLINE       0     0     0
                ada1p3  ONLINE       0     0     0
    
    errors: No known data errors
    
    Как видно, в качестве устройств хранения выступают разделы дисков, что не рекомендуется, но автоматическая размечалка дисков использует почему-то такую схему.


  • Второй пул делаем руками

    Вначале добавляем в систему физические диски. Тут важно помнить о современной системе именования блочных устройств в юниксе и выбрать то, что подойдет лучше всего. В моем случае я работаю с именами устройств верхнего уровня: adaX, он подойдет если в системе один диск (например, на десктопе). Есть ещё вариант именования, gptid, в этом случае список id устройств находится в /dev/gptid, правила именования мне непонятны, а потому лучше добавлять диски по одному и записывать какой диск имеет какой id. Это пригодится потом при замене вышедшего из строя диска. Также, gptid можно узнать, выполнив команду:
    # glabel list
    
    В случае использования gptid, в zfs-командах вместо adaX нужно использовать gptid, на моем ноуте, например, это f07151a3-9053-11e2-90e9-0016d35f78b2.
    # ls /dev | grep ada
    ada0
    ada0p1
    ada0p2
    ada0p3
    ada1
    ada1p1
    ada1p2
    ada1p3
    ada2
    ada3
    
    Как видно, в системе появились ada2 и ada3

    Создаем пул с именем tank2:
    # zpool create tank2 mirror ada2 ada3
    # zpool export tank2
    # zpool import tank2
    
    В команде создания пула мы задали конфигурацию виртуального устройства как зеркала (mirror) и используем два диска (ada2 и ada3) в качестве устройств хранения.

    Если же нам нужен raid-z, то он делается из трех и более дисков (предположим, что у нас в систему добавлен ещё и ada4)
    # zpool create tank2 raidz ada2 ada3 ada4
    
    если же использовать два диска, но не задать mirror или raidz, то будет создано [strip] виртуальное устройство с расщеплением данных на оба физических устройства. Вариант с использованием gptid:
    # zpool create tank2 f07151a1-9053-11e2-90e9-0016d35f78b2 f07151a2-9053-11e2-90e9-0016d35f78b2
    
    В этом варианте размер пула будет равен сумме размеров первого и второго дисков.


  • Работа

    • Создаем точку монтирования:
      # zfs create -o mountpoint=/sklad tank1/sklad
      


  • Полезные команды
    Если нужно полностью очистить диск ada1:

    вначале удаляем все партиции
    # gpart delete -i 1 ada1
    
    после -i идет номер партиции, список партиций можно посмотреть командой:
    # gpart show ada1
    =>       34  468862061  ada1  GPT  (500G)
             34          6        - free -  (3.0K)
             40        128     1  freebsd-boot  (64K)
            168   33554432     2  freebsd-swap  (16G)
       33554600  435307488     3  freebsd-zfs  (484G)
      468862088          7        - free -  (3.5K)
    
    затем удаляем партицию
    # gpart destroy ada1
    


  • Снапшоты
    Читаем список снапшотов:
    # zfs list -t snapshot
    NAME                    USED  AVAIL  REFER  MOUNTPOINT
    tank2/snap@2018-03-14  4.94G      -   578G  -
    tank2/snap@2018-03-15   561M      -   578G  -
    
    Смонтировать снапшот:
    # mount -t zfs tank2/snap@2018-03-14 /mnt/zfs
    

  • Ссылки


    Хендбук. Файловая система zfs
    zpool