Как файловая система превращает блоки диска в файлы и папки и чем FAT32, NTFS и ext4 отличаются на практике
df и /etc/fstab.vhdx, как в разделе 03: на нём можно форматировать без риска. Команды — в терминале администратора.Диск умеет одно: прочитать или записать блок (сектор) по номеру. Файловая система — способ организации данных на разделе, который превращает миллионы пронумерованных блоков в файлы с именами, папки, права и даты. Она отвечает на вопросы: в каких блоках лежит файл, какие блоки свободны, кто может его читать, что делать, если питание пропало посреди записи.
| Понятие | Что это |
|---|---|
| Раздел | Часть диска из таблицы разделов (раздел 03) |
| Том | То, на чём создана файловая система: обычно раздел, иногда несколько разделов или дисков вместе |
| Форматирование | Запись на том пустой файловой системы: служебных таблиц, корневого каталога |
| Кластер (блок) | Минимальная порция места, которую ФС выдаёт файлу; файл в 1 байт занимает целый кластер |
| Метаданные | Данные о файле: имя, размер, даты, права, где лежат блоки |
| Монтирование | Подключение тома к дереву каталогов: буква S: в Windows, каталог вроде /mnt/data в Linux |
Размер кластера — компромисс: большой кластер ускоряет работу с большими файлами, но тратит место на мелких (последний кластер заполнен в среднем наполовину — та же внутренняя фрагментация, что у страниц в разделе 07). Для NTFS и ext4 обычно 4 КБ.
| Способ | Как устроено | Плюсы и минусы | Где |
|---|---|---|---|
| Непрерывное | Файл — подряд идущие блоки: начало и длина | Быстро читать, но файл трудно увеличить, диск фрагментируется | Компакт-диски (ISO 9660) |
| Связный список | Таблица, где для каждого кластера записан номер следующего | Просто; чтобы найти середину файла, надо пройти цепочку | FAT, exFAT |
| Индексное | У файла своя запись со списком блоков или экстентов — непрерывных участков «начало + длина» | Быстрый доступ к любому месту, удобно хранить права и другие сведения | NTFS (MFT), ext4 (inode) |
В FAT (File Allocation Table) в каталоге записано имя файла и номер первого кластера, а в таблице FAT — цепочка: кластер 5 → 6 → 9 → конец. Таблица хранится в двух копиях в начале тома; если она повреждена, файлы теряются целиком.
Сравнивать лучше на деле. Создадим виртуальный диск на 1 ГБ с двумя разделами: FAT32 с буквой R: и NTFS с буквой S:. Скрипт для diskpart:
create vdisk file="C:\tl\os\run\fs.vhdx" maximum=1024 type=expandable
select vdisk file="C:\tl\os\run\fs.vhdx"
attach vdisk
convert gpt
create partition primary size=300
format fs=fat32 quick label=FAT
assign letter=R
create partition primary
format fs=ntfs quick label=NTFS
assign letter=S
PS> Get-Volume -DriveLetter R, S | Select-Object DriveLetter, FileSystemLabel, FileSystem, @{n="МБ"; e={[math]::Round($_.Size/1MB)}}, AllocationUnitSize
DriveLetter : R
FileSystemLabel : FAT
FileSystem : FAT32
МБ : 296
AllocationUnitSize : 4096
DriveLetter : S
FileSystemLabel : NTFS
FileSystem : NTFS
МБ : 708
AllocationUnitSize : 4096
Размер кластера у обоих 4 КБ (AllocationUnitSize). Что умеет каждая ФС, сообщает fsutil fsinfo volumeinfo:
PS> fsutil fsinfo volumeinfo R: | Select-String "Имя файловой|Поддерживает"
Имя файловой системы: FAT32
Поддерживает использование Юникода в именах файлов
Поддерживает шифрование на уровне файловой системы (EFS)
PS> fsutil fsinfo volumeinfo S: | Select-String "Имя файловой|Поддерживает"
Имя файловой системы: NTFS
Поддерживает учет регистров в именах файлов
Поддерживает использование Юникода в именах файлов
Поддерживает обязательное использование списков доступа (ACL)
Поддерживает сжатие файлов
Поддерживает дисковые квоты
Поддерживает разреженные файлы
Поддерживает точки повторной обработки
Поддерживает удаление связи и переименование, применяемые в POSIX
Поддерживает обход ввода-вывода
Поддерживает каталоги с учетом регистра
Поддерживает идентификаторы объектов
Поддерживает шифрование на уровне файловой системы (EFS)
Поддерживает именованные потоки
Поддерживает жесткие ссылки
Поддерживает расширенные атрибуты
Поддерживает открытие по идентификатору файла
Поддерживает журнал USN
У FAT32 почти ничего, у NTFS — длинный список. Проверим главное по очереди.
Жёсткая ссылка — второе имя того же файла: данные одни, имён два. Удалите одно имя — файл останется под другим. На FAT32 так нельзя:
PS> New-Item -ItemType HardLink -Path S:\copy.txt -Target S:\report.txt | Out-Null; fsutil hardlink list S:\report.txt
\copy.txt
\report.txt
PS> New-Item -ItemType HardLink -Path R:\copy.txt -Target R:\report.txt
New-Item : Для указанного пути жесткие ссылки не поддерживаются.
Символическая ссылка — особый файл, в котором записан путь к другому файлу, как ярлык, но на уровне ФС: программы открывают её как обычный файл. Создавать её может администратор (или пользователь в режиме разработчика Windows). В списке файлов она отмечена <SYMLINK>:
PS> New-Item -ItemType SymbolicLink -Path S:\link.txt -Target S:\report.txt | Out-Null; cmd /c dir S:\
Том в устройстве S имеет метку NTFS
Серийный номер тома: 6252-6060
Содержимое папки S:\
31.10.2026 11:10 18 copy.txt
31.10.2026 11:10 <SYMLINK> link.txt [S:\report.txt]
31.10.2026 11:10 18 report.txt
3 файлов 36 байт
0 папок 725 028 864 байт свободно
Для папок есть ещё точки соединения (junction, mklink /j) — ими Windows перенаправляет старые пути, например C:\Documents and Settings на C:\Users (вы видели это в разделе 01).
Сердце NTFS — главная файловая таблица MFT (Master File Table). Каждый файл и каталог — запись в MFT размером 1 КБ: имя, даты, права, а также список экстентов с данными. Маленький файл (до нескольких сотен байт) целиком помещается в саму запись и не занимает кластеров. Сама MFT — тоже файл ($MFT), как и другие служебные: журнал $LogFile, карта свободных кластеров $Bitmap. Под MFT заранее отводится зона, чтобы таблица росла без фрагментации:
PS> fsutil fsinfo ntfsinfo S:
Серийный номер тома NTFS: 0xb062529562526060
Версия NTFS: 3.1
Версия LFS: 2.0
Всего секторов: 1 449 855 (707,9 МБ)
Всего кластеров: 181 231 (707,9 МБ)
Свободных кластеров: 178 033 (695,4 МБ)
Всего зарезервированных кластеров: 1 024 ( 4,0 МБ)
Зарезервировано для резерва памяти: 0 ( 0,0 КБ)
Байтов на сектор: 512
Байтов на физический сектор: 4096
Байтов на кластер: 4096 (4 КБ)
Байтов на сегмент FileRecord: 1024
Кластеров на сегмент FileRecord: 0
Допустимая длина данных в MFT: 256,00 КБ
Начальный номер LCN в MFT: 0x000000000000ebfa
Начальный номер LCN в MFT2: 0x0000000000000002
Начало зоны MFT: 0x000000000000ebe0
Конец зоны MFT: 0x0000000000014480
Размер зоны MFT: 88,63 МБ
Максимальное количество экстентов с обрезкой на устройстве: 4096
Максимальное количество байтов с обрезкой на устройстве: 0xffffffff
Максимальное количество экстентов с обрезкой в томе: 62
Максимальное количество байтов с обрезкой в томе: 0x40000000
Идентификатор диспетчера ресурсов : 6FC75372-D3C3-11F1-9F41-BC2411821796
«Байтов на сегмент FileRecord: 1024» — размер записи MFT. «Начальный номер LCN в MFT2» — копия начала MFT на случай повреждения.
Альтернативные потоки данных (ADS). У файла NTFS может быть несколько потоков: основной (:$DATA) — его содержимое, и именованные. Windows пользуется этим каждый день: браузер, скачав файл, записывает в поток Zone.Identifier, откуда он пришёл. ZoneId=3 — из интернета; поэтому при запуске такого файла Windows предупреждает об опасности, а в его свойствах есть флажок «Разблокировать»:
PS> Set-Content S:\setup.exe "программа"; Set-Content S:\setup.exe -Stream Zone.Identifier "[ZoneTransfer]`nZoneId=3"
PS> Get-Item S:\setup.exe -Stream * | Select-Object Stream, Length
Stream Length
------ ------
:$DATA 11
Zone.Identifier 25
PS> Get-Content S:\setup.exe -Stream Zone.Identifier
[ZoneTransfer]
ZoneId=3
PS> cmd /c dir /r S:\setup.exe | findstr setup
31.10.2026 11:10 11 setup.exe
25 setup.exe:Zone.Identifier:$DATA
PS> Unblock-File S:\setup.exe; Get-Item S:\setup.exe -Stream * | Select-Object Stream, Length
Stream Length
------ ------
:$DATA 11
PS> Set-Content R:\setup.exe -Stream Zone.Identifier "ZoneId=3"
Set-Content : Не удается открыть дополнительный поток данных "Zone.Identifier", связанный с файлом "R:\setup.exe".
dir /r показывает потоки, Unblock-File удаляет метку — то же, что флажок «Разблокировать». На FAT32 потоков нет: скопируйте скачанный файл на флешку — и метка пропадёт. Потоки умеют прятать и вредоносные программы: данные в них не видны в Проводнике и не учитываются в размере файла.
Сжатие — NTFS сжимает файл прозрачно для программ: они читают и пишут как обычно. Хорошо сжимаются тексты и журналы, плохо — уже сжатые архивы, фото и видео:
PS> (Get-Item S:\log.txt).Length
2568895
PS> compact /c S:\log.txt
Сжатие файлов в S:\
log.txt 2568895 : 483328 = 5,3 к 1 [OK]
Сжато файлов: 1, в каталогах: 1
Данные объемом 2 568 895 байт сохранены в 483 328 байт.
Степень сжатия 5,3 к 1.
Журнал на 2,5 МБ занял на диске около 0,5 МБ. В Проводнике то же: Свойства → Другие → Сжимать содержимое; сжатые файлы показаны синим именем.
Права доступа — список ACL у каждого файла: кому что разрешено. На FAT32 его нет: Get-Acl показывает фиктивное «Все — полный доступ». Поэтому флешка с FAT32 или exFAT не защищает файлы — кто взял, тот и прочитал. Права NTFS подробно — в разделе 10:
PS> (Get-Acl S:\report.txt).Access | Select-Object IdentityReference, FileSystemRights | Format-Table -AutoSize
IdentityReference FileSystemRights
----------------- ----------------
BUILTIN\Администраторы FullControl
NT AUTHORITY\СИСТЕМА FullControl
NT AUTHORITY\Прошедшие проверку Modify, Synchronize
BUILTIN\Пользователи ReadAndExecute, Synchronize
PS> Get-Acl R:\report.txt
Каталог: R:\
Path Owner Access
---- ----- ------
report.txt Все Все Allow -1
Создание файла — несколько записей в разные места: запись в каталог, запись в MFT, отметка занятых кластеров. Если питание пропадёт посередине, ФС окажется в противоречивом состоянии: место занято, а файла нет, или наоборот. FAT32 после такого требует полной проверки диска, и часть данных может пропасть.
Журналируемая файловая система (NTFS, ext4) сначала записывает в журнал, что собирается изменить, потом меняет, потом отмечает в журнале, что закончила. После сбоя ей достаточно просмотреть журнал: незавершённые операции отменяются или доделываются за секунды. Журналируются обычно только метаданные — структура ФС остаётся целой, хотя последние записанные в файл данные могут пропасть.
Проверка тома в Windows — chkdsk. Без ключей он только читает и сообщает о проблемах (строки хода выполнения в выводе убраны):
PS> chkdsk S:
Тип файловой системы: NTFS.
Метка тома: NTFS.
ПРЕДУПРЕЖДЕНИЕ! Параметр F не указан.
CHKDSK выполняется в режиме только чтения.
Этап 1. Проверка базовой структуры файловой системы...
Обработано записей файлов: 256.
Проверка файлов завершена.
Обработано больших файловых записей: 0.
Обработано поврежденных файловых записей: 0.
Этап 2. Проверка связей имен файлов...
Обработано записей повторного анализа: 1.
Обработано записей индекса: 278.
Проверка индексов завершена.
Проверено неиндексированных файлов: 0.
Восстановлено неиндексированных файлов в утерянное и найденное: 0.
Обработано записей повторного анализа: 1.
Этап 3. Проверка дескрипторов безопасности...
Проверка дескрипторов безопасности завершена.
Обработано файлов данных: 11.
Windows проверила файловую систему и не обнаружила проблем.
Дальнейшие действия не требуются.
724927 КБ всего на диске.
40772 КБ в 11 файлах.
76 КБ в 13 индексах.
0 КБ в поврежденных секторах.
5191 КБ используется системой.
4496 КБ занято под файл журнала.
678888 КБ свободно на диске.
4096 байт в каждой единице распределения.
Всего единиц распределения на диске: 181231.
Доступно единиц распределения на диске: 169722.
chkdsk S: /f исправляет ошибки, но требует, чтобы том никто не использовал. Для системного диска C: проверка назначается на следующую перезагрузку. В Linux то же делает fsck — только на отмонтированном томе; корневую ФС система проверяет сама при загрузке.
В ext4 о каждом файле хранится inode (индексный дескриптор) — запись с номером, где есть всё, кроме имени: тип, права, владелец, размер, даты, число ссылок и экстенты с данными. Имя хранится в каталоге: каталог — просто таблица «имя → номер inode». Создадим ext4 на файле-образе в 100 МБ — для этого права администратора не нужны:
$ truncate -s 100M fs.img
$ mkfs.ext4 fs.img
mke2fs 1.47.2 (1-Jan-2025)
Discarding device blocks: 0/102400 done
Creating filesystem with 102400 1k blocks and 25584 inodes
Filesystem UUID: 2517981b-f4ee-4d8b-93b6-9ef0f9b92696
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Allocating group tables: 0/13 done
Writing inode tables: 0/13 done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: 0/13 done
$ dumpe2fs -h fs.img 2>/dev/null | grep -E "^(Filesystem volume name|Inode count|Block count|Block size|Free inodes|Inode size|Journal size|Filesystem features)"
Filesystem volume name: <none>
Filesystem features: has_journal ext_attr resize_inode dir_index orphan_file filetype extent 64bit flex_bg metadata_csum_seed sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
Inode count: 25584
Block count: 102400
Free inodes: 25572
Block size: 1024
Inode size: 256
$ debugfs -R "ls -l /" fs.img 2>/dev/null
2 40755 (2) 0 0 1024 31-Oct-2026 11:10 .
2 40755 (2) 0 0 1024 31-Oct-2026 11:10 ..
11 40700 (2) 0 0 12288 31-Oct-2026 11:10 lost+found
Размер блока здесь 1 КБ (Block size: 1024): для маленьких томов mkfs.ext4 выбирает мелкий блок, для обычных дисков — 4 КБ. Число inode задаётся при создании ФС и потом не меняется: на этом томе 25 584 inode, значит, больше 25 584 файлов на нём не будет, даже если место ещё есть. Список возможностей (features) начинается с has_journal — у ФС есть журнал. debugfs читает ФС прямо из образа: корневой каталог — всегда inode 2, папка lost+found (сюда fsck складывает найденные потерянные файлы) — inode 11.
Номер inode показывает ls -i, все сведения — stat:
$ echo "отчёт за октябрь" > report.txt
$ ls -li
итого 4
223332 -rw-rw-r-- 1 student student 31 окт 31 11:10 report.txt
$ stat report.txt
Файл: report.txt
Размер: 31 Блоков: 8 Блок В/В: 4096 regular file
Устройство: 0/35 Инода: 223332 Ссылки: 1
Доступ: (0664/-rw-rw-r--) Uid: ( 1000/ student) Gid: ( 1000/ student)
Доступ: 2026-10-31 11:10:51.435187390 +0300
Модифицирован: 2026-10-31 11:10:51.435187390 +0300
Изменён: 2026-10-31 11:10:51.435187390 +0300
Создан: 2026-10-31 11:10:51.435187390 +0300
Теперь ссылки. ln создаёт жёсткую ссылку — второе имя для того же inode, ln -s — символическую, которая хранит путь:
$ ln report.txt copy.txt
$ ln -s report.txt link.txt
$ ls -li
итого 8
223332 -rw-rw-r-- 2 student student 31 окт 31 11:10 copy.txt
223333 lrwxrwxrwx 1 student student 10 окт 31 11:10 link.txt -> report.txt
223332 -rw-rw-r-- 2 student student 31 окт 31 11:10 report.txt
$ rm report.txt
$ cat copy.txt
отчёт за октябрь
$ cat link.txt
cat: link.txt: Нет такого файла или каталога
$ ls -li
итого 4
223332 -rw-rw-r-- 1 student student 31 окт 31 11:10 copy.txt
223333 lrwxrwxrwx 1 student student 10 окт 31 11:10 link.txt -> report.txt
У report.txt и copy.txt один номер inode (первый столбец) и счётчик ссылок 2 (третий столбец). У link.txt свой inode и тип l. После удаления report.txt данные живы под именем copy.txt — счётчик стал 1; inode и данные освободятся, только когда он станет 0. А символическая ссылка указывает на имя, которого больше нет, — она «повисла».
Кончиться может не только место, но и inode: df -h показывает свободное место, df -i — свободные inode. Если миллионы мелких файлов (кэш, сессии) съели все inode, запись невозможна, хотя гигабайты свободны.
В Windows каждый том получает букву, а дисков-«корней» много: C:, D:, S:. Том можно подключить и в пустую папку на NTFS: Управление дисками → правая кнопка по тому → Изменить букву диска или путь → Добавить → Подключить том как пустую NTFS-папку.
В Linux дерево одно, с корнем /, и каждый том монтируется в какой-нибудь каталог этого дерева. Устройства дисков — файлы в /dev; буква b в начале строки — блочное устройство:
$ ls -l /dev/sda /dev/sda1
brw-rw---- 1 root disk 8, 0 авг 26 09:37 /dev/sda
brw-rw---- 1 root disk 8, 1 авг 26 09:37 /dev/sda1
Что куда смонтировано, показывают findmnt и df, а что монтировать при загрузке — файл /etc/fstab:
$ findmnt -t ext4,vfat,swap -o TARGET,SOURCE,FSTYPE,OPTIONS
TARGET SOURCE FSTYPE OPTIONS
/ /dev/sda1 ext4 rw,relatime,errors=remount-ro
$ df -hT -x tmpfs -x devtmpfs
Файловая система Тип Размер Использовано Дост Использовано% Cмонтировано в
/dev/sda1 ext4 30G 27G 1,4G 96% /
$ df -i /
Файловая система Iнодов IИспользовано IСвободно IИспользовано% Cмонтировано в
/dev/sda1 1986768 443931 1542837 23% /
$ grep -v "^#" /etc/fstab
UUID=97c23eb6-eee2-49d6-917b-29ce316c376b / ext4 errors=remount-ro 0 1
UUID=8811aaa5-3acc-461c-8198-304232ebf932 none swap sw 0 0
/dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0
В /etc/fstab по строке на том: что (по UUID — уникальному номеру ФС, он не меняется, даже если диск переставят в другой разъём), куда, тип, параметры, нужно ли архивировать и в каком порядке проверять при загрузке. errors=remount-ro — при ошибке ФС перемонтировать корень только для чтения, чтобы не испортить данные. Вручную том монтируют командой sudo mount /dev/sdb1 /mnt/data, образ-файл — sudo mount -o loop fs.img /mnt/data, отключают — sudo umount /mnt/data.
На этом сервере занято 96 % корневой ФС — пора разбираться, чем. Начинают с du -sh /var/* | sort -h: чаще всего место съедают журналы и кэши.
| FAT32 | exFAT | NTFS | ext4 | |
|---|---|---|---|---|
| Наибольший файл | 4 ГБ без 1 байта | Практически без ограничения | Практически без ограничения | 16 ТБ (блок 4 КБ) |
| Журнал | Нет | Нет | Да | Да |
| Права доступа | Нет | Нет | ACL | rwx, ACL |
| Ссылки | Нет | Нет | Жёсткие, символические | Жёсткие, символические |
| Читают | Все ОС и устройства | Windows, macOS, Linux, современные телевизоры | Windows; Linux — с драйвером | Linux; Windows — только сторонними программами |
| Где применять | Раздел EFI, флешки для старых устройств | Флешки и карты памяти, большие файлы | Системный диск и данные Windows | Системный диск и данные Linux |
Частый вопрос: «Почему фильм на 5 ГБ не копируется на флешку, хотя на ней 30 ГБ свободно?» Флешка отформатирована в FAT32, а там файл не может быть больше 4 ГБ. Сбивает с толку то, что Windows в этом случае пишет «Недостаточно места на диске» (ошибка 112) — мы проверили: на томе FAT32 с 6 ГБ свободного места файл 4,5 ГБ не создаётся с этой ошибкой, а на exFAT и NTFS создаётся. Решение — переформатировать её в exFAT (данные сначала скопировать).
chkdsk и fsck/etc/fstab; кончиться могут и место (df -h), и inode (df -i)