Хранилища

Разметка диска

  • Дисковое пространство делится на разделы (partition)

    • Разделы именуются согласно типу диска

      • /dev/nvme0 - для NVMe дисков

      • /dev/sda(1,2,3) - для классических дисков (изначально SD - SCSI Disk)

      • /dev/vda - для виртуальных дисков (VD - Virtual Disk)

  • Система загружается при помощи BIOS или UEFI (EFI), что определяет тип адресации диска

    • Для BIOS - MBR (Master Boot Record)

      • Хранит только 64 байта информации о разделах, что приводит к лимиту в 4 раздела

    • Для UEFI - GPT (GUID Partition Table)

      • Хранит до 128 разделов

  • Для преодоления лимита MBR была введена концепция логических разделов (logical partition) и расширенного раздела (extended partition)

    • Последний раздел в диске назначается как extended, в рамках которого создаются логические разделы

[admin@centos8 ~]$ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0          11:0    1 1024M  0 rom  
nvme0n1     259:0    0   20G  0 disk 
├─nvme0n1p1 259:1    0    1G  0 part /boot
└─nvme0n1p2 259:2    0   19G  0 part 
  ├─cs-root 253:0    0   17G  0 lvm  /
  └─cs-swap 253:1    0    2G  0 lvm  [SWAP]

Типы управления хранилищами

  • Разделы

    • Стандартное решение, используемое в любых случаях

    • Отдельная часть хранилища для конкретного типа данных

  • LVM (Logical Volume Manager) логические тома

    • Используется по-умолчанию в RHEL

    • Добавляет гибкости в работе с хранилищами (изменение размера, снэпшоты и т.д.)

  • Страты (stratis)

    • Следующее поколение

    • VMF (Volume Managing Filesystem)

    • Используются тонкие провижины по-умолчанию

    • Встроено в пользовательское пространство, что делает доступным использование API

  • Virtual Data Optimizer

    • Нацелено на эффективность использования диска (компрессия, дедупликация)

GPT и MBR

  • MBR является частью PC спецификации 1981 года

    • 512 байт для загрузочной информации

    • 64 байта для хранилищ

    • Только 4 хранилища с размером до 2 Тб

    • Для большего числа хранилищ необходимо использовать логические хранилища

  • GPT разработан в 2010 году

    • Больше пространства для хранения разделов (128)

    • Разработан специально для UEFI

Работа с parted

  • При создании раздела файловая система не создается автоматически

  • parted записывает только неважные метаданные файловой системы

  • parted в RHEL 8 является утилитой по-умолчанию

  • Выбор раздела осуществляется через parted /dev/<name>

  • print покажет текущую таблицу разделов

  • mklabel msdos | gpt - создать таблицу разделов (MBR или GPT соответственно)

  • mkpart part-type name fs-type start end

    • part-type - только для MBR, определяет основной, логический или расшренный раздел

    • name - имя, необходимо для GPT

    • fs-type - НЕ изменяет файловую систему, но устанавливает метаданные ФС

    • start end - начало и конец диска для раздела

      • mkpart primary 1024MiB 2048 MiB

  • udevadm settle для обновления данных

Работа с MBR

  • Выбрать нужный раздел в fdisk:

    • fdisk /dev/nvme0n3

  • Разделы, которые изменяются в fdisk, могут быть заняты на момент изменений

    • В такой случае рекомендуется проверить выполнененные изменения через partprobe

Файловые системы

  • Файловая система определяет способ, которым будет осуществляться запись данных на диск, организация данных в блоки и структуры

  • По-умолчанию в RHEL файловой системой выбран XFS

    • Быстрая и масштабируемая файловая система

    • Использует CoW (Copy on Write) для предотвращения потери целостности данных

    • Размер может быть увеличен, но не уменьшен

  • Вплоть до RHEL 6 использовалась ext4

    • Обратная совместимость с ext2

    • Использует журналирование (отслеживание изменений на диске) для обеспечения целостности данных

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

  • BTRFS

    • Создает временные метки и чексуммы для целостности

    • Поддерживает снэпшоты

    • Использует CoW

Управление файловой системой

  • mkfs.xfs - создать XFS систему

    • Соответственно mkfs.ext4 для ext4

    • mkfs.[tab][tab] - для вывода всех вариантов

    • mkfs без уточнения создаст ext2

  • После создания файловой системы, она может быть примонтирована командой mount

    • umount для размонтирования

Работа с /etc/fstab

  • Главный конфигурационный файл для постоянного монтирования разделов

  • Содержимое файла используется systemd-fstab-generator для создания точек монтирования

    • Соотвественно для обновления данных после редактирования /etc/fstab необходимо перезагрузить демона через systemctl daemon-reload

  • Столбцы:

    • /dev/mapper/cs-root - раздел

    • / - точка монтирования

    • xfs - файловая система

    • defaults - создать с параметрами по-умолчанию

    • 0 0 - флаги dump и systemcheck, которые не используются в современных системах

Атрибуты имен

  • В средах дата-центров имена девайсов могут меняться

    • Например, при удалении логического раздела, следующие за ним меняют свою нумерацию, в результате чего fstab не может инициализировать раздел

  • Для того, чтобы сохранить именование существуют различные решения:

    • UUID (Universal Unique ID) автоматически генерируется для каждого устройства, которое содержит файловую систему или что-то похожее

    • Label (метка)

      • Опция "-L" при создании файловой системы используется для установки имени, которое может использоваться при монтировании

    • Уникальные имена хранятся в /dev/disk

  • Вывести список UUID можно через команду blkid:

  • Для установки метки можно использовать tune2fs

    • В fstab раздел меняется на LABEL=testlabel

  • Для XFS можно использовать xfs_admin

  • То, каким образом можно идентифицировать раздел, и как это делает система, можно узнать в /dev/disk

Управление systemd монтированием

  • /etc/fstab уже является списком точек монтирования systemd

  • Точки монтирования также могут быть созданы с помощью .mount файлов

    • .mount файлы позволяют точнее работать с зависимостями за счет использваония таргетов, которые позволяют определять порядок монтирования и условия

  • Для примера можно использовать systemctl cat tmp.mount

  • Пример монтирования:

    • cp /usr/lib/systemd/system/tmp.mount /etc/systemd/system/articles.mount

      • tmp.mount монтируется на место articles в fstab

    • Если необходимо использовать структуру дерева при монтировании, то используется тире

      • /etc/systemd/system/data-articles.mount будет смонтировано в /data/articles

Управление XFS

  • xfsdump использутся для создания бэкапов XFS устройств и имеет несколько особенностей:

    • xfsdump работает на устройстве, отформатированном только в XFS

    • xfsdump может делать полные бэкапы или инкрементальные бэкапы разного уровня

      • xfsdump -I 0 -f /backupfiles/data.xfsdump /data создаст полный бэкап раздела data

      • xfsrestore -f /backupfiles/data.xfsdump /data восстановит раздел из бэкапа

      • xfsrepare используется для восстановления

Swap раздел

  • Swap - эмуляция RAM на диске

  • Все системы Linux должны иметь хотя бы часть памяти под swap

    • Размер swap зависит от использования системы, обычно размер выставляется равным RAM

  • Swap может быть создан на любом устройстве

  • При создании через parted, файловая система выбирается как linux-swap

  • mkswap создаст Swap FS

  • Активируется swap через swapon

  • Созданный вручную swap раздел необходимо также добавить в fstab для сохранения монтирования после перезагрузки

Структура LVM

  • LVM состоит из трех основных компонентов:

    • Physical Volume (PV)

    • Volume Group

    • Logical Volume (LV)

  • PV - все физические устройства, которые используются для хранения данных (жесткие диски, разделы, LUNы и т.д.)

  • Все физические устройства объединены в единый уровень абстракции - Volume Group

  • Из VG создаются LV с необходимыми свойствами

    • Размер LV не соотносится напрямую с PV, он может быть больше размером, чем один PV, что и определяет его преимущество

  • Поверх LV работает файловая система

  • Таким образом формируется иерархия тома /dev/vg<name>/lv<name>

Настройка LVM

  • Создать раздел из parted, используя set <number> lvm on

  • Создать PV через pvcreate /dev/<partition name>

    • pvs для проверки созданного PV

  • Создать VG через vgcreate <vg name> /dev/<partition name>

  • Создать LV через lvcreate -n <lvname> -L 1G <vg name>

    • lvs для проверки созданного LV

  • Создать файловую систему через mkfs.<fsname> /dev/<vg name>/<lv name>

  • Поместить в /etc/fstab

    • При этом не нужно использовать UUID, поскольку LV не привязаны к устройствам

Для отображения дерева монтирования полезна команда findmnt

LVM Device Mapper

  • Системный компонент, который используется ядром для создания интерфейсов доступа к устройствам

  • Device Mapper создает несмысловые имена для подсистем его использующих

    • /dev/dm-0, /dev/dm-1 и т.д.

  • Несмысловые имена формируются как символьные ссылки через /dev/mapper

    • /dev/mapper/<vgname>-<lvname>

Изменение размеров LVM

  • Чтобы увеличить LV используется команда lvextend

    • lvextend -r -L +1G - увеличивает размер LV на 1Гб вместе с файловой системой(флаг "-r")

  • Для того, чтобы увеличить LV, необходимо, чтобы в VG было достаточно места

    • Проверяется командой vgs

  • Соответственно для увеличения VG в случае нехватки объема используется команда vgextend для добавления PV

  • e2resize - отдельная утилита для изменения размера EXT файловых систем

  • xfs_growfs - используется соответственно для XFS файловых систем

Stratis

  • Stratis - файловая система от Red Hat, являющаяся аналогом BTRFS и ZFS

  • Для работы Stratis сверху него необходима регулярная файловая система (по-умолчанию XFS)

  • Stratis доступен поверх любого устройства блочных данных, включая LVM

  • Предлагает такой функционал: снапшоты, уровни кэширования, программируемый API, мониторинг и восстановление, тонкий провижининг

Архитектура Stratis:

  • Пул страты (stratis pool) создается из одного или более устройства хранения (blockdev)

    • Страта создает директорию /dev/stratis/<my-pool> для каждого пула

    • Директория содержит линки до устройств, которые представляют файловую систему в пуле

    • Устройства блочных данных в пуле могут не быть на тонком провижининге

  • Файловая система помещается в раздел поверх пула и является его интегральной частью

    • Каждый пул может содержать одну или более файловую систему

    • Файловые системы с тонким провижинингом не имеют фиксированного объема

      • Раздел увеличивается в размере по мере увеличения данных в нем

Понятия файловой системы (file system) и раздела (volume) взаимозаменяемы в данном случае

Настройка Stratis

  • Установить утилиту для управления и настройки stratis

    • yum install stratis-cli stratisd

  • Активировать службу

    • systemctl enable --now stratisd

  • Создать пул

    • stratis pool create <mypool> /dev/nvme0n2

  • Создать файловую систему (создаст XFS)

    • stratis fs create <mypool> <myfs1>

  • Отобразить созданные компоненты

    • stratis pool list - отобразить пулы

    • stratis fs list <mypool> - отобразить файловую систему

    • stratis blockdev list <mypool> - отобразит устройства

  • Добавление нового устройства (опционально)

    • stratis blockdev add-data

  • Разделы не поддерживаются

  • Объем устройства для добавления в пул должен быть минимум 1G

  • Раздел монтируется в fstab по UUID

  • Рекомендуется перезагрузить систему после проведенных настроек

Управление Stratis

  • Расширение пула:

    • stratis pool add-data <mypool> /dev/nvme0n3 для добавления нового устройства

  • Стандартные системные утилиты не предоставляют точной информации о томах из-за тонкого провижининга

    • Для этих целей лучше использовать stratis blockdev

    • stratis pool показывает информацию о пулах

    • stratis filesystem отображают отдельные файловые системы

  • Используемое пулами пространство не должно приближаться по размеру к физическому объему устройства

Снапшоты Stratis:

  • Снапшот представляет собой отдельную файловую систему, которую можно примонтировать

  • После создания снапшоты могут быть изменены

  • Снапшот не связан непосредственно с файловой системой, с которой он сделан и может существовать отдельно от нее после создания

  • Каждый снапшот должен иметь резервного пространства не меньше 0,5 Гб для хранения XFS лога

  • Создание снапшота:

    • stratis fs snapshot <mypool> <myfs1> <myfs1-snapshot>

    • При этом последующие изменения в оригинальной файловой системе не будут отражены в снапшоте

    • Примонтировать снапшот можно через команду mount /stratis/<mypool>/<mysnaphot> /mnt

  • Откат файловой системы из ранее сделанного снапшота:

    • unnount /<myfs1>

    • stratis fs destroy <mypool> <myfs1>

    • stratis fs snapshot <mypool> <myfs1-snapshot> <myfs1>

      • По факту создается снапшота снапшота

    • Данный подход не работает при использовании LVM

  • Удаление снапшота и файловой системы:

    • stratis filesystem destroy <mypool> <mysnapshot> для удаления снапшота

    • stratis filesystem destroy <mypool> <myfs> для удаления файловой системы

    • stratis pool destroy <mypool> для удаления всего пула, если в нем нет файловых систем

VDO

  • Virtual Data Optimizer

  • Используется для оптимизации хранимых на диске данных

  • Используется как отдельный менеджер томов, поверх которого создаются файловые системы

  • Обеспечивает тонкий провижининг

    • 10-ти кратный логический размер по отношению к физическому для виртуальных машин и контейнеров

    • 3-х кратный логический размер по отношению к физическому для объектных хранилищ

  • Используется в облачных и контейнерных средах

  • VDO управляет дедуплицированными и сжатыми пулами в RHEL 8

Настройка VDO

  • Нижележащий уровень устройства должен быть размеров не менее 4 ГиБ

  • Установить пакет:

    • yum install vdo kmod-vdo

  • Создать VDO:

    • vdo create --name=vdo1 --device=/dev/nmve0np2 --vdoLogicalSize=1T

  • Создать файловую систему:

    • mkfs.xfs -K /dev/mapper/vdo1

  • Зарегистрировать новое имя устройства

    • udevadm settle

  • Примонтировать в fstab

    • C флагом x-systemd.requires=vdo.service

  • Проверка состояния:

    • vdostats --human-readable

LUKS

  • Linux Unified Key Setup-on-disk-format

  • Технология зашифрованных разделов

  • Принцип работы заключается в следующем:

    • Поверх устройства, например /dev/sda1, создается настройка шифрования - cryptsetup luksFormat с парольной защитой

    • Для доступа к данным формируется виртуальный раздел cryptsetup luksOpen <secret_volume>

    • Этот раздел создается в /dev/mapper/<secret_volume>

    • Поверх создается файловая система и она же монтируется для доступа

    • В результате похищения данных такого тома фактически данных в нем не будет, так как они останутся на изначальном /dev/sda1

Настройка LUKS

  • Создаем раздел в parted или fdisk

  • Форматируем его в LUKS

    • cryptsetup luksFormat

  • Открываем раздел и создаем имя в device mapper

    • cryptsetup luksOpen /dev/<devicename> <namesecret>

  • Монтируем полученное в device mapper устройство

  • Для автоматизации luksOpen используется /etc/crypttab

  • Для автоматизации монтирования тома - /etc/fstab

Last updated

Was this helpful?