Европейский Университет в Санкт-Петербурге
Опубликован: 04.07.2008 | Доступ: свободный | Студентов: 1309 / 258 | Оценка: 4.34 / 3.65 | Длительность: 21:13:00
Лекция 6:

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

Ссылки

В любой системе UNIX существуют жесткие и символические ссылки.

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

ls -li file*
   16852 -rw-r--r--   2 root   root   0 Mar 20 16:11 file
   16852 -rw-r--r--   2 root   root   0 Mar 20 16:11 file1

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

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

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

Жесткие ссылки создает команда ln:

ln старое_имя новое_имя

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

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

Файл в любой файловой системе UNIX считается удаленным только тогда, когда удалены все жесткие ссылки на него. Удаление жесткой ссылки выполняется командой rm и внешне ничем не отличается от удаления обычного файла.

Найти все жесткие ссылки на файл можно с помощью команды find:

find откуда_искать –inode номер_индексного_дескриптора_файла

Символическая ссылка – это запись в каталоге, ссылающаяся на файл с определенным именем. Фактически, символическая ссылка – это отдельный файл типа "символическая ссылка", и индексный дескриптор этого файла содержит только путь к файлу или каталогу, на который указывает ссылка:

ls –l
lrwxrwxrwx 1 root root ... . qq ->/usr/home/qq

Можно создать символическую ссылку на любой каталог, а также на файл, находящийся в другом разделе UNIX. Символическая ссылка является аналогом ярлыка (shortcut) в системах Windows. При удалении символической ссылки с файлом или с каталогом, на который она ссылается, ничего не происходит. При удалении файла, на который ссылается символическая ссылка, она "повисает в воздухе", ссылаясь на пустоту. В последнем случае при обращении к такой "пустой" ссылке возникнет ошибка file not found, несмотря на то, что сама ссылка будет видна и доступна в списке файлов.

Обычно по команде ls –l выдается не только информация о типе файла l, если это символическая ссылка, но и указывается, на что она ссылается. Если эта информация не появилась, попробуйте ls –F. В разных системах UNIX ключи программы ls могут незначительно отличаться.

Определитель процессов, занявших файл

Кто ел из моей кружки? Из сказки

Чтобы узнать, какой процесс занимает нужный вам ресурс (файл или каталог) – достаточно использовать программу fuser. Предположим, я даю команду umount /export/home/filip и получаю сообщение Device busy. Это означает, что какой-то процесс "держит" каталог /export/home/filip. Чаще всего для решения проблемы достаточно покинуть каталог, который хочется демонтировать (сплошь и рядом такую команду дают, находясь в том же самом каталоге, что является ошибкой). Однако, если выход из каталога с помощью команды cd не помогает, можно выяснить, какой именно процесс использует каталог для своих нужд:

fuser /export/home/filip
/export/home/filip:     1464c    1457c    1216c    1206c
1080c    1078c    1077c    1032c    1026c    1012c    1010c
1004c    988c     957c     953c     950c     941c     939c
929c     916c     915c     910c     908c     896c     895c
894c     862c     861c     822c     729c

Список, который мы получили – это идентификаторы процессов. Остается только удалить из выдачи программы fuser буквы, оставив только числа – именно они и являются идентификаторами. Большой список процессов, которые мы получили в нашем примере, связан с тем, что мы пытались демонтировать домашний каталог пользователя, который в этот момент работал в системе. Разумеется, многие процессы использовали его домашний каталог тем или иным образом.

Права доступа

Давно известно, что в Москве раньше были две угнетаемые нации: "погазоны" и "улюки". Их никто никогда не видел, но всем было их очень жалко. Куда ни пойдешь, везде пестрели надписи: "Погазонам не ходить", "Машины улюков не ставить".

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

Система безопасности UNIX основана на правах доступа к объектам файловой системы – файлам и каталогам. У каждого каталога или файла есть один владелец и один групповой владелец. Группового владельца файла мы будем для краткости называть группой файла.

Читая словосочетание "группа файла", не следует считать, что файлы объединены в какие-то группы. Группа файла обозначает группу пользователей, которой даны некие специальные права на доступ к этому файлу.

Дав команду ls –l в любом каталоге, мы увидим нечто вроде

-rw-r--r--    1 root    root        433 Feb   2 10:30 acd.c

Первый столбец – это тип файла (первый символ) и права доступа (остальные девять символов). Затем указаны число жестких ссылок на файл, владелец и группа файла, размер файла в байтах, дата последней модификации в формате "Месяц Число Год" и имя файла. Год часто не указывается для тех файлов, которые были модифицированы в течение последних 12 месяцев.

Права доступа подразделяются на три части: права, данные, соответственно, владельцу файла, группе файла и всем остальным (обозначаются термином other или world). Таким образом, девять бит слова прав доступа делятся на три части по три бита:

rwx | rw- | r--|
 u     g     o

Часть, обозначенная буквой u (user), определяет права доступа владельца файла, буквой g – права доступа группы файла, o – права всех остальных. Существуют права трех типов: на чтение (r, read), запись (w, write) и запуск на выполнение (x, execute). Пользователю, который хочет обратиться к файлу, даются права доступа либо владельца, либо группы файла, либо права "всех остальных". Права доступа проверяются так (см. рис. 6.6, на примере слова прав доступа rwxrw-r-- ):

Алгоритм получения доступа к файлу

Рис. 6.6. Алгоритм получения доступа к файлу

Когда процесс, работающий от имени пользователя, пытается получить доступ к файлу, система выясняет, является ли он владельцем файла. Если является, то он получает права доступа, определенные для владельца файла. Если он – не владелец, но входит в группу, которая является группой файла, то он получает права доступа, определенные для группы файла. Если он не относится ни к одной из этих двух категорий, он получает права, определенные для всех остальных. Права разных категорий пользователей не складываются: если доступ к файлу хочет получить его владелец и он входит в группу файла, но права группы более широкие, чем права владельца (например, слово прав доступа r-xrwxr-- ), то он все равно получит права владельца (в последнем примере – r-x ). Для большинства файлов и каталогов права их владельца обычно шире, чем у группы.

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

  • мнемоническое обозначение слова прав доступа: rwxrw-r--
  • двоичное представление слова прав доступа: 111 110 100
  • десятичное представление слова прав доступа: 7 6 4

В документации часто встречается требование при установке какой-либо программы установить права доступа для некоего каталога 755. Имеются в виду, разумеется, права rwxr-xr-x, что соответствует полному доступу владельцу и доступу на чтение и запуск группе и всем остальным.

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

Старшие три бита слова прав доступа относятся к запуску файла, поэтому детально они рассмотрены в "Концепция, устройство и администрирование файловой системы ZFS" . Вот как выглядит слово прав доступа:

su sg t r w x r w x r w x

Старшие три бита – это бит установки владельца при запуске файла (suid), бит установки группы (sgid) при запуске файла и бит запрета выгрузки файла на диск при выполнении (t).

Для каталога биты suid и sgid имеют другое значение. По умолчанию при создании файла он наследует владельца и группу от процесса, который его создал. Аналогичное правило действует и на каталоги. Однако, если в правах доступа к каталогу установлен бит suid, то созданный в нем файл или подкаталог будет принадлежать не владельцу по умолчанию, а владельцу каталога с битом suid. Это правило не работает для систем Solaris, хотя справедливо для некоторых других систем UNIX.

В Solaris это правило распространяется только на группу файла, но не на владельца. То есть владельцем нового файла будет владелец создавшего его процесса, независимо от наличия бита suid у каталога, где создан файл. Но если каталог имеет установленный бит sgid, то группой нового файла станет группа процесса-создателя.

Бит запрета выгрузки файла на диск при выполнении (sticky bit) в старых версиях UNIX использовался для указания того, что при выполнении программы, записанной в этом файле, ее страницы запрещено выгружать на диск. В настоящее время sticky bit применяется для каталогов, с тем, чтобы указать особые условия удаления файлов из каталога. Если sticky bit установлен для каталога, то все пользователи, кроме root'a, могут удалять из каталога только те файлы, которые им принадлежат, независимо от прав доступа к каталогу. В разных системах UNIX он может интерпретироваться по-разному, поэтому смотрите для уточнений man sticky и man chmod.

Александр Тагильцев
Александр Тагильцев

Где проводится профессиональная переподготовка "Системное администрирование Windows"? Что-то я не совсем понял как проводится обучение.

Александр Васильченко
Александр Васильченко
Россия
Денис Гайдуль
Денис Гайдуль
Россия, Подольск