Файловая система

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

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

Помимо жёсткого диска или раздела на нём, файловую систему можно организовать и на других носителях: это может быть гибкий диск, флешка, карта памяти, лазерный диск (CD или DVD), сетевой «диск». Возможно разместить файловую систему на участке оперативной памяти компьютера (виртуальный диск), правда, содержимое такой файловой системы хранится лишь до выключения компьютера. Мы в дальнейшем будем называть все эти носители, вне зависимости от их типа, «дисками».

Имеется множество типов файловых систем. Они отличаются друг от друга способами хранения файлов. Некоторые из этих типов предназначены для носителей маленького объёма, другие — для больших. Файловые системы для лазерных дисков могут не поддерживать запись файлов (за счёт этого их внутреннее устройство становится проще); такие файловые системы записываются на диск целиком и однократно. Различные операционные системы поддерживают разные наборы типов файловых систем. Операционная система Linux способна поддерживать работу практически со всеми известными типами.

Во всех обычных файловых системах хранение файлов устроено по иерархическому принципу. Каждый файл получает имя, но, когда число хранимых файлов перевалит за десяток, становится крайне затруднительно выдумывать для новых файлов новые имена, которые ранее не встречались. Современные носители имеют объём, позволяющий хранить сотни тысяч файлов. В такой ситуации совершенно необходимо группировать файлы в группы из сравнительно небольшого количества файлов. Группы эти называются директориями (каталогами, папками, фолдерами). Директории могут получить собственные имена (так же, как и файлы) и входить в другие директории. На вершине этой иерархии файлов и директорий находится корневая директория.

Директории обычно группируют файлы по тематическому принципу. В одну директорию удобно сложить файлы, относящиеся к одному проекту. Или поместить в директорию все фильмы. Или все фотографии. При большом количестве фотографий имеет смысл создать в фотодиректории вложенные директории для каждого дня, когда производилось фотографирование. Точно так же все электронные книги разумно сгруппировать по авторам, посвятив каждому автору свою поддиректорию.

В многопользовательских операционных системах для каждого зарегистрированного пользователя создаётся своя директория (она называется домашней). Обычно все рабочие файлы и директории пользователя хранятся именно в ней.

В пределах одной директории все имена (файлов и поддиректорий) должны быть уникальными. Это требование перестаёт быть актуальным для файловой системы в целом: можно одинаково назвать файлы из различных директорий. Таким образом, имя файла (основное имя) уже не является ключом доступа к нему. Таким ключом служит имя файла, дополненное списком директорий, в которых он содержится, начиная с корневой. В Linux элементы списка составляются вместе, разделённые знаком косой черты /; в итоге получается полное имя. Например, исходный файл для этой главы имеет основное имя chIO.docbook, но его полное имя — /home/tz/work/54/inf/perl-problems/sources/chIO.docbook.

Полное имя в этом примере указывает расположение файла по отношению к корневой директории /. Чтобы придти к нашему файлу, нужно начать с корневой директории, из неё попасть в поддиректорию home, затем — в tz, затем — в work, …, в sources, и там будет нужный файл. Говорят, что полное имя прокладывает путь к файлу.

Полные имена, начинающиеся с корневой директории, называются абсолютными. Возможно указывать место файла в файловой системе по отношению к любой другой директории. Например, если в качестве стартовой точки принять нашу домашнюю директорию /home/tz, то путь можно задать так: work/54/inf/perl-problems/docbook/chIO.docbook.

Ну хорошо, здесь файл лежит где-то глубоко внутри домашней директории. А как проложить путь из /home/tz к файлу, скажем, /etc/passwd? Ведь придётся выходить за пределы стартовой директории. Для директории, в которой непосредственно находится данная директория, есть специальное обозначение: .. (две точки). При прокладке пути это имя означает «подняться на один уровень выше». В данном примере придётся подняться из начальной директории на два уровня вверх, к корневой директории (внутри корневой нет других директорий, общих для /home/tz и /etc/passwd). Так что относительное имя станет таким: ../../etc/passwd.

[Примечание]Примечание

Пытливые люди тут должны поинтересоваться: что будет, если подняться в иерархии выше корневой директории? Что будут означать пути /.., /../.., /../../.. и так далее? Ничего страшного не случится. Выход за пределы корневой директории игнорируется: все эти пути указывают на корневую директорию.

Таким образом, элемент .. позволяет путешествовать по файловой системе от любой директории к любой другой директории или файлу, и не обязательно вглубь. За одним исключением: невозможно задать путь от директории к ней самой. Но эта проблема решается: специальный элемент . (точка) прокладывает такой путь. Оба элемента, . и .., обеспечивают связность файловой системы.

Все фрагменты ./, сколько бы их ни было, можно безболезненно удалить из пути: путь chIO.docbook означает то же самое, что и ./././././chIO.docbook. Единственное полезное предназначение точки — ссылаться изнутри директории на неё саму, для этого не нужно даже знать имя директории.

[Примечание]Примечание

Впрочем, в одном случае всё же путь вида ./program.pl не равносилен program.pl. В операционной системе Linux для каждой команды, вводимой в командной строке, ищется одноимённый файл с соответствующей программой. К примеру, команде ls отвечает файл /bin/ls. Где ищется? В нескольких директориях, предназначенных для хранения программ. Обычно это /bin, /sbin, /usr/bin, /usr/sbin. Как правило, только администратор системы может размещать программы в этих директориях — это мера безопасности, иначе злонамеренный пользователь смог бы подложить туда вредоносную программу вместо невинной, скажем, ls.

Значит ли это, что невозможно запустить файл с программой, лежащий не в этих директориях? Нет. Нужно просто указать путь к файлу с программой — абсолютный или относительный. Но если относительный, то по отношению к чему? К директории, о которой пойдёт речь в следующем разделе «Текущая директория».

Каждая программа, когда запущена, превращается в один или несколько процессов (сначала это один процесс, но впоследствии он может разветвиться). Каждый процесс может запустить какие-нибудь программы, и тем самым породить новые процессы. Отношение «родитель — потомок» между процессами создаёт иерархию, очень похожую на файловую (в файловой системе в основе иерархии лежит отношение вложенности).

Каждый процесс считает некоторую директорию своей текущей, или рабочей, и может изменить её на другую. Данный процесс, когда запускает новый, передаёт ему по наследству свою текущую директорию.

Командная оболочка sh или zsh, позволяющая нам вызывать программы из командной строки, обычно показывает свою текущую директорию в приглашении, например, так:

(тильда ~ служит сокращением для домашней директории, в нашем случае, для /home/tz).

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

покажет сведения о всех *.pl-файлах в текущей директории ~/work/54/inf/perl-problems/examples/perl, какова бы она ни была. Командная оболочка, запуская программу ls, передаст её процессу текущую директорию по наследству. Иначе пришлось бы обращаться к интересующим нас файлам по абсолютным именам:

Ужасно. Команда даже не вмещается на страницу!

Информатика-54© А. Н. Швец