Files
OS-LABS/rgz_vlasd/report.md
T
2026-05-18 16:59:56 +07:00

13 KiB
Raw Blame History

Отчет по дисциплине «Операционные системы»

РГР «Разработка простой файловой системы»

Выполнил: ____________________
Группа: ____________________
Проверил: ____________________
Новосибирск, 2026

Оглавление

  1. Введение
  2. Постановка задачи
  3. Выбранная архитектура файловой системы
  4. Структура носителя и основные данные
  5. Реализованные операции
  6. Алгоритмы работы
  7. Тестирование
  8. Ограничения реализации
  9. Вывод

Введение

Цель работы — разработать учебную файловую систему на языке C, использующую обычный бинарный файл как виртуальный носитель произвольного доступа. Программа должна не только хранить файлы и каталоги, но и показывать основные принципы настоящих файловых систем: разметку носителя, учет свободного места, хранение метаданных, работу с путями и прикладные операции обслуживания.

В качестве ориентира использовался предоставленный пример реализации, однако приоритет был отдан требованиям задания. Поэтому итоговая программа сохраняет простую учебную архитектуру примера, но дополнительно реализует операции open, close, seek, read, write, rename, импорт и экспорт, дефрагментацию и сжатие.

Постановка задачи

Согласно заданию необходимо разработать систему управления файлами, где разделом является бинарный файл произвольного доступа. Реализация должна включать:

  • физический уровень хранения данных;
  • структуру учета свободных блоков;
  • базовый уровень с индексными метаданными;
  • размещение содержимого файлов;
  • систему каталогов и путей;
  • символьные операции над файлами и каталогами;
  • прикладную утилиту для форматирования, просмотра, импорта, экспорта, дефрагментации и сжатия.

Выбранная архитектура файловой системы

Уровень Реализация
Физический уровень Кластеры фиксированного размера по 1024 байта
Учет свободного места Битовая карта
Базовый уровень Индексный файл с дескрипторами объектов
Размещение файлов Список номеров кластеров в дескрипторе
Каталоги Неупорядоченный список имен с линейным поиском
Прикладной уровень Интерактивная консольная утилита

Выбранная схема хорошо подходит для учебной реализации: она достаточно близка к реальным файловым системам, но не требует сложных деревьев, журналирования и динамических таблиц.

flowchart LR
    A[Файл-носитель] --> B[Суперблок]
    A --> C[Битовая карта]
    A --> D[Индексный файл]
    A --> E[Область данных]
    D --> F[Файлы]
    D --> G[Каталоги]
    F --> E

Структура носителя и основные данные

В начале виртуального диска находится суперблок. Он хранит сигнатуру файловой системы, размер диска, размер кластера, смещения служебных областей и индекс корневого каталога.

typedef struct {
    uint32_t magic;
    uint32_t disk_size;
    uint32_t cluster_size;
    uint32_t total_clusters;
    uint32_t bitmap_offset;
    uint32_t bitmap_size;
    uint32_t index_offset;
    uint32_t index_clusters;
    uint32_t data_start_cluster;
    uint32_t root_index;
} SuperBlock;

После суперблока располагается битовая карта. Каждый ее бит соответствует одному кластеру: 0 означает свободный кластер, 1 — занятый. Далее находится индексный файл, представленный массивом дескрипторов Entry.

typedef struct {
    char name[32];
    uint8_t type;
    uint8_t compressed;
    uint32_t parent;
    uint32_t size;
    uint32_t stored_size;
    uint32_t cluster_count;
    uint32_t clusters[128];
} Entry;

Поле size хранит логический размер файла, видимый пользователю, а stored_size — фактическое количество байт на носителе. Это различие необходимо для поддержки сжатых файлов.

flowchart TB
    S[Суперблок] --> B[Битовая карта]
    B --> I[Индексный файл]
    I --> D[Область данных]
    I --> R[Корневой каталог /]
    R --> F[Дескрипторы файлов и каталогов]
    F --> D

Реализованные операции

Программа собирается из файла simplefs.c и запускается с именем файла-носителя:

gcc -std=c11 -Wall -Wextra -pedantic simplefs.c -o simplefs
./simplefs disk.img

Поддерживаются следующие команды:

Команда Назначение
format <KiB> создание новой файловой структуры
info сведения о носителе и свободном месте
ls [path], pwd, cd <path> просмотр и навигация по каталогам
mkdir, rmdir создание и удаление каталогов
touch, rm, rename операции над файлами
write, cat запись и чтение текстовых данных
import, export импорт и экспорт отдельных файлов
importdir, exportdir импорт и экспорт папок
savecarrier, loadcarrier экспорт и импорт всего носителя
compress сжатие файла методом RLE
defrag упорядочивание занятых кластеров

На уровне программного интерфейса реализованы функции fs_open, fs_close, fs_seek, fs_read и fs_write. Открытый файл использует буфер в памяти, поэтому чтение и запись записей произвольной длины выполняются без прямой работы пользователя с кластерами.

Алгоритмы работы

Форматирование

При выполнении format создается бинарный файл нужного размера, вычисляются размеры служебных областей, резервируются занятые кластеры и создается корневой каталог /.

Выделение свободного кластера

Алгоритм линейно просматривает битовую карту, начиная с области данных. Первый свободный бит помечается как занятый, а номер соответствующего кластера возвращается вызывающей функции.

Работа с каталогами

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

Сжатие

Команда compress использует простой алгоритм RLE: одинаковые подряд идущие байты заменяются парой «количество + значение». Если сжатый вариант не меньше исходного, файл не изменяется. При чтении сжатый файл автоматически восстанавливается в обычный вид.

Дефрагментация

Команда defrag временно считывает содержимое файлов, очищает карту размещения области данных и записывает файлы заново подряд. После операции используемые кластеры становятся компактно расположенными.

Тестирование

Пример базового сценария:

format 512
mkdir /docs
touch /docs/a.txt
write /docs/a.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
cat /docs/a.txt
compress /docs/a.txt
ls /docs
rename /docs/a.txt b.txt
export /docs/b.txt exported.txt
defrag
info

Ожидаемые результаты:

Проверка Результат
Форматирование носителя создается корректный виртуальный диск
Создание каталога и файла объекты появляются в ls
Запись и чтение cat выводит ранее записанный текст
Сжатие повторяющихся данных stored_size становится меньше size
Переименование файл доступен под новым именем
Экспорт создается внешний файл с тем же содержимым
Дефрагментация содержимое файлов сохраняется, кластеры уплотняются

Ограничения реализации

Ограничение Причина
Не более 128 объектов фиксированный размер индексного файла
Не более 128 кластеров на файл фиксированный массив номеров кластеров
Длина имени до 31 символа размер поля name[32]
Линейный поиск по каталогу выбрана простая неупорядоченная структура
RLE эффективно не для всех данных алгоритм выбран ради понятности реализации
Нет одновременного доступа нескольких процессов учебная однопользовательская модель

Вывод

В ходе работы была реализована простая файловая система, работающая поверх бинарного файла как виртуального носителя. Реализация охватывает все основные уровни, указанные в задании: физическое размещение, учет свободных блоков, индексные метаданные, каталоги, операции над файлами и сервисные команды управления носителем.

Полученная программа остается достаточно простой для изучения начинающим разработчиком на C, но при этом показывает полный путь данных: от пользовательской команды до изменения битовой карты, индексного дескриптора и байтов в кластерах виртуального диска.