Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

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

Типы файлов

Именование файлов и каталогов

Организация файловой системы

Права доступа к файлам и каталогам

В операционной системе UNIX файл является хранилищем двоичных и символьных данных, хранимых как поток байтов. В UNIX символьные данные кодируются с помощью кода ASCII, хотя на таких системах, как мэйнфрейм IBM 390, используется кодировка EBCDIC. Коды ASCII и EBSDIC отличаются друг от друга, т.е. один и тот же код в них соответствует разным символам, а один и тот же символ закодирован в них разными кодами. В разных операционных системах данные хранятся по-разному. Данное обстоятельство может вызвать проблемы при попытке в одной операционной системе обработать данные, созданные в другой операционной системе. Необходимы специальные программы для конвертирования данных из файлов, созданных в одной операционной системе в файлы другой операционной системы так, чтобы они были пригодны для обработки.

Файлы содержат разные типы информации. Например, файл может содержать исходный код программы на С, COBOL или C++, он может быть текстовым документом с письмом от друга или исполняемым модулем программы. В UNIX существует несколько "родных" форматов файлов, которые можно просматривать или копировать, используя команды системы. Однако некоторые файлы нельзя обработать внутренними командами UNIX. Например, файлы базы данных для СУБД независимых разработчиков, таких как Oracle, требуют для обработки специальных программ.

Файл может располагаться на разных носителях. Файлы бывают постоянными, т.е. записанными на диске или временными - в памяти; данные из файла могут выводиться на терминал, или файл может принимать данные с терминал\а. Если файл постоянный, то его можно просмотреть, а если файл временный, то вы можете даже не знать о его существовании.

Функции, которые обычно выполняются по отношению к файлу, таковы:

р Открытие файла для обработки

р Чтение данных из файла для обработки

р Запись данных в файл после обработки

р Закрытие файла после того, как вся необходимая обработка выполнена

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

Типы файлов

Данный раздел содержит обсуждение различных типов файлов, имеющихся в UNIX. С некоторыми из данных типов файлов вы наверняка уже знакомы, например с текстовыми документами и с файлами исходных кодов.

Регулярные файлы

Регулярные файлы - это те файлы, с которыми вы, вероятно, знакомы лучше всего. Сущность их неизменна. Они постоянны по природе и содержат такие данные, как код программы, почту, полученную от босса, или письмо, которое вы пишете другу. Данные файлы почти всегда содержат текстовую информацию. В таких файлах данные организованы в записи. Если бы, к примеру, данная книга была файлом, содержащим данные об операционной системе UNIX, то каждая строка в книге была бы записью.

Как UNIX узнает о записях? Существует специальный символ, называющийся символом новой строки (newline character), который используется UNIX для поиска места, где одна запись заканчивается, а другая начинается. Многие команды UNIX поддерживают обработку текстов. Однако, имейте в виду, что текстовые файлы - не единственный тип регулярных файлов. Некоторые файлы представляют собой поток байтов без каких-либо символов новой строки. Хотя UNIX изначально была предназначена для обработки текстовых документов, она не сможет обработать такие файлы.

Ниже следуют примеры нескольких регулярных файлов:

prog.c содержит исходный код программы на С.

prog.cbl содержит исходный код программы на COBOL.

prog.exe содержит исполняемый модуль программы.

invite.doc содержит приглашение на вечеринку от коллеги.

ПРИМЕЧАНИЕ

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

Вот пример списка атрибутов, имеющихся у файла. Файл называется testfile, и атрибуты выводятся с использованием следующей команды:

ls -al testfile

Результатом будет

rwxr-xr-r 2 guhas staff 1012 Oct 30 18:39 testfile

UNIX отслеживает атрибуты, используя структуру данных под названием i-node (индексный дескриптор), Каждый индексный дескриптор в системе идентифицируется числом, которое называется номером индексного дескриптора. Каждый файл в системе имеет ассоциированный с ним индексный дескриптор, который содержит следующую информацию:

владелец файла;

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

дата и время создания, дата и время модификации, и т.д.;

тип файла.

Для временной информации в индексном дескрипторе выделено несколько полей:

время последнего доступа;

время последней модификации;

время последней модификации индексного дескриптора.

Время последнего доступа меняется при выполнении любой операции с файлом. Дата последней модификации изменяется при модификации файла. Время последней модификации индексного дескриптора меняется тогда, когда меняется информация, хранящаяся в индексном дескрипторе.

ПРИМЕЧАНИЕ

Некоторые версии UNIX, например А1Х, не модифицируют время последнего доступа к файлу, если файл исполняемый.

 

Файлы каталогов

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

  1. . (одна точка)
  2. .. (две последовательные точки)

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

drwxr-xr-x 2 guhas writer 512 Oct 30 18:39 testdir

drwxr-хг-х определяет права доступа к testdir, созданного пользователем guhas, принадлежащим к группе writer. Размер записи каталога testdir составляет 512 байтов. Последний раз каталог был модифицирован 30 октября в 18 39

Каталог обрабатывается системой UNIX как файл, но имеет несколько специальных характеристик. У каталога есть как минимум два имени. Например, если текущим каталогом был /u/guhas и вы создали подкаталог под названием testdir, то при этом были созданы две связи.

р /u/guhas/testdir

р /u/guhas/testdir/.

Запись /u/guhas/testdir создается в каталоге /u/guhas и запись /u/guhas/testdir/. создается в каталоге /и/ guhas/testdir

Прежде всего создается /u/guhas/testdir как пустой каталог и затем связывается с /u/guhas/testdir/. (одна точка). Обе данные ссылки существуют в течение всей жизни каталога и удаляются при разрушении каталога.

Байт-ориентированные и блок-ориентированные файлы устройств

Байт-ориентированные файлы устройств используются для небуферированного ввода/вывода, а блок-ориентированные файлы устройств используются тогда, когда данные передаются пакетами фиксированного размера. Байт-ориентированные файлы устройств обеспечивают посимвольный ввод/вывод, тогда как блок-ориентированные файлы устройств используют механизм буфера, позволяющий увеличить эффективность передачи данных путем сохранения копии данных в памяти. Некоторые примеры файлов таковы:

р дисковод для флоппи-дисков р байт- или блок-ориентированный файл;

р накопитель на магнитной ленте р байт-ориентированный файл;

р терминал р байт-ориентированный файл.

UNIX воспринимает клавиатуру и дисплей как файлы. Клавиатура считается файлом, из которого осуществляется ввод, и часто называется файлом стандартного ввода (stdin в терминологии UNIX). Дисплей считается файлом, в который осуществляется вывод, и часто называется файлом стандартного вывода (stdout в терминологии UNIX).

Важное сопутствующее стандартному вводу и выводу явление называется перенаправлением ввода/вывода. В UNIX использование перенаправления ввода/вывода делает возможным изменение стандартного файла ввода с клавиатуры на регулярный файл и изменение стандартного файла вывода с терминала на новый или существующий регулярный файл.

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

Еще одним интересным специальным файлом является bit bucket Он определяется как файл /(lev/null. Когда вывод перенаправляется в этот файл, фактически это означает, что вывод производиться не будет.

Сокеты (Sockets)

Сокет р интерфейс прикладного программирования (API), который используется для обмена информацией между двумя компьютерами. Другими словами, сокет выполняет сетевой ввод/вывод. Абстракция сокета была создана на основе файлов, но сокет не является реальным файлом. Для использования сокета в программе следует создать сокет и сконфигурировать его с соответствующими адресами локального и удаленного хостов. После соединения локального сокета с сокетом на удаленном хосте программа может использовать его для обмена информацией с удаленными хостами. Кроме того, существует два способа обмена информацией между хостами, использующими бесконтактные (connectionless) сокеты. Контактные сокеты обеспечивают передачу данных между двумя хостами, используя установленное соединение. В случае бесконтактного сокета для каждой передачи должен быть специфицирован адрес места назначения, то есть обмен не ограничен двумя точками. Бесконтактный сокет можно использовать для обмена информацией между любыми двумя компьютерами в сети.

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

Файлы, с которыми знакомо большинство людей, размещаются на жестких дисках и имеют фиксированные адреса. Хотя адреса могут модифицироваться после перемещения файла в новое место, но это не происходит во время операций над файлом. Данная концепция подходит для сетевого обмена информацией с фиксированным соединением. Однако компьютерам нужно обмениваться информацией и без фиксированных адресов, используя бесконтактные коммуникации. Для бесконтактных коммуникаций концепция файла UNIX не работает, поскольку двухточечное (point-to-point) соединение недостижимо. С этой целью сокеты обладают нескольким специальными API.

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

Ниже следует перечень функций API для передачи данных:

send: передача данных через подключенный сокет;

write: передача данных через подключенный сокет с использованием простого буфера данных;

writev: передача данных через подключенный сокет (используя фрагментированные области памяти);

sendto: передача данных через неподключенный сокет;

sendmsg: передача данных через неподключенный сокет с использованием специальной структуры данных.

Ниже следует список функций, применяемых сокетом для приема данных:

recv: чтение данных через подключенный сокет;

read: чтение данных через подключенный сокет с использованием простого буфера;

readv: чтение данных через подключенный сокет (используя фрагментированную память);

recvfrom: чтение данных через неподключенный сокет;

recvmsg: чтение данных через неподключенный сокет с использованием специальной структуры данных.

Сокет имеет несколько аргументов. Аргументы должны указываться при создании сокета. Первый аргумент указывает на семейство протоколов, которое будет применяться для обмена информацией. Доступны несколько протоколов, из которых самым популярным является TCP/IP р семейство протоколов Internet. Работая с семействами протоколов, вы должны знать адресацию, используемую в этих протоколах. Разные сети имеют разные форматы адресов компьютеров. Второй аргумент определяет тип используемого обмена информацией. Данные можно переслать в виде потока байтов, как при контактно-ориентированном обмене, или в виде серии независимых пакетов (называемых датаграммами), как в бесконтактных коммуникациях. Последний аргумент р это протокол, который будет использоваться и который является частью семейства, указанного первым аргументом.

Именованные каналы

Именованный канал представляет собой файл, созданный для обмена информацией между двумя процессами на одной машине. Посылающий процесс пишет данные в именованный канал, а принимающий процесс считывает данные из именованного канала. Канал р это временный файл, который существует так долго, как долго процессы обмениваются информацией. Данные из поименованного канала обрабатываются на основе алгоритма конвейера FIFO (First-in, first-out р первый пришел, первый ушел).

Символические и жесткие ссылки

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

жесткая ссылка;

символическая ссылка, часто называемая symlmk.

При жесткой связи исходное имя файла и имя ссылки указывают на один и тот же физический адрес и абсолютно идентичны. При использовании жесткой ссылки существует два важных ограничения: каталоги не могут иметь жестких ссылок и ссылка не может пересекать файловую систему. (Файловая система является физическим пространством, внутри которого должен размещаться файл. Простой файл не может распространяться более чем на одну файловую систему, но файловая система может иметь более одного файла.) Можно удалить исходное имя файла, не удаляя связанное имя. В такой ситуации файл не удаляется, но запись в каталоге, соответствующая исходному файлу удаляется и счетчик ссылок уменьшается на 1. Блоки данных файла удаляются тогда, когда счетчик ссылок станет равным нулю.

С символическими ссылками р иначе. Есть два файла: один р исходный, а второй р ссылка, содержащая имя исходного файла. Важное ограничение символической ссылки заключается в том, что можно удалить исходный файл. Это приведет к тому, что ссылка на файл будет существовать, но без каких-либо данных. Однако символические ссылки могут указывать на файлы в других файловых системах.

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

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

Если у вас в каталоге /u/guhas есть файл, называющийся origfile, с характеристиками

-rw-r-rр 2 guhas writer 30 Nov 8 01:14 origfile,

то файл под названием hlinkfile, который жестко связан с origfile, будет иметь следующие характеристики:

-rw-r-r- 2 guhas writer 30 Nov 8 01:20 hlinkfile

Двойка перед guhas означает, что существует два файла, связанные с одним и тем же физическим адресом (origfile и hlinkfile).

Файл под названием slinkfile, который является символической ссылкой с origfile, будет иметь следующие характеристики:

lrwxrwxrwx I guhas writer 8 Uov 8 01:10 slinkfile -> origfile

Связь очевидна из имени файла. В данном случае, если вы удалите origfile, то slinkfile станет бесполезной.

Именование файлов и каталогов

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

Например, символ > используется как оператор перенаправления вывода. Если необходимо создать файл с именем х>у, то, по идее, нужно использовать команду touch:

touch x>y

Но при этом получилось бы два файла: один с именем х, другой с именем у.

Для обхода проблемы используйте специальный символ (\) (в оболочках Кот и С), а команду touch применяйте следующим образом:

touch x\>y

 

ПРЕДОСТЕРЕЖЕНИЕ

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

Ниже следует список символов, которые можно использовать как часть имен файлов UNIX:

р Символы от А до Z или от а до z

р Цифры от 0 до 9

р Подчеркивание (_)

р Точка (.)

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

Точку можно задействовать перед расширением имени файла, так как она используется в именах файлов DOS. Например, файл с исходным кодом на языке С содержит программу под названием prog. Тогда файл можно назвать prog.c. Однако в UNIX вы не ограничены одним расширением. Следует иметь в виду, что точка (.), использующаяся как первый символ в имени файла, имеет специальное значение. Точка в качестве первого символа дает файлу статус скрытого. Например, если у вас есть файлы х и .х, в текущем каталоге, то команда ls покажет только файл х. Чтобы увидеть все файлы, используйте ls -a.

ПРЕДОСТЕРЕЖЕНИЕ

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

 

В таблице 4.1 представлен список символов или комбинаций символов, которых следует избегать, поскольку они обладают особым значением. Данный список не является исчерпывающим и зависит от используемой оболочки UNIX.

Таблица 4.1. Значение некоторых специальных символов.

Символ Значение

$ Указывает начало имени переменной оболочки. Например, $var соответствует переменной оболочки с именем var.

I Перенаправляет стандартный вывод на ввод следующей команды.

# Начинает комментарий.

& Выполняет процесс в фоновом режиме.

? Соответствует одному символу.

* Соответствует одному или нескольким символам.

$# Количество аргументов, переданных сценарию оболочки.

$* Аргументы, переданные сценарию оболочки.

$? Возвращает код предыдущей выполненной команды.

$$ Идентификационный номер процесса.

> Оператор перенаправления вывода.

< Оператор перенаправления ввода.

\ (обратная кавычка) Подстановка команды.

р Оператор перенаправления вывода (для добавления в конец файла).

[] Перечисляет диапазон символов, [a-z] означает все символы от а до г. [a,z] означает символы а или z.

. имяфайла Выполняет файл имяфайла.

: Разделитель имен каталогов в строке пути.

Организация файловой системы

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

Как средство организации файлов UNIX предлагает каталоги. Каталог представляет собой специальный файл, в котором содержится список как файлов, так и других каталогов (называемые также подкаталогами). Можно визуально представить структуру файлов UNIX как перевернутое дерево с корнем вверху. Таким образом самый верхний каталог называется корневым и отмечается одиночной наклонной чертой /. Все каталоги и файлы принадлежат корневому каталогу. Вы можете также представить файловую систему UNIX в виде шкафа с делами, где шкаф является корневым каталогом, отдельные ящики являются различными каталогами корневого каталога и папки являются подкаталогами, а дела в отдельных папках являются файлами в структурах каталогов и подкаталогов. Рисунок 4.1 показывает типичное дерево структуры каталогов.

В таблице 4.2 приводится список стандартных имен каталогов в файловой системе UNIX. Данный список не является исчерпывающим. Полный список зависит от той конкретной системы UNIX, с которой вы работаете.

Таблица 4.2. Список стандартных каталогов UNIX.

Имя каталога Подробности о каталоге

/ Корневой каталог. Это родительский каталог для всех каталогов и файлов в файловой системе UNIX.

/bin Каталог исполняемых модулей командной строки. Данный каталог содержит все исполняемые модули "родных" команд UNIX.

/dev Каталог устройств, содержащий специальные файлы для байт-ориентированных и

блок-ориентированных устройств, таких как принтеры и клавиатуры. В данном каталоге существует файл под называнием null, который называется bit bucket и который может использоваться для перенаправления вывода в никуда.

/etc Файлы системной конфигурации и каталог исполняемых файлов. Большая часть

административных файлов, а также файлов, связанных с командами, хранится здесь.

/lib В каталоге хранятся библиотеки компилятора С.

/lost+found Данный каталог содержит обрабатываемые файлы, если система отключилась ненормально. Система использует данный каталог для восстановления файлов. В каждом разделе диска есть только один каталог lost+found.

/и Обычно все начальные каталоги пользователей определяются под данным каталогом.

/usr Данный каталог имеет несколько подкаталогов, таких как adm, bin, etc и include. Например. /usr/include содержит файлы заголовков для компилятора С.

Имена путей (pathnames)

В UNIX имя файла, используемое операционной системой для идентификации файла, включает как часть имени все имена каталогов, начиная с корневого. Это дает возможность использовать для именования разных файлов, размещенных в разных каталогах, одно и то же имя. Например, если вы храните полученную за месяц и за день почту, то можете создать каталоги с названиями January, february, march и т.д. В каждом из каталогов можно создать такие файлы, как dayOl, day02 и day03. To же самое можно выполнить и для других каталогов. Таким образом, можно иметь одно и то же имя подкаталога в разных каталогах.

В результате возникает концепция текущего каталога и относительных путевых имен. Например, если бы вы были в каталоге с именем January и выполнили бы команду

ls -l day0l

то получили бы атрибуты файла dayOl под каталогом January, то есть UNIX ищет указанный файл в каталоге, в котором вы в данный момент находитесь. Все команды в UNIX используют текущий каталог для поиска файла, если имя файла не включает информацию о каталоге. Относительный путь всегда указывается относительно текущего каталога.

Если бы вы были в каталоге January и хотели получить атрибуты файла dayOl из february, то могли бы специфицировать абсолютное путевое имя файла. Таким образом вы бы выполнили команду

ls -l /u/guhas/february/dayOl

UNIX использует специальные символы (две последовательные точки) как относительное имя пути для указания каталога, который находится на один уровень выше, или на родительский каталог. Например, если бы вы были в каталоге /u/gnhas/january, то .. (две последовательные точки) в относительном пути указывали бы каталог /u/guhas (который является родительским каталогом для /u/guhas/january), a ../.* в относительном пути указывало бы на каталог /и.

Работа с каталогами

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

Наклонная черта (/) в имени файла означает, что вы работаете с файлом в другом каталоге. Если имя файла начинается с .. (двух последовательных точек), то вы осуществляете поиск файла, используя относительный путь файла. Если в имени файла нет .. (двух последовательных точек), то вы пытаетесь найти файл, используя абсолютный путь. Абсолютный путь всегда начинается с наклонной черты (/).

Когда вы входите в систему UNIX, то каталог, куда помещает вас система, называется начальным каталогом. По соглашению, каждый пользователь в системе имеет свой начальный каталог и его имя /и/ username. Оболочки Коrn и С используют для идентификации начального каталога пользователя специальный символ тильды (~). Например, если guhas является подключаемым пользователем, то следующие утверждения справедливы:

р ссылается на начальный каталог guhas.

р ~ friend ссылается на начальный каталог пользователя friend.

Получение списка файлов и каталогов командой ls

Команду ls (с ее многочисленными опциями) можно использовать для получения информации об одном или нескольких файлах или каталогах системы. Используйте ls для генерации списка файлов и каталогов в различном порядке, например по имени или по времени. Возможно распечатывать лишь отдельные детали о файлах и каталогах, например только имя файлаНапример, выполнение команды в текущем каталоге /u/guhas

ls -l

покажет следующее:

рrwxrwxrwx I guhas staff 7161 May 8 15:35 example.с drwxrwxrwx 3 guhas staff 1536 Oct 19 00:54 exe

рrw-rрrр 2 guhas staff 10 Mov 3 14:28 filel

рrw-rрrр 2 guhas staff 10 Nov 3 14:28 filell2

Сведения о файле включают:

права доступа к файлу;

количество ссылок;

пользователя-владельца файла;

группу пользователя, создавшего файл;

размер файла, дату и время, когда файл последний раз подвергся модификации;

имя файла.

Предыдущий пример показывает, что текущий каталог включает каталог под названием exe и три файла -- examplc.c, filel и file2. Для каталога exe число показанных ссылок равняется трем, в том числе ссылку на родительский каталог /u/guhas; ссылку, которая является самим входом exe и ссылку на подкаталог ниже exe. Количество ссылок для файла example.с равняется единице, поскольку файл не имеет ни одной жесткой ссылки. Количество ссылок в файлах filel и file2 по две, поскольку они связаны с помощью жесткой ссылки.

Как уже упоминалось, следует быть внимательными в отношении скрытых файлов. Используя команду ls без опции -а, нельзя узнать, есть они или нет. В предыдущем примере, если вы используете команду

ls -al

то увидите еще две записи, . (одиночная точка) и .. (две последовательных точки), которые являются входами для каталога и для родительского каталога.

В предыдущих примерах первый символ перед атрибутами прав доступа (например, d в drwxrwxр) предоставлял информацию о типе файла. Значения типа файла таковы:

d: Запись является каталогом.

b: Запись является блок-ориентированным файлом.

с: Запись является байт-ориентированным файлом.

1: Запись является символической ссылкой.

р: Запись является FIFO-ориентированным файлом.

s: Запись является локальным сокетом.

-: Запись является регулярным файлом.

Создание и удаление каталогов: mkdir и rmdir

Когда регистрируется новый пользователь в операционной системе UNIX, то обычно создается каталог /u/username, который будет начальным для этого пользователя. Вам необходимо будет организовать свою структуру каталогов. Как и с файлами, для создания каталогов можно использовать относительные или абсолютные имена. Если текущим каталогом является /u/guhas, то

mkdir temp

создаст подкаталог с названием temp в каталоге guhas и его абсолютный путь будет /u/guhas/temp.

mkdir /u/guhas/temp

можно также использовать для получения того же эффекта, что дала предыдущая команда. mkdir ../temp

позволит создать каталог /u/temp. Данный пример использует .. (две последовательные точки) как часть относительного пути для указания, что каталог temp будет создан в каталоге на один уровень выше, то есть в каталоге /и. Используя mkdir, можно создать более чем один каталог сразу. Например, из текущего каталога выдайте следующую команду:

mkdir testdirl /u/guhas/temp/testdir2

которая создаст testdirl в текущем каталоге и testdir2 в каталоге /u/guhas/temp (предполагается, что такой каталог существует.) В данном примере testdirl использует относительный путь, a /u/guhas/testdir2 использует абсолютный путь.

Если каталог уже есть, то UNIX сообщит об ошибке, предупредив, что каталог уже существует.

Для создания каталога у вас должно быть право на запись в родительском каталоге, в котором вы создаете подкаталог, и родительский каталог должен существовать. Однако многие системы UNIX с mkdir обеспечивают опцию -р. При указании данной опции, если родительского каталога не существует, то он также будет создан.

Если работа с каталогом окончена или вы израсходовали все пространство на диске и хотите каталог удалить, используйте команду rmdir

Если текущий каталог р /н/guhas и temp находится в нем, то для удаления каталога temp используйте команду

rmdir temp

При выполнении команды может появиться сообщение об ошибке, утверждающее Directory temp is not empty (Каталог temp не пуст), что означает наличие в temp файлов и каталогов. Удалить каталог можно только тогда, когда он пуст (все файлы и каталоги в нем удалены ранее). Командой rmdir удалять файлы нельзя. Для этой цели существует команда rm

.

Использование команды find

Если вы работаете одновременно над несколькими проектами, то бывает невозможно запомнить детали всех тех файлов, с которыми приходится работать. Здесь на помощь приходит команда find. Основная функция команды find заключается в поиске пути или каталога с заданными характеристиками в указанном дереве каталогов.

Основная форма команды find:

find . -print

Существует множество аргументов, которые можно указать с командой find для разных атрибутов и файлов каталогов Здесь приводятся лишь несколько примеров таких аргументов:

р name: Ищет файлы в структуре каталога с определенными соглашениями по наименованию.

р modify: Ищет файлы, которые были модифицированы в течение указанного периода времени.

р access date: Ищет файлы, которые открывали в течение указанного периода.

р permission: Ищет файлы с определенными правами доступа.

р user: Ищет файлы, принадлежащие указанному владельцу.

р group: Ищет файлы, которые принадлежат указанной группе.

р size: Ищет файлы указанного размера. я type: Ищет файлы указанного типа.

Команду find можно использовать для поиска файлов и каталогов, которые удовлетворяют или не удовлетворяют множеству условий, например:

а соединяет множество условий через AND (логическое "И)";

о соединяет множество условий через OR (логическое "ИЛИ");

! отрицает условие (логическое "НЕ");

expression для задания любого сложного условия.

Команда find имеет еще одну группу аргументов, которые применяются для указания действия, предпринимаемого в случае обнаружения заказанных файлов или каталогов, например:

print печатает имена файлов в стандартный вывод.

exec command выполняет указанную команду.

Наиболее существенной причиной использования команды find является ее способность рекурсивно обрабатывать подкаталоги.

ПРИМЕЧАНИЕ

Всегда используйте в команде find опцию -print если этого не сделать, то команда выполнится, но не сгенерирует никакого вывода. Например, для поиска всех файлов, которые начинаются на t в текущем каталоге или подкаталогах ниже текущего, следует использовать команду find -name "t*" -print а не find . -name "t*".

Если необходимо получить список всех файлов, к которым происходил доступ в последние 24 часа, то выполните команду:

find . -atime 0 -print

Если системный администратор хочет получить список всех .profile (данный файл играет особую роль при регистрации в системе UNIX), применяемых всеми пользователями, то следует выполнить такую команду:

find / -name .profile -print

Можно также выполнить команду find с несколькими условиями. Если хотите получить перечень файлов, которые были модифицированы в последние 24 часа и которые имели права доступа 777, то необходимо выполнить следующую команду:

find . -perm 777 -a mtime 0 -print

Обзор использования диска с помощью команд du и df

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

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

Команда df используется для получения атрибутов всех или указанных файловых систем в системе UNIX. Обычно атрибуты, отображаемые командой df, таковы:

file system: Имя файловой системы.

kbytes. Размер файловой системы в килобайтах.

used: Количество использованной памяти.

avail: Количество свободной памяти.

iused Количество использованных индексных дескрипторов.

capacity: Процент использования общей емкости.

%iused. Процент использованных индексных дескрипторов из всех доступных.

mounted on: Имя каталога верхнего уровня.

Если вы находитесь в своем начальном каталоге и выполните следующую команду:

df . то она возвратит следующее:

File system Total KB free %used iused %iused Mounted on /dev/hdl 151552 41828 72% 5534 14% /u

Такая запись означает, что ваша начальная запись есть в файловой системе под названием /devl/hdl и каталог верхнего уровня в файловой системе называется /u. Для данного примера вы получите один и тот же результат независимо от того, какой каталог является текущим. Необходимо лишь оставаться в каталоге, чей абсолютный путь начинается на /u.

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

Команда du отображает количество блоков для файлов и каталогов, указанных в качестве аргументов и, рекурсивно, для всех каталогов в каталоге, указанном как аргумент.

Вы можете выполнить из текущего каталога следующую команду:

du или du .

и получить следующий результат:

8

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

Определение природы содержимого файла с помощью команды file

Команда file применяется для определения типа указанного файла. Команда file реально читает файл и выполняет серию проверок, определяющих тип файла. Затем команда отображает результаты в стандартный вывод.

Если файл оказывается ASCII, то команда file исследует первые 512 байтов и пытается определить язык программирования. Если файл не ASCII, то команда find далее пытается определить двоичный файл данных из текстового файла, содержащего символы расширенного набора.

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

Команда find использует для идентификации файлов файл /etc/magic, чтобы определить, не содержит ли исследуемый файл что-то типа магического числа, то есть любую числовую или строковую константу, указывающую тип.

Например, если у вас есть файл под названием letter в текущем каталоге и он содержит письмо к другу, то выполнение команды

file letter отобразит следующий результат:

letter: commands text

Если у вас есть файл под названием prog и в нем записана исполняемая программа (и вы работаете с IBM RISC 6000 AIX version 3.1), то выполнение команды

file prog отобразит следующий результат:

prog: executable (RISC System/6000 V3.1) Если вы находитесь в каталоге /dev, который содержит все специальные файлы, то выполнение команды

file hdl

для файла под названием hdl (диск, на котором была определена файловая система), то будет отображен следующий результат:

hdl: block special Более подробно об опциях, используемых в команде file, вы узнаете из главы 5.

Права доступа к файлам и каталогам

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

В UNIX каждому пользователю соответствует уникальный идентификатор регистрации пользователя UTD. Кроме того, многие пользователи собраны вместе и ассоциированы в группы. Пользователь может принадлежать к одной или нескольким таким группам. Однако пользователь принадлежит только к одной первичной группе. Все остальные группы, к которым принадлежит пользователь, называются вторичными группами. Идентификатор пользователя определяется в файле /etc/passwd, а группы пользователя определяются в файле /nsr/group. Права доступа к файлам и каталогам в UNIX базируются на пользователе и на группе.

Все права доступа, ассоциированные с файлом или каталогом, делятся на три типа:

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

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

Права доступа для всех остальных: определяют операции, которые может выполнять любой человек (не являющийся владельцем и не принадлежащий к группе владельца).

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

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

ls -al testfile отобразит разрешения файла testfile:

рrw-rр 1 guhas staff 2031 Nov 04 06:14 testfile

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

Например, если у вас есть в текущем каталоге каталог под названием testdir, который содержит файл под названием testfile и права доступа группы для testdir р только чтение, то выполнение следующей команды

ls testdir отобразит результат

testfile

Однако если вы захотите увидеть содержимое файла testfile с помощью команды:

cat testdir/testfile то получите следующее сообщение об ошибке:

cat: testdir/testfile permission denied (доступ запрещен)

Для выполнения любой операции над testfile в testdir у вас должно быть право на исполнение в testdir.

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

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

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

Например, предположим, что у нас есть подкаталог testdir в /u/guhas, а в нем есть файл, называющийся testfile. Предположим также, что для подкаталога testdir установлен доступ с разрешением 710 (то есть разрешением на выполнение для группы). В таком случае член группы, выполнив команду Is для testdir, получит следующий результат:

ls -l testdir

testdir unreadable (testdir нечитаем)

total 0

В то же время, если кто-то, осведомленный о testfile, выполнит следующую команду:

ls -l testdir/testfile то получит

рrw-r-r- I guhas staff 23 Jul 8 01:48 testdir/testfile

и будет знать всю информацию о файле testfile.

В UNIX существует специальный пользователь, который имеет всеобъемлющее разрешение читать, писать

и выполнять файлы в системе, независимо от владельца файла или каталога. Данный пользователь известен как корневой (root).

Биты кода прав доступа

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

Права доступа владельца.

Права доступа группы.

Права доступа всех остальных.

Для каждого из этих трех уровней прав доступа есть три ассоциированных бита доступа. Ниже идет список битов и описан их смысл для файлов:

р Read (г). Файл можно читать.

р Write (w). Файл можно модифицировать, удалять или переименовывать.

р Execute (x). Файл можно выполнять.

Далее приведен список битов доступа и их значение для каталогов:

р Read (r). Каталог можно читать.

р Write (w). Каталог можно модифицировать, удалять или переименовывать.

р Execute (x). В каталоге можно выполнять операции над файлами. Данный бит называют также битом поиска (search bit), поскольку он не используется для указания, можно ли каталог выполнять или нет, но указывает, разрешено ли искать файлы в каталоге.

Давайте исследуем разрешения каталога более подробно. Предположим, существует подкаталог, называющийся testdir, входящий в каталог /u/gohas со следующими правами доступа:

drwxrws-р 3 guhas staff 1536 Nov 4 06:00 testdir

Кроме того, пусть каталог testdir содержит файл, называющийся testfile и имеющий следующие права доступа:

-rwxr-рвД l guhas staff 2000 Nov 4 06:10 testdir

Такие права доступа означают, что пользователь guhas может читать, модифицировать и переименовывать каталог и файлы в каталоге. Любой член группы staff также имеет доступ к каталогу. Файл testfile установлен с правами на чтение только для членов группы staff. Однако поскольку все члены staff имеют право читать, писать и выполнять в testdir, то любой пользователь, принадлежащий группе staff, может также модифицировать, удалять и переименовывать файл testfile.

ПРЕДУПРЕЖДЕНИЕ

Если пользователь обладает правом на запись в каталог, содержащий файл, то права доступа файлов в данном каталоге перекрываются правами доступа каталога

'

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

р Бит 1, значение 0 или 1 (определяет право на чтение)

р Бит 2, значение 0 или 1 (определяет право на запись)

р Бит 3, значение 0 или 1 (определяет право на выполнение)

Первый бит (чтение) имеет вес 4, второй бит (запись) имеет вес 2 и третий бит (выполнение) имеет вес 1. Например, значение 101 будет равно 5. (Значение двоичного 101 р это (4 * 1) + (2 * 0) + (1 * 1) = 5).

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

р владелец читает, пишет и выполняет;

р группа читает и выполняет;

р остальные р вообще не имеют доступа.

Такие разрешения определяются, используя двоичную арифметику, как:

Владелец 111 = 7

Группа 101 - 5

Остальные 000 = О

Таким образом, код права доступа файла testfile будет 750.

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

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

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

Если не хотите, чтобы информация была доступна кому-нибудь, кроме вас или вашей группы, установите права доступа для других в 0. Код прав доступа может быть 770 или 750.

Далее идет пример того, как установить права доступа, аннулирующие права доступа для конкретной группы. Предположим, что есть каталог под названием testdir в текущем каталоге, которым владеет группа под названием outsider. Если вы выполните следующую команду для текущего каталога, то группа outsider не сможет выполнить ни одной функции в каталоге testdir:

chmod 705 testdir

Права доступа по умолчанию: umask

Когда пользователь входит в систему UNIX, то получает код прав доступа по умолчанию. Все файлы и все каталоги, которые создает пользователь, будут иметь права доступа, определяемые umask. Узнать, каковы для вас права доступа по умолчанию можно, выполнив следующую команду:

umask В результате может быть отображено следующее:

022

umask хранится и отображается как число, вычитаемое из 777. 022 означает, что разрешения по умолчанию таковы:

777 - 022 - 755

То есть, владелец может читать, писать и выполнять. Группа может читать и выполнять. Все остальные также могут читать и выполнять.

umask по умолчанию обычно устанавливается для всех пользователей системным администратором. Значение по умолчанию можно модифицировать так, чтобы оно лучше удовлетворяло вашим нуждам. Модификация производится выполнением команды umask с аргументом, который определяет желаемую маску. Например, если вы хотите, чтобы разрешения по умолчанию для владельца были читать, писать и выполнять (7), для группы р читать и писать (5), для остальных р только выполнять (1), то umask следует установить в 777 - 751 = 026. Команда должна исполняться в таком виде:

umask 026

Изменение прав доступа: chmod

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

Командой chmod вы указываете новые права доступа, которые необходимо установить для файла или каталога. Новые разрешения можно указать одним из следующих способов:

р В трехзначном, числовом восьмеричном коде

р В символическом режиме

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

chmod 741 testfiie При работе в символическом режиме укажите следующее:

р Чьи (владельца, группы или остальных) права вы хотите изменить

я Что (+ добавить, - вычесть, == уравнять) вы хотите сделать с правами доступа

р Тип доступа (r, w, x)

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

chmod g+w testfiie

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

chmod o=g testfiie

Еще один пример работы в символическом режиме: вы хотите модифицировать права доступа группы и всех остальных. Для предоставления права записи группе и запрещении писать остальным выполняется следующая команда:

chmod g+w, o-w testfiie

Изменение владельца и группы: chown и chgrp

Если вы хотите изменить владельца файла или каталога, то можете использовать команду chown.

ПРЕДУПРЕЖДЕНИЕ

В системах UNIX с дисковыми квотами менять владельца файла или каталога может только привилегированный пользователь.

Если файл testfiie принадлежит пользователю guhas, то для изменения владельца файла на пользователя friend, вам нужно выполнить следующую команду:

chown friend testfiie

Если вы хотите изменить группу, которой принадлежит файл, то используйте команду chgrp. Группа должна быть одной из тех, к которой принадлежит владелец. То есть, группа должна быть либо первичной, либо одной из вторичных групп владельца. Предположим, что пользователь guhas владеет файлом testfiie и группой файла является staff. Также предположим, что guhas принадлежит группам staff и devt. Для изменения владельца testfiie со staff на devt выполните команду:

chgrp devt testfiie

Setuid и Setgid

Когда вы выполняете некоторые программы, то бывает необходимо предположить идентичность разных пользователей или групп. В UNIX возможно установить бит SET USER ID (setuid) для исполняемой программы так, чтобы при ее выполнении вы идентифицируетесь как пользователь, владеющий исполняемой программой. Например, если вы выполняете файл под названием testpgm, которым владеет specialuser, то для выполнения программы вы становитесь идентичны specialuser. Таким же образом, если SET GROUP ID исполняемого файла установлен, то исполнение данного файла приведет к тому, что вы на время выполнения станете идентичны группе, которая владеет файлом.

Вот пример того, как используется бит SET USER ID, Предположим, что вы хотите скопировать все файлы в системе, попросив оператора ночной смены. Обычно это делается привилегированным пользователем. Создайте копию программы резервного копирования с установленным битом SET USER ID. Только в этом случае оператор ночной смены сможет выполнить данную программу, поскольку станет на момент выполнения привилегированным пользователем.

Резюме

В данной главе обсуждалось, что такое файлы, каковы различные типы файлов, как организовать файлы в каталоги. Вы узнали, как определять права доступа файлов и каталогов. Вы также познакомились с несколькими командами для работы с файлами, такими как Is р для получения списка файлов и подробных сведений о них, chmod р для изменения прав доступа файлов и каталогов, chown р для изменения владельца файла или каталога, chgrp р для изменения группы, владеющей файлом, umask р для отображения и изменения прав доступа по умолчанию для пользователя и du (или <tt) р для получения информации об использовании дискового пространства

К оглавлению