Файлові системи Linux

Що таке файлова система?

Файлова система визначає як дані зберігаються та організовуються на диску.

┌─────────────────────────────────────────────────────────────────┐
│  Диск (фізичний)                                                │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │  Partition 1 (ext4)     │  Partition 2 (swap)  │ Part 3   │  │
│  │  /                      │  swap                │ /home    │  │
│  └───────────────────────────────────────────────────────────┘  │
│                                                                 │
│  Файлова система організовує:                                   │
│  • Як записувати/читати файли                                   │
│  • Метадані (права, час, власник)                              │
│  • Структуру директорій                                         │
│  • Журналювання (захист від збоїв)                             │
└─────────────────────────────────────────────────────────────────┘

Ієрархія файлової системи (FHS)

/
├── bin/         Базові команди (ls, cp, cat)
├── boot/        Ядро, initramfs, grub
├── dev/         Пристрої (/dev/sda, /dev/null)
├── etc/         Конфігураційні файли
├── home/        Домашні директорії користувачів
├── lib/         Бібліотеки для /bin та /sbin
├── media/       Автомонтовані носії (USB, CD)
├── mnt/         Тимчасове монтування
├── opt/         Додаткове ПЗ
├── proc/        Віртуальна ФС (інфо про процеси)
├── root/        Домашня директорія root
├── run/         Runtime дані (PID файли)
├── sbin/        Системні команди (fdisk, iptables)
├── srv/         Дані сервісів (www, ftp)
├── sys/         Віртуальна ФС (інфо про систему)
├── tmp/         Тимчасові файли
├── usr/         Користувацькі програми та дані
   ├── bin/     Програми користувача
   ├── lib/     Бібліотеки
   ├── local/   Локально встановлене ПЗ
   └── share/   Архітектурно-незалежні дані
└── var/         Змінні дані
    ├── log/     Логи
    ├── lib/     Стан додатків
    └── www/     Веб-сервер (часто)

Типи файлових систем

ext4 (Fourth Extended Filesystem)

Стандарт для більшості Linux систем.

┌─────────────────────────────────────────────────────────────────┐
│  ext4 Характеристики:                                          │
│                                                                 │
│  • Максимальний розмір файлу: 16 TiB                           │
│  • Максимальний розмір ФС: 1 EiB                               │
│  • Журналювання (metadata + data)                              │
│  • Extents (ефективне зберігання великих файлів)               │
│  • Delayed allocation (краща продуктивність)                   │
│  • Online resize (збільшення без unmount)                      │
│                                                                 │
│  Коли використовувати:                                          │
│  ✓ Загальне використання                                       │
│  ✓ Сервери                                                      │
│  ✓ Якщо не потрібні advanced features                          │
│                                                                 │
│  Коли НЕ використовувати:                                       │
│  ✗ Потрібні snapshots                                          │
│  ✗ Потрібна вбудована компресія                                │
│  ✗ Критично важлива цілісність даних                           │
└─────────────────────────────────────────────────────────────────┘
# Створити ext4
mkfs.ext4 /dev/sdb1

# З label
mkfs.ext4 -L "data" /dev/sdb1

# Перевірити/відремонтувати (unmounted!)
fsck.ext4 /dev/sdb1

# Інформація
tune2fs -l /dev/sdb1

# Змінити параметри
tune2fs -L "newlabel" /dev/sdb1
tune2fs -c 30 /dev/sdb1  # Перевірка кожні 30 монтувань

XFS

Оптимізована для великих файлів та паралельного I/O.

┌─────────────────────────────────────────────────────────────────┐
│  XFS Характеристики:                                           │
│                                                                 │
│  • Максимальний розмір файлу: 8 EiB                            │
│  • Максимальний розмір ФС: 8 EiB                               │
│  • Відмінна продуктивність з великими файлами                  │
│  • Паралельний I/O (allocation groups)                         │
│  • Online defragmentation                                       │
│  • НЕ можна зменшити (тільки збільшити)                        │
│                                                                 │
│  Коли використовувати:                                          │
│  ✓ Великі файли (відео, бекапи)                                │
│  ✓ Бази даних                                                   │
│  ✓ RHEL/CentOS (default)                                       │
└─────────────────────────────────────────────────────────────────┘
# Створити XFS
mkfs.xfs /dev/sdb1

# Інформація
xfs_info /dev/sdb1

# Repair (unmounted)
xfs_repair /dev/sdb1

# Defragmentation (mounted)
xfs_fsr /mount/point

Btrfs (B-tree Filesystem)

Сучасна ФС з advanced features.

┌─────────────────────────────────────────────────────────────────┐
│  Btrfs Характеристики:                                         │
│                                                                 │
│   Copy-on-Write (CoW)                                         │
│   Snapshots (миттєві, майже безкоштовні)                      │
│   Вбудована компресія (zstd, lzo, zlib)                       │
│   Checksums для даних та метаданих                            │
│   Subvolumes                                                   │
│   RAID (0, 1, 10, 5, 6)                                       │
│   Online resize та defragmentation                            │
│   Send/receive для реплікації                                 │
│                                                                 │
│  Коли використовувати:                                          │
│   Потрібні snapshots                                          │
│   Компресія важлива                                           │
│   Desktops, workstations                                      │
│   openSUSE, Fedora (default варіант)                          │
│                                                                 │
│  Обережно:                                                      │
│   RAID 5/6 ще нестабільний                                    │
│   Може фрагментуватися (особливо з CoW)                       │
└─────────────────────────────────────────────────────────────────┘
# Створити Btrfs
mkfs.btrfs /dev/sdb1

# З компресією
mount -o compress=zstd /dev/sdb1 /mnt

# Subvolumes
btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home
btrfs subvolume list /mnt

# Snapshots
btrfs subvolume snapshot /mnt/@ /mnt/@_snapshot

# Read-only snapshot
btrfs subvolume snapshot -r /mnt/@ /mnt/@_backup

# Інформація
btrfs filesystem show
btrfs filesystem df /mnt

# Send/receive (backup)
btrfs send /mnt/@_backup | btrfs receive /backup/

ZFS

Enterprise-grade ФС з максимальною надійністю.

┌─────────────────────────────────────────────────────────────────┐
  ZFS Характеристики:                                           
                                                                 
   Checksums для ВСЬОГО (дані + метадані)                      
   Self-healing (автовідновлення з RAID)                       
   Copy-on-Write                                                
   Snapshots та clones                                          
   Компресія (lz4, zstd)                                       
   Deduplication                                                
   Encryption                                                   
   RAID-Z (1, 2, 3)                                            
   Pooled storage (не потрібен LVM)                            
                                                                 
  Коли використовувати:                                          
   NAS, file servers                                           
   Критично важливі дані                                       
   Backup сервери                                              
   Коли потрібна максимальна надійність                        
                                                                 
  Обережно:                                                      
   Потребує багато RAM (1GB на 1TB recommended)                
   Ліцензійна несумісність з GPL (не в ядрі)                   
   Складніша в управлінні                                      
└─────────────────────────────────────────────────────────────────┘
# Встановити ZFS (Ubuntu)
apt install zfsutils-linux

# Створити pool
zpool create tank /dev/sdb /dev/sdc  # striped
zpool create tank mirror /dev/sdb /dev/sdc  # mirror
zpool create tank raidz /dev/sdb /dev/sdc /dev/sdd  # RAID-Z

# Статус
zpool status
zpool list

# Datasets (як subvolumes)
zfs create tank/data
zfs create tank/backup

# Snapshots
zfs snapshot tank/data@today
zfs list -t snapshot

# Rollback
zfs rollback tank/data@today

# Властивості
zfs set compression=lz4 tank
zfs set quota=100G tank/data
zfs get all tank

# Send/receive
zfs send tank/data@today | ssh backup zfs receive backup/data

Порівняння файлових систем

Характеристика ext4 XFS Btrfs ZFS
Журналювання Так Так CoW CoW
Snapshots Ні Ні Так Так
Компресія Ні Ні Так Так
Checksums Metadata Metadata Data+Meta Data+Meta
Online resize Тільки grow Тільки grow Grow/shrink Grow
RAID Ні (LVM) Ні (LVM) Так Так
Складність Проста Проста Середня Висока
RAM потреби Низькі Низькі Середні Високі

Монтування

Команда mount

# Базове монтування
mount /dev/sdb1 /mnt

# З опціями
mount -o ro /dev/sdb1 /mnt                    # Read-only
mount -o rw,noexec /dev/sdb1 /mnt            # No execute
mount -o compress=zstd /dev/sdb1 /mnt        # Btrfs compression

# Монтування по UUID
mount UUID=a1b2c3d4-... /mnt

# Показати змонтовані ФС
mount | column -t
findmnt
df -h

# Відмонтувати
umount /mnt
# або
umount /dev/sdb1

# Примусово (обережно!)
umount -l /mnt  # lazy unmount
umount -f /mnt  # force

/etc/fstab

# /etc/fstab — автоматичне монтування при завантаженні
# <device>                                 <mount>  <type> <options>        <dump> <pass>
UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 /        ext4   defaults         0      1
UUID=b2c3d4e5-f6g7-8901-bcde-f12345678901 /home    ext4   defaults         0      2
UUID=c3d4e5f6-g7h8-9012-cdef-123456789012 none     swap   sw               0      0
/dev/sdb1                                  /data    xfs    defaults,noatime 0      2

# Опції:
# defaults = rw,suid,dev,exec,auto,nouser,async
# noatime = не оновлювати access time (performance)
# noexec = заборона виконання
# nosuid = ігнорувати setuid біти
# ro = read-only
#
# dump: 0 = не бекапити, 1 = бекапити
# pass: 0 = не перевіряти, 1 = перевіряти першим (root), 2 = перевіряти після

# Перевірити fstab без перезавантаження
mount -a

# Знайти UUID
blkid
lsblk -f

Розділи та LVM

Традиційні розділи

# Переглянути диски
lsblk
fdisk -l

# Створити розділи (MBR)
fdisk /dev/sdb

# Створити розділи (GPT) — рекомендовано
gdisk /dev/sdb
# або
parted /dev/sdb

# Parted приклади
parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary ext4 0% 50%
parted /dev/sdb mkpart primary ext4 50% 100%

LVM (Logical Volume Manager)

┌─────────────────────────────────────────────────────────────────┐
│                       LVM Architecture                          │
│                                                                 │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐                      │
│  │   /dev   │  │   /dev   │  │   /dev   │  Physical Volumes    │
│  │   sda1   │  │   sdb1   │  │   sdc1   │  (PV)                │
│  └────┬─────┘  └────┬─────┘  └────┬─────┘                      │
│       │             │             │                             │
│       └─────────────┼─────────────┘                             │
│                     │                                           │
│              ┌──────┴──────┐                                    │
│              │  Volume     │  Volume Group (VG)                 │
│              │  Group      │                                    │
│              │  "vg_data"  │                                    │
│              └──────┬──────┘                                    │
│                     │                                           │
│       ┌─────────────┼─────────────┐                             │
│       │             │             │                             │
│  ┌────┴────┐  ┌─────┴────┐  ┌────┴─────┐                       │
│  │   LV    │  │   LV     │  │   LV     │  Logical Volumes      │
│  │  root   │  │  home    │  │  data    │  (LV)                 │
│  │  50GB   │  │  100GB   │  │  200GB   │                       │
│  └─────────┘  └──────────┘  └──────────┘                       │
│                                                                 │
│  Переваги LVM:                                                  │
│  • Гнучкий resize без unmount                                   │
│  • Snapshots                                                    │
│  • Об'єднання дисків                                           │
│  • Переміщення даних online                                     │
└─────────────────────────────────────────────────────────────────┘
# 1. Створити Physical Volumes
pvcreate /dev/sdb1
pvcreate /dev/sdc1
pvs  # список PV

# 2. Створити Volume Group
vgcreate vg_data /dev/sdb1 /dev/sdc1
vgs  # список VG
vgdisplay vg_data

# 3. Створити Logical Volumes
lvcreate -L 50G -n lv_root vg_data
lvcreate -L 100G -n lv_home vg_data
lvcreate -l 100%FREE -n lv_data vg_data  # все що залишилось
lvs  # список LV

# 4. Створити файлову систему
mkfs.ext4 /dev/vg_data/lv_root
mkfs.ext4 /dev/vg_data/lv_home

# 5. Монтувати
mount /dev/vg_data/lv_root /mnt

# Розширити LV
lvextend -L +50G /dev/vg_data/lv_data
# або до конкретного розміру
lvextend -L 200G /dev/vg_data/lv_data
# Розширити ФС
resize2fs /dev/vg_data/lv_data  # ext4
xfs_growfs /dev/vg_data/lv_data # xfs

# Зменшити LV (тільки ext4, unmount!)
umount /dev/vg_data/lv_data
e2fsck -f /dev/vg_data/lv_data
resize2fs /dev/vg_data/lv_data 100G
lvreduce -L 100G /dev/vg_data/lv_data

# LVM Snapshot
lvcreate -L 10G -s -n snap_root /dev/vg_data/lv_root
# Відновити зі snapshot
lvconvert --merge /dev/vg_data/snap_root

RAID

Рівні RAID

┌─────────────────────────────────────────────────────────────────┐
│  RAID 0 (Striping) — швидкість, БЕЗ надійності                 │
│  ┌─────┐  ┌─────┐                                               │
│  │ A1  │  │ A2  │   Дані розподіляються між дисками            │
│  │ A3  │  │ A4  │   Швидкість: 2x                               │
│  │ A5  │  │ A6  │   Ємність: 100%                               │
│  └─────┘  └─────┘   Відмова будь-якого = втрата всього!        │
│                                                                 │
├─────────────────────────────────────────────────────────────────┤
│  RAID 1 (Mirroring) — надійність                               │
│  ┌─────┐  ┌─────┐                                               │
│  │ A1  │  │ A1  │   Дані дублюються                            │
│  │ A2  │  │ A2  │   Швидкість читання: 2x                       │
│  │ A3  │  │ A3  │   Ємність: 50%                                │
│  └─────┘  └─────┘   Витримує відмову 1 диска                   │
│                                                                 │
├─────────────────────────────────────────────────────────────────┤
│  RAID 5 (Striping + Parity) — баланс                           │
│  ┌─────┐  ┌─────┐  ┌─────┐                                      │
│  │ A1  │  │ A2  │  │ Ap  │   Parity розподілена                │
│  │ B1  │  │ Bp  │  │ B2  │   Мінімум 3 диски                   │
│  │ Cp  │  │ C1  │  │ C2  │   Ємність: (N-1)/N                  │
│  └─────┘  └─────┘  └─────┘   Витримує відмову 1 диска          │
│                                                                 │
├─────────────────────────────────────────────────────────────────┤
│  RAID 6 (Double Parity) — підвищена надійність                 │
│  Як RAID 5, але з двома parity                                 │
│  Мінімум 4 диски                                                │
│  Ємність: (N-2)/N                                               │
│  Витримує відмову 2 дисків                                     │
│                                                                 │
├─────────────────────────────────────────────────────────────────┤
│  RAID 10 (1+0) — швидкість + надійність                        │
│  ┌─────┬─────┐  ┌─────┬─────┐                                   │
│  │ A1  │ A1  │  │ A2  │ A2  │   Mirror pairs + stripe          │
│  │ A3  │ A3  │  │ A4  │ A4  │   Мінімум 4 диски                │
│  └─────┴─────┘  └─────┴─────┘   Ємність: 50%                   │
│                              Найкраща продуктивність           │
└─────────────────────────────────────────────────────────────────┘

mdadm (Software RAID)

# Створити RAID 1
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1

# Створити RAID 5
mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1

# Статус
cat /proc/mdstat
mdadm --detail /dev/md0

# Зберегти конфігурацію
mdadm --detail --scan >> /etc/mdadm/mdadm.conf

# Додати spare диск
mdadm --add /dev/md0 /dev/sde1

# Видалити failed диск
mdadm --remove /dev/md0 /dev/sdc1

# Замінити диск
mdadm --fail /dev/md0 /dev/sdc1
mdadm --remove /dev/md0 /dev/sdc1
mdadm --add /dev/md0 /dev/sdf1

Перевірка та ремонт

fsck

# Перевірити ext4 (unmounted!)
fsck.ext4 /dev/sdb1

# Автоматичний ремонт
fsck.ext4 -y /dev/sdb1

# Перевірка при завантаженні
# Форсувати на наступне завантаження:
touch /forcefsck
# або
tune2fs -C 100 /dev/sdb1  # встановити mount count

# Дізнатись коли останній раз перевірялось
tune2fs -l /dev/sdb1 | grep -i check

S.M.A.R.T.

# Встановити
apt install smartmontools

# Інформація про диск
smartctl -i /dev/sda

# Статус здоров'я
smartctl -H /dev/sda

# Повна інформація
smartctl -a /dev/sda

# Запустити тест
smartctl -t short /dev/sda   # ~2 хв
smartctl -t long /dev/sda    # ~годину

# Результати тесту
smartctl -l selftest /dev/sda

Квоти

# Увімкнути квоти (додати usrquota,grpquota в fstab)
# /dev/sda1 /home ext4 defaults,usrquota,grpquota 0 2

# Ремонтувати
mount -o remount /home

# Створити quota файли
quotacheck -cugm /home

# Увімкнути
quotaon /home

# Встановити квоту для користувача
edquota -u username
# або
setquota -u username 1000000 1200000 0 0 /home
# soft=1GB, hard=1.2GB, no inode limit

# Переглянути квоти
quota -u username
repquota /home

Практика: Розмітка диска для сервера

# Типова схема для сервера:
#
# /dev/sda (системний, SSD)
# ├── sda1: /boot/efi   512MB  EFI System Partition
# ├── sda2: /boot       1GB    ext4
# └── sda3: LVM
#     ├── lv_root: /         50GB   ext4
#     ├── lv_var:  /var      50GB   ext4
#     └── lv_log:  /var/log  20GB   ext4
#
# /dev/sdb, sdc (дані, HDD, RAID1)
# └── md0: /data        RAID1  xfs

# Створити GPT на системному диску
parted /dev/sda mklabel gpt
parted /dev/sda mkpart "EFI" fat32 1MiB 513MiB
parted /dev/sda set 1 esp on
parted /dev/sda mkpart "boot" ext4 513MiB 1537MiB
parted /dev/sda mkpart "lvm" 1537MiB 100%
parted /dev/sda set 3 lvm on

# Створити файлові системи
mkfs.fat -F32 /dev/sda1
mkfs.ext4 /dev/sda2

# Створити LVM
pvcreate /dev/sda3
vgcreate vg_system /dev/sda3
lvcreate -L 50G -n lv_root vg_system
lvcreate -L 50G -n lv_var vg_system
lvcreate -L 20G -n lv_log vg_system

mkfs.ext4 /dev/vg_system/lv_root
mkfs.ext4 /dev/vg_system/lv_var
mkfs.ext4 /dev/vg_system/lv_log

# Створити RAID1 для даних
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
mkfs.xfs /dev/md0

Підсумок

ФС Коли використовувати
ext4 Загальне використання, стандарт
XFS Великі файли, бази даних
Btrfs Snapshots, компресія, desktop
ZFS NAS, максимальна надійність

Рекомендації:
1. Використовуйте UUID замість /dev/sdX в fstab
2. LVM для гнучкості
3. Окремі розділи для /var/log та /tmp
4. RAID не замінює backup!


Див. також

Шлях: getting-started/filesystems.md

UMTC Wiki © 2026 | Ukrainian Military Tactical Communications