# ZFS в ОС Альт 10

- [ZFS в ОС Альт 10](#zfs-в-ос-альт-10)
  - [Введение](#введение)
    - [Возможности ZFS](#возможности-zfs)
    - [Уровни абстракции ZFS](#уровни-абстракции-zfs)
      - [Virtual Devices](#virtual-devices)
      - [Pool](#pool)
  - [Установка](#установка)
    - [Подготовка](#подготовка)
    - [Установка модуля ядра и утилиты командной строки](#установка-модуля-ядра-и-утилиты-командной-строки)
    - [Загрузка модуля ядра](#загрузка-модуля-ядра)
    - [Автозагрузка модуля ядра](#автозагрузка-модуля-ядра)
  - [Создание пула](#создание-пула)
    - [Постоянные идентификаторы диска](#постоянные-идентификаторы-диска)
    - [Пул из одного диска](#пул-из-одного-диска)
    - [Просмотр файловых систем в пуле](#просмотр-файловых-систем-в-пуле)
    - [Удаление пула](#удаление-пула)
    - [Создание пула с чередованием (RAID0, 2 VDEVs)](#создание-пула-с-чередованием-raid0-2-vdevs)

## Введение

ZFS - это современная файловая система и одновременно логический менеджер томов, изначально разработана компанией SUN, далее Oracle

### Возможности ZFS

- масштабируемость
- защита от потерь данных, программная отказоустойчивость
- поддержка больших объемов данных
- интеграция управления логическими томами с файловой системой
- поддержка снимков и CoW клонирования
- непрерывный контроль целостности
- автоматическое восстановление

### Уровни абстракции ZFS

- Virtual Devices. VDEVs. Виртуальные устройства.
- Pool. Пулы.
- DataSet. Файловая система внутри пула

#### Virtual Devices

VDEVs. Виртуальные устройства. Используются для размещения данных или в служебных целях для тонкой настройки ZFS

- **физические диски**
- **разделы дисков**
- **файл образа диска** с указанием полного пути

Использование виртуальных устройств

- без явного указания виртуальные устройства объединяются пул уровня RAID0 - запись с чередованием для повышения скорости. Без избыточности и отказоустойчивости.
- **mirror** - програмный массив RAID1
- **raidz1/2/3** - RAID-массивы с контролем четности
- **spare** - диски горячего запаса для RAID. На них не хранятся данные, эти диски включаются в работу в случае выхода из строя диска в пуле
- **cache** - устройство для кэша 2го уровня (L2ARC). Рекомендуется использовать на быстрых SSD дисках. Если скорость дисков с данным не отличается от скорости дисков с кешем, смысл выделения отдельных дисков по кеш пропадает. **КРАЙНЕ ЧУВСТВИТЕЛЕН К ПОТЕРЕ ДАННЫХ**
- **log** - отдельный журнал (SLOG), содержащий ZFS Intent Log (ZIL). Так же как и кеш есть смысл использовать только для ускорения работы на быстрых дисках

#### Pool

| Тип пула | Опция        | Мин.дисков/VDEVs | Описание                          |
| -------- | ------------ | :--------------: | --------------------------------- |
| RAID-0   | по-умолчанию |       1/1        | сумма дисков, нет избыточности    |
| RAID-1   | mirror       |       2/1        | данные зеркалируются на все диски |
| RAID-10  | mirror       |       4/2        | сочетание RAID0 и RAID1           |
| RAIDZ-1  | raidz        |       3/1        | аналог RAID5, одинарная четность  |
| RAIDZ-2  | raidz2       |       4/1        | аналог RAID6, двойная четность    |
| RAIDZ-3  | raidz3       |       5/1        | тройная четность                  |

RAID0 быстрее RAID1, кот. быстрее RAIDZ-1, кот. быстрее RAIDZ-2, кот. быстрее RAIDZ-3

Размер пула невозможно уменьшить, только увеличить

[вверх](#zfs-в-ос-альт-10)

## Установка

### Подготовка

Для включения поддержки ZFS в ОС Альт 10.2 необходимо загрузить соответствующий модуль ядра и утилиту командной строки

```bash
[root@zfs ~]# apt-get update && apt-cache search zfs | grep kernel
...
kernel-modules-zfs-std-def - ZFS Linux modules
kernel-modules-zfs-un-def - ZFS Linux modules
kernel-source-zfs - ZFS modules sources for Linux kernel
```

```bash
[root@zfs ~]# apt-cache search zfs | grep utils
zfs-utils - Native OpenZFS management utilities for Linux
```

В репозитории есть модуль для двух веток ядер: `std-def`, `un-def`. Для того, чтобы понять какой модуль необходим, нужно уточнить какое ядро используется на узле

```bash
[root@zfs ~]# uname -r
6.1.83-un-def-alt1
```

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

```bash
apt-get update && apt-get dist-upgrade -y
update-kernel -y
reboot
```

[вверх](#zfs-в-ос-альт-10)

### Установка модуля ядра и утилиты командной строки

```bash
apt-get install kernel-modules-zfs-un-def zfs-utils -y
reboot
```

### Загрузка модуля ядра

Если на узле уже имеются zfs пулы, система их увидит и автоматически загрузит необходимый модуль, если же пулов ещё нет, модуль нужно загрузить

```bash
[root@zfs ~]# modprobe zfs
[root@zfs ~]# lsmod | grep zfs
zfs                  3678208  0
zunicode              335872  1 zfs
zzstd                 581632  1 zfs
zlua                  176128  1 zfs
zavl                   16384  1 zfs
icp                   307200  1 zfs
zcommon                94208  2 zfs,icp
znvpair                94208  2 zfs,zcommon
spl                   110592  6 zfs,icp,zzstd,znvpair,zcommon,zavl
```

### Автозагрузка модуля ядра

Вместе с модулем ядра будет установлен соответствующий конфигурационный файл для автозагрузки `/etc/modules-load.d/zfs.conf`

```bash
[root@zfs ~]# cat /etc/modules-load.d/zfs.conf
# The default behavior is to allow udev to load the kernel modules on demand.
# Uncomment the following line to unconditionally load them at boot.
#zfs
```

В нём необходимо раскоментировать строку zfs

```bash
[root@zfs ~]# cat /etc/modules-load.d/zfs.conf
# The default behavior is to allow udev to load the kernel modules on demand.
# Uncomment the following line to unconditionally load them at boot.
zfs
```

[вверх](#zfs-в-ос-альт-10)

## Создание пула

В общем виде создание пула

```bash
zpool create -f -m <mount-point> <pool-name> [raidz(2|3)|mirror] <ids>
```

`-f` - force, очистит диски, если на них есть данные
`-m` - указание точки монтирования. По-умолчанию используется `/<pool-name>`

`<ids>` - в самом простом виде можно использовать имена дисков `/dev/sdb`, но это нежелательно, т.к. при выходе из строя диска `/dev/sdb`, при следующей загрузке системы все последующие диски изменят своё имя - диск, который ранее назывался `/dev/sdc` теперь будет доступен как `/dev/sdb`. Это может привести к полной неработоспособности системы. Поэтому желательным является метод именования дисков по постоянным идентификаторам.

### Постоянные идентификаторы диска

- **by-id**

```bash
[root@zfs ~]# ls -lh /dev/disk/by-id
итого 0
lrwxrwxrwx 1 root root  9 апр  3 13:13 ata-QEMU_DVD-ROM_QM00003 -> ../../sr0
lrwxrwxrwx 1 root root  9 апр  3 13:13 scsi-0QEMU_QEMU_HARDDISK_drive-scsi0 -> ../../sda
lrwxrwxrwx 1 root root 10 апр  3 13:13 scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 апр  3 13:13 scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-part2 -> ../../sda2
lrwxrwxrwx 1 root root  9 апр  3 13:13 scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 -> ../../sdb
lrwxrwxrwx 1 root root  9 апр  3 13:13 scsi-0QEMU_QEMU_HARDDISK_drive-scsi2 -> ../../sdc
```

- **by-path**

```bash
[root@zfs ~]# ls -lh /dev/disk/by-path
итого 0
lrwxrwxrwx 1 root root  9 апр  3 13:13 pci-0000:00:01.1-ata-2 -> ../../sr0
lrwxrwxrwx 1 root root  9 апр  3 13:13 pci-0000:00:01.1-ata-2.0 -> ../../sr0
lrwxrwxrwx 1 root root  9 апр  3 13:13 pci-0000:01:01.0-scsi-0:0:0:0 -> ../../sda
lrwxrwxrwx 1 root root 10 апр  3 13:13 pci-0000:01:01.0-scsi-0:0:0:0-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 апр  3 13:13 pci-0000:01:01.0-scsi-0:0:0:0-part2 -> ../../sda2
lrwxrwxrwx 1 root root  9 апр  3 13:13 pci-0000:01:02.0-scsi-0:0:0:1 -> ../../sdb
lrwxrwxrwx 1 root root  9 апр  3 13:13 pci-0000:01:03.0-scsi-0:0:0:2 -> ../../sdc
```

- **GPT labels** - если метка была создана при инициации таблицы разделов GPT

### Пул из одного диска

```bash
[root@zfs ~]# mkdir -p /srv/zfs_pools/zfs0
[root@zfs ~]# ls -lh /dev/disk/by-id | grep sdb
lrwxrwxrwx 1 root root  9 апр  3 13:13 scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 -> ../../sdb
[root@zfs ~]# zpool create -f -m /srv/zfs_pools/zfs0 zfs0 scsi-0QEMU_QEMU_HARDDISK_drive-scsi1
```

```bash
[root@zfs ~]# zpool status
  pool: zfs0
 state: ONLINE
config:

        NAME                                    STATE     READ WRITE CKSUM
        zfs0                                    ONLINE       0     0     0
          scsi-0QEMU_QEMU_HARDDISK_drive-scsi1  ONLINE       0     0     0

errors: No known data errors
[root@zfs ~]# df -Th
Файловая система Тип      Размер Использовано  Дост Использовано% Cмонтировано в
udevfs           devtmpfs   5,0M          96K  5,0M            2% /dev
runfs            tmpfs      3,9G         644K  3,9G            1% /run
/dev/sda2        ext4        30G         3,3G   25G           12% /
tmpfs            tmpfs      3,9G            0  3,9G            0% /dev/shm
tmpfs            tmpfs      3,9G            0  3,9G            0% /tmp
tmpfs            tmpfs      795M            0  795M            0% /run/user/500
zfs0             zfs        9,3G         128K  9,3G            1% /srv/zfs_pools/zfs0
[root@zfs ~]# zfs list
NAME   USED  AVAIL     REFER  MOUNTPOINT
zfs0   123K  9.20G       24K  /srv/zfs_pools/zfs0
[root@zfs ~]# 
```

[вверх](#zfs-в-ос-альт-10)

### Просмотр файловых систем в пуле

```bash
[root@zfs ~]# zfs list
NAME   USED  AVAIL     REFER  MOUNTPOINT
zfs0   123K  9.20G       24K  /srv/zfs_pools/zfs0
[root@zfs ~]# 
```

### Удаление пула

```bash
zpool destroy zfs0
```

### Создание пула с чередованием (RAID0, 2 VDEVs)

```bash
[root@zfs ~]# ls -lh /dev/disk/by-id/ | grep sd[bc]
lrwxrwxrwx 1 root root  9 апр  3 15:14 scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 -> ../../sdb
lrwxrwxrwx 1 root root  9 апр  3 13:13 scsi-0QEMU_QEMU_HARDDISK_drive-scsi2 -> ../../sdc
```

```bash
zpool create -f zpool0 scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 scsi-0QEMU_QEMU_HARDDISK_drive-scsi2
```

```bash
[root@zfs ~]# zpool status
  pool: zpool0
 state: ONLINE
config:

        NAME                                    STATE     READ WRITE CKSUM
        zpool0                                  ONLINE       0     0     0
          scsi-0QEMU_QEMU_HARDDISK_drive-scsi1  ONLINE       0     0     0
          scsi-0QEMU_QEMU_HARDDISK_drive-scsi2  ONLINE       0     0     0

errors: No known data errors
[root@zfs ~]# 
[root@zfs ~]# df -Th
Файловая система Тип      Размер Использовано  Дост Использовано% Cмонтировано в
udevfs           devtmpfs   5,0M          96K  5,0M            2% /dev
runfs            tmpfs      3,9G         652K  3,9G            1% /run
/dev/sda2        ext4        30G         3,3G   25G           12% /
tmpfs            tmpfs      3,9G            0  3,9G            0% /dev/shm
tmpfs            tmpfs      3,9G            0  3,9G            0% /tmp
tmpfs            tmpfs      795M            0  795M            0% /run/user/500
zpool0           zfs         19G         128K   19G            1% /zpool0
[root@zfs ~]# 
```

[вверх](#zfs-в-ос-альт-10)


Больше примеров в [Справочнике команд](zfs_commands.md)
