← Все заметки

linux · storage · LVM · ZFS · Ceph · файловые системы

Хранилище Linux: файловые системы, LVM, RAID, ZFS и Ceph

Практическая памятка администратора: диагностика стека хранения, выбор технологии, расширение разделов и LVM, перенос swap и мониторинг.

Когда на Linux-сервере заканчивается место, df -h показывает только верхушку конструкции. Под файловой системой могут находиться LVM, шифрование, программный RAID, виртуальный диск, сетевой LUN или ZFS. Поэтому перед изменениями сначала восстанавливаем всю цепочку хранения, а затем расширяем ее снизу вверх.

Ниже — памятка по основным актуальным технологиям: как определить текущую схему, чем отличаются варианты и какие команды нужны в типовых ситуациях.

Перед изменением таблицы разделов, уменьшением томов или заменой дисков проверяем резервную копию и доступ к консоли. Snapshot гипервизора полезен, но не всегда заменяет независимый backup.

Карта уровней хранения

Физический диск / SAN LUN / виртуальный диск
  ↓
GPT или MBR
  ↓
Раздел или весь диск
  ↓
mdraid / LUKS / LVM / ZFS / Btrfs / Ceph
  ↓
ext4 / XFS / Btrfs / ZFS
  ↓
Точка монтирования
  ↓
Приложение

Примеры:

/dev/sda2 → ext4 → /
/dev/sda3 → LVM PV → VG → LV → XFS → /var
/dev/sda1 + /dev/sdb1 → mdraid RAID1 → LVM → ext4
/dev/sda3 + /dev/sdb3 → ZFS mirror → datasets/zvol
Ceph OSD → RADOS → RBD → диск VM → LVM → ext4

Технологии разных уровней нельзя сравнивать напрямую:

  • ext4 и XFS — файловые системы;
  • LVM — менеджер блочных томов;
  • mdadm — программный RAID;
  • LUKS — шифрование;
  • ZFS и Btrfs совмещают несколько функций;
  • Ceph — распределенная система хранения;
  • NFS и SMB дают сетевой доступ к файлам;
  • iSCSI передает по сети блочное устройство.

Быстрая инвентаризация

lsblk -e7 -o NAME,PATH,SIZE,TYPE,FSTYPE,FSVER,MOUNTPOINTS,UUID,MODEL
blkid
findmnt
df -hT
df -ih
fdisk -l
swapon --show

Специализированные команды:

# LVM
pvs
vgs
lvs -a -o +devices

# mdraid
cat /proc/mdstat
mdadm --detail --scan
mdadm --detail /dev/md0

# ZFS
zpool status -P
zpool list
zfs list -o name,used,avail,refer,mountpoint

# Btrfs
btrfs filesystem show
btrfs filesystem usage /
btrfs device stats /

# LUKS
cryptsetup status <mapper-name>

# SMART
smartctl -x /dev/sda

Как читать lsblk

Обычный раздел:

sda       100G disk
├─sda1      1G part vfat /boot/efi
└─sda2     99G part ext4 /

LVM:

sda                100G disk
└─sda3              99G part LVM2_member
  ├─vg0-root        40G lvm  ext4 /
  ├─vg0-var         50G lvm  xfs  /var
  └─vg0-swap         8G lvm  swap [SWAP]

Шифрование и LVM:

sda3                    100G part crypto_LUKS
└─crypt-system          100G crypt LVM2_member
  ├─vg0-root             80G lvm ext4 /
  └─vg0-swap              8G lvm swap

Для ZFS одного lsblk недостаточно: связи между дисками смотрим через zpool status, а datasets и zvol — через zfs list.

GPT и MBR

GPT — основной вариант для современных систем: большие диски, UEFI, много разделов и резервная таблица в конце устройства.

1M     BIOS boot
512M   EFI System
остальное Linux filesystem/LVM/ZFS

MBR ограничен дисками примерно до 2 ТБ и четырьмя primary partitions. Для дополнительных разделов используется extended partition:

sda1  Linux
sda2  Extended
└─sda5 Swap

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

Локальные файловые системы

ext4

Универсальный вариант для Linux-серверов и VM: зрелая реализация, онлайн-расширение, умеренные требования к ресурсам и понятные средства восстановления. Уменьшение возможно только в offline-режиме.

resize2fs /dev/vg0/root
e2fsck -f /dev/vg0/root

e2fsck не запускают на смонтированной файловой системе в режиме записи.

XFS

Хорошо подходит для больших файловых систем, параллельного I/O, журналов, баз и данных приложений. Онлайн-расширение выполняется по точке монтирования:

xfs_growfs /var
xfs_repair -n /dev/vg0/var

Главное ограничение: XFS нельзя штатно уменьшить.

Btrfs

CoW-файловая система с subvolumes, snapshots, checksums, сжатием, reflink, send/receive и поддержкой нескольких устройств.

btrfs filesystem show
btrfs filesystem usage /data
btrfs device stats /data
btrfs scrub status /data
btrfs filesystem resize max /data
btrfs subvolume snapshot -r /data /snapshots/data-$(date +%F)

Для баз, образов VM и других активно изменяемых файлов нужно учитывать влияние CoW и фрагментации. RAID5/6 требует отдельного изучения текущих ограничений.

ZFS

ZFS совмещает управление дисками, программный RAID и файловую систему. Основные возможности: checksums, self-healing, mirror/RAIDZ, datasets, zvol, snapshots, clones, compression и send/receive.

pool    — пул хранения
vdev    — группа устройств
dataset — файловая система ZFS
zvol    — блочное устройство

Пример:

sda + sdb
  → mirror vdev
  → rpool
     ├─ rpool/ROOT
     ├─ rpool/data
     └─ rpool/backup
zpool status -v
zpool list
zpool iostat -v 5
zfs list
zfs get all <dataset>
zfs snapshot rpool/data@before-upgrade
zfs set compression=zstd rpool/data

ZFS mirror не является backup. Свободное место datasets обычно общее, поэтому значения Avail из нескольких строк df нельзя складывать. Дедупликацию не включают без расчета памяти и подтвержденной потребности.

Другие файловые системы

bcachefs — новая CoW-файловая система с checksums, compression, snapshots и несколькими устройствами. Перед критичным применением проверяем поддержку дистрибутивом, версию ядра и средства восстановления.

F2FS ориентирована на flash, eMMC и embedded-системы. На обычном сервере чаще выбирают ext4, XFS или ZFS.

tmpfs хранит данные в памяти с возможностью вытеснения в swap:

mount -t tmpfs -o size=2G tmpfs /mnt/ram

OverlayFS объединяет read-only и изменяемый слои контейнера. Это слой поверх основной файловой системы, а не ее замена.

LVM

PV → VG → LV

Создание:

pvcreate /dev/sdb
vgcreate vgdata /dev/sdb
lvcreate -n data -L 500G vgdata
mkfs.xfs /dev/vgdata/data

Добавление диска и расширение:

pvcreate /dev/sdc
vgextend vgdata /dev/sdc
lvextend -r -L +100G /dev/vgdata/data

Все свободное место VG:

lvextend -r -l +100%FREE /dev/vgdata/data

LVM удобен для независимо растущих /var, /home, каталогов баз и контейнеров. Сам по себе он не предоставляет checksums, backup или отказоустойчивость.

LVM Thin и snapshots

Thin pool позволяет создавать логические тома, виртуальный размер которых превышает фактически занятое место.

lvs -a -o lv_name,lv_size,data_percent,metadata_percent

Контролировать нужно Data% и Metadata%: переполнение thin pool может затронуть все размещенные в нем тома.

Обычный snapshot:

lvcreate -s -n data-snap -L 20G /dev/vg0/data

Он не является backup и станет непригоден после переполнения выделенного пространства.

Stratis — управляющий слой над device-mapper, thin provisioning и XFS, прежде всего для RHEL-подобных систем. VDO предоставляет блочное сжатие, дедупликацию и thin provisioning, но требует контроля физического заполнения и расходов CPU/RAM.

mdadm

Классическая схема:

sda1 + sdb1 → /dev/md0 RAID1 → LVM → ext4/XFS
cat /proc/mdstat
mdadm --detail /dev/md0
УровеньМинимум дисковНазначение
RAID02Производительность без защиты
RAID12Зеркало
RAID53Одна отказоустойчивая четность
RAID64Двойная четность
RAID104Зеркала и высокая производительность

Для крупных HDD RAID10 или RAID6 часто безопаснее RAID5 из-за длительного rebuild и риска второго сбоя.

LUKS

раздел → LUKS → ext4
раздел → LUKS → LVM → ext4/XFS
mdraid → LUKS → LVM
cryptsetup status cryptdata
cryptsetup luksDump /dev/sdb1
cryptsetup luksHeaderBackup /dev/sdb1 \
  --header-backup-file luks-header.img

Копию заголовка и ключи хранят отдельно. Для серверов заранее планируют разблокировку после перезагрузки и содержимое initramfs.

Сетевые и распределенные хранилища

NFS — стандартный файловый доступ Linux/Unix, удобный для backup, ISO, шаблонов и общих каталогов:

mount -t nfs4 nas:/backup /mnt/backup

SMB/CIFS обычно используют для интеграции с Windows:

mount -t cifs //server/share /mnt/share \
  -o credentials=/root/.smb-credentials

Пароль не указывают непосредственно в командной строке или открытом /etc/fstab.

iSCSI предоставляет удаленный LUN как блочное устройство. Поверх него создают LVM или файловую систему. Для нескольких путей используют multipath:

multipath -ll

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

Ceph

RBD    → блочные диски VM
CephFS → общая POSIX-файловая система
RGW    → объектное S3/Swift-хранилище

Ceph RBD особенно актуален для кластеров Proxmox: гипервизоры получают совместный доступ к дискам VM, а Ceph реплицирует и перераспределяет данные между OSD.

Преимущества — отсутствие единой центральной СХД, snapshots, clones, live migration и горизонтальное расширение. Цена — сложность, требования к сети, нескольким узлам и правильному sizing. Для одного Proxmox-сервера Ceph обычно избыточен.

Расширение: типовые сценарии

Обычный ext4-раздел:

growpart -N /dev/sda 2
growpart /dev/sda 2
resize2fs /dev/sda2

XFS:

growpart -N /dev/sda 2
growpart /dev/sda 2
xfs_growfs /

LVM внутри раздела:

growpart -N /dev/sda 3
growpart /dev/sda 3
pvresize /dev/sda3
vgs
lvextend -r -L +20G /dev/vg0/root

Новый диск в VG:

pvcreate /dev/sdb
vgextend vg0 /dev/sdb
lvextend -r -L +100G /dev/vg0/data

Btrfs после увеличения устройства:

btrfs filesystem resize max /data

ZFS mirror при переходе на диски большего размера:

заменить первый диск
→ дождаться resilver
→ проверить ONLINE
→ заменить второй диск
→ дождаться resilver
→ расширить pool
zpool status
zpool online -e <pool> <device>

Имена устройств берем из zpool status -P, предпочтительно в виде /dev/disk/by-id/....

Виртуальная машина Proxmox

На гипервизоре:

qm config <VMID>
qm resize <VMID> scsi0 +50G

В гостевой системе:

lsblk

Дальше применяется один из вариантов:

growpart → resize2fs
growpart → xfs_growfs
growpart → pvresize → lvextend -r

Устройства /dev/zd* на ZFS-хосте являются zvol виртуальных машин. Изменять их разметку на работающей VM с хоста не следует.

Swap в конце диска

Проблемная MBR-схема:

sda1  root
sda2  extended
└─sda5 swap
свободное место

Рабочая последовательность:

создать swap-файл
→ включить его
→ отключить старый swap
→ убрать старый swap из fstab
→ удалить sda5 и пустой sda2
→ расширить sda1
→ расширить файловую систему

Для ext4 или XFS:

fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

/etc/fstab:

/swapfile none swap defaults 0 0
swapon --show
free -h
swapoff /dev/sda5

Если использовался resume, старый UUID удаляют из конфигурации загрузки и пересобирают initramfs. После удаления старых swap-разделов:

growpart /dev/sda 1
resize2fs /dev/sda1

Для XFS последняя команда — xfs_growfs /. Для Btrfs swap-файл создается по специальным правилам Btrfs.

Пример Proxmox на ZFS mirror

sda
├─sda1  BIOS boot
├─sda2  EFI System
└─sda3  ZFS member

sdb
├─sdb1  BIOS boot
├─sdb2  EFI System
└─sdb3  ZFS member
rpool
└─mirror-0
  ├─sda3
  └─sdb3

rpool/ROOT/pve-1  → /
rpool/var-lib-vz  → /var/lib/vz
rpool/data        → VM и LXC

Хранилища Proxmox:

local     → /var/lib/vz → rpool/var-lib-vz
local-zfs → rpool/data

local и local-zfs — разные storage ID, но используют свободное место одного rpool. Их емкость нельзя складывать.

pvesm status
zpool list
zfs list

Обычный Linux by Zabbix agent может не обнаружить local-zfs, поскольку это zfspool, а не обычная смонтированная файловая система. Для Proxmox используют Proxmox VE by HTTP с обнаружением storage через API:

pvesh get /nodes/<PVE_NODE>/storage --output-format json-pretty

В Zabbix отдельно контролируют доступность local и local-zfs, а физическую емкость и здоровье — по rpool.

Что мониторить

УровеньОсновные показатели
ДискиSMART health, температура, reallocated/pending/uncorrectable, self-test
mdraiddegraded, число активных дисков, recovery/resync, mismatch count
LVMналичие PV, VG free, состояние LV, snapshots
LVM ThinData%, Metadata%
Файловая системаbytes, inodes, read-only remount, I/O errors, latency
ZFSpool/vdev health, READ/WRITE/CKSUM delta, capacity, scrub, resilver
Btrfsdevice errors, data/metadata usage, scrub, read-only state
Cephhealth, quorum, OSD up/in, PG states, nearfull/full, recovery, latency

Ориентировочные пороги заполнения:

75% — warning
85% — high
90–95% — disaster

Для ZFS и thin pool предупреждение поднимают раньше, чем для обычного ext4.

Минимальная проверка ZFS:

zpool status -x

Норма:

all pools are healthy

Мониторинга гипервизора недостаточно. В гостевых системах отдельно контролируют /, /var, inodes, VG free, thin pool и swap. Хост видит размер zvol, но не знает, сколько места осталось внутри гостевой ext4.

Что выбирать

ЗадачаПрактический выбор
Простая Linux VMext4
Большой /var или данные приложенияXFS
Несколько растущих mountpointsLVM + ext4/XFS
Локальные snapshots и subvolumesBtrfs
Один Proxmox или NASZFS
Классический RAID без ZFSmdadm + LVM + ext4/XFS
ШифрованиеLUKS + LVM + ext4/XFS
Proxmox-кластерCeph RBD
Общий Linux-каталогNFS
Windows-совместимый ресурсSMB
SAN LUNiSCSI + multipath + LVM
S3-совместимое хранениеCeph RGW или другое object storage
Flash/embeddedF2FS
Новая CoW-ФС для лабораторииbcachefs после проверки поддержки

Опасные операции

Особого внимания требуют:

уменьшение раздела или LV
изменение начала раздела
любая попытка уменьшить XFS
удаление extended-разделов
переполнение LVM Thin
переполнение ZFS pool
zpool add вместо zpool attach
изменение zvol работающей VM с хоста

Перед изменениями снова собираем состояние:

lsblk -f
findmnt
blkid
pvs
vgs
lvs -a -o +devices
zpool status -P
zfs list

Главный принцип:

Сначала определить все слои хранения.
Потом изменять их по порядку снизу вверх.

Если виртуальный диск увеличен, это еще не означает, что автоматически увеличились раздел, PV, LV и файловая система.

Полезная документация