настройка окружения, "рабочего места") не пересекается с работой над какой-нибудь прикладной задачей.
Родительский каталог (parent directory) - это каталог, в котором содержится данный. Для корневого каталога родительским является он сам.
Ссылки на текущий и на родительский каталог обязательно присутствуют в каждом каталоге в Linux. Даже если каталогпуст, т. е. не содержит ни одного файла или подкаталога, команда "
ls -a
" выведет список из двух имен: "
" и "
". За ссылками на текущий и родительский каталоги
могут следовать несколько файлов и каталогов, имена которых начинаются с "
". В них содержатся настройки командной оболочки (файлы, начинающиеся с "
.bash
") и других программ. В домашнем каталоге
каждого пользователя Linux всегда присутствует несколько таких файлов.
9
Использование этих файлов позволяет пользователям независимо друг от друга настраивать поведение командной оболочки и других программ - организовывать свое "рабочее место" в системе.
1.6 Перемещение по дереву каталогов – команда cd
Пользователь может работать с файлами не только в своем
домашнем каталоге, но и в других каталогах. В этом случае будет удобно
сменить текущий каталог. Для смены текущего каталога командной оболочки используется команда cd
(от англ. "change directory" - "сменить
каталог"). Команда cd принимает один параметр: имя каталога, в который нужно переместиться - сделать текущим. В качестве имени каталога
можно использовать полный или относительный путь. В приглашении
командной строки часто указывается текущий каталог shell - чтобы пользователю легче было ориентироваться, в каком каталоге он "находится" в данный момент.
Командная оболочка умеет достраивать имена файлов и каталогов: пользователю достаточно набрать несколько первых символов имени файла или каталога и нажать
Tab
. Если есть только один вариант завершения имени - оболочка закончит его сама, и пользователю не придется набирать оставшиеся символы. Достраивание - весьма существенное средство экономии усилий и повышения эффективности при работе с командной строкой. Современные командные оболочки умеют достраивать имена файлов и каталогов, а также имена команд.
Достраивание наиболее развито в командном интерпретаторе zsh
Оболочка PowerShell также умеет достраивать имена.
Для перемещения в родительский каталог ("/home") удобно воспользоваться ссылкой "..". Необходимость вернуться в домашний каталог из произвольной точки файловой системы возникает довольно часто, поэтому командная оболочка поддерживает обозначение домашнего каталога при помощи символа "". Поэтому чтобы перейти в домашний каталог из любого другого, достаточно выполнить команду "
cd
". При исполнении команды символ "
" будет заменен командной оболочкой на
полный путь к домашнему каталогу пользователя.
При помощи символа "
" можно ссылаться и на домашние каталоги
других пользователей: "
имя пользователя ". Команда cd
, поданная без параметров, эквивалентна команде "
cd
" и делает текущим каталогом
домашний каталог пользователя.
1.7 Создание каталогов – утилита mkdir
В домашнем каталоге, как и в любом другом, можно создавать сколько угодно подкаталогов, в них - свои подкаталоги и т. д. Иными
1 0
словами, пользователю принадлежит фрагмент (поддерево)
файловой системы, корнем которого является его
домашний каталог.
Чтобы организовать такое поддерево, потребуется создать
каталогивнутри домашнего. Для этого используется утилита mkdir
. Она применяется с одним обязательным параметром: именем создаваемого
каталога. По умолчанию
каталог будет создан в
текущем каталоге.
1.7.1 Создание нового пустого файла – команда touch Для создания пустого файла с текущим временем создания служит команда touch имя_нового_файла. Для указания даты создания в формате
ГГГГММДДhhmm используется ключ –t. Например touch –t 0904080000 tst файл создан 8 апреля 2015 г.
1.8 Копирование и перемещение файлов Для перемещения файлов и
каталогов предназначена утилита mv
(от англ. "move" - "перемещать"). У mv два обязательных параметра: первый - перемещаемый файл или
каталог, второй - файл или
каталог назначения.
Имена файлов и
каталогов могут быть заданы в любом допустимом виде: при помощи полного или относительного пути. Кроме того, mv позволяет перемещать не только один файл или
каталог, а сразу несколько. За подробностями о допустимых параметрах и ключах следует обратиться к руководству по mv
:
Перемещение файла внутри одной
файловой системы в действительности равнозначно его
переименованию: данные самого файла при этом остаются на тех же секторах диска, а изменяются
каталоги, в которых произошло перемещение. Перемещение предполагает удаление ссылки на файл из того
каталога, откуда он перемещен, и добавление ссылки на этот самый файл в тот
каталог, куда он перемещен.
В результате изменяется полное имя файла -
полный путь, т. е. положение файла в
файловой системе.
Иногда требуется создать копию файла: для большей сохранности данных, для того, чтобы создать модифицированную версию файла и т. п.
В Linux для этого предназначена утилита cp
(от англ. "copy" -
"копировать"). Утилита cp требует использования двух обязательных параметров: первый - копируемый файл или
каталог, второй - файл или
каталог назначения. Как обычно, в именах файлов и
каталогов можно использовать полные и
относительные пути. Существует несколько вариантов комбинации файлов и
каталогов в параметрах cp
- о них можно прочесть в руководстве. Нужно иметь в виду, что в Linux утилита cp
нередко настроена таким образом, что при попытке скопировать файл поверх уже существующего файла никакого предупреждения не выводится. В этом случае файл будет просто перезаписан, а данные,
1 1
которые содержались в старой версии файла, безвозвратно потеряны.
Поэтому при использовании cp следует всегда быть внимательным и проверять имена файлов, которые нужно скопировать.
Созданная при помощи cp копия файла связана с оригиналом только в воспоминаниях пользователя, в файловой же системе исходный файл и его копия - две совершенно независимые и ничем не связанные единицы.
Поэтому при наличии нескольких копий одного и того же файла в рамках
одной файловой системы повышается вероятность запутаться в копиях или забыть о некоторых из них. Если задача состоит в том, чтобы обеспечить доступ к одному и тому же файлу из разных точек файловой
системы, нужно использовать специально предназначенный для этого механизм файловой системы Linux - ссылки.
1.9 Файл и его имена: ссылки
1.9.1 Жесткие ссылки – утилита ln
Каждый файл представляет собой область данных на жестком диске компьютера или на другом носителе информации, которую можно найти
по имени. В файловой системе Linux содержимое файла связывается с его именем при помощи жестких ссылок. Создание файла с помощью любой программы означает, что будет создана жесткая ссылка - имя файла, и открыта новая область данных на диске. Причем количество ссылок на одну и ту же область данных (файл) не ограничено, то есть у файла может быть несколько имен.
Пользователь Linux может добавить файлу еще одно имя (создать еще одну жесткую ссылку на файл) при помощи утилиты ln
(от англ.
"link" - "соединять, связывать"). Первый параметр - это имя файла, на который нужно создать ссылку, второй - имя новой ссылки. По умолчанию ссылка будет создана в текущем каталоге:
Пример 2. Создание жестких ссылок
[student@localhost ]$ ln text text-hardlink
В примере 2 в домашнем каталоге пользователя student создана жесткая ссылка с именем "
text-hardlink
" на файл "
text"
. Если вывести подробный список файлов текущего каталога и его подкаталогов ("
ls - lR
"), то у файлов "
text
" и "
text-hardlink
" совпадут и размер, и время создания. Теперь "
text-hardlink
" и "
text
" - это два имени одного и того же файла.
Доступ к одному и тому же файлу при помощи нескольких имен может понадобиться в следующих случаях:
Одна и та же программа известна под несколькими именами.
Доступ пользователей к некоторым каталогам в системе может быть ограничен из соображений безопасности. Однако если все же нужно организовать доступ пользователей к файлу, который находится в таком
1 2
каталоге, можно создать
жесткую ссылку на этот файл в другом
каталоге.
Современные
файловые системы даже на домашних персональных компьютерах могут насчитывать до нескольких десятков тысяч файлов и тысячи
каталогов. Обычно у таких
файловых систем сложная многоуровневая иерархическая организация - в результате пути ко многим файлам становятся очень длинными. Чтобы организовать более удобный доступ к файлу, который находится очень "глубоко" в иерархии
каталогов, также можно использовать
жесткую ссылку в более доступном
каталоге.
Полное имя некоторых программ может быть весьма длинным (например, i586-alt-linux-gcc-3.3
), к таким программам удобнее обращаться при помощи сокращенного имени (
жесткой ссылки) - gcc-3.3
1.9.2 Индексные дескрипторы Поскольку благодаря
жестким ссылкам у файла может быть несколько имен, понятно, что вся существенная информация о файле в
файловой системе привязана не к имени. В
файловых системах Linux вся информация, необходимая для работы с файлом, хранится в
индексном дескрипторе. Для
каждого файла существует
индексный дескриптор: не только для обычных файлов, но и для каталогов,
файлов-дырок и т. д.
Каждому файлу соответствует
один индексный дескриптор.
Индексный дескриптор - это описание файла, в котором содержится: тип файла (обычный файл,
каталог, специальный
файл и т. д.);
права доступа к файлу; информация о том,
кому принадлежит файл; отметки о времени создания, модификации, последнего доступа к файлу; размер файла; указатели на физические блоки на диске, принадлежащие этому файлу - в этих блоках хранится "содержимое" файла.
Все
индексные дескрипторы пронумерованы, поэтому номер
индексного дескриптора - это уникальный идентификатор файла в
файловой системе - в отличие от
имени файла (
жесткой ссылки на него), которых может быть несколько. Узнать номер
индексного дескрипторалюбого файла можно при помощи утилиты ls с ключом
–i
Если вывести номера
индексных дескрипторов файла "
text
" и
жесткой ссылки на него "
text-hardlink
" – можно увидеть, что эти номера совпадают, то есть этим двум именам соответствует один
индексный дескриптор, т. е. один и тот же файл.
Все операции с
файловой системой - создание, удаление и перемещение файлов - производятся на самом деле над
индексными
1 3
дескрипторами, а имена нужны только для того, чтобы пользователь мог легко ориентироваться в файловой системе. Более того, имя (или имена) файла в его индексном дескрипторе не указаны. В файловой системе
Ext2 имена файлов хранятся в каталогах: каждый каталог представляет собой список имен файлов и номеров их индексных дескрипторов.
Жесткую ссылку (имя файла, хранящееся в каталоге) можно представлять как каталожную карточку, на которой указан номер индексного
дескриптора - идентификатор файла.
Жесткая ссылка (hard link) - запись вида имя файла+номер
индексного дескриптора в каталоге. Жесткие ссылки в Linux - основной способ обратиться к файлу по имени.
1.9.3 Символьные ссылки
У жестких ссылок есть два существенных ограничения:
Жесткая ссылка может указывать только на файл, но не на каталог, потому что в противном случае в файловой системе могут возникнуть циклы - бесконечные пути.
Жесткая ссылка не может указывать на файл в другой файловой
системе. Например, невозможно создать на жестком диске жесткую
ссылку на файл, расположенный на дискете. Чтобы избежать этих ограничений, были разработаны символьные ссылки. Cимвольная
ссылка - это просто файл, в котором содержится имя другого файла.
Cимвольные ссылки, как и жесткие, предоставляют возможность обращаться к одному и тому же файлу по разным именам. Кроме того, символьные ссылки могут указывать и на каталог, чего не позволяют жесткие ссылки. Символьные ссылки называются так потому, что содержат символы - путь к файлу или каталогу.
Cимвольная ссылка (symbolic link, файл-ссылка) - это файл особого типа ("
l
"), в котором содержится путь к другому файлу. Если на пути к файлу встречается cимвольная ссылка, система выполняет подстановку: исходный путь заменяется тем, что содержится в ссылке.
Cимвольную ссылку можно создать при помощи команды ln с ключом "
-s
"
(сокращение от "symbolic").
Если выполнить команду
cat имя_файла-ссылки
, то на экран
будет выведено содержимое файла, на который указывает ссылка.
Символьная ссылка вполне может содержать имя несуществующего файла. В этом случае ссылка будет существовать, но не будет "работать": например, если попробовать вывести содержимое такой "битой" ссылки при помощи команды cat
, будет выдано сообщение об ошибке. Узнать, куда указывает символьная ссылка, можно при помощи утилиты realpath
1 4
1.10 Удаление файлов и каталогов – утилиты rm и
rmdir
В ОС Linux для удаления файлов предназначена утилита rm
(сокращение от англ. "remove" - "удалять"):
Если удалить файл text в домашнем каталоге пользователя student,
файл text-hardlink
, который является жесткой ссылкой на удаленный файл text
, сохранится, количество жестких ссылок на этот файл уменьшится с "
2
" до "
1
" - действительно, text-hardlink
- теперь единственное имя этого файла. Однако если удалить и жесткую ссылку text-hardlink
, у этого файла больше не останется ни одного имени, он станет недоступным пользователю и будет уничтожен.
Утилита rm предназначена именно для удаления жестких ссылок, а не самих файлов. В Linux, чтобы полностью удалить файл, требуется последовательно удалить все жесткие ссылки на него. При этом все
жесткие ссылки на файл (его имена) равноправны - среди них нет "главной", с исчезновением которой исчезнет файл. Пока есть хоть одна ссылка, файл продолжает существовать. Впрочем, у большинства файлов в
Linux есть только одно имя (одна жесткая ссылка на файл), поэтому команда rm имя файла в большинстве случаев успешно удаляет файл.
Как уже говорилось, символьные ссылки - это отдельные файлы, поэтому после удаления файла text
, text-symlink
, который ссылался на этот файл, продолжает существовать, однако теперь это - "битая ссылка", поэтому его также можно удалить командой rm
Для удаления каталогов предназначена другая утилита - rmdir
(от англ. "remove directory"). Впрочем, rmdir согласится удалить каталог
только в том случае, если он пуст - в нем нет никаких файлов и подкаталогов. Удалить каталог вместе со всем его содержимым можно командой rm с ключом "
-r
" (recursive). Команда rm -r
каталог
- очень удобный способ потерять в одночасье все файлы: она рекурсивно обходит весь каталог, удаляя все, что попадется: файлы, подкаталоги, символьные
ссылки... а ключ "
-f
" (force) делает ее работу еще неотвратимее, так как подавляет запросы вида "удалить защищенный от записи файл", так что rm работает безмолвно и безостановочно.
ПОМНИТЕ: если вы удалили файл, значит, он уже не нужен, и не подлежит восстановлению!
В Linux не предусмотрено процедуры восстановления удаленных файлов и каталогов. Поэтому стоит быть очень внимательным, отдавая команду rm и, тем более, rm -r
: нет никакой гарантии, что случайно удаленные данные удастся восстановить.
15
1.11 Права доступа в файловой системе 1.11.1 Идентификатор пользователя Говоря о
правах доступа пользователя к файлам, заметим, что в действительности манипулирует файлами не сам пользователь, а запущенный им
процесс (например, утилита rm или cat
). Поскольку и файл, и
процесс создаются и управляются системой, ей нетрудно организовать какую угодно политику доступа одних к другим, основываясь на любых свойствах
процессов как субъектов и файлов как объектов системы.
В Linux, однако, используются не какие угодно свойства, а результат
идентификации пользователя – его UID. Каждый
процесс системы обязательно
принадлежит какому-нибудь пользователю, и
идентификатор пользователя (UID) – обязательное свойство любого
процесса Linux. Когда программа login запускает стартовый командный интерпретатор
, она приписывает ему UID, полученный в результате диалога. Обычный запуск программы (
exec()
) или порождение нового
процесса (
fork()
) не изменяют UIDпроцесса, поэтому
все процессы, запущенные пользователем во время терминальной сессии, будут иметь его идентификатор
. Поскольку UID
однозначно определяется входным именем, оно нередко используется
вместо идентификатора – для наглядности.
Например, вместо выражения "
идентификатор пользователя, соответствующий
входному имени student
", говорят "UID student
" (в приведенном ниже примере этот
идентификатор равен