Преподаватель - Кашин Андрей Васильевич.
Примечание: Те, кто сдал курсовой на 5, получили 5 по экзамену автоматом. Таких, кстати, было подавляющее большинство в обеих группах. Осталось человек 7-8 без курсового.
Создать модель файловой системы (МФС) какой-либо операционной системы. (Можно своей собственной).
МФС должна использовать некий файл в качестве виртуального жёсткого диска с виртуальной файловой структурой, аналогичной файловой структуре реального жёсткого диска. На этом виртуальном жёстком диске создаются "файлы" и "папки" в структуре файловой системы. Также должны быть реализованы сымитированные основные операции реальной файловой системы: навигация по папкам, создание, удаление, чтение папок и файлов, запись и просмотр данных файла, копирование папок и файлов и перемещение/переименование файлов. Должны быть реализованы базовые механизмы защиты папок и файлов и безопасности - создание и удаление пользователей, вход в систему разными пользователями с разными правами доступа, изменение прав доступа и владельца папок и файлов, форматирование диска. Вся информация на виртуальном жёстком диске должна быть разбита на блоки данных (имитация блочности реальных жёстких дисков). Также необходимо обеспечить отсутствие ограничения на максимальное число возможных пользователей.
МФС должна быть реализована в виде 3 уровней абстракции :
1 уровень : На этом уровне предполагается реализовать самые низкоуровневые операции МФС: непосредственнная работа с виртуальным жёстким диском - с его "секторами", "кластерами" и т.п.
2 уровень : На этом уровне предполагается реализовать основные функции для работы файловой системы - создание - удаление "файлов" и "папок", работающие только с функциями 1 уровня абстракции, а не непосредственно с "секторами", "кластерами" и т.п.
3 уровень : На этом уровне предполагается реализовать самые высокоуровневые операции: приём и расшифровка команд с консоли и конвертация их в вызовы функций 2 уровня абстракции. Здесь же удобно реализовать права доступа и безопасность. Аналогичность виртуальной файловой структуры виртуального жёсткого диска файловой структуре реального жёсткого диска подразумевает имитацию реальной файловой структуры реальной операционной системы. Перед началом работы с программой виртуальный жёсткий диск должен быть "отформатирован" - т.е. должна быть создана первоначальная структура "папок" и "файлов", создан пользователь "администратор" и задан его пароль.
Группы пользователей можно не создавать. Курсовой проект можно делать вдвоём (т.е. 2 студента могут делать 1 курсовой). Требования к интерфейсу - минимальны. Проще всего сделать консольное приложение на MS Visual С++ v6.0 и реализовать управление МФС командами, вводимыми через эту консоль. (Т.е. интересен не интерфейс, а сама суть, т.е. реализация).
Я в своё время не успел сделать этот курсовой проект самостоятельно и сдавал его вместе с другим студеном. Но зато потом я всё-таки сделал его в качестве своей бакалаврской работы. Делал я этот "курсовой" один летний месяц при 8-часовом рабочем дне. Я удивляюсь безответственности Долгова В.В., задавшего такую курсовую работу, которую нужно делать в течение 1 месяца не покладая рук с утра до вечера и при этом не заниматься ничем другим. Идея этого курсового, в общем-то, хороша. Но это слишком большая роскошь - в течение учебного семестра заниматься такими вещами. А когда же тогда делать курсовые и лабораторные по другим предметам ?
Я сделал модель файловой системы ОС Unix, которую мы изучали на 4 курсе в 8 семестре (см. "Системы реального времени"). Работа у меня получилась очень солидная, соответствующая всем требованиям задания. Так как это всё-таки уже бакалаврская работа, то к ней прилагается обширная пояснительная записка, и в текстах исходного кода я старался использовать как можно больше комментариев.
Делал я эту работу следующим образом: собрал все доступные для себя источники, описывающие ОС UNIX - книги, в том числе электронные, статьи и т.д., и выделил из каждого источника всю информацию, относящуюся к описанию файловой системы ОС UNIX. Затем проанализировал все эти выдержки из каждого источника и на базе этого разработал архитектуру своей программы. При этом я старался максимально более точно воспроизвести в своей программе основные конструктивные элементы настоящей файловой системы ОС UNIX так, как я их себе умозрительно представлял. Я никогда не смотрел исходники ОС UNIX и не знаю, как на самом деле работает её файловая система. Я просто хотел сделать модель, которая внешне и концептуально была бы как можно более похожа на настоящую файловую систему ОС UNIX.
В результате получилась программа, которую, в отличие от многих других моих программ, можно назвать моей в полном смысле слова, т.е. в ней нет ни одной строки чьего-то чужого кода и не использованы ничьи идеи по программному коду.
По идее, перед началом работы с программой виртуальный жёсткий диск disk.fs5 должен быть "отформатирован" - т.е. должна быть создана первоначальная структура папок и файлов UNIX-подобных ОС, создан суперпользователь "root" и задан его пароль. Но на прилагаемом виртуальном жёстком диске disk.fs5 я это уже сделал. Там также уже созданы несколько "файлов" и "папок". Созданы суперпользователь "root" и простой пользователь "user". Кроме того, необходимо, чтобы виртуальный жёсткий диск disk.fs5 находился в той же папке, что и файл Unix_FS.exe. Для работы с МФС используются такие же команды, как и в реальной ФС ОС Unix, с таким же синтаксисом. Разница лишь в том, что они несколько ограничены по сравнению с настоящими.(Например, создать можно только 1 файл или папку одновременно, а не несколько сразу, как в Unix).
Всё это есть в пояснительной записке. Ещё раз
приведу их здесь:
cd
Изменяет текущий рабочий каталог.
Синтаксис: cd <directory>;
<directory> - каталог, в который перейти (''.''
ссылается на текущий каталог, ''..'' - на
родительский каталог).
Примеры:
cd .. переходит на уровень
выше
cd . никуда не переходит,
т.к. ''.'' - ссылка на текущ. каталог
cd переходит в домашний
каталог (без параметров)
cd /bin переходит в каталог bin по
абсолютному пути
cd bin переходит в подкаталог bin текущего
каталога
cd ../foo переводит из текущего каталога в ../foo.
ls
Выдает информацию о файлах в каталоге.
Синтаксис: ls <file>
Где <file> имя файлов или каталогов, информацию
про которые надо выдать.
Опция:
-l (выдает в длинном (``long'') формате информацию о
размерах файлов, владельцах, правах доступа и
т.д.).
Пример: ls -l /home/user выдаст содержимое каталога
/home/user.
cp
Копирует файл в файл или каталог.
Синтаксис: cp <file> <destination>
Где <file> имя копируемого файла, а <destination>
файл или каталог, в который копируют.
Пример: cp ../frog joe копирует файл ../frog в файл или
каталог joe.
cp -R
Копирует (рекурсивно ) каталог со всем содержимым
в каталог.
Синтаксис: cp <dir> <destination>
Где <dir> имя копируемого каталога, а <destination>
каталог, в который копируют.
Пример: cp ../frog joe копирует каталог ../frog в каталог
joe.
vi
Создаёт файл.
Синтаксис: vi <file>
Где <file> имя создаваемого файла.
Пример: vi /home/user создаёт файл user в каталоге /home.
Те, кто знает Unix, скажут, что это не является
встроенной в Unix командой.
На самом деле в Unix такой командой вызывают
встроенный текстовый редактор,
который при запуске создаёт файл.
vi -i
Записывает содержимое в файл и сохраняет его на
диске.
Синтаксис: vi -i <file>
Где <file> имя записываемого файла.
Пример: vi -i /home/user записывает содержимое в файл user
в каталоге /home
и сохраняет его.
mv
Перемещает файл в другой файл или каталог. Эта
команда не эквивалентна копированию с
последующим уничтожением оригинала. Она может
быть использована для переименования файлов, как
команда RENAME из MS-DOS.
Синтаксис: mv <file> <destination>
Где <file> имя перемещаемого файла, а <destination>
имя файла или каталога, в который перемещают.
Пример: mv ../frog joe перемещает файл ../frog в файл или
каталог joe.
rm
Удаляет файл. Имейте в виду, когда в UNIX удаляются
файлы, они невосстановимы.
Синтаксис: rm <file>
Где <file> имя удаляемого файла.
Пример: rm /home/user/joe /home/user/frog удаляет файлы joe и frog в
каталоге /home/user.
mkdir
Создает новый каталог.
Синтаксис: mkdir <dir>
Где <dir> создаваемый каталог.
Пример: mkdir /home/user/test создает каталог test в каталоге
/home/user.
rmdir
Эта команда удаляет каталог с содержимым.
Синтаксис: rmdir <dir>
Где <dir> удаляемый каталог.
Пример: rmdir /home/larry/papers удаляет каталог /home/larry/papers,
если он пустой.
cat
Используется для выдачи полного содержания
файла разом
Синтаксис: cat <file>
Где <file> - выдаваемый файл.
Пример: cat letters/from-mdw выдает на дисплей файл
letters/from-mdw.
adduser
Эта команда создаёт нового пользователя.
Доступна только root'у.
Синтаксис: adduser <new_user_name>
Где <new_user_name> имя нового пользователя.
adduser user - создаёт пользователя user.
deluser
Эта команда удаляет пользователя. Доступна
только root'у.
Синтаксис: deluser <user_name>
Где <user_name> имя удаляемого пользователя.
deluser user - удаляет пользователя user.
chown
Эта команда меняет владельца файла или папки.
Доступна только root'у.
Синтаксис: chown <new_owner_name> <dir/file>
Где <new_owner_name> имя нового владельца, а <dir/file>
- путь к объекту, владельца которого мы изменяем.
chmod
Эта команда меняет права доступа к файлу или
папке. Доступна root'у и владельцу файла.
Синтаксис: chmod <new_rights> <dir/file>
Где <new_rights> новые права, а <dir/file> - путь к
объекту, права на которые мы изменяем.
Пример: chmod <o+x> </root> - other добавить право на
выполнение /root.
chmod <u+x> </root> - добавить user право на
выполнение /root.
chmod <o+w> </root> - добавить other право на запись в
/root.
chmod <u-r> </root> - удалить у user право на чтение
/root.
mkfs
Отформатировать виртуальный жёсткий диск без
параметров.
reenter
Зайти в сиситему другим пользователем.
exit
Выйти из системы.
Все пути к файлам или папкам, принимаемые
командами в качестве аргументов, могут быть
абсолютными, относительными и относительными с
переходом на уровень вверх (см. команду cd).
Главный модуль main.cpp:
Вызывает в бесконечном цикле функции модуля 3-го
уровня абстракции и обеспечивает вход в систему
под другим пользователем и выход из системы.
Модуль 3-го уровня абстракции Level3.cpp:
Содержит интерфейсный объект, который
занимается тем, что проводит процедуру
аутентификации, выдаёт на экран приглашение,
считывает введённые пользователем команды,
распознаёт их и конвертирует их в вызовы функций
модуля 2-го уровня абстракции. Модуль 3-го уровня
абстракции обеспечивает динамическую навигацию
по папкам и файлам; обеспечивает работу
механизма прав доступа к файлам и папкам ( т.е.
функции модуля 2-го уровня абстракции вызываются
только при разрешающей совокупности прав
доступа и владельца на файл или папку).
Модуль 2-го уровня абстракции Level2.cpp:
На этом уровне находится то, что можно назвать
ядром файловой системы - основные функции,
вызывая которые можно пользоваться и управлять
файловой системой.
Вот перечень основных функций модуля 2-го уровня
абстракции:
1. Создать папку.
2. Просмотреть содержимое папки.
3. Удалить папку (co всем содержимым !).
4. Копировать папку (co всем содержимым !).
5. Создать файл.
6. Записать содержимое в файл.
7. Просмотреть содержимое файла.
8. Стереть содержимое файла.
9. Удалить файл с содержимым / без содержимого.
10. Копировать файл с содержимым.
11. Переместить / переименовать файл с содержимым.
12. Добавить пользователя.
13. Удалить пользователя.
14. Изменить пользователя.
15. Изменить права доступа.
16. Узнать права доступа.
17. Отформатировать диск.
А также ряд служебных функций.
Модуль 1-го уровня абстракции Level1.cpp:
Содержит самые низкоуровневые функции, напрямую
работающие с "диском". Файловая система
содержит следующие объекты:
1. i - узел - объект, соответствующий любому файлу
или папке. Содержит информацию:
* Признак файла или папки.
* Номер владельца файла или папки.
* Битовая шкала прав доступа к файлу или папке.
* Массив адресов блоков данных файла или папки.
* Индекс этого массива.
2. Блок данных папки - объект, соответствующий
одному элементу из цепочки, описывающей
структуру папки. Адреса элементов этой цепочки и
их количество хранятся в i - узле папки. Сам же
блок содержит массив записей о вложенных в
данную папку элементов - папках и файлах (кроме
того, запись о самой себе и о родительской папке)
и размер этого массива . Одна такая запись имеет
вид "имя файла (папки)" - "номер i - узла".
Соответственно, все эти элементы могут
динамически меняться при различных действиях
файловой системы - при создании-удалении и т.п.
могут меняться длины цепочек, их содержимое, а
также содержимое записей и содержимое элементов,
ссылки на которые занесены в запись.
3. Блок данных файла - объект, соответствующий
одному элементу из цепочки, описывающей
структуру файла. Адреса элементов этой цепочки и
их количество хранятся в i - узле файла. Сам же
блок ничего не содержит - это просто контейнер
определённого размера для данных файла.
На самом деле модуль 1-го уровня абстракции
содержит не просто 3 вышеперечисленных объекта, а
3 объекта-контейнера, каждый из которых имеет
буфер, куда динамически загружается с диска и
выгружается на диск образ соответствующего
объекта, и адрес на диске (номер) этого образа.
Таким образом достигается нужная гибкость
работы файловой системы : образ загружается, в
нём, уже загруженном производятся нужные
изменения, и затем изменённый образ выгружается
на диск в то же место, где он и был.
Файл disk.fs5 :
Это виртуальный жёсткий диск, содержащий
следующие разделы:
1. Загрузочный блок. Содержит адреса разделов для
загрузки файловой системы.
2. Суперблок. Состоит из 3 подразделов:
а. Список свободных блоков i-узлов.
б. Список свободных блоков данных.
в. Список свободных номеров пользователей.
3. Раздел блоков i-узлов.
4. Раздел блоков данных папок и файлов.
Перед началом работы нужно отформатировать
виртуальный жёсткий диск. При этом будут созданы
вышеперечисленные разделы файловой системы,
корневая папка с подпапками и суперпользователь
"root".
Созданная модель файловой системы UNIX содержит
некоторые упрощения по сравнению с реальной
файловой системой. Подробнее об этом см. раздел
"Результат".
1. Перемещаете или копируете виртуальный жёсткий диск disk.fs5 в ту же папку, где находится файл Unix_FS.exe.
2. Запускаете Unix_FS.exe.
3. Вводите Login - "root", password - "password" или Login - "user", password - "user".
4. Работаете, используя вышеупомянутые команды.
1. Нет наследования прав (его просто не успел сделать).
2. Не самая лучшая оптимальность кода, есть и повторяющиеся участки кода.
3. Некоторая ограниченность возможностей команд (например, за один вызов команды можно создать лишь один файл, а не несколько, как в настоящем Unix).
4. Логины и пароли не шифруются.
5. В отличие от реальных файловых систем не используются сложные структуры данных (списки, очереди, деревья, справочники и т.п.).
Если будете создавать подобную курсовую работу, то я, по опыту этой курсовой работы, могу посоветовать следующие приёмы разработки:
1. Хорошим приёмом будет являться использование указателей на функцию. Очень часто возникают такие ситуации, когда можно создать некую функцию А, в которую потом передавать указатель на какую-то другую функцию Б со своими аргументами. При этом, в зависимости от ситуации, можно применять самые разные функции Б со своими аргументами. Всё это даст возможность сильно сократить и упростить исходный код. Например, в качестве функции А может выступать функция, которая ищет нужный кластер в таблице кластеров, а функция Б может быть добавление или удаление записи из найденного кластера.
2. Особое внимание следует обратить на функции ввода-вывода на жёсткий диск. В языке Си есть по крайней мере 2 группы таких функций - с буферизованным и с небуферизованным вводом-выводом на жёсткий диск. В этой курсовой работе я долго не мог добиться успеха при записи в многокластерный "файл" - записывался только первый кластер, и всё. Видимо, программа исполнялась быстрее, чем происходила запись информации на жёсткий диск. Я там всё же нашёл решение, но это было не самое лучшее решение, найдено оно было опытным путём, и я до сих пор не могу объяснить, как там всё работает. По всей видимости, для таких задач следует научиться применять буферизованные функции ввода-вывода языка Си.
Скачать курсовой проект (вместе с пояснительной запиской) (181 КБ)