Файлові системи 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!
Див. також¶
- Linux основи — базові команди
- Процеси та systemd — управління сервісами
- Docker — контейнеризація
Шлях: getting-started/filesystems.md