Что такое файловая система
Как из миллиардов одинаковых секторов диска получаются привычные файлы и папки.
Файловая система — это часть ОС, которая организует данные на диске в виде файлов и каталогов и управляет их хранением и доступом.
Проблема, которую решает файловая система
Диск — это просто огромный массив пронумерованных блоков (секторов), в каждом несколько сотен байт. Работать с ним напрямую невозможно: помнить, что «мой документ — это блоки 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 — это системные вызовы.
- Открытый файл представлен файловым дескриптором.