Хранилища
Разметка диска
Дисковое пространство делится на разделы (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]
[root@centos8 ~]# parted /dev/nvme0n1
GNU Parted 3.2
Using /dev/nvme0n1
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: NVMe Device (nvme)
Disk /dev/nvme0n1: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 1075MB 1074MB primary ext4 boot
2 1075MB 21.5GB 20.4GB primary lvm
[root@centos8 ~]# cat /proc/partitions
major minor #blocks name
259 0 20971520 nvme0n1
259 1 1048576 nvme0n1p1
259 2 19921920 nvme0n1p2
11 0 1048575 sr0
253 0 17821696 dm-0
253 1 2097152 dm-1
Типы управления хранилищами
Разделы
Стандартное решение, используемое в любых случаях
Отдельная часть хранилища для конкретного типа данных
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>
[root@centos8 ~]# parted /dev/nvme0n1
GNU Parted 3.2
Using /dev/nvme0n1
Welcome to GNU Parted! Type 'help' to view a list of commands.
print покажет текущую таблицу разделов
(parted) print
Model: NVMe Device (nvme)
Disk /dev/nvme0n1: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 1075MB 1074MB primary ext4 boot
2 1075MB 21.5GB 20.4GB primary lvm
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
[root@centos8 ~]# fdisk /dev/nvme0n1
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help):
Help:
DOS (MBR)
a toggle a bootable flag
b edit nested BSD disklabel
c toggle the dos compatibility flag
Generic
d delete a partition
F list free unpartitioned space
l list known partition types
n add a new partition
p print the partition table
t change a partition type
v verify the partition table
i print information about a partition
Misc
m print this menu
u change display/entry units
x extra functionality (experts only)
Script
I load disk layout from sfdisk script file
O dump disk layout to sfdisk script file
Save & Exit
w write table to disk and exit
q quit without saving changes
Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty DOS partition table
s create a new empty Sun partition table
Разделы, которые изменяются в 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 для размонтирования
[root@centos8 ~]# mkfs.ext4 --help
mkfs.ext4: invalid option -- '-'
Usage: mkfs.ext4 [-c|-l filename] [-b block-size] [-C cluster-size]
[-i bytes-per-inode] [-I inode-size] [-J journal-options]
[-G flex-group-size] [-N number-of-inodes] [-d root-directory]
[-m reserved-blocks-percentage] [-o creator-os]
[-g blocks-per-group] [-L volume-label] [-M last-mounted-directory]
[-O feature[,...]] [-r fs-revision] [-E extended-option[,...]]
[-t fs-type] [-T usage-type ] [-U UUID] [-e errors_behavior][-z undo_file]
[-jnqvDFSV] device [blocks-count]
Работа с /etc/fstab
Главный конфигурационный файл для постоянного монтирования разделов
Содержимое файла используется systemd-fstab-generator для создания точек монтирования
Соотвественно для обновления данных после редактирования /etc/fstab необходимо перезагрузить демона через systemctl daemon-reload
#
# /etc/fstab
# Created by anaconda on Tue Jan 7 04:22:33 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cs-root / xfs defaults 0 0
UUID=d1ee1d16-19ac-43ea-9fb7-523083a8b62c /boot ext4 defaults 1 2
/dev/mapper/cs-swap swap swap defaults 0 0
Столбцы:
/dev/mapper/cs-root - раздел
/ - точка монтирования
xfs - файловая система
defaults - создать с параметрами по-умолчанию
0 0 - флаги dump и systemcheck, которые не используются в современных системах
Атрибуты имен
В средах дата-центров имена девайсов могут меняться
Например, при удалении логического раздела, следующие за ним меняют свою нумерацию, в результате чего fstab не может инициализировать раздел
Для того, чтобы сохранить именование существуют различные решения:
UUID (Universal Unique ID) автоматически генерируется для каждого устройства, которое содержит файловую систему или что-то похожее
Label (метка)
Опция "-L" при создании файловой системы используется для установки имени, которое может использоваться при монтировании
Уникальные имена хранятся в /dev/disk
Вывести список UUID можно через команду blkid:
test@test:~$ blkid
/dev/nvme0n1p1: UUID="ECD8-B4AF" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="d585f665-7fc2-42aa-afb6-5514904e7715"
/dev/nvme0n1p2: UUID="cc003f19-c5ef-4565-a0c4-2d719b7093bf" TYPE="ext4" PARTUUID="b52b1f9e-10ea-4857-a5a1-52262ef19c34"
Для установки метки можно использовать tune2fs
В fstab раздел меняется на LABEL=testlabel
[root@centos8 ~]# tune2fs --help
tune2fs 1.44.6 (5-Mar-2019)
tune2fs: invalid option -- '-'
Usage: tune2fs [-c max_mounts_count] [-e errors_behavior] [-f] [-g group]
[-i interval[d|m|w]] [-j] [-J journal_options] [-l]
[-m reserved_blocks_percent] [-o [^]mount_options[,...]]
[-r reserved_blocks_count] [-u user] [-C mount_count]
[-L volume_label] [-M last_mounted_dir]
[-O [^]feature[,...]] [-Q quota_options]
[-E extended-option[,...]] [-T last_check_time] [-U UUID]
[-I new_inode_size] [-z undo_file] device
[root@centos8 ~]# tune2fs -L testlabel /dev/nvme0n1p3
Для XFS можно использовать xfs_admin
[root@centos8 ~]# xfs_admin --help
/usr/sbin/xfs_admin: illegal option -- -
Usage: xfs_admin [-efjlpuV] [-c 0|1] [-L label] [-U uuid] device
То, каким образом можно идентифицировать раздел, и как это делает система, можно узнать в /dev/disk
[root@centos8 ~]# cd /dev/disk
[root@centos8 disk]# ls -l
total 0
drwxr-xr-x. 2 root root 280 Feb 14 20:35 by-id
drwxr-xr-x. 2 root root 80 Feb 14 20:35 by-partuuid
drwxr-xr-x. 2 root root 120 Feb 14 20:35 by-path
drwxr-xr-x. 2 root root 100 Feb 14 20:35 by-uuid
[root@centos8 disk]# ls by-id
ata-VMware_Virtual_SATA_CDRW_Drive_01000000000000000001
dm-name-cs-root
dm-name-cs-swap
dm-uuid-LVM-9xVJCksngAfp31irErzzaoOBiyvedEXXBUqL9tVGKlQs9EHWyFlxwjtNq0ZANI0e
dm-uuid-LVM-9xVJCksngAfp31irErzzaoOBiyvedEXXYDO73fb3HLYOqvkMhfpCmVFVSAfJaPm3
lvm-pv-uuid-TVas3k-4gDg-3Zh7-q3zm-d4sk-Da2P-snQRuO
nvme-nvme.15ad-564d57617265204e564d455f30303030-564d77617265205669727475616c204e564d65204469736b-00000001
nvme-nvme.15ad-564d57617265204e564d455f30303030-564d77617265205669727475616c204e564d65204469736b-00000001-part1
nvme-nvme.15ad-564d57617265204e564d455f30303030-564d77617265205669727475616c204e564d65204469736b-00000001-part2
nvme-VMware_Virtual_NVMe_Disk_VMWare_NVME_0000
nvme-VMware_Virtual_NVMe_Disk_VMWare_NVME_0000-part1
nvme-VMware_Virtual_NVMe_Disk_VMWare_NVME_0000-part2
[root@centos8 disk]# ls by-uuid
364f9538-5370-4e16-bf7d-3d1a12536469 d1ee1d16-19ac-43ea-9fb7-523083a8b62c ed3d1f14-19ae-4815-a7ea-af9a9c580bda
[root@centos8 disk]# ls by-path
pci-0000:02:04.0-ata-2 pci-0000:0b:00.0-nvme-1 pci-0000:0b:00.0-nvme-1-part1 pci-0000:0b:00.0-nvme-1-part2
[root@centos8 disk]# ls by-partuuid
4e564f0a-01 4e564f0a-02
Управление systemd монтированием
/etc/fstab уже является списком точек монтирования systemd
Точки монтирования также могут быть созданы с помощью .mount файлов
.mount файлы позволяют точнее работать с зависимостями за счет использваония таргетов, которые позволяют определять порядок монтирования и условия
Для примера можно использовать systemctl cat tmp.mount
[root@centos8 disk]# systemctl cat tmp.mount
# /usr/lib/systemd/system/tmp.mount
# SPDX-License-Identifier: LGPL-2.1+
#
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Temporary Directory (/tmp)
Documentation=man:hier(7)
Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
ConditionPathIsSymbolicLink=!/tmp
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target
After=swap.target
[Mount]
What=tmpfs
Where=/tmp
Type=tmpfs
Options=mode=1777,strictatime,nosuid,nodev
# Make 'systemctl enable tmp.mount' work:
[Install]
WantedBy=local-fs.target
Пример монтирования:
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 для сохранения монтирования после перезагрузки
/dev/mapper/cs-swap swap swap defaults 0 0
Структура 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
EXAMPLES
Create a striped LV with 3 stripes, a stripe size of 8KiB and a size of 100MiB. The LV name is chosen by
lvcreate.
lvcreate -i 3 -I 8 -L 100m vg00
Create a raid1 LV with two images, and a useable size of 500 MiB. This operation requires two devices, one
for each mirror image. RAID metadata (superblock and bitmap) is also included on the two devices.
lvcreate --type raid1 -m1 -L 500m -n mylv vg00
Create a mirror LV with two images, and a useable size of 500 MiB. This operation requires three devices:
two for mirror images and one for a disk log.
lvcreate --type mirror -m1 -L 500m -n mylv vg00
Create a mirror LV with 2 images, and a useable size of 500 MiB. This operation requires 2 devices because
the log is in memory.
lvcreate --type mirror -m1 --mirrorlog core -L 500m -n mylv vg00
Create a copy-on-write snapshot of an LV:
lvcreate --snapshot --size 100m --name mysnap vg00/mylv
Создать файловую систему через 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>
[root@centos8 ~]# ls -l /dev/mapper/cs-root
lrwxrwxrwx. 1 root root 7 Feb 16 17:06 /dev/mapper/cs-root -> ../dm-0
[root@centos8 ~]# ls -l /dev/mapper/cs-swap
lrwxrwxrwx. 1 root root 7 Feb 16 17:06 /dev/mapper/cs-swap -> ../dm-1
Изменение размеров 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?