- •Возникновение и первая редакция ос unix
- •Основные понятия
- •Пользователь
- •Интерфейс пользователя
- •Привилегированный пользователь
- •Программы
- •Команды
- •Процессы
- •Перенаправление ввода/вывода
- •Руководство
- •Поля руководства
- •Краткое описание Семантическое
- •Синтаксическое
- •Описание
- •Результат
- •Использование
- •Ссылки на другие объекты
- •Родословная
- •Особенности руководств
- •Смысловая структура системы руководств
- •Утилита man
- •Утилиты whatis и apropos
- •Работа с руководствами
- •Система info
- •Что такое удобство?
- •Требования к интерфейсу unix
- •Командная строка
- •Договоренности о формате командной строки
- •Разновидности файлов
- •Обычные файлы
- •Файлы-каталоги
- •Специальные файлы
- •Связывание файлов с разными именами
- •Именованные программные каналы
- •Файлы, отображаемые в виртуальную память
- •Синхронизация при параллельном доступе к файлам
- •Принципы защиты
- •Идентификаторы пользователя и группы пользователей
- •Защита файлов
- •Управление устройствами
- •Устройство как специальный файл
- •Драйверы устройств
- •Внешний и внутренний интерфейсы устройств
- •Традиционные средства интерактивного интерфейса пользователей
- •Командные языки и командные интерпретаторы
- •Общая характеристика командных языков
- •Базовые возможности семейства командных интерпретаторов
- •Bourne-shell
- •C-shell
- •Korn-shell
- •Команды и утилиты
- •Организация команды в ос unix
- •Перенаправление ввода/вывода и организация конвейера
- •Встроенные, библиотечные и пользовательские команды
- •10. Принципы сборки и установки пакетов.
Договоренности о формате командной строки
Можно различить два вида параметров: те, что изменяют поведение команды, и те, что передают команде дополнительную информацию (классическое разделение на поток управления и поток данных). Первый вид называется ключами (options), а второй - собственно параметрами. Параметры могут выглядеть как угодно (имена файлов, фамилии сотрудников, регулярные выражения, вообще любой текст), а ключи обычно имеют строго определенный вид.
Существует две договоренности по формату ключей. Первая - так называемый UNIX style, или односимвольный формат. Чтобы отличаться от параметра, ключ должен начинаться с символа "-". Второй символ - собственно ключ, он указывает, как именно видоизменяется работа команды. Например, утилита ls показывает список файлов в текущем каталоге. Команда ls имя-каталога воспринимает второй аргумент как параметр и показывает список файлов, находящихся в каталоге имя-каталога. Команды ls -l или ls -l имя-каталога покажут соответствующие списки в "длинном" (long) формате: вдобавок к именам файлов будет выведено немало дополнительной информации. Очень неплохо, если при именовании ключа соблюдается принцип аббревиативности: имя ключа - буква, с которой начинается имя производимого им действия.
Если так случилось, что параметр начинается с символа (например, параметр - отрицательное число), то существует специальный ключ "--" ("-" - это имя ключа, перед которым, по договоренности, должен стоять признак ключа, т. е. еще один "-"), который означает, что все последующие аргументы, как бы они ни выглядели, будут параметрами, а не ключами. Например, утилита cat занимается выводом на стандартное устройство вывода (терминал) всего того, что считала со стандартного устройства ввода. (Если вы запустили cat без параметров, нажмите клавишу Ctrl и одновременно D). В виде "cat имя-файла" cat выводит содержимое файла имя-файла. Поэтому для вывода на терминал содержимого файла -minus-first нужно ввести что-то вроде cat -- -minus-first.
Вторая договоренность по формату ключей носит название GNU style (или полнословный формат), так как зародилась она в недрах сообщества GNU, занимающегося свободным программным обеспечением (см. [14]). Причина появления этой более новой договоренности проста. Если команда имеет слишком широкие возможности, у нее появляется слишком много ключей. Запомнить или хотя бы отыскать в документации однобуквенный ключ (скорее всего, уже не аббревиативный, потому что букв на всех не хватает) непросто. Полнословный ключ начинается с двух минусов и далее содержит одно (или чуть больше) слов-описателей, разделенных также знаком "-". Например, ключ -A (All) предписывает утилите ls вывести имена всех, в том числе "скрытых" файлов (файл, чье имя начинается на . считается скрытым; именно такие имена бывают у файлов и каталогов, создаваемых утилитами UNIX автоматически для своих нужд), кроме ".." и ".", имеющих специальный смысл. В нотации GNU этот ключ выглядит как --almost-all. Гораздо понятнее, но в шесть раз длиннее.
Часто используются так называемые параметрические ключи, т. е. ключи, которым самим требуются параметры. Например, в очень многих утилитах ключ -o означает перенаправление вывода в файл, поэтому следующий за ним параметр должен быть именем этого выходного файла. Скажем, утилита постраничного просмотра файлов less может записывать протокол работы пользователя в файл. Для этого ее надо вызвать с параметрами less что-смотрим -o протокол или, в нотации GNU, less что-смотрим --log-file=протокол. Обратите внимание на символ =, именно так в полнословном формате указывается параметр ключа.
Файловая система. Структура файловой системы. Монтируемые файловые системы. Интерфейс с файловой системой.
Файловая система UNIX характеризуется:
* иерархической структурой,
* согласованной обработкой массивов данных,
* возможностью создания и удаления файлов,
* динамическим расширением файлов,
* защитой информации в файлах,
* трактовкой периферийных устройств (таких как терминалы и ленточные ус-
тройства) как файлов.
Файловая система организована в виде дерева с одной исходной вершиной,
которая называется корнем (записывается: "/"); каждая вершина в древовидной
структуре файловой системы, кроме листьев, является каталогом файлов, а фай-
/
+-------------+------------+---------+---------+---------+
| | | | | |
fsl bin etc usr unix dev
+-+-+ +---+---+ | +-+-+ +-+-+
| | | | | | | | | |
mjb maury sh date who passwd src bin tty00 tty01
|
|
cmd
+---+---+
| |
date.c who.c
лы, соответствующие дочерним вершинам, являются либо каталогами, либо обыч-
ными файлами, либо файлами устройств. Имени файла предшествует указание пути
поиска, который описывает место расположения файла в иерархической структуре
файловой системы. Имя пути поиска состоит из компонент, разделенных между
собой наклонной чертой (/); каждая компонента
представляет собой набор символов, составляющих имя вершины (файла), которое
является уникальным для каталога (предыдущей компоненты), в котором оно со-
держится. Полное имя пути поиска начинается с указания наклонной черты и
идентифицирует файл (вершину), поиск которого ведется от корневой вершины
дерева файловой системы с обходом тех ветвей дерева файлов, которые соответ-
ствуют именам отдельных компонент. Так, пути "/etc/passwd", "/bin/who" и
"/usr/src/cmd/who.c" указывают на файлы, являющиеся вершинами дерева, изоб-
раженного на Рисунке 1.2, а пути "/bin/passwd" и "/usr/ src/date.c" содержат
неверный маршрут. Имя пути поиска необязательно должно начинаться с корня, в
нем следует указывать маршрут относительно текущего для выполняемого процес-
са каталога, при этом предыдущие символы "наклонная черта" в имени пути
опускаются. Так, например, если мы находимся в каталоге "/dev", то путь
"tty01" указывает файл, полное имя пути поиска для которого "/dev
/tty01".
Программы, выполняемые под управлением системы UNIX, не содержат никакой
информации относительно внутреннего формата, в котором ядро хранит файлы
данных, данные в программах представляются как бесформатный поток байтов.
Программы могут интерпретировать поток байтов по своему желанию, при этом
любая интерпретация никак не будет связана с фактическим способом хранения
данных в операционной системе. Так, синтаксические правила, определяющие за-
дание метода доступа к данным в файле, устанавливаются системой и являются
едиными для всех программ, однако семантика данных определяется конкретной
программой. Например, программа форматирования текста troff ищет в конце
каждой строки текста символы перехода на новую строку, а программа учета
системных ресурсов acctcom работает с записями фиксированной длины. Обе
программы пользуются одними и теми же системными средствами для осуществле-
ния доступа к данным в файле как к потоку байтов, и внутри себя преобразуют
этот поток по соответствующему формату. Если любая из программ обнаружит,
что формат данных неверен, она принимает соответствующие меры.
Каталоги похожи на обычные файлы в одном отношении; система представляет
информацию в каталоге набором байтов, но эта информация включает в себя име-
на файлов в каталоге в объявленном формате для того, чтобы операционная сис-
тема и программы, такие как ls (выводит список имен и атрибутов файлов),
могли их обнаружить.
Права доступа к файлу регулируются установкой специальных битов разреше-
ния доступа, связанных с файлом. Устанавливая биты разрешения доступа, можно
независимо управлять выдачей разрешений на чтение, запись и выполнение для
трех категорий пользователей: владельца файла, группового пользователя и
прочих. Пользователи могут создавать файлы, если разрешен доступ к каталогу.
Вновь созданные файлы становятся листьями в древовидной структуре файловой
системы.
Для пользователя система UNIX трактует устройства так, как если бы они
были файлами. Устройства, для которых назначены специальные файлы устройств,
становятся вершинами в структуре файловой системы. Обращение программ к уст-
ройствам имеет тот же самый синтаксис, что и обращение к обычным файлам; се-
мантика операций чтения и записи по отношению к устройствам в большой степе-
ни совпадает с семантикой операций чтения и записи обычных файлов. Способ
защиты устройств совпадает со способом защиты обычных файлов: путем соответ-
ствующей установки битов разрешения доступа к ним (файлам). Поскольку имена
устройств выглядят так же, как и имена обычных файлов, и поскольку над уст-
ройствами и над обычными файлами выполняются одни и те же операции, большин-
ству программ нет необходимости различать внутри себя типы обрабатываемых
файлов.
Физический диск состоит из нескольких логических разделов, на которые он
разбит дисковым драйвером, причем каждому разделу соответствует файл устрой-
ства, имеющий определенное имя. Процессы обращаются к данным раздела, откры-
вая соответствующий файл устройства и затем ведя запись и чтение из этого
"файла", представляя его себе в виде последовательности дисковых блоков.
Раздел диска может содержать логическую файловую систему, состоящую из блока начальной загрузки, суперблока, списка индексов и информационных блоков.
Системная функция mount (монтировать) связывает файловую систему из указан-
ного раздела на диске с существующей иерархией файловых систем, а функция
umount (демонтировать) выключает файловую систему из иерархии. Функция
mount, таким образом, дает пользователям возможность обращаться к данным в
дисковом разделе как к файловой системе, а не как к последовательности дис-
ковых блоков.
Синтаксис вызова функции mount:
mount(special pathname,directory pathname,options);
где special pathname - имя специального файла устройства, соответствующего
дисковому разделу с монтируемой файловой системой, directory pathname - ка-
талог в существующей иерархии, где будет монтироваться файловая система
(другими словами, точка или место монтирования), а options указывает, следу-
ет ли монтировать файловую систему "только для чтения" (при этом не будут
выполняться
+ - - - - - - - - - - - - - - - - - - - - - - - - +
/
| | |
+----------------+--+-------------+ Корневая
| | | | | файловая
bin etc usr система
| | | - |
+-----+-----+ +----+----+ -
| | | | | | - |
cc date sh getty passwd -
+ - - - - - - - - - - - - - - - - - - - - - - - - +
-
+ - - - - - - - - - - - - - - - - - - - - - - - - +
/
| | |
Файловая +----------------+--+-------------+
система из | | | | |
раздела с bin include src
именем | | | | |
/dev/dsk1 +-----+-----+ | |
| | | | | | |
awk banner yacc stdio.h uts
+ - - - - - - - - - - - - - - - - - - - - - - - - +
Рисунок 5.22. Дерево файловых систем до и после выполнения функции mount
такие функции, как write и creat, которые производят запись в файловую сис-
тему). Например, если процесс вызывает функцию mount следующим образом:
mount("/dev/dsk1","/usr",0);
ядро присоединяет файловую систему, находящуюся в дисковом разделе с именем
"/dev/dsk1", к каталогу "/usr" в существующем дереве файловых систем (см.
Рисунок 5.22). Файл "/dev/dsk1" является блочным специальным файлом, т.е. он
носит имя устройства блочного типа, обычно имя раздела на диске. Ядро пред-
полагает, что раздел на диске с указанным именем содержит файловую систему с
суперблоком, списком индексов и корневым индексом. После выполнения функции
mount к корню смонтированной файловой системы можно обращаться по имени
"/usr". Процессы могут обращаться к файлам в монтированной файловой системе
и игнорировать тот факт, что система может отсоединяться. Только системная
функция link контролирует файловую систему, так как в версии V не разрешают-
ся связи между файлами, принадлежащими разным файловым системам.
Ядро поддерживает таблицу монтирования с записями о каждой монтированной
файловой системе. В каждой записи таблицы монтирования содержатся:
* номер устройства, идентифицирующий монтированную файловую систему (упо-
мянутый выше логический номер файловой системы);
* указатель на буфер, где находится суперблок файловой системы;
* указатель на корневой индекс монтированной файловой системы ("/" для
файловой системы с именем "/dev/dsk1" на Рисунке 5.22);
* указатель на индекс каталога, ставшего точкой монтирования (на Рисунке
5.22 это каталог "usr", принадлежащий корневой файловой системе).
Связь индекса точки монтирования с корневым индексом монтированной фай-
ловой системы, возникшая в результате выполнения системной функции mount,
дает ядру возможность легко двигаться по иерархии файловых систем без полу-
чения от пользователей дополнительных сведений.
+------------------------------------------------------------+
| алгоритм mount |
| входная информация: имя блочного специального файла |
| имя каталога точки монтирования |
| опции ("только для чтения") |
| выходная информация: отсутствует |
| { |
| если (пользователь не является суперпользователем) |
| возвратить (ошибку); |
| получить индекс для блочного специального файла (алго- |
| ритм namei); |
| проверить допустимость значений параметров; |
| получить индекс для имени каталога, где производится |
| монтирование (алгоритм namei); |
| если (индекс не является индексом каталога или счетчик |
| ссылок имеет значение > 1) |
| { |
| освободить индексы (алгоритм iput); |
| возвратить (ошибку); |
| } |
| найти свободное место в таблице монтирования; |
| запустить процедуру открытия блочного устройства для |
| данного драйвера; |
| получить свободный буфер из буферного кеша; |
| считать суперблок в свободный буфер; |
| проинициализировать поля суперблока; |
| получить корневой индекс монтируемой системы (алгоритм |
| iget), сохранить его в таблице монтирования; |
| сделать пометку в индексе каталога о том, что каталог |
| является точкой монтирования; |
| освободить индекс специального файла (алгоритм iput); |
| снять блокировку с индекса каталога точки монтирования;|
| } |
+------------------------------------------------------------+
Рисунок 5.23. Алгоритм монтирования файловой системы
На Рисунке 5.23 показан алгоритм монтирования файловой системы. Ядро
позволяет монтировать и демонтировать файловые системы только тем процессам,
владельцем которых является суперпользователь.
Ядро находит индекс специального файла, представляющего файловую систе-
му, подлежащую монтированию, извлекает старший и младший номера, которые
идентифицируют соответствующий дисковый раздел, и выбирает индекс каталога,
в котором файловая система будет смонтирована. Счетчик ссылок в индексе ка-
талога должен иметь значение, не превышающее 1 (и меньше 1 он не должен быть
- почему?), в связи с наличием потенциально опасных побочных эффектов.
Затем ядро назначает свободное место в таблице монтирова-
ния, помечает его для использования и присваивает значение полю номера уст-
ройства в таблице. Вышеуказанные назначения производятся немедленно, пос-
кольку вызывающий процесс может приостановиться, следуя процедуре открытия
устройства или считывая суперблок файловой системы, а другой процесс тем
временем попытался бы смонтировать файловую систему. Пометив для использова-
ния запись в таблице монтирования, ядро не допускает использования в двух
вызовах функции mount одной и той же записи таблицы. Запоминая номер устрой-
ства с монтируемой системой, ядро может воспрепятствовать повторному монти-
рованию одной и той же системы другими процессами, которое, будь оно допуще-
но, могло бы привести к непредсказуемым последствиям.
Ядро вызывает процедуру открытия для блочного устройства, содержащего
файловую систему, точно так же, как оно делает это при непосредственном отк-
рытии блочного устройства . Процедура открытия устройства обычно
проверяет существование такого устройства, иногда производя инициализацию
структур данных драйвера и посылая команды инициализации аппаратуре. Затем
ядро выделяет из буферного пула свободный буфер (вариант алгоритма getblk)
для хранения суперблока монтируемой файловой системы и считывает суперблок,
используя один из вариантов алгоритма read. Ядро сохраняет указатель на ин-
декс каталога, в котором монтируется система, давая возможность маршрутам
поиска файловых имен, содержащих имя "..", пересекать точку монтирования,
как мы увидим дальше. Оно находит корневой индекс монтируемой файловой сис-
темы и запоминает указатель на индекс в таблице монтирования. С точки зрения
пользователя, место (точка) монтирования и корень файловой системы логически
эквивалентны, и ядро упрочивает эту эквивалентность благодаря их сосущество-
ванию в одной записи таблицы монтирования. Процессы больше не могут обра-
щаться к индексу каталога - точки монтирования.
Ядро инициализирует поля в суперблоке файловой системы, очищая поля для
списка свободных блоков и списка свободных индексов и устанавливая число
свободных индексов в суперблоке равным 0. Целью инициализации (задания на-
чальных значений полей) является сведение к минимуму опасности разрушить
файловую систему, если монтирование осуществляется после аварийного заверше-
ния работы системы. Если ядро заставить думать, что в суперблоке отсутствуют
свободные индексы, то это приведет к запуску алгоритма ialloc, ведущего по-
иск на диске свободных индексов. К сожалению, если список свободных дисковых
блоков испорчен, ядро не исправляет этот список изнутри.
Если пользователь монтирует файловую систе-
му только для чтения, запрещая проведение всех операций записи в системе,
ядро устанавливает в суперблоке соответствующий флаг. Наконец, ядро помечает
индекс каталога как "точку монтирования", чтобы другие процессы позднее мог-
ли ссылаться на нее.
Разновидности файлов. Обычные файлы. Файлы – каталоги. Специальные файлы. Связывание файлов с разными именами.