одной файловой системы повышается вероятность запутаться в копиях или забыть о некоторых из них. Если задача состоит в том, чтобы обеспечить доступ к одному и тому же файлу из разных точек файловой системы, нужно использовать специально предназначенный для этого механизм файловой системы 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 " - это два имени одного и того же файла. Доступ к одному и тому же файлу при помощи нескольких имен может понадобиться в следующих случаях: Одна и та же программа известна под несколькими именами. Доступ пользователей к некоторым каталогам в системе может быть ограничен из соображений безопасности. Однако если все же нужно организовать доступ пользователей к файлу, который находится в таком 117 каталоге, можно создать жесткую ссылку на этот файл в другом каталоге. Современные файловые системы даже на домашних персональных компьютерах могут насчитывать до нескольких десятков тысяч файлов и тысячи каталогов. Обычно у таких файловых систем сложная многоуровневая иерархическая организация - в результате пути ко многим файлам становятся очень длинными. Чтобы организовать более удобный доступ к файлу, который находится очень "глубоко" в иерархии каталогов, также можно использовать жесткую ссылку в более доступном каталоге. Полное имя некоторых программ может быть весьма длинным (например, i586-alt-linux-gcc-3.3 ), к таким программам удобнее обращаться при помощи сокращенного имени ( жесткой ссылки) - gcc-3.3 1.9.2 Индексные дескрипторы Поскольку благодаря жестким ссылкам у файла может быть несколько имен, понятно, что вся существенная информация о файле в файловой системе привязана не к имени. В файловых системах Linux вся информация, необходимая для работы с файлом, хранится в индексном дескрипторе. Для каждого файла существует индексный дескриптор: не только для обычных файлов, но и для каталогов, файлов-дырок и т. д. Каждому файлу соответствует один индексный дескриптор. Индексный дескриптор - это описание файла, в котором содержится: тип файла (обычный файл, каталог, специальный файл и т. д.); права доступа к файлу; информация о том, кому принадлежит файл; отметки о времени создания, модификации, последнего доступа к файлу; размер файла; указатели на физические блоки на диске, принадлежащие этому файлу - в этих блоках хранится "содержимое" файла. Все индексные дескрипторы пронумерованы, поэтому номер индексного дескриптора - это уникальный идентификатор файла в файловой системе - в отличие от имени файла ( жесткой ссылки на него), которых может быть несколько. Узнать номер индексного дескриптора любого файла можно при помощи утилиты ls с ключом –i Если вывести номера индексных дескрипторов файла " text " и жесткой ссылки на него " text-hardlink " – можно увидеть, что эти номера совпадают, то есть этим двум именам соответствует один индексный дескриптор, т. е. один и тот же файл. Все операции с файловой системой - создание, удаление и перемещение файлов - производятся на самом деле над индексными 118 дескрипторами, а имена нужны только для того, чтобы пользователь мог легко ориентироваться в файловой системе. Более того, имя (или имена) файла в его индексном дескрипторе не указаны. В файловой системе Ext2 имена файлов хранятся в каталогах: каждый каталог представляет собой список имен файлов и номеров их индексных дескрипторов. Жесткую ссылку (имя файла, хранящееся в каталоге) можно представлять как каталожную карточку, на которой указан номер индексного дескриптора - идентификатор файла. Жесткая ссылка (hard link) - запись вида имя файла+номер индексного дескриптора в каталоге. Жесткие ссылки в Linux - основной способ обратиться к файлу по имени. 1.9.3 Символьные ссылки У жестких ссылок есть два существенных ограничения: Жесткая ссылка может указывать только на файл, но не на каталог, потому что в противном случае в файловой системе могут возникнуть циклы - бесконечные пути. Жесткая ссылка не может указывать на файл в другой файловой системе. Например, невозможно создать на жестком диске жесткую ссылку на файл, расположенный на дискете. Чтобы избежать этих ограничений, были разработаны символьные ссылки. Cимвольная ссылка - это просто файл, в котором содержится имя другого файла. Cимвольные ссылки, как и жесткие, предоставляют возможность обращаться к одному и тому же файлу по разным именам. Кроме того, символьные ссылки могут указывать и на каталог, чего не позволяют жесткие ссылки. Символьные ссылки называются так потому, что содержат символы - путь к файлу или каталогу. Cимвольная ссылка (symbolic link, файл-ссылка) - это файл особого типа (" l "), в котором содержится путь к другому файлу. Если на пути к файлу встречается cимвольная ссылка, система выполняет подстановку: исходный путь заменяется тем, что содержится в ссылке. Cимвольную ссылку можно создать при помощи команды ln с ключом " -s " (сокращение от "symbolic"). Если выполнить команду cat имя_файла-ссылки , то на экран будет выведено содержимое файла, на который указывает ссылка. Символьная ссылка вполне может содержать имя несуществующего файла. В этом случае ссылка будет существовать, но не будет "работать": например, если попробовать вывести содержимое такой "битой" ссылки при помощи команды cat , будет выдано сообщение об ошибке. Узнать, куда указывает символьная ссылка, можно при помощи утилиты realpath
119 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 : нет никакой гарантии, что случайно удаленные данные удастся восстановить. 120 1.11 Права доступа в файловой системе 1.11.1 Идентификатор пользователя Говоря о правах доступа пользователя к файлам, заметим, что в действительности манипулирует файлами не сам пользователь, а запущенный им процесс (например, утилита rm или cat ). Поскольку и файл, и процесс создаются и управляются системой, ей нетрудно организовать какую угодно политику доступа одних к другим, основываясь на любых свойствах процессов как субъектов и файлов как объектов системы. В Linux, однако, используются не какие угодно свойства, а результат идентификации пользователя – его UID. Каждый процесс системы обязательно принадлежит какому-нибудь пользователю, и идентификатор пользователя (UID) – обязательное свойство любого процесса Linux. Когда программа login запускает стартовый командный интерпретатор , она приписывает ему UID, полученный в результате диалога. Обычный запуск программы ( exec() ) или порождение нового процесса ( fork() ) не изменяют UIDпроцесса, поэтому все процессы, запущенные пользователем во время терминальной сессии, будут иметь его идентификатор . Поскольку UID однозначно определяется входным именем, оно нередко используется вместо идентификатора – для наглядности. Например, вместо выражения " идентификатор пользователя, соответствующий входному имени student ", говорят "UID student " (в приведенном ниже примере этот идентификатор равен 500): Пример 3. Как узнать идентификаторы пользователя и членство в группах [student@localhost student]$ id uid=500 (student) gid=500(student) группы=500 (student) Утилита id выводит входное имя пользователя и соответствующий ему UID , а также группу по умолчанию и полный список групп, членом которых он является. 1.11.2 Идентификатор группы Пользователь может быть членом нескольких групп, равно как и несколько пользователей могут быть членами одной и той же группы. Исторически сложилось так, что одна из групп – группа по умолчанию – является для пользователя основной - когда говорят о "GID пользователя", имеют в виду именно идентификатор группы по умолчанию. GID пользователя вписан в учетную запись и хранится в /etc/passwd , а информация о соответствии имен групп их идентификаторам, равно как и о том, в какие еще группы входит пользователь – в файле /etc/group . Из этого следует, что пользователь не может не быть членом как минимум 121 одной группы. 1.11.3 Ярлыки объектов файловой системы При создании объектов файловой системы – файлов, каталогов и т. п. – каждому приписывается ярлык. Ярлык включает в себя UID – идентификатор пользователя- хозяина файла, GID – идентификатор группы, которой принадлежит файл, тип объекта и набор так называемых атрибутов (код доступа) , а также некоторую дополнительную информацию. Атрибуты (или код доступа) определяют, кто и что имеет право делать с файлом, они описаны ниже: Пример 4. Атрибуты каталогов, показанные командой ls -l итого 88 drwxr-xr-x 2 root root 4096 Апр 4 2015 bin drwxr-xr-x 4 root root 4096 Апр 4 2016 boot drwxr-xr-x 10 root root 3520 Апр 5 14:26 dev drwxr-xr-х 90 root root 8192 Апр 5 14:22 etc drwxr-xr-x 3 root root 4096 Апр 4 21:22 home drwxr-xr-x 11 root root 4096 Апр 4 2016 lib drwx------ 2 root root 16384 Апр 4 2016 lost+found drwxr-xr-x 4 root root 4096 Апр 5 14:22 media drwxr-xr-x 2 root root 4096 Июл 11 2015 misc drwxr-xr-x 2 root root 4096 Окт 20 2016 mnt drwxr-xr-x 2 root root 0 Апр 5 14:21 net drwxr-xr-x 2 root root 4096 Окт 20 2016 opt dr-xr-xr-x 106 root root 0 Апр 5 2015 proc drwxr-x--- 31 root root 4096 Апр 5 14:29 root drwxr-xr-x 2 root root 8192 Апр 4 2016 sbin drwxr-xr-x 2 root root 4096 Окт 20 2016 selinux drwxr-xr-x 2 root root 4096 Окт 20 2015 srv drwxr-xr-x 11 root root 0 Апр 5 2016 sys drwxrwxrwt 16 root root 4096 Апр 5 14:26 tmp drwxr-xr-x 15 root root 4096 Апр 4 2015 usr drwxr-xr-x 21 root root 4096 Апр 4 2015 var Ключ " -l " утилиты ls определяет длинный ( long) формат выдачи (справа налево): имя файла, время последнего изменения файла, размер в байтах, группа, хозяин, количество жестких ссылок и строчка атрибутов. Первый символ в строчке атрибутов определяет тип файла. Тип " - " отвечает "обычному" файлу, а тип " d " – каталогу ( directory). Несмотря на то, что создание жестких ссылок на каталог невозможно, значение поля "количество жестких ссылок" (второй столбец) для всех каталогов примера равно двум, а не одному. На самом деле этого и следовало ожидать, потому что любой каталог файловой 122 системы Linux всегда имеет не менее двух имен: собственное (например, tmp ) и имя " " в самом этом каталоге ( tmp/. ). Если же в каталоге создать подкаталог, количество жестких ссылок на этот каталог увеличится на 1 за счет имени " " в подкаталоге (например, tmp/subdir1/.. ): 1.11.4 Иерархия прав доступа Рассмотрим более подробно, чему соответствуют девять символов в строке атрибутов, выдаваемой ls . Эти девять символов имеют вид " rwxrwxrwx ", где некоторые " r ", " w " и " x " могут заменяться на " - ". Очевидно, буквы отражают принятые в Linux три вида доступа – чтение, запись и использование – однако в ярлыке они присутствуют в трех экземплярах! Дело в том, что любой пользователь (процесс) Linux по отношению к любому файлу может выступать в трех ролях: как хозяин (user), как член группы, которой принадлежит файл (group), и как посторонний (other), никаких отношений собственности на этот файл не имеющий. Строка атрибутов – это три тройки " rwx ", описывающие права доступа к файлу хозяина этого файла (первая тройка, " u "), группы, которой принадлежит файл (вторая тройка, " g ") и посторонних (третья тройка, " o "). Если в какой-либо тройке не хватает буквы, а вместо нее стоит " - ", значит, пользователю в соответствующей роли будет в соответствующем виде доступа отказано. При выяснении отношений между файлом и пользователем, запустившим процесс, роль определяется так: Если UID файла совпадает с UID процесса, пользователь – хозяин файла Если GID файла совпадает с GID любой группы, в которую входит пользователь, он – член группы, которой принадлежит файл. Если ни UID, ни GID файла не пересекаются с UID процесса и списком групп, в которые входит запустивший его пользователь, этот пользователь – посторонний. Именно в роли хозяина пользователь (процесс) может изменять ярлык файла. Единственное, чего не может делать хозяин со своим файлом – менять ему хозяина. 1.12 Использование прав доступа в Linux 1.12.1 Использование групп В Linux определено несколько системных групп, задача которых – обеспечивать доступ членов этих групп к разнообразным ресурсам системы. Часто такие группы носят говорящие названия: " disk ", " audio ", " cdwriter " и т. п. Если обычным пользователям доступ к некоторому файлу, каталогу или специальному файлу Linux закрыт, он открыт членам группы, которой этот объект принадлежит.
123 Например, в Linux почти всегда используется виртуальная файловая система /proc – каталог, в котором в виде подкаталогов и файлов представлена информация из таблицы процессов. Имя подкаталога /proc совпадает с PID соответствующего процесса, а содержимое этого подкаталога отражает свойства процесса. Хозяином такого подкаталога будет хозяин процесса (с правами на чтение и использование), поэтому |