Что такое файловая система

Как из миллиардов одинаковых секторов диска получаются привычные файлы и папки.

Файловая система — это часть ОС, которая организует данные на диске в виде файлов и каталогов и управляет их хранением и доступом.

Проблема, которую решает файловая система

Диск — это просто огромный массив пронумерованных блоков (секторов), в каждом несколько сотен байт. Работать с ним напрямую невозможно: помнить, что «мой документ — это блоки 5012, 5013 и 88000» нереально. Файловая система даёт удобную абстракцию: вы работаете с файлом по имени, а где он физически лежит — забота ОС.

Что такое файл

Файл — именованная совокупность данных. Для программы это просто последовательность байтов, к которым можно обращаться. Кроме самих данных, у файла есть метаданные — данные о данных:

МетаданныеПример
имяreport.txt
размер4096 байт
права доступачтение/запись/исполнение
владелецпользователь и группа
временные меткисоздан, изменён, открыт
расположение данныхномера блоков на диске

Каталоги и пути

Каталог (директория, папка) — это особый файл, который хранит список других файлов и каталогов. Каталоги вкладываются друг в друга, образуя дерево с корнем (в Unix это /). Путь — это маршрут по дереву к нужному файлу:

/                      <- корень
├── home/
│   └── ernest/
│       └── report.txt  <- путь: /home/ernest/report.txt
└── etc/
    └── hosts           <- путь: /etc/hosts
  • Абсолютный путь — от корня: /home/ernest/report.txt.
  • Относительный путь — от текущего каталога: report.txt.

Операции над файлами

Файловая система предоставляет программам набор операций, которые превращаются в системные вызовы: open (открыть, получить дескриптор), read/write (читать/писать), seek (переместить позицию), close (закрыть). Открытый файл представлен файловым дескриптором — небольшим числом, по которому ОС находит всё нужное о файле.

Команды для работы с файлами

ls -l /home/ernest      # список файлов с метаданными (права, размер, дата)
stat report.txt         # подробные метаданные одного файла
df -h                   # сколько места занято/свободно на файловых системах
du -sh ./project        # размер каталога

Считаем дерево каталогов

Смоделируем файловую систему как дерево и посчитаем общий размер каталога и число файлов в нём.

fs = {
    "/": ["home", "etc"],
    "home": ["ernest"],
    "ernest": ["report.txt", "photo.jpg"],
    "etc": ["hosts"],
}
sizes = {"report.txt": 4096, "photo.jpg": 200000, "hosts": 312}

def is_dir(name):
    return name in fs

def total_size(node):
    if not is_dir(node):
        return sizes[node]
    return sum(total_size(child) for child in fs[node])

def count_files(node):
    if not is_dir(node):
        return 1
    return sum(count_files(child) for child in fs[node])

print(f"Размер каталога ernest: {total_size('ernest')} байт")
print(f"Файлов в ernest: {count_files('ernest')}")
print(f"Всего файлов в системе: {count_files('/')}")
print(f"Общий размер: {total_size('/')} байт")

Вывод:

Размер каталога ernest: 204096 байт
Файлов в ernest: 2
Всего файлов в системе: 3
Общий размер: 204408 байт

Итог

  • Файловая система превращает «массив блоков» диска в файлы и каталоги.
  • Файл — именованные данные плюс метаданные (размер, права, владелец, время, расположение).
  • Каталоги образуют дерево; путь — маршрут к файлу от корня или текущего каталога.
  • Операции open/read/write/seek/close — это системные вызовы.
  • Открытый файл представлен файловым дескриптором.
Проверьте себя
1. Что такое каталог (директория) с точки зрения файловой системы?
AФизический раздел диска
BОсобый файл, хранящий список других файлов и каталогов
CКэш для часто используемых файлов
DТаблица прав доступа
2. Что относится к метаданным файла?
AТолько содержимое файла
BРазмер, права доступа, владелец и временные метки
CНомер процесса, открывшего файл
DАлгоритм замещения страниц
3. Чем абсолютный путь отличается от относительного?
AАбсолютный короче относительного
BАбсолютный отсчитывается от корня, относительный — от текущего каталога
CОтносительный работает только для каталогов
DЭто синонимы
Поддержать проект