Архитектура ОС UNIX
Архитектура ОС UNIX - многоуровневая. На нижнем уровне, непосредственно над оборудованием, работает ядро операционной системы. Функции ядра доступны через интерфейс системных вызовов, образующих второй уровень. На следующем уровне работают командные интерпретаторы, команды и утилиты системного администрирования, коммуникационные драйверы и протоколы, - все то, что обычно относят к системному программному обеспечению. Наконец, внешний уровень образуют прикладные программы пользователя, сетевые и другие коммуникационные службы, СУБД и утилиты.
Атрибуты процесса
Процесс в UNIX имеет ряд атрибутов, позволяющих операционной системе управлять его работой. Основные атрибуты представлены в следующих подразделах.
Цикл for
Цикл for имеет следующий синтаксис:
<цикл for> ::=
for <имя переменной> [in <список слов>] do <команды> done
<список слов> ::=
<слово>{<пробел> <слово>}
<команды> ::=
<команда> {<; или перевод строки> <команда>}
Переменная последовательно получает значение очередного слова из списка, и для этого значения выполняются команды в теле цикла. Цикл завершается, когда пройден весь список слов. По умолчанию в качестве списка слов используются аргументы командной строки.
Рассмотрим пару примеров таких циклов:
$ for i in 1 2 3 4 5 > do > echo $i > done
Обратите внимание, что командный интерпретатор распознает цикл, выдает вторичное приглашение, и выполняет цикл только после его завершения ключевым словом done.
Список слов для цикла обычно порождается динамически. Например, путем раскрытия шаблонов имен файлов:
$ for i in *.c *.h > do > echo $i > diff -b old/$i $i > echo > done | pr -h "diff `pwd`/old `pwd`" | lp & [4] 1430
Можно также порождать его командой, подставляя ее результаты:
$ for i in `pick *.c *.h` > do > echo $i: > diff -b old/$i $i > done | pr | lp
Циклы в командном интерпретаторе
Командный интерпретатор поддерживает циклическую обработку. Чаще всего на практике используется цикл for - цикл по списку слов. Он описан в следующем подразделе.
Обратите внимание, что выделенные полужирным ключевые слова должны быть первым словом команды, т.е. первым словом в строке или идти сразу после точки с запятой.
Действие команды passwd
При использовании для изменения пароля команда passwd запрашивает у обычных пользователей их старый пароль, если он задан. Если с момента задания старого пароля прошло достаточно много времени, passwd затем предлагает пользователю дважды ввести новый пароль; в противном случае программа прекращает работу. Затем passwd проверяет, удовлетворяет ли новый пароль описанным выше правилам построения. При вводе нового пароля второй раз, две копии нового пароля сравниваются. Если они не совпадают, цикл запроса нового пароля повторяется, но не более двух раз.
Пользователь root может изменять любой пароль; команда passwd не запрашивает у него старый пароль.
Доставка и обработка сигнала
Для каждого сигнала в системе определена обработка по умолчанию, которую выполняет ядро, если процесс не указал другого действия. В общем случае возможны действия: завершить выполнение процесса (с созданием образа памяти core и без), игнорировать сигнал, остановить процесс и продолжить процесс.
Следует заметить, что любая обработка сигнала, в том числе и обработка по умолчанию, подразумевает, что процесс выполняется. На системах с высокой загрузкой это может привести к задержкам между отправлением и доставкой сигнала, т.к. процесс не может получить сигнал, пока не будет выбран планировщиком, и ему не будут предоставлены вычислительные ресурсы.
Доставка сигнала происходит после того, как ядро от имени процесса вызывает системную процедуру issig(), которая проверяет, существуют ли ожидающие доставки сигналы, адресованные данному процессу. Процедура issig() вызывается ядром в трех случаях:
Непосредственно перед возвращением из режима ядра в пользовательский режим после обработки системного вызова или прерывания.
Непосредственно перед переходом процесса в состояние сна с приоритетом, допускающим прерывание сигналом.
Сразу же после пробуждения после сна с приоритетом, допускающим прерывание сигналом.
Если процедура issig() обнаруживает ожидание доставки сигнала, ядро вызывает функцию доставки сигнала, которое выполняет действие по умолчанию или вызывает специальную функцию sendsig(), запускающую обработчик сигнала, зарегистрированный процессом. Функция sendsig() возвращает процесс в пользовательский режим, передает управление обработчику сигнала, а затем восстанавливает контекст процесса для продолжения прерванного сигналом выполнения.
Работа с сигналами, связанными с исключительными ситуациями, незначительно отличается от описанной выше. Исключительная ситуация возникает при выполнении процессом определенной инструкции, вызывающей в системе ошибку. Если такое происходит, вызывается системный обработчик исключительной ситуации, и процесс переходит в режим ядра, почти так же, как и при обработке любого другого прерывания. Обработчик отправляет процессу соответствующий сигнал, который доставляется, когда процесс возвращается в пользовательский режим.
В состоянии сна существуют две категории событий, вызвавших состояние сна процесса: допускающие прерывание сигналом и не допускающие такого прерывания. В последнем случае сигнал будет терпеливо ожидать нормального пробуждения процесса.
Другие источники информации
http://catb.org/~esr
Персональная страница Эрика Реймонда. Это один из идеологов разработки свободно распространяемого программного обеспечения. Его работы надо читать как Евангелие...
http://linuxnews.ru
Новости Linux на русском. Полезная документация. Форум
http://www.freebsd.org
Основной сайт ОС FreeBSD
http://docs.sun.com
Документация по ОС Solaris
http://www.gnu.org
Сайт проекта GNU
Файл /etc/group
Этот файл соотносит числовые идентификаторы групп с символьными именами. Каждая строка файла /etc/group
содержит четыре поля. Поля разделяются двоеточиями. Назначение полей этой записи представлено в табл. 2.
Таблица 2. Поля файла /etc/group и их назначение
Поле | Назначение |
Имя группы | Содержит (уникальное) символьное имя группы. |
Пароль группы | Группы могут иметь пароли, хотя использование паролей групп - явление редкое. В примере данное поле пустое - это значит, что пароль отсутствует. |
Идентификатор группы | Содержит числовой идентификатор группы. |
Список пользователей | Содержит список регистрационных имен пользователей данной группы. Имена в этом списке разделяются запятыми. Пользователи могут принадлежать к нескольким группам и, при необходимости, переключаться между ними с помощью команды newgrp. |
Пример записи из файла /etc/group:
bin::2:root,bin,daemon
Файл /etc/passwd
Каждая строка (учетная запись) в файле /etc/passwd описывает одного известного системе пользователя и имеет семь разделенных двоеточиями полей. Пример записи:
user_01:x:169:10:Student:/home/user_01:/bin/sh
Назначение полей этой записи представлено в следующей таблице.
Таблица 1. Поля файла /etc/passwd и их назначение
Поле | Назначение |
Имя пользователя (регистрационное имя) | Содержит символьное имя пользователя, используемое при регистрации в системе. В пределах одной машины должно быть уникальным. Регистрационное имя должно состоять из алфавитно-цифровых символов (нижнего регистра), без пробелов, с максимальной длиной, определяемой конкретной ОС. Наиболее часто используется максимальная длина - восемь символов. Дублирование имен пользователей приводит к определенным осложнениям. Например, дубликаты появляются тогда, когда администратор использует в имени более 8 символов. Тогда для системы jarmstrong то же, что jarmstroff. Когда имя так продублировано, система использует первую найденную для него запись в файле /etc/passwd и игнорирует последующие. |
Пароль | Поле хранит зашифрованный пароль. Допускается пустое поле. При использовании системы теневого хранения паролей, в этом поле находится только метка пароля (x), а зашифрованный пароль хранится в другом месте. Правила задания пароля обычно находятся в файле /etc/default/passwd, (например, директива PASSLENGТH=число в этом файле задает минимальное количество символов в пароле). Некоторые системы также учитывают регистр, а в некоторых предусматривается использование как минимум одного не алфавитно-цифрового символа. |
Идентификатор пользователя | Поле хранит числовой идентификатор пользователя, который связан с его регистрационным именем. Любой созданный пользователем файл или запущенный процесс ассоциируется с его числовым идентификатором. |
Идентификатор группы | Содержит числовой идентификатор группы. Любой созданный пользователем файл ассоциируется с его идентификатором группы. Указанная здесь группа является основной (первичной) для данного пользователя. |
Комментарий | Содержит комментарий - любую алфавитно-цифровую строку. Предположительно это поле содержит информацию о реальном владельце регистрационного имени. ОС UNIX не задает его формат, так что подойдет любой. Некоторые программы печати и электронной почты используют это поле для вывода настоящего имени пользователя. |
Начальный каталог | Определяет начальный каталог пользователя. Когда пользователь начинает сеанс работы, система помещает его в данный каталог. Пользователь должен иметь соответствующие права доступа к нему. |
Начальная команда | Определяет командную среду пользователя (обычно запускается один из командных интерпретаторов UNIX, но, теоретически, можно указать любую команду). Это поле можно изменять. |
Файл /etc/shadow
Этот файл используется в системах с теневым хранением паролей, где они вынесены из доступного всем пользователям на чтение файла /etc/passwd для повышения безопасности системы. Здесь (помимо собственно зашифрованных паролей) хранятся дополнительные ограничения, связанные с регистрационным именем и паролем пользователя. Доступ к этому файлу на чтение имеет только пользователь root, а работают с ним команды passwd и login.
Файл содержит по одной записи из восьми полей, разделенных двоеточиями, для каждой учетной записи в системе. Назначение полей этой записи представлено в табл. 3.
Таблица 3. Поля файла /etc/shadow и их назначение
Номер поля | Назначение |
1 | Имя пользователя. |
2 | Зашифрованный по особому алгоритму (обычно, DES или MD5) пароль. |
3 | Количество дней между 01.01.1970 (началом эры UNIX) и днем последнего изменения пароля. |
4 | Минимальное количество дней между изменениями пароля. |
5 | Срок действия пароля пользователя. |
6 | За сколько дней система будет начинать предупреждать пользователя о необходимости изменения пароля. |
7 | Сколько дней пользователь может не работать в системе, прежде чем его регистрационное имя будет заблокировано. |
8 | Дата, после которой имя пользователя нельзя будет использовать в системе. |
Файлы и каталоги
Операционная система выполняет две основные задачи: манипулирование данными и их хранение. Большинство программ в основном манипулирует данными, но, в конечном счете, они где-нибудь хранятся. В системе UNIX таким местом хранения является файловая система. Более того, в UNIX все устройства, с которыми работает операционная система, также представлены в виде специальных файлов в файловой системе.
Файлы начального запуска командного интерпретатора
Стандартная среда для работы командных интерпретаторов задается в файлах начального запуска, которые автоматически выполняются в начальном интерпретаторе с помощью команды точка (.), т.е. без порождения. Файлы начального запуска размещаются в начальном каталоге пользователя и называются .profile (sh, ksh) или .bash_profile (bash). Переменные, составляющие среду, в файле начального запуска надо экспортировать.
Рассмотрим пример содержимого файла начального запуска:
INFORMIXDIR=/usr/inf.731 INFORMIXSERVER=onarturo7 ONCONFIG=onconfig SQLHOSTS=sqlhosts PATH=$PATH:$INFORMIXDIR/bin LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$INFORMIXDIR/lib/esql:$INFORMIXDIR/lib DB_LOCALE=ru_ru.8859-5 CLIENT_LOCALE=ru_ru.8859-5 KAIOON=1 NODEFDAC=YES DBDATE=DMY4/ DBTIME='%H:%M:%S %d/%m/%Y' DBMONEY=.4 export KAIOON export INFORMIXDIR INFORMIXSERVER LANG PATH ONCONFIG SQLHOSTS export DBDATE DBTIME DBMONEY NODEFDAC export DB_LOCALE CLIENT_LOCALE
FIFO - именованный канал
Этот файл используется для связи между процессами по принципу очереди. Именованные каналы впервые появились в UNIX System V, но большинство современных систем поддерживают этот механизм.
В длинном листинге признаком именованного канала является символ p в первой позиции первого столбца:
[kravchuk@arturo 15:20:46 /tmp]$ find / -type p -print 2>/dev/null /var/spool/lp/fifos/FIFO /etc/cron.d/FIFO /etc/saf/zsmon/_pmpipe /etc/saf/_sacpipe /etc/saf/_cmdpipe /etc/initpipe /etc/utmppipe ^C [kravchuk@arturo 15:22:29 /tmp]$ ls -l /etc/cron.d/FIFO prw------- 1 root root 0 Фев 23 15:41 /etc/cron.d/FIFO
Именованные каналы создаются командой mknod:
mknod имя p
Например:
[kravchuk@arturo 15:27:17 /tmp]$ mknod p1 p [kravchuk@arturo 15:27:18 /tmp]$ ls -l p* >p1 & cat p1 [2] 22380 prw-r--r-- 1 kravchuk 50 0 Мар 26 15:17 p1 -rw-rw-r-- 1 root sys 8296 Фев 23 15:39 ps_data [2]- Done ls -l p* >p1 [kravchuk@arturo 15:27:22 /tmp]$
Физические файловые системы UNIX- основные компоненты
Каждый жесткий диск состоит из одной или нескольких логических частей (групп цилиндров), называемых разделами (partitions). Расположение и размер раздела определяется при форматировании диска. В ОС UNIX разделы выступают в качестве независимых устройств, доступ к которым осуществляется как к различным носителям данных. Обычно в разделе может располагаться только одна физическая файловая система.
Имеется много типов физических файловых систем, например FAT16 и NTFS, с разной структурой. Более того, имеется множество типов физических файловых систем UNIX (ufs, s5fs, ext2, vxfs, jfs, ffs и т.д.). Ниже мы рассмотрим основные их общие особенности.
Физическая файловая система UNIX занимает раздел диска и состоит из таких основных компонентов:
Суперблок (superblock). Содержит общую информацию о файловой системе.
Массив индексных дескрипторов (ilist). Содержит метаданные всех файлов файловой системы. Индексный дескриптор (inode) содержит информацию о статусе файла и указывает на расположение данных этого файла. Ядро обращается к индексному дескриптору по индексу в массиве. Один дескриптор является корневым для физической файловой системы, через него обеспечивается доступ к структуре каталогов и файлов после монтирования файловой системы. Размер массива индексных дескрипторов является фиксированным и задается при создании физической файловой системы.
Блоки хранения данных. Данные обычных файлов и каталогов хранятся в блоках. Обработка файла осуществляется через индексный дескриптор, содержащий ссылки на блоки данных.
Функции в командном интерпретаторе
Стандартным способом разбиения программ на модули в командном интерпретаторе является оформление необходимых действий в виде отдельного выполняемого файла с программой командного интерпретатора- создание новой команды. Тем не менее, для некоторых модулей такой подход может оказаться неэффективным и избыточным, так как модули могут не представлять самостоятельного значения вне программы, в которой они используются. Поэтому в современных версиях командных интерпретаторов предлагается возможность создавать и вызывать функции.
Хронология основных событий в истории ОС UNIX
Ниже в хронологическом порядке представлены наиболее существенные версии и события в истории UNIX вплоть до марта 2004 года, а также некоторая информация о взаимосвязях между ними:
1971
V1. Первая версия UNIX Time-Sharing System на ассемблере для PDP-11/20. Включала файловую систему, системный вызов fork() для порождения процессов, утилиты типа cat, ed, roff. Использовалась для обработки текстов при подготовке патентов. Системный вызов pipe() и поддержка программных каналов появилась в V2.
1973
V4. Версия, переписанная на языке C, что сделало UNIX легко переносимой на другие платформы. Язык C создавался для разработки ОС UNIX.
1974
V5. Появление первых версий в Bell Labs (PWB/UNIX, MERT).
1975
V6. Первая версия UNIX, широко распространенная за пределами Bell Labs, в частности, в университетах. С этого времени начинается появление множества других версий и UNIX становится популярной ОС. На базе этой версии в Калифорнийском университете в Беркли (UCB) создавалась 1.xBSD (для PDP-11).
1978
Версия 2.xBSD (Berkeley Systems Development) для PDP-11, созданная группой Computer Systems Research Group (CSRG) в Беркли. Поддержка сети DARPA, первая реализация стека протоколов TCP/IP. Командный интерпретатор csh. В дальнейших версиях (до 1980): поддержка виртуальной памяти, termcap, curses, редактор vi.
1979
V7. "Последняя настоящая UNIX", включала компилятор языка C, командный интерпретатор sh, систему uucp, была перенесена на 32-разрядный VAX. При этом размер ядра составлял около 40 Кбайт!
1981
4.1BSD: управление заданиями, автоматическое конфигурирование ядра. System III - первый коммерческий UNIX от AT&T, реализация именованных каналов (FIFO).
1982
UNIX начинают использовать создатели рабочих станций: SunOS 1.0 (на базе 4.1BSD) от Sun Microsystems и HP-UX (на базе System III) от Hewlett-Packard.
1983
4.2BSD: полная поддержка TCP/IP, сокетов, Ethernet. Файловая система UFS с поддержкой длинных имен файлов и символьных связей. AT&T System V: поддержка основных утилит и средств BSD, добавлен пакет средств межпроцессного взаимодействия (IPC).
1984
SVR2: функции в командном интерпретаторе sh, первые попытки стандартизации. SCO XENIX - первый коммерческий UNIX на Intel-архитектуре. Создание Free Software Foundation
(FSF) и начало проекта GNU - создание свободно распространяемой UNIX-подобной ОС и соответствующих утилит.
1985
V8 (модули STREAMS). Появление архитектуры микроядра Mach. Реализации стандарта SVR2: SCO XENIX SystemV/286, Interactive 386/ix. Появление ОС Minix.
1986
4.3BSD для VAX. SVR3: модули STREAMS из V8, TLI, поддержка динамически загружаемых библиотек. V9 (дополнения из 4.3BSD). Появление операционных систем AIX (IBM) и A/UX (Apple).
1987
SVR3.2: SCO XENIX SV/386. Появление ОС IRIX (SVR3.0).
1988
4.3BSD Tahoe - 4.3BSD с исходниками. Создание SVR4 на базе System V, BSD и SunOS (X11, NFS, система виртуальной памяти, динамически подключаемые библиотеки). Добавлены: командный интерпретатор ksh, ANSI C, возможности поддержки национальных языков, соответствие стандартам POSIX, X/Open. Появление компьютера NeXT с ОС NeXTSTEP (4.3BSD + Mach 2.0).
1990
4.3BSD Reno: поддержка различных платформ, NFS, SLIP, Kerberos. SUN Solaris 1 (SunOS 4.1.4). Появление OSF/1 от Open Software Foundation: микроядро Mach 2.6 + SVR4, SMP, нити, Motif GUI.
1991
BSD Net2 (4.3BSD Lite) - не содержит спорного кода AT&T. Появление ОС GNU HURD. Появление ОС Linux (на базе Minix). Выделение из AT&T отдельного подразделения USL (Unix System Laboratories), владеющего кодом AT&T UNIX и System V.
1992
4.4BSD: виртуальная память как в Mach 2.5, журнализируемая файловая система UFS. Закрытие CSRG в Беркли. SVR4.2: журнализируемая файловая система Veritas FS, списки контроля доступа ACL, динамически загружаемые модули ядра. USL UnixWare 1 - реализация SVR4.2. SunOS 5 = Solaris 2 (SunOS 4 + SVR4).
1993
Появление ОС FreeBSD. Solaris 2.2. NeXTSTEP 3.2. IRIX 5.3, HP-UX 9.04, AIX 4.0, Linux 0.99, UnixWare 1.1.
1994
OSF 1.3: микроядро Mach 3, поддержка 64-битовых платформ. FreeBSD 2.0, SCO OpenDesktop 3.2.4. UnixWare 1.1.2. Linux 1.0.9. USL куплена компанией Novell.
1995
Появление OpenBSD и NetBSD. Solaris 2.5. Появление Digital UNIX (DEC OSF/1). Появление SCO OpenServer 5.0. UnixWare 2.0: SVR4. 2 MP от Novell. Novell продает UnixWare и весь исходный код AT&T компании SCO. Выход HP-UX 10 (с добавлениями из UnixWare). Завершение работ над A/UX.
1996
FreeBSD 2.1.6. OpenBSD 2.0. IRIX 6.3. Linux 2.0.21. OpenSTEP 4 - завершение проекта NeXTSTEP. SCO UnixWare 2.1. Микроядро Mach 4.
1997
FreeBSD 2.2.5, OpenBSD 2.2, NetBSD 1.3, Solaris 2.6 (под SPARC и Intel), SCO OpenServer 5.0.4. IRIX 6.4. GNU Hurd 0.2 (+ Mach 4). Linux 2.0.28.
1998
FreeBSD 3.0 (+4.4BSD), Solaris 7, DigitalUNIX 4, SCO: OpenServer 5.0.5, UnixWare 7 (SVR5). HP-UX 11.0. Linux 2.0.36. IBM: проект Monterey (AIX 4.3 + SVR5).
1999
FreeBSD 3.4. OpenBSD 2.6, NetBSD 1.4. Появление Mac OS X и проекта Darwin (Mach 4 + FreeBSD 3.1). Solaris 8 beta. Компанию DEC купил Compaq: Tru64 Unix V.5.0. (DigitalUNIX). IRIX 6.5.6. SCO: OpenServer 5.0.5a, UnixWare 7.1.1. AIX 4.3.3. Linux 2.2.13.
2000
FreeBSD 4.0-4.2. OpenBSD 2.8. NetBSD 1.5. Solaris 8. Apple: Mac OS X Server, Darwin 1.2.1. Tru64 Unix V.5.1. IRIX 6.5.10. SCO: OpenServer 5.0.6. Компания SCO продала все свои ОС компании Caldera (Caldera OpenLinux). Hurd A1, Linux 2.4.0, 2.2.18. HP-UX 11i. AIX 5L alpha (проект Monterey).
2001
FreeBSD 4.4. OpenBSD 3.0. NetBSD 1.5.2. Mac OS X 10.1.2. SUN: Solaris 8 10/01, Solaris 9 alpha (не для Intel-архитектуры). Tru64 Unix V.5.1A, IRIX 6.5.13. SCO OpenServer 5.0.6a. Hurd h3. Caldera: OpenUNIX 8: UnixWare 7.1.1 + LKP=Linux 2.4.0 - прозрачная поддержка Linux-приложений. Linux 2.4.17, 2.0.39, 2.2.20. AIX 5L v.5.1.
2002
FreeBSD 4.7. OpenBSD 3.2. NetBSD 1.6. Mac OS X 10.2 (Jaguar). Darwin 6.2. SUN: Solaris 8 12/02, Solaris 9 OE. QNX 6.2. IRIX 6.5.18. Debian GNU/Hurd J2. SCO: UnixWare 7.1.3 (в продолжение OpenUNIX 8. Caldera снова стала SCO...). Linux (влияние IRIX и AIX, в частности, файловые системы): 2.5.2-2.5.52- экспериментальное ядро. 2.4.20, 2.2.23. HP-UX 11i v1.6. AIX 5L v.5.2.
2003
FreeBSD 5.1, FreeBSD 4.9. OpenBSD 3.4. NetBSD 1.6.1. Mac OS X 10.3.2. Darwin 6.6-7.2. SUN: Solaris 9 OE 12/03, Solaris 9 x86 PE, Solaris 10 Preview. QNX 6.2.1. IRIX 6.5.22. Debian GNU/Hurd K5. Tru64 Unix V5.1B-1. SCO: UnixWare 7.1.3/OKP (OpenServer Kernel Personality), OpenServer 5.0.7. Linux: 2.6.0, 2.4.23, 2.2.25. HP-UX 11i v2 ( в том числе, для Intel Itanium).
2004
FreeBSD 5.2. NetBSD 1.6.2. Solaris 10 Software Express 02/04. IRIX 6.5.23. Linux: 2.6.3, 2.4.25, 2.2.26, 2.0.40.
Ожидается:
дальнейшее развитиие ветки Linux 2.6 и обновления по старым веткам ядер (2.0, 2.2, 2.4);
Solaris 10 (вышла);
последовательное развитиие FreeBSD, OpenBSD, NetBSD, других веток BSD.
дальнейшее развитие Mac OS X и Darwin;
дальнейшее последовательное развитие IRIX.
Идентификатор процесса (PID)
Каждый процесс имеет уникальный идентификатор PID, позволяющий ядру системы различать процессы. Когда создается новый процесс, ядро присваивает ему следующий свободный (т.е. не ассоциированный ни с каким процессом) идентификатор. Присвоение идентификатора обычно происходит по возрастающий, т.е. идентификатор нового процесса больше, чем идентификатор процесса, созданного перед ним. Если идентификатор достигает максимального значения (обычно - 65737), следующий процесс получит минимальный свободный PID и цикл повторяется. Когда процесс завершает работу, ядро освобождает использовавшийся им идентификатор.
Идентификатор родительского процесса (PPID)
Идентификатор процесса, породившего данный процесс. Все процессы в системе, кроме системных процессов и процесса init, являющегося прародителем остальных процессов, порождены одним из существующих или существовавших ранее процессов.
Имена файлов в ОС UNIX
В ОС UNIX поддерживается три способа указания имен файлов:
Краткое имя. Имя, не содержащее специальных метасимволов косая черта (/), является кратким именем файла. По краткому имени можно сослаться на файлы текущего каталога. Например, команда ls -l .profile требует получить полную информацию о файле .profile в текущем каталоге.
Относительное имя. Имя, не начинающееся с символа косой черты (/), но включающее такие символы. Оно ссылается на файл относительно текущего каталога. При этом для ссылки на файл или каталог в каком-то другом каталоге используется метасимвол косой черты (/). Например, команда ls -l ../.profile требует получить полную информацию о файле .profile в родительском каталоге текущего каталога, а команда vi doc/text.txt требует открыть в редакторе vi файл text.txt в подкаталоге doc текущего каталога.
Полное имя. Имя, начинающееся с символа косой черты (/). Оно ссылается на файл относительно корневого каталога. Это имя еще называют абсолютным, так как оно, в отличие от предыдущих способов задания имени, ссылается на один и тот же файл независимо от текущего каталога. Например, команда ls -l /home/user01/.profile требует получить полную информацию о файле .profile в каталоге /home/user01 независимо от того, в каком каталоге выполняется.
Другие символы, кроме косой черты, не имеют в именах файлов UNIX особого значения (это не метасимволы). В частности, нет системного понятия расширения файла.
В ОС UNIX нет теоретических ограничений на количество вложенных каталогов. Тем не менее, в каждой реализации имеются практические ограничения на максимальную длину имени файла, которое указывается в командах (как и на длину командной строки в целом). Оно задается константой PATH_MAX в заголовочном файле /usr/include/limits.h. Так, в ОС Solaris 8 имя файла не может быть длиннее 1024 символов.
Индексные дескрипторы
Индексный дескриптор, или inode, содержит информацию о файле, необходимую для обработки данных, т.е. метаданные файла. Каждый файл ассоциирован с одним индексным дескриптором, хотя может иметь несколько имен (жестких связей) в файловой системе, каждое из которых указывает на один и тот же индексный дескриптор.
Индексный дескриптор не содержит:
имени файла, которое содержится в блоках хранения данных каталога;
содержимого файла, которое размещено в блоках хранения данных.
Индексный дескриптор содержит:
номер;
тип файла;
права доступа к файлу;
количество связей (ссылок на файл в каталогах) файла;
идентификатор пользователя и группы-владельца;
размер файла в байтах;
время последнего доступа к файлу;
время последнего изменения файла;
время последнего изменения индексного дескриптора файла;
указатели на блоки данных файла (обычно 10);
указатели на косвенные блоки (обычно 3).
Размер индексного дескриптора обычно составляет 128 байтов.
Индексный дескриптор содержит информацию о расположении данных файла. Поскольку дисковые блоки хранения данных, в общем случае, располагаются не последовательно, индексный дескриптор должен хранить физические адреса всех блоков, принадлежащих данному файлу.
Каждый дескриптор содержит 13 указателей. Первые 10 указателей непосредственно ссылаются на блоки данных файла. Если файл большего размера - 11-ый указатель ссылается на первый косвенный блок (indirection block) из 128 (256) ссылок на блоки данных. Если и этого недостаточно, 12-ый указатель ссылается на дважды косвенный блок, содержащий 128 (256) ссылок на косвенные блоки. Наконец последний, 13-ый указатель ссылается на трижды косвенный блок из 128 (256) ссылок на дважды косвенные блоки. Количество элементов в косвенном блоке зависит от его размера.
Поддерживая множественные уровни косвенности, индексные дескрипторы позволяют отслеживать огромные файлы, не растрачивая дисковое пространство для небольших файлов.
История UNIX
http://www.levenez.com/unix/
Генеалогическое дерево версий UNIX вплоть до настоящего времени.
http://www.faqs.org/faqs/unix-faq/faq/part6/
http://www.crackmonkey.org/unix.html
http://catb.org/~esr
Персональная страница Эрика Реймонда. Обратите внимание на его новую книгу "The Art of UNIX Programming"!
История, версии и основные характеристики ОС UNIX
История ОС UNIX началась в 1969 году в одном из подразделений AT&T Bell Laboratories, когда на "малоиспользуемой" машине DEC PDP-7 Кен Томпсон (Ken Thompson), Деннис Ричи (Dennis Ritchie) и другие (прежде занимавшиеся созданием ОС Multics) начали работу над операционной системой, названной ими первоначально Unics (UNiplexed Information and Computing System). В течение первых 10 лет развитие UNIX происходило, в основном, в Bell Labs. Соответствующие начальные версии назывались "Version n" (Vn) и предназначались для ЭВМ DEC PDP-11 (16-битовая) и VAX (32-битовая).
Версии Vn разрабатывались группой Computer Research Group (CRG) в Bell Labs. Поддержкой занималась другая группа, Unix System Group (USG). Разработкой также занималась группа Programmer's WorkBench (PWB), привнесшая систему управления исходным кодом sccs, именованные каналы и ряд других идей. В 1983 году эти группы были объединены в одну, Unix System Development Lab.
Изменение действующего идентификатора пользователя
Команда su предназначена для временного изменения действующего (эффективного) идентификатора пользователя и сеанса пользователя. Она имеет следующий синтаксис:
su [-] [регистрационное_имя [аргументы ...]
Команда su запрашивает пароль (у всех пользователей, кроме root, и если пароль существует). В случае соответствия пароля создается новый сеанс от имени нового пользователя. В следующем примере сохраняется среда пользователя с именем user01, включая текущий рабочий каталог и переменные среды:
$ logname user01 $ su informix Password: $ logname user01 $ echo $LOGNAME user01 $ set HOME=/home/user01 LOGNAME=user01 MAIL=/var/mail/user01 PWD=/home/user01 ... $ exit $
Если введена команда su - регистрационное_имя, то система предоставляет пользователю командный интерпретатор и среду в соответствии с указанным регистрационным именем:
$ logname user01 $ su - informix Password: $ logname user01 $ echo $LOGNAME informix $ set HOME=/home3/informix LOGNAME=informix MAILPATH=/usr/mail/informix PWD=/home3/informix ... $ exit $
Команда в формате su регистрационное_имя -c аргументы воспринимает аргумент как команду, которую необходимо выполнить с регистрационным именем нового пользователя. Для выполнения команды запрашивается пароль нового пользователя и используются его права доступа. После завершения выполнения происходит возврат в среду пользователя, вызвавшего команду su. Таким образом, если пользователю, например, надо удалить файл пользователя с регистрационным именем new_user, необходимо выполнить команду:
$ su new_user -c "rm file" Password: $
Команда su без указания регистрационного имени позволяет получить права пользователя root. При этом необходимо знать и правильно ввести пароль пользователя root. Если пользователь работает под регистрационным именем root, вводить пароль при изменении действующего идентификатора не нужно.
Изменение действующего идентификатора группы
Сразу после регистрации пользователь работает от имени основной группы (задана в файле /etc/passwd). Кроме основной, пользователь может принадлежать к любому количеству дополнительных групп. Эти группы задаются путем указания регистрационного имени в четвертом поле строки в файле /etc/group, описывающей дополнительную группу. Членство в дополнительных группах либо учитывается при определении прав доступа автоматически (BSD-системы), либо для перехода в дополнительную группу и изменения тем самым действующего идентификатора группы используется команда newgrp (SVR4) со следующим синтаксисом:
/usr/bin/newgrp [ группа ]
Команда newgrp встроена в некоторые командные интерпретаторы (sh, ksh).
Команда newgrp переводит пользователя в новую группу путем запуска нового командного интерпретатора с реальным и эффективным идентификатором (GID) новой группы. При этом новый командный интерпретатор запускается даже если переход в группу завершился ошибкой (например, указана несуществующая группа). Естественно, в новом командном интерпретаторе будут иметь нестандартные и непустые значения только переменные, экспортированные в среду.
При вызове без операнда, команда newgrp переводит пользователя в его основную группу, отменяя тем самым действие предыдущих команд newgrp.
Если во втором поле записи соответствующей группы в файле /etc/group указан пароль (т.е. если это поле не пустое) и пользователь не указан в четвертом поле как член группы, при переходе в группу у пользователя запрашивается пароль. Единственный способ создать пароль группы - воспользоваться командой passwd для задания пароля одной из учетных записей пользователей, а затем скопировать зашифрованный пароль из файла /etc/shadow в файл /etc/group. Пароли групп сейчас используют редко.
Изменение пароля и характеристик учетной записи, связанных с регистрацией
Команда passwd позволяет любому пользователю изменить пароль или получить список атрибутов текущего пароля для своего регистрационного_имени. Привилегированные пользователи могут запускать passwd для выполнения этих функций для любого пользователя, а также для установки атрибутов пароля для любого пользователя.
Пароль обычно задается администратором при создании учетной записи пользователя для владельца регистрационного_имени. В дальнейшем пользователь может изменить пароль с помощью команды passwd.
Команда passwd имеет следующий синтаксис:
passwd [регистрационное_имя]
passwd [-l|-d][-f][-x max][-n min][-w warn] регистрационное_имя
passwd -s [-a]
passwd -s [регистрационное_имя]
Опции команды представлены в табл. 5. Обычные пользователи могут использовать только опцию -s.
Таблица 5. Опции команды passwd
Опция | Назначение |
-s | Показывает атрибуты пароля для регистрационного_имени пользователя. Любой пользователь может задавать данную опцию. |
-l | Блокирует запись пароля для регистрационного_имени. |
-d | Удаляет пароль для регистрационного_имени, так что у пользователя с этим регистрационным_именем пароль не запрашивается. |
-f | Заставляет пользователя изменить пароль при следующей регистрации в системе, делая пароль для регистрационного_имени устаревшим. |
-x max | Задает для пользователя с указанным регистрационным_именем количество дней, в течение которых пароль будет действителен. |
-n min | Задает минимальное количество дней между изменениями пароля для пользователя с указанным регистрационным_именем. Всегда используйте эту опцию с опцией -x, если только max не установлен в -1 (устаревание отключено). В этом случае, min устанавливать не нужно. |
-w warn | Задает, за сколько дней (относительно max) пользователя с данным регистрационным_именем будут предупреждать о предстоящем устаревании пароля. |
-s -a | Показывает атрибуты паролей для всех пользователей. |
Изменение прав доступа к файлу
Для установки (изменения) прав доступа к файлу используется команда chmod. Она имеет следующий синтаксис:
chmod [ -fR ] абсолютные_права файл ...
chmod [ -fR ] символьное_изменение_прав файл ...
Команда chmod устанавливает права доступа к указанным файлам. Права доступа к файлу может изменять или устанавливать только его владелец или пользователь root. Опция -f означает, что команда не будет сообщать о невозможности установки прав доступа. Опция -R означает, что заданное изменение прав доступа будет применяться рекурсивно для всех подкаталогов, указанных в списке файлов.
Абсолютные права доступа задаются восьмеричным числом, расчет которого (в соответствии с ) описан в предыдущем разделе. Описанию синтаксиса, используемого для задания символьного изменения прав доступа, посвящен следующий подраздел.
Изменение принадлежности файла
Владелец файла, а также пользователь root может изменять владельца и группу-владельца файла. Для изменения владельца (и группы-владельца) файла используется команда chown со следующим синтаксисом:
chown [-h][-R] владелец[:группа] файл ...
Опция -h требует изменять владельца файла, на который указывает символическая связь, а не самой связи, как происходит по умолчанию. Опция -R требует рекурсивно изменить владельца во всех подкаталогах.
Для изменения только группы, владеющей файлом, используется команда chgrp:
chgrp [-h][-R] группа файл ...
Ее опции аналогичны команде chown.
Учтите, что после передачи файла другому владельцу, первоначальный владелец перестает им обладать, и будет иметь права доступа, установленные новым владельцем.
Рассмотрим простой пример:
$ ls -l total 2 -rw-r--r-- 1 user01 others 6 Dec 10 16:19 testfile $ chown informix testfile $ ls -l total 2 -rw-r--r-- 1 informix others 6 Dec 10 16:19 testfile $ logname user01 $ chown user01 testfile UX:chown: ERROR: testfile: Not privileged
Изменение текущего каталога
Для изменения текущего каталога используется команда cd:
cd [каталог]
Если каталог не указан, используется значение переменной среды $HOME (обычно это начальный каталог пользователя). Чтобы сделать новый каталог текущим (войти в каталог), нужно иметь для него право на выполнение. Команда cd является встроенной командой интерпретатора и использует для изменения текущего каталога соответствующий системный вызов.
Рассмотрим пример совместного использования команд cd и pwd для переходов по каталогам файловой системы:
$ pwd /home/user01 $ cd .. $ pwd /home $ cd user01/tmp $ pwd /home/user/tmp $ cd $ pwd /home/user01
Экспортирование переменных в среду
Каждый экземпляр командного интерпретатора имеет свой набор переменных, размещаемых в отдельной области памяти. Если необходимо, чтобы определенная переменная в порожденных процессах имела конкретное значение, необходимо экспортировать ее в среду. Такая переменная называется переменной среды.
Для всех экспортированных переменных при запуске порожденного процесса создаются их локальные копии с теми же значениями. Рассмотрим пример:
$ x=Hello $ export x $ PS1='new$ ' sh new$ echo $x Hello new$ x='Good Bye' new$ echo $x Good Bye new$ exit $ $ echo $x Hello$
Изменение значение переменной в порожденном интерпретаторе не влияет на ее значение в родительском интерпретаторе.
Для просмотра значений всех переменных среды предназначена команда env.
Каталог
С помощью каталогов формируется логическое дерево файловой системы. Каталог - это файл, содержащий имена находящихся в нем файлов, а также указатели на дополнительную информацию - метаданные, позволяющие операционной системе производить действия с этими файлами. Каталоги определяют положение файла в дереве файловой системы. Любой процесс, имеющий право на чтение каталога, может прочесть его содержимое, но только ядро имеет право на запись данных каталога.
В длинном листинге признаком каталога является символ d в первой позиции первого столбца:
drwxr-xr-x 2 informix informix 115 Фев 24 13:05 txt
Каталоги создаются командой mkdir:
mkdir каталог ...
Команда expr
Одной из стандартных программ-калькуляторов является программа expr. Ее основные операторы представлены в табл. 27.
Таблица 27. Основные операторы, распознаваемые командой expr
Оператор | Результат |
выр1 \| выр2 | Возвращает значение первого выражения, если оно не пустое и не равно 0, иначе, возвращает значение второго выражения. |
выр1 \& выр2 | Возвращает значение первого выражения, если оба выражения - не пустые и не равны 0, иначе, возвращает 0. |
выр1 { +, - } выр2 | Складывает или вычитает целочисленные аргументы. |
выр1 { \*, /, % } выр2 | Умножает, делит или возвращает остаток от деления для целочисленных аргументов. |
length строка | Возвращает длину строки. |
Рассмотрим простой пример вычисления с помощью expr:
$ a=5 $ echo $a 5 $ a=`expr $a \* $a + 34 / 2` $ echo $a 42
Обратите внимание, что между элементами выражения надо указывать пробелы.
Команда ожидания завершения процесса
Это последняя существенная команда управления заданиями. При вводе wait
приостанавливается работа командного интерпретатора до тех пор, пока не будут завершены все фоновые задания. Сюда входят и любые остановленные задания, поэтому при вводе wait
стоит убедиться, что все фоновые задания работают. Команда wait может также принимать в качестве параметра номер задания. В этом случае командный интерпретатор приостанавливается до тех пор, пока не завершится выполнение указанного задания.
Командный интерпретатор
Пользователь ОС UNIX общается с системой через командный интерпретатор (shell). Через него происходит доступ к командам, файловой системе и другим функциям ядра UNIX. Это обычная программа (т.е. не входит в ядро операционной системы UNIX). Ее можно заменить другой или использовать несколько разных версий. Наиболее известны следующие версии:
sh
Классический интерпретатор версии UNIX V7, иначе называемый по фамилии автора Bourne shell.
ksh
Интерпретатор Korn shell, дополняющий классический shell возможностями работы с заданиями пользователя, историей работы и позволяющий редактировать командную строку при помощи команд, аналогичных vi. Является фактически стандартом для POSIX-совместимых систем, в частности, UNIX System V.
csh
Стандартный интерпретатор BSD UNIX и производных от него систем. Отличается улучшенными диалоговыми возможностями, способом присваивания и экспортирования переменных в среду, управляющими конструкциями и рядом других моментов; тоже поддерживает историю и редактирование командной строки. Главное и, по моему мнению, отрицательное его отличие от других интерпретаторов,- это свои управляющие конструкции, не совпадающие с sh.
bash
Свободно распространяемый в виде исходных текстов интерпретатор, называемый "Bourne another shell", объединяющий все лучшее из остальных интерпретаторов с удобными возможностями редактирования командной строки и работы с историей команд. В настоящее время - фактический стандарт.
В рамках этого курса мы будем рассматривать, в основном, средства, не выходящие за пределы возможностей командных интерпретаторов sh и ksh (в классической версии 1988 года).
Контекст процесса
Каждый процесс UNIX имеет контекст, под которым понимается вся информация, требуемая для описания процесса. Эта информация сохраняется, когда выполнение процесса приостанавливается, и восстанавливается, когда планировщик предоставляет процессу вычислительные ресурсы.
Контекст процесса в ОС UNIX состоит из нескольких частей:
Адресное пространство процесса в пользовательском режиме
Сюда входят код, данные и стек процесса, а также другие области, например, разделяемая память или код и данные динамических библиотек.
Управляющая информация
Ядро использует две основные структуры для управления процессом - proc и user. Сюда же входят данные, необходимые для отображения виртуального адресного пространства процесса в физическую память.
Среда процесса
Переменные среды процесса, значения которых задаются в командном интерпретаторе или в самом процессе с помощью системных вызовов, а также наследуются порожденным процессом от родительского и обычно хранятся в нижней части стека. Среду процесса можно получать или изменять с помощью функций.
Аппаратный контекст
Сюда входят значения общих и ряда системных регистров процессора, в частности, указатель текущей инструкции и указатель стека (см. ).
Переключение между процессами, необходимое для распределения вычислительного ресурса, по существу, выражается в переключении контекста, когда контекст выполнявшегося процесса запоминается, а восстанавливается контекст процесса, выбранного планировщиком. Переключение процесса является достаточно ресурсоемкой операцией. Помимо сохранения состояния регистров процесса, ядро вынуждено выполнить множество других действий.
Контекст переключается в четырех случаях:
Текущий процесс переходит в состояние сна, ожидая недоступного ресурса.
Текущий процесс завершает свое выполнение.
Если после пересчета приоритетов в очереди на выполнение есть более высокоприоритетный процесс.
Происходит пробуждение более высокоприоритетного процесса.
Первые два случая соответствуют добровольному переключению контекста и действия ядра при этом достаточно просты. Ядро вызывает процедуру переключения контекста из функций sleep или exit.
Третий и четвертый случаи переключения контекста происходят не по воле процесса, который в это время выполняется в режиме ядра и поэтому не может быть немедленно приостановлен. В этой ситуации ядро устанавливает специальный флаг runrun, который указывает, что в очереди находится более высокоприоритетный процесс, требующий предоставления вычислительных ресурсов. Перед переходом процесса из режима ядра в режим задачи ядро проверяет этот флаг и, если он установлен, вызывает функцию переключения контекста.
Копирование файлов
Команда cp копирует исходный файл в целевой файл или каталог. Она имеет следующий синтаксис:
cp [-p] исходный целевой
cp [-r] [-p] исходный... каталог
Исходный файл не должен совпадать с целевым. Если целевой файл является каталогом, то исходные файлы копируются в него под теми же именами. Только в этом случае можно указывать несколько исходных файлов. Если целевой файл существует и не является каталогом, его старое содержимое теряется. Права доступа, владелец и группа целевого файла при этом не меняются.
Если целевой файл не существует или является каталогом, новые файлы создаются с теми же правами доступа, что и исходные. Время последнего изменения целевого файла (последнего доступа, если он не существовал), а также время последнего доступа к исходным файлам устанавливается равным времени копирования. Если целевой файл был связью на другой файл, все связи сохраняются, а содержимое файла изменяется.
Команда cp поддерживает следующие основные опции:
-р
сохраняет информацию о владельце, по возможности - права доступа и времена доступа для нового файла;
-r
копирует рекурсивно, включая подкаталоги.
Два дефиса (--) позволяют явно указать конец опций командной строки, что дает возможность команде cp работать с именами файлов, начинающимися с дефиса (-). Если в одной командной строке указаны -- и -, второй дефис будет интерпретироваться как имя файла.
Рассмотрим ряд простых примеров копирования. Вот как, независимо от типа, копируется в каталог несколько файлов:
[kravchuk@arturo 16:53:35 /tmp]$ mkdir d1 [kravchuk@arturo 16:53:37 /tmp]$ rm f* [kravchuk@arturo 16:54:08 /tmp]$ ls >f1.txt [kravchuk@arturo 16:54:24 /tmp]$ ln f1.txt f2.txt [kravchuk@arturo 16:54:39 /tmp]$ ln -s f1.txt f3.txt [kravchuk@arturo 16:54:45 /tmp]$ cp f1.txt f2.txt f3.txt d1 [kravchuk@arturo 16:54:58 /tmp]$ ls -l d1 total 24 -rw-r--r-- 1 kravchuk 50 639 Мар 26 16:54 f1.txt -rw-r--r-- 1 kravchuk 50 639 Мар 26 16:54 f2.txt -rw-r--r-- 1 kravchuk 50 639 Мар 26 16:54 f3.txt
Вот пример обычного копирования файлов "один в один":
[kravchuk@arturo 16:55:22 /tmp]$ cp f1.txt f5.txt [kravchuk@arturo 16:55:29 /tmp]$ ls -l f*.txt -rw-r--r-- 2 kravchuk 50 639 Мар 26 16:54 f1.txt -rw-r--r-- 2 kravchuk 50 639 Мар 26 16:54 f2.txt lrwxrwxrwx 1 kravchuk 50 6 Мар 26 16:54 f3.txt -> f1.txt -rw-r--r-- 1 kravchuk 50 639 Мар 26 16:55 f5.txt
Рекурсивное копирование:
[kravchuk@arturo 16:55:34 /tmp]$ cp -r d1 d2 [kravchuk@arturo 16:56:47 /tmp]$ ls -l d2 total 24 -rw-r--r-- 1 kravchuk 50 639 Мар 26 16:56 f1.txt -rw-r--r-- 1 kravchuk 50 639 Мар 26 16:56 f2.txt -rw-r--r-- 1 kravchuk 50 639 Мар 26 16:56 f3.txt
Копирование файлов, имена которых начинаются с дефиса:
[kravchuk@arturo 16:56:50 /tmp]$ ls > -1 [kravchuk@arturo 16:58:44 /tmp]$ cp -1 1.txt cp: illegal option -- 1 cp: Insufficient arguments (1) Usage: cp [-f] [-i] [-p] f1 f2 cp [-f] [-i] [-p] f1 ... fn d1 cp -r|R [-f] [-i] [-p] d1 ... dn-1 dn [kravchuk@arturo 16:58:48 /tmp]$ cp -- -1 1.txt [kravchuk@arturo 16:58:53 /tmp]$ ls -l ?.txt -rw-r--r-- 1 kravchuk 50 666 Мар 26 16:58 1.txt
Литература
Керниган Б.В., Пайк Р. "UNIX - универсальная среда программирования" -М.: Финансы и статистика, 1992. - 304 с.
Дегтярев Е.К. "Введение в UNIX" - М.; МП "Память", 1991. - 96 с.
Топхем Д., Чыонг Х.В. "Юникс и Ксеникс" -М.: Мир, 1988. - 392 с.
Кэвин Р., Фостер-Джонсон Э. "UNIX: справочник" -СПб: Питер Ком, 1999. - 384 с.
Немет Э., Снайдер Г., Сибиасс С., Хейн Т.Р. "UNIX: руководство системного администратора" -К.: BHV, 1997 - 832 с.
Робачевский А.М. "Операционная система UNIX" -СПб.: БХВ - Санкт-Петербург, 1999. - 528 с., ил.
Дайсон П. "Операционная система UNIX. Настольный справочник" -М.: ЛОРИ, 1997. - 400 с.
Беляков М.И., Рабовер Ю.И., Фридман А.Л. "Мобильная операционная система: Справочник" - М.: Радио и связь, 1991. - 208 с.
Анонимный автор. "Максимальная безопасность в Linux" -К: Издательство "ДиаСофт", 2000, - 400 с.
Шенк Т. "Red Hat Linux для системных администраторов. Энциклопедия пользователя" -К: Издательство "ДиаСофт", 2001, - 672 с.
Эбен М., Таймэн Б. "FreeBSD. Энциклопедия пользователя" -К: ООО "ТИД "ДС", 2002, - 736 с.
Примечание
К переводу последних трех книг на русский я имел непосредственное отношение как переводчик и научный редактор.
Логическая файловая система- основные каталоги и их назначение
Использование общепринятых имен основных файлов и структуры каталогов существенно облегчает работу в операционной системе, ее администрирование и повышает переносимость. Типичная структура и назначение каталогов файловой системы UNIX представлена в табл. 13.
Таблица 13. Основные каталоги логической файловой системы UNIX
Каталог | Назначение и содержание |
/ | Корневой каталог. Является основой любой файловой системы UNIX. Все остальные каталоги и файлы располагаются в рамках структуры, порожденной корневым каталогом (в нем и в его подкаталогах), независимо от их физического местонахождения. Для корневого каталога обязательно должна создаваться отдельная физическая файловая система, а сам он является точкой ее монтирования, о чем свидетельствует наличие подкаталога lost+found. |
/bin | Пользовательские выполняемые программы. Сейчас обычно является символической связью, указывающей на /usr/bin. |
/dev | Каталог для специальных файлов устройств. Может иметь подкаталоги для различных классов и типов устройств, например, dsk, rdsk, rmt, inet (в SVR4). |
/etc | Каталог для конфигурационных файлов. Может иметь подкаталоги для различных компонентов и служб. Конфигурационные файлы в UNIX - обычные текстовые. |
/home | Каталог для размещения начальных каталогов пользователей. Часто является точкой монтирования отдельной физической файловой системы. |
/lib | Каталог для библиотек. Сейчас обычно является символической связью, указывающей на /usr/lib. |
/lost+found | Подкаталог, имеющийся в каждом каталоге, являющемся точкой монтирования физической файловой системы на диске. Корневой каталог всегда представлен отдельной физической файловой системой, должен быть всегда доступен, и монтируется автоматически при запуске системы. Все остальные физические файловые системы формально не нужны для функционирования ОС UNIX. |
/mnt | Точка монтирования для файловых систем на съемных носителях или дополнительных дисках. Может содержать подкаталоги для отдельных типов носителей, например, cdrom или floppy. Может юыть пустым. |
/opt | Каталог для дополнительного коммерческого программного обеспечения. Может быть пустым или отсутствовать (в BSD-системах). |
/proc | Каталог псевдо-файловой системы, представляющей в виде каталогов и файлов информацию о ядре, памяти и процессах, работающих в системе. |
/sbin | Каталог для системных выполняемых программ, необходимых для решения задач системного администрирования. |
/tmp | Каталог для временных файлов. Имеет установленный клейкий бит и доступен для записи и чтения всем пользователям. Обычно создается в виде отдельной физической файловой системы, в том числе, в виртуальной памяти. |
/usr | В этом каталоге находятся выполняемые программы, библиотеки, заголовочные файлы, справочные руководства (/usr/share/man), исходные тексты ядра и утилит системы (Linux), растущие файлы и очереди печати (/usr/spool в BSD-системах) и т.д. Часто каталог является точкой монтирования отдельной физической файловой системы. Ниже представлены основные его подкаталоги. |
/usr/bin | Основные выполняемые программы и утилиты. |
/usr/include | Заголовочные файлы библиотек. Может содержать подкаталоги. |
/usr/lib | Статически и динамически компонуемые библиотеки. Может содержать подкаталоги. |
/usr/local | Каталог для дополнительного свободно распространяемого программного обеспечения (GNU). Содержит структуру подкаталогов, аналогичную корневому каталогу (bin, etc, include, lib и т.д.). |
/var | В UNIX System V и Linux этот каталог является заменителем каталога (/usr/spool), используемого для хранения растущих файлов различных сервисных подсистем, например, файлов журналов системы. Так, основной журнал системы, ведущийся демоном syslogd, размещается в виде нескольких файлов в подкаталоге /var/adm. Там же, в файле /var/adm/messages, сохраняются сообщения времени загрузки. Имеет смысл создавать отдельную физическую файловую систему для размещения этого каталога (и, возможно, его подкаталога /var/run). |
Наличие, назначение и использование других каталогов верхнего уровня и подкаталогов зависит от версии ОС UNIX, установленного системного и прикладного программного обеспечения и конфигурации системы, созданной администратором.
Метасимволы командного интерпретатора
Ряд символов, как было описано выше, имеют для командного интерпретатора специальное значение - это метасимволы. Они описаны в табл. 23.
Метасимволы не входят в команды и обрабатываются в несколько проходов до начала выполнения реальных программ.
Таблица 23. Метасимволы командного интерпретатора
Метасимвол | Интерпретация |
> | prog>file - переключить стандартный выходной поток в файл |
>> | prog>>file - добавить стандартный выходной поток к файлу |
< | prog<file - извлечь стандартный входной поток из файла |
| | p1 | p2 - передать стандартный выходной поток p1 как стандартный входной поток p2 |
<<str | "Документ здесь": стандартный входной поток задается в последующих строках до строки, состоящей только из символов str. По умолчанию в данных интерпретируются метасимволы \, $ и ``. Если необходимо предотвратить в данных интерпретацию всех метасимволов, необходимо экранировать строку str, предварив обратной косой или взяв в двойные или одиночные кавычки. |
* | Задает в имени файла любую строку из нуля или более символов |
? | Задает любой символ в имени файла |
[abc] | Задает любой символ из [abc] в имени файла, при этом допускаются диапазоны, задаваемые при помощи дефиса -. Если первым символом после [ является !, с этой конструкцией сопоставляется любой символ, не входящий в квадратные скобки. |
; | Разделитель команд: p1; p2 - выполнить p1, затем p2. |
&
Выполняет предшествующую команду в фоновом режиме | |
`...` | Инициирует выполнение команд(ы) в ...; `...` заменяется на полученный в результате выполнения стандартный выходной поток |
(...) | Инициирует выполнение команд(ы) ... в порожденном командном интерпретаторе |
$1,$2,...$9 | Заменяются аргументами командного файла |
$var | Значение переменной (ключевого параметра) var в сеансе |
${var} | Значение var: исключает коллизии в случае конкатенации переменной с последующим текстом |
\ | \c - использовать непосредственно символ c, \перевод строки- отбрасывается |
'...' | Непосредственное использование того, что в кавычках |
"..." | Непосредственное использование, но после того, как будут интерпретированы метасимволы $, `...` и \ |
# | Начало комментария |
var=value | Присваивает значение value переменной var |
p1&&p2
Выполнить p1; в случае успеха выполнить p2 | |
p1p2 | Выполнить p1; в случае неудачи выполнить p2 |
Примечание
Большинство метасимволов будет рассматривается по ходу изложения. Здесь мы остановимся на тех из них, которые используются для генерации имен файлов и экранирования.
Перед выполнением команды каждое слово-аргумент команды просматривается в поисках метасимволов *, ? и [. Если в слове есть один из этих символов, слово рассматривается как шаблон (обратите внимание на синтаксические отличия от шаблонов ed). Такое слово заменяется отсортированными в алфавитном порядке именами файлов, соответствующих шаблону. Если ни одно их имен файлов не соответствует шаблону, слово оставляется без изменений. Символ . в начале имени файла или сразу после /, а также сам символ /, должны сопоставляться явно.
При таком количестве метасимволов интерпретатора необходимо иметь возможность экранировать специальный символ от интерпретации. Для этого можно использовать апострофы, кавычки или обратную косую. При этом кавычки одного вида могут экранировать кавычки другого вида. Обратите внимание, что кавычки "", в отличие от апострофов, не экранируют строку полностью - интерпретатор заглядывает внутрь кавычек в поисках $, `...` и \.
В кавычках могут содержаться переводы строк, пробелы, табуляции, символы ;, &, (, ), |, ^, < и >. Задавая имя файла в кавычках, можно создать файлы с такими нетривиальными символами в именах. Впрочем, делать это не рекомендуется, так как работать с ними будет явно неудобно.
Монтирование и демонтирование физических файловых систем
Физические файловые системы, кроме корневой (/), считаются съемными (removable) в том смысле, что они могут быть как доступны для пользователей, так и не доступны. Команда mount уведомляет систему, что блочное устройство или удаленный ресурс доступны для пользователей в точке_монтирования, которая уже должна существовать; точка монтирования становится именем корня вновь смонтированного устройства или ресурса. Говорят, что эта команда монтирует или подключает физическую файловую систему или ресурс к общей логической файловой системе.
Команда mount имеет следующий синтаксис:
mount [-v | -p]
mount [-F ТипФС] [-V] [-o специфические_опции]
{устройство|точка_монтирования}
mount [-F ТипФС] [-V] [-o специфические_опции]
устройство точка_монтирования}
Команда mount, при вызове с аргументами, проверяет все аргументы, за исключением устройства, и вызывает специфический модуль монтирования для указанного типа файловой системы. При вызове без аргументов mount выдает список всех смонтированных файловых систем из соответствующей таблицы. При вызове с неполным списком аргументов (например, только с указанием устройства или точки_монтирования, или когда указаны оба эти аргумента, но не задан тип файловой системы), mount будет просматривать таблицу стандартных файловых систем в поисках недостающих аргументов. Затем она вызывает специфический модуль монтирования для соответствующего типа файловой системы.
Специфические опции монтирования зависят от типа физической файловой системы. Все физические файловые системы можно монтировать только для чтения (-o ro).
Обратная процедура по отношению к монтированию называется демонтированием и выполняется командой umount со следующим синтаксисом:
umount [-V] [-o специфические_опции]
{устройство|точка_монтирования}
Для большинства типов файловых систем нет специфического модуля демонтирования. Если такой модуль существует, он выполняется; иначе файловая система демонтируется стандартным модулем.
Команды mount и umount воспринимают следующие основные опции:
-v
Выдает результаты в "новом" стиле. При этом дополнительно отображается тип файловой системы и флаги. Поля точка_монтирования и устройство переставлены.
-p
Выдает список смонтированных файловых систем в формате .
-F
Задает тип файловой системы для монтирования. Тип файловой системы должен быть либо задан, либо определяется по в ходе монтирования.
-V
Выдает результирующую командную строку, но не выполняет команду. Командная строка генерируется с использованием опций и аргументов, указанных пользователем, путем добавления к ним, при необходимости, информации, взятой из таблицы стандартных файловых систем.
-o
Задает специфические опции для указанного типа физической файловой системы.
Любой пользователь может вызывать команду mount для получения списка смонтированных файловых систем и ресурсов. Например:
[kravchuk@arturo 13:05:48 /]$ mount -p /dev/dsk/c1t0d0s0 - / ufs - no rw,intr,largefiles,logging,onerror=panic,suid,dev=740040 /dev/dsk/c1t0d0s3 - /usr ufs - no rw,intr,largefiles,logging,onerror=panic,suid,dev=740043 /dev/dsk/c1t0d0p0:boot - /boot pcfs - no rw,nohidden,nofoldcase,dev=763050 /proc - /proc proc - no dev=2c00000 fd - /dev/fd fd - no rw,suid,dev=2cc0000 mnttab - /etc/mnttab mntfs - no dev=2dc0000 /dev/dsk/c1t0d0s1 - /var ufs - no rw,intr,largefiles,logging,onerror=panic,suid,dev=740041 swap - /var/run tmpfs - no dev=1 swap - /tmp tmpfs - no dev=2 /dev/dsk/c1t0d0s4 - /home ufs - no rw,intr,largefiles,logging,onerror=panic,suid,dev=740044 /dev/dsk/c2t0d0s1 - /fs ufs - no rw,intr,largefiles,logging,onerror=panic,suid,dev=740401
Только пользователь root может монтировать или демонтировать файловые системы.
Номера заданий
Номер задания позволяет командному интерпретатору наблюдать за процессами. Его можно рассматривать как головной элемент группы процессов, поскольку пользовательское задание порождает любые команды либо в конвейере, либо, как подзадания.
Обмен данными между пространством ядра и пользовательским пространством
Поскольку пользовательские процессы и ядро не имеют общего адресного пространства памяти, необходим механизм передачи данных между ними. При выполнении системного вызова, аргументы вызова и соответствующий идентификатор процедуры ядра передаются из пользовательского пространства в пространство ядра. Идентификатор процедуры ядра передается либо через аппаратный регистр процессора, либо через стек. Аргументы системного вызова передаются через пользовательскую область вызывающего процесса.
Пользовательская область процесса содержит информацию о процессе, необходимую ядру:
корневой и текущий каталоги, аргументы текущего системного вызова, размеры сегмента текста, данных и стека для процесса;
указатель на запись в таблице процессов, содержащую информацию для планировщика, например, приоритет;
таблицу дескрипторов файлов пользовательского процесса с информацией об открытых файлах;
стек ядра для процесса (пустой, если процесс работает в режиме пользователя).
Пользовательский процесс не может обращаться к пространству ядра, но ядро может обращаться к пространству процесса.
Обработка текстов
Таблица 27. Основные утилиты обработки текстов
Утилита | Назначение |
awk | Язык обработки шаблонов. Позволяет выполнять произвольную программу при выявлении в тексте определенной строки, соответствующей шаблону. По синтаксису аналогичен C. Содержит множество встроенных функций. Используется для обработки и преобразования текстовых данных, состоящих из столбцов и строк, а также для построения отчетов и анализа журналов. |
diff | Команда, сравнивающая два файла и выдающая найденные различия в разных форматах. |
ed | Стандартный строчный текстовый редактор. Воспринимает команды из стандартного входного потока, изменяет файлы и часто используется в сценариях. |
ex | Расширенная версия редактора ed. Поддерживает множество установок, которые можно запоминать для каждого пользователя в файле .exrc в его начальном каталоге. |
head | Выдает указанное количество начальных строк из файла. |
more | Позволяет просматривать файл постранично в обоих направлениях, искать в нем по шаблону. |
pr | Форматирует файл или входной поток для печати, разбивая его на страницы и снабжая, при необходимости, заголовками. |
sed | Потоковая версия редактора ed. Позволяет эффективно выполнять поиск и замену в стандартном входном потоке или указанных файлах. |
tail | Выдает указанное количество конечных строк из файла. |
tr | Преобразовывает символы во входном потоке, заменяя одни цепочки на другие. Поддерживает весь набор символов. |
Обычный файл
Представляет собой наиболее общий тип файлов, содержащий данные в некотором формате. Для операционной системы такие файлы представляют собой просто последовательность байтов. К этим файлам относятся текстовые файлы, двоичные данные и выполняемые программы.
В длинном листинге признаком обычного файла является дефис (-) в первой позиции первого столбца:
-rw-rw-r-- 1 root sys 8296 Фев 23 15:39 ps_data
Обычные файлы создаются текстовыми редакторами (текстовые), компиляторами (двоичные), прикладными программами с помощью соответствующего системного вызова или путем перенаправления вывода:
[kravchuk@arturo 14:40:01 /]$ cd /tmp [kravchuk@arturo 14:40:04 /tmp]$ >f1.txt [kravchuk@arturo 14:40:09 /tmp]$ ls -l f1.txt -rw-r--r-- 1 kravchuk 50 0 Мар 26 14:40 f1.txt
Оператор выбора
Командный интерпретатор поддерживает выполнение того или иного блока команд в зависимости от значения некоторого слова. Для этого предлагается оператор case со следующим синтаксисом:
<оператор выбора> ::=
case <слово> in
<описание варианта> ) <команды> ;;
{<описание варианта> ) <команды> ;; }
esac
<описание варианта> ::=
<шаблон> { | <шаблон>}
<команды> ::=
<команда> {<разделитель> <команда>}
<разделитель> ::=
<перевод строки> | ;
Слово (обычно - значение переменной) сравнивается последовательно с шаблонами. Если произошло сопоставление (по правилам сопоставления шаблонов имен файлов) выполняются команды, соответствующие данному варианту и оператор завершается. Учтите, что шаблон *)
сопоставляется с любым словом, и, тем самым, задает вариант по умолчанию.
В шаблонах оператора case символы . и /, в отличие от шаблонов имен файлов, не обязательно задавать явно.
Операторы цикла while и until
Командный интерпретатор поддерживает также традиционные циклы по условию со следующим синтаксисом:
<оператор while> ::=
while <команды> do <команды> done
<оператор until> ::=
until <команды> do <команды> done
Выполняются команды, задающие условие, и проверяется код возврата последней из них. Если это ноль (истина), выполняются команды в теле цикла while или завершается выполнение цикла until. Если это не ноль (ложь), завершается работа цикла while или выполняется очередная итерация цикла until.
На основе этих циклов часто создаются программы-"следилки", работающие бесконечно:
$ cat watchfor # watchfor: watching for log ins and log outs... PATH=/usr/bin new=/tmp/wfor1.$$ old=/tmp/wfor2.$$ >$old # создает пустой файл
while : # бесконечный цикл do who >$new diff $old $new mv $new $old sleep 60 done | awk ' />/ { $1 = "in: "; print } /</ { $1 = "out: "; print }' $
Определение типа файла
Для более точного определения типа файла (например, если файл двоичный, какой программой он мог быть создан) используется команда file со следующим синтаксисом:
file [ -h ] [ -m файл_сигнатур ] [ -f файл_списка ] файл...
file [ -h ] [ -m файл_сигнатур ] -f файл_списка
file -c [ -m файл_сигнатур ]
Утилита file выполняет ряд проверок каждого из указанных файлов и всех файлов, указанных в файле_списка, если он задан, пытаясь проклассифицировать файлы. Если файл не является обычным, выдается его тип. Если же обычный файл имеет нулевую длину, он классифицируется как пустой (empty).
Если файл является текстовым, команда file проверяет первых 512 байтов и пытается определить, на каком языке программирования написан файл. Если файл является символической связью, происходит проверка и классификация файла, на который связь указывает.
При определении типа файла используется файл сигнатур. Стандартный файл сигнатур - /etc/magic. В нем хранятся числа или строки, показывающие тип файла:
0 string PK\003\004 ZIP archive 0 string MZ DOS executable (EXE) 0 string LZ DOS built-in 0 byte 0xe9 DOS executable (COM) 0 byte 0xeb DOS executable (COM) 24 long 60012 ufsdump archive file 0 string TZif zoneinfo timezone data file
Формат файла сигнатур детально описан на странице справочного руководства magic(4).
Если проверяемый файл не существует, не может быть прочитан или его тип не удается определить, это не считается ошибкой. Результат тестирования командой file не гарантирует 100% корректности. Не полагайтесь на него с полной уверенностью.
Поддерживаются следующие опции:
-c
Проверяет формат файла сигнатур.
-h
Не следует по символическим связям.
-f
Задает файл, содержащий список файлов для классификации.
-m
Задает альтернативный файл сигнатур, вместо /etc/magic.
Рассмотрим простой пример:
[kravchuk@arturo 16:05:40 /tmp]$ file -f f* f2.txt: ascii text f3.txt: ascii text f4: symbolic link to f2
Ориентация и навигация в файловой системе
Иерархическая структура файловой системы UNIX упрощает ориентацию в ней. Каждый каталог, начиная с корневого (/), в свою очередь, содержит файлы и другие каталоги (подкаталоги). Каждый каталог содержит также ссылку на родительский каталог (для корневого каталога родительским является он сам), представленную каталогом с именем две точки (..) и ссылку на самого себя, представленную каталогом с именем точка (.).
Каждый процесс имеет текущий каталог. Сразу после регистрации текущим каталогом пользователя (на самом деле, процесса - начальной программы, обычно, командного интерпретатора) становится начальный каталог, указанный в файле /etc/passwd.
Каждый процесс может сослаться (назвать) на любой файл или каталог в файловой системе по имени. Способам задания имен файлов посвящен следующий подраздел.
Основные функции ядра
Основные функции ядра UNIX (которое может быть монолитным или модульным) включают:
планирование и переключение процессов;
управление памятью;
обработку прерываний;
низкоуровневую поддержку устройств (через драйверы);
управление дисками и буферизация данных;
синхронизацию процессов и обеспечение средств межпроцессного взаимодействия (IPC).
Основные характеристики
ОС UNIX имеет следующие основные характеристики:
переносимость;
вытесняющая многозадачность на основе процессов, работающих в изолированных адресных пространствах в виртуальной памяти;
поддержка одновременной работы многих пользователей;
поддержка асинхронных процессов;
иерархическая файловая система;
поддержка независимых от устройств операций ввода-вывода (через специальные файлы устройств);
стандартный интерфейс для программ (программные каналы, IPC) и пользователей (командный интерпретатор, не входящий в ядро ОС);
встроенные средства учета использования системы.
Основные команды
Основные команды редактора vi представлены в табл. 22.
Таблица 22. Сводка основных команд редактора vi
Перемещение курсора | |
H (Ctrl-h) | курсор влево |
J (Ctrl-n) | курсор вниз |
K (Ctrl-p) | курсор вверх |
L (Space) | курсор право |
Ctrl-u | Переход вверх на половину экрана |
Ctrl-d | Переход вниз на половину экрана |
Ctrl-f | На страницу вперед (PageDn) |
Ctrl-b | На страницу назад (PageUp) |
0 | Переход в начало текущей строки |
$ | Переход в конец текущей строки |
nG | Переход на строку с номером n |
Добавление текста | |
a | Добавить текст после курсора |
A | Добавить текст в конце текущей строки |
i | Вставить текст перед курсором |
I | Вставить текст в начале текущей строки |
o | Образовать новую строку под текущей |
O | Образовать новую строку над текущей |
Изменение текста | |
~ | Изменить регистр символа над курсором |
r | Замена одного символа |
R | Замена символов |
Удаление текста | |
x | Удаление символа |
dd | Удаление строки |
Ndd | Удаление N строк |
Поиск и замена | |
/str | Поиск строки str вперед. str может быть регулярным выражением |
?/str | Поиск строки str назад |
n | Повторить поиск в том же направлении |
N | Повторить поиск в обратном направлении |
:[range]s/old/new/[g] | Заменить old на new в указанном диапазоне строк range. new и old могут быть регулярными выражениями, а range задается аналогично диапазону строк в редакторе ed. Суффикс g означает заменить во всем файле. |
Копирование текста | |
yy | Копирование строки в целом |
Nyy | Копирование N строк |
p | Вставить из буфера после (курсора, текущей строки) |
P | Вставить из буфера перед (курсором, текущей строкой) |
Выход из редактора | |
:wq ENTER | Запись и выход. Записать текст из буфера в файл и выйти из редактора. |
:x ENTER | Условная запись и выход. Записать текст из буфера только при наличии изменений и выйти из редактора. |
:q! ENTER | Закончить редактирование без записи изменений. |
Другие команды | |
! | Выполнить одну команду интерпретатора |
. | Повторить последнюю команду |
u | Отменить действие последней команды |
J | Соединить строки |
Ctrl-G | Показать номер текущей строки |
Курсор можно перемещать и клавишами перемещения курсора или клавишами PageUp, PageDn, но эти возможности, в отличие от описанных в таблице, поддерживаются не на всех терминалах.
Основные команды для работы с файлами
К основным операциям для работы с файлами, помимо создания и просмотра характеристик, можно отнести копирование, удаление, перемещение и переименование, а также просмотр содержимого. Команды для выполнения этих действий представлены в следующих подразделах.
Основные сигналы
Информация об основных сигналах представлена в табл. 18.
Таблица 18. Основные сигналы
Сигнал | Стандартная обработка | Значение |
SIGTERM 15 |
Завершение процесса | Стандартный сигнал, посылаемый для остановки процесса. |
SIGHUP 1 |
Завершение процесса | Отключился терминал (или закрыто терминальное окно). Сигнал посылается всем не фоновым процессам, связанным с соответствующей терминальной линией. |
SIGKILL 9 |
Завершение процесса | Не перехватываемый сигнал, позволяющий завершить любой процесс. |
SIGILL 4 |
Завершение процесса и сброс образа памяти | На центральный процессор была послана запрещенная инструкция. Это могло быть следствием недопустимого перехода в машинном коде программы, например, попытки выполнить строку данных. |
SIGTRAP 5 |
Завершение процесса и сброс образа памяти | Была установлена ловушка точки прерывания процесса. Этим управляет системный вызов ptrace, который полезен для отладки. |
SIGFPE 8 |
Завершение процесса и сброс образа памяти | Была попытка выполнить запрещенную арифметическую операцию, например, взятие логарифма отрицательного числа или деление на 0. |
SIGBUS 10 |
Завершение процесса и сброс образа памяти | Ошибка на шине ввода-вывода. Обычно это является результатом попытки выполнить чтение или запись вне границ памяти программы. |
SIGSEGV 11 |
Завершение процесса и сброс образа памяти | Это нарушение сегментации - проклятие разработчиков программ! Оно означает, что вы попытались получить доступ к сегменту памяти запрещенным образом. Может быть, это было присваивание значения части сегмента кода или чтение из нулевого адреса. |
SIGPIPE 13 |
Завершение процесса | Программа попыталась выполнить чтение или запись в программный канал, другой конец которого уже завершил работу. Этот сигнал помогает завершить работу конвейера, когда одна из его команд дала сбой. |
SIGALRM 14 |
Завершение процесса | Программист может установить будильник, чтобы позволить вам в определенный момент времени выполнить какое-нибудь действие. |
SIGCHLD 18 |
Игнорируется | Сначала это был сигнал завершения работы дочернего процесса, но сейчас он означает изменение состояния дочернего процесса. |
SIGTSTP 24 |
Остановка процесса | Это запрос от терминала на остановку процесса. Посылка этого сигнала процессу происходит при нажатии комбинации клавиш Ctrl-Z. |
SIGCONT 25 |
Игнорируется | Этот сигнал указывает процессу на возобновление его работы. Процессу посылается либо команда fg, либо bg, а командный интерпретатор выполняет внутренний системный вызов wait для привилегированного процесса, либо не выполняет его для фонового процесса. |
Детальная информация о сигналах представлена на страницах справочного руководства signal.
Процесс с помощью системного вызова signal() может задать нестандартный обработчик любого сигнала, кроме SIGKILL (9).
Основные утилиты
Помимо рассмотренных выше команд, ОС UNIX предлагает десятки полезных утилит и средств. Основные утилиты для обработки текстов представлены , а клиенты основных сетевых служб- . Полезные команды для создания резервных копий представлены .
Перехват и обработка сигналов
В программах командного интерпретатора можно перехватывать и обрабатывать сигналы. Для этого используется команда trap, устанавливающая с момента выполнения обработчик в виде последовательности команд (одним словом) для всех перечисленных сигналов. Эта команда имеет следующий синтаксис:
<оператор trap> ::=
trap <последовательность команд> <список сигналов>
<список сигналов> ::=
<сигнал> {<пробелы> <сигнал>}
Рассмотрим пример реализации команды nohup, позволяющей запустить программу так, чтобы она продолжала работать при выключении терминала:
$ cat nohup # nohup: no kill and hangup trap "" 1 15 if test -t 2>&1 then echo "Redirect stdout to 'nohup.out'" exec nice -5 $* >>nohup.out 2>&1 else exec nice -5 $* 2>&1 fi $
Переменные и присваивание
Подобно большинству языков программирования, командный интерпретатор имеет переменные, которые называют еще ключевыми параметрами (поскольку они предаются по имени- ключу).
Переменные можно создавать, изменять и выбирать их значения. Для присваивания значения переменной применяется конструкция:
переменная=значение
Обратите внимание на отсутствие пробелов до и после знака присваивания. Вспомните, что командный интерпретатор считает пробелы разделителями слов. Если поставить пробел после знака присваивания, то интерпретатор не изменит значения переменной, но будет искать команду с именем значение.
Присваиваемое значение должно выражаться одним словом, и его следует взять в кавычки, если оно содержит метасимволы, которые не нужно обрабатывать.
Создание (определение) переменной происходит при первом присваивании ей значения. Переменные не нужно явно объявлять до момента их использования. Если переменная не объявлена (не получила значения), при обращении к ней будет получена пустая строка. Все переменные в командном интерпретаторе - строковые, поэтому тип переменной задавать не надо. Некоторые команды интерпретируют строки как числа.
Многие переменные, как, например, PATH, имеют специальное значение для интерпретатора. По традиции, такие переменные называют встроенными и обозначают прописными буквами, а обычные переменные - строчными. Основные встроенные переменные представлены в табл. 25.
Таблица 25. Встроенные переменные командного интерпретатора
Переменная | Значение |
$HOME | Начальный каталог пользователя. |
$PATH | Путь для поиска выполняемых команд. |
$CDPATH | Путь поиска для команды cd. |
$IFS | Список символов, разделяющих слова в аргументах |
Файл почтового ящика. Командный интерпретатор информирует пользователя о получении почты в указанный файл. | |
$MAILCHECK | Эта переменная определяет, как часто (в секундах) интерпретатор будет проверять поступление почты в файл, определяемый переменной MAIL. По умолчанию принято значение 600 секунд. При установке в 0, интерпретатор будет проверять почту перед каждой выдачей строки-приглашения. |
$PS1 | Строка-приглашение, по умолчанию принята '$ ' |
$PS2 | Строка-приглашение при продолжении командной строки, по умолчанию принята '> ' |
Типичным примером использования переменных является хранение в них длинных строк, таких как имена файлов:
$ pwd /home/intdbi/dosapps/doc/book/unix/shell $ dir=`pwd` $ cd $ ln $dir/cx . ... $ cd $dir $ pwd /home/intdbi/dosapps/doc/book/unix/shell
Встроенная команда интерпретатора set, при вызове без параметров показывает значение всех определенных переменных.
Перемещение и переименование файлов
Команда mv перемещает (переименовывает) исходный файл (или файлы) в целевой файл (или каталог). Она имеет следующий синтаксис:
mv [-f][-i] исходный_файл целевой_файл
mv [-f][-i] исходный_файл ... каталог
Имя исходного файла не должно совпадать с именем целевого файла. Если целевой файл является каталогом, то исходные файлы перемещаются в него под теми же именами. Только в этом случае можно указывать несколько исходных файлов. Если целевой файл существует и не является каталогом, его старое содержимое теряется. Если при этом обнаруживается, что в целевой файл не разрешена запись, то выводится информация о правах доступа к этому файлу и с терминала запрашивается подтверждение его перезаписи.
Для перемещения файла необходимо иметь права записи в исходном и целевом каталоге.
Команда mv поддерживает следующие опции:
-f
Принудительное перемещение - если целевой файл уже существует, то он удаляется.
-i
Запрашивает подтверждение удаления существующего файла.
Рассмотрим примеры:
[kravchuk@arturo 17:37:52 /tmp]$ ls -l f* lrwxrwxrwx 1 kravchuk 50 6 Мар 26 16:54 f3.txt -> f1.txt -rw-r--r-- 1 kravchuk 50 639 Мар 26 16:55 f5.txt [kravchuk@arturo 17:37:56 /tmp]$ mv f5.txt f4.txt [kravchuk@arturo 17:38:09 /tmp]$ mv f4.txt f4.txt mv: f4.txt and f4.txt are identical [kravchuk@arturo 17:38:14 /tmp]$ mv f4.txt f3.txt [kravchuk@arturo 17:38:20 /tmp]$ ls -l f* -rw-r--r-- 1 kravchuk 50 639 Мар 26 16:55 f3.txt [kravchuk@arturo 17:38:24 /tmp]$ mkdir d1 [kravchuk@arturo 17:38:54 /tmp]$ mv f3.txt d1 [kravchuk@arturo 17:39:00 /tmp]$ ls -l d1 total 8 -rw-r--r-- 1 kravchuk 50 639 Мар 26 16:55 f3.txt
Перевод задания в фоновый режим
С помощью команды bg можно возобновить в фоновом режиме работу приостановленного или остановленного задания. Для этого нужно указать соответствующий номер задания, после чего оно перейдет в фоновый режим, и будет работать до своего завершения, или пока ему снова не потребуется ввод с терминала.
Перевод задания в привилегированный режим
Команда fg переводит задания в привилегированный режим. При наличии приостановленного задания, его можно сделать привилегированным (перевести на передний план) с помощью команды fg #номер_задания (или fg номер_задания в bash). После этого задание либо выведет на экран сообщение о том, что ему нужно от терминала, либо будет принимать ожидаемый ввод. Переведя задание в привилегированный режим, можно приостановить его выполнение, нажав комбинацию калвиш Ctrl-Z, и заняться им позже.
Любое задание из списка, предоставленного командой jobs, доступно, если пользователь захочет сделать его привилегированным, даже в том случае, когда оно уже работает в фоновом режиме. Если в этом списке приведено только одно задание, то при использовании команды fg пользователю не нужно задавать его номер. Если номер задания не задан, предполагается текущее задание.
Поиск файлов
В логической файловой системе ОС UNIX - тысячи файлов, поэтому необходимы средства поиска файлов по различным критериям. Для поиска файлов предназначена команда find со следующим синтаксисом:
find каталог ... выражение
Утилита find просматривает иерархии каталогов в поисках файлов, удовлетворяющих критерию, задаваемому выражением. Выражения строятся из элементов с использованием следующих конструкций:
( элемент )
Истинно, если истинен элемент в скобках (поскольку скобки - метасимвол командного интерпретатора, их надо экранировать). Скобки используются для группировки элементов.
! элемент
Истинно, если элемент не истинен.
элемент [-a] элемент
Истинно, если истинны оба элемента. Если элементы просто перечислены подряд, предполагается эта же логическая операция И.
элемент -o элемент
Истинно, если истинен хотя бы один элемент.
Имена найденных (удовлетворяющих критерию, задаваемому выражением) файлов по умолчанию выдаются в стандартный выходной поток.
В качестве элементов выражения используются основные конструкции, представленные в табл. 12. Выражение проверяется слева направо, с учетом скобок.
Таблица 12. Основные элементы выражения в команде find
Элемент | Назначение или критерий истинности |
-name шаблон | Истинен, если имя файла соответствует шаблону. При использовании метасимволов необходимо маскировать шаблоны от командного интерпретатора. |
-type тип | Истинен, если файл - указанного типа. Типы файлов задаются символами b, c, d, f, l, p и s, обозначающими, соответственно, специальное блочное устройство, специальное символьное устройство, каталог, обычный файл, символьную связь, именованный канал и сокет. |
-user пользователь | Истинен, если файл принадлежит пользователю, указанному по идентификатору или регистрационному имени. |
-group группа | Истинен, если файл принадлежит группе, указанной по идентификатору или имени. |
-perm [-]права | Если дефис не задан, то истинен только если права доступа в точности соответствуют указанным (как в команде chmod, проще - абсолютные). Если задан дефис, истинен, если в правах доступа файла, как минимум, установлены те же биты, что и в указанных правах. |
-size n[c] | Истинен, если файл имеет длину n блоков (блок - 512 байтов) или символов (если указан суффикс c). Перед размером можно указывать префикс + (не меньше), - (не больше) или = (в точности равен). |
-atime n | Истинен, если к файл последний раз обращались n дней назад. Перед n в элементах -atime, -ctime и -mtime можно указывать префикс + (не позже), - (не ранее) или = (ровно). |
-ctime n | Истинен, если файл создан n дней назад. |
-mtime n | Истинен, если файл был изменен n дней назад. |
-newer файл | Истинен, если файл - более новый, чем указанный. |
-ls | Всегда истинен. Выдает информацию о файле, аналогичную длинному листингу. |
Истинен всегда. Выдает полное имя файла в стандартный выходной поток. | |
-exec команда {} \; | Истинен, если выполненная команда возвращает код возврата 0. Команда заканчивается замаскированной точкой с запятой. В команде можно использовать конструкцию {}, заменяемую полным именем рассматриваемого файла. |
-ok команда {} \; | Аналогичен exec, но полученная после подстановки имени файла вместо {} команда выдается с вопросительным знаком и выполняется только если пользователь ввел символ y. |
-depth | Истинен всегда. Требует так обходить иерархию каталогов, чтобы файлы любого каталога всегда обрабатывались раньше, чем сам каталог (обход "в глубину"). |
-prune | Истинен всегда. Требует не проверять файлы в каталоге, сопоставившемся с предыдущим элементом выражения. Не действует, если ранее указан элемент -depth. |
В различных версиях ОС UNIX могут поддерживаться и другие компоненты выражений в команде find. Если командная строка сформирована неправильно, команда немедленно завершает работу.
Рассмотрим несколько примеров использования команды find:
[kravchuk@arturo 15:05:25 /tmp]$ find . -user kravchuk -size +0c -ls find: cannot read dir ./smc898: Permission denied 475898122 4 -rw-r--r-- 1 kravchuk 50 666 Mar 26 16:58 ./-1 473866040 4 -rw-r--r-- 1 kravchuk 50 6 Mar 26 17:55 ./1.txt 475472259 4 dr-xr--r-- 2 kravchuk 50 108 Mar 26 17:39 ./d1 474199552 4 -rw-r--r-- 1 kravchuk 50 639 Mar 26 16:55 ./d1/f3.txt 476732956 4 -rw-r--r-- 1 kravchuk 50 6 Mar 26 17:55 ./2.txt 476732980 4 -rw-r--r-- 1 kravchuk 50 12 Mar 26 17:56 ./3.txt 476142563 4 -rw-r--r-- 1 kravchuk 50 7 Mar 26 17:56 ./4.txt [kravchuk@arturo 15:26:41 /tmp]$ find . -name "??.txt" -print find: cannot read dir ./smc898: Permission denied ./d1/f3.txt ./f1.txt [kravchuk@arturo 15:26:58 /tmp]$ find . -name d1 -prune -name "??.txt" -print find: cannot read dir ./smc898: Permission denied [kravchuk@arturo 15:27:09 /tmp]$ find . -name d1 -prune -o -name "??.txt" -print find: cannot read dir ./smc898: Permission denied ./f1.txt [kravchuk@arturo 15:27:13 /tmp]$ find . -user kravchuk -ok rm {} \; find: cannot read dir ./smc898: Permission denied < rm ... ./p1 >? y < rm ... ./-1 >? y < rm ... ./1.txt >? y < rm ... ./mpDfa4ZT >? y < rm ... ./d1 >? y rm: Unable to remove directory ./d1: File exists < rm ... ./d1/f3.txt >? y < rm ... ./2.txt >? y < rm ... ./3.txt >? y < rm ... ./4.txt >? y < rm ... ./f1.txt >? y [kravchuk@arturo 15:28:35 /tmp]$ find . -user kravchuk -print find: cannot read dir ./smc898: Permission denied ./d1 ./d1/f3.txt
Поиск в тексте по образцу - утилита grep
Программы семейства grep осуществляют поиск шаблона (задаваемого на языке регулярных выражений) в указанных файлах или во входном потоке и (обычно) выдают соответствующие шаблону строки в выходной поток. В это семейство входят три программы, grep, egrep и fgrep, отличающиеся алгоритмами (а, значит, скоростью работы и используемыми ресурсами системы) и, частично, возможностями при задании шаблонов.
Показ атрибутов пароля
Когда команда passwd используется для показа атрибутов пароля, результаты выдаются в следующем формате:
login_name status lastchanged minimum maximum warn
или, если отсутствует информация, связанная с устареванием пароля,
login_name status
Поля определены следующим образом:
login_name
Регистрационное имя пользователя.
status
Статус пароля для регистрационного_имени: PS означает наличие пароля, LK означает, что регистрация заблокирована, а NP означает отсутствие пароля.
Получение информации о файлах
Для просмотра информации о типах (и других атрибутах) файлов в ОС UNIX используется команда ls со следующим синтаксисом:
ls [-abCcdeFfgiLlmnopqRrstux1] [файл ...]
Команда ls выдает информацию об указанных файлах или о файлах и каталогах в текущем каталоге (если файл не задан). Формат и подробность выдаваемой информации зависит от опций. Основные опции команды ls представлены в табл. 10:
Таблица 10. Основные опции команды ls
Опция | Назначение |
-a | Выдает все файлы и подкаталоги, включая те, имена которых начинаются с точки (.). По умолчанию такие файлы не выдаются (они считаются скрытыми). |
-F | Добавляет к имени файла суффикс, показывающий его тип (см. ). Помечает каталоги косой чертой (/), выполняемые файлы - звездочкой (*), именованные каналы (FIFO) - вертикальной чертой (|), символические связи - "собакой" (@), а сокеты - знаком равенства (=). |
-i | Для каждого файла выдает в первом столбце листинга номер индексного дескриптора (i-node). Об индексных дескрипторах см. в разделе, посвященном физическим файловым системам UNIX. |
-l | Выдает длинный листинг, включающий права доступа, количество связей, владельца, группу, размер в байтах, время последнего изменения каждого файла и, естественно, имя файла. Если файл является специальным файлом устройства, вместо размера выдаются главный и второстепенный номера устройства. Если с момента последнего изменения прошло более 6 месяцев, оно обычно выдается в формате 'месяц день год'. Для файлов, измененных позднее, чем 6 месяцев назад, время выдается в формате 'месяц день время'. Если файл является символической связью, в длинном листинге после имени файла указывается стрелочка (->) и имя файла, на который связь ссылается. |
-r | Изменяет порядок сортировки на обратный стандартному (обратный лексикографический или сначала самые старые файлы, в зависимости от других опций). |
-R | Рекурсивно выдает содержимое подкаталогов. |
-t | Сортирует листинг по временной отметке (сначала - самые новые), а не по имени файла. По умолчанию используется время последнего изменения. (Опции -u и -c позволяют сортировать по времени последнего обращения и времени создания, соответственно.) |
Как видно из синтаксиса, можно задавать одновременно несколько опций. Вот как можно посмотреть подробную информацию о файлах в каталоге /tmp, начиная с самых давно изменявшихся:
[kravchuk@arturo 14:28:07 /tmp]$ cd /tmp [kravchuk@arturo 14:28:07 /tmp]$ ls -lrt -rw-rw-r-- 1 root sys 8296 Фев 23 15:39 ps_data drwx------ 2 root root 110 Фев 23 15:41 smc898 -rw-rw---- 1 root informix 0 Фев 23 18:53 bar_dbug.log drwxr-xr-x 2 informix informix 115 Фев 24 13:05 txt -rw------- 1 root other 0 Фев 25 13:50 mpQ1aGEp -rw------- 1 remisov software 0 Фев 25 15:03 mpwsaWPr -rw------- 1 remisov software 0 Фев 25 15:37 mpOFaqZs -rw------- 1 remisov software 0 Фев 25 16:25 mppfaa.t -rw------- 1 remisov software 0 Фев 26 13:30 mpUCaGDG -rw------- 1 remisov software 0 Фев 26 14:25 mpRfaaSI -rw------- 1 remisov software 0 Фев 26 16:41 mpCJaqUL -rw------- 1 remisov software 0 Фев 26 16:56 mpUgaatM -rw------- 1 remisov software 0 Фев 26 17:01 mpYua4AM -rw-r--r-- 1 informix informix 565 Фев 27 17:27 mkdb1994.err -rw-r--r-- 1 informix informix 2062 Фев 27 17:29 mkdb2003.err -rw------- 1 root other 314872 Фев 27 21:35 dtdbcache_:0 -rw-r--r-- 1 root other 0 Фев 27 21:35 sdtvolcheck4684 ...
Основным форматом результатов ls является так называемый длинный листинг (задаваемый опцией -l). По умолчанию выдаются только имена файлов в несколько столбцов:
[kravchuk@arturo 14:31:40 /tmp]$ cd / [kravchuk@arturo 14:31:47 /]$ ls INFORMIXTMP dev home opt sbin INFORMIXTMP9 devices kernel opt.orig tmp TT_DB dt lib platform usr bin etc lost+found prj var boot export mnt proc vol cdrom fs net root xfn [kravchuk@arturo 14:31:48 /]$
Часто также используется опция -F:
[kravchuk@arturo 14:31:48 /]$ ls -F INFORMIXTMP/ dev/ home/ opt@ sbin/ INFORMIXTMP9/ devices/ kernel/ opt.orig/ tmp/ TT_DB/ dt/ lib@ platform/ usr/ bin@ etc/ lost+found/ prj@ var/ boot/ export/ mnt/ proc/ vol/ cdrom/ fs/ net/ root/ xfn/
Многочисленные примеры использования и результатов выполнения команды ls представлены в следующих разделах.
Получение информации о файловых системах
Для получения информации о смонтированных физических файловых системах используется команда df со следующим синтаксисом:
df [ -F ТипФС ] [ -abegklntV ] [ -o специфические_опции ]
[ устройство | каталог | файл | ресурс ... ]
Опции и параметры определяют формат выдаваемой информации и файловые системы, о которых информирует команда. Чаще всего, команда df вызывается без опций или с опцией -k. Опция -k выдает информацию об объемах в килобайтах. Для каждой физической файловой системы выдается отдельная строка, включающая (при использовании опции -k) специальный файл или имя смонтированного ресурса, общий объем, использованный объем, доступный объем для использования обычными пользователями, процент свободного места в файловой системе и точку монтирования.
Рассмотрим примеры выполнения команды df в ОС Solaris:
[kravchuk@arturo 12:11:00 /]$ df -k Filesystem kbytes used avail capacity Mounted on /dev/dsk/c1t0d0s0 245983 20713 200672 10% / /dev/dsk/c1t0d0s3 3096090 1782106 1252063 59% /usr /dev/dsk/c1t0d0p0:boot 10797 1622 9175 16% /boot /proc 0 0 0 0% /proc fd 0 0 0 0% /dev/fd mnttab 0 0 0 0% /etc/mnttab /dev/dsk/c1t0d0s1 491983 204863 237922 47% /var swap 324832 16 324816 1% /var/run swap 337828 13012 324816 4% /tmp /dev/dsk/c1t0d0s4 2305873 1021225 1238531 46% /home /dev/dsk/c2t0d0s1 6192197 5633827 496449 92% /fs [kravchuk@arturo 12:45:58 /]$ df / (/dev/dsk/c1t0d0s0 ): 450540 blocks 120616 files /usr (/dev/dsk/c1t0d0s3 ): 2627968 blocks 338652 files /boot (/dev/dsk/c1t0d0p0:boot): 18350 blocks -1 files /proc (/proc ): 0 blocks 3615 files /dev/fd (fd ): 0 blocks 0 files /etc/mnttab (mnttab ): 0 blocks 0 files /var (/dev/dsk/c1t0d0s1 ): 574236 blocks 240784 files /var/run (swap ): 647568 blocks 43108 files /tmp (swap ): 647568 blocks 43108 files /home (/dev/dsk/c1t0d0s4 ): 2569298 blocks 379999 files /fs (/dev/dsk/c2t0d0s1 ): 1116738 blocks 688872 files