Раздел 08 — Файловые системы

Как файловая система превращает блоки диска в файлы и папки и чем FAT32, NTFS и ext4 отличаются на практике

Прогресс курса Раздел 8 из 12

Что вы освоите в этом разделе

6 академических часов: 2 теории, 4 практики. Вся практика в Windows — на виртуальном диске .vhdx, как в разделе 03: на нём можно форматировать без риска. Команды — в терминале администратора.
01

Зачем нужна файловая система

Диск умеет одно: прочитать или записать блок (сектор) по номеру. Файловая система — способ организации данных на разделе, который превращает миллионы пронумерованных блоков в файлы с именами, папки, права и даты. Она отвечает на вопросы: в каких блоках лежит файл, какие блоки свободны, кто может его читать, что делать, если питание пропало посреди записи.

ПонятиеЧто это
РазделЧасть диска из таблицы разделов (раздел 03)
ТомТо, на чём создана файловая система: обычно раздел, иногда несколько разделов или дисков вместе
ФорматированиеЗапись на том пустой файловой системы: служебных таблиц, корневого каталога
Кластер (блок)Минимальная порция места, которую ФС выдаёт файлу; файл в 1 байт занимает целый кластер
МетаданныеДанные о файле: имя, размер, даты, права, где лежат блоки
МонтированиеПодключение тома к дереву каталогов: буква S: в Windows, каталог вроде /mnt/data в Linux

Размер кластера — компромисс: большой кластер ускоряет работу с большими файлами, но тратит место на мелких (последний кластер заполнен в среднем наполовину — та же внутренняя фрагментация, что у страниц в разделе 07). Для NTFS и ext4 обычно 4 КБ.

02

Как найти блоки файла

СпособКак устроеноПлюсы и минусыГде
НепрерывноеФайл — подряд идущие блоки: начало и длинаБыстро читать, но файл трудно увеличить, диск фрагментируетсяКомпакт-диски (ISO 9660)
Связный списокТаблица, где для каждого кластера записан номер следующегоПросто; чтобы найти середину файла, надо пройти цепочкуFAT, exFAT
ИндексноеУ файла своя запись со списком блоков или экстентов — непрерывных участков «начало + длина»Быстрый доступ к любому месту, удобно хранить права и другие сведенияNTFS (MFT), ext4 (inode)

В FAT (File Allocation Table) в каталоге записано имя файла и номер первого кластера, а в таблице FAT — цепочка: кластер 5 → 6 → 9 → конец. Таблица хранится в двух копиях в начале тома; если она повреждена, файлы теряются целиком.

03

FAT32 и NTFS на одном диске

Сравнивать лучше на деле. Создадим виртуальный диск на 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).

04

NTFS изнутри

Сердце 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
05

Журналирование и проверка тома

Создание файла — несколько записей в разные места: запись в каталог, запись в 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 — только на отмонтированном томе; корневую ФС система проверяет сама при загрузке.

06

ext4 и inode

В 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, запись невозможна, хотя гигабайты свободны.

07

Монтирование

В 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: чаще всего место съедают журналы и кэши.

08

Какую файловую систему выбрать

FAT32exFATNTFSext4
Наибольший файл4 ГБ без 1 байтаПрактически без ограниченияПрактически без ограничения16 ТБ (блок 4 КБ)
ЖурналНетНетДаДа
Права доступаНетНетACLrwx, ACL
СсылкиНетНетЖёсткие, символическиеЖёсткие, символические
ЧитаютВсе ОС и устройстваWindows, macOS, Linux, современные телевизорыWindows; Linux — с драйверомLinux; Windows — только сторонними программами
Где применятьРаздел EFI, флешки для старых устройствФлешки и карты памяти, большие файлыСистемный диск и данные WindowsСистемный диск и данные Linux

Частый вопрос: «Почему фильм на 5 ГБ не копируется на флешку, хотя на ней 30 ГБ свободно?» Флешка отформатирована в FAT32, а там файл не может быть больше 4 ГБ. Сбивает с толку то, что Windows в этом случае пишет «Недостаточно места на диске» (ошибка 112) — мы проверили: на томе FAT32 с 6 ГБ свободного места файл 4,5 ГБ не создаётся с этой ошибкой, а на exFAT и NTFS создаётся. Решение — переформатировать её в exFAT (данные сначала скопировать).

Ключевые выводы раздела

Запомните главное

  • ФС превращает блоки в файлы: хранит имена, метаданные, карту свободного места; кластер — минимальная порция места
  • FAT — цепочки кластеров без прав и журнала; NTFS — MFT, журнал, ACL, ссылки, потоки, сжатие; ext4 — inode и журнал
  • Журналирование сохраняет целостность ФС при сбое; проверка — chkdsk и fsck
  • Inode хранит всё, кроме имени; жёсткая ссылка — ещё одно имя inode, символическая — файл с путём
  • Linux монтирует тома в одно дерево по /etc/fstab; кончиться могут и место (df -h), и inode (df -i)
Практические задания — на учебном портале. Задания, критерии оценивания, сдача работ и оценки преподавателя — в курсе на portal.nevabit.ru. Учётную запись выдаёт преподаватель.
Раздел 07: Управление памятью Все разделы Раздел 09: Ввод-вывод и устройства