Вы находитесь на странице: 1из 392

ИНТЕРНЕТ УНИВЕРСИТЕТ »

ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ

Операционная система Linux


Курс лекций. Учебное пособие

Г. В. Курячий
К .А. Маслинский

Рекомендовано для студентов высших учебных заведений,


обучающихся по специальностям в области информационных
технологий

Серия «Основы информационных технологий»

Создано при поддержке компании


«ИБМ Восточная Европа/Азия»

Интернет-Университет Информационных Технологий


www.intuit.ru
Москва, 2005
ББК 32.973.26-018.2я73-2
К93
УДК 004.451.9Linux(075.8)

К 9 3 О п е р а ц и о н н а я система Linux : курс л е к ц и й : учеб. п о с о б и е д л я студентов вузов,


обучающихся п о с п е ц и а л ь н о с т я м в области и н ф о р м . технологий / Г. В. Курячий,
К. А. М а с л и н с к и й . - М . : И н т е р н е т - У н - т И н ф о р м . Технологий, 2005. - 320 с. - ( С е р и я
«Основы и н ф о р м а ц и о н н ы х технологий»). I S B N 5-9556-0029-9
В курсе даются о с н о в н ы е п о н я т и я о п е р а ц и о н н о й с и с т е м ы Linux и в а ж н е й ш и е
н а в ы к и р а б о т ы в н е й . И з л о ж е н и е сопровождается б о л ь ш и м к о л и ч е с т в о м п р а к т и ч е с к и х
п р и м е р о в . Д а н н ы й курс может рассматриваться к а к у ч е б н и к для студентов, н а ч и н а ю щ и х
обучение п о с п е ц и а л ь н о с т я м в области и н ф о р м а т и к и и е щ е не з н а к о м ы х с О С Linux.
Рекомендовано для студентов высших учебных заведений, обучающихся по специальностям в
области информационных технологий.

Б и б л и о г р . 19

С о з д а н о п р и поддержке к о м п а н и и
« И Б М Восточная Европа/Азия»

И з д а н и е осуществлено п р и ф и н а н с о в о й и т е х н и ч е с к о й поддержке к о м п а н и й :
Издательство «Открытые Системы», « Р М Телеком», Kraftway Computers и A L T Linux.

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

© И н т е р н е т - У н и в е р с и т е т И н ф о р м а ц и о н н ы х Технологий, www.intuit.ru, 2005

ISBN 5-9556-0029-9
О проекте

Интернет-Университет И н ф о р м а ц и о н н ы х Технологий — это первое


в России высшее учебное заведение, которое предоставляет возможность
получить дополнительное образование во Всемирной сети. Web-сайт у н и ­
верситета находится п о адресу www.intuit.ru.
М ы рады, что вы решили расширить свои знания в области к о м п ь ю ­
терных технологий. Современный м и р — это м и р компьютеров и и н ф о р ­
мации. Компьютерная индустрия — самый быстрорастущий сектор э к о н о ­
м и к и , и ее рост будет продолжаться еще долгое время. Во времена жесткой
конкуренции от уровня развития и н ф о р м а ц и о н н ы х технологий, достиже¬
н и й научной мысли и перспективных инженерных решений зависит успех
не только отдельных людей и компаний, н о и целых стран. Вы выбрали са¬
мое подходящее время для изучения компьютерных дисциплин. Профес¬
сионалы в области и н ф о р м а ц и о н н ы х технологий сейчас востребованы
везде: в науке, экономике, образовании, медицине и других областях, в го­
сударственных и частных компаниях, в России и за рубежом. Анализ д а н ­
ных, прогнозы, организация связи, создание программного обеспечения,
построение моделей процессов — вот далеко н е полный список областей
применения знаний для компьютерных специалистов.
Обучение в университете ведется п о собственным учебным планам,
разработанным ведущими р о с с и й с к и м и специалистами на основе между¬
народных образовательных стандартов Computer Curricula 2001 Computer
Science. Изучать учебные курсы м о ж н о самостоятельно п о учебникам или
на сайте Интернет-университета, задания выполняются только н а сайте.
Для обучения необходимо зарегистрироваться н а сайте университета.
Удостоверение об о к о н ч а н и и учебного курса или специальности выдает¬
ся п р и условии выполнения всех заданий к л е к ц и я м и успешной сдачи
итогового экзамена.
Книга, которую вы держите в руках, очередная в многотомной серии
« О с н о в ы и н ф о р м а ц и о н н ы х технологий», в ы п у с к а е м о й И н т е р н е т -
У н и в е р с и т е т о м И н ф о р м а ц и о н н ы х Технологий. В э т о й серии будут
в ы п у щ е н ы учебники п о всем базовым областям з н а н и й , связанным с
компьютерными д и с ц и п л и н а м и .
Добро пожаловать в Интернет-Университет И н ф о р м а ц и о н н ы х
Технологий!

Анатолий Шкред
anatoli@shkred.ru

3
Предисловие

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


Linux и описаны в а ж н е й ш и е н а в ы к и работы в ней. И з л о ж е н и е сопровож¬
дается большим количеством практических примеров. Д а н н ы й курс м о ­
жет рассматриваться как учебник для студентов, начинающих обучение
по специальностям в области и н ф о р м а т и к и и еще не знакомых с О С
Linux. Он состоит из двух основных частей.
В первой части вводятся основные понятия и н а в ы к и , необходимые
пользователю для того, чтобы начать грамотно работать в Linux. Здесь
рассматриваются: пользователи с точки зрения системы, понятия терми¬
нала и работы с командной строкой, устройства файловой системы и ра¬
бота с ней, права доступа в Linux, возможности командной оболочки, тек¬
стовые редакторы.
Вторая часть посвящена тем п о н я т и я м и навыкам, которые требуют­
ся для администрирования О С Linux. Сюда входит обсуждение этапов за¬
грузки системы, технологий работы с в н е ш н и м и устройствами, файловы¬
ми системами и сетью в Linux, администрирование системы посредством
конфигурационных файлов, управление пакетами.
В завершающей лекции курса дается обзор истории развития Linux.
Здесь ж е показан социальный контекст, существенный для п о н и м а н и я
О С Linux и работы в ней: сообщество пользователей, лицензирование
свободного программного обеспечения, место свободного П О на совре­
м е н н о м р ы н к е , дистрибутивы Linux и р е ш е н и я на базе Linux.
Теоретическое изложение материала перемежается практическими
примерами: показаны к о н к р е т н ы е действия пользователя и их результат.
Наиболее э ф ф е к т и в н ы й способ освоить материал курса — по ходу чтения
л е к ц и й выполнять все примеры самостоятельно. Для этого необходим до¬
ступ к установленному дистрибутиву Linux. П р и м е р ы подобраны с таким
расчетом, чтобы результат был одинаковым в любом современном дис¬
трибутиве.
В примерах действует один условный пользователь, работающий «в
одном и том ж е месте»: все созданные и м ф а й л ы сохраняются и использу­
ются в последующих лекциях. О н совершает т и п и ч н ы е о ш и б к и или, на¬
оборот, делает все правильно.
Названия объектов системы (имена файлов, программ и т. п.), встре­
чающиеся в тексте, набраны м о н о ш и р и н н ы м ш р и ф т о м , их м о ж н о в неиз¬
м е н н о м виде вводить в качестве команд и т. п. Однако иногда такие стро¬
ки для удобства чтения заключены в кавычки — в этом случае вводить ка¬
вычки не нужно.

4
Об авторах

Курячий Георгий Владимирович


О к о н ч и л М о с к о в с к и й Государственный Университет и м М. В.
Ломоносова, факультет В М и К . Работает системным администратором на
факультете В М и К МГУ, читает с п е ц к у р с ы по U n i x и сетям, ведет
исследовательские проекты для к о м п а н и и A L T Linux.

Маслинский Кирилл Александрович


Закончил филологический факультет Санкт-Петербургского Госу¬
дарственного университета в 2002 году. Работал в области издательского
дела. В настоящее время занимается подготовкой и выпуском техниче¬
ской документации в к о м п а н и и A L T Linux. И н т е р е с ы в области информа¬
ц и о н н ы х технологий: свободное программное обеспечение, я з ы к и раз­
метки и структура документа, автоматизация издательского процесса.

5
Лекции

Л е к ц и я 1. Сеанс работы в Linux 11


Л е к ц и я 2. Терминал и командная строка 29
Л е к ц и я 3. Структура файловой системы 51
Л е к ц и я 4. Работа с файловой системой 63
Л е к ц и я 5. Доступ процессов к файлам и каталогам 79
Л е к ц и я 6. Права доступа 95
Л е к ц и я 7. Работа с текстовыми д а н н ы м и 109
Л е к ц и я 8. Возможности командной оболочки 129
Л е к ц и я 9. Текстовые редакторы 154
Л е к ц и я 10. Этапы загрузки системы 177
Л е к ц и я 11. Работа с в н е ш н и м и устройствами 204
Л е к ц и я 12. К о н ф и г у р а ц и о н н ы е ф а й л ы 227
Л е к ц и я 13. Управление пакетами 249
Л е к ц и я 14. Сеть T C P / I P в Linux 268
Л е к ц и я 15. Сетевые и серверные возможности 290
Л е к ц и я 16. Графический интерфейс (X11) 317
Л е к ц и я 17. Прикладные программы 346
Л е к ц и я 18. Политика свободного лицензирования.
История Linux: от ядра к дистрибутивам 365

6
Содержание

Л е к ц и я 1. Сеанс работы в Linux 11


Пользователи системы 11
Регистрация в системе 17
Одновременный доступ к системе 22
Простейшие команды 25
Выход из системы 27
Л е к ц и я 2. Терминал и командная строка 29
Терминал 29
Командная строка 33
Подсистема п о м о щ и 34
Ключи 42
Интерпретатор командной строки (shell) 46
Л е к ц и я 3. Структура файловой системы 51
Организация файловой системы 51
Размещение компонентов системы: стандарт F H S 58
Л е к ц и я 4. Работа с файловой системой 63
Текущий каталог 63
Д о м а ш н и й каталог 65
И н ф о р м а ц и я о каталоге 66
Перемещение по дереву каталогов 69
Создание каталогов 70
К о п и р о в а н и е и перемещение файлов 71
Файл и его имена: ссылки 72
Удаление файлов и каталогов 77
Л е к ц и я 5. Доступ процессов к файлам и каталогам 79
Процессы 79
Доступ к файлу и каталогу 87
Л е к ц и я 6. Права доступа 95
Права доступа в файловой системе 95
Использование прав доступа в Linux 101
Л е к ц и я 7. Работа с текстовыми д а н н ы м и 109
Ввод и вывод 109
Перенаправление ввода и вывода 111

7
Обработка данных в потоке 117
П р и м е р ы задач 121
Л е к ц и я 8. Возможности командной оболочки 129
Редактирование ввода 129
Генерация и м е н файлов 136
Окружение 140
Я з ы к программирования sh 145
Настройка командного интерпретатора 150
Л е к ц и я 9. Текстовые редакторы 154
Задача текстовых редакторов 154
V i и лучше, чем V i 156
Лучше, чем Emacs? 168
Просто текстовые редакторы 175
Л е к ц и я 10. Этапы загрузки системы 177
Досистемная загрузка 177
Загрузка систетемы 188
Останов системы 201
Л е к ц и я 11. Работа с в н е ш н и м и устройствами 204
Представление устройства в системе 204
Разметка диска и именование устройств 211
Файловая система 215
Л е к ц и я 12. К о н ф и г у р а ц и о н н ы е ф а й л ы 227
Проектирование свойств системы 227
Л е к ц и я 13. Управление пакетами 249
Пакеты 249
Зависимости 257
Установщики пакетов 260
Менеджеры пакетов 262
Контроль целостности 264
Л е к ц и я 14. Сеть T C P / I P в Linux 268
Сетевые протоколы. Семейство протоколов T C P / I P 268
Аппаратный и интерфейсный уровни 272
Сетевой уровень 274
Транспортный уровень 280
Прикладной уровень 281

8
Л е к ц и я 15. Сетевые и серверные возможности 290
Настройка сети 290
Сетевые службы 306
Л е к ц и я 16. Графический интерфейс (X11) 317
Графический интерфейс в Linux 317
X Window System 320
X-приложения 331
Л е к ц и я 17. П р и к л а д н ы е программы 346
Рабочий стол 347
Сеть 350
О ф и с н ы е программы 353
Мультимедиа 358
Издательские системы 363
Нельзя объять необъятное 364
Л е к ц и я 18. Политика свободного лицензирования.
История Linux: от ядра к дистрибутивам 365
История возникновения свободного П О 365
История Linux 378

9
Внимание!
На сайте Интернет-университета информационных
технологий Вы можете пройти тестирование по
каждой лекции и курсу в целом.
Добро пожаловать на наш сайт:
www.intuit.ru

10
Лекция 1 Сеанс работы в Linux

Лекция 1. Сеанс работы в Linux

В лекции описан сеанс работы пользователя в Linux: от регистрации в


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

Ключевые слова: account, G I D , U I D , администратор, виртуальная


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

Пользователи системы

Прежде, чем система будет готова к работе с пользователем, проис¬


ходит процедура загрузки системы. В процессе загрузки будет запущена
основная управляющая программа (ядро), определено и и н и ц и а л и з и р о ­
вано имеющееся оборудование, активизированы сетевые соединения, за­
пущены системные службы. В Linux во время загрузки на экран выводят­
ся диагностические сообщения о происходящих событиях, и если все в
порядке и не возникло никаких о ш и б о к , загрузка завершится выводом на
э к р а н приглашения " l o g i n : " . Оно может выглядеть по-разному, в зави­
симости от настройки системы: может отображаться в красиво оформ¬
л е н н о м о к н е или в виде простой текстовой строки вверху экрана. Это
приглашение к регистрации в системе: система ожидает, что в ответ на это
приглашение будет введено входное имя пользователя, который начинает
работу. Естественно, имеет смысл вводить такое и м я , которое уже извест­
но системе, чтобы она могла «узнать», с кем предстоит работать — выпол­
нять команды неизвестного пользователя Linux откажется.

11
Курс Операционная система Linux

Многопользовательская модель разграничения доступа

Процедура регистрации в системе для Linux обязательна: работать в


системе, не зарегистрировавшись под тем или и н ы м и м е н е м пользовате¬
ля, просто невозможно*. Для каждого пользователя определена сфера его
полномочий в системе: программы, которые он может запускать, ф а й л ы ,
которые он имеет право просматривать, изменять, удалять. П р и попытке
сделать что-то, выходящее за рамки п о л н о м о ч и й , пользователь получит
сообщение об ошибке. Такая строгость может показаться и з л и ш н е й , если
пользователи компьютера доверяют друг другу, и особенно если у к о м ­
пьютера только один пользователь. Эта ситуация очень распространена в
настоящее время, когда слово «компьютер» означает в первую очередь
«персональный компьютер».
Однако персональный компьютер — довольно-таки позднее я в л е н и е в
мире вычислительной техники, получившее ш и р о к о е распространение
только в последние два десятилетия. Раньше слово «компьютер» ассоци­
ировалось с огромным и дорогостоящим (занимавшим целые залы) в ы ­
числительным центром, предназначенным в первую очередь для р е ш е н и я
разного рода научных задач. М а ш и н н о е время такого центра стоит очень
недешево, и при этом его возможности необходимы одновременно мно¬
гим сотрудникам, которые могут ничего не знать о работе друг друга. Тре¬
буется следить за тем, чтобы не произошло случайного вмешательства
пользователей в чужую работу и повреждения данных (файлов), выделять
каждому м а ш и н н о е время (по возможности избежав простаивания) и
пространство на диске и при этом не допускать захвата всех ресурсов од¬
н и м пользователем и его задачей, а равномерно распределять ресурсы
между всеми. Для такой системы п р и н ц и п и а л ь н о важно знать, кому при¬
надлежат задачи и ф а й л ы , поэтому и возникла необходимость предостав¬
лять доступ к ресурсам системы только после того, как пользователь заре­
гистрируется в системе под тем или и н ы м именем.
Такая модель была реализована в многопользовательской операцион­
ной системе U N I X . И м е н н о от нее Linux — также многопользовательская
система — унаследовала п р и н ц и п ы работы с пользователями. Н о это не
просто дань традиции или стремление к универсальности: многопользо¬
вательская модель позволяет решить ряд задач, весьма актуальных и для
современных персональных компьютеров, и для серверов, работающих в
локальных и глобальных сетях, и вообще в любых системах, одновремен­
но в ы п о л н я ю щ и х разные задачи, за которые отвечают разные люди.

* В м е с т о ф о р м а л ь н о г о « з а р е г и с т р и р о в а т ь с я в системе» о б ы ч н о и с п о л ь з у ю т в ы р а ж е н и е
« в о й т и в систему». О п е р а ц и о н н а я с и с т е м а п р е д с т а в л я е т с я ч е м - т о вроде з а м к н у т о г о п о м е ­
щ е н и я , в н у т р и к о т о р о г о м о ж н о о к а з а т ь с я , т о л ь к о у с п е ш н о п р о н и к н у в через «дверь» —
пройдя процедуру регистрации.

12
Лекция 1 Сеанс работы в Linux

Компьютер — это всего л и ш ь инструмент для р е ш е н и я разного рода


прикладных задач: от набора и распечатывания текста до вычислений.
Сложность состоит в том, что для изменения этого инструмента и для ра­
боты с его п о м о щ ь ю используются одни и те ж е операции: изменение
файлов и в ы п о л н е н и е программ. Получается, что, если не соблюдать ос¬
торожность, побочным результатом работы может стать выход системы из
строя. Поэтому первоочередная задача для систем любого масштаба —
разделять повседневную работу и изменение самой системы. В м н о г о ­
пользовательской модели эта задача решается очень просто: разделяются
«обычные» пользователи и администратор(ы). В полномочия обычного
пользователя входит все необходимое для в ы п о л н е н и я прикладных задач,
попросту говоря, для работы, однако ему запрещено выполнять действия,
и з м е н я ю щ и е саму систему. Таким образом м о ж н о избежать повреждения
системы в результате о ш и б к и пользователя (нажал не ту кнопку) или
о ш и б к и в программе, или даже по злому умыслу (например, вредитель¬
ской программой-вирусом). П о л н о м о ч и я администратора обычно не ог¬
раничены.
Для персонального компьютера, с которым работают несколько че¬
ловек, важно обеспечить каждому пользователю независимую рабочую
среду. Это снижает вероятность случайного повреждения чужих данных, а
также позволяет каждому пользователю настроить в н е ш н и й вид рабочей
среды по своему вкусу и, например, сохранить расположение открытых
о к о н между сеансами работы. Эта задача очевидным образом решается в
многопользовательской модели: организуется домашний каталог, где хра­
нятся д а н н ы е пользователя, настройки внешнего вида и поведения его
системы и т. п., а доступ остальных пользователей к этому каталогу огра­
ничивается.
Если компьютер подключен к глобальной или локальной сети, то
вполне вероятно, что какую-то часть хранящихся на нем ресурсов имеет
смысл сделать публичной и доступной по сети. И напротив, часть данных,
скорее всего, делать публичными не следует (например, личную перепис¬
ку). Ограничив доступ пользователей к персональным д а н н ы м друг друга,
м ы р е ш и м и эту задачу.
И м е н н о благодаря гибкости многопользовательской модели разгра­
н и ч е н и я доступа она используется сегодня не только на серверах, но и на
д о м а ш н и х персональных компьютерах. В самом простом варианте — для
персонального компьютера, на котором работает только один человек —
эта модель сводится к двум пользователям: обычному пользователю для
повседневной работы и администратору — для настройки, обновления,
д о п о л н е н и я системы и исправления неполадок. Н о даже в таком сокра­
щ е н н о м варианте это дает целый ряд преимуществ.

13
Курс Операционная система Linux

Учетные записи

К о н е ч н о , система может быть «знакома» с человеком только в пере¬


н о с н о м смысле: в н е й должна храниться запись о пользователе с таким
именем и о связанной с н и м системной и н ф о р м а ц и и — учетная запись.
Английский эквивалент термина учетная запись — account, «счет». И м е н ­
но с учетными записями, а н е с самими пользователями, и работает сис¬
тема. В действительности, соотношение учетных записей и пользователей
в Linux обычно н е является однозначным: несколько человек могут ис¬
пользовать одну учетную запись — система н е может их различить. И в то
ж е время в Linux имеются учетные записи для системных пользователей,
от имени которых работают некоторые программы, н о не люди.

учетная запись, account


Объект системы, при п о м о щ и которого Linux ведет учет работы
пользователя в системе. Учетная запись содержит д а н н ы е о
пользователе, необходимые для регистрации в системе и даль¬
нейшей работы с ней.

Учетные записи могут быть созданы во время установки системы или


после установки. Подробно процедура создания учетных записей (добав­
л е н и я пользователей) описана в лекции 12.
Главное для человека в учетной записи — ее название, входное имя
пользователя. И м е н н о о нем спрашивает система, когда выводит пригла­
ш е н и е " l o g i n : " . П о м и м о входного и м е н и в учетной записи содержатся
некоторые сведения о пользователе, необходимые системе для работы с
н и м . Н и ж е приведен с п и с о к этих сведений.

входное имя, login name


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

Идентификатор пользователя

Linux связывает входное имя c идентификатором пользователя в систе­


ме — UID (User ID). UID — это положительное целое число, п о которому
система и отслеживает пользователей*. Обычно это число выбирается ав¬
томатически при регистрации учетной записи, однако оно н е может быть
произвольным. В Linux есть некоторые соглашения относительно того,

* Э т о м о ж е т о к а з а т ь с я в а ж н ы м , н а п р и м е р , в т а к о й с и т у а ц и и : учетную з а п и с ь п о л ь з о в а т е ­
л я с и м е н е м test у д а л и л и и з с и с т е м ы , а п о т о м д о б а в и л и с н о в а . О д н а к о с т о ч к и з р е н и я с и ­
с т е м ы э т о уже другой п о л ь з о в а т е л ь , п о т о м у ч т о у н е г о д р у г о й U I D .

14
Лекция 1 Сеанс работы в Linux

к а к и м типам пользователей могут быть выданы идентификаторы из того


или иного диапазона. В частности, UID от "0" до "100" зарезервирова­
н ы для псевдопользователей*.

идентификатор пользователя, UID


Уникальное число, однозначно идентифицирующее учетную
запись пользователя в Linux. Таким числом снабжены все про­
цессы Linux и все объекты файловой системы. Используется для
персонального учета действий пользователя и определения прав
доступа к другим объектам системы.

Идентификатор группы

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


сью связан идентификатор группы. Группы пользователей применяются для
организации доступа нескольких пользователей к некоторым ресурсам. У
группы, так же, как и у пользователя, есть имя и идентификационный н о ­
мер — GID (Group ID). В Linux пользователь должен принадлежать как м и ­
нимум к одной группе — группе по умолчанию. П р и создании учетной запи­
си пользователя обычно создается и группа, имя которой совпадает с вход­
ным именем**, именно эта группа будет использоваться как группа по
умолчанию для данного пользователя. Пользователь может входить более
чем в одну группу, но в учетной записи указывается только номер группы
по умолчанию.

Полное имя

П о м и м о входного имени в учетной записи содержится и полное имя


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

Домашний каталог

Ф а й л ы всех пользователей в Linux хранятся раздельно, у каждого


пользователя есть собственный домашний каталог, в котором он может
хранить свои данные. Доступ других пользователей к домашнему катало¬
гу пользователя может быть ограничен. И н ф о р м а ц и я о д о м а ш н е м катало­
ге обязательно должна присутствовать в учетной записи, потому что
* О б ы ч н о L i n u x в ы д а е т н о р м а л ь н ы м п о л ь з о в а т е л я м U I D , н а ч и н а я с "500" и л и "1000 ".
** К а к п р а в и л о , ч и с л е н н о е з н а ч е н и е G I D в э т о м случае совпадает со з н а ч е н и е м U I D .

15
Курс Операционная система Linux

и м е н н о с него начинает работу пользователь, зарегистрировавшийся в


системе.

Командная оболочка

Каждому пользователю нужно предоставить способ взаимодействия


с системой: передача ей команд и получение от нее ответов. Для этой цели
служит специальная программа — командная оболочка (или интерпретатор
командной строки). Она должна быть запущена для каждого пользователя,
который зарегистрировался в системе. Поскольку в Linux доступно не¬
сколько разных интерпетаторов командной строки, в учетной записи ука¬
зано, какой из них нужно запустить для данного пользователя. Если спе¬
циально не указывать командную оболочку при создании учетной записи,
она будет назначена по умолчанию, вероятнее всего это будет bash.

интерпретатор командной строки, командный интерпретатор,


командная оболочка, оболочка
Программа, используемая в Linux для организации «диалога»
человека и системы. К о м а н д н ы й интерпретатор имеет три ос¬
новных ипостаси: (1) редактор и анализатор команд в команд¬
ной строке, (2) высокоуровневый системно-ориентированный
я з ы к программирования, (3) средство организации взаимодей­
ствия команд друг с другом и с системой.

Понятие «администратор»

В Linux есть только один пользователь, полномочия которого в с и с ­


теме п р и н ц и п и а л ь н о отличаются от п о л н о м о ч и й остальных пользовате­
лей — это пользователь с идентификатором " 0 " . Обычно учетная запись
пользователя с U I D = 0 называется r o o t (англ., «корень»). Пользователь
r o o t — это «администратор» системы Linux, учетная запись для r o o t
обязательно присутствует в любой системе Linux, даже если в ней нет ни¬
каких других учетных записей. Пользователю с таким U I D разрешено вы¬
полнять любые действия в системе, а значит, любая ошибка или непра¬
вильное действие может повредить систему, уничтожить д а н н ы е и приве¬
сти к другим печальным последствиям. Поэтому категорически не р е к о ­
мендуется регистрироваться в системе под именем r o o t для повседнев­
ной работы. Работать в r o o t следует только тогда, когда это действитель¬
но необходимо: при настройке и обновлении системы или восстановле¬
н и и после сбоев.
И м е н н о r o o t обладает достаточными п о л н о м о ч и я м и для создания
новых учетных записей.

16
Лекция 1 Сеанс работы в Linux

Регистрация в системе

Вернемся теперь к н а ш е й загруженной о п е р а ц и о н н о й системе


Linux, к о т о р а я п о - п р е ж н е м у ожидает ответа на свое п р и г л а ш е н и е
" l o g i n : " . Если система настроена таким образом, что это приглашение
оформлено в виде графического окна в центре экрана, следует нажать
к о м б и н а ц и ю клавиш C t r l + A l t + F 1 — произойдет переключение видео­
режима и на экране на черном ф о н е появится примерно следующий
текст:

Welcome t o Some L i n u x / ttyl

localhost login:

Пример 1.1. Начальное приглашение к регистрации

М ы переключились в так называемый текстовый режим, в котором


н а м недоступны возможности графических интерфейсов: рисование о к о н
произвольной ф о р м ы и размера, поддержка миллионов цветов, отрисов-
ка изображений. Все возможности текстового режима ограничены набо¬
р о м текстовых и псевдографических символов и несколькими десятками
базовых цветов. Однако в Linux в текстовом режиме м о ж н о выполнять
практически любые действия в системе (кроме тех, которые требуют н е ­
посредственного просмотра изображений). Текстовый режим в Linux —
это п о л н о ф у н к ц и о н а л ь н ы й способ управления системой. В различных
реализациях Linux работа в графическом режиме может выглядеть п о -
разному*, более того, графический режим может быть даже недоступен
после установки системы без специальной настройки. Текстовый ж е ре¬
ж и м доступен в любой реализации Linux и всегда выглядит практически
одинаково. И м е н н о поэтому все дальнейшие примеры и упражнения м ы
будем рассматривать и выполнять в текстовом режиме, возможностей к о ­
торого будет достаточно для освоения излагаемого в курсе материала.
Первая строка в примере — это просто приглашение, она носит и н ­
ф о р м а ц и о н н ы й характер. Существует очень много различных реализаций
Linux (называемых дистрибутивами, они будут обсуждаться в л е к ц и и 18),
и в каждом из них принят свой формат первой строки приглашения, хотя
почти наверняка там будет указано, с какой и м е н н о версией Linux поль¬
зователь имеет дело, и, возможно, будут присутствовать еще некоторые
параметры. В н а ш и х примерах м ы будем использовать условную реализа¬
ц и ю Linux — «Some Linux».

* Р а з н о о б р а з и е г р а ф и ч е с к и х и н т е р ф е й с о в L i n u x г о р а з д о в ы ш е , ч е м , н а п р и м е р , в Windows,
п о э т о м у составить у ч е б н ы й к у р с , н е о р и е н т и р у я с ь с п е ц и а л ь н о н а ту и л и и н у ю в е р с и ю ,
просто невозможно.

17
Курс Операционная система Linux

Вторая строка начинается с имени хоста — собственного имени систе­


мы, установленной на данном компьютере. Это имя существенно в том
случае, если компьютер подключен к локальной или глобальной сети, если
ж е он ни с кем более не связан, оно может быть любым. Обычно имя хоста
определяется уже при установке системы, однако в нашем случае использу­
ется вариант по умолчанию — " l o c a l h o s t " . Заканчивается эта строка
собственно приглашением к регистрации в системе — словом " l o g i n : " .
Теперь понятно, что в ответ на д а н н о е приглашение м ы д о л ж н ы вве­
сти входное имя, для которого есть соответствующая учетная запись в сис¬
теме. В правильно установленной операционной системе Linux должна
существовать как м и н и м у м одна учетная запись для обычного пользовате­
ля. Во всех дальнейших примерах у нас будет участвовать М е ф о д и й К а ­
ш и н , владелец учетной записи "methody" в системе «Some Linux». Вы
можете пользоваться для в ы п о л н е н и я примеров любой учетной записью,
которая создана в Вашей системе (естественно, к р о м е r o o t ) .
Итак, М е ф о д и й вводит свое входное и м я в ответ на приглашение с и ­
стемы:

Welcome t o Some L i n u x / ttyl

localhost login: Methody

Password:

Login incorrect

login:

Пример 1.2. Регистрация в системе

В ответ на это система запрашивает пароль. Пароль Мефодия нам не¬


известен, поскольку он его никому не говорит. Когда Мефодий вводил свой
пароль, на экране монитора он не отображался (это сделано, чтобы пароль
нельзя было подсмотреть), однако Мефодий точно знает, что не сделал опе¬
чатки. Тем не менее, система отказала ему в регистрации, выдав сообщение
об ошибке ( " L o g i n i n c o r r e c t " ) . Если ж е внимательно посмотреть на
введенное имя пользователя, можно заметить, что оно начинается с заглав­
ной буквы, в то время как учетная запись называется "methody". Linux все¬
гда делает различие между заглавными и строчными буквами, поэтому
"Methody " для него — уже другое имя. Теперь Мефодий повторит попытку:

login: methody

Password:

[methody@localhost methody]$

Пример 1.3. Успешная регистрация в системе

18
Лекция 1 Сеанс работы в Linux

На этот раз регистрация прошла успешно, о чем свидетельствует п о ­


следняя строка примера — приглашение командной строки. Приглашение —
это подсказка, выводимая командной оболочкой и свидетельствующая о
том, что система готова принимать команды пользователя. Приглашение
может быть оформлено по-разному, более того, пользователь может сам
управлять видом приглашения (подробнее это будет рассмотрено в лек­
ц и и 7), н о почти наверняка в приглашении содержатся входное имя и имя
хоста — в н а ш е м примере это "methody" и " l o c a l h o s t " соответствен­
но. Заканчивается приглашение ч а щ е всего символом " $ " . Это командная
строка, в которой будут отображаться все введенные пользователем с кла­
виатуры команды, а при нажатии на клавишу Enter содержимое к о м а н д ­
н о й строки будет передано для исполнения системе.

Идентификация (authentication)
Когда система выводит на э к р а н приглашение командной строки
после правильного введения и м е н и пользователя и пароля, это означает,
что произошла идентификация пользователя (authentication, «проверка
подлинности»). Пароль может показаться и з л и ш н е с л о ж н ы м , н о у систе­
м ы нет другого способа удостовериться, что за монитором находится
и м е н н о тот человек, который имеет право на использование д а н н о й учет¬
н о й записи.
Конечно, процедура идентификации имеет очевидное значение для
систем, к которым имеют непосредственный или сетевой доступ многие
не связанные друг с другом пользователи. Процедура идентификации га¬
рантирует, что к такой системе н е получит доступ случайный человек, не
и м е ю щ и й права использовать ее ресурсы и хранящуюся в ней информа¬
цию. Одновременно она дает определенную гарантию защиты от злонаме¬
ренного вмешательства: даже если навредить попытается пользователь,
и м е ю щ и й учетную запись, его действия будут зарегистрированы в системе
(поскольку системе всегда известно, от имени какой учетной записи вы¬
полняются те или иные действия), и злоумышленника можно будет найти.
Для тех пользователей, которым процедура идентификации кажется
утомительной и необязательной (например, единственным пользовате­
лям персональных компьютеров), существует возможность получить д о ­
ступ к системе, минуя процедуру идентификации. Д л я этого применяется
программа a u t o l o g i n . Она предоставляет доступ к работе с графичес­
к и м интерфейсом сразу после загрузки системы, н е запрашивая и м я
пользователя и пароль. В действительности, a u t o l o g i n запускает все
программы от и м е н и одного пользователя, зарегистрированного в систе¬
ме. Н а п р и м е р , М е ф о д и й мог бы использовать свою учетную запись
m e t h o d y для автоматического входа в систему. Однако у этого подхода
есть свои минусы:

19
Курс Операционная система Linux

• Невозможно определить, кто, что и когда делал в системе, потому


что все реальные пользователи работают с одной учетной записью,
то есть с точки зрения системы все о н и — один и тот же пользователь.
• Вся личная и н ф о р м а ц и я этого пользователя становится достоянием
общественности.
• Пароль легко забывается (пароль все равно есть у любого пользова­
теля), потому что его не нужно вводить каждый день. П р и этом
autologin дает доступ только человеку, сидящему перед монитором, и
только к работе с графическим интерфейсом. Если ж е потребуется,
например, скопировать ф а й л ы с данного компьютера по сети, па¬
роль все равно придется вводить.
Учитывая все перечисленные минусы, м о ж н о заключить, что и с ­
пользовать a u t o l o g i n разумно только в тех системах, которые не под¬
ключены к локальной или глобальной сети, и к которым при этом открыт
публичный доступ (например, в библиотеке).

Смена пароля

Если учетная запись была создана не самим пользователем, а адми¬


нистратором многопользовательской системы (скажем, администрато¬
р о м компьютерного класса), скорее всего, был выбран тривиальный па¬
роль с тем расчетом, что пользователь его изменит при первом ж е входе в
систему. Распространены тривиальные пароли "123 456", "empty" и т.
п. Поскольку пароль — это единственная гарантия, что вашей учетной за­
писью не воспользуется никто, кроме вас, есть смысл выбирать в качест­
ве пароля неочевидные последовательности символов. В Linux нет суще­
ственных ограничений на длину пароля или входящие в него символы (в
частности, использовать пробел можно), но нет смысла делать пароль
с л и ш к о м д л и н н ы м — велика вероятность его забыть. Надежность паролю
придает его непредсказуемость, а не длина. Н а п р и м е р , пароль, представ¬
л я ю щ и й собой и м я пользователя или повторяющий название его учетной
записи, очень предсказуем. Н а и м е н е е предсказуемы пароли, представляю¬
щ и е собой случайную к о м б и н а ц и ю прописных и строчных букв, ц и ф р ,
знаков п р е п и н а н и я , но их и труднее всего запомнить.
Пользователь может в любой момент поменять свой пароль. Единст­
венное, что требуется для смены пароля — знать текущий пароль. Допус­
тим, М е ф о д и й придумал более удачный пароль и решил его поменять. О н
уже зарегистрирован в системе, поэтому ему нужно только набрать в ко¬
мандной строке команду p a s s w d и нажать Enter.

[ m e t h o d y @ l o c a l h o s t methody]$ passwd

C h a n g i n g password f o r methody.

20
Лекция 1 Сеанс работы в Linux

Enter current password:

You c a n now c h o o s e t h e new password o r p a s s p h r a s e .

A v a l i d password should be a mix o f u p p e r and l o w e r c a s e l e t t e r s , dig¬

its, and o t h e r c h a r a c t e r s . You c a n u s e an 8 c h a r a c t e r l o n g password with

characters from a t l e a s t 3 of these 4 classes, or a 7 character long

password c o n t a i n i n g c h a r a c t e r s f r o m a l l t h e c l a s s e s . An u p p e r c a s e let¬

ter that begins t h e password and a d i g i t t h a t ends i t do n o t c o u n t

towards t h e number o f c h a r a c t e r classes used.

A passphrase should be o f a t l e a s t 3 words, 12 t o 4 0 c h a r a c t e r s long and

c o n t a i n enough d i f f e r e n t characters.

Alternatively, i f noone e l s e c a n see y o u r t e r m i n a l now, you c a n p i c k

this as y o u r p a s s w o r d : "spinal&state:buy".

Enter new password:

Пример 1.4. Смена пароля

Набрав в командной строке " p a s s w d " , М е ф о д и й запустил програм­


му p a s s w d , которая предназначена и м е н н о для замены и н ф о р м а ц и и о
пароле в учетной записи пользователя. Она вывела приглашение ввести
текущий пароль ( " E n t e r c u r r e n t p a s s w o r d " ) , а затем, в ответ на пра¬
вильно введенный пароль, предложила подсказку относительно грамот¬
ного составления пароля и даже вариант надежного пароля, который М е -
фодий вполне может использовать, если никто в д а н н ы й момент не видит
его монитора. П р и каждом запуске p a s s w d генерирует н о в ы й случайный
пароль и предлагает его пользователю. Однако М е ф о д и й не воспользо¬
вался подсказкой и придумал пароль сам:

Enter new password:

Weak p a s s w o r d : n o t enough d i f f e r e n t characters or classes f o r this

length.

Try again.

Enter new password:

Пример 1.5. Смена пароля (продолжение)

21
Курс Операционная система Linux

В д а н н о м случае операция н е удалась, поскольку с точки зрения


passwd пароль, придуманный Мефодием, оказался с л и ш к о м простым*. В
следующий раз ему придется ввести более сложный пароль. p a s s w d за­
прашивает новый пароль дважды, чтобы удостовериться, что в первый раз
не было опечатки, и если все в порядке, выведет сообщение о том, что
операция смены пароля прошла успешно, а затем завершит работу, вернув
М е ф о д и ю приглашение командной строки:

E n t e r new password:

R e - t y p e new password:

passwd: A l l a u t h e n t i c a t i o n tokens updated s u c c e s s f u l l y

[methody@localhost methody]$

Пример 1.6. Пароль изменен

Придирчивость, с которой p a s s w d относится к паролю пользовате­


ля, н е случайна. Пароль пользователя — одно из самых важных и зачастую
одно и з самых слабых мест безопасности системы. Отгадавший пароль
пользователя (причем н е имеет значения, сделал это человек и л и п р о ­
грамма) получит доступ к ресурсам системы ровно в том объеме, в кото­
р о м о н предоставляется пользователю, сможет читать и удалять ф а й л ы и
т. п. Особенно это важно в случае пароля администратора, потому что его
полномочия в системе гораздо шире, а действия от его и м е н и могут п о ­
вредить и саму систему. Обычному пользователю в некоторых обстоятель­
ствах также могут быть переданы полномочия администратора (этот в о ­
прос будет подробно обсуждаться в л е к ц и и 4), в таком случае н е менее
важно, чтобы и его пароль был надежным.
Пароль пользователя root изначально назначается при установке си¬
стемы, однако о н может быть изменен в любой момент впоследствии точ¬
но так ж е , к а к и пароль обычного пользователя.

Одновременный доступ к системе

То, что Linux — многопользовательская и многозадачная система,


проявляется н е только в разграничении прав доступа, н о и в организации
рабочего места. Каждый компьютер, на котором работает Linux, предо¬
ставляет возможность зарегистрироваться и получить доступ к системе
нескольким пользователям одновременно. Д а ж е если в распоряжении
всех пользователей есть только один монитор и одна системная клавиату­
ра, эта возможность небесполезна: одновременная регистрация в системе
* В р а з н ы х д и с т р и б у т и в а х L i n u x и с п о л ь з у ю т с я р а з н ы е в е р с и и п р о г р а м м ы passwd, п о э т о ­
м у н е всегда о н а будет столь п р и д и р ч и в а , к а к в д и с т р и б у т и в е М е ф о д и я .

22
Лекция 1 Сеанс работы в Linux

нескольких пользователей позволяет работать по очереди без необходи¬


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

Виртуальные консоли

Характерный для Linux способ организации параллельной работы


пользователей — виртуальные консоли.
Допустим, М е ф о д и й хочет зарегистрироваться в системе еще раз,
чтобы иметь возможность следить за выполнением двух программ одно¬
временно. Он может сделать это, не покидая текстового режима: доста­
точно нажать к о м б и н а ц и ю клавиш Alt+F2, и на экране появится новое
приглашение к регистрации в системе:

Welcome t o Some L i n u x / tty2

localhost l o g i n : methody

Password:

[methody@localhost methody]$

Пример 1.7. Вторая виртуальная консоль

М е ф о д и й ввел свой н о в ы й пароль и получил приглашение команд¬


н о й строки, аналогичное тому, которое м ы уже видели в предыдущих при¬
мерах. Нажав к о м б и н а ц и ю клавиш Alt+F1, М е ф о д и й вернется к только
что покинутой и м командной строке, в которой о н в ы п о л н я л команду
p a s s w d для смены пароля. П р и г л а ш е н и е в обоих случаях выглядит оди­
наково, и это не случайно — обе к о м а н д н ы е строки предоставляют э к в и ­
валентный доступ к системе, в любой из них м о ж н о выполнять все до¬
ступные команды.
Наблюдательный М е ф о д и й обратил внимание, что в последнем при¬
мере (1.7) первая строка приглашения оканчивается словом " t t y 2 " .
" t t y 2 " — это обозначение второй виртуальной консоли. М о ж н о переклю­
чаться между виртуальными консолями так, как если бы вы переходили
от одного монитора с клавиатурой к другому, подавая время от времени
команды и следя за в ы п о л н я ю щ и м и с я программами. П о умолчанию в
Linux доступно не менее шести виртуальных консолей, переключаться
между которыми м о ж н о при п о м о щ и сочетания к л а в и ш и A l t с одной из
функциональных клавиш (F1—F6). С каждым сочетанием связана соот-

23
Курс Операционная система Linux

ветствующая по номеру виртуальная консоль. Виртуальные консоли о б о ­


значаются " t t y N " , где "N" — номер виртуальной консоли.

виртуальная консоль, virtual console


Виртуальные консоли — это несколько параллельно выполняе­
мых о п е р а ц и о н н о й системой п р о г р а м м , п р е д о с т а в л я ю щ и х
пользователю возможность зарегистрироваться в системе в тек¬
стовом режиме и получить доступ к командной строке.

Во многих дистрибутивах Linux одна из виртуальных консолей по


умолчанию не может быть использована для регистрации пользователя,
однако она не менее, если не более полезна. Если М е ф о д и й нажмет
Alt+F12, он увидит консоль, заполненную множеством сообщений с и с ­
темы о происходящих событиях. В частности, там он может обнаружить
д в е з а п и с и о т о м , что в с и с т е м е з а р е г и с т р и р о в а н пользователь
"methody". На эту консоль выводятся сообщения обо всех важных собы­
тиях в системе: регистрации пользователей, в ы п о л н е н и и действий от
и м е н и администратора ( r o o t ) , п о д к л ю ч е н и и устройств и подгрузке
драйверов к н и м и многое другое.
П р и м е р двенадцатой виртуальной к о н с о л и показывает, что вирту¬
альные к о н с о л и — д о в о л ь н о г и б к и й механизм, поддерживаемый Linux,
п р и п о м о щ и которого м о ж н о решать р а з н ы е задачи, а н е только обеспе¬
чивать о р г а н и з а ц и ю одновременного доступа к системе. Д л я того чтобы
на виртуальной к о н с о л и п о я в и л о с ь п р и г л а ш е н и е l o g i n : после загрузки
системы, для каждой такой к о н с о л и д о л ж н а быть запущена программа
g e t t y . Попробуйте нажать Alt+F10 —вероятнее всего, вы увидите
просто ч е р н ы й э к р а н . Десятая виртуальная к о н с о л ь поддерживается с и ­
стемой, однако ч е р н ы й э к р а н означает, что для этой к о н с о л и не з а п у щ е ­
на н и к а к а я программа, поэтому воспользоваться ею н е удастся. Д л я ка­
ких и м е н н о к о н с о л е й будет запущена программа g e t t y — определяется
н а с т р о й к о й к о н к р е т н о й системы. Впоследствии эта настройка может
быть и з м е н е н а пользователем. О том, к а к это м о ж н о сделать, речь пой¬
дет в л е к ц и и 9.

Графические консоли

Впрочем, как н и ш и р о к и возможности текстового режима, Linux


и м и не ограничена. Подробно работа в графическом режиме будет разби¬
раться в последующих лекциях (см. лекцию 16). Сейчас важно заметить,
что если при загрузке системы приглашение " l o g i n : " было представле­
но в виде графического окна, м о ж н о вернуться к этому приглашению, н а ­
жав к о м б и н а ц и ю клавиш Ctrl+Alt+F7. Процедура регистрации здесь

24
Лекция 1 Сеанс работы в Linux

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


что после идентификации пользователя (правильно введенного и м е н и
пользователя и пароля) на экране появится не приглашение командной
строки, а графическая рабочая среда. К а к и м е н н о она будет выглядеть —
зависит от того, какая система используется и к а к она настроена.
К р о м е того, что несколько пользователей (или несколько «копий»
одного и того же пользователя) могут работать параллельно на разных
виртуальных консолях, они могут параллельно зарегистрироваться и ра¬
ботать в разных графических средах. Обычно в стандартно настроенной
Linux-системе м о ж н о организовать не менее трех графических консолей,
работающих одновременно. Переключаться между н и м и м о ж н о при п о ­
м о щ и сочетаний клавиш Ctrl+Alt+F7 — Ctrl+Alt+F9.
Чтобы переключиться из графического режима в одну из текстовых
виртуальных к о н с о л е й , д о с т а т о ч н о н а ж а т ь к о м б и н а ц и ю к л а в и ш
Ctrl+Alt+FN, где " N" — номер необходимой виртуальной консоли.

Простейшие команды

Работа в Linux при п о м о щ и командной строки напоминает диалог с


системой: пользователь вводит команды (реплики), получая от системы
ответные р е п л и к и , содержащие сведения о произведенных операциях,
дополнительные вопросы к пользователю, сообщения об ошибках или
просто согласие выполнить следующую команду*.
Простейшая команда в Linux состоит из одного «слова» — названия
п р о г р а м м ы , которую н е о б х о д и м о в ы п о л н и т ь . Одну такую к о м а н д у
(passwd) М е ф о д и й уже использовал для того, чтобы изменить свой па­
роль. Теперь М е ф о д и й решил вернуться на одну из виртуальных к о н с о ­
лей, на которой он зарегистрировался, и попробовать выполнить не¬
сколько простых команд:

[ m e t h o d y @ l o c a l h o s t methody]$ whoami

methody

[methody@localhost methody]$

Пример 1.8. Команда whoami

Название этой команды происходит от английского выражения


«Who am I?» («Кто я?»). В ответ на эту команду система вывела только од¬
* Р е п л и к и в т а к о м д и а л о г е строго ч е р е д у ю т с я , а с о б е с е д н и к и н е могут г о в о р и т ь о д н о в р е ­
м е н н о — в е с т е с т в е н н о м д и а л о г е т а к н и к о г д а н е происходит. С к о р е е э т о н а п о м и н а е т д и а ­
л о г в у ч е б н и к е и н о с т р а н н о г о я з ы к а . О д н а к о и в д и а л о г е с Linux у с о б е с е д н и к о в есть в о з ­
м о ж н о с т ь «перебить» друг друга — об э т о м р е ч ь п о й д е т в п о с л е д у ю щ и х л е к ц и я х .

25
Курс Операционная система Linux

но слово: «methody>> и завершила свою работу, о чем свидетельствует


вновь появившееся приглашение командной строки. Программа whoami
возвращает название учетной записи того пользователя, от и м е н и которо­
го она была выполнена. Эта команда полезна в системах, в которых рабо­
тает много разных пользователей, чтобы никто из них не мог по о ш и б к е
воспользоваться чужой учетной записью. Однако в приглашении к о м а н д ­
ной строки зачастую указывается и м я пользователя (как и в наших п р и ­
мерах), поэтому без команды whoami м о ж н о обойтись. Следующий п р и ­
мер демонстрирует программу, которая выдаст М е ф о д и ю уже больше п о ­
лезной и н ф о р м а ц и и : who («Кто»):

[ m e t h o d y @ l o c a l h o s t methody]$ who

methody ttyl Sep 23 16:31 (localhost)

methody tty2 Sep 23 17:12 (localhost)

[methody@localhost methody]$

[ m e t h o d y @ l o c a l h o s t methody]$ who am i

methody tty2 Sep 23 17:12 (localhost)

[methody@localhost methody]$

Пример 1.9. Команда who

Команда who выводит с п и с о к пользователей, которые в настоящий


момент зарегистрированы в системе (вошли в систему). Д а н н а я програм¬
ма выводит по одной строке на каждого зарегистрированного пользовате¬
ля: в первой к о л о н к е указывается имя пользователя, во второй — «точка
входа» в систему, далее следует дата и время регистрации и имя хоста. И з
выведенной who и н ф о р м а ц и и м о ж н о заключить, что в системе дважды
зарегистрирован пользователь methody, который сначала зарегистриро­
вался на первой виртуальной консоли ( t t y l ) , а примерно через сорок
минут — на второй ( t t y 2 ) . К о н е ч н о , М е ф о д и й и так это знает, однако ад¬
министратору больших систем, когда пользователи могут зарегистриро¬
ваться со многих компьютеров и даже по сети, программа who может быть
очень полезна. Могло создаться впечатление, что who — очень интеллек­
туальная программа, п о н и м а ю щ а я английский, но это не так. И з всех а н ­
глийских слов она понимает только сочетание «am i» — таким способом
М е ф о д и й узнал, за какой консолью о н сейчас работает.
Е щ е одна программа, выдающая и н ф о р м а ц и ю о пользователях, ра­
ботавших в системе в последнее время — l a s t * . Выводимые этой п р о ­
граммой строки напоминают вывод программы who, с той разницей, что
здесь перечислены и те пользователи, которые уже завершили работу:

* В некоторых Linux-системах эта программа может называться l a s t l o g .

26
Лекция 1 Сеанс работы в Linux

[ m e t h o d y @ l o c a l h o s t methody]$ last

methody tty2 localhost Thu Sep 23 17:12 still logged i n

methody tty1 localhost Thu Sep 23 16:31 still logged i n

cacheman ??? localhost Thu Sep 23 16:15 - 16:17 (00:01)

cacheman ??? localhost Thu Sep 23 16:08 - 16:08 (00:00)

cyrus ??? localhost Thu Sep 23 16:08 - 16:08 (00:00)

cyrus ??? localhost Thu Sep 23 16:08 - 16:08 (00:00)

reboot s y s t e m b o o t 2.4.2 6 - s t d - u p - a l Thu Sep 23 16:03 (04:13)

reboot system boot 2.4.26-std-up-al Thu Sep 23 16:03 (04:13)

Пример 1.10. Команда l a s t

В этом примере М е ф о д и й неожиданно обнаружил, к р о м е себя само­


го, неизвестных ему пользователей c a c h e m a n и c y r u s — он точно знает,
что не создавал учетных записей с такими именами. Это псевдопользова­
тели (или системные пользователи) — специальные учетные записи, кото­
р ы е используются некоторыми программами. Поскольку эти «пользова­
тели» регистрируются в системе без п о м о щ и монитора и клавиатуры, их
«точка входа» в систему не определена (во второй колонке записано
" ? ? ? " ) . В выводе п р о г р а м м ы l a s t п о я в л я е т с я д а ж е пользователь
r e b o o t (перезагрузка). В действительности такой учетной записи нет,
программа l a s t таким способом выводит и н ф о р м а ц и ю о том, когда бы¬
ла загружена система.

Выход из системы
В строках, выведенных программой l a s t , указан не только момент
регистрации пользователя в системе, но и момент завершения работы.
М о ж н о представить Linux как закрытое помещение: чтобы начать работу,
нужно сначала войти в систему (зарегистрироваться, пройти процедуру
и д е н т и ф и к а ц и и ) , а когда работа закончена, следует из системы выйти. В
том случае, если в систему вошло несколько пользователей, каждый из
них должен выйти, завершив работу, причем не имеет значения, разные
это пользователи или «копии» одного и того же.
Вход пользователя в систему означает, что нужно принимать и в ы ­
полнять его команды и возвращать ему отчеты о выполненных действиях,
например, предоставив ему интерфейс командной строки. Выход означа¬
ет, что работа от имени данного пользователя завершена и более не следу­
ет принимать от него команды. Весь процесс взаимодействия пользовате­
ля с системой от момента регистрации до выхода называется сеансом ра­
боты. Причем если пользователь входит в систему несколько раз под од­
н и м и тем ж е именем, ему будут доступны несколько разных сеансов ра­
боты, не связанных между собой.

27
Курс Операционная система Linux

В наших примерах М е ф о д и й зарегистрирован в системе дважды: на


первой и второй виртуальных консолях. Чтобы завершить работу на лю¬
бой из них, ему достаточно в соответствующей командной строке набрать
команду l o g o u t :

[ m e t h o d y @ l o c a l h o s t methody]$ logout

Welcome t o Some L i n u x / tty1

localhost login:

Пример 1.11. Команда l o g o u t

В ответ на эту команду вместо очередного приглашения командной


строки возобновляется приглашение к регистрации в системе. Н а д а н н о й
виртуальной консоли работа с Мефодием завершена, и теперь здесь сно¬
ва может зарегистрироваться любой пользователь.
Есть и другой, еще более «немногословный» способ сообщить систе¬
ме, что пользователь хочет завершить текущий сеанс работы. Нажав
Alt+F2, М е ф о д и й попадет на вторую виртуальную консоль, где все еще
открыт сеанс для пользователя "methody", и нажмет сочетание клавиш
Ctrl+D, чтобы прекратить и этот сеанс. Нажатие к о м б и н а ц и и клавиш
Ctrl+D приводит не к передаче компьютеру очередного символа, а к за­
крытию текущего входного потока данных. В сущности, командная о б о ­
лочка вводит команды пользователя с консоли, как если бы она читала их
построчно из файла. Нажатие Ctrl+D сигнализирует ей о том, что этот
«файл» закончился, и теперь ей неоткуда больше считывать команды. Та­
кой способ завершения аналогичен явному завершению командной обо¬
лочки командой l o g o u t .

28
Лекция 2 Терминал и командная строка

Лекция 2. Терминал и командная строка

В лекции описывается взаимодействие пользователя с системой по­


средством терминального устройства и интерпретатора командной строки.
Даются основные понятия интерфейса командной строки: команда, пара­
метр, разделитель, ключ. Кроме того, описывается устройство подсистем по­
мощи Linux С man и info С и способы их использования.

Ключевые слова: info menu, info node, R T F M , аббревиативность,


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

Терминал

К а к было показано в предыдущей л е к ц и и (1), основное средство об­


щ е н и я с Linux — системная клавиатура и э к р а н монитора, работающий в
текстовом режиме. Вводимый пользователем текст немедленно отобра¬
жается на мониторе соответствующими знаками, однако может и не ото­
бражаться, как в случае ввода пароля. Для управления вводом используют­
ся некоторые нетекстовые клавиши на клавиатуре: Backspace (он же
«Забой») — для удаления последнего введенного символа или Enter — для
передачи команды системе. Нажатие на эти клавиши не приводит к отоб¬
ражению символа, вместо этого вводимый текст обрабатывается систе¬
мой тем или и н ы м способом:

[ m e t h o d y @ l o c a l h o s t methody]$ data

-bash: d a t a : command n o t found

[ m e t h o d y @ l o c a l h o s t methody]$ date

Вск Сен 12 13:59:36 MSD 2 004

Пример 2.1. С о о б щ е н и е об о ш и б к е

Вначале М е ф о д и й ошибся, и вместо команды d a t e написал d a t a . В


ответ он получил сообщение об ошибке, поскольку такой команды система

29
Курс Операционная система Linux

не понимает. Затем (этого не видно в примере, но случилось и м е н н о так!)


он снова набрал d a t a , но вовремя одумался и, нажав клавишу Backspace,
удалил последнее «а», вместо которого ввел «е», превратив d a t a в d a t e .
Такая команда в системе есть, и на экране возникла текущая дата.
Диалог м а ш и н ы и пользователя неспроста выглядит как обмен текс­
тами. И м е н н о письменную речь используют люди для постановки и о п и ­
сания р е ш е н и я задач в заранее определенном, формализованном виде.
Поэтому и задача управления системой может целиком быть представле­
на и решена в виде формализованного текста — программы. П р и этом ма­
ш и н е отводится роль аккуратного исполнителя программы, а человеку —
роль автора. К р о м е того, человек анализирует текст, получаемый от сис¬
темы: запрошенную и м и н ф о р м а ц и ю и текст сообщения — текст, описыва­
ю щ и й состояние системы в процессе решения задачи (например, сооб­
щ е н и е об о ш и б к е «command not found»).
Текстовый п р и н ц и п работы с м а ш и н о й позволяет отвлечься от кон¬
кретных частей компьютера, вроде системной клавиатуры и видеокарты с
монитором, рассматривая единое оконечное устройство, посредством к о ­
торого пользователь вводит текст и передает его системе, а система выво­
дит необходимые пользователю д а н н ы е и сообщения. Такое устройство
называется терминалом. В общем случае терминал — это точка входа поль­
зователя в систему, обладающая способностью передавать текстовую и н ­
ф о р м а ц и ю . Терминалом может быть отдельное внешнее устройство, под¬
ключаемое к компьютеру через порт последовательной передачи данных
(в персональном компьютере он называется «COM port»). В роли терми¬
нала может работать (с некоторой поддержкой со стороны системы) и
программа (например, x t e r m или ssh). Н а к о н е ц , виртуальные консоли
Linux — тоже терминалы, только организованные программно с п о м о щ ь ю
подходящих устройств современного компьютера.

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

Для приема и передачи текста терминалу достаточно уметь п р и н и ­


мать и передавать символы, из которых этот текст состоит. Более того, же­
лательно чтобы единицей обмена с компьютером был и м е н н о один байт
(один acsii-символ). Тогда каждая буква, набранная на клавиатуре, может
быть передана системе для обработки, если понадобится. С другой сторо­
ны, т и п и ч н ы й способ управления системой в Linux — работа в командной
строке — требует построчного режима работы, когда н а б р а н н ы й текст п е -

30
Лекция 2 Терминал и командная строка

редается компьютеру только после нажатия клавиши Enter (что соответ­


ствует символу конца строки). Размер такой строки в байтах предугадать,
конечно, нельзя, поэтому терминал, работающий в построчном режиме,
ничем, по сути, не отличается от терминала, работающего в посимволь¬
н о м режиме — за исключением того, что активность системы по обработ¬
ке приходящих с этого терминала данных падает в несколько раз (обмен
ведется не байтами, а целыми строками).
Свойство терминала передавать только символьную информацию
приводит к тому, что некоторые из передаваемых символов должны вос¬
приниматься не как текстовые, а как управляющие (например, символы,
возвращаемые клавишами Backspace и Enter). На самом деле управляю­
щих символов больше: часть из них предназначена для экстренной переда­
ч и команд системе, часть — для редактирования вводимого текста. Многие
из этих символов не имеют специальной клавиши на клавиатуре, поэтому их
необходимо извлекать с помощью клавиатурного модификатора C t r l .

К о м а н д ы , подаваемые с клавиатуры с п о м о щ ь ю C t r l , как и


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

вместе с C t r l : например, одновременное нажатие C t r l и " a "


обозначается " А " . Л

Так, для завершения работы программы c a t , которая построчно


считывает д а н н ы е с клавиатуры и выводит их на терминал, м о ж н о вос¬
пользоваться командой " с " или " Б " : Л Л

[ m e t h o d y @ l o c a l h o s t methody]$ c a t

Any Text

Any Text
A
C

[ m e t h o d y @ l o c a l h o s t methody]$ c a t
A
Any Text agaim [[Dn

Any Text again


A
D

[methody@localhost methody]$

Пример 2.2. К а к завершить работу c a t ?

Одну строчку вида «Any Тех...» М е ф о д и й вводит с клавиатуры (что


отображается на экране), и после того, как М е ф о д и й нажмет Enter, она
немедленно выводится программой c a t (что тоже отображается на экра-

31
Курс Операционная система Linux

не). С каждой последующей строкой программа c a t поступила бы анало¬


гично, но в примере М е ф о д и й оба раза завершил работу программы, в
первом случае нажав " С " , а во втором — " D". К о м а н д ы оказали одина­
Л A

ковый эффект, но работают они по-разному: " с " посылает программе, Л

которая считывает с клавиатуры, сигнал аварийного п р е к р а щ е н и я рабо­


ты, а " Б " сообщает ей, что ввод данных с клавиатуры закончен и м о ж н о
Л

продолжать работу (поскольку программа c a t больше ничего не делает,


она завершается самостоятельно, естественным путем). М о ж н о считать,
что с " — это сокращение от «Cancel», а " D " — от «Done».
, , Л A

В примере не показано, как, набирая первый c a t , М е ф о д и й вновь


ошибся и написал c c a t вместо c a t . Чтобы исправить положение, он вос­
пользовался к л а в и ш а м и со стрелочками: с п о м о щ ь ю клавиши «Стрелка
влево» подвел курсор к одному из «c» и нажал Backspace, а затем
Enter. В режиме ввода команды это ему удалось, а при передаче данных
программе c a t клавиша «Стрелка влево» не сдвинула курсор, а пере¬
дала целую последовательность символов: " [ " , " [ " и "D". Дело в том, Л

что на клавиатуре терминала может быть так много разных нетекстовых


клавиш, что на них не хватает ограниченного количества разных управля¬
ющих символов. Поэтому большинство нетекстовых клавиш возвращают
так называемую управляющую последовательность, которая начинается
управляющим символом (как правило — Escape, т. е. " [ " ) , за которым Л

следует строго определенное число обычных символов (для к л а в и ш и


Стрелка влево — " [ " и "D" ).
То ж е самое м о ж н о сказать и о выводе управляющих последователь¬
ностей на терминал. С о в р е м е н н ы й терминал имеет довольно много
возможностей п о м и м о простого вывода текста: перемещать курсор по
всему экрану (чтобы вывести текст), удалять и вставлять строки на экра­
не, использовать цвет и т. п. Всем этим заведуют управляющие последо­
вательности, которые при выводе на э к р а н терминала не отображаются
как текст, а выполняются заранее заданным способом. В некоторых слу­
чаях управляющие последовательности, возвращаемые клавишами, сов­
падают с теми, что управляют поведением терминала. Поэтому-то М е ф о ­
д и й и не увидел "Any T e x t a g a i n ^ [ [ D n " в выдаче c a t : " [ [ D " при A

выводе на терминал перемещает курсор на одну п о з и ц и ю влево, так что


было выведено "Any T e x t a g a i m " , затем курсор встал п р я м о над "m" и
поверх него было выведено " n " . Если бы терминал имел вместо дисплея
печатающее устройство, в этом месте обнаружилось бы нечто, состоящее
из начертаний "m" и "n"*.
Требования к терминалу к а к к точке входа пользователя в систему
весьма невысоки. Формально говоря, терминал должен удовлетворять
* Н е к о т о р ы е т е р м и н а л ы умеют т а к о т о б р а ж а т ь . Следует е щ е и м е т ь в виду, ч т о т е р м и н а л ы
разных типов имеют разные управляющие последовательности.

32
Лекция 2 Терминал и командная строка

Текст, Текст,
управляющие символы управляющие символы

Текст Текст,
управляющие
последовательности

Рис. 2.1. Интерфейс командной строки. Взаимодействие пользователя


с компьютером посредством терминала

трем обязательным требованиям и одному необязательному. Терминал


должен уметь:
1. передавать текстовые д а н н ы е от пользователя системе;
2. передавать от пользователя системе немногочисленные управляю¬
щ и е команды;
3. передавать текстовые д а н н ы е от системы пользователю;
4. (необязательно) интерпретировать некоторые д а н н ы е , передавае­
м ы е от системы пользователю, как управляющие последовательнос¬
ти и соответственно обрабатывать их.
Ограничения на интерфейс напрямую не сказываются на э ф ф е к т и в ­
ности работы пользователя в системе. Однако чем меньше требований к
интерфейсу, тем важнее разумно его организовать. Любое взаимодействие
может быть описано с трех точек зрения: во-первых, какую задачу решает
пользователь (что о н хочет от системы); во-вторых, как он формулирует
задачу в доступном п о н и м а н и ю системы виде; в-третьих, к а к и м и средст­
вами он пользуется при взаимодействии с системой. В частности, тексто­
вый интерфейс удобно рассмативать с точки зрения предоставляемого и м
языка о б щ е н и я с м а ш и н о й : во-первых, описанием этого я з ы к а задается
диапазон решаемых с его п о м о щ ь ю задач, а во-вторых, слова этого к о м ­
пьютерного языка (называемые в программировании операторами) пре­
доставляют способ р е ш е н и я пользовательских задач (в виде небольших
программ-сценариев). Команды, помогающие пользователю быстро и
э ф ф е к т и в н о обмениваться с м а ш и н о й предложениями на этом я з ы к е , и
будут третьей составляющей интерфейса командной строки.

Командная строка

Основная среда взаимодействия с Linux — командная строка. Суть ее


в том, что каждая строка, передаваемая пользователем системе, — это
команда, которую та должна выполнить. П о к а не нажат Enter, строку
м о ж н о редактировать, затем она отсылается системе:

33
Курс Операционная система Linux

[ m e t h o d y @ l o c a l h o s t methody]$ c a l

Сентября 2 004

Вс Пн Вт Ср Чт Пт Сб

1 2 3 4

5 6 7 8 9 10 11

12 13 14 15 16 17 18

19 20 21 22 23 24 25

26 27 28 29 30

[ m e t h o d y @ l o c a l h o s t methody]$ echo H e l l o , world!

Hello, world!

Пример 2.3. К о м а н д ы e c h o и c a l

Команда c a l выводит календарь на текущий месяц, а команда e c h o


просто выводит на терминал все, что следовало в командной строке после
нее. Получается, что одну и ту ж е команду м о ж н о использовать с р а з н ы м и
параметрами (или аргументами), причем параметры эти изменяют пове­
дение команды. Здесь М е ф о д и й захотел посмотреть календарь за март
2005 года, для чего и передал команде c a l два параметра — 3 и 2 0 0 5:

[ m e t h o d y @ l o c a l h o s t methody]$ c a l 3 2005

Марта 2005

Вс Пн Вт Ср Чт Пт Сб

1 2 3 4 5

6 7 8 9 10 11 12

13 14 15 16 17 18 19

20 21 22 23 24 25 26

27 28 29 30 31

Пример 2.4. Команда c a l с параметрами

В большинстве случаев при разборе командной строки первое слово


считается именем команды, а остальные — ее параметрами. Более подроб­
но о разборе командной строки и работе с ней рассказано в разделе « И н ­
терпретатор командной строки (shell)» и в л е к ц и и 7.

Подсистема помощи
П о к а же М е ф о д и й р е ш и л , что узнал о командной строке достаточно
для того, чтобы воспользоваться главными командами Linux (по частоте
их употребления при изучении системы) — man и i n f o .
Работать с Linux, не заглядывая в документацию, практически н е ­
возможно. На это способны только седые аксакалы, у которых все нуж-

34
Лекция 2 Терминал и командная строка

н ы е з н а н и я не то что в голове — в кончиках пальцев, и новички. Всем п р о ­


ч и м настоятельно рекомендуем, приступая к работе, а тем более — к изу­
ч е н и ю Linux, пользоваться всеми доступными руководствами.
Все утилиты, все демоны Linux, все ф у н к ц и и ядра и библиотек, струк¬
тура большинства конфигурационных файлов, наконец, многие умозри¬
тельные, но важные понятия системы описаны либо в руководствах, либо
в info-страницах, либо, н а худой к о н е ц , в несистематизированной сопро­
водительной документации. Поэтому от пользователя системы н е требу­
ется заучивать все возможные варианты взаимодействия с ней. Достаточ¬
но понимать основные п р и н ц и п ы ее устройства и уметь находить спра¬
вочную и н ф о р м а ц и ю . Э й н ш т е й н говорил так: «Зачем запоминать то, что
всегда м о ж н о посмотреть в справочнике?»

Страницы руководства (man)

Больше всего полезной и н ф о р м а ц и и содержится в страницах руко­


водства (manpages), для краткости м ы будем называть их просто «руковод­
ство». Каждая страница посвящена какому-нибудь одному объекту систе­
мы. Для того чтобы посмотреть страницу руководства, нужно дать к о м а н ­
ду системе man объект:

[ m e t h o d y @ l o c a l h o s t methody]$ man c a l

CAL(1) BSD G e n e r a l Commands Manual

CAL(1)

NAME

cal - displays a calendar

SYNOPSIS

cal [-smjy13] [[month] year]

DESCRIPTION

Cal displays a s i m p l e c a l e n d a r . I f arguments are not

specified, t h e c u r r e n t month i s d i s p l a y e d .

The o p t i o n s a r e as f o l l o w s :

Пример 2.5. Просмотр страницы руководства

«Страница руководства» занимает, как правило, больше одной страни­


цы экрана. Для того чтобы читать было удобнее, man запускает программу
постраничного просмотра текстов — l e s s . Управлять программой l e s s
просто: страницы перелистываются пробелом, а когда читать надоест, н а ­
до нажать " q " (Quit). Перелистывать страницы м о ж н о и клавишами Page
Up/Page Down, д л я сдвига н а одну строку вперед м о ж н о применять

35
Курс Операционная система Linux

Enter или стрелку вниз, а на одну строку назад — стрелку вверх. Переход
на начало и конец текста выполняется по командам " g " и "G" соответст­
венно (Go). П о л н ы й список того, что м о ж н о делать с текстом в l e s s , в ы ­
водится по команде "H" (Help).
Страница руководства состоит и з полей — стандартных разделов, с
разных сторон описывающих заинтересовавший М е ф о д и я объект — к о ­
манду c a l . В поле NAME содержится краткое описание объекта (такое,
чтобы его назначение было п о н я т н о с первого взгляда). В поле SYNOPSIS
дается формализованное описание способов использования объекта (в
д а н н о м случае — того, к а к и с к а к и м и параметрами запускать команду
c a l ) . К а к правило, в квадратные скобки в этом поле заключены необяза­
тельные параметры команды, которые м о ж н о ей передать, а м о ж н о и опу­
стить. Н а п р и м е р , строка " [ [ m o n t h ] y e a r ] " означает, что в это месте
командной строки параметров у команды может н е быть вообще, может
быть указан год и л и пара — месяц и год. Н а к о н е ц , текст в поле DESCRIP­
TION — это развернутое описание объекта, достаточное для того, чтобы
и м воспользоваться.
Одно и з самых важных полей руководства находится в к о н ц е текста.
Если в процессе чтения NAME или DESCRIPTION пользователь понимает,
что н е нашел в руководстве того, что искал, о н может захотеть посмот¬
реть, а есть л и другие руководства и л и и н ы е источники и н ф о р м а ц и и по
той же теме. С п и с о к таких источников содержится в поле SEE ALSO:

[ m e t h o d y @ l o c a l h o s t methody]$ man man

SEE ALSO

apropos(1), whatis(1), less(1), groff(1), man.conf(5).

Пример 2.6. П о л е SEE ALSO руководства

Д о этого поля М е ф о д и й добрался с п о м о щ ь ю уже известной коман¬


д ы "G" . Н е то чтобы ему неинтересно было читать руководство п о man,
скорее наоборот: и м двигала любознательность. В П о л е SEE ALSO обна¬
ружились ссылки на руководства п о l e s s , g r o f f (программе ф о р м а ­
тирования страницы руководства), структуре конфигурационного файла
для man, а также п о двум сопутствующим командам с такими говорящи­
ми названиями «Apropos» и «whatis»*, что М е ф о д и й немедленно п р и м е ­
няет одну команду к и м е н и другой, даже н е заглядывая в документацию.
Так ни в коем случае н е следует делать! А что если запущенная программа
начнет с того, что сотрет все ф а й л ы в Вашем каталоге?
* П о - ф р а н ц у з с к и «apropos» о з н а ч а е т «кстати», а «what is» — п о - а н г л и й с к и — «что такое».

36
Лекция 2 Терминал и командная строка

[ m e t h o d y @ l o c a l h o s t methody]$ w h a t i s apropos

apropos (1) - s e a r c h t h e w h a t i s d a t a b a s e f o r s t r i n g s

[ m e t h o d y @ l o c a l h o s t methody]$ man a p r o p o s

apropos(1) apropos(1)

NAME

apropos - search the whatis database f o r s t r i n g s

Пример 2.7. Вызов w h a t i s

На этот раз М е ф о д и ю повезло: команда w h a t i s н е делает ничего


разрушительного. К а к и команда a p r o p o s , w h a t i s ищет подстроку в н е ­
которой базе данных, состоящей из полей NAME всех страниц п о м о щ и в
системе. Различие между н и м и в том, ч т о w h a t i s — только среди и м е н
объектов (в левых частях полей NAME), а a p r o p o s — п о всей базе. В р е ­
зультате у w h a t i s получается список кратких о п и с а н и й объектов с име­
нами, включающими искомое слово, а у a p r o p o s — список, в котором это
слово упоминается. Д л я того, чтобы это узнать, все равно пришлось один
раз прочесть документацию.
В системе может встретиться несколько объектов разного типа, н о с
одинаковым названием. Часто совпадают, например, имена системных
вызовов (функций ядра) и программ, которые пользуются этими ф у н к ц и ­
я м и и з командной строки (т. н. утилит):

[ m e t h o d y @ l o c a l h o s t methody]$ w h a t i s passwd

passwd (1) - u p d a t e a u s e r ' s a u t h e n t i c a t i o n tokens(s)

passwd (5) - password file

passwd (8) - manual page f o r passwd wrapper v e r s i o n 1.0.5

Пример 2.8. Руководства с одинаковыми именами

О п и с а н и я объектов, в ы в о д и м ы е w h a t i s , отличаются ч и с л о м в
скобках — номером раздела. В системе руководств Linux — девять разде¬
лов, каждый из которых содержит страницы руководства к объектам оп¬
ределенного типа. Все разделы содержат по одному руководству с именем
«intro», в котором в общем виде и на примерах рассказано, какое объекты
имеют о т н о ш е н и е к данному разделу:

george@localhost:~> whatis intro

intro (1) - I n t r o d u c t i o n to user commands

intro (2) - I n t r o d u c t i o n t o system calls

intro (3) - I n t r o d u c t i o n to l i b r a r y functions

37
Курс Операционная система Linux

intro (4) - I n t r o d u c t i o n to special files

intro (5) - I n t r o d u c t i o n to file formats

intro (6) - I n t r o d u c t i o n to games

intro (7) - I n t r o d u c t i o n to c o n v e n t i o n s and m i s c e l l a n y section

intro (8) - I n t r o d u c t i o n to administration and p r i v i l e g e d commands

intro (9) - I n t r o d u c t i o n to kernel interface

Пример 2.9. Руководства i n t r o

Вот названия разделов в переводе на русский:


1. К о м а н д ы пользователя.
2. Системные вызовы (пользовательские ф у н к ц и и ядра Linux; руко­
водства рассчитаны на программиста, знающего я з ы к Си).
3. Библиотечные ф у н к ц и и (функции, принадлежащие всевозможным
библиотекам подпрограмм; руководства рассчитаны на программи¬
ста, знающего я з ы к Си).
4. В н е ш н и е устройства и работа с н и м и (в Linux они называются специ­
альными файлами, см. лекцию 10).
5. Форматы различных стандартных файлов системы (например, кон­
фигурационных).
6. Игры, безделушки и прочие вещи, н е и м е ю щ и е системной ценнос¬
ти.
7. Теоретические положения, договоренности и все, что н е может быть
классифицировано.
8. Инструменты администратора (часто недоступные обычному поль¬
зователю).
9. Интерфейс ядра (внутренние ф у н к ц и и и структуры данных ядра
Linux, необходимые только системному программисту, исправляю­
щему или д о п о л н я ю щ е м у ядро).
В частности, пример с p a s s w d показывает, что в системе "Some
L i n u x " , которую использует М е ф о д и й , есть программа p a s s w d (именно
с ее п о м о щ ь ю М е ф о д и й п о м е н я л себе пароль в предыдущей л е к ц и и ) ,
файл p a s s w d , содержащий и н ф о р м а ц и ю о пользователях, и администра­
торская программа p a s s w d , обладающая более ш и р о к и м и возможностя­
ми. П о умолчанию man просматривает все разделы и показывает первое
найденное руководство с заданным именем. Ч т о б ы посмотреть руководст¬
во по объекту и з определенного раздела, необходимо в качестве первого
параметра команды man указать номер раздела:

[ m e t h o d y @ l o c a l h o s t methody]$ man 8 passwd

PASSWD(8) System A d m i n i s t r a t i o n U t i l i t i e s PASSWD(8)

38
Лекция 2 Терминал и командная строка

[ m e t h o d y @ l o c a l h o s t methody]$ man -a passwd

PASSWD(1) Some L i n u x PASSWD(1) . . .

PASSWD(8) System A d m i n i s t r a t i o n Utilities PASSWD(8) . . .

PASSWD(5) L i n u x Programmer's Manual PASSWD(5) . . .

Пример 2.10. Выбор среди страниц руководства с о д и н а к о в ы м


именем

Если в качестве первого параметра man использовать "-а", будут


последовательно выданы все руководства с заданным именем. Внутри
страниц руководства принято непосредственно после и м е н и объекта ста­
вить в круглых скобках номер раздела, в котором содержится руководст­
во по этому объекту: m a n ( 1 ) , l e s s ( 1 ) , p a s s w d ( 5 ) и т. д.

Info
Другой источник и н ф о р м а ц и и о Linux и составляющих его програм­
мах — справочная подсистема i n f o . Страница руководства, несмотря на
обилие ссылок различного типа, остается «линейным» текстом, структури¬
р о в а н н ы м только логически. Документ i n f o структурирован прежде все¬
го топологически — это настоящий гипертекст, в котором множество н е ­
больших страниц объединены в дерево. В каждом разделе документа
i n f o всегда есть оглавление, и з которого м о ж н о перейти сразу к нужно¬
му подразделу, откуда всегда м о ж н о вернуться обратно. К р о м е того, info-
документ м о ж н о читать и к а к непрерывный текст, поэтому в каждом под¬
разделе есть ссылки на предыдущий и последующий подразделы:

[ m e t h o d y @ l o c a l h o s t methody]$ i n f o info

File: info.info, Node: Top, Next: G e t t i n g S t a r t e d , Up: (dir)

Info: An I n t r o d u c t i o n

* Menu:

* Getting Started:: Getting started using an I n f o reader.

* Expert Info:: Info commands f o r experts.

* Creating an I n f o F i l e : : How t o make y o u r own I n f o file.

* Index:: An i n d e x o f t o p i c s , commands, and v a r i a b l e s .

--zz-Info: ( i n f o . i n f o . b z 2 ) T o p , строк: 24 - - A l l

Welcome t o I n f o v e r s i o n 4.6. Type ? f o r help, m f o r menu item.

Пример 2.11. Просмотр info-документа

39
Курс Операционная система Linux

Программа i n f o использует весь экран: н а большей его части о н а


показывает текст документа, а первая и две последних строки ориентации
в его структуре.
Одна или несколько страниц, которые м о ж н о перелистывать клави­
шей Пробел или Page Up/Page Down — это узел (node). Узел содержит
о б ы ч н ы й текст и меню (menu) — с п и с о к ссылок на другие узлы, лежащие
в дереве на более н и з к о м уровне. С с ы л к и внутри документа имеют вид " *
имя_узла::" и перемещать по н и м курсор м о ж н о клавишей Tab, а перехо­
дить к просмотру выбранного узла — клавишей Enter. Вернуться к пре­
дыдущему просмотренному узлу м о ж н о клавишей " 1 " (от «Last»). И ,
главное, выйти и з программы i n f o м о ж н о , нажав " q " (Quit). Более по¬
дробную справку об управлении программой i n f o м о ж н о в любой мо¬
мент получить у самой i n f o , нажав " ? " .
Узлы, составляющие документ i n f o , м о ж н о просматривать и под­
ряд, один за другим (с п о м о щ ь ю команд "n", Next, и "p", Previous), о д ­
нако это используется нечасто. В верхней строке экрана i n f o показыва­
ет и м я текущего узла, и м я следующего узла и и м я родительского ( и л и
верхнего) узла, в котором находится ссылка на текущий. П о к а з а н н ы е М е -
ф о д и ю имя узла Top и и м я верхнего узла ( d i r ) означают, что просматри­
вается корневой узел документа, в ы ш е которого — только каталог со с п и с ­
ком всех info-деревьев. В н и ж н е й части экрана расположена строка с и н ­
формацией о текущем узле, а за ней — строка для ввода д л и н н ы х команд
(например, для поиска текста с п о м о щ ь ю команды "/").
Команде info м о ж н о указывать в параметрах всю цепочку узлов, при¬
водящую к тому и л и иному разделу документации, однако это бывает
нужно довольно редко:

[ m e t h o d y @ l o c a l h o s t methody]$ i n f o info "Getting Started" Help-Q

File: info.info, Node: Help-Q, P r e v : H e l p - I n t , Up: G e t t i n g Started

Quitting Info

Пример 2.12. Просмотр определенного узла info-документа

Сам ли Мефодий это придумал, или подсказал кто, но совершенно пра­


вильно было заключить в кавычки имя узла «Getting Started» — в этом случае
info искала узел по «адресу» " i n f o -> G e t t i n g S t a r t e d -> Help-Q". Если
бы команда имела вид i n f o i n f o G e t t i n g S t a r t e d Help-Q, то «ад­
рес» получился бы неправильный: " i n f o -> G e t t i n g -> S t a r t e d -
> Help-Q". Ничего таинственного в этом нет, и уже к концу лекции ста­
нет понятно, в чем здесь дело (см. раздел «Слова и разделители»).

40
Лекция 2 Терминал и командная строка

RTFM

Оказывается, использование кавычек М е ф о д и й придумал н е сам:


спросил у товарища, опытного пользователя Linux по ф а м и л и и Гуревич.
Гуревич охотно показал, где ставить кавычки, а вот объяснять, что они де­
лают, отказался: «Там отличное руководство! Читай!» Документация в
Linux играет важнейшую роль. Решение любой задачи должно начинаться
с изучения руководств. Н е стоит жалеть на это времени. Д а ж е если рядом
есть о п ы т н ы й пользователь Linux, который, возможно, знает ответ, н е
стоит беспокоить его сразу же. Возможно, даже зная, что нужно сделать,
о н н е помнит как и м е н н о — и поэтому (а также потому, что о н — о п ы т н ы й
пользователь) начнет с изучения руководства. Это — закон, у которого д а ­
ж е собственное название: RTFM, что означает «Read That Fine Manual».

RTFM, Read That Fine Manual


П р а в и л о , согласно которому р е ш е н и е л ю б о й задачи надо
начинать с изучения документации.

Слова Гуревича — практически дословный перевод этой фразы, так


что ее смысл и происхождение очевидны. Linux рассчитан в основном на
тех, кто хочет знать, к а к и м пользоваться.
Руководство — это н е учебник, а скорее справочник. В н е м содер¬
жится и н ф о р м а ц и я , достаточная для освоения описываемого объекта, н о
никаких обучающих приемов, никаких определений, повторений и выде­
л е н и я главного в н е м обычно нет. Тем более н е допускается усечение руко¬
водства с целью представить небольшие п о объему, н о наиболее важные
сведения. Так принято в учебниках, причем сведения раскрываются и
объясняются очень подробно, а остальные присутствуют в виде ссылки на
документацию для профессионалов. Страницы руководств — и есть эта
самая документация для профессионалов. Руководство ч а щ е всего читает
человек, который уже знает, о чем о н о .
Это н е значит, что из руководства нельзя понять, к а к , например,
пользоваться командой в простейших случаях. Напротив, часто встреча­
ется поле EXAMPLES, которое к а к раз и содержит примеры использования
команды в разных условиях. Однако все это призвано н е научить, а рас­
крыть смысл, пояснить сказанное в других полях. М е ф о д и й нашел описа­
н и е работы двойных кавычек в руководстве п о sh, однако п о н я л и з него
далеко н е все — главным образом, потому, что встретил с л и ш к о м много
незнакомых терминов.
Система i n f o может содержать больше, ч е м man, поэтому в нее ча¬
сто включают и учебники (принято называть учебник термином «tutori-
al»), и «howto» (примеры постановки и р е ш е н и я типовых задач), и даже

41
Курс Операционная система Linux

статьи по теме. Таким образом, info-документ может стать, в отличие от


страницы руководства, полным сводом сведений. Разработка такого доку¬
мента — дело трудоемкое, поэтому далеко н е все объекты системы и м со¬
провождаются. К р о м е того, и прочесть большой info-документ целиком
зачастую невозможно. Поэтому имеет смысл начинать и м е н н о с руковод¬
ства, а если его недостаточно — изучать i n f o .
Е с л и н е к о т о р ы й объект с и с т е м ы н е имеет д о к у м е н т а ц и и н и в
ф о р м а т е man, н и в ф о р м а т е i n f o , э т о н е х о р о ш о . В э т о м случае м о ж ­
н о н а д е я т ь с я , ч т о п р и н е м есть сопроводительная документация, не
и м е ю щ а я , у в ы , н и с т а н д а р т н о г о ф о р м а т а , н и т е м более с с ы л о к н а р у ­
к о в о д с т в а п о д р у г и м о б ъ е к т а м с и с т е м ы . Такая д о к у м е н т а ц и я ( р а в н о
к а к и п р и м е р ы и с п о л ь з о в а н и я о б ъ е к т а ) , о б ы ч н о п о м е щ а е т с я в каталог
/usr/share/doc/j/TMi3_o6bexTa.
Документация в подавляющем большинстве случаев пишется на
простом английском языке. Если английский — н е родной я з ы к для авто­
ра документации, она будет только проще. Традиция писать п о - а н г л и й ­
ски идет от немалого вклада С Ш А в развитие компьютерной науки вооб­
щ е и Linux в частности. К р о м е того, английский становится я з ы к о м меж­
дународного общения во всех областях, н е только в компьютерной. Н е о б ­
ходимость писать на я з ы к е , который будет более или менее понятен боль­
шинству пользователей, объясняется п о с т о я н н ы м развитием Linux. Дело
не в том, что страницу руководства нельзя перевести, а в том, что ее п р и ­
дется переводить всякий раз, когда изменится описываемый ею объект!
Н а п р и м е р , выход новой версии программного продукта сопровождается
изменением его возможностей и особенностей работы, а следовательно, и
новой версией документации. Тогда перевод этой документации превра¬
щается в «moving target», с и з и ф о в труд.

Ключи

Работая в системе и изучая руководства, М е ф о д и й заметил, что па­


раметры команд м о ж н о отнести к двум различным категориям. Н е к о т о ­
р ы е параметры имеют собственный смысл: это имена файлов, названия
разделов и объектов в man и i n f o , числа и т. п. Другие параметры собст­
венного смысла н е имеют, их значение м о ж н о истолковать, л и ш ь зная, к
какой команде о н и относятся. Н а п р и м е р , параметр " - a " м о ж н о передать
не только команде man, н о и команде who, и команде l a s t , при этом зна­
чить для них о н будет разное. Такого рода параметры называются модифи­
каторами выполнения или ключами (options):

[ m e t h o d y @ l o c a l h o s t methody]$ date

Вск Сен 19 23:01:17 MSD 2004

42
Лекция 2 Терминал и командная строка

[ m e t h o d y @ l o c a l h o s t methody]$ d a t e -u

Вск Сен 19 19:01:19 UTC 2004

Пример 2.13. Команда d a t e с ключом

Для р е ш е н и я разных задач одни и те же действия необходимо выпол­


нять слегка по-разному. Н а п р и м е р , для синхронизации работ в разных
точках земного шара лучше использовать единое для всех время (по Грин­
вичу), а для организации собственного рабочего д н я — местное время (с
учетом сдвига по часовому поясу и р а з н и ц ы зимнего и летнего времени).
И то, и другое время показывает команда d a t e , только для работы по
Гринвичу ей нужен дополнительный параметр-ключ " - u " (он ж е "-¬
universal").

Однобуквенные ключи

Для формата ключей нет жесткого стандарта, однако существуют д о ­


говоренности, нарушать которые в н а ш е время уже неприлично. Во-пер­
вых, если параметр начинается на "-", это — однобуквенный ключ. За "-
", как правило, следует один символ, ч а щ е всего — буква, обозначающая
действие или свойство, которое этот ключ придает команде. Так п р о щ е
отличать ключи от других параметров — и пользователю при наборе ко¬
мандной строки, и программисту, автору команды:

[ m e t h o d y @ l o c a l h o s t methody]$ who -m

methody t t y 1 Sep 20 13:56 (localhost)

[ m e t h o d y @ l o c a l h o s t methody]$ c a l -m

Сентября 2 004

Пн Вт Ср Чт Пт Сб Вс

1 2 3 4 5

6 7 8 9 10 11 12

13 14 15 16 17 18 19

20 21 22 23 24 25 26

27 28 29 30

Пример 2.14. Использование ключа "-m" в разных командах

Для who ключ " -m" означает «Me», то есть «Я», и в результате who рабо­
тает похоже на whoami*. А для c a l ключ " -m" — это команда выдать кален­
дарь, считая первым днем понедельник («Monday»), как это принято в России.
* К с т а т и , с н е з а п а м я т н ы х в р е м е н who п о д д е р ж и в а е т о д и н нестандартный набор парамет­
ров: who am i делает то ж е , ч т о и who -m.

43
Курс Операционная система Linux

Свойство ключа быть, с одной стороны, предельно коротким, а с


другой стороны — и н ф о р м а т и в н ы м , называется аббревиативностью. Н е
только ключи, н о и имена наиболее распространенных команд Linux об¬
ладают этим свойством.
В-третьих, иногда ключ изменяет поведение команды таким обра­
зом, что меняется и толкование параметра, следующего в командной
строке за этим ключом. Выглядит это так, будто ключ сам получает пара­
метр, поэтому ключи такого вида называются параметрическими. К а к пра­
вило, их параметры — имена файлов различного п р и м е н е н и я , числовые
характеристики и прочие значения, которые нужно передать команде:

[ m e t h o d y @ l o c a l h o s t methody]$ i n f o info "Expert info" Cross-refs Help-

Cross -o t e x t

info: Запись ноды (info.info.bz2)Help-Cross...

info: Завершено.

[ m e t h o d y @ l o c a l h o s t methody]$ c a t t e x t -n

1 File: i n f o . i n f o , Node: H e l p - C r o s s , Up: C r o s s - r e f s

3 The node r e a c h e d b y t h e c r o s s reference i n Info

Пример 2.15. Использование i n f o -o

Здесь i n f o запустилась н е в качестве интерактивной программы, а


как обработчик info-документа. Результат работы — текст узла i n f o ->
E x p e r t i n f o -> C r o s s - r e f s -> H e l p - C r o s s * , программа п о м е с ­
тила в файл t e x t . А программа c a t вывела содержимое этого файла на
терминал, пронумеровав все строки (по просьбе ключа " - n " , «number»).
Теперь стало более или менее понятно, что означают неудобочитае­
м ы е строки в поле SYNOPSIS руководства. Н а п р и м е р [-smjy13] из ру­
ководства п о c a l (5) говорит о том, что команду м о ж н о запускать с н е о ­
бязательными ключами " - s " , "-m", " - j " , " - y " , и "-3".
В-четвертых, есть некоторые менее жесткие, н о популярные догово­
ренности о значении ключей. Ключ " - h " («Help») обычно ( н о , увы, н е
всегда) заставляет команды выдать краткую справку (нечто похожее на
SYNOPSIS, иногда с короткими п о я с н е н и я м и ) . Если указать "-" вместо
и м е н и выходного файла в соответствующем параметрическом ключе (не­
редко это ключ " - o " ) , вывод будет производиться на терминал**. Н а к о -

* С т р а н н о е с л о в о «нода» М е ф о д и й р е ш и л о с т а в и т ь н а с о в е с т и н е и з в е с т н о г о п е р е в о д ч и к а
сообщений info.
** Т о ч н е е , н а стандартный вывод, с м . л е к ц и ю 6.

44
Лекция 2 Терминал и командная строка

нец, бывает необходимо передать команде параметр, а н е ключ, начинаю¬


щ и й с я с "-". Д л я этого нужно использовать ключ :

[ m e t h o d y @ l o c a l h o s t methody]$ i n f o -o - f i l e n a m e - w i t h -

info: Запись ноды (dir)Top...

info: Завершено.

[ m e t h o d y @ l o c a l h o s t methody]$ head -1 - f i l e n a m e - w i t h -

head: invalid option -- f

Попробуйте "head --help' для получения более подробного описания.

[ m e t h o d y @ l o c a l h o s t methody]$ head -1 -- - f i l e n a m e - w i t h -

File: dir Node: Top This i s t h e t o p o f t h e INFO tree

Пример 2.16. Параметр-не ключ, н а ч и н а ю щ и й с я на "-"

Здесь М е ф о д и й сначала создал файл - f i l e n a m e - w i t h - , а потом


пытался посмотреть его первую строку (команда h e a d -количест-
во_строк имя_файла выводит первые количество_строк из указан¬
ного файла). Ключ "-- " (первый "-" — п р и з н а к ключа, второй — сам
ключ) обычно запрещает команде интерпретировать все последующие
параметры командной строки к а к ключи, независимо от того, начинают¬
ся о н и на "-" и л и нет. Только после h e a d согласилась с тем, что -
filename-with это и м я файла.

Полнословные ключи

Аббревиативность ключей трудно соблюсти, когда их у к о м а н д ы


с л и ш к о м много. Некоторые буквы латинского алфавита (например, " s "
или "o") используются очень часто, и могли бы служить сокращением
сразу нескольких команд, а некоторые (например, "z") — редко, под них
и название-то осмысленное трудно придумать. Н а такой случай существу­
ет другой, полнословный формат: ключ начинается на два знака за
которыми следует полное и м я обозначаемой и м сущности. Таков, н а п р и ­
мер, ключ " - - h e l p " (аналог " - h " ) :

[ m e t h o d y @ l o c a l h o s t methody]$ head --help

Использование: h e a d [КЛЮЧ]... [ФАЙЛ]...

Print the f i r s t 10 l i n e s o f each FILE t o standard output.

W i t h more t h a n one F I L E , p r e c e d e e a c h w i t h a h e a d e r g i v i n g the f i l e

name.

W i t h no F I L E , o r when F I L E i s -, r e a d standard input.

Аргументы, обязательные для длинных ключей, обязательны и для коротких.

45
Курс Операционная система Linux

-c, --bytes=[-]N print the f i r s t N bytes of each file;

with the l e a d i n g print a l l but

the l a s t N bytes of each file

-n, --lines=[-]N print the f i r s t N lines i n s t e a d of

the first 10;

the leading '-', p r i n t a l l but

the last N lines of each file

-q, --quiet, --silent не печатать заголовки с

именами файлов

-v, --verbose всегда печатать заголовки с

именами файлов

--help показать эту справку и выйти

--version показать информацию о версии и выйти

N may have a m u l t i p l i e r s u f f i x : b 512, k 1024, m 1024*1024.

Об ошибках сообщайте по адресу.

Пример 2.17. К л ю ч — h e l p

М е ф о д и й сделал то, о чем просила его утилита head. Обращает на


себя в н и м а н и е то, что некоторые ключи h e a d имеют и однобуквенный, и
полнословный формат, а некоторые — только полнословный. Так обычно
и бывает: часто используемые ключи имеют аббревиатуру, а редкие — нет.
Значения параметрических полнословных ключей принято передавать не
следующим параметром командной строки, а с п о м о щ ь ю конструкции
" =значение" непосредственно после ключа.

Интерпретатор командной строки (shell)

В Linux нет отдельного объекта под именем «система». Система — она


на то и система, чтобы состоять из многочисленных компонентов, взаимо­
действующих друг с другом. Главный из системных компонентов — пользо­
ватель. Это он командует м а ш и н о й , а та его команды выполняет. В руко­
водствах второго и третьего разделов описаны системные вызовы (функции
ядра) и библиотечные функции. Они-то и есть непосредственные команды
системе. Правда, воспользоваться ими можно только написав программу
(чаще всего — на я з ы к е Си), нередко —довольно сложную. Дело в том, что
функции ядра реализуют низкоуровневые операции, и для решения даже
самой простой задачи пользователя необходимо выполнить несколько та­
ких операций, преобразуя результат работы одной для нужд другой. Возни­
кает необходимость выдумать для пользователя другой — более высоко­
уровневый и более удобный— я з ы к управления системой. Все команды,
которые использовал Мефодий в работе, были частью именно этого языка.

46
Лекция 2 Терминал и командная строка

И з этого несложно заключить, что обрабатывать эти команды, пре¬


вращать их в последовательность системных и библиотечных вызовов
должна тоже какая-нибудь специальная программа, и и м е н н о с ней не¬
прерывно ведет диалог пользователь сразу после входа в систему. Так оно
и оказалось — программа эта называется интерпретатор командной строки
или командная оболочка («shell»). «Оболочкой» она названа к а к раз пото­
му, что все управление системой идет как бы «изнутри» нее: пользователь
общается с н е ю на удобном ему я з ы к е (с п о м о щ ь ю текстовой командной
строки), а она общается с другими частями системы на удобном и м я з ы к е
(вызывая запрограммированные ф у н к ц и и ) .
Таким образом, упомянутые в ы ш е правила разбора командной стро¬
ки — это правила, действующие и м е н н о в командном интерпретаторе:
пользователь вводит с терминала строку, shell считывает ее, иногда — пре¬
образует по определенным правилам, получившуюся строку разбивает на
команду и параметры, а затем выполняет команду, передавая ей эти пара­
метры. Команда, в свою очередь, анализирует параметры, выделяет среди
них ключи и делает то, о чем ее попросили, попутно выводя на терминал
д а н н ы е для пользователя, после чего завершается. П о завершении к о м а н ­
д ы возобновляется работа «отступившего на задний план» командного
интерпретатора — он снова считывает командную строку, разбирает ее,
вызывает команду... Так продолжается до тех пор, пока пользователь не
скомандует оболочке завершиться самой (с п о м о щ ь ю l o g o u t или управ­
ляющего символа , который для shell значит то ж е , что и для других
программ: больше с терминала ввода не будет).
К о н е ч н о , командных интерпретаторов в Linux несколько. С а м ы й
простой из них, п о я в и в ш и й с я в ранних версиях U N I X , назывался sh, или
«Bourne Shell» — по и м е н и автора, Стивена Борна (Stephen Bourne). Со
временем его везде, где только м о ж н о заменили на более м о щ н ы й , b a s h ,
«Bourne Again Shell»*. b a s h превосходит s h во всем, особенно в возмож­
ностях редактирования командной строки. П о м и м о s h и b a s h в системе
может быть установлен «The Z Shell», z s h , самый м о щ н ы й на сегодня к о ­
м а н д н ы й интерпретатор (шутка ли, 22 тысячи строк документации!), или
t c s h , обновленная и тоже очень м о щ н а я версия старой оболочки «С
Shell», синтаксис команд которой похож на я з ы к программирования Си.
Когда Гуревич добавлял учетную запись М е ф о д и я в систему, о н не
стал спрашивать, какой командный интерпретатор ему нужен, потому что
знал: для новичка и м я командного интерпретатора — пустой звук. Тем не
менее имя оболочки, запускаемой для пользователя сразу после входа в
систему — так называемый стартовый командный интерпретатор ( l o g i n
s h e l l ) , — это часть пользовательской учетной записи, которую пользова­
тель может изменить командой c h s h (change shell).
* И г р а с л о в : «Bourne Again» вслух ч и т а е т с я к а к «born again», т. е. « в о з р о ж д е н н ы й » .

47
Курс Операционная система Linux

Какая бы задача, связанная с управлением системой, н и стояла перед


пользователем Linux, она должна иметь решение в терминах командного
интерпретатора. Фактически, решение пользовательской задачи — это
описание ее на я з ы к е shell. Я з ы к общения пользователя и командного и н ­
терпретатора — это высокоуровневый я з ы к программирования, дополнен­
н ы й , с одной стороны, средствами организации взаимодействия команд и
системы, а с другой стороны — средствами взаимодействия с пользовате­
лем, облегчающими и ускоряющими работу с командной строкой.

Сигналы Передача
сигналов
tty sh
Запуск
утилит
Linux

Рис. 2.2. И н т е р ф е й с командной строки.


Издание второе, переработанное и дополненное. Взаимодействие
пользователя с компьютером посредством терминала и оболочки

Команды и утилиты
[methody@localhost methody]$ apropos s
. . . (четыре с половиной тысячи строк!)

Пример 2.18. Бессмысленная команда

Одного неудачного запуска a p r o p o s М е ф о д и ю было достаточно для


того, чтобы понять: команд в Linux очень много. Ему п р и ш л о в голову, что
н и к а к а я программа — пусть даже и оболочка — не может самостоятельно
разбираться во всех задокументированных командах. К р о м е того, Гуревич
называл большинство команд утилитами, то есть полезными программа­
ми. Стало быть, к о м а н д н ы й интерпретатор не обязан уметь выполнять
все, что вводит пользователь. Ему достаточно разобрать командную стро¬
ку, выделить из нее команду и параметры, а затем запустить утилиту —
программу, и м я которой совпадает с именем команды.
В действительности собственных команд в командном интерпретато­
ре немного. В основном это операторы я з ы к а программирования и п р о ­
ч и е средства управления самим интерпретатором. Все знакомые М е ф о ­
д и ю команды, даже echo, существуют в Linux в виде отдельных утилит.

48
Лекция 2 Терминал и командная строка

shell занимается только тем, что подготавливает набор параметров в к о ­


мандной строке (например, раскрывая шаблоны), запускает программы и
обрабатывает результаты их работы:

[ m e t h o d y @ l o c a l h o s t methody]$ t y p e info

info is /usr/bin/info

[ m e t h o d y @ l o c a l h o s t methody]$ t y p e echo

echo i s a s h e l l b u i l t i n

[ m e t h o d y @ l o c a l h o s t methody]$ t y p e - a echo

echo i s a s h e l l b u i l t i n

echo i s / b i n / e c h o

[ m e t h o d y @ l o c a l h o s t methody]$ t y p e - a - t echo

builtin

file

[ m e t h o d y @ l o c a l h o s t methody]$ t y p e - a - t d a t e

file

[ m e t h o d y @ l o c a l h o s t methody]$ t y p e - a t c a t

file

Пример 2.19. Определение типа команды

В bash т и п команды м о ж н о определить с п о м о щ ь ю команды t y p e .


Собственные команды b a s h называются builtin (встроенная команда), а
для утилит выводится путь, содержащий название каталога, в котором л е ­
ж и т файл с соответствующей программой, и и м я этой программы. Н е к о ­
торые — самые нужные — команды встроены в b a s h , даже несмотря на то,
что о н и имеются в виде утилит (например, echo). Работает встроенная
команда так ж е , н о так к а к времени на ее выполнение уходит существен¬
но меньше, к о м а н д н ы й интерпретатор выберет и м е н н о ее, если будет та¬
кая возможность. К л ю ч " - a " («all», конечно), заставляет t y p e вывести
все возможные варианты интерпретации команды, а ключ " - t " — вывес¬
ти т и п команды вместо пути.
П о совету Гуревича М е ф о д и й сгруппировал ключи, написав " - a t "
вместо " - a - t " . М н о г и е утилиты позволяют уменьшать длину к о м а н д ­
н о й строки подобным образом. Если встречается параметрический ключ,
о н должен быть последним в группе, а его значение — следовать, к а к и по¬
лагается, после. Группировать м о ж н о только однобуквенные ключи.

Слова и разделители

П р и разборе командной строки shell использует понятие разделитель


(delimiter). Разделитель — это символ, разделяющий слова; таким обра-

49
Курс Операционная система Linux

зом, командная строка — это последовательность слов (которые имеют


значение) и разделителей (которые значения не имеют). Для shell раздели­
телями являются символ пробела, символ табуляции и символ перевода
строки (который все-таки может попасть между словами способом, о п и ­
с а н н ы м в лекциях 6 и 7). Количество разделителей между двумя соседни­
ми словами значения не имеет.
Первое слово в тройке передается команде как первый параметр,
второе — как второй и т. д. Для того чтобы разделитель попал внутрь сло­
ва (и получившаяся строка с разделителем передалась как один параметр),
всю нужную подстроку надо окружить о д и н а р н ы м и или д в о й н ы м и ка¬
вычками:

[ m e t h o d y @ l o c a l h o s t methody]$ echo One Two Three


One Two Three

[ m e t h o d y @ l o c a l h o s t methody]$ echo One "Two Three"

One Two Three

[ m e t h o d y @ l o c a l h o s t methody]$ echo 'One

>

> Ой. И что дальше?

> А, кавычки забыл!'

One

Ой. И что дальше?

А, кавычки забыл!

[methody@localhost methody]$

Пример 2.20. Закавычивание в командной строке

В первом случае команде e c h o было передано три параметра —


"One", "Two" и " T h r e e " . Она их и вывела, разделяя пробелом. Во вто­
р о м случае параметров было два: "One" и "Two T h r e e " . В результате эти
два параметра были также выведены через пробел. В третьем случае пара¬
метр был всего один — от открывающего апострофа "'One" до закрываю­
щего "... забыл!'". Все время ввода b a s h услужливо выдавал М е ф о -
д и ю подсказку "> " — в знак того, что набор командной строки продол­
жается, но в режиме ввода содержимого кавычек.

50
Лекция 3 Структура файловой системы

Лекция 3. Структура файловой системы

В лекции разбираются основные понятия файловой системы: файл, ка­


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

Ключевые слова: F H S , folder, виртуальная консоль, вложенный ката­


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

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

Файл

Файл — это понятие, привычное любому пользователю компьютера.


Для пользователя каждый файл — это отдельный предмет, у которого есть
начало и конец и который отличается от всех остальных файлов именем и
расположением («как называется» и «где лежит»). К а к и любой предмет,
файл м о ж н о создать, переместить и уничтожить, однако без внешнего
вмешательства о н будет сохраняться н е и з м е н н ы м неопределенно долгое
время. Ф а й л предназначен для хранения данных любого типа — тексто­
вых, графических, звуковых, исполняемых программ и многого другого.
Аналогия файла с предметом позволяет пользователю быстро освоиться
при работе с д а н н ы м и в операционной системе.
Для операционной системы Linux файл — н е менее важное понятие,
чем для ее пользователя: все д а н н ы е , хранящиеся на любых носителях,
обязательно находятся внутри какого-нибудь файла, в противном случае
о н и просто недоступны н и для операционной системы, н и для пользова­
телей. Более того, многие устройства, подключенные к компьютеру (на­
ч и н а я с клавиатуры и заканчивая любыми в н е ш н и м и устройствами, на­
пример, принтерами и сканерами), Linux представляет к а к ф а й л ы (так
называемые файлы-дырки). К о н е ч н о , файл, содержащий обычные дан¬
ные, сильно отличается от файла, предназначенного для обращения к ус¬
тройству, поэтому в Linux определено несколько различных типов ф а й -

51
Курс Операционная система Linux

лов. В основном пользователь имеет дело с файлами трех типов: обычны¬


ми файлами, предназначенными для хранения данных, каталогами и фай¬
лами-ссылками (именно о них и пойдет речь в данной л е к ц и и , о файлах
других типов см. лекцию 11).

файл
Отдельная область данных на одном из носителей и н ф о р м а ­
ц и и , у которой есть собственное имя.

Система файлов: каталоги

Файловая система с точки зрения пользователя — это «пространство»,


в котором размещаются файлы. Наличие файловой системы позволяет о п ­
ределить не только «как называется файл», но и «где он находится». Разли¬
чать ф а й л ы только по имени было бы нецелесообразно: приходилось бы
помнить, как называется каждый файл и при этом заботиться о том, что­
бы имена никогда не повторялись. Более того, необходим механизм, поз­
воляющий работать с группами тематически связанных между собой фай¬
лов (например, компонентов одной и той ж е программы или разных глав
диссертации). Иначе говоря, ф а й л ы нужно систематизировать.

файловая система
Способ хранения и организации доступа к д а н н ы м на и н ф о р ­
м а ц и о н н о м носителе или его разделе. Классическая файловая
система имеет иерархическую структуру, в которой файл одно¬
значно определяется п о л н ы м путем к нему.

Linux может работать с различными типами файловых систем, кото¬


р ы е различаются списком поддерживаемых возможностей, производи­
тельностью в разных ситуациях, надежностью и другими признаками. По¬
дробнее о работе Linux с разными файловыми системами речь пойдет в
лекции 11. В этой лекции будут описаны возможности файловой системы
Ext2/Ext3, на сегодня de facto стандартной файловой системы для Linux.
Большинство современных файловых систем (но не все!) использу¬
ют в качестве основного организационного п р и н ц и п а каталоги. Каталог —
это список ссылок на ф а й л ы или другие каталоги. П р и н я т о говорить, что
каталог содержит ф а й л ы или другие каталоги, хотя в действительности о н
только ссылается на них, физическое размещение данных на диске обыч­
но н и к а к не связано с размещением каталога. Каталог, на который есть
ссылка в д а н н о м каталоге, называется подкаталогом или вложенным ката¬
логом. Каталог в файловой системе более всего напоминает библиотеч¬
н ы й каталог, содержащий ссылки на объединенные по каким-то призна-

52
Лекция 3 Структура файловой системы

кам к н и г и и другие разделы каталога (файлы и подкаталоги). Ссылка на


один и тот же файл может содержаться в нескольких каталогах одновре¬
м е н н о — это делает доступ к файлу более удобным. В файловой системе
Ext2 каждый каталог — это отдельный файл особого типа ("d", от англ.
«directory»), отличающийся от обычного файла с д а н н ы м и : в нем могут с о ­
держаться только ссылки на другие ф а й л ы и каталоги.

В файловой системе Linux нет п а п о к и документов. Есть ката¬


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

Довольно часто вместо термина «каталог» употребляется «папка» (англ.


folder). Этот термин хорошо вписывается в представление о файлах как о
предметах, которые можно раскладывать по папкам, однако часть возмож¬
ностей файловой системы, которая противоречит этому представлению, та­
ким образом затемняется. В частности, с термином «папка» плохо согласу­
ется то, что ссылка на файл может присутствовать одновременно в несколь¬
ких каталогах, файл может быть ссылкой на другой файл и т. д. В Linux эти
возможности файловой системы весьма важны для эффективной работы,
поэтому мы будем использовать более подходящий термин «каталог».
В файловой системе, организованной при п о м о щ и каталогов, на лю¬
бой файл должна быть ссылка как м и н и м у м из одного каталога, в против¬
н о м случае файл просто не будет доступен внутри этой файловой систе¬
мы, иначе говоря, не будет существовать.

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

Допустимые имена

Главные отличительные признаки файлов и каталогов — их имена. В


Linux имена файлов и каталогов могут быть длиной не более 256 с и м в о ­
лов, и могут содержать любые символы, кроме "/". П р и ч и н а этого огра­
н и ч е н и я очевидна: д а н н ы й символ используется как разделитель и м е н в
составе пути, поэтому не должен встречаться в самих именах. Причем
Linux всегда различает п р о п и с н ы е и строчные буквы в именах файлов и
каталогов, поэтому "methody", " M e t h o d y " и "METHODY" будут тремя
разными именами.
Есть несколько символов, допустимых в именах файлов и каталогов,
которые нужно использовать с осторожностью. Это так называемые спец¬
символы "*", "\", "&", "<", ">", " ( " , " ) " , "|", а также символы
пробела и табуляции. Дело в том, что эти символы имеют особое значение
для любой командной оболочки, поэтому нужно будет специально позабо­
титься о том, чтобы командная оболочка воспринимала эти символы как

53
Курс Операционная система Linux

часть и м е н и файла или каталога. О специальном значении символа " - "


для команд Linux уже шла речь в лекции 2, там ж е обсуждалось, как и з м е ­
нить его интерпретацию*. О том, зачем командной оболочке нужны спец­
символы, речь пойдет в лекции 8.

Кодировки и русские имена

К а к м о ж н о было заметить, пока во всех встречавшихся именах ф а й ­


лов и каталогов употреблялись только символы латинского алфавита и
некоторые знаки препинания. Это не случайно и вызвано желанием сде­
лать так, чтобы приводимые п р и м е р ы выглядели на любых системах оди¬
наково. В Linux в именах файлов и каталогов допустимо использовать лю¬
бые символы любого языка, однако такая свобода требует жертв, на кото­
р ы е М е ф о д и й , например, пойти не смог.
Дело в том, что с давних пор каждый символ (буква) каждого я з ы к а
традиционно представлялся в виде одного байта. Такое представление н а ­
кладывает очень жесткие ограничения на количество букв в алфавите: их
может быть не больше 256, а за вычетом управляющих символов, ц и ф р ,
знаков п р е п и н а н и я и прочего — и того меньше. О б ш и р н ы е алфавиты (на­
пример, иероглифические я п о н с к и й и китайский) пришлось заменять
у п р о щ е н н ы м их представлением. Вдобавок, первые 128 символов из этих
256 лучше всегда оставлять н е и з м е н н ы м и , соответствующими стандарту
A S C I I , включающему латиницу, ц и ф р ы , знаки п р е п и н а н и я и наиболее
популярные символы из тех, что встречаются на клавиатуре печатной ма­
ш и н к и . Интерпретация остальных 128 символов зависит от того, какая
кодировка установлена в системе. Н а п р и м е р , в русской к о д и р о в к е
K O I 8 - R 228-й символ такой таблицы соответствует букве «Д», а в запад­
ноевропейской кодировке ISO-8859-1 этот ж е символ соответствует бук­
ве «а» с двумя точками на ней (как у нашей буквы «е»).
И м е н а файлов, записанные на д и с к в одной кодировке, выглядят н е ­
лепо, если при просмотре каталога была установлена другая. Более того,
многие кодировки заполняют диапазон символов с номерами от 128 то
255 не полностью, поэтому соответствующего символа может вообще не
быть! Это означает, что ввести такое искаженное имя файла с клавиатуры
(например, для того, чтобы его переименовать) напрямую не удастся:
придется пускаться на разные ухищрения, о п и с а н н ы е в лекции 8. Н а к о ­
нец, многие я з ы к и , в том числе и русский, исторически имеют несколько
кодировок**. К сожалению, в настоящее время нет стандартного способа
* С и м в о л " - " означает, ч т о с л е д у ю щ е е с л о в о — к л ю ч , а п р о б е л ы и т а б у л я ц и и р а з д е л я ю т
параметры в к о м а н д н о й строке.
** М е ф о д и й и сам н е с к о л ь к о р а з п о л у ч а л э л е к т р о н н ы е п и с ь м а , н а ч и н а ю щ и е с я с л о в а м и
« б Н О П Н Я » и л и « б М Х Л Ю М Х Е » — результат п р е д с т а в л е н и я текста, и м е ю щ е г о к о д и р о в к у
CP-1251, в к о д и р о в к е K O I 8 - R .

54
Лекция 3 Структура файловой системы

указывать кодировку п р я м о в и м е н и файла, поэтому в рамках одной ф а й ­


ловой системы стоит придерживаться единой кодировки при именовании
файлов.
Существует универсальная кодировка, включающая символы всех
письменностей мира — U N I C O D E . Стандарт U N I C O D E в настоящее вре­
мя получает все большее распространение и претендует на статус общего
для всех текстов, хранящихся в электронном виде. Однако пока он не д о ­
стиг желаемой универсальности, особенно в области имен файлов. Один
символ в U N I C O D E может занимать больше одного байта — и в этом его
главный недостаток, так как множество полезных прикладных программ,
отлично работающих с однобайтными кодировками, необходимо основа­
тельно или даже полностью перерабатывать для того, чтобы научить их
обращаться с U N I C O D E . Возможно, причина недостаточной распрост¬
раненности этой кодировки также и в том, что U N I C O D E — очень гро¬
моздкий стандарт, и он может оказаться н е э ф ф е к т и в н ы м при работе с
файловой системой, где скорость и надежность обработки — очень суще¬
ственные качества.
Это не означает, что, называя ф а й л ы , не следует использовать я з ы к и ,
отличные от английского. П о к а точно известно, в какой кодировке зада¬
но и м я файла — проблем не возникнет. Однако М е ф о д и й р е ш и л , что га­
рантий в передаче названного по-русски файла на какую-нибудь другую
систему м о ж н о добиться, только передавая вместе с н и м настройку коди¬
ровки, даже две: в своей системе и в системе адресата (неизвестно какой!).
Другой, гораздо более легкий способ передать файл — использовать в его
названии только символы A S C I I .

Расширения

Многим пользователям знакомо понятие расширение — часть имени


файла после точки, обычно ограничивающаяся несколькими символами и
указывающая на тип содержащихся в файле данных. В файловой системе
Linux нет никаких предписаний по поводу расширения: в имени файла
может быть любое количество точек (в том числе н и одной), а после по¬
следней точки может стоять любое количество символов*. Хотя расшире­
н и я не обязательны и не навязываются технологией в Linux, они ш и р о к о
используются: расширение позволяет человеку или программе, не откры­
вая файл, только по его имени определить, какого типа д а н н ы е в нем со­
держатся. Однако нужно учитывать, что расширение — это только набор
соглашений о наименовании файлов разных типов. Строго говоря, данные
* В о т л и ч и е от старых ф а й л о в ы х с и с т е м , о р г а н и з о в а н н ы х п о п р и н ц и п у «8+3» ( D O S ,
ISO9660 и т. п . ) , где в и м е н и ф а й л а д о п у с т и м о н е более о д н о й т о ч к и и р а с ш и р е н и е м о ж е т
б ы т ь н е д л и н н е е 3-х с и м в о л о в . Э т о о г р а н и ч е н и е о п р е д е л и л о в и д м н о г и х и з в е с т н ы х с е г о ­
д н я расширений файлов, например, " t x t " для текстового файла.

55
Курс Операционная система Linux

в файле могут не соответствовать заявленному расширению по той или


иной причине, поэтому всецело полагаться на расширение нельзя.
Определить тип содержимого файла м о ж н о и на основании самих
данных. М н о г и е ф о р м а т ы предусматривают указание в начале файла, к а к
следует интерпретировать дальнейшую и н ф о р м а ц и ю : к а к программу, ис¬
ходные д а н н ы е для текстового редактора, страницу H T M L , звуковой
файл, изображение или что-то другое. В распоряжении пользователя
Linux всегда есть утилита f i l e , которая предназначена и м е н н о для опре­
деления типа содержащихся в файле данных:

[ m e t h o d y @ l o c a l h o s t methody]$ f i l e -f ilename-with-

- f i l e n a m e - w i t h - : ASCII E n g l i s h text

[ m e t h o d y @ l o c a l h o s t methody]$ f i l e /home/methody

/home/methody: directory

Пример 3.1. Определение типа данных в файле

М е ф о д и й , забыв, что содержится в файле " - f i l e n a m e - w i t h - " ,


который о н создал в примере, представленном в предыдущей л е к ц и и , хо¬
тел было уже посмотреть его содержимое при п о м о щ и команды c a t . Од­
нако его остановил Гуревич, который посоветовал сначала выяснить, что
за д а н н ы е содержатся в этом файле. Н е исключено, что это двоичный
файл исполняемой программы, а в таком файле могут встречаться после­
довательности, которые случайно совпадут с управляющими последова­
тельностями терминала. Поведение терминала после этого может стать
непредсказуемым, и н е о п ы т н ы й пользователь вряд ли сможет с н и м спра­
виться. М е ф о д и й получил вполне точный ответ от утилиты f i l e : в его
файле — английский текст в кодировке A S C I I . f i l e умеет различать
очень многие т и п ы данных и почти наверняка выдаст правильную и н ­
ф о р м а ц и ю . Эта утилита никогда н е доверяет р а с ш и р е н и ю файла (если
оно присутствует) и анализирует сами данные. f i l e различает н е только
разные д а н н ы е , н о и разные т и п ы файлов, в частности, сообщит, если ис¬
следуемый файл является н е обычным файлом, а, например, каталогом.

Дерево каталогов

П о н я т и е каталога позволяет систематизировать все объекты, разме¬


щ е н н ы е на носителе данных (например, на диске). В большинстве совре¬
менных файловых систем используется иерархическая модель организа­
ц и и данных: существует один каталог, объединяющий все д а н н ы е в ф а й ­
ловой системе — это «корень» всей файловой системы, корневой каталог.
Корневой каталог может содержать любые объекты файловой системы, и

56
Лекция 3 Структура файловой системы

в частности, подкаталоги (каталоги первого уровня вложенности). Те, в


свою очередь, также могут содержать любые объекты файловой системы
и подкаталоги (второго уровня вложенности) и т. д. Таким образом, все,
что записано на диске — ф а й л ы , каталоги и специальные ф а й л ы — обяза­
тельно «принадлежит» корневому каталогу: либо непосредственно (со­
держится в нем), либо на некотором уровне вложенности.
Иерархию вложенных друг в друга каталогов м о ж н о соотнести с и е ­
рархией данных в системе: объединить тематически связанные ф а й л ы в
каталог, тематически связанные каталоги — в один о б щ и й каталог и т. д.
Если строго следовать иерархическому принципу, то ч е м глубже будет
уровень вложенности каталога, тем более частным признаком д о л ж н ы
быть объединены содержащиеся в н е м данные. Если н е следовать этому
принципу, то вскоре окажется гораздо п р о щ е складывать все ф а й л ы в
один каталог и искать среди н и х нужный, ч е м выполнять такой поиск по
всем подкаталогам системы. Однако в этом случае о какой бы то н и было
систематизации файлов говорить н е приходится.
Структуру файловой системы можно представить наглядно в виде де­
рева*, «корнем» которого является корневой каталог, а в вершинах располо­
жены все остальные каталоги. Н а рис. 3.1 изображено дерево каталогов, кур­
сивом обозначены имена файлов, прямым начертанием — имена каталогов.

/
1
1 1 1 1 1
bin home usr var ...
1 1
1 1 1 1
etc doc
1 1
...
shogun methody bin
.1 1 .
1
-filename-with- text

Рис.3.1. Дерево каталогов в Linux

В любой файловой системе Linux всегда есть только один корневой


каталог, который называется " / " . Пользователь Linux всегда работает с
единым деревом каталогов, даже если разные д а н н ы е расположены на
разных носителях: нескольких жестких или сетевых дисках, съемных д и с ­
ках, C D - R O M и т. п.** Д л я того чтобы отключать и подключать файловые
* Здесь имеется в виду дерево в строгом математическом смысле: о р и е н т и р о в а н н ы й граф без
ц и к л о в с о д н о й к о р н е в о й в е р ш и н о й , в к о т о р о м в каждую в е р ш и н у входит р о в н о одно ребро.
** Э т о о т л и ч а е т с я от т е х н о л о г и и , п р и м е н я е м о й в Windows и л и A m i g a , где д л я к а ж д о г о у с ­
т р о й с т в а , н а к о т о р о м есть ф а й л о в а я с и с т е м а , и с п о л ь з у е т с я с в о й к о р н е в о й каталог, о б о з н а ­
ч е н н ы й л и т е р о й , н а п р и м е р " a " , " c " , "d" и т. д .

57
Курс Операционная система Linux

системы на разных устройствах в состав одного общего дерева, использу­


ются процедуры монтирования и размонтирования, о которых речь пойдет
в лекции 11. После того, как файловые системы на разных носителях под­
ключены к общему дереву, содержащиеся на них д а н н ы е доступны так,
как если бы все они составляли единую файловую систему: пользователь
может даже не знать, на каком устройстве к а к и е ф а й л ы хранятся.
П о л о ж е н и е любого каталога в дереве каталогов точно и однозначно
описывается при п о м о щ и полного пути. П о л н ы й путь всегда начинается
от корневого каталога и состоит из перечисления всех вершин, встретив­
шихся при движении по ребрам дерева до искомого каталога включитель­
но. Названия соседних вершин разделяются символом "/" («слэш»). В
Linux п о л н ы й путь, например, до каталога "methody" в файловой систе­
ме, приведенной на рис. 3.1, записывается следующим образом: сначала
символ "/", обозначающий корневой каталог, затем к нему добавляется
"home", затем разделитель "/", за которым следует название искомого
каталога " m e t h o d y " , в результате получается полный путь
"/home/methody"*.
Организация каталогов файловой системы в виде дерева не допуска­
ет появления циклов: т. е. каталог не может содержать в себе каталог, в к о ­
тором содержится сам. Благодаря этому ограничению п о л н ы й путь до л ю ­
бого каталога или файла в файловой системе всегда будет конечным.

Р а з м е щ е н и е компонентов системы: стандарт FHS

Попробуем разобраться, к а к устроено дерево каталогов Linux, где и


что в нем м о ж н о найти. Фрагмент дерева каталогов т и п и ч н о й файловой
системы Linux (Some L i n u x , которую использует М е ф о д и й ) приведен на
рис. 3.1. М е ф о д и й р е ш и л обследовать свою файловую систему, начиная с
корневого каталога: Гуревич посоветовал использовать для этого команду
l s каталог, где каталог — это п о л н ы й путь к каталогу: утилита l s в ы ­
ведет с п и с о к всего, что в этом каталоге содержится:

[ m e t h o d y @ l o c a l h o s t methody]$ l s /

bin dev home mnt root tmp var

boot etc lib proc sbin usr

[methody@localhost methody]$

Пример 3.2. Стандартные каталоги в /

* Весьма п о х о ж и й с п о с о б з а п и с и п о л н о г о п у т и и с п о л ь з у е т с я в системах Windows, с т о й


л и ш ь р а з н и ц е й , ч т о к о р н е в о й р а з д е л о б о з н а ч а е т с я л и т е р о й устройства с п о с л е д у ю щ и м
двоеточием, а в качестве разделителя используется символ " \ " («обратный слэш»).

58
Лекция 3 Структура файловой системы

Утилита l s вывела список подкаталогов корневого каталога. Этот


с п и с о к будет примерно таким ж е в любом дистрибутиве Linux. В корне¬
вом каталоге Linux-системы обычно находятся только подкаталоги со
стандартными именами. Более того, н е только имена, н о и тип данных,
которые могут попасть в тот или и н о й каталог, также регламентированы
э т и м стандартом. Д а н н ы й стандарт н а з ы в а е т с я Filesystem Hierarchy
Standard («стандартная структура файловых систем»).
О п и ш е м кратко, что находится в каждом из подкаталогов корневого
каталога. М ы н е будем приводить п о л н ы е списки файлов для каждого
описываемого каталога, а М е ф о д и й сможет просмотреть их п р и п о м о щ и
команды l s имя каталога.

/bin Название этого каталога происходит от слова «binaries» («двоич­


ные», «исполняемые»). В этом каталоге находятся и с п о л н я е м ы е
ф а й л ы самых необходимых утилит. Сюда попадают такие про¬
граммы, которые могут понадобиться системному администрато­
ру и л и другим пользователям для устранения неполадок в систе­
ме или при восстановлении после сбоя.
/ b o o t «Boot» — загрузка системы. В этом каталоге находятся ф а й л ы , н е ­
обходимые для самого первого этапа — загрузки ядра — и, обыч­
но, само ядро. Пользователю практически никогда н е требуется
непосредственно работать с этими файлами.
/dev В этом каталоге находятся все и м е ю щ и е с я в системе ф а й л ы - д ы р ­
ки: ф а й л ы особого типа, предназначенные для обращения к раз­
л и ч н ы м системным ресурсам и устройствам (англ. «devices» —
«устройства», отсюда и с о к р а щ е н н о е название каталога). Напри¬
мер, ф а й л ы / d e v / t t y N соответствуют виртуальным консолям, где
N — номер виртуальной консоли. Д а н н ы е , введенные пользовате¬
лем на первой виртуальной консоли, система считывает из файла
/ d e v / t t y 1 ; в этот ж е ф а й л записываются д а н н ы е , которые нуж­
но вывести пользователю на эту консоль. В файлах-дырках в д е й ­
ствительности н е хранятся н и к а к и е данные, при их п о м о щ и д а н ­
н ы е передаются. Подробнее о работе с файлами-дырками речь
пойдет в л е к ц и и 11.
/etc Каталог для системных конфигурационных файлов. Здесь хра­
нится и н ф о р м а ц и я о специфических настройках д а н н о й систе­
мы: и н ф о р м а ц и я о зарегистрированных пользователях, доступ¬
ных ресурсах, настройках различных программ. Подробно сис¬
темные к о н ф и г у р а ц и о н н ы е ф а й л ы будут рассмотрены в лекции
12.
/home Здесь расположены каталоги, принадлежащие пользователям с и ­
стемы — домашние каталоги, отсюда и название «home». Отделе-

59
Курс Операционная система Linux

ние всех файлов, создаваемых пользователями, от прочих сис¬


темных файлов дает очевидное преимущество: серьезное по¬
вреждение системы или необходимость обновления н е затронет
наиболее ц е н н о й и н ф о р м а ц и и — пользовательских файлов.
/lib Название этого каталога — сокращение от «libraries» (англ. «биб­
лиотеки»). Библиотеки — это собрания стандартных ф у н к ц и й , н е ­
обходимых многим программам: операций ввода/вывода, р и с о ­
вания элементов графического интерфейса и т. д. Чтобы н е в к л ю ­
чать эти ф у н к ц и и в текст каждой программы, используются
стандартные ф у н к ц и и библиотек — это значительно экономит
место на диске и упрощает н а п и с а н и е программ. В этом каталоге
содержатся библиотеки, необходимые для работы наиболее важ­
ных системных утилит (размещенных в / b i n и / s b i n ) .
/mnt Каталог для монтирования (от англ. «mount») — временного под­
ключения файловых систем, например, на съемных носителях
( C D - R O M и др.). Подробно о монтировании файловых систем
речь пойдет в л е к ц и и 11.
/proc В этом каталоге все ф а й л ы «виртуальные» — о н и располагаются
не на диске, а в оперативной памяти. В этих файлах содержится
и н ф о р м а ц и я о программах (процессах), выполняемых в д а н н ы й
момент в системе.
/root Домашний каталог администратора системы — пользователя root.
Смысл размещать его отдельно от д о м а ш н и х каталогов осталь¬
ных пользователей состоит в том, что /home может располагать¬
ся на отдельном устройстве, которое н е всегда доступно (напри¬
мер, на сетевом диске), а д о м а ш н и й каталог root должен присут¬
ствовать в любой ситуации.
/sbin Каталог для важнейших системных утилит (название каталога —
сокращение от «system binaries»): в дополнение к утилитам / b i n
здесь находятся программы, необходимые для загрузки, резервно­
го копирования, восстановления системы. Полномочия на испол¬
нение этих программ есть только у системного администратора.
/tmp Этот каталог предназначен для временных файлов: в таких файлах
программы хранят необходимые для работы промежуточные
данные. После завершения работы программы временные ф а й л ы
теряют смысл и д о л ж н ы быть удалены. Обычно каталог /tmp о ч и ­
щается п р и каждой загрузке системы.
/usr Каталог / u s r — это «государство в государстве». Здесь м о ж н о
найти такие ж е подкаталоги b i n , e t c , l i b , s b i n , к а к и в корне¬
вом каталоге. Однако в корневой каталог попадают только ути¬
литы, необходимые для загрузки и восстановления системы в ава­
р и й н о й ситуации — все остальные программы и д а н н ы е распола-

60
Лекция 3 Структура файловой системы

гаются в подкаталогах / u s r . Прикладных программ в современ¬


ных системах обычно установлено очень много, поэтому этот
раздел файловой системы может быть очень большим.
/var Название этого каталога — сокращение от «variable» («перемен¬
ные» данные). Здесь размещаются те д а н н ы е , которые создаются
в процессе работы р а з н ы м и программами и предназначены для
передачи другим программам и системам (очереди печати, элек¬
тронной почты и др.) или для сведения системного администра­
тора (системные журналы, содержащие протоколы работы систе­
мы). В отличие от каталога /tmp сюда попадают те д а н н ы е , кото­
р ы е могут понадобиться после того, к а к создавшая их программа
завершила работу.

Стандарт FHS регламентирует н е только перечисленные каталоги,


н о и их подкаталоги, а иногда даже приводит с п и с о к конкретных фай¬
лов, которые д о л ж н ы присутствовать в определенных каталогах*. Этот
стандарт последовательно соблюдается во всех Linux-системах, хотя и н е
без горячих споров между разработчиками п р и выходе каждой новой его
версии.
Стандартное размещение файлов позволяет и человеку, и даже п р о ­
грамме предсказать, где находится тот или и н о й компонент системы. Д л я
человека это означает, что о н сможет быстро сориентироваться в любой
системе Linux (где файловая система организована в соответствии со
стандартом) и найти то, что ему нужно. Д л я программ стандартное распо¬
ложение файлов — это возможность организации автоматического взаи¬
модействия между р а з н ы м и компонентами системы.
М е ф о д и й уже успел воспользоваться некоторыми преимуществами,
которые дает стандартное расположение файлов: на предыдущих лекциях
о н запускал утилиты, н е указывая п о л н ы й путь к исполняемому файлу,
например, c a t вместо / b i n / c a t . Командная оболочка «знает», что и с ­
полняемые ф а й л ы располагаются в каталогах / b i n , / u s r / b i n и т. д. —
и м е н н о в этих каталогах о н а ищет исполняемый файл cat. Благодаря это­
му каждая вновь установленная в системе программа немедленно оказы­
вается доступна пользователю и з командной строки. Д л я этого н е требу­
ется н и перезагружать систему, н и запускать какие-либо процедуры — д о ­
статочно просто поместить исполняемый файл в один и з соответствую¬
щих каталогов.
Рекомендации стандарта п о р а з м е щ е н и ю файлов и каталогов о с н о ­
вываются на п р и н ц и п е размещения файлов, которые по-разному исполь-

* К р а т к о е о п и с а н и е с т а н д а р т н о й и е р а р х и и к а т а л о г о в L i n u x м о ж н о п о л у ч и т ь , отдав к о м а н ­
ду man h i e r . П о л н ы й текст и п о с л е д н ю ю р е д а к ц и ю с т а н д а р т а F H S м о ж н о п р о ч е с т ь п о
адресу http://www.pathname.com/fhs/.

61
Курс Операционная система Linux

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


м о ж н о разделить на следующие группы:
1. пользовательские/системные файлы
Пользовательские ф а й л ы — это все ф а й л ы , созданные пользователем
и не принадлежащие н и одному из компонентов системы. О пользе
разграничения пользовательских и системных файлов речь уже шла
выше.
2. измемющиеся/неизменные файлы
К н е и з м е н е н н ы м файлам относятся все статические к о м п о н е н т ы
программного обеспечения: библиотеки, и с п о л н я е м ы е ф а й л ы и т. д.
— все, что не изменяется само без вмешательства системного адми­
нистратора. И з м е н я ю щ и е с я ф а й л ы — это те, которые изменяются
без вмешательства человека в процессе работы системы: системные
журналы, очереди печати и пр. Выделение неизменных файлов в от¬
дельную структуру (например, / u s r ) позволяет использовать соот¬
ветствующую часть файловой системы в режиме «только чтение»,
что уменьшает вероятность случайного повреждения данных и поз­
воляет применять для хранения этой части файловой системы C D -
R O M и другие носители, доступные только для чтения.
3. разделяемые/неразделяемые файлы
Это разграничение становится полезным, если речь идет о сети, в
которой работает несколько компьютеров. Значительная часть и н ­
ф о р м а ц и и при этом может храниться на одном из компьютеров и и с ­
пользоваться всеми остальными по сети (к такой и н ф о р м а ц и и отно­
сятся, например, многие программы и д о м а ш н и е каталоги пользова­
телей). Однако часть файлов нельзя разделять между системами (на­
пример, ф а й л ы для начальной загрузки системы).
П о л н ы й путь к каталогу формально ничем не отличается от пути к
файлу, т. е. по полному пути нельзя сказать наверняка, является его по¬
следний элемент файлом или каталогом. Чтобы отличать путь к каталогу,
иногда и с п о л ь з у ю т з а п и с ь с с и м в о л о м " / " в к о н ц е пути:
" /home/methody/ ".

62
Лекция 4 Работа с файловой системой

Лекция 4. Работа с файловой системой

Лекция посвящена практической работе с объектами файловой системы:


перемещению по дереву каталогов, копированию, перемещению и удалению фай­
лов, созданию жестких и символьных ссылок. Подробно разбираются понятия
«полный путь» и «относительный путь», текущий каталог, домашний каталог.

Ключевые слова: виртуальная консоль, входное и м я , д о м а ш н и й ката­


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

Текущий каталог

Файловая система не только систематизирует данные, но и является


основой метафоры «рабочего места» в Linux. Каждая выполняемая п р о ­
грамма «работает» в строго определенном каталоге файловой системы. Та­
кой каталог называется текущим каталогом. М о ж н о представлять, что п р о ­
грамма во время работы «находится» именно в этом каталоге, это ее «рабо¬
чее место». В зависимости от текущего каталога поведение программы мо¬
жет меняться: зачастую программа будет по умолчанию работать с файла­
ми, расположенными именно в текущем каталоге — до них она «дотянется»
в первую очередь. Текущий каталог есть у любой программы, в том числе и
у командной оболочки (shell) пользователя. Поскольку взаимодействие
пользователя с системой обязательно опосредовано командной оболочкой,
можно говорить о том, что пользователь «находится» в том каталоге, кото­
р ы й в данный момент является текущим каталогом его командной оболочки.
Все команды, отдаваемые пользователем при п о м о щ и shell, наследу¬
ют текущий каталог shell, т. е. «работают» в том ж е каталоге. П о этой при¬
ч и н е пользователю важно знать текущий каталог shell. Для этого служит
утилита pwd:

[ m e t h o d y @ l o c a l h o s t methody]$ pwd

/home/methody

[methody@localhost methody]$

Пример 4.1. Текущий каталог: pwd

63
Курс Операционная система Linux

Команда pwd (print working directory) возвращает п о л н ы й путь теку¬


щего каталога командной оболочки — естественно, и м е н н о той команд¬
ной оболочки, при п о м о щ и которой была выполнена команда pwd. В дан¬
ном случае М е ф о д и й узнал, что в этот момент (на д а н н о й виртуальной
консоли) текущим является каталог "/home/methody".
Почти все утилиты, с которыми работал М е ф о д и й в предыдущих
лекциях, по умолчанию читают и создают ф а й л ы в текущем каталоге. Так,
М е ф о д и й обращался к файлам, не используя никаких путей, просто по
имени. Н а п р и м е р , задействовал утилиту c a t , чтобы вывести на э к р а н с о ­
держимое файла " t e x t " :

[ m e t h o d y @ l o c a l h o s t methody]$ c a t t e x t

File: info.info, Node: H e l p - C r o s s , Up: Cross-refs

The node r e a c h e d by t h e c r o s s reference i n Info

[ m e t h o d y @ l o c a l h o s t methody]$ c a t /home/methody/text

File: info.info, Node: H e l p - C r o s s , Up: Cross-refs

The node r e a c h e d by t h e c r o s s reference i n Info

Пример 4.2. П о л н ы й и относительный путь к файлу

В действительности, командная оболочка, прежде чем передавать


параметр " t e x t " (имя файла) утилите c a t , подставляет значение теку­
щего каталога — получается п о л н ы й путь к этому файлу в файловой с и с ­
теме: " / h o m e / m e t h o d y / t e x t " . Содержимое данного файла утилита
c a t выведет на экран*. Набирая только и м я файла без пути к текущему
каталогу, М е ф о д и й воспользовался относительным путем к этому файлу.

относительный путь, relative path


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

Относительный путь строится точно так ж е , как и п о л н ы й — пере­


числением через "/" всех названий каталогов, встретившихся при движе-

* В о о б щ е г о в о р я , в н е с к о л ь к и х р а з н ы х каталогах ф а й л о в о й с и с т е м ы могут о к а з а т ь с я ф а й ­
л ы с и м е н е м " t e x t " . И м е н н о п о э т о м у к о м а н д н а я о б о л о ч к а всегда п е р е д а е т п р о г р а м м а м
и у т и л и т а м « т о ч н ы й адрес» ф а й л а в ф а й л о в о й системе — полный путь.

64
Лекция 4 Работа с файловой системой

н и и к искомому каталогу или файлу. Между п о л н ы м и относительным пу¬


тем есть только одно существенное различие: относительный путь начи¬
нается от текущего каталога, в то время как п о л н ы й путь всегда начина­
ется от корневого каталога. Относительный путь любого файла или ката¬
лога в файловой системе может иметь любую конфигурацию: чтобы до¬
браться до искомого файла, м о ж н о двигаться как по направлению к кор¬
невому каталогу, так и от него (см. раздел «Перемещение п о дереву ката¬
логов»). Linux различает п о л н ы й и относительный пути очень просто: ес¬
ли и м я объекта начинается на "/" — это п о л н ы й путь, в любом другом
случае — относительный.
Отделить путь к файлу от его и м е н и м о ж н о с п о м о щ ь ю команд
d i r n a m e и basename соответственно:

[ m e t h o d y @ l o c a l h o s t methody]$ basename /home/methody/text

text

[ m e t h o d y @ l o c a l h o s t methody]$ basename text

text

[ m e t h o d y @ l o c a l h o s t methody]$ dirname /home/methody/text

/home/methody

[ m e t h o d y @ l o c a l h o s t methody]$ dirname ./text

[ m e t h o d y @ l o c a l h o s t methody]$ dirname text

Пример 4.3. Использование d i r n a m e и basename

М е ф о д и й заметил, ч т о для " t e x t " и " . / t e x t " d i r n a m e выдает


одинаковый результат: " . " , что понятно: к а к было сказано выше, эти
ф о р м ы пути эквивалентны, а при автоматической обработке результатов
d i r n a m e гораздо лучше получить " . " , чем пустую строку.

Д о м а ш н и й каталог

М е ф о д и й заметил, что в примерах этой и прошлых л е к ц и й , заходя с


разных виртуальных консолей п о очереди и одновременно, о н всегда ока¬
зывался в одном и том ж е текущем каталоге: о н все время обращался к
своим файлам п р и п о м о щ и относительного пути и всегда находил нуж¬
ные. Это н е случайно — в Linux у каждого пользователя обязательно есть
собственный каталог, который и становится текущим сразу после регист­
рации в системе — домашний каталог*. Для М е ф о д и я д о м а ш н и м каталогом
является "/home/methody".
* Д о м а ш н и й к а т а л о г у к а з ы в а е т с я в учетной записи п о л ь з о в а т е л я , с м . л е к ц и ю 1.

65
Курс Операционная система Linux

домашний каталог, home directory


Каталог, предназначенный для хранения собственных данных
пользователя Linux. К а к правило, является текущим непосред­
ственно после регистрации пользователя в системе. Полный
путь к домашнему каталогу хранится в переменной окружения
HOME.

Поскольку каждый пользователь располагает собственным катало¬


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

Информация о каталоге

Чтобы иметь возможность ориентироваться в файловой системе,


нужно знать, что содержится в каждом каталоге. Запомнить всю структу¬
ру файловой системы невозможно и не нужно: в любой момент м о ж н о
просмотреть содержимое любого каталога при п о м о щ и утилиты l s (со¬
к р а щ е н и е от англ. «list» — «список»):

[ m e t h o d y @ l o c a l h o s t methody]$ l s

- f ilename-wi th- text

[methody@localhost methody]$

Пример 4.4. Команда l s

Поданная без параметров, команда l s выводит список файлов и ка­


талогов, содержащихся в текущем каталоге*. П р и п о м о щ и этой утилиты
М е ф о д и й обнаружил, что в его домашнем каталоге (который в д а н н ы й мо¬
мент является текущим) содержатся два файла, созданные в примере,
приведенном в предыдущей лекции: " - f i l e n a m e - w i t h - " и " t e x t " .
Утилита l s принимает один параметр: и м я каталога, содержимое к о ­
торого нужно вывести. И м я может быть задано л ю б ы м доступным спосо¬
бом: в виде полного или относительного пути. Н а п р и м е р , чтобы получить
с п и с о к в файлов в своем д о м а ш н е м каталоге, М е ф о д и й мог бы использо¬
вать команды " l s /home/methody" и " l s ." — результат был бы ана¬
логичным.
К р о м е параметра, утилита l s «понимает» множество ключей, кото¬
р ы е нужны главным образом для того, чтобы выводить дополнительную
* Вот п р и м е р у т и л и т ы , к о т о р а я п о у м о л ч а н и ю работает с ф а й л а м и в т е к у щ е м к а т а л о г е .

66
Лекция 4 Работа с файловой системой

и н ф о р м а ц и ю о файлах в каталоге или выводить с п и с о к файлов выбороч­


но. Чтобы узнать обо всех возможностях l s , нужно, конечно ж е , прочесть
руководство по этой утилите ("man l s " ) .
Почитав руководство по l s , М е ф о д и й решил изучить содержимое
своей файловой системы и начал с корневого каталога:

[ m e t h o d y @ l o c a l h o s t methody]$ l s -F /

bin/ dev/ home/ mnt/ root/ swap/ tmp/ var/

boot/ etc/ lib/ proc/ sbin/ sys/ usr/

[methody@localhost methody]$

Пример 4.5. Команда l s -F

М е ф о д и й использовал ключ -F, чтобы отличать ф а й л ы от каталогов.


П р и наличии этого ключа l s в к о н ц е и м е н и каждого каталога ставит сим¬
вол "/", чтобы показать, что в нем может содержаться что-то еще. В в ы ­
веденном списке нет н и одного файла — в корневом каталоге содержатся
только подкаталоги.
К р о м е того, М е ф о д и й р е ш и л получить более подробную информа¬
ц и ю о содержимом своего домашнего каталога:

[ m e t h o d y @ l o c a l h o s t methody]$ l s -aF

-filename-with- .bash_history .bashrc .lpoptions

.rpmmacros Documents/

./ .bash_logout .emacs .mutt/ .xemacs/ text

../ .bash_profile .i18n .pinerc .xsession.d/ tmp/

[methody@localhost methody]$

Пример 4.6. Команда l s -aF

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


а гораздо больше. Дело в том, что утилита l s по умолчанию не выводит
и н ф о р м а ц и ю об объектах, чье имя начинается с " . " — в том числе о " . "
и . Для того чтобы посмотреть п о л н ы й список содержимого катало­
га, и используется ключ " - a " (all)*. К а к правило, с " . " начинаются и м е ­
на конфигурационных файлов и к о н ф и г у р а ц и о н н ы х каталогов (вроде
. b a s h r c , описанного в лекции 8), работа с которыми (т. е. настройка ок­
ружения, «рабочего места») не пересекается с работой над какой-нибудь
* Такое п о в е д е н и е ls н а п о м и н а е т п р и н ц и п р а б о т ы ф а й л о в ы х м е н е д ж е р о в со с к р ы т ы м и
файлами в системах MS-DOS/Windows. Разница в том, что в MS-DOS/Windows скрытые
ф а й л ы п р е д у с м о т р е н ы ф а й л о в о й с и с т е м о й — ф а й л м о ж е т и м е т ь атрибут « с к р ы т ы й » и п р и
э т о м н а з ы в а т ь с я к а к у г о д н о . В Linux с к р ы т ы е ф а й л ы — это н е с в о й с т в о ф а й л о в о й с и с т е м ы ,
а т о л ь к о соглашение по наименованию файлов.

67
Курс Операционная система Linux

прикладной задачей (хотя, конечно, эффективность работы зависит от


хорошо настроенного окружения). К р о м е того, подобных файлов в д о ­
м а ш н е м каталоге активно работающего пользователя со временем заво­
дится немало (по одному на каждую приличную утилиту) и их присутст¬
вие в выдаче l s сильно загромождает выводимые данные.
Разберемся подробно в списке файлов в домашнем каталоге М е ф о -
дия. Начнем с весьма лаконичных имен " . " и . Мефодий уже знает,
что " . " — это имя текущего каталога. Следующее имя в списке, — это
ссылка на родительский каталог. Родительский каталог — это тот каталог, в
котором находится д а н н ы й каталог. Родительским каталогом д л я
"/home/methody" будет каталог "/home": о н получается просто отбра­
сыванием последнего имени каталога в полном пути. Иначе можно ска¬
зать, что родительский каталог — это один шаг по дереву каталогов по на¬
правлению к корню. — это сокращенный способ сослаться на роди­
тельский каталог: пока текущим каталогом является "/home/methody",
относительный путь (или, что то ж е самое, " . / . .") будет эквивален­
тен " / home ". С использованием можно строить сколь угодно длинные
пути, такие как " . . / . . / u s r / . . / v a r / l o g / . . / r u n / . . / . . / h o m e " * .
Однако в действительности о н и применяются только п р и автомати­
ческой подстановке в программах, а во время работы пользователя необ­
ходимости в такого рода усложнениях н е возникает.

родительский каталог, parent directory


Каталог, в котором содержится д а н н ы й . Для корневого каталога
родительским является о н сам.

Ссылки на текущий и на родительский каталог обязательно присут­


ствуют в каждом каталоге в Linux. Даже если каталог пуст, т. е. н е содер¬
жит н и одного файла или подкаталога, команда " l s - a " выведет с п и с о к
из двух имен: " . " и .
За ссылками на текущий и родительский каталоги следуют несколь­
ко файлов и каталогов, имена которых начинаются с " . " . В н и х содер­
жатся настройки командной оболочки (файлы, н а ч и н а ю щ и е с я с " . b a s h " )
и других программ. В д о м а ш н е м каталоге каждого пользователя Linux
всегда присутствует несколько таких файлов. Использование этих файлов
позволяет пользователям независимо друг от друга настраивать поведе¬
н и е командной оболочки и других программ — организовывать свое «ра¬
бочее место» в системе. Подробнее речь об этом пойдет в лекции 12.

* Не сразу п о н я т н о , что этот путь п р и в о д и т все туда ж е , в "/home".


68
Лекция 4 Работа с файловой системой

П е р е м е щ е н и е по дереву каталогов

Пользователь может работать с ф а й л а м и не только в своем домаш¬


н е м каталоге, но и в других каталогах. В этом случае будет удобно сменить
текущий каталог, т. е. «переместиться» в другую точку файловой системы.
Для смены текущего каталога командной оболочки используется к о м а н ­
да c d (от англ. «change directory» — «сменить каталог»). Команда c d п р и ­
нимает один параметр: и м я каталога, в который нужно переместиться —
сделать текущим. К а к обычно, в качестве и м е н и каталога м о ж н о исполь¬
зовать п о л н ы й или относительный путь:

[ m e t h o d y @ l o c a l h o s t methody]$ c d /home

[ m e t h o d y @ l o c a l h o s t home]$ l s

methody shogun

[ m e t h o d y @ l o c a l h o s t home]$ c d methody

[methody@localhost methody]$

Пример 4.7. Смена текущего каталога

Сначала М е ф о д и й решил переместиться в каталог "/home" и по¬


смотреть, что еще есть в этом каталоге, кроме его домашнего каталога. О н
обнаружил каталог " s h o g u n " и догадался, что это д о м а ш н и й каталог Гу-
ревича, входное имя которого — "shogun". К р о м е того, он заметил, что
изменился вид приглашения командной строки (подсказки shell) — слово
"methody" заменилось на "home" . В приглашении командной строки
часто указывается текущий каталог shell — чтобы пользователю легче бы­
ло ориентироваться, в каком каталоге он «находится» в д а н н ы й момент.
После этого Мефодий решил вернуться в свой домашний каталог, но
в этом случае он использовал уже не полный, а относительный путь — " c d
methody". Вводя эту команду, Мефодий не стал целиком набирать имя
своего домашнего каталога, а набрал только первые буквы "me" и нажал
клавишу Tab, как ему советовал Гуревич. Командная оболочка умеет дост­
раивать имена файлов и каталогов: пользователю достаточно набрать не­
сколько первых символов имени файла или каталога и нажать Tab. Если
есть только один вариант завершения имени — оболочка закончит его сама,
и пользователю не придется набирать оставшиеся символы. Достраивание
— весьма существенное средство экономии усилий и повышения эффек¬
тивности при работе с командной строкой. Современные командные обо¬
лочки умеют достраивать имена файлов и каталогов, а также имена команд.
Достраивание наиболее развито в командном интерпретаторе z sh.
Те ж е самые перемещения — в родительский каталог и обратно — М е ­
фодий мог бы осуществить, набирая значительно м е н ь ш е символов. Для

69
Курс Операционная система Linux

перемещения в родительский каталог ("/home") удобно воспользоваться


ссылкой . Необходимость вернуться в д о м а ш н и й каталог из произ¬
вольной точки файловой системы возникает довольно часто, поэтому ко¬
мандная оболочка поддерживает обозначение домашнего каталога при
п о м о щ и символа Поэтому чтобы перейти в д о м а ш н и й каталог из
любого другого, достаточно выполнить команду " c d ~". П р и исполне¬
н и и команды символ "~" будет заменен командной оболочкой на пол¬
н ы й путь к домашнему каталогу пользователя:

[ m e t h o d y @ l o c a l h o s t methody]$ c d ..

[ m e t h o d y @ l o c a l h o s t home]$ c d ~

[ m e t h o d y @ l o c a l h o s t methody]$ c d ~shogun

[methody@localhost shogun]$ cd

[methody@localhost methody]$

Пример 4.8. Переход в родительский и в д о м а ш н и й каталог

П р и п о м о щ и символа "~" м о ж н о ссылаться и на д о м а ш н и е катало­


ги других пользователей: "-имя пользователя". В примере 4.8 М е ф о -
д и й перешел в д о м а ш н и й каталог Гуревича с п о м о щ ь ю команды " c d
~ s h o g u n " . Команда c d , поданная без параметров, эквивалентна к о м а н ­
де " c d ~" и делает текущим каталогом д о м а ш н и й каталог пользователя.

Создание каталогов

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


каталоге. В д о м а ш н е м каталоге, как и в любом другом, м о ж н о создавать
сколько угодно подкаталогов, в них — свои подкаталоги и т. д. И н ы м и
словами, пользователю принадлежит фрагмент (поддерево) файловой си¬
стемы, корнем которого является его д о м а ш н и й каталог.
Чтобы организовать такое поддерево, потребуется создать каталоги
внутри домашнего. Для этого используется утилита m k d i r . Она п р и м е н я ­
ется с одним обязательным параметром: именем создаваемого каталога.
П о умолчанию каталог будет создан в текущем каталоге:

[ m e t h o d y @ l o c a l h o s t methody]$ m k d i r examples

[ m e t h o d y @ l o c a l h o s t methody]$ l s -F

- f i l e n a m e - w i t h - Documents/ examples/ text tmp/

[methody@localhost methody]$

Пример 4.9. Создание каталога

70
Лекция 4 Работа с файловой системой

М е ф о д и й решил навести порядок в своем д о м а ш н е м каталоге и п о ­


местить все ф а й л ы с примерами и упражнениями в отдельный подкаталог
— " e x a m p l e s " . Теперь, создав каталог, нужно переместить в него все
ф а й л ы с примерами.

Копирование и п е р е м е щ е н и е файлов

Для перемещения файлов и каталогов предназначена утилита mv (от


англ. «move» — «перемещать»). У mv два обязательных параметра: первый
— перемещаемый файл или каталог, второй — файл или каталог назначе¬
ния. И м е н а файлов и каталогов могут быть заданы в любом допустимом
виде: при п о м о щ и полного или относительного пути. К р о м е того, mv поз¬
воляет перемещать не только один файл или каталог, а сразу несколько. За
подробностями о допустимых параметрах и ключах следует обратиться к
руководству по mv:

[ m e t h o d y @ l o c a l h o s t methody]$ mv -- - f i l e n a m e - w i t h - examples/

[ m e t h o d y @ l o c a l h o s t methody]$ c d examples

[ m e t h o d y @ l o c a l h o s t examples]$ mv ../text .

[ m e t h o d y @ l o c a l h o s t examples]$ l s

- f i lename-wi t h - text

[methody@localhost examples]$

Пример 4.10. Перемещение файлов

М е ф о д и й сначала переместил в каталог " e x a m p l e s " файл " - f i l e -


n a m e - w i t h - " , а поскольку и м я этого файла начинается с ему по¬
требовалось предварить его ключом "-- " , чтобы следующее слово было
воспринято командной оболочкой как параметр (этот прием был описан
в лекции 2). Затем он перешел в каталог " e x a m p l e s " и переместил из р о ­
дительского каталога ("../") файл " t e x t " в текущий каталог ("."). Те­
перь в каталоге " e x a m p l e s " находится два файла с примерами.
Перемещение файла внутри одной файловой системы в действи¬
тельности равнозначно его переименованию: д а н н ы е самого файла при
этом остаются на тех ж е секторах диска, а изменяются каталоги, в кото¬
рых п р о и з о ш л о п е р е м е щ е н и е . П е р е м е щ е н и е предполагает удаление
ссылки на файл из того каталога, откуда он перемещен, и добавление
ссылки на этот самый файл в тот каталог, куда он перемещен. В результа¬
те изменяется полное и м я файла — полный путь, т. е. положение файла в
файловой системе.
Иногда требуется создать к о п и ю файла: для большей сохранности
данных, для того, чтобы создать модифицированную версию файла и т. п. В

71
Курс Операционная система Linux

Linux для этого предназначена утилита c p (от англ. «copy» — «копировать»).


Утилита c p требует присутствия двух обязательных параметров: первый —
копируемый файл или каталог, второй — файл или каталог назначения. К а к
обычно, в именах файлов и каталогов можно использовать полные и отно¬
сительные пути. Существует несколько вариантов комбинации файлов и
каталогов в параметрах c p — о них можно прочесть в руководстве:

[ m e t h o d y @ l o c a l h o s t examples]$ cp t e x t text.bak

[ m e t h o d y @ l o c a l h o s t examples]$ l s

- f ilename-wi t h - text text.bak

Пример 4.11. К о п и р о в а н и е файлов

М е ф о д и й р е ш и л создать р е з е р в н у ю к о п и ю ф а й л а " t e x t " ,


" t e x t . b a k " в том же каталоге, что и исходный файл. Для этой простей­
шей операции копирования достаточно передать c p в качестве двух пара­
метров и м я исходного файла и и м я копии. П о умолчанию cp, как и мно¬
гие другие утилиты, будет работать с файлами в текущем каталоге.
Нужно иметь в виду, что в Linux утилита c p нередко настроена таким
образом, что при попытке скопировать файл поверх уже существующего
файла никакого предупреждения не выводится. В этом случае файл будет
просто перезаписан, а д а н н ы е , которые содержались в старой версии
файла, безвозвратно потеряны. Поэтому при использовании c p следует
всегда быть внимательным и проверять имена файлов, которые нужно
скопировать.
Говоря о копировании, уместно вспомнить ш и р о к о известное в ы ­
сказывание, приписываемое Уильяму Оккаму: «Не следует умножать
сущности сверх необходимого». Созданная при п о м о щ и c p к о п и я файла
связана с оригиналом только в воспоминаниях пользователя, в файловой
ж е системе исходный файл и его к о п и я — две совершенно независимые и
ничем не связанные единицы. Поэтому при наличии нескольких к о п и й
одного и того же файла в рамках одной файловой системы повышается ве­
роятность запутаться в копиях или забыть о некоторых из них. Если зада¬
ча состоит в том, чтобы обеспечить доступ к одному и тому же файлу из
разных точек файловой системы, нужно использовать специально пред¬
н а з н а ч е н н ы й для этого механизм файловой системы Linux — ссылки.

Ф а й л и его имена: ссылки

Жесткие ссылки
Каждый файл представляет собой область данных на жестком диске
компьютера или на другом носителе и н ф о р м а ц и и , которую м о ж н о найти

72
Лекция 4 Работа с файловой системой

по имени. В файловой системе Linux содержимое файла связывается с его


именем при п о м о щ и жестких ссылок. Создание файла с п о м о щ ь ю любой
программы означает, что будет создана жесткая ссылка — и м я файла, и от­
крыта новая область данных на диске. Причем количество ссылок на од¬
ну и ту же область данных (файл) не ограничено, т. е. у файла может быть
несколько имен.
Пользователь Linux может добавить файлу еще одно имя (создать
еще одну жесткую ссылку на файл) при п о м о щ и утилиты l n (от англ.
«link» — «соединять, связывать»). П е р в ы й параметр — это имя файла, на
который нужно создать ссылку, второй — и м я новой ссылки. П о умолча¬
н и ю ссылка будет создана в текущем каталоге:

[ m e t h o d y @ l o c a l h o s t methody]$ l n e x a m p l e s / t e x t text-hardlink

[ m e t h o d y @ l o c a l h o s t methody]$ l s - l R

./:

d r w x r - x r - x 3 methody methody 4096 Окт 16 04:45 examples

-rw-r--r-- 2 methody methody 653 Окт 6 10:31 text-hardlink

./examples:

итого 92

-rw-r--r-- 1 methody methody 84718 Окт 6 10:31 -filename-with-

-rw-r--r-- 2 methody methody 653 Окт 6 10:31 text

Пример 4.12. Создание жестких ссылок

М е ф о д и й создал в своем д о м а ш н е м каталоге жесткую ссылку с име¬


н е м " t e x t - h a r d l i n k " на файл " t e x t " , который находится в подката­
логе " e x a m p l e s " . Выведя подробный с п и с о к файлов текущего каталога
и его подкаталогов ( " l s - l R " ) , М е ф о д и й обратил внимание, что у ф а й ­
лов " t e x t " и " t e x t - h a r d l i n k " совпадают и размер ("653"), и время
создания. Это его совершенно не удивило, поскольку он знает, что теперь
"/home/methody/text-hardlink" и "/home/methody/exam-
p l e s / t e x t " — это два и м е н и одного и того ж е файла. В подробном о п и ­
сании, выведенном командой " l s - l " , М е ф о д и ю остались н е п о н я т н ы
только два первых поля. К а к объяснил Гуревич, первое «слово», состоя­
щее из знаков "-drwx", — это обозначение прав доступа к файлу, о кото­
рых речь пойдет в л е к ц и и 6. А следующее за н и м число — количество же¬
стких с с ы л о к на д а н н ы й ф а й л и л и каталог. У " t e x t " и " t e x t -
h a r d l i n k " стоит число "2" — у этого файла два имени.
Доступ к одному и тому же файлу при п о м о щ и нескольких и м е н мо¬
жет понадобиться в следующих случаях:
1. Одна и та ж е программа известна под несколькими именами.

73
Курс Операционная система Linux

2. Доступ пользователей к некоторым каталогам в системе может быть


ограничен из соображений безопасности. Однако если все ж е нужно
организовать доступ пользователей к файлу, который находится в
таком каталоге, м о ж н о создать жесткую ссылку на этот файл в дру¬
гом каталоге.
3. Современные файловые системы даже на д о м а ш н и х персональных
компьютерах могут насчитывать до нескольких десятков тысяч ф а й ­
лов и тысячи каталогов. Обычно у таких файловых систем сложная
многоуровневая иерархическая организация — в результате пути ко
многим файлам становятся очень д л и н н ы м и . Чтобы организовать
более удобный доступ к файлу, который находится очень «глубоко» в
иерархии каталогов, также м о ж н о использовать жесткую ссылку в
более доступном каталоге.
4. П о л н о е имя некоторых программ может быть весьма д л и н н ы м (на­
пример, i 5 8 6 - a l t - l i n u x - g c c - 3 . 3 ) , к таким программам удобнее
обращаться при п о м о щ и сокращенного и м е н и (жесткой ссылки) —
gcc-3.3.

Индексные дескрипторы
Поскольку благодаря жестким ссылкам у файла может быть н е ­
сколько имен, п о н я т н о , что вся существенная и н ф о р м а ц и я о файле в
файловой системе привязана не к и м е н и . В файловых системах Linux вся
и н ф о р м а ц и я , необходимая для работы с файлом, хранится в индексном
дескрипторе. Для каждого файла существует индексный дескриптор: не
только для обычных файлов, но и для каталогов*, файлов-дырок и т. д.
Каждому файлу соответствует один индексный дескриптор.
И н д е к с н ы й дескриптор — это описание файла, в котором содержит¬
ся:
• тип файла (обычный файл, каталог, файл-дырка и т. д.);
• права доступа к файлу;
• и н ф о р м а ц и я о том, кому принадлежит файл;
• отметки о времени создания, м о д и ф и к а ц и и , последнего доступа к
файлу;
• размер файла;
• указатели на физические блоки на диске, принадлежащие этому
файлу — в этих блоках хранится «содержимое» файла.
Все индексные дескрипторы пронумерованы, поэтому номер ин¬
дексного дескриптора — это уникальный идентификатор файла в файло¬
вой системе — в отличие от имени файла (жесткой ссылки на него), кото¬
рых может быть несколько. Узнать номер индексного дескриптора любо¬
го файла м о ж н о при п о м о щ и все той же утилиты l s с ключом - i :
* К а т а л о г и в L i n u x — т о ж е ф а й л ы о с о б о г о т и п а , с м . р а з д е л « С и с т е м а ф а й л о в : каталоги».

74
Лекция 4 Работа с файловой системой

[ m e t h o d y @ l o c a l h o s t methody]$ l s - i . / t e x t - h a r d l i n k

examples/text

127705 e x a m p l e s / t e x t 127705 ./text-hardlink

Пример 4.13. И н ф о р м а ц и я об индексных дескрипторах файлов

М е ф о д и й решил поинтересоваться номерами индексных дескрипто­


ров файла " t e x t " и жесткой ссылки на него " t e x t - h a r d l i n k " — о н об­
наружил , что эти номера совпадают ("127705"), то есть этим двум име¬
н а м соответствует один индексный дескриптор, т. е. один и тот ж е файл.
Все операции с файловой системой — создание, удаление и перемеще­
ние файлов — производятся на самом деле над индексными дескрипторами,
а имена нужны только для того, чтобы пользователь мог легко ориентиро­
ваться в файловой системе. (Было бы очень неудобно запоминать много­
значный номер каждого нужного файла или каталога.) Более того, имя (или
имена) файла в его индексном дескрипторе не указаны. В файловой системе
Ext2 имена файлов хранятся в каталогах: каждый каталог представляет со­
бой список имен файлов и номеров их индексных дескрипторов. Жесткую
ссылку (имя файла, хранящееся в каталоге) можно представлять как ката¬
ложную карточку, на которой указан номер индексного дескриптора —
идентификатор файла.

жесткая ссылка, hard link


Запись вида и м я ф а й л а + н о м е р индексного дескриптора в ката­
логе. Ж е с т к и е ссылки в Linux — основной способ обратиться к
файлу по и м е н и .

Символьные ссылки
У жестких ссылок есть два существенных ограничения:
1. Жесткая ссылка может указывать только на файл, но не на каталог,
потому что в противном случае в файловой системе могут возник¬
нуть ц и к л ы — бесконечные пути.
2. Жесткая ссылка не может указывать на файл в другой файловой с и ­
стеме. Н а п р и м е р , невозможно создать на жестком диске жесткую
ссылку на файл, расположенный на дискете*.
Чтобы избежать этих ограничений, были разработаны символьные
ссылки. Символьная ссылка — это просто файл, в котором содержится
и м я другого файла. С и м в о л ь н ы е ссылки, как и жесткие, предоставляют
возможность обращаться к одному и тому же файлу по разным именам.
* П р и ч и н а этого о г р а н и ч е н и я в т о м , ч т о н о м е р и н д е к с н о г о д е с к р и п т о р а у н и к а л е н т о л ь к о в
р а м к а х о д н о й ф а й л о в о й с и с т е м ы . В р а з н ы х ф а й л о в ы х системах могут оказаться д в а р а з н ы х
ф а й л а с о д и н а к о в ы м н о м е р о м и н д е к с н о г о д е с к р и п т о р а . В результате будет н е в о з м о ж н о ус¬
т а н о в и т ь , н а к а к о й из н и х указывает ж е с т к а я с с ы л к а .

75
Курс Операционная система Linux

К р о м е того, символьные ссылки могут указывать и на каталог, чего не


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

символьная ссылка, symbolic link, файл-ссылка


Файл особого типа ( " l " ) , в котором содержится путь к другому
файлу. Если на пути к файлу встречается символьная ссылка,
система выполняет подстановку: исходный путь заменяется
тем, что содержится в ссылке.
Символьную ссылку м о ж н о создать при п о м о щ и команды l n с клю¬
ч о м " - s " (сокращение от «symbolic»):

[ m e t h o d y @ l o c a l h o s t methody]$ l n -s e x a m p l e s / t e x t text-symlink

[ m e t h o d y @ l o c a l h o s t methody]$ l s - l i

127699 d r w x r - x r - x 2 methody methody 4096 Окт 4 17:12 examples

127705 - r w - r - - r - - 2 methody methody 653 Сен 30 10:04 text-hardlink

3621 lrwxrwxrwx 1 methody methody 13 Окт 4 18:05 text-symlink -> exam¬

ples/text

[methody@localhost methody]$

Пример 4.14. Создание символьных ссылок

Теперь М е ф о д и й решил создать в своем д о м а ш н е м каталоге с и м ­


вольную ссылку на файл t e x t и назвать ее t e x t - s y m l i n k . Команда l s
- l i отобразила этот файл совсем не так, к а к остальные: стрелочка ("-
>") указывает, куда направлена ссылка. К р о м е того, М е ф о д и й обратил
в н и м а н и е , что номер индексного дескриптора (первое поле), размер и
время создания файла t e x t - s y m l i n k отличаются от t e x t - h a r d l i n k , а
также во втором поле (количество жестких ссылок на файл) t e x t - s y m -
l i n k указано " 1 " . Все эти признаки недвусмысленно свидетельствуют о
том, что t e x t - s y m l i n k и t e x t — это разные файлы. Однако если выпол­
нить команду c a t t e x t - s y m l i n k , то на э к р а н будет выведено содержи¬
мое файла t e x t .
Символьная ссылка вполне может содержать и м я несуществующего
файла. В этом случае ссылка будет существовать, но не будет «работать»:
например, если попробовать вывести содержимое такой «битой» ссылки
при п о м о щ и команды c a t , будет выдано сообщение об ошибке.
Узнать, куда указывает символьная ссылка, м о ж н о при п о м о щ и ути­
литы r e a l p a t h :

76
Лекция 4 Работа с файловой системой

[ m e t h o d y @ l o c a l h o s t methody]$ r e a l p a t h text-symlink

/home/methody/examples/text

Пример 4.15. Раскрытие символьных ссылок

Удаление файлов и каталогов

В Linux для удаления файлов предназначена утилита rm (сокраще­


н и е от англ. «remove» — «удалять»):

[ m e t h o d y @ l o c a l h o s t methody]$ rm examples/text

[ m e t h o d y @ l o c a l h o s t methody]$ l s - l t e x t - h a r d l i n k

-rw-r--r-- 1 methody methody 653 Сен 30 10:04 text-hardlink

[ m e t h o d y @ l o c a l h o s t methody]$ rm text-hardlink

[ m e t h o d y @ l o c a l h o s t methody]$ l s - l t e x t - h a r d l i n k

ls: text-hardlink: No such f i l e or d i r e c t o r y

Пример 4.16. Удаление файла

Разобравшись в ссылках, Мефодий решил удалить файл t e x t в ката¬


логе examples. После этого файл t e x t - h a r d l i n k в домашнем каталоге
Мефодия, который является жесткой ссылкой на удаленный файл t e x t ,
продолжает благополучно существовать. Единственное отличие, которое
заметил Мефодий — количество жестких ссылок на этот файл теперь умень­
шилось с "2" до " 1 " — действительно, t e x t - h a r d l i n k — теперь единст­
венное имя этого файла. Получается, что Мефодий удалил только одно из
имен этого файла (жесткую ссылку) — сам же файл остался нетронутым.
Однако если М е ф о д и й удалит и жесткую ссылку t e x t - h a r d l i n k , у
этого файла больше не останется н и одного и м е н и , он станет недоступ¬
н ы м пользователю файловой системы и будет уничтожен.
Утилита rm предназначена и м е н н о для удаления жестких ссылок, а
не самих файлов. В Linux, чтобы полностью удалить файл, требуется по¬
следовательно удалить все жесткие ссылки на него. П р и этом все жесткие
ссылки на файл (его имена) равноправны — среди них нет «главной», с ис¬
чезновением которой исчезнет файл. П о к а есть хоть одна ссылка, файл
продолжает существовать. Впрочем, у большинства файлов в Linux есть
только одно и м я (одна жесткая ссылка на файл), поэтому команда rm имя
файла в большинстве случаев успешно удаляет файл.
К а к уже говорилось, символьные ссылки — это отдельные ф а й л ы ,
поэтому после того, как М е ф о д и й удалил файл t e x t , t e x t - s y m l i n k ,
который ссылался на этот файл, продолжает существовать, однако теперь
это — «битая ссылка», поэтому его также м о ж н о удалить командой rm.

77
Курс Операционная система Linux

М е ф о д и й р е ш и л создать каталог для разных упражнений — t e s t , а


потом р е ш и л обойтись одним каталогом e x a m p l e s . Однако команда rm
не сработала, заявив, что t e s t — это каталог:

[ m e t h o d y @ l o c a l h o s t methody]$ m k d i r test

[ m e t h o d y @ l o c a l h o s t methody]$ rm test

rm: невозможно удалить "test': Is a directory

[ m e t h o d y @ l o c a l h o s t methody]$ r m d i r test

[methody@localhost methody]$

Пример 4.17. Удаление каталога

Для удаления каталогов предназначена другая утилита — r m d i r (от


англ. «remove directory»). Впрочем, r m d i r согласится удалить каталог
только в том случае, если о н пуст: в нем нет никаких файлов и подкатало¬
гов. Удалить каталог вместе со всем его содержимым м о ж н о командой rm
с ключом " - r " (recursive). Команда rm - r каталог — очень удобный спо¬
соб потерять в одночасье все файлы: она рекурсивно* обходит весь ката­
лог, удаляя все, что попадется: файлы, подкаталоги, символьные ссыл­
ки... а ключ " - f " (force) делает ее работу е щ е неотвратимее, так к а к п о ­
давляет запросы вида «удалить з а щ и щ е н н ы й от записи файл», так что rm
работает безмолвно и безостановочно.

Помните: если вы удалили файл, значит, о н уже н е нужен, и н е


подлежит восстановлению!

В Linux н е предусмотрено процедуры восстановления удаленных


файлов и каталогов. Поэтому стоит быть очень внимательным, отдавая ко¬
манду rm и, тем более, rm - r : нет н и к а к о й гарантии, что случайно уда¬
л е н н ы е д а н н ы е удастся восстановить. Узнав об этом, М е ф о д и й н е огор­
чился, н о подумал, что впредь будет удалять только действительно ненуж­
н ы е файлы, а все сомнительное — перемещать с п о м о щ ь ю mv в подката­
лог ~/tmp, где о н о н е будет мешать, и где м о ж н о периодически наводить
порядок.

* « Р е к у р с и в н о » п о о т н о ш е н и ю к к а т а л о г а м обозначает, ч т о д е й с т в и е будет п р о и з в е д е н о
н а д с а м и м к а т а л о г о м , его п о д к а т а л о г а м и , п о д к а т а л о г а м и его п о д к а т а л о г о в и т. д.

78
Лекция 5 Доступ процессов к файлам и каталогам

Лекция 5. Доступ процессов к файлам


и каталогам

В лекции описываются понятия процесса в Linux, алгоритм порождения


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

Ключевые слова: alias, активный процесс, возвращаемое значение,


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

Процессы

К а к уже упоминалось в л е к ц и и 1, загрузка Linux завершается тем,


что на всех виртуальных консолях (на самом деле — на всех терминалах
системы), предназначенных для работы пользователей, запускается п р о ­
грамма g e t t y . Программа выводит приглашение и ожидает активности
пользователя, который может захотеть работать и м е н н о на этом термина­
ле. Введенное входное и м я g e t t y передает программе l o g i n , которая
вводит пароль и определяет, разрешено ли работать в системе с этим вход¬
н ы м именем и этим паролем. Если l o g i n приходит к выводу, что рабо¬
тать м о ж н о , она запускает стартовый командный интерпретатор, посредст¬
вом которого пользователь и управляет системой.
Выполняющаяся программа называется в Linux процессом. Все п р о ­
цессы система регистрирует в таблице процессов, присваивая каждому
уникальный номер — идентификатор процесса (process identificator, P I D ) .
Манипулируя процессами, система имеет дело и м е н н о с их идентифика¬
торами, другого способа отличить один процесс от другого, по большому
счету, нет. Для просмотра своих процессов м о ж н о воспользоваться утили¬
той p s («process status»):

79
Курс Операционная система Linux

[ m e t h o d y @ l o c a l h o s t methody]$ ps - f

UID PID PPID C STIME TTY TIME CMD

methody 3590 1850 0 13:58 t t y 3 00:00:00 -bash

methody 3624 3590 0 14:01 t t y 3 00:00:00 ps - f

Пример 5.1. Просмотр таблицы собственных процессов

Здесь М е ф о д и й вызвал p s с ключом " - f " («full»), чтобы добыть


п о б о л ь ш е и н ф о р м а ц и и . Представлены оба п р и н а д л е ж а щ и х ему п р о ц е с ­
са: стартовый к о м а н д н ы й интерпретатор, b a s h , и в ы п о л н я ю щ и й с я p s .
Оба процесса з а п у щ е н ы с терминала t t y 3 (третьей системной к о н с о л и )
и имеют и д е н т и ф и к а т о р ы 3590 и 3624 соответственно. В поле P P I D
(«parent process identificator») указан и д е н т и ф и к а т о р родительского про­
цесса, т. е. процесса, породившего д а н н ы й . Д л я p s это — b a s h , а д л я
b a s h , очевидно, l o g i n , т а к к а к и м е н н о о н запускает стартовый shell. В
выдаче н е оказалось строки д л я этого l o g i n , р а в н о к а к и д л я б о л ь ш и н ­
ства других процессов системы, так к а к о н и н е принадлежат пользовате­
л ю methody.

процесс
Выполняющаяся программа в Linux. Каждый процесс имеет
уникальный идентификатор процесса, P I D . Процессы получают
доступ к ресурсам системы (оперативной памяти, файлам,
в н е ш н и м устройствам и т. п.) и могут изменять их содержимое.
Доступ регулируется с п о м о щ ь ю идентификатора пользователя и
идентификатора труппы, которые система присваивает каждому
процессу.

Запуск дочерних процессов

Запуск одного процесса вместо другого организован в Linux с п о м о ­


щью системного вызова e x e c ( ) . Старый процесс из памяти удаляется н а ­
всегда, вместо него загружается н о в ы й , п р и этом настройка окружения н е
меняется, даже P I D остается прежним. Вернуться к в ы п о л н е н и ю старого
процесса невозможно, разве что запустить его снова с п о м о щ ь ю того ж е
e x e c ( ) (от «execute» — «исполнить»). Кстати, имя файла (программы), и з
которого запускается процесс, и собственное имя процесса (в таблице
процессов) могут и н е совпадать. Собственное и м я процесса — это такой
ж е параметр командной строки, к а к и те, что передаются ему пользовате­
лем: для e x e c ( ) требуется и путь к файлу, и полная командная строка, ну­
левой (стартовый) элемент которой — к а к раз название команды*.
* Нулевой п а р а м е т р — argv[0] в т е р м и н а х я з ы к а С и и $0 в т е р м и н а х shell

80
Лекция 5 Доступ процессов к файлам и каталогам

Вот откуда "-" в начале и м е н и стартового командного интерпрета¬


тора (-bash): его «подсунула» программа l o g i n , чтобы была возмож¬
ность отличать его от других запущенных тем же пользователем оболочек.
Для работы командного интерпретатора одного e x e c ( ) недостаточ­
но. В самом деле, shell не просто запускает утилиту, а дожидается ее завер­
ш е н и я , обрабатывает результаты ее работы и продолжает диалог с пользо­
вателем. Для этого в Linux служит системный вызов f o r k ( ) («вилка, раз¬
вилка»), п р и м е н е н и е которого приводит к в о з н и к н о в е н и ю еще одного,
дочернего, процесса — точной к о п и и породившего его родительского. До­
черний процесс ничем не отличается от родительского: имеет такое ж е ок¬
ружение, те ж е стандартный ввод и стандартный вывод, одинаковое со¬
держимое памяти и продолжает работу с той же самой точки (возврат из
f o r k ( ) ) . Отличий два: во-первых, эти процессы имеют р а з н ы е P I D , под
которыми они зарегистрированы в таблице процессов, а во-вторых, раз­
личается возвращаемое значение f o r k ( ) : родительский процесс получает
в качестве результата f o r k ( ) идентификатор процесса-потомка, а про¬
цесс-потомок получает " 0 " .
Д а л ь н е й ш и е действия shell при запуске к а к о й - л и б о программы оче­
видны. Shell-потомок немедленно вызывает эту программу с п о м о щ ь ю
e x e c ( ) , а shell-родитель дожидается завершения работы процесса-по¬
томка ( P I D которого ему известен) с п о м о щ ь ю еще одного системного
вызова, w a i t ( ) . Дождавшись и проанализировав результат команды,
shell продолжает работу:

[ m e t h o d y @ l o c a l h o s t methody]$ c a t > l o o p

while true; do t r u e ; done


A
D

[ m e t h o d y @ l o c a l h o s t methody]$ sh loop
A
C

[methody@localhost methody]$

Пример 5.2. Создание бесконечно выполняющегося сценария

П о совету Гуревича М е ф о д и й создал сценарий для s h (или b a s h , на


таком уровне их команды совпадают), который ничего не делает. Точнее
было бы сказать, что этот сценарий делает ничего, бесконечно повторяя в
ц и к л е команду, вся работа которой состоит в том, что она завершается без
о ш и б о к (в лекции 7 говорится о том, что " > файл" в командной строке
просто перенаправляет стандартный вывод команды в файл). Запустив
этот сценарий с п о м о щ ь ю команды вида s h имя_сценария, М е ф о д и й
ничего не увидел, но услышал, к а к загудел вентилятор охлаждения цент­
рального процессора: м а ш и н а трудилась! Управляющий символ " С " , Л

81
Курс Операционная система Linux

как обычно, привел к завершению активного процесса, и к о м а н д н ы й и н ­


терпретатор продолжил работу.
Если бы в о п и с а н н о й в ы ш е ситуации родительский процесс н е ждал,
пока дочерний завершится, а сразу продолжал работать, получилось бы,
что оба процесса выполняются параллельно: пока запущенный процесс
что-то делает, пользователь продолжает командовать оболочкой. Д л я того
чтобы запустить процесс параллельно, в shell достаточно добавить "&" в
конец командной строки:

[ m e t h o d y @ l o c a l h o s t methody]$ s h loop&

[1] 3634

[ m e t h o d y @ l o c a l h o s t methody]$ ps - f

UID PID PPID C STIME TTY TIME CMD

methody 3590 1850 0 13:58 t t y 3 00:00:00 -bash

methody 3634 3590 99 14:03 t t y 3 00:00:02 s h l o o p

methody 3635 3590 0 14:03 t t y 3 00:00:00 ps - f

Пример 5.3. Запуск фонового процесса


В результате стартовый командный интерпретатор ( P I D 3590) ока­
зался родителем сразу двух процессов: s h , выполняющего сценарий
l o o p , и ps.
П р о ц е с с , запускаемый параллельно, называется фоновым (back­
ground). Фоновые процессы н е имеют возможности вводить д а н н ы е с того
ж е терминала, что и породивший их shell (только из файла), зато выводить
д а н н ы е на этот терминал могут (правда, когда на одном и том ж е термина­
ле вперемежку появляются сообщения от нескольких фоновых процессов,
начинается неразбериха). П р и каждом терминале в каждый момент време­
н и может быть н е больше одного активного (foreground) процесса, которо­
му разрешено вводить д а н н ы е с этого терминала. Н а время, пока команда
(например, c a t ) работает в активном режиме, породивший ее командный
интерпретатор «уходит в фон», и там, в ф о н е , выполняет свой w a i t ( ) .

активный процесс, foreground process


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

фоновый процесс, background process


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

82
Лекция 5 Доступ процессов к файлам и каталогам

Стоит заметить, что параллельность работы процессов в Linux — дис­


кретная. Здесь и сейчас выполняться может столько процессов, сколько
центральных процессоров есть в компьютере (например, один). Дав это­
му одному процессу немного поработать, система запоминает все, что н е ­
обходимо ему для работы, приостанавливает его, и запускает следующий
процесс, потом следующий и так далее. Возникает очередь процессов,
ожидающих выполнения. Только что поработавший процесс помещается
в к о н е ц этой очереди, а следующий выбирается из ее начала. Когда оче¬
редь вновь доходит до того, первого процесса, система вспоминает необ¬
ходимые для его выполнения д а н н ы е (они называются контекстом про­
цесса), и он продолжает работать как н и в чем не бывало. Такая схема раз­
деления времени между процессами называется псевдопараллелизмом.
В выдаче p s , которую получил М е ф о д и й , м о ж н о заметить, что P I D
стартовой оболочки равен 3 59 0, а P I D запущенных из-под него команд
(одной ф о н о в о й и одной активной) — 3634 и 3635. Это значит, что за
время, прошедшее с момента входа М е ф о д и я в систему до момента запу­
ска s h loop&, в системе было запущено еще 3 6 3 4 - 3 5 9 0 = 44 процесса.
Что ж, в Linux могут одновременно работать несколько пользователей, да
и самой системе иногда случается запустить какую-нибудь утилиту (на­
пример, выполняя действия по расписанию). А вот s h и p s получили со­
седние P I D , значит, пока М е ф о д и й нажимал Enter и набирал p s - f , ни¬
каких других процессов не запускалось.
В действительности далеко не всем процессам, зарегистрированным
в системе, на самом деле необходимо давать поработать наравне с други¬
ми. Большинству процессов работать прямо сейчас не нужно: они ожида­
ют какого-нибудь события, которое им необходимо обработать. Ч а щ е
всего процессы ждут завершения операции ввода-вывода. Чтобы посмот­
реть, как потребляются ресурсы системы, м о ж н о использовать утилиту
t o p . Н о сначала М е ф о д и й р е ш и л запустить еще один бесконечный сцена¬
р и й (ему было интересно, как два процесса конкурируют за ресурсы):

[ m e t h o d y @ l o c a l h o s t methody]$ b a s h loop&

[2] 3639

[ m e t h o d y @ l o c a l h o s t methody]$ t o p

14:06:50 up 3:41, 5 users, load average: 1,31, 0,76, 0,42

4 processes: 1 sleeping, 3 running, 0 zombie, 0 stopped

CPU states: 99,4% u s e r , 0,5% s y s t e m , 0,0% nice, 0,0% iowait, 0,0% idle

Mem: 514604k av, 310620k u s e d , 203984k f r e e , 0k s h r d , 47996k buff

117560k a c t i v e , 148388k inactive

Swap: 1048280k av, 0k u s e d , 1048280k free 184340k cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND

3639 methody 20 0 1260 1260 1044 R 50,3 0,2 0:12 bash

83
Курс Операционная система Linux

3634 methody 18 0 980 980 844 R 49,1 0,1 3:06 sh

3641 methody 9 0 1060 1060 872 R 0,1 0,2 0:00 top

3590 methody 9 0 1652 1652 1264 S 0,0 0,3 0:00 bash

Пример 5.4. Разделение времени между процессами

Оказалось, что дерутся даже не два процесса, а три: s h (первый из за­


пущенных интерпретаторов l o o p ) , b a s h (второй) и сам t o p . Правда, по
сведениям из поля %CPU, львиную долю процессорного времени отобра­
ли s h и b a s h (они без устали вычисляют!), а t o p довольствуется десятой
долей процента (а то и меньшей: о ш и б к и округления). Стартовый b a s h
вообще не хочет работать, он спит (значение "S", Sleep, поля STAT, sta­
tus): ждет завершения активного процесса, t o p .
Увидев такое разнообразие и н ф о р м а ц и и , Мефодий кинулся читать
руководство по t o p , однако скоро понял, что без знания архитектуры
Linux большая его часть не имеет смысла. Впрочем, некоторая часть все же
понятна: объем оперативной памяти (всей, используемой и свободной),
время работы м а ш и н ы , объем памяти, занимаемой процессами, и т. п.
Последний процесс, запущенный из оболочки в ф о н е , м о ж н о из
этой оболочки сделать активным при п о м о щ и команды f g (^foreground*
— «передний план»):

[ m e t h o d y @ l o c a l h o s t methody]$ f g

bash loop
Л
С

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


п о м о щ ь ю команды f g (foreground)

Услужливый b a s h даже написал командную строку, которой был за­


пущен этот процесс: " b a s h l o o p " . М е ф о д и й р е ш и л «убить» его с п о м о ­
щью управляющего символа " С " . Теперь последним запущенным в ф о н е
Л

процессом стал sh, в ы п о л н я ю щ и й сценарий l o o p .

Сигналы

Чтобы завершить работу фонового процесса с п о м о щ ь ю " С " , М е - Л

ф о д и ю пришлось сначала сделать его активным. Это не всегда возможно


и не всегда удобно. На самом деле, " С " — это не волшебная к н о п к а -
Л

убийца, а предварительно установленный символ (с ascii-кодом 3), при


получении которого с терминала Linux передаст активному процессу сиг­
нал 2 (по и м е н и INT, от «interrupt» — «прервать»).

84
Лекция 5 Доступ процессов к файлам и каталогам

Сигнал — это способность процессов обмениваться стандартными


короткими с о о б щ е н и я м и непосредственно с п о м о щ ь ю системы. Сооб¬
щение-сигнал н е содержит н и к а к о й и н ф о р м а ц и и , к р о м е номера сигнала
(для удобства вместо номера м о ж н о использовать предопределенное с и с ­
темой имя). Д л я того чтобы передать сигнал, процессу достаточно задей­
ствовать системный вызов k i l l ( ) , а для того чтобы принять сигнал, н е
нужно ничего. Если процессу необходимо как-то по-особенному реаги­
ровать на сигнал, о н может зарегистрировать обработчик, а если обработ­
ч и к а нет, за него отреагирует система. К а к правило, это приводит к не¬
медленному завершению процесса, получившего сигнал. Обработчик
сигнала запускается асинхронно, немедленно после получения сигнала,
что бы процесс в это время н и делал.

сигнал
Короткое сообщение, посылаемое системой или процессом
другому процессу. Обрабатывается асинхронно специальной
подпрограммой-обработчиком. Если процесс н е обрабатывает
сигнал самостоятельно, это делает система.

Два сигнала — 9 ( K I L L ) и 19 (STOP) — всегда обрабатывает система.


П е р в ы й и з н и х нужен для того, чтобы убить процесс наверняка (отсюда и
название). Сигнал STOP приостанавливает процесс: в таком состоянии
процесс н е удаляется из таблицы процессов, н о и н е выполняется до тех
пор, пока н е получит сигнал 18 (CONT) — после чего продолжит работу. В
Linux сигнал STOP м о ж н о передать активному процессу с п о м о щ ь ю уп¬
равляющего символа " Z " : A

[ m e t h o d y @ l o c a l h o s t methody]$ s h l o o p
A
Z

[1]+ S t o p p e d sh loop

[ m e t h o d y @ l o c a l h o s t methody]$ bg

[1]+ s h l o o p &

[ m e t h o d y @ l o c a l h o s t methody]$ f g

sh loop
A
C

[methody@localhost methody]$

Пример 5.6. Перевод процесса в ф о н с п о м о щ ь ю " Z " и b g A

Мефодий сначала запустил вечный цикл в качестве активного процес­


са, затем передал ему сигнал STOP с помощью " Z " , после чего дал коман­ A

ду b g (back ground), запускающую в фоне последний остановленный п р о -

85
Курс Операционная система Linux

цесс. Затем он снова перевел этот процесс в активный режим, и, наконец,


убил его.
Передавать сигналы из командной строки м о ж н о л ю б ы м процессам
с п о м о щ ь ю команды k i l l -сигнал PID или просто k i l l PID, которая
передает сигнал 15 (TERM):

[ m e t h o d y @ l o c a l h o s t methody]$ s h

sh-2.05b$ s h l o o p & bash loop &

[1] 3652

[2] 3653

sh-2.05b$ p s - f H

UID PID PPID С STIME TTY TIME CMD

methody 3590 1850 0 13:58 tty3 00:00:00 -bash

methody 3634 3590 87 14:03 tty3 00:14:18 sh loop

methody 3651 3590 0 14:19 tty3 00:00:00 sh

methody 3652 3651 34 14:19 tty3 00:00:01 sh loop

methody 3653 3651 35 14:19 tty3 00:00:01 bash loop

methody 3654 3651 0 14:19 tty3 00:00:00 ps - f H

Пример 5.7. Запуск множества фоновых процессов

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


поубивать их. Для этого он, вдобавок к уже висящему в фоне s h l o o p , запу¬
стил в качестве активного процесса новый командный интерпретатор, s h
(при этом изменилось приглашение командной строки). И з этого s h он запус­
тил в фоне еще один s h l o o p и новый b a s h l o o p . Сделал он это одной к о ­
мандной строкой (при этом команды разделяются символом "&", т. е. «И»;
выходит, что запускается и та, и другая команда). В p s он использовал новый
ключ — "-H" («Hierarchy», «иерархия»), который добавляет в выдачу p s от­
ступы, показывающие отношения «родитель—потомок» между процессами:

sh-2.05b$ k i l l 3634

[1]+ Terminated sh loop

sh-2.05b$ p s - f H

UID PID PPID С STIME TTY TIME CMD

methody 3590 1850 0 13:58 tty3 00:00:00 -bash

methody 3651 3590 0 14:19 tty3 00:00:00 sh

methody 3652 3651 34 14:19 tty3 00:01:10 sh loop

methody 3653 3651 34 14:19 tty3 00:01:10 bash loop

methody 3658 3651 0 14:23 tty3 00:00:00 ps - f H

Пример 5.8. Принудительное завершение процесса с п о м о щ ь ю k i l l

86
Лекция 5 Доступ процессов к файлам и каталогам

Мефодий принялся убивать! Д л я начала о н остановил работу давно


запущенного sh, выполнявшего сценарий с вечным циклом ( P I D 3 63 4).
К а к видно и з предыдущего примера, этот процесс за 16 минут работы с и ­
стемы «съел» н е менее 14 минут процессорного времени, и конечно, ниче­
го полезного н е сделал. Сигнал о том, что процесс-потомок «умер», дошел
до обработчика в стартовом b a s h ( P I D 3 59 0), и на терминал было выве­
дено сообщение " [1]+ T e r m i n a t e d s h l o o p " , после чего стартовый
b a s h продолжил ждать завершения активного процесса — s h ( P I D 3 651):

sh-2.05b$ exit

[ m e t h o d y @ l o c a l h o s t methody]$ ps -fH

UID PID PPID С STIME TTY TIME CMD

methody 3590 1850 0 15:17 tty3 00:00:00 -bash

methody 3663 3590 0 15:23 tty3 00:00:00 ps - f H

methody 3652 1 42 15:22 tty3 00:00:38 bash loop

methody 3653 1 42 15:22 tty3 00:00:40 sh loop

[ m e t h o d y @ l o c a l h o s t methody]$ k i l l -HUP 3652 3653

[ m e t h o d y @ l o c a l h o s t methody]$ ps

PID TTY TIME CMD

3590 tty3 00:00:00 bash

3664 tty3 00:00:00 ps

Пример 5.9. Завершение процесса естественным путем с п о м о щ ь ю


сигнала «Hang Up»

Ждать ему оставалось недолго. Этот s h завершился естественным


путем, от команды e x i t , оставив после себя двух «детей-сирот» ( P I D
3652 и 3653), которые тотчас ж е усыновил «отец всех процессов» — i n i t
( P I D 1). Когда М е ф о д и й расправился и с н и м и — с п о м о щ ь ю сигнала 1
(HUP, то есть «Hang UP», «повесить»*) — некому было даже сообщить об
их к о н ч и н е (если бы процесс-родитель был ж и в , на связанный с н и м тер­
минал вывелось бы что-нибудь вроде " [ 1 ] + Hangup s h l o o p " ) .

Доступ к файлу и каталогу

Н о довольно насилия. Пора М е ф о д и ю задуматься и о другой сторо­


не работы с Linux: о правах и свободах. Д л я начала — о свободах. Таблица
процессов содержит с п и с о к важнейших объектов системы — процессов.
Однако н е менее важны и объекты другого класса, те, что доступны в фай­
ловой системе: файлы, каталоги и специальные ф а й л ы (символьные ссыл-
• И м я э т о г о с и г н а л а п р о и с х о д и т н е от к а з н и ч е р е з п о в е ш е н и е , а от п о в е ш е н н о й т е л е ф о н ­
н о й трубки.

87
Курс Операционная система Linux

ки, устройства и т. п.). П о о т н о ш е н и ю к объектам файловой системы п р о ­


цессы выступают в роли действующих субъектов: и м е н н о процессы поль­
зуются файлами, создают, удаляют и изменяют их. Факт использования
файла процессом называется доступом к файлу, а способ воспользоваться
файлом (каталогом, ссылкой и т. д.) — видом доступа.

Чтение,запись и использование

Видов доступа в файловой системе Linux три. Доступ на чтение (read)


разрешает получать и н ф о р м а ц и ю из объекта, доступ на запись (write) —
изменять и н ф о р м а ц и ю в объекте, а доступ на использование (execute) —
выполнить операцию, специфичную для данного типа объектов. Доступ к
объекту м о ж н о изменить командой chmod (change mode, сменить режим
(доступа)). В простых случаях формат этой команды таков: chmod доступ
объект, где объект — это и м я файла, каталога и т. п., а доступ описывает
вид доступа, который необходимо разрешить или запретить. Значение
"+r" разрешает доступ к объекту на чтение (read), " - r " — запрещает.
Аналогично "+w", " -w", "+x" и " - x " разрешают и запрещают доступ на
запись (write) и использование (execute).

Доступ к файлу

Доступ к файлу на чтение и запись — довольно очевидные понятия:

[methody@localhost methody]$ date > tmpfile

[methody@localhost methody]$ cat tmpfile

Срд Сен 22 14:52:03 MSD 2004

[methody@localhost methody]$ chmod - r t m p f i l e

[methody@localhost methody]$ cat tmpfile

cat: tmpfile: Permission denied

[methody@localhost methody]$ date -u > tmpfile

[methody@localhost methody]$ chmod +r tmpf i l e ; chmod -w tmpf i l e

[methody@localhost methody]$ cal > tmpfile

-bash: t m p f i l e : Permission denied

[methody@localhost methody]$ cat tmpfile

Срд Сен 22 10:52:35 UTC 2004

[methody@localhost methody]$ rm tmpfile

rm: удалить защищенный от записи обычный файл "tmpfile'? y

Пример 5.10. Что м о ж н о и что нельзя делать с файлом, доступ к ко¬


торому ограничен

88
Лекция 5 Доступ процессов к файлам и каталогам

Следует заметить, что М е ф о д и ю известна операция перенаправления


вывода — ">", с п о м о щ ь ю которой о н создает ф а й л ы в своем д о м а ш н е м
каталоге. Добавление "> файл" в командную строку приводит к тому, что
все, что было бы выведено на э к р а н терминала*, попадает в файл. М е ф о ­
д и й создает файл, проверяет, м о ж н о л и из него читать, командой c a t , за­
прещает доступ на чтение и снова проверяет: на этот раз c a t сообщает об
отказе в доступе («Permission denied»). Тем н е менее, записать в этот файл,
перенаправив выдачу d a t e -u оказывается возможным, потому что до¬
ступ на запись н е закрыт. Если ж е закрыть доступ на запись, а доступ на
чтение открыть (Мефодий сделал это в одной командной строке, разде¬
лив команды символом ";"), невозможным станет изменение этого ф а й ­
ла: попытка перенаправить вывод программы c a l окажется неудачной, а
чтение снова заработает. Сработает и удаление этого файла, хотя rm на
всякий случай предупредит о том, ч т о файл з а щ и щ е н от записи.
Доступ к файлу на использование означает возможность запустить
этот файл в качестве программы, выполнить его. Н а п р и м е р , все ф а й л ы из
каталога / b i n (в том числе / b i n / l s , / b i n / r m , / b i n / c a t , / b i n / e c h o
и / b i n / d a t e ) — исполняемые, т. е. доступны для использования, и оттого
их м о ж н о применять в командной строке в качестве команд. В общем слу­
чае необходимо указать путь к программе, например, / b i n / l s , однако
программы, находящиеся в каталогах, перечисленных в переменной окру­
жения PATH, м о ж н о вызывать просто по имени: l s (подробнее о перемен­
ных окружения рассказано в л е к ц и и 8).

Сценарий

И с п о л н я е м ы е ф а й л ы в Linux бывают двух видов. Первый — это ф а й ­


л ы в собственно исполняемом (executable) формате. К а к правило, такие
ф а й л ы — результат компиляции программ, написанных на классических
языках программирования вроде С и . П о п ы т к а прочитать такой файл с
п о м о щ ь ю , например, c a t н е приведет н и к чему полезному: на экране
начнут появляться разнообразные бессмысленные символы, в том числе
управляющие. Это так называемые машинные коды — я з ы к , п о н я т н ы й
только компьютеру. В Linux используется несколько форматов и с п о л н я е ­
мых файлов, состоящих и з м а ш и н н ы х кодов и служебной и н ф о р м а ц и и ,
необходимой операционной системе для запуска программы: согласно
этой и н ф о р м а ц и и , ядро Linux выделяет для запускаемой программы опе­
ративную память, загружает программу и з файла и передает ей управле­
ние. Большинство утилит Linux — программы и м е н н о такого, «двоично¬
го» формата.
* Т о ч н е е , н а стандартный вывод п р о г р а м м ы , такое п е р е н а п р а в л е н и е н е к а с а е т с я стандарт­
ного вывода ошибок.

89
Курс Операционная система Linux

Второй вид исполняемых файлов — сценарии. Сценарий — это текс­


товый файл, предназначенный для обработки какой-нибудь утилитой.
Ч а щ е всего такая утилита — это интерпретатор некоторого я з ы к а п р о ­
граммирования, а содержимое такого файла — программа на этом языке.
М е ф о д и й уже написал один сценарий для sh: бесконечно в ы п о л н я ю щ у ­
юся программу l o o p . Поскольку к тому времени он еще не знал, как
пользоваться chmod, ему всякий раз приходилось я в н о указывать интер­
претатор ( s h или b a s h ) , а сценарий передавать ему в виде параметра (см.
п р и м е р ы в разделе «Процессы»).

сценарий
И с п о л н я е м ы й текстовый файл. Для выполнения сценария тре­
буется программа-интерпретатор, путь к которой может быть
указан в начале сценария в виде " #!путь_к_мнтерпретато-
ру". Если интерпретатор не задан, им считается / b i n / s h .

Если ж е сделать файл и с п о л н я е м ы м , то ту ж е самую процедуру — за­


пуск интерпретатора и передачу ему сценария в качестве параметра к о ­
мандной строки — будет выполнять система:

[ m e t h o d y @ l o c a l h o s t methody]$ c a t > script

echo 'Hello, Methody!'


A
D

[ m e t h o d y @ l o c a l h o s t methody]$ ./script

-bash: ./script: Permission denied

[ m e t h o d y @ l o c a l h o s t methody]$ sh script

Hello, Methody!

[ m e t h o d y @ l o c a l h o s t methody]$ chmod +x script

[ m e t h o d y @ l o c a l h o s t methody]$ ./script

Hello, Methody!

Пример 5.11. Создание простейшего исполняемого сценария

С первого раза М е ф о д и ю не удалось запустить сценарий s c r i p t ,


потому что по умолчанию файл создается доступным для записи и чте­
н и я , но не для использования. После chmod +x файл стал исполняемым.
Поскольку д о м а ш н и й каталог М е ф о д и я не входил в PATH, пришлось и с ­
пользовать путь до созданного сценария, благо он оказался недлинным:
" текущий_каталог/имя_сценария", т. е. . / s c r i p t .
Если системе не дать специального указания, то в качестве интер­
претатора она запускает стандартный shell — / b i n / s h . Однако есть воз­
можность написать сценарий для любой утилиты, в том числе и н а п и с а н -

90
Лекция 5 Доступ процессов к файлам и каталогам

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


быть символы "#!", тогда всю его первую строку, начиная с третьего бай¬
та, система воспримет к а к команду обработки. И с п о л н е н и е такого сцена¬
р и я приведет к запуску указанной после "#!" команды, последним пара­
метром которой будет и м я самого файла сценария:

[methody@localhost methody]$ c a t > t o . s o r t

#!/bin/sort

some

unsorted

lines

[methody@localhost methody]$ s o r t to.sort

#!/bin/sort

lines

some

unsorted

[methody@localhost methody]$ chmod +x to.sort

[methody@localhost methody]$ ./to.sort

#!/bin/sort

lines

some

unsorted

Пример 5.12. Создание s o r t - с ц е н а р и я

Утилита s o r t сортирует — расставляет в алфавитном, обратном ал­


фавитном или другом порядке — строки передаваемого ей файла. То ж е
самое произойдет, если сделать этот файл и с п о л н я е м ы м , вписав в начало
/ b i n / s o r t в качестве интерпретатора, а затем выполнить получивший­
ся сценарий: запустится утилита s o r t , а сценарий (файл с неотсортиро­
в а н н ы м и строками) будет передан ей в качестве параметра. Оформлять
ф а й л ы , которые необходимо отсортировать, в виде sort-сценариев д о ­
вольно бессмысленно — М е ф о д и й просто хотел е щ е раз убедиться, что
сценарий м о ж н о написать для чего угодно.

Доступ к каталогу

В отличие от файла, н о в ы й каталог создается (с п о м о щ ь ю m k d i r )


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

91
Курс Операционная система Linux

ность изменить содержимое каталога, а доступ для использования — воз­


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

[ m e t h o d y @ l o c a l h o s t methody]$ mkdir d i r

[ m e t h o d y @ l o c a l h o s t methody]$ date > dir/smallfile

[ m e t h o d y @ l o c a l h o s t methody]$ /bin/ls d i r

smallfile

[ m e t h o d y @ l o c a l h o s t methody]$ cd d i r

[methody@localhost d i r ] $ pwd

/home/methody/dir

[methody@localhost d i r ] $ cd

[ m e t h o d y @ l o c a l h o s t methody]$ pwd

/home/methody

[ m e t h o d y @ l o c a l h o s t methody]$ cat dir/smallfile

Срд Сен 22 13:15:20 MSD 2004

Пример 5.13. Доступ к каталогу на чтение и использование

М е ф о д и й создал каталог d i r и файл s m a l l f i l e в нем. П р и смене


текущего каталога b a s h автоматически изменил строку-подсказку: как
было сказано в л е к ц и и 4, последнее слово этой подсказки — и м я текуще­
го каталога. О п и с а н н а я в той ж е лекции команда pwd (print work directory)
подтверждает это. Команда c d без параметров, как ей это и полагается,
делает текущим домашний каталог пользователя:

[ m e t h o d y @ l o c a l h o s t methody]$ chmod -x d i r

[ m e t h o d y @ l o c a l h o s t methody]$ lsdir

ls: dir/smallfile: Permission denied

[ m e t h o d y @ l o c a l h o s t methody]$ alias l s

alias ls='ls --color=auto'

[ m e t h o d y @ l o c a l h o s t methody]$ /bin/ls d i r

smallfile

[ m e t h o d y @ l o c a l h o s t methody]$ cd d i r

-bash: c d : d i r : P e r m i s s i o n denied

[ m e t h o d y @ l o c a l h o s t methody]$ cat dir/smallfile

cat: dir/smallfile: Permission denied

Пример 5.14. Доступ к каталогу на чтение без использования

92
Лекция 5 Доступ процессов к файлам и каталогам

М е ф о д и й запретил доступ на использование каталога, ожидая, что


просмотреть его содержимое с п о м о щ ь ю l s будет м о ж н о , а сделать его те¬
к у щ и м и добыть содержимое находящегося в нем файла — нельзя. Неожи¬
д а н н о команда l s выдала ошибку. Проницательный М е ф о д и й заметил,
что имя файла — s m a l l f i l e — команда l s все-таки добыла, но ей зачем-
то понадобился и сам файл. Гуревич посоветовал посмотреть, что выдаст
команда a l i a s l s . Оказывается, вместо простого l s умный b a s h под­
ставляет специфичную для Linux команду l s - - c o l o r = a u t o , которая
раскрашивает имена файлов в разные цвета в зависимости от их типа. Для
того чтобы определить тип файла (например, запускаемый ли он) необхо¬
д и м о получить к нему доступ, а этого-то как раз нельзя сделать, когда н е ­
в о з м о ж н о использовать каталог. Если я в н о в ы з ы в а т ь утилиту l s
( / b i n / l s ) , поведение каталога становится вполне предсказуемым. П о ­
дробнее о том, чем занимается команда a l i a s (о сокращениях), расска­
зывается в лекции 8:

[ m e t h o d y @ l o c a l h o s t methody]$ chmod +x d i r ; chmod - r d i r

[ m e t h o d y @ l o c a l h o s t methody]$ /bin/ls d i r

/bin/ls: d i r : Permission denied

[ m e t h o d y @ l o c a l h o s t methody]$ c a t d i r / s m a l l f i l e

Срд Сен 22 13:15:20 MSD 2004

[ m e t h o d y @ l o c a l h o s t methody]$ c d d i r

[methody@localhost d i r ] $ /bin/ls

ls: .: P e r m i s s i o n denied

[methody@localhost d i r ] $ cd

[methody@localhost methody]$

Пример 5.15. Доступ к каталогу на использование без чтения

Если каталог, доступный для чтения, но недоступный для использо­


вания, требуется редко, то каталог, доступный для использования, но н е ­
доступный для чтения, может пригодиться. К а к видно из примера, полу­
чить список файлов, находящихся в таком каталоге, не удастся, но полу­
чить доступ к самим файлам, зная их имена — можно. М е ф о д и й тут ж е за­
хотел положить в созданный каталог какой-нибудь нужный, но очень се­
кретный файл, чтобы и м я этого файла никто, кроме близких друзей, не
знал. Поразмыслив, М е ф о д и й отказался от этой затеи: во-первых, не без
оснований подозревая, что администратор (суперпользователь) все равно
сможет просмотреть содержимое такого каталога, а во-вторых, потому
что нужного, но очень секретного файла под рукой не оказалось:

93
Курс Операционная система Linux

[ m e t h o d y @ l o c a l h o s t methody]$ rm - r f d i r

rm: невозможно открыть каталог "dir': Permission denied

[ m e t h o d y @ l o c a l h o s t methody]$ chmod -R +rwx d i r

[ m e t h o d y @ l o c a l h o s t methody]$ rm - r f d i r

Пример 5.16. Рекурсивное удаление каталога

Потеряв интерес к секретным файлам, М е ф о д и й решил удалить ка­


талог d i r . И з л е к ц и и 4 о н знает, что это м о ж н о сделать не с п о м о щ ь ю
r m d i r , а с п о м о щ ь ю rm с ключом " - r " (recursive). Н о сходу воспользо­
ваться rm не удалось: чтение-то из каталога невозможно, и потому н е и з ­
вестно, какие ф а й л ы там надо удалять. Поэтому сначала надо разрешить
все виды доступа к d i r . Н а всякий случай (а вдруг внутри d i r попадется
такой ж е нечитаемый подкаталог?) М е ф о д и й выполняет рекурсивный ва­
риант chmod — с ключом "-R" ("R" здесь большое, а не маленькое, пото­
му что " - r " уже занято: означает запрет чтения). Команда chmod -R
+ rwx d i r делает все ф а й л ы и каталоги в d i r доступными для чтения, за­
писи и использования; при этом все ф а й л ы становятся и с п о л н я е м ы м и ,
но кого это тревожит, если следующей командой будет rm?

94
Лекция 6 Права доступа

Лекция 6. Права доступа

В лекции вводится понятие прав доступа как отношение субъектов сис­


темы (процессов) к объектам (файлам) и описывается иерархия прав доступа
в Linux. Кроме того, описывается механизм подмены идентификатора, поз­
воляющий в некоторых случаях строго ограниченным способом обходить за¬
преты, устанавливаемые правами доступа.

Ключевые слова: E U I D , G I D , PID, SetGID, SetUID, U I D , атрибуты фай­


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

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

Работая с Linux, М е ф о д и й заметил, что некоторые ф а й л ы и катало­


ги недоступны ему н и для чтения, н и для записи, н и для использования.
Зачем такие нужны? Оказывается, другие пользователи могут обращать­
ся к этим файлам, а у М е ф о д и я просто недостаточно прав.

Идентификатор пользователя

Говоря о правах доступа пользователя к файлам, стоит заметить, что


в действительности манипулирует файлами не сам пользователь, а запу¬
щ е н н ы й им процесс (например, утилита rm или c a t ) . Поскольку и файл,
и процесс создаются и управляются системой, ей нетрудно организовать
какую угодно политику доступа одних к другим, основываясь на любых
свойствах процессов как субъектов и файлов как объектов системы.
В Linux, однако, используются не какие угодно свойства, а результат
идентификации пользователя — его UID. Каждый процесс системы обяза­
тельно принадлежит какому-нибудь пользователю, и идентификатор
пользователя (UID) — обязательное свойство любого процесса Linux. Ког­
да программа l o g i n запускает стартовый командный интерпретатор, она
приписывает ему UID, полученный в результате диалога. О б ы ч н ы й за¬
пуск программы ( e x e c ( ) ) или порождение нового процесса ( f o r k ( ) ) не
изменяют U I D процесса, поэтому все процессы, запущенные пользовате­
лем во время терминальной сессии, будут иметь его идентификатор.

95
Курс Операционная система Linux

Поскольку UID однозначно определяется входным именем, оно н е ­


редко используется вместо идентификатора — для наглядности. Н а п р и ­
мер, вместо выражения «идентификатор пользователя, соответствующий
входному и м е н и methody», говорят «UID methody» (в приведенном н и ­
ж е примере этот идентификатор равен 5 03):

[ m e t h o d y @ l o c a l h o s t methody]$ i d

uid=503 (methody) gid=503 (methody) rpynnbi=503 (methody)

[ m e t h o d y @ l o c a l h o s t methody]$ i d shogun

uid=400(shogun) gid=400(shogun) г

рyппы=400(shogun),4(adm),10(wheel),19(proc)

Пример 6.1. К а к узнать идентификаторы пользователя и членство в


группах

Утилита i d , которой воспользовался М е ф о д и й , выводит входное имя


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

Идентификатор группы

К а к было рассказано в л е к ц и и 1, пользователь может быть членом


нескольких групп, равно к а к и несколько пользователей могут быть чле¬
н а м и одной и той же группы. Исторически сложилось так, что одна из
групп — группа по умолчанию — является для пользователя основной: ког­
да (не вполне точно) говорят о «GID пользователя», имеют в виду и м е н н о
идентификатор группы по умолчанию. В л е к ц и и 12 будет рассказано о
т о м , что GID пользователя в п и с а н в учетную запись и хранится в
/ e t c / p a s s w d , а и н ф о р м а ц и я о соответствии имен групп их идентифика­
торам, равно как и о том, в к а к и е еще группы входит пользователь — в
файле / e t c / g r o u p . И з этого следует, что пользователь не может не быть
членом как м и н и м у м одной группы, как снаряд не может не попасть в
эпицентр взрыва*.
Часто процедуру создания пользователя проектируют так, что и м я
группы по умолчанию совпадает с входным именем пользователя, а GID
пользователя — с его UID. Однако это совсем не обязательно: не всегда
нужно заводить для пользователя отдельную группу, а если заводить, то не
всегда удается сделать так,чтобы желаемый идентификатор группы сов¬
падал с желаемым идентификатором пользователя.
* Здесь есть т о н к о с т ь . В ф а й л е group у к а з ы в а ю т с я н е и д е н т и ф и к а т о р ы , а в х о д н ы е и м е н а
п о л ь з о в а т е л е й . Ф о р м а л ь н о г о в о р я , м о ж н о создать двух п о л ь з о в а т е л е й с одинаковым U I D ,
н о разными G I D и с п и с к а м и г р у п п . О б ы ч н о т а к н е делают: н а д о б н о с т и — п о ч т и н и к а к о й ,
а неразберихи возникнет много.

96
Лекция 6 Права доступа

Ярлыки объектов файловой системы

П р и создании объектов файловой системы — файлов, каталогов и т. п.


— каждому в обязательном порядке приписывается ярлык. Я р л ы к включа­
ет в себя UID — идентификатор пользователя-хозяина файла, GID — иден¬
тификатор группы, которой принадлежит файл, тип объекта и набор так
называемых атрибутов, а также некоторую дополнительную информа¬
цию. Атрибуты определяют, кто и что имеет право делать с файлом, о н и
о п и с а н ы ниже:

[methody@arnor methody]$ l s - l

итого 24

drwx 2 methody methody 4096 Сен 12 13:58 Documents

drwxr-xr-x 2 methody methody 4096 Окт 31 15:21 examples

-rw-r--r-- 1 methody methody 26 Сен 22 15:21 loop

-rwxr-xr-x 1 methody methody 23 Сен 27 13:27 script

drwx 2 methody methody 4096 Окт 1 15:07 tmp


-rwxr-xr-x 1 methody methody 32 Сен 22 13:26 to.sort

Пример 6.2. Права доступа к файлам и каталогам, п о к а з а н н ы е


командой l s - l

К л ю ч " - l " утилиты l s определяет «длинный» (long) формат выдачи


(справа налево): имя файла, время последнего и з м е н е н и я файла, размер в
байтах, группа, хозяин, количество жестких ссылок и строчка атрибутов.
П е р в ы й символ в строчке атрибутов определяет тип файла. Тип "-" отве­
чает «обычному» файлу, а тип " d " — каталогу (directory). И м я пользовате­
ля и имя группы, которым принадлежит содержимое домашнего каталога
М е ф о д и я , — естественно, methody.
Быстрый разумом М е ф о д и й немедленно заинтересовался вот чем:
несмотря на то, что создание жестких ссылок на каталог невозможно,
значение поля «количество жестких ссылок» для всех каталогов примера
равно двум, а н е одному. Н а самом деле этого и следовало ожидать, пото¬
му что любой каталог файловой системы Linux всегда имеет н е менее двух
имен: собственное (например, tmp) и и м я " . " в самом этом каталоге
(tmp/.). Если ж е в каталоге создать подкаталог, количество жестких ссы­
л о к на этот каталог увеличится на 1 за счет и м е н и в подкаталоге
(например, t m p / s u b d i r l / . . ) :

[methody@arnor methody]$ l s - l d tmp

drwx 3 methody methody 4096 Окт 1 15:07 tmp

[methody@arnor methody]$ m k d i r tmp/subdir2

97
Курс Операционная система Linux

[methody@arnor methody]$ l s - l d tmp

drwx 4 methody methody 4096 О к т 1 15:07 tmp

[methody@arnor methody]$ r m d i r tmp/subdir*

[methody@arnor methody]$ l s - l d tmp

drwx 2 methody methody 4096 О к т 1 15:07 tmp

Пример 6.3. Несколько жестких ссылок на каталог все-таки бывает!

Здесь Мефодий использовал ключ " - d " (directory) для того, чтобы ls вы­
водил информацию не о содержимом каталога tmp, а о самом этом каталоге.

Иерархия прав доступа

Теперь — более подробно о том, чему соответствуют девять символов


в строке атрибутов, выдаваемой l s . Эти девять символов имеют вид
" r w x r w x r w x " , где некоторые " r " , "w" и " x " могут заменяться на
Очевидно, буквы отражают п р и н я т ы е в Linux три вида доступа — чтение,
запись и использование — однако в я р л ы к е о н и присутствуют в трех э к ­
земплярах!
Дело в том, что любой пользователь (процесс) Linux п о о т н о ш е н и ю
к любому файлу может выступать в трех ролях: как хозяин (user), как член
группы, которой принадлежит файл (group), и как посторонний (other), н и ­
каких о т н о ш е н и й собственности на этот файл н е и м е ю щ и й . Строка атри¬
бутов — это три тройки "rwx" , о п и с ы в а ю щ и е права доступа к файлу хо¬
зяина этого файла (первая тройка, "u"), группы, которой принадлежит
файл (вторая тройка, "g") и посторонних (третья тройка, "o"). Если в ка¬
кой-либо тройке н е хватает буквы, а вместо нее стоит "-" , значит, поль¬
зователю в соответствующей роли будет в соответствующем виде доступа
отказано.
П р и в ы я с н е н и и о т н о ш е н и й между файлом и пользователем, запус­
т и в ш и м процесс, роль определяется так:
1. Если UID файла совпадает с UID процесса, пользователь — хозяин
файла.
2. Если GID файла совпадает с GID любой группы, в которую входит
пользователь, о н — член группы, которой принадлежит файл.
3. Если н и UID, н и GID файла н е пересекаются с UID процесса и спи¬
ском групп, в которые входит запустивший его пользователь, этот
пользователь — посторонний.
И м е н н о в роли хозяина пользователь (процесс) может изменять яр­
лык файла. Это вполне соответствует обыденным п о н я т и я м о собственно­
сти («мой файл: захочу — покажу, захочу — спрячу»). Единственное, чего
не может делать хозяин со своим файлом — менять ему хозяина.

98
Лекция 6 Права доступа

Далее следует протокол действий Гуревича, который, пользуясь воз­


можностями суперпользователя, создал в каталоге / tmp несколько файлов
с различными правами доступа к н и м . Для того чтобы напомнить челове­
ку, что работа ведется с правами суперпользователя (это требует гораздо
большей ответственности), b a s h заменил п р и в ы ч н ы й «доллар» в к о н ц е
приглашения командной строки на «решетку». Входное имя он тоже за¬
менил, но практика показывает, что решетка эффективнее:

[root@localhost r o o t ] # echo " A l l can read" > /tmp/read.all

[root@localhost r o o t ] # echo "Group wheel c a n r e a d " > /tmp/read.wheel

[root@localhost r o o t ] # echo "Group methody c a n r e a d " > /tmp/read.methody

[root@localhost r o o t ] # echo "Methody h i m s e l f can read" >

/tmp/read.Methody

[root@localhost r o o t ] # c h g r p wheel /tmp/read.wheel; chmod o - r

/tmp/read.wheel

[root@localhost r o o t ] # c h g r p methody /tmp/read.methody; chmod o - r

/tmp/read.methody

[root@localhost r o o t ] # chown methody /tmp/read.Methody; chmod o g - r

/tmp/read.Methody

Пример 6.4. Создание файлов с различными правами доступа

Права доступа изменяются с п о м о щ ь ю трех команд: chown (change


owner, сменить владельца), c h g r p (change group, сменить группу) и chmod
с р а с ш и р е н н ы м форматом параметра: перед частью, определяющей до­
ступ (перед знаком " + " или "-"), могут быть перечислены роли " u " ,
"g", "o" и " a " (all, что соответствует "ugo"), доступ для которых изме­
няется. К р о м е того, при задании доступа м о ж н о вместо " + " и "-" и с ­
пользовать " = ", тогда для заданных ролей указанные способы доступа
разрешаются, а неуказанные — запрещаются. Вместо пары команд chown
хозяин файл; c h g r p группа файл м о ж н о применять одну: chown хо­
зяин: группа файл, которая изменяет одновременно и U I D , и G I D
файла (каталога, ссылки и т. п.).
М е ф о д и й хочет посмотреть, кто имеет доступ к файлам, созданным
Гуревичем, а вдобавок — к файлу / e t c / s h a d o w . Для этого он использует
команду l s - l с шаблоном, о п и с ы в а ю щ и м сразу все ф а й л ы , которые на­
ходятся в / tmp и и м я которых начинается на " r e a d . " .

[ m e t h o d y @ l o c a l h o s t methody]$ l s - l /tmp/read.* /etc/shadow

-r 1 root root 0 Сен 10 02:08 /etc/shadow

-rw-r--r-- 1 root root 13 Сен 22 17:49 /tmp/read.all

-rw-r 1 root methody 23 Сен 22 17:49 /tmp/read.methody

99
Курс Операционная система Linux

-rw 1 methody r o o t 25 Сен 22 17:50 /tmp/read.Methody

-rw-r 1 root wheel 21 Сен 22 17:49 /tmp/read.wheel

[ m e t h o d y @ l o c a l h o s t methody]$ c a t /tmp/read.* /etc/shadow

All can read

Group methody c a n read

Methody h i m s e l f c a n read

cat: /tmp/read.wheel: Permission denied

cat: /etc/shadow: Permission denied

Пример 6.5. Ч т е н и е файлов с различными правами доступа

Что ж е получается? И з файла / e t c / s h a d o w м о ж н о только читать,


причем только пользователю r o o t . Изменять ф а й л ы / t m p / r e a d . a l l ,
/ t m p / r e a d . w h e e l и / t m p / r e a d . m e t h o d y может только r o o t , он же
может и читать из них. Также читать из файла / t m p / r e a d . w h e e l могут
ч л е н ы группы w h e e l , а из файла / t m p / r e a d . m e t h o d y — ч л е н ы группы
m e t h o d y (это и м я группы, а не и м я пользователя!). Читать и писать в
файл . t m p / r e a d . M e t h o d y может только пользователь methody. Н а к о ­
нец, читать из файла / t m p / r e a d . a l l могут к тому ж е и ч л е н ы группы
r o o t , и вообще любые пользователи.
П о п ы т к а вывести содержимое этих файлов на э к р а н (а значит, про¬
читать их) приводит к ожидаемому результату: процессу c a t (UID
m e t h o d y ) разрешено чтение из трех файлов. И з / t m p / r e a d . a l l — так
как по о т н о ш е н и ю к нему М е ф о д и й играет роль постороннего, а ему от¬
к р ы т доступ на ч т е н и е ( " r " в н а ч а л е третьей т р о й к и ) . И з
/ t m p / r e a d . m e t h o d y — так как пользователь m e t h o d y входит в группу
m e t h o d y (см. пример 6.1), членам которой разрешено читать из этого
ф а й л а ( " r " в начале второй т р о й к и ) . И , к о н е ч н о , из ф а й л а
/ t m p / r e a d . M e t h o d y , которому m e t h o d y — хозяин, и м е ю щ и й доступ на
чтение ("r" в первой тройке).
Если бы М е ф о д и ю захотелось записать что-нибудь в эти ф а й л ы , о н
бы получил доступ только к одному — / t m p / r e a d . M e t h o d y , потому что
по о т н о ш е н и ю к остальным файлам М е ф о д и й играет роль, которой за¬
крыт доступ на запись ( / t m p / r e a d . m e t h o d y — член группы, остальные
три — посторонние).
Таким образом, определение прав доступа процесса к объекту ф а й л о ­
вой системы (например, файла) происходит так. Используя UID процес¬
са, список групп, в которые входит прользователь, запустивший этот про¬
цесс, UID файла и GID файла, система определяет роль процесса по отно­
ш е н и ю к файлу, а затем обращается к соответствующей тройке атрибутов
файла. Стоит заметить, что процесс не может выступать сразу в несколь¬
ких ролях, поэтому, например, файл с я р л ы к о м " rw-rw- m e t h o d y

100
Лекция 6 Права доступа

m e h t o d y " сам М е ф о д и й просмотреть н е сможет (тройка хозяина опреде­


ляет полное отсутствие доступа)*.

Использование прав доступа в Linux

Использование групп

В Linux определено несколько системных групп, задача которых —


обеспечивать доступ членов этих групп к разнообразным ресурсам систе¬
мы. Часто такие группы носят говорящие названия: " d i s k " , " a u d i o " ,
" c d w r i t e r " и т. п. Тогда о б ы ч н ы м пользователям доступ к некоторому
файлу, каталогу и л и файлу-дырке Linux закрыт, н о открыт членам груп¬
пы, которой этот объект принадлежит.
Н а п р и м е р , в Linux почти всегда используется виртуальная файловая
система / p r o c — каталог, в котором в виде подкаталогов и файлов пред¬
ставлена и н ф о р м а ц и я их таблицы процессов. И м я подкаталога / p r o c сов¬
падает с PID соответствующего процесса, а содержимое этого подкатало¬
га отражает свойства процесса. Хозяином такого подкаталога будет хозяин
процесса (с правами на чтение и использование), поэтому любой пользо¬
ватель сможет посмотреть и н ф о р м а ц и ю о своих процессах. И м е н н о ката¬
логом / p r o c пользуется утилита ps:

[methody@arnor methody]$ l s - l / p r o c

dr-xr-x 3 methody p r o c 0 Сен 22 18:17 4529

dr-xr-x 3 shogun p r o c 0 Сен 22 18:17 4558

dr-xr-x--- 3 methody p r o c 0 Сен 22 18:17 4589

[ m e t h o d y @ l o c a l h o s t methody]$ ps - a f

UID PID PPID C STIME TTY TIME CMD

methody 4529 4523 0 13:41 t t y 1 00:00:00 -bash

methody 4590 4529 0 13:42 t t y 1 00:00:00 ps - a f

Пример 6.6. Ограничение доступа к полной таблице процессов

Оказывается, запущено немало процессов, в том числе один — поль­


зователем s h o g u n (PID 4558). Однако, несмотря на ключ " - a " (all), p s
выдала М е ф о д и ю только сведения о его процессах: 452 9 — это входной
shell, а 4589 — видимо, сам l s .
* З а т о о н м о ж е т с н а ч а л а п о м е н я т ь п р а в а д о с т у п а к э т о м у ф а й л у с п о м о щ ь ю chmod u+r,
а потом читать из него.

101
Курс Операционная система Linux

Другое дело — Гуревич. О н , к а к видно и з примера 6.1, входит в груп­


пу p r o c , членам которой разрешено читать и использовать каждый под­
каталог / p r o c :

shogun@localhost ~ $ ps - a f

UID PID PPID C STIME TTY TIME CMD

methody 4529 4523 0 13:41 t t y 1 00:00:00 -bash

shogun 4558 1828 0 13:41 t t y 3 00:00:00 - z s h

shogun 4598 4558 0 13:41 t t y 3 00:00:00 ps - a f

Пример 6.7. Доступ к полной таблице процессов: группа p r o c

Гуревич, о п ы т н ы й пользователь Linux, предпочитает b a s h «The Z


Shell», z s h . Отсюда и различие приглашения в командной строке. Во всех
shell, кроме самых старых, символ "~" означает д о м а ш н и й каталог. Этим
сокращением удобно пользоваться, если текущий каталог — н е д о м а ш ­
н и й , а оттуда (или туда) нужно скопировать файл. Получается команда
наподобие " c p ~/нужный_файл . " и л и " c p нужный_файл ~" соответ¬
ственно.
Команда p s - a выводит и н ф о р м а ц и ю обо всех процессах, запущен­
ных «живыми» (а н е системными) пользователями *. Для просмотра всех
процессов Гуревич пользуется командой p s - e f H .

Разделяемые каталоги

Проанализировав систему прав доступа к каталогам в Linux, М е ф о ­


д и й пришел к выводу, что в н е й имеется существенный недочет. Тот, кто
имеет право изменять каталог, может удалить любой файл оттуда, даже та­
к о й , к которому н е имеет доступа. Формально все правильно: удаление
файла из каталога — всего л и ш ь и з м е н е н и е содержимого каталога. Если у
файла было больше одного и м е н и (существовало несколько жестких ссы­
лок на этот файл), никакого удаления данных не произойдет, а если ссылка
была последней — файл в самом деле удалится. Вот это-то, п о м н е н и ю
М е ф о д и я , и плохо.
Чтобы доказать новичку, что право на удаление любых файлов полез­
но, кто-то создал прямо в д о м а ш н е м каталоге М е ф о д и я файл, недоступ¬
н ы й ему, да к тому ж е с подозрительным именем, содержащим пробел:

[ m e t h o d y @ l o c a l h o s t methody]$ l s

4TO-TO Mep3koe Documents examples loop script tmp t o . s o r t

* Более точно — обо всех процессах, и м е ю щ и х право выводить н а какой-нибудь терминал,


а значит, з а п у щ е н н ы м и и з т е р м и н а л ь н о г о сеанса.

102
Лекция 6 Права доступа

[ m e t h o d y @ l o c a l h o s t methody]$ l s - l 4*

-rw 1 root root 0 Сен 22 22:20 4TO-TO Mep3koe

[ m e t h o d y @ l o c a l h o s t methody]$ rm - i 4*

rm: удалить защищенный от записи пустой обычный файл "4TO-TO Mep3koe'? y

Пример 6.8. Удаление чужого файла с неудобным именем

Подозревая, что от хулиганов всего м о ж н о ожидать, М е ф о д и й не ре­


ш и л с я набрать и м я удаляемого файла с клавиатуры, а воспользовался
шаблоном и ключом " - i " (interactive) команды rm, чтобы та ожидала под­
тверждения перед тем, как удалять очередной файл. Несмотря на отсутст¬
вие доступа к самому файлу, удалить его оказалось возможно:

[ m e t h o d y @ l o c a l h o s t methody]$ l s - d l /tmp

drwxrwxrwt 4 r o o t root 1024 Сен 22 22:30 /tmp

[ m e t h o d y @ l o c a l h o s t methody]$ l s - l /tmp

итого 4

-rw-r--r-- 1 root root 13 Сен 22 17:49 read.all

-rw-r 1 root methody 23 Сен 22 17:49 read.methody

-rw 1 methody r o o t 25 Сен 22 22:30 read.Methody

-rw-r 1 root wheel 21 Сен 22 17:49 read.wheel

[ m e t h o d y @ l o c a l h o s t methody]$ rm - f /tmp/read.*

rm: невозможно удалить '/tmp/read.all': Operation not permitted

rm: невозможно удалить '/tmp/read.methody': O p e r a t i o n not permitted

rm: невозможно удалить '/tmp/read.wheel': Operation not permitted

[ m e t h o d y @ l o c a l h o s t methody]$ l s /tmp

read.all read.methody read.wheel

Пример 6.9. Работа с файлами в разделяемом каталоге

Убедившись, что любой доступ в каталог / tmp открыт всем, М е ф о д и й


р е ш и л удалить оттуда все файлы. Затея гораздо более хулиганская, чем за­
ведение файла: а вдруг они кому-нибудь нужны? Удивительно, но удален
оказался только файл, принадлежащий самому Мефодию...
Дело в том, что Мефодий проглядел особенность атрибутов каталога
/tmp: вместо " x " в тройке «для посторонних» l s выдал " t " . Это еще один
атрибут каталога, наличие которого как раз и запрещает пользователю уда­
лять оттуда файлы, которым он не хозяин. Таким образом, права записи в
каталог с ярлыком " d r w x r w x r w t группа хозяин" и для членов груп­
пы, и для посторонних ограничены их собственными файлами, и только
хозяин имеет право изменять список файлов в каталоге, как ему вздумает­
ся. Такие каталоги называются разделяемыми, потому что предназначены

103
Курс Операционная система Linux

они, как правило, для совместной работы всех пользователей в системе, об­
мена информацией и т. п.
П р и установке атрибута " t " доступ на использование для посторон­
них ( " t " в строчке атрибутов стоит на месте последнего "x") не отменя­
ется. Просто они так редко используются друг без друга, что l s выводит
их в одном и том же месте. Если кому-нибудь придет в голову организо¬
вать разделяемый каталог без доступа посторонним на использование, l s
выведет на месте девятого атрибута не " t " , а "T":

[ m e t h o d y @ l o c a l h o s t methody]$ l s - l l o o p

-rw-r--r-- 1 root root 26 Сен 22 22:10 loop

[ m e t h o d y @ l o c a l h o s t methody]$ chown methody loop

chown: изменение владельца "loop': Operation not permitted

[ m e t h o d y @ l o c a l h o s t methody]$ cp l o o p loopt

[ m e t h o d y @ l o c a l h o s t methody]$ l s - l l o o p *

-rw-r--r-- 1 root root 26 Сен 22 22:10 loop

-rw-r--r-- 1 methody methody 26 Сен 22 22:15 loopt

[ m e t h o d y @ l o c a l h o s t methody]$ mv -f loopt loop

[ m e t h o d y @ l o c a l h o s t methody]$ l s - l l o o p *

-rw-r--r-- 1 methody methody 26 Сен 22 22:15 loop

Пример 6.10. Что м о ж н о делать с чужим файлом в своем каталоге

Оказывается, мелкие пакости продолжаются. Кто-то сменил файлу


l o o p хозяина, так что теперь М е ф о д и й может только читать его, но не и з ­
менять. Удалить этот файл — п р о щ е простого, но хочется «вернуть все как
было»: чтобы получился файл с тем ж е именем и тем же содержанием,
принадлежащий М е ф о д и ю , а не r o o t . Это несложно: чужой файл м о ж н о
переименовать (это действие над каталогом, а не над ф а й л о м ) , скопиро¬
вать переименованный файл в файл с именем старого (доступ на чтение
открыт) и, наконец, удалить чужой файл с глаз долой. Ключ " - f " (force,
«силком») позволяет утилите mv делать свое дело, не спрашивая под¬
тверждений. В частности, увидев, что файл с именем, в которое необхо¬
д и м о переименовывать, существует, даже чужой, даже недоступный на за¬
пись, mv преспокойно удалит его и выполнит операцию переименования.

Суперпользователь

М е ф о д и й возмутился, узнав, что кто-то может проделывать над ним


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

104
Лекция 6 Права доступа

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

Суперпользователь в Linux — это выделенный пользователь системы,


на которого не распространяются ограничения прав доступа. UID супер­
пользовательских процессов равен 0: так система отличает их от процес¬
сов других пользователей. И м е н н о суперпользователь имеет возможность
произвольно изменять владельца и группу файла. Ему открыт доступ на
чтение и запись к любому файлу системы и доступ на чтение, запись и ис¬
пользование к любому каталогу. Н а к о н е ц , суперпользовательский про¬
цесс может на время сменить свой собственный UID с нулевого на любой
другой. И м е н н о так и поступает программа l o g i n , когда, проведя проце­
дуру идентификации пользователя, запускает стартовый командный ин¬
терпретатор.
Среди учетных записей Linux всегда есть запись по и м е н и r o o t
(«корень»*), соответствующая нулевому идентификатору, поэтому вместо
«суперпользователь» часто говорят «root». Множество системных файлов
принадлежат r o o t , множество файлов только ему доступны на чтение
или запись. Пароль этой учетной записи — одна и з самых больших драго¬
ценностей системы. И м е н н о с ее п о м о щ ь ю системные администраторы
выполняют самую ответственную работу. Свойство r o o t иметь доступ ко
всем ресурсам системы накладывает очень высокие требования на челове­
ка, знающего пароль r o o t . Суперпользователь может все — в том числе и
все поломать, поэтому любую работу стоит вести с правами обычного
пользователя, а к правам r o o t прибегать только п о необходимости.
Существует два различных способа получить права суперпользовате¬
ля. Первый — это зарегистрироваться в системе под этим именем, ввести
пароль и получить стартовую оболочку, имеющую нулевой UID. Это — са¬
м ы й неправильный способ, пользоваться которым стоит, только если
нельзя применить другие. Ч т о в этом случае выдаст команда l a s t ? Ч т о
тогда-то с такой-то консоли в систему вошел неизвестно кто с правами
суперпользователя и что-то там такое делал. С точки зрения системного
администратора, это очень подозрительное событие, особенно если сам
о н в это время к указанной консоли н е подходил... С а м и администраторы
такого способа избегают.
Второй способ —воспользоваться специальной утилитой s u (shell of
user), которая позволяет выполнить одну или несколько команд от лица
другого пользователя. П о умолчанию эта утилита выполняет команду s h
от лица пользователя r o o t , то есть запускает командный интерпретатор с
* В м е с т о полного имени т а к о м у п о л ь з о в а т е л ю часто п и ш у т «root of all evil».

105
Курс Операционная система Linux

нулевым U I D . Отличие от предыдущего способа — в том, что всегда изве­


стно, кто именно запускал s u , а значит, я с н о , с кого спрашивать за п о ­
следствия. В некоторых случаях удобнее использовать н е s u , а утилиту
sudo, которая позволяет выполнять только заранее заданные команды.

Подмена идентификатора

Утилиты s u и s u d o имеют некоторую странность, объяснить кото­


рую М е ф о д и й пока н е в состоянии. Эта ж е странность распространяется
и на давно известную программу p a s s w d , которая позволяет редактиро­
вать собственную учетную запись. Запускаемый процесс наследует UID от
родительского, поэтому если этот U I D — н е нулевой, о н н е в состоянии
поменять его. Тогда к а к ж е s u запускает для обычного пользователя супер­
пользовательский shell? К а к p a s s w d получает доступ к хранилищу всех
учетных записей? Должен существовать механизм, п о з в о л я ю щ и й пользо­
вателю запускать процессы с идентификаторами другого пользователя,
причем механизм строго контролируемый, иначе с его п о м о щ ь ю м о ж н о
натворить немало бед.
В Linux этот механизм называется подменой идентификатора и устро¬
ен очень просто. Процесс может сменить свой UID, если запустит вместо
себя при п о м о щ и e x e c ( ) другую программу и з файла, имеющего специ­
альный атрибут SetUID*. В этом случае UID процесса становится равным
UID файла, и з которого программа была запущена:

[foreigner@somewhere f o r e i g n e r ] $ l s - l /usr/bin/passwd /bin/su

-rws--x--x 1 root root 19400 Фев 9 2004 /bin/su

-rws--x--x 1 root root 5704 Я н в 18 2004 /usr/bin/passwd

[foreigner@somewhere f o r e i g n e r ] $ l s - l /etc/shadow

-r 1 root root 5665 Сен 10 02:08 /etc/shadow

Пример 6.11. Обычная программа p a s s w d , использующая S e t U I D

К а к и в случае с t-атрибутом, l s выводит букву " s " вместо буквы


" x " в тройке «для хозяина». Точно так ж е , если соответствующего x-атри-
бута нет (что бывает редко), l s выведет "S" вместо " s " . Во многих д и с ­
трибутивах Linux и / b i n / s u , и / u s r / b i n / p a s s w d имеют установлен­
н ы й SetUID и принадлежат пользователю r o o t , что и позволяет s u запу­
скать процессы с правами этого пользователя (а значит, и любого друго­
го), а p a s s w d — модифицировать файл / e t c / s h a d o w , содержащий в та¬
* С т р о г о г о в о р я , п р и э т о м м е н я е т с я н е с о б с т в е н н о и д е н т и ф и к а т о р п о л ь з о в а т е л я , а т. н . ис­
полнительный идентификатор пользователя, EUID; э т о н у ж н о д л я того, ч т о б ы з н а т ь , к т о на
самом деле запустил программу.

106
Лекция 6 Права доступа

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


атрибутом SetUID доступны о б ы ч н ы м пользователям только на выполне¬
ние, чтобы не провоцировать пользователей рассматривать содержимое
этих файлов и исследовать их недокументированные возможности. Ведь
если обнаружится способ заставить, допустим, программу p a s s w d выпол¬
нить любую другую программу, то все проблемы с защитой системы от
взлома будут разом р е ш е н ы — нет защиты, нет и проблемы.
Однако М е ф о д и й работает с такой системой, где / u s r / b i n / p a s s -
wd вообще не имеет атрибута SetUID. Зато эта программа принадлежит
группе shadow и имеет другой атрибут, SetGID, так что при ее запуске
процесс получает идентификатор группы shadow. Утилита l s выводит
SetGID в виде " s " вместо " x " во второй тройке атрибутов («для груп­
пы»). Замечания касательно " s " , "S" и " x " действительны для SetGID
так ж е , как и для SetUID:

[root@localhost root]# l s - l /usr/bin/passwd

-rwx--s--x 1 r o o t shadow 5704 J a n 18 2004 /usr/bin/passwd

[root@localhost root]# l s - a l /etc/tcb/methody

total 3

drwx--s 2 methody a u t h 1024 Sep 22 12:58 .

drwx--x 55 root shadow 1024 Sep 22 18:41 ..

-rw-r 1 methody a u t h 81 Sep 22 12:58 shadow

-rw 1 methody a u t h 0 Sep 12 13:58 shadow-

-rw 1 methody a u t h 0 Sep 12 13:58 shadow.lock

Пример 6.12. Н е подверженная взлому программа p a s s w d , исполь­


зующая S e t G I D

Каталог / e t c / t c b в этой системе содержит подкаталоги, соответст¬


вующие входным именам всех ее пользователей. В каждом подкаталоге
хранится, в числе прочего, собственный файл shadow соответствующего
пользователя. Доступ к каталогу / e t c / t c b на использование (а, следова¬
тельно, и ко всем его подкаталогам) имеют, кроме r o o t , только ч л е н ы
группы shadow. Доступ на запись к каталогу / e t c / t c b / m e t h o d y и к
ф а й л у / e t c / t c b / m e t h o d y / s h a d o w имеет т о л ь к о пользователь
methody. Значит, чтобы изменить что-либо в этом файле, процесс обязан
иметь UID m e t h o d y и GID shadow (или нулевой UID, конечно). И м е н н о
такой процесс запускается из / u s r / b i n / p a s s w d : он наследует UID у ко¬
мандного интерпретатора и получает GID shadow из-за атрибута SetGID.
Выходит, что даже найдя в программе p a s s w d о ш и б к и и заставив ее де¬
лать что угодно, з л о у м ы ш л е н н и к всего только и сможет, что... отредакти¬
ровать собственную учетную запись!

107
Курс Операционная система Linux

Оказывается, атрибут SetGID м о ж н о присваивать каталогам. В п о ­


следнем примере каталог / e t c / t c b / m e t h o d y имел SetGID, поэтому все
создаваемые в н е м ф а й л ы получают GID, равный GID самого каталога —
a u t h . Используется это разнообразными процессами и д е н т и ф и к а ц и и ,
которые, н е будучи суперпользовательскими, н о входя в группу a u t h и
shadow, могут прочесть и н ф о р м а ц и ю и з ф а й л о в /etc/tcb/вход-
ноe_имя/shadow.
Вполне очевидно, что подмена идентификатора распространяется
на программы, н о н е работает для сценариев. В самом деле, п р и и с п о л н е ­
н и и сценария процесс запускается н е из него, а и з программы-интерпре­
татора. Ф а й л со сценарием передается всего л и ш ь к а к параметр к о м а н д ­
ной строки, и подавляющее большинство интерпретаторов просто н е о б ­
ращают в н и м а н и я на атрибуты этого файла. Интерпретатор наследует
U I D у родительского процесса, так что если о н и обнаружит SetUID у сце­
н а р и я , поделать о н все равно ничего н е сможет.

Восьмеричное представление атрибутов

Все двенадцать атрибутов м о ж н о представить в виде битов двоично¬


го числа, равных 1, если атрибут установлен, и 0, если нет. Порядок битов
в числе следующий: sU|sG|t|rU|wU|xU|rG|wG||xG|rO|wO|xO, где
sU — это SetUID, sG — это SetGID, t — это t-атрибут, после чего следуют
три тройки атрибутов доступа. Этим форматом м о ж н о пользоваться в к о ­
манде chmod вместо конструкции "роли=виды_доступа", причем ч и с ­
ло надо записывать в восьмеричной системе счисления. Так, атрибуты ката­
лога /tmp будут равны 1777, атрибуты / b i n / s u — 4711, атрибуты
/ b i n / l s — 755 и т. д.
Тем ж е побитовым представлением атрибутов регулируются и права
доступа п о умолчанию п р и создании файлов и каталогов. Делается это с
п о м о щ ь ю команды umask. Единственный параметр umask — восьмерич¬
ное число, задающее атрибуты, которые не надо устанавливать новому
файлу или каталогу. Так, umask 0 приведет к тому, что ф а й л ы будут с о ­
здаваться с атрибутами "rw-rw-rw-", а каталоги — " r w x r w x r w x " .
Команда umask 022 убирает из атрибутов по умолчанию права доступа
на запись для всех, к р о м е хозяина (получается " r w - r - - r - - " и " r w x r -
x r - x " соответственно), а с umask 07 7 новые ф а й л ы и каталоги стано­
вятся полностью недоступны ("rw " м "rwx ")* всем,
кроме их хозяев.

* П а р а м е т р к о м а н д ы umask д о л ж е н о б я з а т е л ь н о н а ч и н а т ь с я н а 0, к а к э т о п р и н я т о д л я
восьмеричных чисел в языке Си.

108
Лекция 7 Работа с текстовыми данными

Лекция 7. Работа с текстовыми данными

В Linux очень многие задачи использования и администрирования сис­


темы сводятся к обработке текстовых данных. В лекции описаны способы
эффективной обработки текста при помощи интерфейса командной строки и
набора стандартных утилит. Вводятся понятия стандартного ввода/вывода,
конвейера. Последний раздел посвящен разбору типичных задач, возникаю­
щих в ходе работы с системой, и их решения при помощи стандартных ути­
лит, объединенных в конвейере.

Ключевые слова: ввод, вывод, дескриптор диагностических сообще¬


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

Ввод и вывод

Любая программа — это автомат, предназначенный для обработки данных:


получая на входе одну информацию, они в результате работы выдают другую.
Хотя входящая и/или выходящая информация может быть и нулевой, т. е. по­
просту отсутствовать. Те данные, которые передаются программе для обработ­
ки — это ее ввод, то, что она выдает в результате работы — вывод. Организация
ввода и вывода для каждой программы — это задача операционной системы.
Каждая программа работает с данными определенного типа: тексто­
выми, графическими, звуковыми и т. п. Как, наверное, уже стало понятно
из предыдущих лекций, основной интерфейс управления системой в Linux
— это терминал, который предназначен для передачи текстовой информа­
ции от пользователя системе и обратно (см. лекцию 2). Поскольку ввести с
терминала и вывести на терминал можно только текстовую информацию,
то ввод и вывод программ, связанных с терминалом*, тоже должен быть
текстовым. Однако необходимость оперировать с текстовыми данными не
ограничивает возможности управления системой, а, наоборот, расширяет
их. Человек может прочитать вывод любой программы и разобраться, что
происходит в системе, а разные программы оказываются совместимыми
между собой, поскольку используют один и тот же вид представления дан­
ных — текстовый. Возможностям, которые дает Linux при работе с д а н н ы ­
ми в текстовой форме, и посвящена данная лекция.
* Т. е. в п е р в у ю очередь к о м а н д н о й о б о л о ч к и и ее п р о ц е с с о в - п о т о м к о в (см. л е к ц и ю 5).

109
Курс Операционная система Linux

«Текстовость» данных — всего л и ш ь договоренность об их формате.


Н и к т о н е мешает выводить на экран нетекстовый файл, однако пользы в
этом будет мало. Во-первых, раз уж файл содержит н е текст, то н е предпо­
лагается, что человек сможет что-либо понять из его содержимого. Во-
вторых, если в нетекстовых данных, выводимых на терминал, случайно
встретится управляющая последовательность, терминал ее выполнит. На¬
п р и м е р , если в с к о м п и л и р о в а н н о й п р о г р а м м е з а п и с а н о ч и с л о
1 5 2 8 5 1 5 1 2 1 , о н о представлено в виде четырех байтов: 27, 91, 49 и 74.
Соответствующий им текст состоит и з четырех символов A S C I I : " esc",
" [ " , " 1 " и " J " , и при выводе файла на виртуальную консоль Linux в этом
месте выполнится очистка экрана, так к а к " [ [ Ы " — и м е н н о такая уп­ Л

равляющая последовательность для виртуальной консоли. Н е все управ­


л я ю щ и е последовательности столь безобидны, поэтому использовать н е ­
текстовые д а н н ы е в качестве текстов н е рекомендуется.
Что ж е делать, если содержимое нетекстового файла все-таки жела­
тельно просмотреть (то есть превратить в текст)? М о ж н о воспользовать­
ся программой hexdump, которая выдает содержимое файла в виде шест-
надцатеричных ASCII-кодов, и л и s t r i n g s , показывающей только те ча¬
сти файла, которые могут быть представлены в виде текста:

[methody@localhost m e t h o d y ] $ hexdump -C /bin/cat | less

00000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 |.ELF |

00000010 02 00 03 00 01 00 00 00 90 8b 04 08 34 00 00 00 | 4... |

00000020 e0 3a 00 00 00 00 00 00 34 00 20 00 07 00 28 00 |Ю: 4. ...(.|

00000100 00 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 | |

00000110 04 00 00 00 2f 6c 69 62 2f 6c 64 2d 6c 69 6e 75 | /lib/ld-linu|

00000120 78 2e 73 6f 2e 32 00 00 04 00 00 00 10 00 00 00 |x.so.2 |

00000130 01 00 00 00 47 4e 55 00 00 00 00 00 02 00 00 00 | GNU |

[methody@localhost methody]$ s t r i n g s /bin/cat | less

/ l i b / l d - l i nux.so.2

_Jv_RegisterClasses

gmon_start

l i bc.so.6

stdout

[methody@localhost methody]$ s t r i n g s -n3 /bin/cat | less

/ l i b / l d - l i nux.so.2

GNU

_Jv_Regi sterClasses

__gmon_start__

110
Лекция 7 Работа с текстовыми данными

l i bc.so.6

stdout

Пример 7.1. Использование hexdump и s t r i n g s

В примере М е ф о д и й , зная заранее, что текста будет выдано много,


воспользовался конвейером "| l e s s " , о п и с а н н ы м в разделе «Конвейер».
С ключом "-C" утилита hexdump выводит в правой стороне экрана текс­
товое представление данных, заменяя непечатные символы точками (что­
бы среди выводимого текста н е встретилось управляющей последователь­
ности). М е ф о д и й заметил, что s t r i n g s «не нашла» в файле / b i n / c a t
я в н о текстовых подстрок " E L F " и "GNU": первая и з н и х — вообще н е
текст (перед н е й стоит непечатный символ с кодом 7 f , а после — символ
с кодом 1), а вторая — с л и ш к о м короткая, хоть и ограничена символами с
кодом 0, к а к это и полагается строке в скомпилированной программе.
Н а и м е н ь ш а я длина строки передается s t r i n g s ключом "-n".

Перенаправление ввода и вывода

Для того чтобы записать данные в файл или прочитать их оттуда, про­
цессу необходимо сначала открыть этот файл (при открытии на запись,
возможно, придется предварительно создать его). П р и этом процесс полу­
чает дескриптор (описатель) открытого файла — уникальное для этого про­
цесса число, которое о н и будет использовать во всех операциях записи.
Первый открытый файл получит дескриптор 0, второй — 1 и так далее. За­
кончив работу с файлом, процесс закрывает его, при этом дескриптор осво­
бождается и может быть использован повторно. Если процесс завершается,
не закрыв файлы, за него это делает система. Строго говоря, только в опера­
ции открытия дескриптора указывается, какой именно файл будет задейст­
вован. В качестве «файла» используются и обычные файлы, и файлы-дырки
(чаще всего — терминалы), и каналы, описанные в разделе «Конвейер».
Дальнейшие операции — чтение, запись и закрытие — работают с дескрип¬
тором, как с потоком данных, а куда именно ведет этот поток, неважно.
Каждый процесс Linux получает при старте три «файла», открытых
для него системой. П е р в ы й и з них (дескриптор 0) открыт на чтение, это
стандартный ввод процесса. И м е н н о со стандартным вводом работают все
операции чтения, если в них н е указан дескриптор файла. Второй (дес¬
криптор 1 ) — открыт на запись, это стандартный вывод процесса. С н и м
работают все операции записи, если дескриптор файла н е указан в них я в ­
но. Н а к о н е ц , третий поток данных (дескриптор 2) предназначается для
вывода диагностических сообщений, о н называется стандартный вывод

111
Курс Операционная система Linux

ошибок. Поскольку эти три дескриптора уже открыты к моменту запуска


процесса, первый файл, открытый самим процессом, будет, скорее всего,
иметь дескриптор 3.

дескриптор
Описатель потока данных, открытого процессом. Дескрипторы
нумеруются, начиная с 0. П р и открытии нового потока данных
его дескриптор получает н а и м е н ь ш и й из неиспользуемых в этот
момент номеров. Три заранее открытых дескриптора — стан­
дартный ввод (0), стандартный вывод (1) и стандартный вывод
ошибок (2) — выдаются при запуске.

Механизм копирования окружения, о п и с а н н ы й в лекции 5, подразу¬


мевает, в числе прочего, копирование всех открытых дескрипторов роди¬
тельского процесса дочернему. В результате и родительский, и дочерний
процесс имеют под одинаковыми дескрипторами одни и те ж е потоки д а н ­
ных. Когда запускается стартовый командный интерпретатор, все три зара­
нее открытых дескриптора связаны у него с терминалом (точнее, с соответ­
ствующим файлом-дыркой типа t t y ) : пользователь вводит команды с
клавиатуры и видит сообщения на экране. Следовательно, любая команда,
запускаемая из командной оболочки, будет выводить на тот ж е терминал,
а любая команда, запущенная интерактивно (не в фоне) — вводить оттуда.

Стандартный вывод

М е ф о д и й уже сталкивался с тем, что некоторые программы умеют


выводить не только на терминал, но и в файл. Н а п р и м е р , i n f o при ука­
зании параметрического ключа "-о" с и м е н е м файла выведет текст руко¬
водства в файл, вместо того, чтобы отображать его на мониторе. Д а ж е ес¬
ли разработчиками программы не предусмотрен такой ключ, М е ф о д и ю
известен и другой способ сохранить вывод программы в файле вместо то¬
го, чтобы выводить его на монитор: поставить знак ">" и указать после
него и м я файла. Таким образом М е ф о д и й уже создавал короткие тексто¬
вые ф а й л ы (сценарии) при п о м о щ и утилиты c a t (см. лекцию 5):

[ m e t h o d y @ l o c a l h o s t methody]$ c a t > textfile

Это файл для примеров.


A
D

[ m e t h o d y @ l o c a l h o s t methody]$ l s - l t e x t f i l e

-rw-r--r-- 1 methody methody 23 Ноя 15 16:06 textfile

Пример 7.2. Перенаправление стандартного вывода в файл

112
Лекция 7 Работа с текстовыми данными

От использования символа ">" возможности самой утилиты c a t ,


конечно, не расширились. Более того, c a t в этом примере н е получила от
командной оболочки никаких параметров: н и знака ">" , н и последующе¬
го имени файла. В этом случае c a t работала к а к обычно, н е зная (и даже
не интересуясь!), куда попадут выведенные данные: на э к р а н монитора, в
файл и л и куда-нибудь еще. Вместо того, чтобы самой обеспечивать до¬
ставку вывода до конечного адресата (будь то человек или файл), c a t от¬
правляет все д а н н ы е на стандартный вывод (сокращенно — s t d o u t ) .
Подмена стандартного вывода — задача командной оболочки (shell).
В д а н н о м примере shell создает пустой файл, и м я которого указано после
знака ">", и дескриптор этого файла передается программе c a t под н о -
меромм 1 (стандартный! вывод). Делается это очень просто. В л е к ц и и 5 бы­
ло рассказано о том, как запускаются команды из оболочки. В частности,
после в ы п о л н е н и я f o r k ( ) появляется два одинаковых процесса, один из
которых — дочерний — должен запустить вместо себя команду (выполнить
e x e c ( ) ). Так вот, перед этим о н закрывает стандартный вывод (дескрип¬
тор 1 освобождается) и открывает файл (с н и м связывается первый сво¬
бодный дескриптор, т. е. 1 ), а запускаемой команде ничего знать и н е на¬
до: ее стандартный вывод уже подменен. Эта операция называется перена¬
правлением стандартного вывода. В том случае, если файл уже существует,
shell запишет его заново, полностью уничтожив все, что в н е м содержа¬
лось до этого. Поэтому М е ф о д и ю , чтобы продолжить записывать д а н н ы е
в t e x t f i l e , потребуется другая операция — ">>":

[ m e t h o d y @ l o c a l h o s t methody]$ c a t >> textfile

Пример 1.
A
D

[ m e t h o d y @ l o c a l h o s t methody]$ c a t t e x t f i l e

Это файл для примеров.

Пример 1.

[methody@localhost methody]$

Пример 7.3. Недеструктивное перенаправление стандартного вывода

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


добавил в к о н е ц уже существующего файла д а н н ы е со стандартного выво¬
да очередной команды.

стандартный вывод, standard output, stdout


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

113
Курс Операционная система Linux

Стандартный ввод

Аналогичным образом для передачи данных на вход программе м о ­


жет быть использован стандартный ввод (сокращенно — stdin). П р и рабо¬
те с командной строкой стандартный ввод — это символы, вводимые
пользователем с клавиатуры. Стандартный ввод м о ж н о перенаправить
при п о м о щ и командной оболочки, подав на него д а н н ы е и з некоторого
файла. Символ "<" служит для перенаправления содержимого файла на
стандартный ввод программе. Н а п р и м е р , если вызвать утилиту s o r t без
параметра, она будет читать строки со стандартного ввода. Команда
" s o r t < имя_файла" подаст на ввод s o r t д а н н ы е из файла:

[ m e t h o d y @ l o c a l h o s t methody]$ s o r t < textfile

Пример 1.

Это файл для примеров.

[methody@localhost methody]$

Пример 7.4. Перенаправление стандартного ввода и з файла

Результат д е й с т в и я э т о й к о м а н д ы а н а л о г и ч е н к о м а н д е s o r t
t e x t f i l e — разница л и ш ь в том, ч т о когда используется "<", s o r t п о ­
лучает д а н н ы е со с т а н д а р т н о г о ввода, н и ч е г о н е з н а я о ф а й л е
" t e x t f i l e " , откуда о н и поступают. Механизм работы shell в д а н н о м
случае тот ж е , что и п р и перенаправлении вывода: shell читает д а н н ы е и з
файла " t e x t f i l e " , запускает утилиту s o r t и передает ей на стандарт¬
н ы й ввод содержимое файла.
Необходимо помнить, что операция ">" деструктивна: она всегда
создает файл нулевой длины. Поэтому для, допустим, сортировки данных
в файле надо применять последовательно s o r t < файл > новый_файл и
mv новый_файл файл. Команда вида команда < файл > тот_же_файл
просто урежет его д о нулевой длины!

стандартный ввод, standard input, stdin


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

Стандартный вывод ошибок


В качестве первого примера и упражнения на перенаправление М е ­
фодий р е ш и л записать руководство по c a t в свой файл c a t . i n f o :

[ m e t h o d y @ l o c a l h o s t methody]$ i n f o c a t > c a t . i n f o

info: Запись ноды (coreutils.info.bz2)cat invocation...

114
Лекция 7 Работа с текстовыми данными

info: Завершено.

[ m e t h o d y @ l o c a l h o s t methody]$ head -1 c a t . i n f o

File: coreutils.info, Node: c a t i n v o c a t i o n , Next: tac invocation, Up:

Output o f e n t i r e files

[methody@localhost methody]$

Пример 7.5. Стандартный вывод о ш и б о к

Удивленный М е ф о д и й обнаружил, что вопреки его указанию от­


правляться в файл две строки, выведенные командой i n f o , все равно
п р о н и к л и на терминал. Очевидно, эти строки н е попали на стандартный
вывод потому, что н е относятся непосредственно к руководству, которое
должна вывести программа, о н и информируют пользователя о ходе вы­
полнения работы: записи руководства в файл. Д л я такого рода диагности­
ческих сообщений, а также для сообщений об ошибках, возникших в ходе
в ы п о л н е н и я программы, в Linux предусмотрен стандартный вывод ошибок
(сокращенно — s t d e r r ) .

стандартный вывод ошибок, standard error, stderr


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

Использование стандартного вывода ошибок наряду со стандартным


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

[ m e t h o d y @ l o c a l h o s t methody]$ i n f o c a t > c a t . i n f o 2> c a t . s t d e r r

[ m e t h o d y @ l o c a l h o s t methody]$ c a t c a t . s t d e r r

info: Запись ноды (coreutils.info.bz2)cat invocation...

info: Завершено.

[methody@localhost methody]$

Пример 7.6. Перенаправление стандартного вывода о ш и б о к

В этот раз на терминал уже ничего не попало, стандартный вывод от¬


правился в файл c a t . i n f o , стандартный вывод ошибок — в
c a t . s t d e r r . Вместо ">" и "2>" М е ф о д и й мог бы написать "1>" и
"2>". Ц и ф р ы в д а н н о м случае обозначают номера дескрипторов откры-

115
Курс Операционная система Linux

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


криптор с номером, допустим, 4, то, для того чтобы ее запустить, обяза­
тельно потребуется использовать сочетание "4>".
Иногда, однако, требуется объединить стандартный вывод и стан­
дартный вывод о ш и б о к в одном файле, а не разделять их. В командной
о б о л о ч к е b a s h для этого имеется с п е ц и а л ь н а я последовательность
"2>&1". Это означает «направить стандартный вывод о ш и б о к туда ж е ,
куда и стандартный вывод»:

[ m e t h o d y @ l o c a l h o s t methody]$ i n f o c a t > c a t . i n f o 2>&1

[ m e t h o d y @ l o c a l h o s t methody]$ head -3 cat.info

info: Запись ноды (coreutils.info.bz2)cat invocation...

info: Завершено.

File: coreutils.info, Node: c a t i n v o c a t i o n , Next: tac invocation, Up:

Output o f e n t i r e files

[methody@localhost methody]$

Пример 7.7. Объединение стандартного вывода и стандартного выво¬


да о ш и б о к

В этом примере важен порядок перенаправлений: в командной стро¬


ке М е ф о д и й сначала указал, куда перенаправить стандартный вывод (">
c a t . i n f o " ) и только потом велел направить туда ж е стандартный вывод
ошибок. Сделай о н наоборот ("2>&1 > c a t . i n f o " ) , результат получил­
ся бы неожиданный: в файл попал бы только стандартный вывод, а диа­
гностические сообщения появились бы на терминале. Однако логика
здесь железная: на момент в ы п о л н е н и я операции "2>&1" стандартный
вывод был связан с терминалом, значит, после ее в ы п о л н е н и я стандарт­
н ы й вывод о ш и б о к тоже будет связан с терминалом. А последующее п е ­
ренаправление стандартного вывода в файл, конечно, н и к а к не отразится
на стандартном выводе ошибок. Н о м е р в конструкции " &номер" — это
номер открытого дескриптора. Если бы упомянутая в ы ш е утилита, запи­
сывающая в четвертый дескриптор, была написана на shell, в ней бы и с ­
пользовались перенаправления вида ">&4". Ч т о б ы не набирать громозд­
кую конструкцию "> файл 2>&1" в bash используются сокращения: "&>
файл" или, что то ж е самое, ">& файл".

Перенаправление в никуда

Иногда заведомо известно, что какие-то д а н н ы е , выведенные про¬


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

116
Лекция 7 Работа с текстовыми данными

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


данных — / d e v / n u l l . Все, что записывается в этот файл, просто будет
выброшено и нигде не сохранится:

[ m e t h o d y @ l o c a l h o s t methody]$ i n f o cat > cat.info 2> /dev/null

[methody@localhost methody]$

Пример 7.8. Перенаправление в / d e v / n u l l

Точно таким ж е образом м о ж н о избавиться и от стандартного выво­


да, отправив его в / d e v / n u l l .

Обработка данных в потоке

Конвейер

Нередко возникают ситуации, когда нужно обработать вывод одной


программы какой-то другой программой. Пользуясь перенаправлением
ввода-вывода, м о ж н о сохранить вывод одной программы в файле, а по¬
том направить этот файл на ввод другой программе. Однако то же самое
м о ж н о сделать и более э ф ф е к т и в н о : перенаправлять вывод м о ж н о не
только в файл, но и непосредственно на стандартный ввод другой програм­
ме. В этом случае вместо двух команд потребуется только одна — програм­
м ы передают друг другу д а н н ы е «из рук в руки». В Linux такой способ п е ­
редачи данных называется конвейер.
В b a s h для перенапрвления стандартного вывода на стандартный
ввод другой программе служит символ "|". С а м ы й простой и наиболее
распространенный случай, когда требуется использовать конвейер, воз­
никает, если вывод программы не умещается на экране монитора и очень
быстро «пролетает» перед глазами, так что человек не успевает его прочи¬
тать. В этом случае м о ж н о направить вывод в программу просмотра
( l e s s ) , которая позволит не торопясь пролистать весь текст, вернуться к
началу и т. п.:

[ m e t h o d y @ l o c a l h o s t methody]$ c a t c a t . i n f o | less

Пример 7.9. Простейший конвейер

М о ж н о последовательно обработать д а н н ы е несколькими р а з н ы м и


программами, перенаправляя вывод на ввод следующей программе и о р ­
ганизуя сколь угодно д л и н н ы й конвейер для обработки данных. В резуль­
тате получаются очень д л и н н ы е к о м а н д н ы е строки вида "cmd1 | cmd2

117
Курс Операционная система Linux

| ... | cmdN", которые могут показаться громоздкими и неудобными,


но оказываются очень полезными и э ф ф е к т и в н ы м и при обработке боль¬
шого количества и н ф о р м а ц и и , как м ы увидим далее в этой лекции.
Организация конвейера устроена в shell по той ж е схеме, что и пере¬
направление в файл, но с использованием особого объекта системы — ка¬
нала. Если файл м о ж н о представить в виде коробки с д а н н ы м и , снабжен¬
ной клапаном для чтения или клапаном для записи, то канал — это оба
клапана, приклеенные друг к другу вообще без коробки. Для определен­
ности между клапанами м о ж н о представить трубу, немедленно доставля­
ющую д а н н ы е от входа к выходу (английский термин — «pipe» — основан
как раз на этом представлении, а в роли трубы выступает, конечно ж е , сам
Linux). Каналом пользуются сразу два процесса: один пишет туда, другой
читает. Связывая две команды конвейером, shell открывает канал (заво­
дится два дескриптора — входной и выходной), подменяет по уже о п и с а н ­
ному алгоритму стандартный вывод первого процесса на входной дес­
криптор канала, а стандартный ввод второго процесса — на выходной дес­
криптор канала. После чего остается запустить по команде в этих процес¬
сах, и стандартный вывод первой попадет на стандартный ввод второй.

канал, pipe
Неделимая пара дескрипторов (входной и выходной), связан¬
ных друг с другом таким образом, что д а н н ы е , записанные во
входной дескриптор, будут немедленно доступны на чтение с
выходного дескриптора.

Фильтры

Если программа и вводит данные, и выводит, то ее можно рассматри¬


вать как трубу, в которую что-то входит и из которой что-то выходит. Обыч­
но смысл работы таких программ заключается в том, чтобы определенным
образом обработать поступившие данные. В Linux такие программы назы¬
вают фильтрами: данные проходят через них, причем что-то «застревает» в
фильтре и не появляется на выходе, а что-то изменяется, что-то проходит
сквозь фильтр неизменным. Фильтры в Linux обычно по умолчанию чита­
ют данные со стандартного ввода, а выводят на стандартный вывод. П р о ­
стейшим фильтром Мефодий уже пользовался много раз — это программа
c a t : собственно, никакой «фильтрации» данных она не производит, она
просто копирует стандартный ввод на стандартный вывод.
Д а н н ы е , проходящие через фильтр, представляют собой текст: в
стандартных потоках ввода-вывода все д а н н ы е передаются в виде симво¬
лов, строка за строкой, как и в терминале. Поэтому могут быть состыко¬
в а н ы при п о м о щ и конвейера ввод и вывод любых двух программ, поддер-

118
Лекция 7 Работа с текстовыми данными

ж и в а ю щ и х стандатные потоки ввода-вывода. Это напоминает конструк¬


тор, все детали которого совмещаются между собой.
В любом дистрибутиве Linux присутствует набор стандартных утилит,
предназначенных для работы с файловой системой и обработки текстовых
данных. Многими из них Мефодий уже успел воспользоваться: это who,
c a t , l s , pwd, cp, chmod, i d , s o r t и др. Мефодий уже успел заметить, что
каждая из этих утилит предназначена для исполнения какой-то одной опе­
рации над файлами или текстом: вывод списка файлов в каталоге, копиро­
вание, сортировка строк, хотя каждая утилита может выполнять свою
функцию по-разному, в зависимости от переданных ей ключей и парамет¬
ров. При этом все они работают со стандартными потоками ввода/вывода,
поэтому хорошо приспособлены для построения конвейеров: последова­
тельно выполняя простые операции над потоком данных, можно решать
довольно нетривиальные задачи.
П р и н ц и п к о м б и н и р о в а н и я элементарных операций для выполне­
н и я сложных задач унаследован Linux от операционной системы U N I X
(как и многие другие п р и н ц и п ы ) . Подавляющее большинство утилит
U N I X не потеряли своего значения и в Linux. Все они ориентированы на
работу с д а н н ы м и в текстовой форме, многие являются фильтрами, все не
имеют графического интерфейса и вызываются из командной строки.
Этот пакет утилит называется c o r e u t i l s .

Структурные единицы текста

Работу в системе Linux почти всегда м о ж н о представить как работу с


текстами. П о и с к файлов и других объектов системы — это получение от
системы текста особой структуры — списка имен. Операции над файлами
— создание, переименование, перемещение, а также сортировка, переко¬
дировка и прочее — замену одних символов и строк другими либо в ката¬
логах, либо в самих файлах. Настройка системы в Linux сводится н е п о ­
средственно к работе с текстами — редактированию конфигурационных
файлов и н а п и с а н и ю сценариев (подробнее об этом см. лекции 8 и 12).
Работая с текстом в Linux, нужно принимать во внимание, что текс­
товые данные, передаваемые в системе, структурированы. Большинство
утилит обрабатывает не непрерывный поток текста, а последовательность
единиц. В текстовых данных в Linux выделяются следующие структурные
единицы:
1. Строки
Строка — основная единица передачи текста в Linux. Терминал пере­
дает д а н н ы е от пользователя системе строками (командная строка),
множество утилит вводят и выводят д а н н ы е построчно, при работе
многих утилит одной строке соответствует один объект системы

119
Курс Операционная система Linux

(имя файла, путь и т. п.), s o r t сортирует строки. Строки разделяют­


ся символом конца строки " \ n " (newline).
2. Поля
В одной строке может упоминаться и больше одного объекта. Если
понимать объект как последовательность символов из определенно¬
го набора (например, букв), то строку м о ж н о рассматривать к а к со¬
стоящую из слов и разделителей*. В этом случае текст от начала
строки до первого разделителя — это первое поле, от первого разели-
теля до второго — второе поле и т. д. В качестве разделителя м о ж н о
рассматривать любой символ, который не может использоваться в
объекте. Н а п р и м е р , если в пути "/home/methody" разделителем
является символ "/", то первое поле пусто, второе содержит слово
"home", третье — "methody". Некоторые утилиты позволяют в ы б и ­
рать из строк отдельные поля (по номеру) и работать со строками как
с таблицей.
3. Символы
М и н и м а л ь н а я единица текста — символ. Символ — это одна буква
или другой п и с ь м е н н ы й знак. Стандартные утилиты Linux позволя­
ют заменять одни символы другими (производить транслитерацию),
искать и заменять в строках символы и к о м б и н а ц и и символов.
С и м в о л к о н ц а строки в кодировке A S C I I совпадает с управляющей
последовательностью " J " — «перевод строки», однако в других коди¬
ровках он может быть и н ы м . К р о м е того, на большинстве терминалов —
но не на всех! — вслед за переводом строки необходимо выводить еще
символ возврата каретки (" М"). Это вызвало путаницу: некоторые с и с ­
Л

темы требуют, чтобы в к о н ц е текстового файла стояли оба этих символа


в определенном порядке. Ч т о б ы избежать путаницы, в U N I X (и, к а к
следствие, в Linux) было п р и н я т о единственно верное решение: содер¬
ж и м о е файла соответствует кодировке, а при выводе на терминал к о н ц ы
строки преобразуются в управляющие последовательности согласно на¬
стройке терминала.
В р а с п о р я ж е н и и пользователя Linux есть ряд утилит, в ы п о л н я ю щ и х
элементарные операции с е д и н и ц а м и текста: поиск, замену, разделение
и объединение строк, полей, символов. Эти утилиты, как правило, име¬
ют одинаковое представление о том, как определяются е д и н и ц ы текста:
что такое строка, к а к и е символы являются разделителями и т. п. Во м н о ­
гих случаях их представления м о ж н о изменять при п о м о щ и настроек.
Поэтому такие утилиты легко взаимодействуют друг с другом. Комбини¬
руя их, м о ж н о автоматизировать довольно с л о ж н ы е операции по обра¬
ботке текста.
* Например, в к о м а н д н о й строке разделителями являются символы пробела и табуляции
(см. раздел « С л о в а и р е з д е л и т е л и » ) .

120
Лекция 7 Работа с текстовыми данными

Примеры задач

Этот раздел п о с в я щ е н нескольким примерам использования стан­


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

Подсчет

В европейской культуре очень большим авторитетом пользуются


точные числа и количественные оценки. Поэтому пользователю часто
бывает любопытно и даже необходимо точно посчитать что-нибудь мно¬
гочисленное. Компьютер как нельзя лучше подходит для такой процеду­
ры. Стандартная утилита для подсчета строк, слов и символов — wc (от
англ. «word count» — «подсчет слов»). М е ф о д и й запомнил, что в Linux
многое м о ж н о представить как слова и строки, и решил таким образом
посчитать свои файлы:

[ m e t h o d y @ l o c a l h o s t methody]$ f i n d . | wc - l

42

[methody@localhost methody]$

Пример 7.10. Подсчет файлов при п о м о щ и find и wc

М е ф о д и й получил желаемое число — "42". Для этого ему потребо­


валась команда f i n d — рекомендованный Гуревичем инструмент поиска
нужных файлов в системе. М е ф о д и й вызвал f i n d с одним параметром —
каталогом, с которого начинать поиск. f i n d выводит список найденных
файлов по одному на строку, а поскольку критерии поиска в д а н н о м слу¬
чае не уточнялись, то f i n d просто вывела список всех файлов во всех
подкаталогах текущего каталога (домашнего каталога М е ф о д и я ) . Этот
с п и с о к М е ф о д и й передал утилите wc, попросив ее посчитать количество
полученных строк " - l " . В ответ wc выдала искомое число.
Задав f i n d критерии поиска, м о ж н о посчитать и что-нибудь менее
тривиальное, например, ф а й л ы , которые создавались или были и з м е н е н ы
в определенный промежуток времени, ф а й л ы с определенным режимом
доступа, с определенным именем и т. п. Узнать обо всех возможностях по¬
иска при п о м о щ и f i n d и подсчета при п о м о щ и wc м о ж н о из руководств
по этим программам.

121
Курс Операционная система Linux

Отбрасывание ненужного

Иногда пользователя интересует только часть из тех данных, кото­


р ы е собирается выводить программа. М е ф о д и й уже пользовался утилитой
head, которая нужна, чтобы вывести только первые несколько строк
файла. Н е менее полезна утилита t a i l (англ. «хвост»), выводящая только
последние строки файла. Если ж е пользователя интересует только опре­
деленная часть каждой строки файла — поможет утилита c u t .
Допустим, М е ф о д и ю потребовалось получить с п и с о к всех файлов и
подкаталогов в " / e t c " , которые принадлежат группе "adm". И при этом
ему почему-то нужно, чтобы найденные ф а й л ы в списке были представ¬
л е н ы не п о л н ы м путем, а только именем файла (скорее всего, это требу¬
ется для последующей автоматической обработки полученного списка):

[ m e t h o d y @ l o c a l h o s t methody]$ f i n d / e t c -maxdepth 1 -group adm 2>

/dev/null \

> | c u t -d / - f 3

syslog.conf

anacrontab

[methody@localhost methody]$

Пример 7.11. Извлечение отдельного поля

Если команда получается такой д л и н н о й , что ее неудобно набирать


в одну строку, м о ж н о разбить ее на несколько строк, не передавая систе­
ме: для этого в том месте, где нужно продолжить набор со следующей
строки, достаточно поставить символ "\" и нажать Enter. П р и этом в
начале строки b a s h выведет символ ">", означающий, что команда еще
не передана системе и набор продолжается*. Для системы безразлично, в
сколько строк набрана команда, возможность набора в несколько строк
нужна только для удобства пользователя.
М е ф о д и й получил н у ж н ы й результат, задав параметры f i n d — ката¬
лог, где нужно искать и параметр поиска — наибольшую допустимую глу¬
бину вложенности и группу, которой д о л ж н ы принадлежать найденные
файлы. Н е н у ж н ы е диагностические сообщения о запрещенном доступе
он отправил в / d e v / n u l l , а потом указал утилите c u t , что в полученных
со стандартного ввода строках нужно считать разделителем символ "/" и

* Вид этого п р и г л а ш е н и я о п р е д е л я е т с я з н а ч е н и е м п е р е м е н н о й о к р у ж е н и я "PS2", опи¬


с а н н о й в л е к ц и и 8.
** К а к уже у к а з ы в а л о с ь в р а з д е л е , п е р в ы м п о л е м с ч и т а е т с я текст от н а ч а л а с т р о к и д о п е р ­
в о г о р а з д е л и т е л я ; в п р и в е д е н н о м п р и м е р е п е р в о е п о л е — пусто, " e t c " — с о д е р ж и м о е в т о ­
р о г о п о л я , и т. д.

122
Лекция 7 Работа с текстовыми данными

вывести т о л ь к о третье поле. Таким о б р а з о м , от строк вида


" / e t c / f i l e n a m e " осталось только " f i l e n a m e " * * .

Выбор нужного

Поиск
Зачастую пользователю нужно найти только упоминания чего-то
конкретного среди данных, выводимых утилитой. Обычно эта задача сво­
дится к поиску строк, в которых встречается определенное слово или к о м ­
бинация символов. Для этого подходит стандартная утилита g r e p . g r e p
может искать строку в файлах, а может работать к а к фильтр: получив стро¬
ки со стандартного ввода, она выведет на стандартный вывод только те
строки, где встретилось искомое сочетание символов. М е ф о д и й решил
поинтересоваться процессами b a s h , которые выполняются в системе:

[methody@susanin methody]$ ps aux | grep bash

methody 3459 0.0 3.0 2524 1636 t t y 2 S 14:30 0:00 -bash

methody 3734 0.0 1.1 1644 612 t t y 2 S 14:50 0:00 g r e p b a s h

Пример 7.12. П о и с к строки в выводе программы

Первый аргумент к о м а н д ы g r e p — та строка, которую нужно искать


в стандартном вводе, в д а н н о м случае это " b a s h " , а поскольку p s выво­
дит сведения п о строке на каждый процесс, М е ф о д и й получил только
процессы, в и м е н и которых есть "bash". Однако М е ф о д и й неожиданно
нашел больше, ч е м искал: в списке выполняющихся процессов присутст­
вовали две строки, в которых встретилось слово " b a s h " , т. е. два процес­
са: один — и с к о м ы й — к о м а н д н ы й интерпретатор b a s h , а другой — п р о ­
цесс поиска строки " g r e p b a s h " , запущенный Мефодием после ps. Это
произошло потому, что после разбора командной строки b a s h запустил
оба дочерних процесса, чтобы организовать конвейер, и на момент вы¬
полнения команды p s процесс g r e p b a s h уже был запущен и тоже попал
в вывод p s . Ч т о б ы в этом примере получить правильный результат, М е -
ф о д и ю следовало бы добавить в конвейер е щ е одно звено: | g r e p - v
g r e p , эта команда исключит и з конечного вывода все строки, в которых
встречается " g r e p " .

Поиск по регулярному выражению

Очень часто точно н е известно, какую и м е н н о к о м б и н а ц и ю симво¬


лов нужно будет найти. Точнее, известно только то, к а к п р и м е р н о долж-

123
Курс Операционная система Linux

но выглядеть искомое слово, что в него должно входить и в каком поряд¬


ке. Так обычно бывает, если некоторые фрагменты текста имеют строго
определенный формат. Н а п р и м е р , в руководствах, выводимых програм¬
мой i n f o , принят такой формат ссылок: " * N o t e название_узла В
этом случае нужно искать не конкретное сочетание символов, а «Строку
" * N o t e " , за которой следует название узла (одно или несколько слов и
пробелов), оканчивающееся символами "::"». Компьютер вполне спо¬
собен выполнить такой запрос, если его сформулировать на строгом и по¬
нятном ему я з ы к е , например, на я з ы к е регулярных выражений. Регулярное
выражение — это способ одной формулой задать все последовательности
символов, подходящие пользователю:

[methody@susanin methody]$ i n f o grep > grep.info 2> /dev/null


A
[methody@susanin methody]$ g r e p -on "\*Note[ :]*::" grep.info

324:*Note Grep Programs::

684:*Note Invoking::

[methody@susanin methody]$

Пример 7.13. П о и с к ссылок в файле info

Первый параметр g r e p , который взят в кавычки — это и есть регу­


л я р н о е выражение для поиска ссылок в формате i n f o , второй параметр
— и м я файла, в котором нужно искать. Ключ " -o" заставляет g r e p выво­
дить строку не целиком, а только ту часть, которая совпала с регулярным
выражением (шаблоном поиска), а " - n " — выводить номер строки, в ко¬
торой встретилось д а н н о е совпадение.
В регулярном выражении большинство символов обозначают сами
себя, как если бы м ы искали обыкновенную текстовую строку, например,
"Note" и в регулярном выражении соответствуют строкам " N o t e "
и "::" в тексте. Однако некоторые символы обладают специальным зна¬
ч е н и е м , самый главный из таких символов — звездочка ("*"), поставлен­
ная после элемента регулярного выражения, обозначает, что могут быть
н а й д е н ы тексты, где этот элемент повторен любое количество раз, в том
числе и н и одного, т. е. просто отсутствует. В нашем примере звездочка
встретилась дважды: в первый раз нужно было включить в регулярное в ы ­
ражение и м е н н о символ «звездочка», для этого потребовалось лишить его
специального значения, поставив перед н и м "\".
Вторая звездочка обозначает, что стоящий перед ней элемент может
быть повторен любое количество раз от нуля до бесконечности. В нашем
случае звездочка относится к в ы р а ж е н и ю в квадратных скобках —
" [ : ] " , что означает «любой символ, кроме ":"». Ц е л и к о м регулярное
Л

выражение м о ж н о прочесть так: «Строка " * N o t e " , за которой следует

124
Лекция 7 Работа с текстовыми данными

ноль или больше любых символов, кроме ":" , за которыми следует стро¬
ка "::"». Особенность работы "*" состоит в том, что она пытается вы¬
брать совпадение максимальной д л и н ы . И м е н н о поэтому элемент, к ко¬
торому относилась "*", был задан к а к «не ":"». Выражение «ноль или
более любых символов» (оно записывается как ".*") в случае, когда, на­
пример, в одной строке встречается две ссылки, вбирает подстроку от
к о н ц а первого " * N o t e " до начала последнего (символы ":", п о м е с ­
тившиеся внутри этой подстроки, распознаются как «любые»).
На я з ы к е регулярных выражений м о ж н о также обозначить «любой
символ» ("."), «одно или более совпадений» (" + "), начало и к о н е ц стро­
ки (" " и "$ " соответственно) и т. д. Благодаря регулярным в ы р а ж е н и ­
л

я м м о ж н о автоматизировать очень многие задачи, которые в п р о т и в н о м


случае потребовали бы огромной и кропотливой работы человека. Более
подробные сведения о возможностях я з ы к а регулярных в ы р а ж е н и й м о ж ­
н о получить из руководства r e g e x ( 7 ) . Однако руководство — это не
учебник, поэтому чтобы научиться э к о н о м и т ь время и усилия при п о м о ­
щ и регулярных в ы р а ж е н и й , полезно прочесть соответствующие главы
к н и г [4], [10].
Регулярные выражения в Linux используются не только для поиска
программой g r e p . Очень многие программы, так или иначе работающие
с текстом, в первую очередь текстовые редакторы, поддерживают регу¬
л я р н ы е выражения. К таким программам относятся два «главных» тексто­
вых редактора Linux — V i m и Emacs, о которых речь пойдет в следующей
л е к ц и и (9). Однако нужно учитывать, что в разных программах использу­
ются разные диалекты я з ы к а регулярных выражений, где одни и те ж е п о ­
нятия имеют разные обозначения, поэтому всегда нужно обращаться к
руководству по конкретной программе.
В заключение м о ж н о сказать, что регулярные выражения позволяют
резко повысить эффективность работы, хорошо интегрированы в рабо¬
чую среду в системе Linux, и есть смысл потратить время на их изучение.

Замены

Удобство работы с потоком не в последнюю очередь состоит в том,


что м о ж н о не только выборочно передавать результаты работы программ,
но и автоматически заменять один текст другим прямо в потоке.
Для замены одних символов другими предназначена утилита tr (со­
к р а щ е н и е от англ. «translate» — «преобразовывать, переводить»), работаю­
щая как фильтр. М е ф о д и й решил применить ее прямо по назначению и
выполнить при ее п о м о щ и транслитерацию — замену латинских символов
близкими по звучанию русскими:

125
Курс Операционная система Linux

[ m e t h o d y @ l o c a l h o s t methody]$ c a t c a t . i n f o |t r

a b c d e f g h i j k l m n o p q r s t u v w x y z абцдефгхийклмнопкрстуввсиз \

> | t r ABCDEFGHIJKLMNOPRSTUVWXYZ АБЦДЕФГХИЙКЛМНОПКРСТУВВСИЗ | h e a d -4

Филе: цореутилс.инфо, Ноде: ц а т инвоцатион, Нест: тац инвоцатион,

Тп: Оутпут оф ентире филес

'цат': Цонцатенате а н д врите филес

[methody@localhost methody]$

Пример 7.14. Замена символов (транслитерация)

М е ф о д и й потрудился, составляя два параметра для утилиты t r : с о ­


ответствия латинских букв кириллическим. Первый символ из первого
параметра t r заменяет первым символом второго, второй — вторым и т. д.
М е ф о д и й обработал поток фильтром t r дважды: сначала чтобы заменить
строчные буквы, а затем — прописные. О н мог бы сделать это и за один
проход (просто добавив к параметрам п р о п и с н ы е после строчных), н о н е
захотел выписывать столь д л и н н ы е строки. Полученному на выходе текс¬
ту вряд ли м о ж н о найти практическое применение, однако транслитера­
ц и ю м о ж н о употребить и с пользой. Если н е указать t r второго парамет¬
ра, то все символы, перечисленные в первом, будут заменены на «ничто»,
т. е. попросту удалены из потока. П р и п о м о щ и t r м о ж н о также удалить
дублирующиеся символы (например, л и ш н и е пробелы и л и переводы
строки), заменить пробелы переводами строк и т. п.
П о м и м о простой замены отдельных символов, возможна замена по¬
следовательностей (слов). Специально для этого предназначен потоко¬
вый редактор s e d (сокращение от англ. «stream editor»). О н работает к а к
фильтр и выполняет редактирование поступающих строк: замену одних
последовательностей символов другими, причем м о ж н о заменять и регу­
лярные выражения.
Н а п р и м е р , М е ф о д и й с п о м о щ ь ю s e d может сделать более п о н я т н ы м
для непривычного читателя с п и с о к файлов, выводимый l s :

л A
[ m e t h o d y @ l o c a l h o s t methody]$ l s - l | s e d s / - [ - r w x ] * / Ф а й л : / | sed s / d [ -

rwx^/Каталог:/

итого 124

Файл: 1 methody methody 2693 Ноя 15 16:09 c a t . i n f o

Файл: 1 methody methody 69 Ноя 15 16:08 cat.stderr

Каталог: 2 methody methody 4096 Ноя 15 12:56 Documents

Каталог: 3 methody methody 4096 Ноя 15 13:08 examples

Файл: 1 methody methody 83459 Ноя 15 16:11 g r e p . i n f o

Файл: 1 methody methody 2 6 Ноя 15 13:08 l o o p

126
Лекция 7 Работа с текстовыми данными

Файл: 1 methody methody 23 Ноя 15 13:08 script

Файл: 1 methody methody 33 Ноя 15 16:07 textfile

Каталог: 2 methody methody 4096 Ноя 15 12:56 tmp

Файл: 1 methody methody 32 Ноя 15 13:08 to.sort

[methody@oblomov methody]$

Пример 7.15. Замена по регулярному выражению

У s e d очень ш и р о к и е возможности, но довольно н е п р и в ы ч н ы й с и н ­


т а к с и с , н а п р и м е р , з а м е н а в ы п о л н я е т с я к о м а н д о й "s/что_заме-
нять/на_что_заменять/". Чтобы в н е м разобраться, нужно обязатель­
но прочесть руководство s e d ( 1 ) и знать регулярные выражения.

Упорядочивание

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


чить: по алфавиту, по номеру, по количеству употреблений. Основной ин¬
струмент для упорядочивания — утилита s o r t — уже знакома М е ф о д и ю .
Однако теперь он р е ш и л использовать ее в сочетании с несколькими дру¬
гими утилитами:

[ m e t h o d y @ l o c a l h o s t methody]$ c a t g r e p . i n f o | t r "[:upper:]" "[:lower:]"

| t r "[:space:][:punct:]" "\n" \

> | sort | uniq -c | sort -nr | head -8

15233

720 the

342 of

251 to

244 a

213 and

180 or

180 i s

[methody@localhost methody]$

Пример 7.16. Получение упорядоченного по частотности списка


словоупотреблений

М е ф о д и й (вернее, компьютер по плану Мефодия) подсчитал, сколь­


ко раз какие слова были употреблены в файле " g r e p . i n f o " и вывел н е ­
сколько самых частоупотребляемых с указанием количества употребле­
н и й в файле. Для этого потребовалось сначала заменить все большие бук­
вы маленькими, чтобы не было разных способов н а п и с а н и я одного сло-

127
Курс Операционная система Linux

ва, затем заменить все пробелы и знаки п р е п и н а н и я к о н ц о м строки (сим¬


вол " \ n " ), чтобы в каждой строке было ровно по одному слову (Мефодий
всюду взял параметры t r в кавычки, чтобы b a s h не п о н я л их неправиль­
но). П о т о м список был отсортирован, все повторяющиеся слова замене­
н ы одним словом с указанием количества повторений ( " u n i q - c " ) , за¬
тем строки снова отсортированы по убыванию чисел в начале строки
( " s o r t - n r " ) и выведены первые 8 строк ("head - 8 " ) .

Запуск команд

Полученные в конвейере д а н н ы е м о ж н о превратить в руководство к


действию для компьютера. Н а п р и м е р , для каждой полученной со стан¬
дартного ввода строки м о ж н о запустить какую-нибудь команду, передав
ей эту строку в качестве параметра. Для этой цели служит утилита x a r g s :

[ m e t h o d y @ l o c a l h o s t methody]$ f i n d / b i n - t y p e f -perm +a=x \



> | xargs grep - l -e #!/' 2> /dev/null

/ b i n/egrep

/ b i n/fgrep

/bin/unicode_start

/bin/bootanim

[methody@localhost methody]$

Пример 7.17. П о и с к всех исполняемых файлов, которые точно я в л я ­


ются сценариями

Здесь М е ф о д и й р е ш и л определить, какие из исполняемых файлов в


каталоге " / b i n " являются сценариями. Для этого он нашел все обычные
исполняемые ф а й л ы (указывать " - t y p e f " — «обычные файлы» потре­
бовалось, чтобы в результат не попали каталоги, которые обычно являют­
ся и с п о л н я е м ы м и ) , а затем для каждого найденного файла вызвал g r e p ,
чтобы поискать в н е м сочетание символов "#!/" в начале строки. К л ю ч
" - l " велел g r e p выводить не обнаруженную строку, а имя файла, в кото­
р о м найдено совпадение. Так М е ф о д и й получил список исполняемых
файлов, в которых есть строка с указанием интерпретатора — несомнен¬
ных сценариев*.

* Возможны сценарии, в которых не указана программа-интерпретатор, но для автомати­


ч е с к о г о о б н а р у ж е н и я т а к о г о с ц е н а р и я п о т р е б у ю т с я более с л о ж н ы е и н с т р у м е н т ы .

128
Лекция 8 Возможности командной оболочки

Лекция 8. Возможности командной оболочки

В лекции описываются основные возможности, присущие интерпрета­


тору командной строки — главному инструменту пользователя Linux. Рассма­
триваются работа с командной строкой и шаблонами, использование окру­
жения, а также особенности программирования на shell. Приводятся приме­
ры конфигурационных файлов bash.

Ключевые слова: атомарность операции, библиотека, библиотечная


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

Редактирование ввода

Некоторое время поработав в Linux и понабирав команды в к о м а н д ­


н о й строке, М е ф о д и й пришел к выводу, что в «общении» с оболочкой н е
помешают к о е - к а к и е удобства. Одно и з таких удобств — возможность ре­
дактировать вводимую строку с п о м о щ ь ю клавиши B a c k s p a c e (удаление
последнего символа), " лл" (удаление слова) и и " (удаление всей стро­
л , , Л

ки) — предоставляет сам терминал Linux. Эти команды работают для лю­
бого построчного ввода: например, если запустить программу c a t без па¬
раметров, чтобы та немедленно отображала вводимые с терминала стро¬
ки. Если п о каким-то п р и ч и н а м в строчку на экране попало что-то л и ш ­
нее, м о ж н о нажать (redraw) — система выведет в новой строке со¬
держимое входного буфера.
М е ф о д и й н е забыл, ч т о c a t без параметров следует завершать ко¬
мандой " Б " (конец ввода). Эту команду, как и предыдущие, интерпрети­
Л

рует при вводе с терминала система. И она ж е превращает некоторые дру­


гие управляющие символы (например, " с " и л и " Z " ) в сигналы. В дей¬
Л A

ствительности все управляющие символы, интерпретируемые системой,


м о ж н о перенастроить с п о м о щ ь ю команды s t t y . П о л н ы й с п и с о к того,
что м о ж н о настраивать, выдает команда s t t y - a :

[ m e t h o d y @ l o c a l h o s t methody]$ s t t y -a

localhost 38400 baud; rows 30; columns 80; l i n e = 0;


A Л л A A
intr = C; quit = \ ; erase = ? ; k i l l = U ; e o f = D; eol = ;

129
Курс Операционная система Linux

A A A A A
eol2 = ; start = Q; stop = S ; susp = Z ; r p r n t = R; werase = W;

lnext = AV; f l u s h = AO; min = 1; t i m e = 0;

-parenb - p a r o d d c s 8 h u p c l -cstopb cread -clocal -crtscts

-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr

icrnl ixon -ixoff

-iuclc - ixany - imaxbel -iutf8

opost -olcuc -ocrnl onlcr -onocr - o n l r e t -ofill -ofdel nl0 cr0

tab0 bs0 v t 0 f f 0

isig i c a n o n i e x t e n echo echoe echok -echonl -noflsh -xcase

-tostop -echoprt

echoctl echoke

Пример 8.1. Настройки терминальной л и н и и

П р и виде столь о б ш и р н ы х возможностей М е ф о д и й немедленно


взялся читать руководство (man s t t y ) , однако нашел в н е м н е так уж
много для себя полезного. И з управляющих символов (строки со второй
по четвертую) интересны " 8 " и " 0 " , с п о м о щ ь ю которых м о ж н о , соот¬
Л л

ветственно, приостановить и возобновить выдачу на терминал (если тек¬


ста вывелось уже много, а прочесть его н е успеваешь). М о ж н о заметить,
что настройка e r a s e (удаление одного символа) соответствует управляю­
щему символу, который возвращается клавишей B a c k s p a c e и м е н н о в и р ­
туальной к о н с о л и Linux — " ? " . Н а м н о г и х т е р м и н а л а х к л а в и ш а
Л

B a c k s p a c e возвращает другой символ — " Н " . Если необходимо пере­ Л

определить настройку e r a s e , м о ж н о воспользоваться командой " s t t y


e r a s e Н " , причем " Н " (для удобства) разрешено вводить и к а к два
Л Л

символа: " " и "Н".


Л

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


ф у н к ц и й (если, например, требуется передать программе на ввод символ с
кодом 3, т. е. " с " ) , непосредственно перед вводом этого символа нужно
Л

подать команду " у ( l n e x t ) :


Л

[methody@localhost methody]$ c a t | hexdump -C

Сейчас нажмем Ctrl+C

[methody@localhost methody]$ c a t | hexdump -C

Теперь Ctrl+V, Ctrl+C, enter и Ctrl+DAC

00000000 f 4 c5 d0 c5 d2 d8 20 43 74 72 6c 2b 56 2c 20 43 |Теперь Ctrl+V, C|

00000010 74 72 6c 2b 43 2c 20 45 6e 74 65 72 20 c 9 20 43 |trl+C, enter и C|

00000020 74 72 6c 2b 44 03 0a |trl+D..|

00000027

Пример 8.2. Экранирование управляющих символов

130
Лекция 8 Возможности командной оболочки

Здесь М е ф о д и й прервал, как и собирался, работу первого из c a t .


П р и этом до hexdump, фильтра, переводящего входной поток в шестнад-
цатеричное представление, дело даже не д о ш л о , потому что c a t не успел
обработать н и одной строки. Во втором случае " с " после " у потеря­
Л Л

ло управляющий смысл и отобразилось при вводе. С ключом "-C" h e x -


dump выводит также и текстовое представление входного потока, заменяяя
непечатные символы точками. Так, на точки были заменены и " с " Л

(ASCII-код 03), и возвращаемый E n t e r символ к о н ц а строки (ASCII-код


0a, в десятичном виде — 12). Н и " У " , н и " Б " на вход hexdump, конеч¬
Л Л

но, не попали: их, как управляющие, обработала система.


П р о ч и е настройки s t t y относятся к обработке текста при выводе на
терминал и вводе с него. О н и интересны только в том смысле, что при их
и з м е н е н и и работать с командной оболочкой становится неудобно. На¬
пример, настройка e c h o определяет, будет ли система отображать на э к ­
ране все, что вводит пользователь. П р и включенном e c h o нажатие любой
а л ф а в и т н о - ц и ф р о в о й к л а в и ш и (ввод символа) приводит к тому, что сис¬
тема (устройство типа t t y ) выведет этот символ на терминал. Настройка
отключается, когда с клавиатуры вводится пароль. П р и этом трудно отде¬
латься от о щ у щ е н и я , что ввода с клавиатуры не происходит. Е щ е хуже об¬
стоит дело с настройками, состоящими из кусков вида " i " , "o", " c r " и
" n l " . Эти настройки управляют преобразованием при вводе и выводе ис¬
торически сложившегося обозначения к о н ц а строки двумя символами в
один, п р и н я т ы й в Linux. Может случиться так, что клавиша Enter терми¬
нала возвращает как раз неправильный символ к о н ц а строки, а преобра¬
зование отключено. Тогда вместо E n t e r следует использовать " J " — A

символ, на самом деле соответствующий концу строки.


Во всех случаях, когда терминал находится в н е п о н я т н о м состоянии
— не реагирует на Enter, не показывает ввода, не удаляет символов, вы¬
водит текст «ступеньками» и т. п., рекомендуется «лечить» настройки тер­
минала с п о м о щ ь ю s t t y s a n e — специальной ф о р м ы s t t y , сбрасыва¬
ю щ е й настройки терминала в некоторое пригодное к работе состояние.
Если непонятное состояние терминала возникло однократно, например,
после аварийного завершения э к р а н н о й программы (редактора v i m или
оболочки mc), то м о ж н о воспользоваться командой r e s e t . Она заново
настраивает терминал в п о л н о м соответствии с системной конфигураци¬
ей (указанной в файле / e t c / i n i t t a b , см. лекцию 10) и t e r m i n f o * .

Редактирование командной строки

Даже не изучая специально возможностей командной оболочки,


М е ф о д и й активно использовал некоторые из них, не доступные при вво-
* Если терминал ведет себястранно, последовательность " J s t t y s a n e J " может его вылечить.
A

131
Курс Операционная система Linux

де текста большинству утилит (в частности, н и c a t , н и hexdump). Речь


идет о клавишах Стрелка влево и Стрелка вправо, с п о м о щ ь ю кото­
рых м о ж н о перемещать курсор по командной строке, и клавише Del, уда­
л я ю щ е й символ под курсором, а н е позади него. В лекции 2 о н уже убе­
дился, что эти команды работают в b a s h , н о н е работают для c a t . Более
того, в простом командном интерпретаторе — s h — о н и тоже н е работают.
Следовательно, возможности редактора командной строки специ¬
ф и ч н ы для разных командных оболочек. Однако самые необходимые ко¬
манды редактирования поддерживаются во всех разновидностях shell сход­
н ы м образом. П о словам Гуревича «во всех видах Linux обязательно есть
b a s h , а если ты достаточно опытен, чтобы устанавливать и настраивать па­
кеты, можешь установить z s h , у него возможностей больше, чем может по¬
надобиться одному человеку». Поэтому Мефодий занялся изучением доку¬
ментации по b a s h , что оказалось делом непростым, ибо в b a s h . i n f o о н
насчитал более восьми с половиной тысяч строк. Даже про редактирование
командной строки написано столько, что за один раз прочесть трудно.
П о п ы т к а «наскоком» узнать все п р о работу в командной строке при¬
несла некоторую пользу. Во-первых, перемещаться в командной строке
м о ж н о н е только п о одному символу вперед и назад, н о и п о словам: ко¬
манды escF/escB или Alt+F/Alt+B соответственно (от forward и back­
ward), работают также клавиши home и end, и л и , что то ж е самое, " А " иЛ

" Е " . А во-вторых, п о м и м о работы с одной командной строкой, сущест¬


Л

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

История команд

Двумя другими клавишами со стрелками — вверх и вниз — М е ф о д и й


тоже активно пользовался, н е подозревая, что задействует этим весьма
м о щ н ы й механизм b a s h — работу с историей команд. Все команды, на¬
бранные пользователем, b a s h запоминает и позволяет обращаться к н и м
впоследствии. П о стрелке вверх (можно использовать и " р " , previous),
Л

с п и с о к поданных команд «прокручивается» от последней к первой, а по


стрелке вниз (" 1\Г", next) — обратно. Соответствующая команда отобра¬
Л

жается в командной строке к а к только что набранная, ее м о ж н о отредак¬


тировать и подать оболочке (подгонять курсор к концу строки п р и этом
не обязательно).
Если необходимо добыть из истории какую-то д а в н ю ю команду,
п р о щ е н е гонять список истории стрелками, а выполнить п о и с к с помо¬
щью команды " и " (reverse search). П р и этом выводится подсказка спе¬
л

циального вида («reverse-i-search»), подстрока поиска (окруженная сим¬


х
волами и ') и последняя из команд в истории, в которой эта подстрока
присутствует:

132
Лекция 8 Возможности командной оболочки

[methody@localhost methody]$

AR | (reverse-i-search)"':

i | (reverse-i-search)'i': l s i

n | (reverse-i-search)'in': info

f | (reverse-i-search)^inf': info

o | (reverse-i-search)'info': info

AR | ( r e v e r s e - i - s e a r c h ) ^ i n f o ' : man info


A
R | (reverse-i-search)^info': info "(bash.info.bz2)Commands For

History"

Пример 8.3. П о и с к по истории команд

П р и м е р представляет символы, вводимые Мефодием (в левой части


до "|"), и содержимое последней строки терминала. Это «кадры» работы
с одной и той ж е строкой, показывающие, как она меняется при наборе.
Набрав «info», М е ф о д и й продолжил п о и с к этой подстроки, повторяя
" л " до тех пор, пока не наткнулся на нужную ему команду, содержащую
К

подстроку " i n f o " . Осталось только передать ее b a s h с п о м о щ ь ю E n t e r .


Чтобы история команд могла сохраняться между сеансами работы
пользователя, b a s h записывает ее в файл . b a s h _ h i s t o r y , находящийся
в д о м а ш н е м каталоге пользователя. Делается это в момент завершения
оболочки: накопленная за время работы история дописывается в конец
этого файла. П р и следующем запуске b a s h считывает . b a s h _ h i s t o r y
целиком. История хранится не вечно, количество запоминаемых команд
в . b a s h _ h i s t o r y ограничено (обычно сохраняется 500 команд, но это
м о ж н о и перенастроить).

Сокращения

П о и с к по истории — удобное средство: длинную командную строку


м о ж н о не набирать целиком, а отыскать и использовать. Однако давнюю
команду придется добывать с помощью нескольких " и " — а можно и сов¬ л

сем не доискаться, если она уже выбыла оттуда. Для того чтобы оператив¬
но заменять короткие команды д л и н н ы м и , стоит воспользоваться сокра­
щениями (aliases). В конфигурационных файлах командного интерпретато¬
ра пользователя обычно уже определено несколько сокращений, список
которых можно посмотреть с п о м о щ ь ю команды a l i a s без параметров:

[ m e t h o d y @ l o c a l h o s t methody]$ alias

alias cd..='cd ..'

alias cp='cp - i '

alias l='ls -lapt'

133
Курс Операционная система Linux

alias ll='ls -laptc'

alias ls='ls --color=auto'

alias md='mkdir'

alias mv='mv -i'

alias rd='rmdir'

alias rm='rm - i '

Пример 8.4. Просмотр заранее определенных сокращений

С с о к р а щ е н и я м и М е ф о д и й уже сталкивался в примерах, приведен¬


ных в л е к ц и и 6, где команда l s отказалась работать в согласии с теорией.
Выяснилось, что по команде l s вместо утилиты / b i n / l s b a s h запуска­
ет собственную команду-сокращение, превращающееся в команду l s -
- c o l o r = a u t o . Повторно появившуюся в команде подстроку " l s " ин¬
терпретатор уже не обрабатывает, во избежание вечного цикла. Напри¬
мер, команда l s - a l превращается в результате в l s - - c o l o r = a u t o -
a l . Точно так ж е любая команда, начинающаяся с rm, превращается в rm
- i (interactive), что М е ф о д и я крайне раздражает, потому что н и одно уда¬
л е н и е не обходится без вопросов в стиле «rm: удалить о б ы ч н ы й файл
"файл?»:

[ m e t h o d y @ l o c a l h o s t methody]$ u n a l i a s cp rm mv

[ m e t h o d y @ l o c a l h o s t methody]$ alias pd=pushd

[ m e t h o d y @ l o c a l h o s t methody]$ alias pp=popd

[ m e t h o d y @ l o c a l h o s t methody]$ pd / b i n

/bin ~

[ m e t h o d y @ l o c a l h o s t b i n ] $ pd / u s r / s h a r e / d o c

/usr/share/doc /bin ~

[methody@localhost doc]$ cd /var/tmp

[methody@localhost tmp]$ dirs

/var/tmp /bin ~

[methody@localhost tmp]$ pp

/bin ~

[methody@localhost b i n ] $ pp

[ m e t h o d y @ l o c a l h o s t methody]$ pp

-bash: popd: directory stack empty

Пример 8.5. Использование с о к р а щ е н и й и p u s h d / p o p d

От надоедливого " - i " М е ф о д и й избавился с п о м о щ ь ю команды


u n a l i a s , а заодно ввел сокращения для полюбившихся ему команд b a s h

134
Лекция 8 Возможности командной оболочки

— p u s h d и popd. Эти команды*, подобно c d , меняют текущий каталог.


Разница состоит в том, что p u s h d все каталоги, которые пользователь де­
лает текущими, запоминает в особом списке (стеке). Команда p o p d уда­
ляет последний элемент этого стека и делает текущим каталогом предпо­
следний. Обе команды вдобавок выводят содержимое стека каталогов (то
ж е самое делает и команда d i r s ) . Команда c d в b a s h также работает со
стеком каталогов: она заменяет его последний элемент новым.

команда-сокращение, alias
Внутренняя команда shell, задаваемая пользователем. Обычно
заменяет одну более длинную команду, которая часто использу­
ется при работе в командной строке. С о к р а щ е н и я не наследу­
ются с окружением.

Достраивание

С о к р а щ е н и я позволяют быстро набирать команды, однако н и к а к не


затрагивают и м е н файлов, которые ч а щ е всего и оказываются параметра­
ми этих команд. Бывает, что набранной строки — пути к файлу и несколь­
ких первых букв его и м е н и — достаточно для однозначного указания на
этот файл, потому что по введенному пути других файлов, чье и м я н а ч и ­
нается на эти буквы, просто нет. Чтобы не дописывать оставшиеся буквы
(а имена файлов в Linux могут быть весьма д л и н н ы м и ) , Гуревич посовето­
вал М е ф о д и ю нажать клавишу Tab. И — о чудо! — b a s h сам достроил на­
чало и м е н и файла до целого (снова воспользуемся методом «кадров»):

[ m e t h o d y @ l o c a l h o s t methody]$ l s - a l / b i n / b a s e

Tab | [ m e t h o d y @ l o c a l h o s t methody]$ l s - a l /bin/basename

-rwxr-xr-x 1 root root 12520 Июн 3 18:29 /bin/basename

[ m e t h o d y @ l o c a l h o s t methody]$ b a s e

Tab | [ m e t h o d y @ l o c a l h o s t methody]$ basename

Tab | [ m e t h o d y @ l o c a l h o s t methody]$ basename ex

Tab | [ m e t h o d y @ l o c a l h o s t methody]$ basename examples/

Tab | [ m e t h o d y @ l o c a l h o s t methody]$ basename

examples/-filename-with-

-filename-with-

Пример 8.6. Использование достраивания

Дальше — больше. Оказывается, и имя команды м о ж н о вводить не


целиком: оболочка достроит набираемое слово и м е н н о до команды, раз
* О н и н а з в а н ы п о а н а л о г и и с о п е р а ц и я м и р а б о т ы со с т е к о м — push и pop.

135
Курс Операционная система Linux

уж это слово стоит в начале командной строки. Таким образом, команду


basename e x a m p l e s / - f i l e n a m e - w i t h - М е ф о д и й набрал за восемь
нажатий на клавиатуру («base» и четыре Tab)! Ему н е пришлось вводить
начало и м е н и файла в каталоге e x a m p l e s , потому что файл там был все¬
го один.
Выполняя достраивание (completion), b a s h может вывести н е всю
строку, а только ту ее часть, относительно которой у него нет сомнений.
Если дальнейшее достраивание может пойти несколькими путями, то од­
нократное нажатие Tab приведет к тому, что b a s h растерянно пискнет*,
а повторное — к выводу под командной строкой списка всех возможных
вариантов. В этом случае надо подсказать командной оболочке продол¬
жение: дописать несколько символов, определяющих, п о какому пути
пойдет достраивание, и снова нажать Tab.
П о и с к ключевого слова «completion» п о документации b a s h выдал
так много и н ф о р м а ц и и , что М е ф о д и й обратился к Гуревичу за п о м о щ ь ю .
Однако тот ответил, что н е использует b a s h , и поэтому н е в состоянии
объяснять тонкости его настройки. Если в b a s h предусмотрено несколько
типов достраивания (по и м е н а м файлов, по именам команд и т. п.), то в
z s h их сколько угодно: существует способ запрограммировать любой алго­
ритм достраивания и задать шаблон командной строки, в которой и м е н ­
но этот способ будет применяться.

Генерация имен файлов

Достраивание очень удобно, когда цель пользователя — задать один


к о н к р е т н ы й файл в к о м а н д н о й строке. Если ж е нужно работать сразу с
несколькими ф а й л а м и — н а п р и м е р , для перемещения их в другой каталог
с п о м о щ ь ю mv, достраивание н е помогает. Необходим способ задать од­
но «общее» и м я для группы ф а й л о в , с которыми будет работать команда.
В подавляющем большинстве случаев это м о ж н о сделать п р и п о м о щ и
шаблона.

Шаблоны

Ш а б л о н в командном интерпретаторе используется примерно в тех


ж е целях, что и регулярное выражение, упомянутое в л е к ц и и 7: для поиска
строк определенной структуры среди множества разнообразных строк. В
* Все т е р м и н а л ы д о л ж н ы уметь в ы д а в а т ь з в у к о в о й с и г н а л п р и в ы в о д е у п р а в л я ю щ е г о с и м ­
в о л а " 0 " . Д л я этого н е н у ж н о запускать н и к а к и х д о п о л н и т е л ь н ы х п р о г р а м м : « н а с т о я ­
Л

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


с и с т е м н ы м ( « п и щ а л к о й » ) . В к р а й н е м случае р а з р е ш а е т с я п р и в л е к а т ь в н и м а н и е п о л ь з о в а ­
теля другими способами: например, эмулятор терминала screen пишет в служебной
с т р о к е «wuff-wuff» («гав-гав»).

136
Лекция 8 Возможности командной оболочки

отличие от регулярного выражения, шаблон всегда примеряется к строке


целиком, кроме того, о н устроен значительно п р о щ е (а значит, и беднее).
Символы в шаблоне разделяются на обычные и специальные. Обыч¬
н ы е символы соответствуют таким ж е символам в строке, а специальные
— обрабатываются особым образом:
• Шаблону, состоящему только и з обычных символов, соответствует
единственная строка, состоящая из тех ж е символов в том ж е поряд­
ке. Н а п р и м е р , шаблону " a b c " соответствует строка abc, н о н е aBc
или A B C , потому что большие и маленькие буквы различаются.
• Шаблону, состоящему из единственного спецсимвола "*", соответ­
ствует любая строка любой д л и н ы (в том числе и пустая).
• Шаблону, состоящему из единственного спецсимвола " ? " , соответ­
ствует любая строка длиной в один символ, например, a, + и л и @, н о
не ab и л и 8888.
• Шаблону, состоящему из любых символов, заключенных в квадрат­
н ы е скобки " [ " и " ] " соответствует строка д л и н о й в один символ,
причем этот символ должен встречаться среди заключенных в скоб¬
ки. Н а п р и м е р , шаблону " [ b a r ] " соответствуют только строки a, b
и r , н о н е c, B, b a r и л и ab. Символы внутри скобок м о ж н о н е пере­
числять полностью, а задавать диапазон, в начале которого стоит
символ с н а и м е н ь ш и м A S C I I - к о д о м , затем следует а затем —
символ с наибольшим ASCII-кодом. Н а п р и м е р , шаблону " [ 0 - 9 a -
f A - F ] " соответствует одна шестнадцатеричная ц и ф р а (скажем, 5, e
или C). Если после " [ " в шаблоне следует "!", то ему соответствует
строка и з одного символа, не перечисленного между скобками.
• Шаблону, состоящему и з нескольких частей, соответствует строка,
которую м о ж н о разбить на столько ж е подстрок (возможно, пустых),
причем первая подстрока будет отвечать первой части шаблона, вто­
рая — второй и т. д. Н а п р и м е р , шаблону " a * b ? c " будут соответство­
вать строки ab@c ("*" соответствует пустая подстрока), a+b=c и
a a a b b c , н о н е будут соответствовать a b c ( " ? " соответствует подст­
рока c, а для " c " соответствия н е находится), @ab@c (нет соответст­
вия для "a") и л и a a a b b b c (из трех b первое соответствует "b", вто­
рое — " ? " , а вот третье приходится на " c " ) .

шаблон, pattern
Строка специального формата, используемая в процедурах тек­
стового поиска. Говорят, что строка соответствует шаблону, ес¬
ли м о ж н о п о определенным правилам каждому символу строки
поставить в соответствие символ шаблона. В Linux наиболее
популярны ш а б л о н ы в формате командного интерпретатора и
регулярные выражения.

137
Курс Операционная система Linux

Использование шаблонов

Ш а б л о н ы используются в нескольких конструкциях shell. Главное


место их п р и м е н е н и я — командная строка. Если оболочка «видит» в к о ­
мандной строке шаблон, она немедленно заменяет его списком файлов,
имена которых ему соответствуют. Команда, которая затем вызывается,
получает в качестве параметров список файлов уже без всяких шаблонов,
как если бы этот список пользователь ввел вручную. Эта способность ко¬
мандного интерпретатора называется генерацией имен файлов:

[ m e t h o d y @ l o c a l h o s t methody]$ l s .bash*

.bash_history .bash_logout . b a s h _ p r o f i l e .bashrc

[ m e t h o d y @ l o c a l h o s t methody]$ /bin/e*

/bin/ed /bin/egrep /bin/ex

[ m e t h o d y @ l o c a l h o s t methody]$ l s * a *

- f i lename-wi t h -

[ m e t h o d y @ l o c a l h o s t methody]$ l s -dF * [ a o ] *

Documents/ examples/ loop to.sort*

Пример 8.7. Использование шаблона в командной строке

М е ф о д и й , к а к это случается с новичками, немедленно натолкнулся


на несколько «подводных камней», неизбежных в ситуации, когда конеч¬
н ы й результат неизвестен. Только первая команда сработала не вопреки
его ожиданиям: шаблон " . b a s h * " был превращен командной оболочкой
в список файлов, начинающихся на .bash, этот с п и с о к получила в каче¬
стве параметров командной строки l s , после чего честно его вывела. С
" / b i n / e * " М е ф о д и ю повезло — этот шаблон превратился в список ф а й ­
лов и з каталога / b i n , начинающихся на "e", и первым файлом в списке
оказалась безобидная утилита / b i n / e c h o . Поскольку в командной стро¬
ке ничего, кроме шаблона, н е было, и м е н н о строка / b i n / e c h o была вос¬
принята оболочкой в качестве команды*, которой (в качестве параметров)
были переданы остальные элементы списка — / b i n / e d , / b i n / e g r e p и
/bin/ex.
Что ж е касается l s * a * , то, п о расчетам М е ф о д и я , эта команда
должна была выдать список файлов в текущем каталоге, и м я которых со­
держит " a " . Вместо этого на экран вывелось и м я файла и з подкаталога
examples... Впрочем, н и к а к о й черной магии тут нет. Во-первых, имена
файлов вида " . b a s h * " хотя и содержат " a " , н о начинаются с точки, и,
стало быть, считаются скрытыми. Скрытые ф а й л ы попадают в результат
генерации и м е н только если точка в начале указана явно (как в первой ко¬
* М о ж н о в с п о м н и т ь п р о н у л е в о й п а р а м е т р к о м а н д н о й с т р о к и , о б с у ж д а в ш и й с я в л е к ц и и 5.

138
Лекция 8 Возможности командной оболочки

манде примера). Поэтому по шаблону " * a * " в д о м а ш н е м каталоге М е ф о ­


д и я b a s h нашел только подкаталог с именем e x a m p l e s — его-то он и пе¬
редал в качестве параметра утилите l s . Что было выведено на э к р а н в ре¬
зультате образовавшейся команды l s e x a m p l e s ? К о н е ч н о , содержимое
каталога. Ш а б л о н в последней команде из примера, " * [ a o ] * " был пре¬
вращен в список файлов, чьи имена содержат " a " или "o" — D o c u m e n t s
e x a m p l e s l o o p t o . s o r t , а ключ " - d " потребовал от l s показывать
и н ф о р м а ц и ю о каталогах, а не об их содержимом. В соответствии с клю¬
ч о м " - F " , l s расставила "/" после каталогов и "*" после исполняемых
файлов.
Еще одно отличие генерации имен от стандартной обработки шабло¬
на — в том, что символ "/", разделяющий элементы пути, никогда не ста­
вится в соответствие " * " или диапазону. Происходит это не потому, что ис­
кажен алгоритм, а потому, что при генерации имен шаблон применяется
именно к элементу пути, внутри которого уже нет "/" . Например, полу¬
чить с п и с о к ф а й л о в , которые находятся в каталогах / u s r / b i n и
/ u s r / s b i n и содержат подстроку "ppp" в имени, можно с помощью шаб­
лона " / u s r / * b i n / * p p p * " . Однако одного шаблона, который бы включал
в этот список еще и каталоги / b i n и / s b i n — то есть подкаталоги другого
уровня вложенности — по стандартным правилам сделать нельзя*.
Если перед л ю б ы м специальным символом стоит "\", этот символ
лишается специального значения, экранируется: пара " \сммвол" заменя­
ется к о м а н д н ы м интерпретатором на " символ" и передается в к о м а н д ­
ную строку без всякой дальнейшей обработки:

[ m e t h o d y @ l o c a l h o s t methody]$ echo *o*

Documents l o o p to.sort

[ m e t h o d y @ l o c a l h o s t methody]$ echo \*o\*

*o*

[ m e t h o d y @ l o c a l h o s t methody]$ echo "*o*"

*o*

[ m e t h o d y @ l o c a l h o s t methody]$ echo *y*

*y*

[ m e t h o d y @ l o c a l h o s t methody]$ l s *y*

ls: *y*: No such f i l e or d i r e c t o r y

Пример 8.8. Экранирование специальных символов и обработка


«пустых» шаблонов
* Генерация и м е н ф а й л о в в z s h п р е д у с м а т р и в а е т с п е ц и а л ь н ы й ш а б л о н "**", к о т о р о м у
соответствуют п о д с т р о к и с л ю б ы м к о л и ч е с т в о м "/". П о л ь з о в а т ь с я и м следует к р а й н е о с ­
т о р о ж н о , п о н и м а я , что п р и г е н е р а ц и и и м е н п о т а к о м у ш а б л о н у в ы п о л н я е т с я о п е р а ц и я ,
а н а л о г и ч н а я н е l s , а l s -R и л и f i n d . Так, и с п о л ь з о в а н и е "/**" в н а ч а л е ш а б л о н а вызо¬
вет п р о с м о т р в с е й ф а й л о в о й с и с т е м ы !

139
Курс Операционная система Linux

Мефодий заметил, что шаблон, которому не соответствует ни одно


имя файла, b a s h раскрывать не стал, как если бы все "*" в нем были э к ­
ранированы. В самом деле, какое из двух зол меньше: изменять интерпре­
тацию спецсимволов в зависимости от содержимого каталога, или сохра­
нять логику интерпретации с риском превратить команду с параметрами в
команду без параметров? Если бы, допустим, шаблон, которому не на¬
шлось соответствия, попросту удалялся, то команда l s * y * превратилась
бы в l s и неожиданно выдала бы содержимое всего каталога. Авторы b a s h
(как и Стивен Борн, автор самой первой командной оболочки — sh) вы¬
брали более непоследовательный, но и более безопасный первый способ*.
Л и ш и т ь специальные символы их специального значения м о ж н о и
другим способом. В л е к ц и и 2 было рассказано, что разделители (пробелы,
символы табуляции и символы перевода строки) перестают в о с п р и н и ­
маться как таковые, если часть командной строки, их содержащую, окру¬
жить д в о й н ы м и или о д и н а р н ы м и кавычками. В кавычках перестает «ра¬
ботать» и генерация и м е н (как это видно из примера), и интерпретация
других специальных символов. Д в о й н ы е кавычки, однако, допускают вы¬
полнение подстановок переменной окружения и результата работы ко¬
манды, о п и с а н н ы х в двух следующих разделах.

Окружение

В л е к ц и и 5 уже упоминалось, что системный вызов f o r k ( ) , созда­


вая точную к о п и ю родительского процесса, копирует также и окружение.
Необходимость в «окружении» обусловлена вот какой задачей. Акт пере¬
дачи данных от родительского процесса дочернему, и, что еще важнее, си¬
стеме, должен обладать свойством атомарности. Если использовать для
этой цели файл (например, к о н ф и г у р а ц и о н н ы й файл запускаемой про¬
граммы), всегда сохраняется вероятность, что за время между изменени¬
ем файла и последующим чтением запущенной программой кто-то — на¬
пример, другой процесс того ж е пользователя — снова изменит этот
файл**. Хорошо бы, чтобы изменение данных и их передача выполнялись
одной операцией. Н а п р и м е р , завести для каждого процесса такой «файл»,
содержимое которого, во-первых, мог бы изменить только этот процесс,
и, во-вторых, оно автоматически копировалось бы в аналогичный «файл»
дочернего процесса при его порождении.
Эти свойства и реализованы в п о н я т и и «окружение». К а ж д ы й запус¬
к а е м ы й процесс система снабжает н е к и м и н ф о р м а ц и о н н ы м пространст-
* А в т о р ы z sh п о ш л и п о другому пути: в э т о й в е р с и и shell и с п о л ь з о в а н и е ш а б л о н а , к о т о ­
р о м у н е соответствует н и о д н о и м я ф а й л а , п р и в о д и т к ошибке, и с о о т в е т с т в у ю щ а я к о м а н ­
да не выполняется.
** Э т а с и т у а ц и я н а з ы в а е т с я «race condition» ( « с о с т о я н и е г о н к и » ) , и ч а с т о в с т р е ч а е т с я в
п л о х о с п р о е к т и р о в а н н ы х системах, где есть хотя б ы д в а п а р а л л е л ь н ы х п р о ц е с с а .

140
Лекция 8 Возможности командной оболочки

вом, которое этот процесс вправе изменять к а к ему заблагорассудится.


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

[ m e t h o d y @ l o c a l h o s t methody]$ date

Птн Ноя 5 16:20:16 MSK 2004

[ m e t h o d y @ l o c a l h o s t methody]$ LC_TIME=C date

Fri Nov 5 16:20:23 MSK 2004

Пример 8.9. Утилита ls пользуется переменной окружения LC_TIME

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

Работа с переменными в shell

В последнем примере М е ф о д и й воспользовался подсмотренным у


Гуревича приемом: присвоил некоторое значение переменной окружения
в командной строке перед именем команды. К о м а н д н ы й интерпретатор,
увидев "=" внутри первого слова командной строки, приходит к выводу,
что это — операция присваивания, а н е имя команды, и запоминает, к а к
надо изменить окружение команды, которая последует далее. П е р е м е н ­
ная окружения LC_TIME предписывает использовать определенный я з ы к
при выводе даты и времени, а значение "C" соответствует стандартному
системному языку (чаще всего — английскому).

141
Курс Операционная система Linux

Если рассматривать shell в качестве высокоуровневого я з ы к а п р о ­


граммирования, то его переменные — самые обычные строковые пере­
менные. Записать значение в переменную м о ж н о с п о м о щ ь ю операции
присваивания, а прочесть его оттуда — с п о м о щ ь ю операции подстановки
вида $ nepeMeHHafl:

[ m e t h o d y @ l o c a l h o s t methody]$ A=dit

[ m e t h o d y @ l o c a l h o s t methody]$ C=dah

[ m e t h o d y @ l o c a l h o s t methody]$ echo $A $B $C

d i t dah

[ m e t h o d y @ l o c a l h o s t methody]$ B=" "

[ m e t h o d y @ l o c a l h o s t methody]$ echo $A $B $C

d i t dah

[ m e t h o d y @ l o c a l h o s t methody]$ echo "$A $B $C"

di t dah

[ m e t h o d y @ l o c a l h o s t methody]$ echo '$A $B $ C '

$A $B $C

Пример 8.10. Подстановка значений переменных

К а к видно и з примера, значение неопределенной переменной (B) в


shell считается пустым и при подстановке н е выводится никаких преду­
преждений. Сама подстановка происходит, к а к и генерация и м е н , перед
разбором командной строки, набранной пользователем. Поэтому вторая
команда e c h o в примере получила, к а к и первая, два параметра ( " d i t " и
"dah"), несмотря на то, что переменная B была к тому времени определе­
на и содержала разделитель-пробел. А вот третья и четвертая команды
e c h o получили п о одному параметру. Здесь сказалось различие между
о д и н а р н ы м и и д в о й н ы м и кавычками в shell: внутри двойных кавычек
действует подстановка значений переменных.
Переменные, которые к о м а н д н ы й интерпретатор b a s h определяет
после запуска, н е принадлежат окружению, и , стало быть, н е наследуются
дочерними процессами. Чтобы переменная b a s h попала в окружение, ее
надо проэкспортировать командой e x p o r t :

[ m e t h o d y @ l o c a l h o s t methody]$ echo "$Qwe -- $LANG"

-- ru_RU.KOI8-R

[ m e t h o d y @ l o c a l h o s t methody]$ Qwe="Rty" LANG=C

[ m e t h o d y @ l o c a l h o s t methody]$ echo "$Qwe -- $LANG"

Rty -- C

[ m e t h o d y @ l o c a l h o s t methody]$ s h

sh-2.05b$ echo "$Qwe -- $LANG"

142
Лекция 8 Возможности командной оболочки

-- C

sh-2.05b$ exit

[ m e t h o d y @ l o c a l h o s t methody]$ echo "$Qwe -- $LANG"

Rty -- C

[ m e t h o d y @ l o c a l h o s t methody]$ e x p o r t Qwe

[ m e t h o d y @ l o c a l h o s t methody]$ s h

sh-2.05b$ echo "$Qwe -- $LANG"

Rty -- C

sh-2.05b$ exit

Пример 8.11. Экспорт переменных shell в окружение

Здесь М е ф о д и й завел новую переменную Qwe и изменил значение


переменной окружения LANG, доставшейся стартовому b a s h от програм­
м ы l o g i n . В результате запущенный дочерний процесс s h получил изме¬
ненное значение LANG и н и к а к о й переменной Qwe в окружении. После
e x p o r t Qwe эта переменная была добавлена в окружение и, соответст¬
венно, передалась sh.

Переменные окружения, используемые системой


и командным интерпретатором

Во время сеанса работы пользователя стартовый командный интер¬


претатор получает от l o g i n довольно богатое окружение, к которому до¬
бавляет и собственные настройки. Просмотреть окружение в b a s h мож¬
но с п о м о щ ь ю команды s e t . Большинство заранее определенных пере¬
м е н н ы х используются либо самой командной оболочкой, либо утилитами
системы, поэтому их и з м е н е н и е приводит к тому, что оболочка или ути¬
л и т ы начинают работать несколько иначе.
Весьма примечательна переменная окружения PATH. В н е й содер­
жится список каталогов, элементы которого разделяются двоеточиями.
Если команда в командной строке — н е собственная команда shell (вроде
cd) и н е представлена в виде пути к запускаемому файлу (как / b i n / l s
или . / s c r i p t ) , то shell будет искать эту команду среди и м е н запускае¬
мых файлов во всех каталогах PATH, и только в них. Точно так ж е будут
поступать и другие утилиты, использующие библиотечную функцию e x e -
c l p ( ) или e x e c v p ( ) (запуск программы).
П о этой п р и ч и н е и с п о л н я е м ы е ф а й л ы невозможно запускать просто
по и м е н и , если о н и лежат в текущем каталоге, и текущий каталог н е вхо¬
дит в PATH. М е ф о д и й в таких случаях пользовался кратчайшим и з воз­
можных путей, " . / " (например, вызывая сценарий . / s c r i p t ) :

143
Курс Операционная система Linux

[ m e t h o d y @ l o c a l h o s t methody]$ echo $PATH

/home/methody/bin:/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin:/usr/games

[ m e t h o d y @ l o c a l h o s t methody]$ m k d i r /home/methody/bin

[ m e t h o d y @ l o c a l h o s t methody]$ mv to.sort loop s c r i p t b i n /

[ m e t h o d y @ l o c a l h o s t methody]$ script

Hello, Methody!

Пример 8.12. Использование P A T H

Пути, указанные в PATH, могут и н е существовать на самом деле. О б ­


наружив в $PATH элемент / h o m e / m e t h o d y / b i n (подкаталог b i n домаш¬
него каталога), М е ф о д и й решил, что гораздо правильнее будет склады¬
вать исполняемые ф а й л ы н е куда попало, а и м е н н о в этот каталог: в о - п е р ­
вых, это упорядочит структуру домашнего каталога, а во-вторых, позво­
лит запускать эти ф а й л ы п о имени. Н о для начала пришлось такой ката­
лог создать. Порядок, при котором собственные программы лежат в спе­
циальном каталоге, куда безопаснее беспорядка, п р и котором п о и с к запу­
скаемого файла по и м е н и начинается с текущего каталога. Если в теку­
щ е м каталоге окажется программа l s и этот каталог — н е / b i n , а, допус­
тим, / h o m e / s h o g u n / d o n t r u n m e , тогда следует ожидать подвоха...
Переменных окружения, влияющих на работу разных утилит, довольно
много. Например, переменные семейства LC_ (полный их список выдается
командой l o c a l e ) , определяющие язык, на котором выводятся диагности­
ческие сообщения, стандарты на формат даты, денежных единиц, чисел,
способы преобразования строк и т. п. Очень важна переменная TERM, опре­
деляющая тип терминала: как известно из лекции 2, разные терминалы име­
ют различные управляющие последовательности, поэтому программы, ж е ­
лающие эти последовательности использовать, обязательно сверяются с пе­
ременной TERM*. Если какая-то утилита требует редактирования файла, этот
файл передается программе, путь к которой хранится в переменной EDITOR
(обычно это / u s r / b i n / v i , о котором речь пойдет в лекции 9). Наконец, н е ­
которые переменные вроде UID, USER или PWD просто содержат полезную
информацию, которую можно было бы добыть и другими способами.
Некоторые переменные окружения предназначены специально для
b a s h : о н и задают его свойства и особенности поведения. Таковы пере­
м е н н ы е семейства PS (Prompt String). В этих переменных хранится стро¬
ка-подсказка, которую к о м а н д н ы й интерпретатор выводит в разных со¬
стояниях. В частности, содержимое PS1 — это подсказка, которую shell
* В действительности такие программы обычно используют библиотеку curses, оперируя
н е з а в и с я щ и м и от т и п а т е р м и н а л а п о н я т и я м и (вроде « о ч и с т к а э к р а н а » и л и « п о з и ц и о н и р о ­
в а н и е к у р с о р а » ) , а п р о ц е д у р ы и з c u r s e s п р е о б р а з у ю т и х в у п р а в л я ю щ и е последователь¬
н о с т и к о н к р е т н о г о т е р м и н а л а , с в е р и в ш и с ь с н а ч а л а с $TERM, а затем — с с о д е р ж и м ы м со¬
о т в е т с т в у ю щ е г о р а з д е л а базы данных по терминалам, к о т о р а я н а з ы в а е т с я t e r m i n f o .

144
Лекция 8 Возможности командной оболочки

показывает, когда вводит командную строку, а PS2 — когда пользователь


нажимает Enter, а интерпретатор п о какой-то п р и ч и н е считает, что ввод
командной строки н е завершен (например, н е закрыты кавычки). С $PS2
(символом ">") М е ф о д и й уже сталкивался в лекциях 2 и 7:

[ m e t h o d y @ l o c a l h o s t methody]$ c d examples/

[ m e t h o d y @ l o c a l h o s t examples]$ echo $PS1

[\u@\h \W]\$

[ m e t h o d y @ l o c a l h o s t examples]$ PS1="-- > "

-->

-->

PS1="\t \w "

22:11:47 ~

22:11:48 ~

22:11:48 ~ PS1="\u@\h:\w \$ "

methody@localhost:~/examples $

methody@localhost:~/examples $

methody@localhost:~/examples $ cd

methody@localhost:~ $

methody@localhost:~ $

Пример 8.13. Использование переменной окружения PS1

М е ф о д и й экспериментировал с PS1, параллельно читая документа­


ц и ю п о b a s h ( " ( b a s h . i n f o ) P r i n t i n g a Prompt"). Оказывается, в
этом командном интерпретаторе содержимое PS1 н е просто подставляет­
ся при выводе — о н о е щ е и преобразуется, позволяя выводить всякую п о ­
лезную и н ф о р м а ц и ю : и м я пользователя (соответствует подстроке " \ u " ,
user), и м я компьютера ("\h", host), время ( " \ t " , time), путь к текущему
каталогу ("\w", work directory) и т. п. В примере М е ф о д и й заменил "\W"
(показывающую последний элемент пути, то есть собственное и м я теку­
щего каталога) н а "\w", полный путь, потому что "\w" обладает свойст­
вом выделять в полном пути д о м а ш н и й каталог и заменять его на "~". Та­
кое преобразование значений переменных семейства PS1 выполняется,
только когда их использует b a s h в качестве подсказки, а п р и обычной
подстановке этого н е происходит.

Язык программирования sh
Некогда М е ф о д и й выучил несколько я з ы к о в программирования, и
уже собрался было написать к о е - к а к и е нужные программы н а С и и л и
Python, однако Гуревич его остановил. Большая часть того, что нужно на­
ч и н а ю щ е м у пользователю Linux, делается с п о м о щ ь ю одной правильной

145
Курс Операционная система Linux

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


только требуется оформить решение задачи в виде сценария на shell. На
самом ж е деле уже самый первый из командных интерпретаторов, sh, был
настоящим высокоуровневым я з ы к о м программирования — если, конеч¬
но, считать все утилиты системы его операторами. П р и таком подходе от
s h требуется совсем немного: возможность вызывать утилиты, возмож¬
ность свободно манипулировать результатом их работы и несколько алго¬
ритмических конструкций (условия и циклы).
К сожалению, программирование на shell, а также других, более м о щ ­
ных интерпретируемых языках в Linux, остается за рамками нашего кур­
са. Так что, пока М е ф о д и й читает документацию по b a s h и упражняется
в н а п и с а н и и сценариев, н а м остается только поверхностно рассмотреть
свойства shell как я з ы к а программирования и интегратора команд. Заме­
тим попутно, что писать сценарии для b a s h — непрактично, так к а к и с ­
полняться они смогут л и ш ь при п о м о щ и b a s h . Если ж е ограничить себя
рамками sh, совместимость с которым объявлена и в b a s h , и в z s h , и в
a s h (наиболее близком по возможностям к sh), и в других командных
интерпретаторах, выполняться эти сценарии смогут л ю б ы м из s h - п о д о б -
ных интерпретаторов, и не только в Linux.

Интеграция процессов
Каждый процесс Linux при завершении передает родительскому код
возврата (exit status), который равен нулю, если процесс считает, что его
работа была успешной, или номеру ошибки — в противном случае. Команд¬
н ы й интерпретатор хранит код возврата последней команды в специаль¬
ной переменной " ? " . Что более важно, код возврата используется в ус­
ловных операторах: если он равен нулю, условие считается выполнен¬
н ы м , а если нет — н е в ы п о л н е н н ы м :

[ m e t h o d y @ l o c a l h o s t methody]$ g r e p Methody b i n / s c r i p t

echo 'Hello, Methody!'

[ m e t h o d y @ l o c a l h o s t methody]$ g r e p -q Methody b i n / s c r i p t ; echo $?

[ m e t h o d y @ l o c a l h o s t methody]$ g r e p -q Shogun b i n / s c r i p t ; echo $?

[ m e t h o d y @ l o c a l h o s t methody]$ i f g r e p -q Shogun b i n / s c r i p t ; t h e n echo

"Yes"; f i

[ m e t h o d y @ l o c a l h o s t methody]$ i f g r e p -q Methody b i n / s c r i p t ; then echo

"Yes"; f i

Yes

Пример 8.14. Оператор i f использует код возврата программы g r e p

146
Лекция 8 Возможности командной оболочки

Условный оператор i f запускает команду-условие, g r e p -q, которая


ничего н е выводит на э к р а н , зато возвращает 0, если шаблон найден, и 1,
если нет. В зависимости от кода возврата этой команды, i f выполняет
или н е выполняет тело: с п и с о к команд, заключенный между t h e n и f i .
Точка с запятой разделяет операторы в sh; либо она, либо перевод строки
необходимы перед t h e n и f i , иначе все, что идет после g r e p , интерпре¬
татор посчитает параметрами этой утилиты.
Множеством функций обладает команда t e s t : она умеет сравнивать
числа и строки, проверять я р л ы к объекта файловой системы и наличие са­
мого этого объекта. У " t e s t " есть второе и м я : " [ " ( к а к правило,
/ u s r / b i n / [ — символьная или даже жесткая ссылка на / u s r / b i n / t e s t ) ,
позволяющее оформлять оператор i f более привычным образом:

[methody@localhost methody]$ i f t e s t - f examples ; then l s - l d examples ; f i

[methody@localhost methody]$ i f [ -d examples ] ; then l s - l d examples ; f i

d r w x r - x r - x 2 methody methody 4096 О к т 31 15:26 examples

[ m e t h o d y @ l o c a l h o s t methody]$ A=8; B=6; i f [ $A - l t $B ] ; t h e n echo

"$A<$B" ; f i

[ m e t h o d y @ l o c a l h o s t methody]$ A=5; B=6; i f [ $A - l t $B ] ; t h e n echo

"$A<$B" ; f i

5<6

Пример 8.15. Оператор t e s t

Команда t e s t - f проверяет, на является л и ее аргумент файлом;


поскольку e x a m p l e s — это каталог, результат будет неудачным. Команда
[ - d — то ж е самое, что и t e s t - d (не каталог ли первый параметр),
только последним параметром этой команды — исключительно для красо­
ты — должен быть символ " ] " . Результат — успешный, и выполняется
команда l s - l d . Команда t e s t параметр1 - l t параметрЗ проверяет,
является ли параметр1 числом, м е н ь ш и м , ч е м (less then) параметрЗ. В
более сложных случаях оператор i f удобнее записывать «лесенкой», в ы ­
деляя переводами строки окончание условия и команды внутри тела (их
может быть много).
Второй тип подстановки, которую shell делает внутри двойных кавы¬
ч е к — это подстановка вывода команды. Подстановка вывода имеет вид
" к о м а н д а " " (другой вариант — "$(команда)"). К а к и подстановка
х

значения переменной, она происходит перед тем, как начнется разбор ко¬
мандной строки: выполнив команду и получив от нее какой-то текст, shell
примется разбирать его, как если бы этот текст пользователь набрал вруч¬
ную. Это очень удобное средство, если то, что выводит команда, необхо¬
д и м о передать самому интерпретатору:

147
Курс Операционная система Linux

[methody@localhost methody]$ A=8; B=6

[methody@localhost methody]$ e x p r $A + $B

14

[methody@localhost methody]$ echo "$A + $B = 'expr $A + $B'"

8 + 6 = 14

[methody@localhost methody]$ A=3.1415; B=2.718

[methody@localhost methody]$ echo "$A + $B = 'expr $A + $B'"

e x p r : нечисловой аргумент

3.1415 + 2.718 =

[methody@localhost methody]$ echo "$A + $B" | bc

5.8595

[methody@localhost methody]$ C='echo "$A + $B" | bc'

[methody@localhost methody]$ echo "$A + $B = $C"

3.1415 + 2.718 = 5.8595

Пример 8.16. Подстановка вывода команды

Сначала для арифметических вычислений Мефодий хотел восполь­


зоваться командой e x p r , которая работает с параметрами командной
строки. С целыми числами e x p r работает неплохо, и ее результат можно
подставить прямо в аргумент команды echo. С действительными числами
умеет работать утилита-фильтр bc; арифметическое выражение пришлось
сформировать с помощью e c h o и передать по конвейеру, а результат поме­
стить в переменную C. Во многих современных командных оболочках есть
встроенная целочисленная арифметика вида " $ ( ( выражение ) ) " .

Сценарии

В я з ы к е s h много в н и м а н и я было уделено удобству н а п и с а н и я сце¬


нариев. В частности, параметры командной строки, переданные сцена¬
р и ю , доступны в нем в виде переменных, имена которых совпадают с по¬
рядковым номером параметра:

[methody@localhost methody]$ c a t > bin/two

#!/bin/sh

echo "Running $0: $*"

$1 $3

$2 $3

[methody@localhost methody]$ chmod +x bin/two

[methody@localhost methody]$ bin/two f i l e " l s - l d " examples

Running b i n / t w o : file l s - l d examples

examples: directory

148
Лекция 8 Возможности командной оболочки

d r w x r - x r - x 2 methody methody 4096 О к т 31 15:26 examples

[ m e t h o d y @ l o c a l h o s t methody]$ two " l s - s " wc "bin/two b i n / l o o p " junk

Running /home/methody/bin/two: l s -s wc b i n / t w o b i n / l o o p junk

4 bin/loop 4 bin/two

4 9 44 b i n/two

1 5 26 b i n / l o o p

5 14 70 итого

Пример 8.17. Использование п о з и ц и о н н ы х параметров в сценарии

К а к видно и з примера, форма "$номер_параметра" позволяет об­


ратиться и к нулевому параметру — команде, а вся строка параметров хра­
нится в переменной "*". К р о м е того, свойство подстановки выполнять­
ся до разбора командной строки позволило М е ф о д и ю передать в качестве
одного параметра " l s - l d " и л и " b i n / t w o b i n / l o o p " , а интерпретато­
ру — разбить эти параметры н а имя команды и ключи и два и м е н и файла
соответственно.
В s h есть и оператор цикла w h i l e , формат которого аналогичен i f ,
и более удобный и м е н н о в сценариях оператор обхода списка f o r (спи­
сок делится н а слова так ж е , как и командная строка — с п о м о щ ь ю разде¬
лителей):

[ m e t h o d y @ l o c a l h o s t methody]$ f o r V a r i n Wuff-Wuff

Miaou-Miaou; do echo $Var; done

Wuff-Wuff

Miaou-Miaou

[ m e t h o d y @ l o c a l h o s t methody]$ f o r F i n ' d a t e ' ; do echo -n "<$F>"; done;

echo

<Сбт><Ноя><6><12:08:38><2004>

[ m e t h o d y @ l o c a l h o s t methody]$ c a t > / t m p / s e t v a r

QWERTY="$1"

[ m e t h o d y @ l o c a l h o s t methody]$ s h / t m p / s e t v a r 1 2 3; echo $QWERTY

[ m e t h o d y @ l o c a l h o s t methody]$ . /tmp/setvar 1 2 3; echo $QWERTY

Пример 8.18. Использование for и операции " . "

Во втором f o r Мефодий воспользовался подстановкой вывода коман­


д ы d a t e , каждое слово которой вывел с помощью e c h o -n в одну строку,
а в конце команды пришлось вывести один перевод строки вручную.
Вторая половина примера иллюстрирует ситуацию, с которой М е ­
фодий столкнулся во время своих экспериментов: все переменные, опре-

149
Курс Операционная система Linux

деляемые в сценарии, после окончания его работы куда-то пропадают.


Оно и понятно: для обработки сценария всякий раз запускается новый и н ­
терпретатор (дочерний процесс!), и все его переменные принадлежат и м е н ­
но ему и с завершением процесса уничтожаются. Таким образом достига­
ется отсутствие побочных эффектов: запуская программу, пользователь
может быть уверен, что та не изменит окружения командной оболочки.
Однако в некоторых случаях требуется обратное: запустить сценарий, ко¬
торый н у ж н ы м образом настроит окружение. Единственный выход — от¬
давать такой сценарий на обработку текущему, а не новому, интерпрета¬
тору (т. е. тому, что разбирает команды пользователя). Это делается с п о ­
м о щ ь ю специальной команды " . " . Если вдруг в передаваемом сценарии
обнаружится команда e x i t , e x e c или какая-нибудь другая, приводящая
к завершению работы интерпретатора, завершится и м е н н о текущая к о ­
мандная оболочка, чем сеанс работы пользователя в системе может и за­
кончиться.

Настройка командного интерпретатора

Научившись (главным образом в результате чтения документации и


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

Привязка к клавишам

Оказалось, что настройка управляющих клавиш в b a s h не выглядит


как сценарий, и даже имеет отношение не только к b a s h , а ко всем п р о ­
граммам, использующим библиотеку терминального ввода r e a d l i n e .
Конфигурационный файл r e a d l i n e называется . i n p u t r c и состоит, в о с ­
н о в н о м , из к о м а н д вида "управляющая_последовательность":
функция, где управляющая_последовательность — это символы,
при получении которых r e a d l i n e выполнит функцию работы с вводи¬
мой строкой. С п и с о к всех ф у н к ц и й r e a d l i n e м о ж н о узнать у b a s h по
команде b i n d - l , а список всех привязок этих ф у н к ц и й к клавиатурным
последовательностям — по команде b i n d -p. М е ф о д и й вписал в . i n p u -
t r c такие две строки:

"\e[5~": backward-word

"\e[6~": forward-word

Пример 8.19. Настройка . i n p u t r c

150
Лекция 8 Возможности командной оболочки

Упомянутые в примере ф у н к ц и и позволяют перемещать курсор в к о ­


мандной строке по словам, а esc-последовательности возвращаются, соот­
ветственно, к л а в и ш а м и Page Up и Page Down виртуальной консоли
Linux (сочетание " e " означает в . I n p u t r c клавишу esc, то есть " [ " , л

символ с ASCII-кодом 27).


К одной и той ж е ф у н к ц и и r e a d l i n e м о ж н о привязать сколько угод­
но управляющих последовательностей: например, клавиша home делает то
же, что и " А " , Стрелка вверх — то ж е , что и " р " , а D e l — то ж е , что
Л л

и " D " (только н е в пустой строке!). Таким образом отчасти решается


A

проблема несовместимости управляющих последовательностей термина¬


лов: если в каком-нибудь терминале другого типа Page Up и л и Page
Down будут возвращать другие последовательности, М е ф о д и й просто д о ­
бавит в . i n p u t r c е щ е одну пару команд. Правда, Гуревич советовал ему
вовсе отказаться от редактирования . i n p u t r c , а воспользоваться утили­
той t p u t , которая обращается к переменной TERM и базе данных по тер­
миналам t e r m i n f o и готова выдать верную для любого данного термина­
ла и н ф о р м а ц и ю п о k p p (key previous page) и k n p (key next page). Выдачу
t p u t м о ж н о «скормить» той ж е b i n d , и получить команду, которая рабо­
тает на любом терминале: b i n d " \ " " t p u t k p p \ " : b a c k w a r d - w o r d "
x

(кавычки, э к р а н и р о в а н н ы е обратной косой чертой, " \ , передадутся b i n d


в н е и з м е н н о м виде).

Стартовые сценарии

Настройка оболочки — это в первую очередь настройка окружения. В


начале сеанса работы (при запуске стартового командного интерпретатора)
с п о м о щ ь ю команды " . " выполняется сценарий из файла со специаль­
н ы м именем — / e t c / p r o f i l e . Это — так называемый общесистемный
профиль, стартовый сценарий, в ы п о л н я ю щ и й с я п р и входе в систему лю¬
бого, кто использует командную оболочку, подобную sh. Следом выпол¬
няется персональный профиль (или просто профиль) пользователя — сце­
н а р и й , находящийся в д о м а ш н е м каталоге, и называющийся . p r o f i l e .
Этот сценарий пользователь может видоизменять, к а к ему заблагорассу­
дится.
Что касается b a s h , то структура его стартовых файлов сложнее.
Прежде всего, - / . p r o f i l e выполняется, только если в д о м а ш н е м ката­
логе нет файла . b a s h _ p r o f i l e или . b a s h _ l o g i n , иначе стартовый
сценарий берется оттуда. В эти ф а й л ы м о ж н о помещать команды, несо­
вместимые с другими версиями shell, например, управление сокращения­
ми или привязку ф у н к ц и й к клавишам. К р о м е того, каждый интерактив­
ный (взаимодействующий с пользователем), н о н е стартовый b a s h в ы ­
полняет системный и персональный конфигурационные сценарии

151
Курс Операционная система Linux

/ e t c / b a s h r c и - / . b a s h r c . Чтобы стартовый b a s h также в ы п о л н я л


- / . b a s h r c , соответствующую к о м а н д у н е о б х о д и м о в п и с а т ь в
- / . b a s h _ p r o f i l e . Далее, каждый неинтерактивный (запущенный д л я
в ы п о л н е н и я с ц е н а р и я ) b a s h сверяется с п е р е м е н н о й о к р у ж е н и я
BASH_ENV и, если в этой переменной записано и м я существующего ф а й ­
ла, выполняет команды оттуда. Н а к о н е ц , п р и завершении стартового
b a s h выполняются команды и з файла ~ / . b a s h _ l o g o u t .

Пример настроек

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


М е ф о д и й , сам или с п о м о щ ь ю Гуревича, разместил в д о м а ш н е м каталоге.

PS1="\u@\h:\w \$ "

EDITOR="/usr/bin/vim"

export PS1 EDITOR

# Get t h e a l i a s e s and f u n c t i o n s

if [ - f -/.bashrc ]; then

. -/.bashrc

fi

Пример 8.20. П р и м е р файла .bash_profile

В этом файле вызывается - / . b a s h r c (если о н существует).


# User s p e c i f i c a l i a s e s and f u n c t i o n s

if [ -r -/.alias ]; then

. -/.alias

fi

# Source g l o b a l definitions

if [ - r /etc/bashrc ]; then

. /etc/bashrc

fi

Пример 8.21. П р и м е р файла . b a s h r c

М е ф о д и й решил, что сокращения удобнее будет хранить в отдель­


ном файле — / . a l i a s . К р о м е того, вызывается сценарий b a s h r c , кото¬
р ы й М е ф о д и й обнаружил в каталоге / e t c . Этот файл н е входит в число
автоматически выполняемых b a s h , поэтому его в ы п о л н е н и е надо зада­
вать явно:

152
Лекция 8 Возможности командной оболочки

alias > -/.alias

Пример 8.22. П р и м е р файла .bash logout

Заметив, что команда a l i a s выдает с п и с о к с о к р а щ е н и й в том ж е


формате, в котором о н и и задаются, М е ф о д и й придумал, к а к обойтись
без редактирования файла - / . a l i a s . Отныне все сокращения, опреде­
л е н н ы е к моменту завершения сеанса работы, будут записываться обрат­
но в . a l i a s . Туда попадут и те сокращения, что были считаны во время
в ы п о л н е н и я . b a s h r c , и те, что впоследствии были определены вручную:

alias l='ls -FAC

alias ls='ls --color=auto'

alias pd='pushd'

alias pp='popd'

alias v='ls - a l i '

alias vi='/usr/bin/vim'

Пример 8.23. П р и м е р файла . a l i a s

Последняя запись в файле . a l i a s относится к инструменту, с помо¬


щ ь ю которого М е ф о д и й создавал все эти файлы: текстовому редактору
vim. О текстовых редакторах речь пойдет в следующей лекции.

153
Курс Операционная система Linux

Лекция 9. Текстовые редакторы

В лекции вводится понятие «текстовый редактор». Задача лекции — по­


знакомить читателя с двумя наиболее развитыми инструментами Linux, пред­
назначенными для редактирования текста и решения смежных с редактиро­
ванием задач: Vim/Vi и Emacs. В одной лекции невозможно дать подробное
описание этих программ, поэтому изложение ограничивается основными
принципами работы с этими редакторами, простейшими примерами и пере¬
числением случаев, когда удобно и рационально использовать Vim/Vi и
Emacs.

Ключевые слова: аббревиативность, буфер, буфер текстового редак­


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

Задача текстовых редакторов

После основных утилит для работы с файлами и текстом первая п р о ­


грамма, которая понадобится любому пользователю Linux — это тексто­
вый редактор (для краткости — просто редактор). И з предыдущих л е к ц и й
и собственных экспериментов М е ф о д и ю уже стало п о н я т н о , какое значи¬
тельное место занимают в системе Linux д а н н ы е в текстовом формате, т. е.
состоящие из символов, которые могут быть отображены на экране тер¬
минала и которые может прочесть человек. Однако пока М е ф о д и й мог
работать с текстом только последовательно, строка за строкой; даже имея
дело с файлом, о н н е мог вернуться и отредактировать уже переданные
системе строки. И м е н н о для того, чтобы работать с текстовым файлом
как со страницей, по которой м о ж н о перемещаться и редактировать текст
в любой точке, и нужны текстовые редакторы*.
Текстовый редактор потребуется пользователю Linux в первую оче­
редь для того, чтобы изменить настройки системы и л и своего окружения,
например, shell — при этом нужно будет редактировать конфигурационные

* Э т а к а ж у щ а я с я с е г о д н я т р и в и а л ь н о й в о з м о ж н о с т ь с к о л ь к о у г о д н о р е д а к т и р о в а т ь текст,
н е о с т а в л я я п р и э т о м н и к а к и х следов, б ы л а р а д и к а л ь н е й ш и м д о с т и ж е н и е м п р о г р е с с а п о
сравнению с пишущей машинкой.

154
Лекция 9 Текстовые редакторы

файлы, которые всегда представлены в текстовом формате (см. л е к ц и и 8


и 12). Н о и собственные задачи пользователя могут потребовать редакти­
рования текстовых файлов: например, сценарии и программы, электрон­
н ы е письма, а также заметки для себя, которые пишет М е ф о д и й —все это
д а н н ы е в текстовом формате. Текстовые д а н н ы е , полученные при помо¬
щ и стандартных утилит, тоже бывает удобно сохранять в файлах и редак¬
тировать.
Н е стоит путать текстовые редакторы и текстовые процессоры. Текс¬
товые процессоры, например OpenOffice Writer или Microsoft Word, пред­
назначены для создания документов, в которых, п о м и м о собственно тек­
ста, содержится и различная метаинформация ( и н ф о р м а ц и я об оформле¬
нии): размещение текста на странице, ш р и ф т и т. п. Поскольку в тексто¬
вом формате не предусмотрено средств для сохранения и н ф о р м а ц и и об
о ф о р м л е н и и (там есть только символы и строки), текстовые процессоры
используют собственные форматы для хранения данных. Текст, в котором
нет н и к а к о й метаинформации об о ф о р м л е н и и , называют «plain text»
(только текст, «плоский», простой текст).
Однако при п о м о щ и текстовых редакторов м о ж н о работать не толь¬
ко с форматом plain text. Различная метаинформация (об о ф о р м л е н и и ,
способе использования текста, например, в качестве ссылки и пр.) может
быть записана и в виде обычных символов (т. е. в текстовом формате), но
со специальным соглашением, что эти символы нужно интерпретировать
особым образом: как инструкции по обработке текста, а не к а к текст. Та¬
к и е инструкции называются разметкой. Таким образом устроен, н а п р и ­
мер, формат H T M L . Для того чтобы обработать разметку H T M L и в соот­
ветствии с ней отобразить текст, нужна специальная программа — бро­
узер, но редактировать ф а й л ы H T M L и прочие форматы разметки м о ж н о
и при п о м о щ и текстового редактора. К р о м е того, программы на любых
языках программирования и сценарии (программы на shell) тоже пред­
ставляют собой текстовые файлы. М н о г и е текстовые редакторы ориенти¬
р о в а н ы на работу не только с «плоским» текстом, но и с текстом в различ¬
ных форматах. Для этого придумана масса усовершенствований, умень¬
ш а ю щ и х количество символов, которые нужно вводить вручную: специ¬
альные команды, клавиатурные с о к р а щ е н и я и автодополнение ключевых
слов и конструкций.
Важнейшее условие для текстового редактора в Linux — возможность
работать в терминале, так как это основной способ управления системой.
Поэтому и ввод данных, и редактирование д о л ж н ы полностью осуществ¬
ляться средствами терминала, т. е. а л ф а в и т н о - ц и ф р о в ы м и и некоторыми
ф у н к ц и о н а л ь н ы м и клавишами. Поскольку функциональных клавиш, на
которые м о ж н о рассчитывать на любом терминале, совсем немного, а ко¬
манд, которые нужно отдавать редактору, — очень много, требуется с п о -

155
Курс Операционная система Linux

соб вводить л ю б ы е команды ограниченными средствами терминала. Это


условие, равно как и требование удобства при работе с разнообразными
структурированными текстами, выполнено в двух «главных» текстовых
редакторах Linux — V i и Emacs, о которых в основном и будет идти речь в
этой л е к ц и и .

Vi и лучше, чем Vi

В любой системе Linux, даже при самой м и н и м а л ь н о й конфигура¬


ц и и , всегда присутствует текстовый редактор, поскольку в любой — даже
самой катастрофической — ситуации у пользователя должна быть воз¬
можность отредактировать к о н ф и г у р а ц и о н н ы е ф а й л ы , чтобы привести
систему в рабочее состояние. П о сложившейся традиции текстовым ре­
дактором, который обязательно запустится из любой командной строки
Linux, является V i * . Однако верно и обратное: если вы работаете в незна¬
комой системе Linux или произошел сбой, в результате которого доступ¬
на только очень небольшая часть системы, нельзя быть уверенным, что
найдется хоть какой-нибудь другой текстовый редактор, кроме V i . П о э т о ­
му каждому пользователю Linux нужны хотя бы основные н а в ы к и работы
в V i . П р и первом знакомстве c V i m работа обычно не ладится: очень уж о н
непривычен, его нельзя с удобством использовать, запомнив только две-
три простейшие команды редактирования. Стоит понять основные п р и н ­
ц и п ы работы в V i и потратить некоторое время на его освоение, тогда в
нем откроется м о щ н ы й инструмент, п о з в о л я ю щ и й очень э ф ф е к т и в н о ра¬
ботать с текстом.
Под именем V i , на самом деле, может скрываться несколько разных
программ: с момента появления V i m в операционной системе U N I X (а
это произошло около 30 лет назад) этот редактор стал чем-то вроде стан­
дарта. К настоящему времени существует ряд программ, либо в точности
повторяющих вид и поведение «классического» V i (например, n v i ) , либо
очень похожих на него, но со значительно р а с ш и р е н н ы м и возможностя­
ми (Vim, e l v i s ) . Наибольшей популярностью пользуется V i m , возмож­
ности которого огромны — для их описания потребовалось почти сто т ы ­
сяч строк документации. Когда пользователь Linux набирает в командной
строке V i , скорее всего, будет запущена «облегченная» версия V i m , кото­
рая настроена таким образом, чтобы максимально воспроизводить пове­
дение классического редактора V i m . Естественно, в таком режиме часть
возможностей V i m недоступна. Все свойства, которыми V i отличается от
* К а к и б о л ь ш и н с т в о о с н о в н ы х у т и л и т и п р и н ц и п о в , у н а с л е д о в а н н ы х Linux от U N I X . Н а ­
з в а н и е V i п р о и с х о д и т от visual editor, « в и з у а л ь н ы й » , э к р а н н ы й р е д а к т о р , п о с к о л ь к у V i —
п е р в ы й р е д а к т о р д л я U N I X , и с п о л ь з у ю щ и й в е с ь э к р а н д л я о т о б р а ж е н и я текста и п о з в о л я ­
ю щ и й работать с т е к с т о м н е п о с т р о ч н о , а п е р е м е щ а я с ь п о н е м у в л ю б ы х н а п р а в л е н и я х ,
как по странице.

156
Лекция 9 Текстовые редакторы

V i m , обязательно снабжены в руководстве по V i указанием «not in vi». В


дальнейшем изложении под V i м ы будем понимать и м е н н о V i m в режиме
совместимости, все возможности, недоступные в этом режиме, будут ого¬
вариваться. Чтобы вызвать V i m в п о л н о ф у н к ц и о н а л ь н о м режиме, доста¬
точно набрать команду Vim.
Популярность V i не случайна: этот текстовый редактор позволяет не
только производить простые операции редактирования текстовых файлов
— он хорошо приспособлен и для максимально быстрого и эффективного
решения ряда смежных с редактированием задач. Среди самых важных его
возможностей — инструменты для работы с текстами на различных языках
программирования и в различных форматах разметки. V i m умеет подсве­
чивать разными цветами синтаксические конструкции языка программи­
рования или разметки*, автоматически выставлять отступы, что облегчает
восприятие структуры документа. К р о м е того, в V i m есть специальные
средства для организации цикла отладки программы: компиляция—прав­
ка исходного текста—компиляция... Подробнее об этих и прочих возмож­
ностях V i m можно узнать из руководств по V i m . Объем данной лекции
позволяет описать только самое начало работы с V i ; более подробное вве­
дение в этот текстовый редактор м о ж н о найти в книге Курячий:2004.

Запуск Vi

Чтобы начать сеанс редактирования в V i , достаточно выполнить к о ­


манду V i на любом терминале. Чтобы открыть для редактирования уже
существующий файл, путь к этому файлу нужно указать в качестве пара¬
метра: " v i путь_к_файлу". К а к и всякая уважающая себя программа
U N I X , V i m может быть запущен с множеством модифицирующих его по¬
ведение ключей, которые подробно о п и с а н ы в руководстве. Вызванный
без параметра, редактор откроет пустой буфер — чистый лист для создания
нового текста. В центре экрана при этом может появиться краткое п р и ­
ветственное сообщение, где указаны версия программы и команды для
получения п о м о щ и и выхода из редактора (что нетривиально). Однако та­
кое сообщение может и не появится — это зависит от версии V i , установ¬
л е н н о й в системе.
Для отображения текста и работы с н и м V i использует весь э к р а н
терминала — только последняя строка предназначена для диалога с поль¬
зователем: вывода и н ф о р м а ц и о н н ы х сообщений и ввода команд. П о к а
буфер не заполнен текстом, в начале каждой строки экрана отображается
символ "-", обозначающий, что в этом месте буфера нет ничего, даже пу¬
стой строки. О б щ и й вид экрана в начале работы будет примерно такой:
* Обычно современные терминалы и программы-эмуляторы терминалов поддерживают
вывод текста п о крайней мере несколькими р а з н ы м и цветами.

157
Курс Операционная система Linux

Пример 9.1. Начало работы с V i

Символ "#" обозначает курсор. На экране терминала умещается


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

Режимы

В V i проблема разделения команд редактору и вводимого текста ре¬


шена при п о м о щ и режимов: в командном режиме нажатие на любую кла¬
вишу — это команда редактору, в режиме вставки нажатие на клавишу
приводит к вставке соответствующего символа в редактируемый текст.
Поэтому при работе с V i пользователю всегда нужно обращать в н и м а н и е
на то, в каком режиме находится редактор.

режимы Vi
Состояния редактора V i , в которых он по-разному обрабатывает
нажатия клавиш. Различают три режима V i : командный (нажатие
любой клавиши считается командой и немедленно исполняет­
ся), вставки (нажатие клавиши-печатного символа приводит к
вставке этого символа в текст) и командной строки (для ввода
длинных команд, отображаемых на экране; ввод завершается
Enter).

Редактор V i всегда начинает работу в командном режиме. В этом ре¬


ж и м е есть два способа отдавать команды редактору. Во-первых, нажатие
практически на любую клавишу редактор воспринимает как команду. В
V i m , даже в режиме Vi-совместимости, командное значение определено
для всех латинских букв (в верхнем и н и ж н е м регистрах), ц и ф р , знаков
п р е п и н а н и я и большинства других печатных символов. П р и нажатии на
эти клавиши вводимые команды нигде не отображаются — о н и просто ис­
полняются*.

* Не н у ж н о п ы т а т ь с я вводить текст в к о м а н д н о м р е ж и м е : п о с к о л ь к у у к а ж д о й буквы есть к о ­


м а н д н о е з н а ч е н и е , результат м о ж е т быть с а м ы м н е о ж и д а н н ы м !

158
Лекция 9 Текстовые редакторы

Во-вторых, у V i есть своя командная строка: чтобы ее вызвать, нужно


ввести в командном режиме ":". В результате в начале последней строки
экрана появится двоеточие — это приглашение командной строки. Здесь
вводятся более сложные команды V i , которые включают в себя целые сло­
ва (например, имена файлов), причем текст набираемой команды, конеч­
но, отображается. Команды передаются V i клавишей Enter. В современ­
ных версиях V i m с командной строкой можно работать так же, как и в shell:
редактировать ее, достраивать команды клавишей Tab, пользоваться исто¬
рией команд.
Главная команда командной строки V i m — вызов подсистемы п о м о ­
щ и " h e l p Enter". Двоеточие переводит V i m в режим командной стро­
ки, " h e l p " — собственно команда, Enter передает команду. h e l p м о ж н о
вызывать с аргументом: названием команды или настройки V i m . V i m
очень хорошо документирован, поэтому по команде " : h e l p объект"
м о ж н о получить и н ф о р м а ц и ю о любом свойстве V i m , например, команда
" : h e l p i " выведет сведения о значении к л а в и ш и " i " в командном ре¬
жиме Vi.
Команда " : s e t имя настройки" позволяет настраивать V i m прямо в
процессе работы с ним. Н а п р и м е р , отдав команду " : s e t w r a p " пользо­
ватель тем самым включает настройку "wrap", что заставляет редактор
переносить с л и ш к о м д л и н н ы е строки, н е умещающиеся в ш и р и н у терми­
нала. Включить эту настройку м о ж н о командой " : s e t n o w r a p " , так что
к о н ц ы д л и н н ы х строк исчезнут за правым краем экрана.
Н а к о н е ц , чтобы ввести текст, нужно перейти из командного режима
в режим вставки, нажав клавишу " i " (от «insert» — «вставка»). В этот мо¬
мент в последней строке появится сообщение о том, что редактор нахо-
д и т с я в режиме вставки: "--INSERT--" или "--ВСТАВКА--"*, в зависи­
мости от установленного я з ы к а системных сообщений.
В режиме вставки м о ж н о вводить текст, завершая строку нажатием
E n t e r . Однако нужно помнить, что в некоторых (ортодоксальных) версиях
V i в режиме ввода не работают никакие команды перемещения по тексту —
здесь можно только набирать. Если вы заметили, что ошиблись в наборе —
не нужно сразу перемещать курсор и пытаться исправть ошибку: гораздо
удобнее будет внести все исправления потом, в командном режиме, где д о ­
ступно множество специальных команд быстрого перемещения и замены
текста. Чтобы перейти из режима вставки обратно в командный режим,
нужно нажать ESC**.
М е ф о д и й начал упражняться с V i m на файле примеров:

* Е с л и и с п о л ь з у е т с я н е V i m , и л и н а с т р о й к а showmode п о у м о л ч а н и ю з а п р е щ е н а , с о о б щ е ­
н и я может и не быть.
** Если V i m п р и ш е л в н е п о н я т н о е д л я в а с с о с т о я н и е , н а ж м и т е E S C , ч т о б ы вернуться в к о ­
м а н д н ы й р е ж и м (иногда требуется н а ж а т ь E S C д в а ж д ы ) .

159
Курс Операционная система Linux

methody@oblomov:~ $ v i t e x t f i l e

Это файл для примеров.

Пример 1.

"textfile" 2L, 33C 1,1 Весь

Пример 9.2. V i m в командном режиме

V i m начал работу, к а к и положено — в командном режиме. В послед­


ней строке содержатся некоторые полезные сведения об открытом файле:
его и м я , общее количество строк ("2L"), символов ("33С"), п о з и ц и я
курсора ("1,1" — номер_строки, номер_символа). "Весь" обознача­
ет, что все содержимое файла уместилось на экране терминала. Теперь
М е ф о д и й нажмет " i " и введет немного текста:

Это файл для примеров.

Пример 1.

Моя первая сторка вv i !

-- ВСТАВКА -- 3,24 Весь

Пример 9.3. V i m в режиме вставки

Теперь V i m работает в режиме вставки: в последней строке п о я в и ­


лось и н ф о р м а ц и о н н о е сообщение об этом. Набрав текст, М е ф о д и й может
вернуться в к о м а н д н ы й режим, нажав ESC (подсказка "--ВСТАВКА--"
при этом исчезнет и з последней строки).
На самом деле, и з командного режима м о ж н о перейти в режим вво¬
да несколькими командами. Разница между н и м и заключается в том, в
какой точке начнется ввод символов. Н а п р и м е р , п о командам "O" и "о"
(«open») м о ж н о вводить текст с новой строки (до и л и после текущей), по
команде " I " — с начала строки, команды "а" и "A" («append») ведают до­
бавлением символов (после курсора и л и в конец строки) и т. п.

160
Лекция 9 Текстовые редакторы

Работа с файлами

Редактируя текст в V i , пользователь работает не непосредственно с


файлом, а с буфером. Если открывается уже существующий файл, V i ко¬
пирует его содержимое в буфер и отображает буфер на экране. Все изме¬
н е н и я , которые производит пользователь, происходят и м е н н о в содержи­
м о м буфера — открытый файл пока остается неизменным. Если ж е V i в ы ­
зван без параметра, то создается пустой буфер, который пока не связан н и
с каким файлом*.
Чтобы записать сделанные изменения в файл, используется команда
" : w E n t e r " (чтобы ее отдать, нужно сначала перейти в командный ре­
жим). О том, что "w" — это сокращение от англ. «write», «записать», мож­
но узнать, нажав T a b после ":w" — и V i m дополнит эту команду до
" w r i t e " . П о д о б н ы м образом м о ж н о поступить с большинством команд
в командной строке V i m — в этом редакторе очень последовательно со¬
блюдается п р и н ц и п аббревиативности. М е ф о д и й выполнил " w r i t e " и
получил такое и н ф о р м а ц и о н н о е сообщение:
Это файл для примеров.

Пример 1.

Моя первая сторка вvi!

"textfile" 3L, 57C записано 3,24 Весь

Пример 9.4. Запись файла

М е ф о д и й не указал, куда и м е н н о записать содержимое буфера, и по


умолчанию оно было записано в тот файл, который он и открывал для ре­
дактирования: " t e x t f i l e " . Однако команде " w r i t e " м о ж н о указать
любое имя файла в качестве параметра — и тогда содержимое буфера бу¬
дет записано в этот файл, а если такого файла нет, то он будет создан. Па¬
раметр " w r i t e " обязательно потребуется, если текст в буфере еще не за¬
писан н и в к а к о м файле.
Наиболее важна для новичка команда выхода из V i — " : q E n t e r "
(сокращение от «quit»). Пользователь, запустивший редактор в первый
раз, нередко сталкивается с тем, что н и к а к не может его закрыть: не рабо-
* В д е й с т в и т е л ь н о с т и с о д е р ж и м о е буфера х р а н и т с я в с п е ц и а л ь н о м в р е м е н н о м ф а й л е (swap
file). Е с л и с е а н с р а б о т ы в р е д а к т о р е п о к а к о й - т о п р и ч и н е п р е р в а л с я , то этот в р е м е н н ы й
ф а й л н е будет удален, и п р и с л е д у ю щ е й п о п ы т к е п р о д о л ж и т ь н е з а к о н ч е н н у ю работу с
ф а й л о м V i п р е д л о ж и т п р о в е с т и п р о ц е д у р у в о с с т а н о в л е н и я — н а случай, если в о в р е м е н н о м
ф а й л е остались н е с о х р а н е н н ы е и з м е н е н и я .

161
Курс Операционная система Linux

тает н и один из привычных способов завершения программы, даже " с " л

V i обрабатывает по-своему*. И ":w", и " : q " — команды режима команд­


ной строки; в этот режим V i переводится из командного режима с помо¬
щью ":" , набираемого в начале команды.
Однако если в буфере есть и з м е н е н и я , которые еще не записаны н и
в каком файле, то V i откажется выполнять команду " : q " , предложив сна­
чала сохранить эти изменения. Если вы не хотите сохранять и з м е н е н и я ,
нужно настоять на своем ж е л а н и и выйти из V i , добавив к команде выхо­
да восклицательный знак: " : q ! " . В этом случае все несохраненные и з м е ­
н е н и я будут выброшены. Восклицательный знак м о ж н о добавить в к о н ц е
любой файловой команды в командной строке V i — в этом случае V i будет
без возражений выполнять команды.
В V i предпринято множество усилий для э к о н о м и и сил и времени
пользователя, командующего редактором. Поэтому м о ж н о одним разом
записать текст и выйти и з редактора: командой ":wq" или аналогичной
командой " : x " , просто нажав "ZZ" в командном режиме.

Перемещение по тексту

П р и редактировании в тексте всегда есть точка, в которой пользова¬


тель «находится» в д а н н ы й момент: вводимые с клавиатуры символы п о ­
явятся и м е н н о здесь, удаляться символы будут тоже отсюда, к этой точке
будут применяться команды редактора и т. п. Обычно эта точка обознача­
ется курсором, а в последней ( и н ф о р м а ц и о н н о й ) строке экрана V i m ука¬
зывает номера текущей строки и к о л о н к и (номер символа в строке), в ко¬
торых находится курсор.
Для того чтобы выполнять редактирование текста, по нему необхо­
д и м о перемещаться, т. е. перемещать курсор. С а м ы й очевидный способ
это делать — воспользоваться клавишами со стрелками. Нажатие на одну
из этих клавиш обычно заставляет курсор перемещаться на один символ
влево/вправо или на одну строку вверх/вниз. Трудно придумать более н е ­
э ф ф е к т и в н ы й и медленный способ перемещения, если нужно попасть на
другой конец объемого текста, и даже простое перемещение к началу или
концу строки может занять несколько секунд.
Заметим, что в процессе редактирования текста обычно возникает
необходимость перемещаться не в произвольную точку, а в некоторые
ключевые: начало и конец строки, слова, предложения, абзаца, выраже­
н и я , заключенного в скобки, целого текста. Особенно это заметно, если
требуется редактировать структурированный текст: программу (напри­
мер, сценарий), к о н ф и г у р а ц и о н н ы й файл и т. п. В V i для каждого такого

* У п р а в л я ю щ а я п о с л е д о в а т е л ь н о с т ь << с" п р и в о д и т к а в а р и й н о м у з а в е р ш е н и ю т е к у щ е й
Л

команды Vi, а н е с а м о г о р е д а к т о р а .

162
Лекция 9 Текстовые редакторы

перемещения предусмотрены специальные команды, обычно состоящие


в нажатии одной клавиши в командном режиме. Используя их, м о ж н о не
только нажав одну кнопку переместиться на любое расстояние в тексте,
но и двигаться по структурным элементам, переходя к предыдущему/сле¬
дующему слову, предложению, абзацу, скобке и т. д.*
Итак, передвинуть курсор на начало текущей строки м о ж н о коман¬
дой " 0 " , на первый непробельный символ в строке — " " , в конец стро­ Л

ки — "$"**. Абзацами V i считает фрагменты текста, разделенные пустой


строкой, к началу предыдущего/следующего абзаца м о ж н о попасть ко¬
манд " { " и " } " соответственно. Очень распространенная задача — необ­
ходимость попасть в самый конец файла: для этого служит команда "G"
(«Go»), в самое начало — "gg".
Передвинуть курсор вперед на начало следующего слова можно ко¬
мандой "w" (от «word», слово), на начало предыдущего — "b" (от «back-
ward», назад). К началу предыдущего/следующего предложений можно пере­
меститься командами " ( " и ") " соответственно. Нужно учитывать, что гра­
ницы слов и предложений Vi находит по формальным признакам (руководст­
вуясь специально определенными регулярными выражениями), поэтому реше­
ние Vi может иногда не совпадать с представлениями пользователя о грани­
цах слов и предложений. Однако пользователь всегда властен изменить соот­
ветствующие регулярные выражения, подробности — в документации по Vim.
В V i m никогда не следует вручную повторять одну и ту ж е команду:
если нужно перейти на три слова вперед, не следует трижды нажимать "w"
— для повторения команды используется множитель. Множитель — это лю¬
бое число, набранное перед командой V i : команда будет повторена соот¬
ветствующее число раз. Например, "3w" — означает «трижды переместить
курсор на слово вперед», иначе говоря, переместить курсор на три слова
вперед. Обратите внимание, что множители могут применяться не только
с командами перемещения, но и с любыми командами V i . Аналогично
м о ж н о переместить курсор на 10 абзацев вперед командой "10}".

множитель
Число, предшествующее команде V i m и означающее, что дан¬
ную команду следует выполнить указанное число раз.

Н е сразу очевидно, что п о и с к шаблона в тексте (строки или регуляр­


ного выражения) — это тоже команда перемещения. К а к и любое переме­
щ е н и е , п о и с к осуществляется в командном режиме: прежде всего, нужно

* Прежде ч е м н а ч и н а т ь э к с п е р и м е н т и р о в а т ь с п е р е м е щ е н и е м , н у ж н о п е р е й т и в к о м а н д н ы й
режим.
Л
** С и м в о л а м и " " и " $ " в Linux п о в с е м е с т н о о б о з н а ч а ю т с я н а ч а л о и к о н е ц с т р о к и , в ч а ­
стности, в регулярных выражениях.

163
Курс Операционная система Linux

нажать "/": в последней строке появится символ "/". Далее следует вве­
сти шаблон для поиска — он будет отображаться в этой строке, его м о ж н о
редактировать. Обычно V i настроен таким образом, что шаблон для п о и с ­
ка интерпретируется как регулярное выражение, где ряд символов имеет
специальное значение, эту настройку м о ж н о отключить ( " : s e t nomag -
i c " ) . После того, как введен шаблон, следует нажать Enter — курсор п е ­
реместится к ближайшему (далее по тексту) совпадению с шаблоном. По¬
и с к в обратном направлении (к предыдущему совпадению) следует начи¬
нать с команды " ? " .
Совсем просто перейти к следующему употреблению в тексте того
слова, на котором стоит курсор: для этого нужно просто нажать "*" в к о ­
мандном режиме. Аналогичная команда поиска слова в обратном направ­
л е н и и — "#". М о ж н о специально отметить в тексте точку и затем в любой
момент возвращаться к ней, как к закладке. Одну закладку определяет
сам V i — " " " " , место в тексте, где было сделано последнее изменение.
Подробно об этих и других командах перемещения м о ж н о прочесть в ру­
ководстве по V i m по команде " : h e l p u s r _ 0 3 . t x t " .

Изменение текста

В к о м а н д н о м р е ж и м е нельзя вводить с и м в о л ы в текст с клавиату­


ры, но изменить текст при этом м о ж н о , н а п р и м е р , удаляя символы.
Ч т о б ы удалить отдельный символ (тот, на котором стоит курсор), доста¬
точно нажать " x " в к о м а н д н о м р е ж и м е , а ч т о б ы удалить сразу целую
строку (естественно, текущую, то есть ту, в которой находится курсор) —
"dd". «d» — это с о к р а щ е н и е от «delete», удалить, а «dd» — характерный
п р и е м V i : удвоение к о м а н д ы означает, что ее нужно п р и м е н и т ь к теку¬
щ е й строке.
И з командной строки V i м о ж н о выполнить операцию поиска и заме¬
ны: для простой строки или для регулярного выражения. Причем синтак¬
сис к о м а н д ы поиска и замены полностью воспроизводит синтаксис пото¬
кового редактора s e d , о котором уже шла речь в л е к ц и и 7:

Это файл для примеров.

Пример 1.

Моя первая сторка в vi...

:s/.$/.../

Пример 9.5. Замена по шаблону в V i

164
Лекция 9 Текстовые редакторы

Мефодий хотел заменить в своем файле точки в концах строки много­


точиями. Для этого в командном режиме он нажал ":" (вызов командной
строки Vi), где набрал команду " s " (сокращение от «substitute», заменить),
за которой следует уже знакомое по " s e d " выражение "/что_заме-
нить/на_что_заменить/". Только результат получился совсем не тот,
какого ожидал Мефодий: заменился на многоточие восклицательный знак
последней строки. Не учел он следующего: по умолчанию шаблоны для по­
иска и замены — это регулярные выражения, то есть " . " означает вовсе не
точку, а «любой символ». Имея в виду точку, следовало написать "\.". " $ " ,
как и ожидал Мефодий, это конец строки. В момент выполнения команды
поиска курсор находился в последней строке, в первом совпадении после
курсора и была произведена замена.
Форматирование текста — это расстановка символов конца строки,
пробелов и табуляций таким образом, чтобы текст хорошо смотрелся на
экране терминала. Форматирование вручную крайне н е э ф ф е к т и в н о . В
V i m автоматическое форматирование текста (если редактируется п р о ­
грамма на каком-либо я з ы к е программирования, то с учетом правил это­
го языка) может происходить прямо в режиме вставки, в режиме вставки
ж е м о ж н о изменять отступ текущей строки (по командам " Б " и " т " ) .
Л Л

Для выравнивания текста по центру, правому или левому краю команды


" : c e n t e r " , " : l e f t " и " : r i g h t " соответственно. Эти команды, как и
большинство команд командной строки, м о ж н о применять к диапазону
строк способом, о п и с а н н ы м ниже.
Режим ввода не богат специальными командами изменения текста,
что и понятно: он предназначен для ввода. Однако в V i m (но не в Vi!) есть
некоторые удобства, у п р о щ а ю щ и е и сам процесс набора. Если слово, ко¬
торое нужно ввести, уже встречалось в тексте, м о ж н о набрать только пер¬
вые буквы и нажать " р " («previous») — V i m попробует сам завершить его.
Л

Если V i m не угадал и предложил не то слово, м о ж н о продолжить переби¬


рать варианты. Команда " Ы " («next») подставляет слова, которы встре­
Л

чаются н и ж е по тексту. Подробнее об этой ф у н к ц и и м о ж н о узнать из ру­


ководства по к о м а н д е " : h e l p i n s - c o m p l e t i o n " .
Иногда пользователь, и з м е н и в текст, тут ж е хочет вернуть все об¬
ратно. Д л я этого в V i предусмотрена команда о т м е н ы последнего и з м е ­
н е н и я : " u " в к о м а н д н о м р е ж и м е (от «undo», отменить). К а к и м бы слож¬
н ы м , м а с ш т а б н ы м (и разрушительным) н и было и з м е н е н и е , совершен¬
н о е последней к о м а н д о й , " u " вернет текст в исходное состояние. Впро¬
ч е м , саму отмену тоже м о ж н о отменить. В классическом V i доступна от¬
мена только последней в ы п о л н е н н о й к о м а н д ы , а в V i m отменить м о ж н о
сколько угодно последних к о м а н д , а также повторить их к о м а н д о й
Л
" Р".

165
Курс Операционная система Linux

Работа с фрагментами текста

Любая команда перемещения определяет две точки в тексте: ту, в кото­


рой был курсор до перемещения, и ту, в которую он переместился в резуль­
тате данной команды. Расположенный между этими двумя точками отрезок
текста однозначно задается командой перемещения. Например, команда
" ) " захватывает текст от текущего положения курсора до начала следующе­
го предложения. V i позволяет прменить к этому фрагменту любую команду
редактирования — так устроены гнездовые команды. Гнездовая команда с о ­
стоит из действия и следующего за ним перемещения. Перемещение задает
фрагмент текста, а действие определяет, что с этим фрагментом сделать. На¬
пример, команда " d ) " удалит весь текст от текущей п о з и ц и и курсора до
начала следующего предложения. Наиболее полезные действия — " d "
(«delete»), " c " («change»), ">" и "<" (сдвинуть), " y " (запомнить) и " g q "
(отформатировать).

гнездовая команда
Команда редактора V i , позволяющая применить указанное дей­
ствие к указанному отрезку текста. Отрезок задается стан­
дартной командой перемещения по тексту.

Очень часто возникает необходимость заменить фрагмент в тексте:


слово, предложение, строку и т. д. Это м о ж н о сделать в два действия: сна¬
чала удалить часть текста, затем перейти в режим вставки и вставить заме¬
ну. V i предоставляет возможность упростить эту операцию, сведя два д е й ­
ствия к одному: заменить. Гнездовая команда " c " предназначена и м е н н о
для этого. Н а п р и м е р , команда "cw" (буквально: «change word») заменит
текст от курсора до начала следующего слова (так м о ж н о заменить одно
слово), " c ) " заменит текст от курсора до начала следующего предложе¬
ния.
М е ф о д и й не забыл, что команды перемещения м о ж н о использовать
с множителями, и попробовал заменить сразу три слова в своем файле на
другие: для этого он в командном режиме подогнал курсор в начало сло­
ва «первая» и набрал "c3w" («заменить фрагмент отсюда до начала треть­
его слова», буквально: «change 3 words»). Результат этой команды выгля¬
дел так:

Это файл для примеров.

Пример 1.

Моя #vi...

166
Лекция 9 Текстовые редакторы

ВСТАВКА 3,5 Весь

Пример 9.6. Команда замены в V i

В примере знак "#" обозначает п о з и ц и ю курсора: к а к видно, V i уда­


лил три слова, попавшие в зону действия команды и сразу перешел в ре¬
ж и м вставки. М е ф о д и ю осталось только набрать что-то взамен.
Перестановка частей — типичная задача, возникающая в процессе
редактирования. Для перестановки требуется удалить фрагмент в одном
месте текста и вставить его ж е в другом. Для р е ш е н и я первой части зада­
ч и в V i нет специальных средств, потому что любая команда удаления
("d", " c " , " x " и др.) сохраняет удаленный текст в специальном регистре.
Для вставки последнего удаленного фрагмента служит команда "p" в к о ­
мандном режиме (от «put», положить). П р и п о м о щ и этой команды М е ф о ­
д и й может вставить только что удаленные и м командой "c3w" три слова:

Это файл для примеров.

Пример 1.

Моя новая строка для vi...

первая строка в

4,1 Весь

Пример 9.7. Вставка удаленного фрагмента

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


(от «yank» — забрать, сдернуть): она не удаляет текст, а просто сохраняет
его в том ж е регистре, что и команды удаления. Команду "у" м о ж н о и с ­
пользовать в гнездовых командах, например, "y5w" сохранит в регистре
фрагмент текста от курсора до начала пятого слова. Вставить скопирован¬
н ы й фрагмент м о ж н о все той ж е командой "p" . Однако таким способом
м о ж н о вставлять только текст, удаленный или с к о п и р о в а н н ы й последним,
для хранения нескольких разных фрагментов текста следует и м е н о в а н ­
н ы е регистры (см. подробнее в руководстве по Vim).
Для того чтобы применить команду к нескольким строкам текста, не
обязательно подгонять к ним курсор. В командной строке V i любой коман­
де может предшествовать указание диапазона в тексте, к которому следует
эту команду применить. Команды с указанием диапазона выглядят так:
" :начало, конец}команда", где начало и конец — это адреса началь­
ной и конечной строк диапазона (т. е. фрагмента текста), а команда — это

167
Курс Операционная система Linux

команда режима командной строки, такая как ":w" или " : r " . Многие к о ­
манды командного режима (в частности, "d" и "у") доступны также и в ко¬
мандной строке. В качестве адреса можно использовать номера строк в
файле (команда ":1,5у" будет означать «скопировать в регистр строки с
первой по пятую»), есть специальные обозначения для текущей строки
("."), последней строки ("$") и всего файла ("%"). Указать границу диа­
пазона можно и при помощи шаблона: граничной будет считаться та стро­
ка, в которой обнаружится шаблон.
Последним свойством М е ф о д и й воспользовался, чтобы удалить
плоды своих экспериментов: о н выполнил команду ":/Пример 1/,$d"
(от строки "Пример 1" д о конца файла — удалить):

Это файл для примеров.

3 fewer lines

Пример 9.8. Удаление диапазона п о шаблону. Выполнена команда


":/Пример 1 / , $ d E n t e r " .

Настройка Vi и Vim

Вид и поведение V i и V i m можно существенно изменить при помощи


настроек, приспособив редактор именно к своим вкусам и привычкам.
Прямо во время работы редактора можно менять настройки из командной
строки V i при помощи команды " : s e t ммя_настройкм". Кроме того,
можно сделать настройку постоянной, вписав все нужные значения в кон­
фигурационный файл . v i m r c (или . e x r c — для Vi) в домашнем каталоге
пользователя. П р и каждом запуске V i m / V i читает этот файл и исполняет
все содержащиеся в нем команды. Объем лекции не позволяет подробно
остановиться на настройке V i , читатель может заняться изучением этого
вопроса сам: все необходимые сведения есть в руководствах. Чтобы оце­
нить возможности настройки, можно выполнить в V i m (но не в Vi!) коман­
ду " : o p t i o n s " , по которой будет выведен список всех доступных опций с
кратким описанием их смысла.

Л у ч ш е , чем Emacs?

Заголовок этого раздела сформулирован таким п р о в о к а ц и о н н ы м об­


разом н е случайно: любому пользователю похожей на U N I X о п е р а ц и о н ­
ной системы (к таким системам относится и Linux) необходим текстовый

168
Лекция 9 Текстовые редакторы

редактор. Выбор очень многих пользователей падает на один и з двух наи¬


более популярных и, к а к следствие, наиболее универсальных (реализо­
ванных и работающих везде) текстовых редактора: V i (или одну из его вер­
сий, чаще всего Vim) и Emacs. Оба эти редактора появились около трид¬
цати лет назад, н о почтенный возраст и м на пользу: огромное количество
по всему миру все эти годы занималось их отладкой, локализацией и рас¬
ширением.
V i m и Emacs образуют альтернативную пару н е только п о историче¬
ской случайности: оба редактора претендуют на роль универсального
средства для работы с текстом на любых естественных и искусственных
языках. И действительно, трудно назвать сравнимый с н и м и п о возмож­
ностям текстовый редактор, да е щ е и настолько нетребовательный к ин¬
терфейсу: и V i m , и Emacs будут работать на любом терминале. Однако ог¬
р а н и ч е н н ы е возможности интерфейса терминала требуют от программ
надежного способа отделения команд редактору от вводимого текста. В V i
и Emacs эта задача решена по-разному — отсюда и большая часть разли¬
ч и й в стиле работы с этими редакторами, и традиционный спор привер¬
ж е н ц е в этих редакторов о том, и з них лучше.

Тексты на разных языках

Главное свойство, которое сделало Emacs таким популярным и м н о ­


гофункциональным редактором — это заложенная в н е м с самого начала
п р и н ц и п и а л ь н а я расширяемость. Emacs почти полностью написан на
специально созданном для него я з ы к е программирования Emacs Lisp, и у
любого пользователя есть возможность запрограммировать необходимые
именно ему ф у н к ц и и и подключить их в качестве модуля к Emacs. П р и
этом сам Emacs н и к а к изменять н е требуется. Сообщество программистов
не замедлило воспользоваться расширяемостью Emacs, и к настоящему
времени важнейшее достоинство этого редактора состоит и м е н н о в сво¬
бодно распространяемых пакетах р а с ш и р е н и й , содержащих инструменты
для р е ш е н и я самых разнообразных задач, связанных с редактированием
текста.
Современный Emacs — это н е просто текстовый редактор, а интегри¬
рованная среда для работы в системе. Основная идея сообщества разра­
ботчиков и пользователей Emacs состоит в том, что Emacs позволяет ра¬
ботать с л ю б ы м и д а н н ы м и , которые могут быть представлены к а к текст (в
л е к ц и и 7 обсуждалось, что таким образом м о ж н о представить очень м н о ­
гое в системе). Естественно, список содержащихся в каталоге файлов,
программа на каком-либо я з ы к е программирования или электронное
письмо — это тексты, которые сильно различаются по структуре и по то¬
* Обратите в н и м а н и е , что в Emacs понятие «режим» имеет с о в е р ш е н н о и н о й смысл, ч е м в V i !

169
Курс Операционная система Linux

му, что от них нужно пользователю. В Emacs для работы с текстами р а з н о ­


го типа используются режимы*.

режим Emacs
Комплекс команд и настроек Emacs, предназначенных для ра¬
боты с текстом определенной структуры, например содержи¬
м ы м каталога, программой на Си и. т. п.

Каждый буфер в Emacs находится в одном из основных режимов. Ос¬


новной режим — это набор ф у н к ц и й и настроек Emacs, приспособленных
для редактирования текста определенного вида. К а ж д ы й основной режим
по-своему переопределяет некоторые управляющие символы, так что н а ­
иболее доступными становятся команды, чаще всего и м е н н о для работы
с текстом данного типа. К о м а н д ы , с п е ц и ф и ч н ы е для текущего основного
режима, обычно начинаются с управляющего символа C-c. Некоторое
представление о возможностях Emacs может дать весьма н е п о л н ы й с п и ­
сок тех текстов, для которых существуют основные режимы:
• список файлов в каталоге;
• программы на самых разных языках программирования, от Си до са¬
мых экзотических;
• тексты в различных форматах разметки: X M L , H T M L , TeX;
• словари;
• электронная почта (режим позволяет н е только читать и писать
письма, н о и отправлять и получать их);
• календарь;
• д н е в н и к и личное расписание;
• многое другое.
Когда требуется много и быстро работать с текстом на каком-либо
искусственном я з ы к е (языке программирования, разметки и пр.), воз¬
м о ж н о , Emacs — это лучший выбор.
Н е хуже в Emacs развиты и средства работы с текстами на разных ес¬
тественных языках с с а м ы м и экзотическими письменностями. Просто
для оценки возможностей Emacs в этой области м о ж н о выполнить к о ­
манду "C-h h", по которой будет выведен файл, изображающий привет­
ствие на разных языках.

Команды Emacs

Если в вашей системе установлен Emacs, то вы можете его запустить,


набрав emacs в командной строке любого терминала. К а к и V i m , Emacs
использует весь э к р а н терминала, хотя интерфейс у него более богатый:
вверху экрана находится строка с пунктами м е н ю , под ней — о к н о для

170
Лекция 9 Текстовые редакторы

отображения и редактирования текста, которое заканчивается строкой ре­


жима, отображаются сведения о происходящем в окне. В самом низу э к ­
рана — строка минибуфера, используемая для диалога с пользователем, в
частности для отображения и редактирования вводимых команд.
V i и вслед за н и м V i m — это многорежимные редакторы, когда к о м а н ­
д ы вводятся в о д н о м р е ж и м е , а текст — в другом, ч т о п о з в о л я е т
использовать в качестве командных любые клавиши. В Emacs нет специ¬
ального командного режима, н о использован тот факт, что с клавиатуры
м о ж н о вводить н е только печатные, н о и некоторые управляющие симво­
лы. Д л я этого используются несколько управляющих клавиш терминала
(прежде всего C t r l и Alt), нажатые в сочетании с р а з л и ч н ы м и текстовы­
ми символами. Ч т о б ы ввести такой символ, нужно нажать управляющую
клавишу (например, C t r l ) и, удерживая ее, нажать клавишу с одним из
печатных символов (например, " x " ) . К р о м е того, в Emacs используется
управляющая клавиша Meta. Н а тех терминалах, где она отсутствует, ее
ф у н к ц и и обычно передаются клавише A l t . Н а «настоящих» терминалах
обычно н е бывает н и Meta, н и A l t ; из клавиатурных модификаторов п р и ­
сутствуют только C t r l и Shi ft. Тогда на п о м о щ ь приходит старая добрая
ESC: нажатие ESC, а после н е е — печатного символа (того ж е "x") эквива­
лентно "Meta x".
К о м а н д в редакторе Emacs чрезвычайно много, доступных управля¬
ю щ и х символов на всех н е хватает, поэтому чтобы вызвать команду
Emacs, обычно требуется ввести ключ, н а ч и н а ю щ и й с я с управляющего
символа, за которым следует к о м б и н а ц и я и з управляющих и л и обычных
символов, просто полное и м я команды. Последовательность символов,
достаточная для вызова команды, называется законченным ключом, а если
введенных символов недостаточно для однозначного определения коман¬
ды, это — префиксный ключ.
Общее правило здесь таково: чем ч а щ е команда, тем короче вызыва¬
ю щ и й ее ключ, и наоборот. Д л я лаконичной записи д л и н н ы х клавиатур­
ных к о м б и н а ц и й в сообществе пользователей Emacs сложилась особая
традиция сокращенных обозначений. Клавишу C t r l обозначают заглав­
н о й буквой "C", Meta — "M"*. Сочетания с командной клавишей обозна­
чаются дефисом, например, запись С-h обозначает, что нужно, удержи­
вая Ctrl, нажать "h". C-h — это п р е ф и к с н ы й ключ для команд справоч¬
н о й системы Emacs. Н а ч и н а ю щ е м у пользователю стоит выполнить ко¬
манды " C-h ?" (набрать C-h и затем нажать "?") — справка п о командам
п о м о щ и , "C-h t " — интерактивный учебник для н а ч и н а ю щ и х пользова¬
телей Emacs, и " C-h i " — полное руководство по Emacs (в формате
i n f o ) . С ключа C-x начинаются основные команды Emacs, в частности,

* З а с в о и д л и н н ы е к о м а н д ы и з р а з н ы х к о м б и н а ц и й у п р а в л я ю щ и х к л а в и ш н а з в а н и е Emacs
п о л у ч и л о ш у т о ч н у ю р а с ш и ф р о в к у : Escape-Meta-Alt-Control-Shift.

171
Курс Операционная система Linux

для работы с файлами и буферами. Чтобы завершить работу Emacs, нуж­


но ввести "C-x C-c".
У любой команды Emacs есть собственное имя. П о этому и м е н и
м о ж н о вызвать команду, даже если она не привязана н и к какому клавиа­
турному ключу. Для вызова команд по и м е н и используется п р е ф и к с н ы й
ключ M-x. Н а п р и м е р , посмотреть справку о п о м о щ и в Emacs м о ж н о ко¬
мандой "M-x h e l p - f o r - h e l p " .

Работа с файлами

В Emacs, как и в V i m , пользователь редактирует текст не в самом


файл, а в буфере. Отличие Emacs в том, что нельзя написать «безымян¬
ный» текст и затем сохранить его в файле. П р и запуске Emacs без параме¬
тров открывается специальный буфер — " * s c r a t c h * " . О н предназначен
для временных заметок — его содержимое будет выброшено при закрытии
Emacs. Если нужно создать н о в ы й файл — его следует открыть командой
" C-x C-f", точно так ж е открывается для редактирования уже существу¬
ю щ и й файл.
После того к а к М е ф о д и й нажал " C-x C-f" , в минибуфере возникло
приглашение: " F i n d f i l e : ~/". Теперь нужно ввести путь к файлу, н а ­
ч и н а я с текущего каталога (Emacs любезно подсказал его М е ф о д и ю ) . С
текстом в минибуфере м о ж н о обращаться почти так ж е , как с командной
строкой shell или V i m : редактировать, использовать автодополнение (кла¬
вишей Tab), перемещаться по истории стрелочками вверх/вниз. М е ф о ­
д и й не замедлил воспользоваться этой возможностью и, набрав " t e " , н а ­
жав Tab и Enter, приступил к редактированию того ж е " t e x t f i l e " .
Сохранить сделанные и з м е н е н и я м о ж н о командой "C-x C-s".
Когда М е ф о д и й захотел открыть еще один буфер, чтобы один из сво¬
их сценариев, он забыл точное название нужного файла и, набрав " C-x
C-f b i n / " , нажал Enter. В о к н е возник с п и с о к файлов в подкаталоге
" ~ / b i n " , похожий на вывод l s - l :

File Edit Options B u f f e r s Tools O p e r a t e Mark Regexp Immediate Subdir

Help

/home/methody/bin:

итого 24

drwxr-xr-x 2 methody methody 4096 Дек 2 15:21

drwx 10 methody methody 4096 Дек 2 15:21

-rwxr-xr-x 1 methody methody 26 Ноя 9 21:34 loop

-rwxr-xr-x 1 methody methody 23 Ноя 9 21:34 s c ri pt

-rwxr-xr-x 1 methody methody 32 Ноя 9 21:34 to.sort

-rwxr-xr-x 1 methody methody 44 Ноя 9 21:34 two

172
Лекция 9 Текстовые редакторы

-RRR:%%-F1 b i n ( D i r e d by name)--L5--C51--All--Reading d i r e c t o r y

/home/methody/bin/...done

Пример 9.9. Emacs. Режим d i r e d

К а к указано в строке режима, это Dired, редактор каталогов, режимов


Emacs, предназначенный для просмотра и изменения каталогов прямо из
редактора. В Dired м о ж н о выбирать отдельные ф а й л ы и л и группы файлов
и производить над н и м и различные действия: открыть для редактирова­
н и я , удалить, скопировать, переместить, переимновать по определенной
схеме и т. д. Одним словом, Dired — довольно м о щ н о е средство для н а ­
глядной работы с файловой системой, особенно о н удобен для работы с
группой файлов. Подробности о командах, доступных в этом режиме,
м о ж н о найти в руководстве по Emacs.

Перемещение по тексту
В Emacs, к а к и в V i m , есть понятие «точка» — то место в буфере, где
будет происходить вставка и л и удаление данных. П е р е м е щ е н и е п о тексту
— это перемещение точки. К о м а н д ы перемещения п о структурным эле¬
ментам текста развиты н е менее, ч е м в V i m — п о м и м о обычных стрелок,
действуют команды перемещения в начало и к о н е ц строки ( C - a и C - e ) ,
буфера ( M - < и M->), предложения ( M - a и M - e ) , к предыдущему и следую­
щему слову ( M - f и M - b ) , абзацу ( M - f и M-}). Различные основные режи­
мы предоставляют специализированные команды для перемещения по
структурным элементам текстов на разных языках программирования,
разметки и д р .
В Emacs несколько видов поиска: существуют отдельные команды
для поиска строки и поиска п о регулярному выражению. Если требуется
найти ближайшее употребление конкретного слова, удобнее всего вос¬
пользоваться наращиваемым поиском п о команде C - s . Н а р а щ и в а е м ы й п о ­
иск уже встречался Мефодию: так был устроен поиск п о истории команд
в b a s h . П о мере набора первых символов искомой строки Emacs перено¬
сит точку к ближайшему подобному сочетанию символов после курсора.
П о и с к в обратном направлении (к началу буфера) осуществляется к о м а н ­
дой C - r . Наращиваемый п о и с к м о ж н о выполнять по регулярному выра­
ж е н и ю ( C - M - s ) . Все виды наращиваемого поиска в Emacs н е различают
п р о п и с н ы е и строчные буквы.

Изменение текста

В Emacs есть множество команд, позволяющих пользователю в ы ­


полнять м е н ь ш е действий п р и редактировании текста. Если пользователь

173
Курс Операционная система Linux

осознает, что набрал что-то неправильно, о н может разом удалить послед­


нее слово (M-Del) и л и предложение ( C - x D e l ) . М о ж н о уничтожать и
вперед: до конца слова (M-d) и предложения (M-k). Emacs хранит н е толь­
ко последний удаленный фрагмент, н о и все предыдущие, формируя спи¬
сок удалений. Только что уничтоженный текст м о ж н о вставить командой
C-y. После этого его м о ж н о заменить предыдущим уничтоженным фраг­
ментом — M-y. М о ж н о двигаться и далее назад п о списку удалений, п о ­
вторяя M-y.
Хорошо продуманы команды для перестановки частей текста вокруг
точки: двух знаков ( C - t ) , слов (M-t), строк ( C - x C - t ) . Команда M-t н е
перемещает знаки п р е п и н а н и я между словами, поэтому "потеха, д е ­
ло" превратится в "дело, потеха".
П р я м о и з Emacs м о ж н о вызвать программу проверки орфографии
("M-x i s p e l l - b u f f e r " ) или даже включить проверку «на лету», когда
неправильно н а п и с а н н ы е слова выделяются другим цветом ("M-x f l y -
s p e l l - m o d e " ) . М о ж н о проверить н а п и с а н и е отдельного слова, в кото­
р о м находится точка (" M-x $") или завершить недописанное слово, о с н о ­
вываясь на орфографическом словаре ("M-x Tab").
В Emacs так много специальных команд для изменения текста, что
команды поиска и замены бывают нужны н е так часто. Произвести заме¬
ну строки всюду в буфере м о ж н о п о команде " M - x r e p l a c e - s t r i n g что
заменить Enter на_что заменить Enter", а для замены регулярного в ы ­
ражения существует аналогичная команда "M-x r e p l a c e - r e g e x p " .
Если нужно заменить строку только в некоторых случаях, пригодит­
ся команда M-%, запрашивающая подтверждение о замене п р и каждой
найденной строке. Аналогичная команда для регулярных выражений —
C-M-%.
Л ю б ы е изменения в тексте м о ж н о отменить командой C-_ (нужно
нажать C t r l , Shi ft и "-" ).

Работа с фрагментами текста

М н о г и е команды Emacs работают с произвольным фрагментом те¬


кущего буфера. Такие команды всегда применяются к текущей области.
Область — это отрезок текста между точкой (где находится курсор) и мет¬
кой. Метка в любой момент присутствует в любом буфере, пользователь
может установить ее в любом месте текста я в н о — командой M-Пробел.
Метка может перемещаться и без вмешательства пользователя: команды
перемещения и редактирования могут изменять положение метки. Таким
образом, чтобы выделить в буфере фрагмент текста, м о ж н о проделать
следующие операции:
• переместить точку (курсор) на один конец нужного фрагмента;

174
Лекция 9 Текстовые редакторы

• нажать M-Пробел (установить метку);


• переместить точку к другому концу нужного фрагмента.
Теперь м о ж н о выполнять команду редактирования — она будет п р и ­
менена и м е н н о к выделенной области. Н а п р и м е р , C-w удалит текст обла­
сти, а M-w скопирует его. Вставить удаленный или с к о п и р о в а н н ы й фраг¬
мент м о ж н о командой C-y.
Есть группа команд, позволяющих работать с меткой более э ф ф е к ­
тивно: установить метку после конца следующего слова (M-@), пометить
текущий абзац (M-h) или весь буфер (" C-x h"). Различные основные р е ­
ж и м ы предоставляют команды для пометки структурных элементов текс­
та, например, разделов документа, определения ф у н к ц и и (в тексте п р о ­
граммы) и т. п. Все положения метки хранятся в списке пометок, перене¬
сти точку в любое и з предшествующих положений метки м о ж н о , нужное
количество раз повторив команду " C-u C-@".

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

К а к и в V i m , в Emacs м о ж н о использовать для хранения и н ф о р м а ц и и


регистры. В регистре Emacs м о ж н о сохранить позицию в буфере и затем
перейти к этой п о з и ц и и ( " C - x r Пробел x " записывает п о з и ц и ю точки
в регистр " x " , а " C - x r j x " переходит в эту позицию). В регистре мож­
но сохранить текст и з области ("C-x r s x " сохраняет область в регист­
ре "x", "C-x r i x " — вставляет текст из этого регистра). В регистрах
также м о ж н о хранить числа, имена файлов, конфигурацию окон. По¬
дробности, к а к всегда, в руководстве.

Настройка Emacs

Коротко говоря, в Emacs м о ж н о настроить все: связи между ключа¬


ми и командами редактора, определить макрокоманды, написать собст¬
в е н н ы е расширения. Есть возможность изменять настройки Emacs к а к в
процессе работы, так и п р и п о м о щ и конфигурационного файла .emac-
src.

Просто текстовые редакторы

И в V i m , и в Emacs интегрировано множество средств для автомати­


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

175
Курс Операционная система Linux

но быстро и с м и н и м а л ь н ы м и затратами ручного труда. Однако если


пользователя не устраивает такой п р и н ц и п работы (когда нужно часто чи¬
тать документацию и думать, как организвать так, чтобы «ручную» работу
в ы п о л н я л компьютер), V i m и Emacs будут не самым лучшим выбором.
Для обычного редактирования текста вручную лучше выбрать один из
текстовых редакторов с простым и п р и в ы ч н ы м интерфейсом: в дистрибу¬
тивах Linux м о ж н о найти огромное количество таких текстовых редакто­
ров с большими или м е н ь ш и м и возможностями: m c e d i t , j o e , p i c o
(часть почтовой программы p i n e ) — всех не перечислить. Есть редакто­
ры, которые предназначены для работы не в терминале, а в графической
среде (например, n e d i t ) , у тех же V i m и Emacs есть графические вариан­
ты ( G V i m и Emacs-X11 или XEmacs), в которых доступны дополнитель¬
н ы е возможности графического пользовательского интерфейса: м е н ю ,
и к о н к и и пр.

176
Лекция 10 Этапы загрузки системы

Лекция 10. Этапы загрузки системы

В лекции рассматриваются основные этапы загрузки компьютера как до


начала работы ядра Linux (системно-независимая часть), так и в процессе
загрузки системы (собственно Linux). Подробно разбираются уровни выпол­
нения и стартовые сценарии. Описаны действия, необходимые для останова
системы.

Ключевые слова: BIOS, M B R , P I D , базовое я д р о , виртуальная ф а й л о ­


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

Досистемная загрузка

Программа l o g i n , регистрирующая пользователей в системе, запу­


скается только тогда, когда сама система уже приведена в полную готов¬
ность и работает в обычном режиме. Происходит это далеко н е сразу по¬
сле включения компьютера: Linux — довольно сложная система, объекты
которой попадают в оперативную память н е сами собой, а в процессе за¬
грузки. Сама загрузка — процесс ступенчатый: поведение компьютера на
различных этапах загрузки определяется р а з н ы м и людьми — от разработ­
ч и к о в аппаратной составляющей д о системного администратора. Предъ­
я в л я е м ы е к системе требования гибкости, возможности изменять ее наст­
ройку в зависимости от аппаратной составляющей, необходимость ре¬
шать разные задачи с п о м о щ ь ю одного и того ж е компьютера тоже делают
процесс загрузки ступенчатым: сначала определяется профиль будущей
системы, а затем этот профиль реализуется.
Начальный этап вообще н е зависит от того, какая операционная с и ­
стема установлена на компьютере, для некоторых этапов в каждой опера­
ц и о н н о й системе предлагаются свои р е ш е н и я — п о большей части, взаи-

177
Курс Операционная система Linux

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


Н а ч и н а я с определенного этапа, загрузка компьютера уже управляется
самой Linux, используются утилиты, сценарии и т. п. Эту стадию (завер¬
шающую) назовем системной загрузкой.

Загрузчик в ПЗУ
Сразу после включения оперативная память компьютера классической
архитектуры девственно чиста. Для того чтобы начать работать, процессору
необходима хоть какая-то программа. Эта программа автоматически загру­
жается в память из постоянного запоминающего устройства, ПЗУ (или R O M ,
read-only memory), в которое она вписана раз и навсегда в неизменном в и ­
де*. В специализированных компьютерах (например, в дешевых игровых при­
ставках) все, что нужно пользователю, записывается именно на П З У (часто
сменное), и запуском программы оттуда загрузка заканчивается.
Обычно в компьютерах общего назначения программа и з П З У поль¬
зователю ничем полезна н е бывает: она невелика, да и делает всегда одно
и то же. Слегка изменить поведение программы из П З У м о ж н о , оперируя
д а н н ы м и , записанными в энергонезависимую память (иногда ее называют
C M O S , иногда — N V R A M ) . Объем энергонезависимой памяти очень неве­
лик, а д а н н ы е и з нее сохраняются после выключения компьютера за счет
автономного электропитания (как правило, от батарейки вроде часовой).
Что должна уметь эта начальная программа? Распознавать основные
устройства, на которых может быть записана другая — нужная пользова­
телю — программа, уметь загружать эту программу в память и передавать
ей выполнение, а также поддерживать интерфейс, п о з в о л я ю щ и й менять
настройки в N V R A M . Собственно, это даже н е одна программа, а множе¬
ство подпрограмм, занимающихся взаимодействием с разнообразными ус­
тройствами ввода-вывода — к а к с теми, на которых могут храниться про¬
граммы (жесткие и гибкие диски, магнитные ленты и даже сетевые кар¬
ты), т а к и теми, посредством которых м о ж н о общаться с пользователем
(последовательные порты передачи данных — если есть возможность под­
ключить консольный терминал, системная клавиатура и видеокарта — для
простых персональных рабочих станций). Этот набор подпрограмм в ПЗУ
обычно называется BIOS (basic input-output system).
BIOS
С о к р а щ е н и е от «Basic Input-Ooutput System», набор подпро­
грамм в ПЗУ, предназначенных для простейшего низкоуровне¬
вого доступа к в н е ш н и м устройствам компьютера. В современ¬
ных О С используется только в процессе начальной загрузки.

* С о в р е м е н н ы е к о м п ь ю т е р ы и с п о л ь з у ю т программируемые ПЗУ, содержимое которых


м о ж н о и з м е н я т ь , о д н а к о т а к о е и з м е н е н и е всегда с ч и т а е т с я с и т у а ц и е й н е ш т а т н о й : н а п р и ­
м е р , з а п и с ь н о в о й в е р с и и с о д е р ж и м о г о ПЗУ, в к о т о р о й и с п р а в л е н ы о ш и б к и (upgrade).

178
Лекция 10 Этапы загрузки системы

Этот этап загрузки системы м о ж н о назвать нулевым, так как н и от ка¬


кой системы он не зависит. Его задача — определить (возможно, с помо¬
щ ь ю пользователя), с какого устройства будет идти загрузка, загрузить от­
туда специальную программу-загрузчик и запустить ее. Н а п р и м е р , выяс­
нить, что устройство для загрузки — жесткий диск, считать самый первый
сектор этого диска и передать управление программе, которая находится
в считанной области.

Загрузочный сектор и первичный загрузчик

Ч а щ е всего размер первичного дискового загрузчика — программы, ко¬


торой передается управление после нулевого этапа, — весьма невелик.
Это связано с требованиями универсальности подобного рода программ.
Считывать д а н н ы е с диска м о ж н о секторами, размер которых различает­
ся для разных типов дисковых устройств (от п о л о в и н ы килобайта до вось¬
ми или даже больше). К р о м е того, если считать один, первый, сектор дис¬
ка м о ж н о всегда одним и тем ж е способом, то команды чтения нескольких
секторов на разных устройствах могут выглядеть по-разному. Поэтому-то
первичный загрузчик занимает обычно не более одного сектора в самом
начале диска, в его загрузочном секторе.
Если бы первичный загрузчик был побольше, о н , наверное, и сам мог
бы разобраться, где находится ядро операционной системы, и смог бы са­
мостоятельно считать его, разместить в памяти, настроить и передать ему
управление. Однако ядро операционной системы имеет довольно слож¬
ную структуру — а значит, и непростой способ загрузки; о н о может быть
довольно большим, и, что неприятнее всего, может располагаться неизве­
стно где на диске, подчиняясь законам файловой системы (например, с о ­
стоять из нескольких частей, разбросанных по диску). Учесть все это пер¬
в и ч н ы й загрузчик не в силах. Его задача скромнее: определить, где на
диске находится «большой» вторичный загрузчик, загрузить и запустить
его. Вторичный загрузчик прост, и его м о ж н о положить в заранее опреде¬
ленное место диска, и л и , на худой к о н е ц , положить в заранее определен¬
н о е место карту размещения, описывающую, где и м е н н о искать его части
(размер вторичного загрузчика ограничен, поэтому построить такую кар¬
ту возможно).

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

179
Курс Операционная система Linux

В случае IBM-совместимого компьютера размер загрузочного секто­


ра составляет всего 512 байтов, и з которых далеко н е все приходятся на
программную область. Загрузочный сектор I B M P C , называемый M B R
(master boot record), содержит также таблицу разбиения диска, структура
которой описана в л е к ц и и 11. П о н я т н о , что программа такого размера н е
может похвастаться разнообразием функций. Стандартный для многих
систем загрузочный сектор может только считать таблицу разбиения д и с ­
ка, определить так называемый загрузочный раздел (active partition) и за­
грузить программу, расположенную в начале этого раздела. Д л я каждого
типа диска может быть своя программная часть MBR, что позволяет счи­
тывать д а н н ы е из любого места диска, сообразуясь с его типом и геомет¬
рией. Однако считывать м о ж н о все ж е н е более одного сектора: неизвест¬
но, для чего используются установленной на этом разделе операционной
системой второй и последующие сектора. Выходит, что стандартная п р о ­
граммная часть M B R — это некий предзагрузчик, который считывает и за­
пускает настоящий первичный загрузчик из первого сектора загрузочного
раздела.
Существуют версии предзагрузчика, предоставляющие пользовате­
л ю возможность самостоятельно выбрать, с какого из разделов выпол­
нять загрузку*. Это позволяет для каждой из установленных операцион¬
ных систем хранить собственный первичный загрузчик в начале раздела и
свободно выбирать среди них. В стандартной схеме загрузки Linux ис¬
пользуется и н о й подход: простой первичный загрузчик записывается
прямо в MBR, а ф у н к ц и я выбора передается вторичному загрузчику.

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

Загрузчик ядра

В задачу вторичного загрузчика входит загрузка и начальная настрой­


ка ядра операционной системы. К а к правило, ядро системы записывает­
ся в файл с определенным именем. Н о к а к вторичному загрузчику прочи­
тать файл с ядром, если в Linux эта операция и есть функция ядра?. Эта за­
дача может быть решена тремя способами.
Во-первых, ядро может и н е быть файлом на диске. Если загрузка
происходит по сети, достаточно попросить у сервера «файл с таким-то
именем», и в ответ придет цельная последовательность данных, содержа -

* Н а п р и м е р , B O O T A C T V и з п а к е т а p f d i s k и л и с т а н д а р т н ы й д л я FreeBSD п р е д з а г р у з ч и к
boot 0, к о т о р ы е , в силу и х досистемности, м о ж н о п р и м е н я т ь где у г о д н о .

180
Лекция 10 Этапы загрузки системы

щая з а п р о ш е н н о е ядро. Все файловые операции выполнит сервер, на к о ­


тором система уже загружена и работает. В других случаях ядро «загоня¬
ют» в специально выделенный под это раздел, где оно лежит уже не в ви¬
де файла, а таким ж е н е п р е р ы в н ы м куском, размер и местоположение ко¬
торого известны. Однако в Linux так поступать не принято, так как места
для специального раздела на диске, скажем, IBM-совместимого компью¬
тера может и не найтись.
Во-вторых, м о ж н о воспользоваться о п и с а н н о й в ы ш е картой разме­
щения: представить ядро в виде набора секторов на диске, записать этот
набор в заранее определенное место, а загрузчик заставить собирать ядро
из кусков по карте. Использование карты размещения имеет два сущест­
венных недостатка: ее создание возможно только под управлением уже за­
груженной системы, а изменение ядра должно обязательно сопровождать­
ся изменением карты. Если по какой-то п р и ч и н е система не загружается
н и в одной из заранее спланированных конфигураций, единственная воз­
можность поправить дело — загрузиться с внешнего носителя (например,
с лазерного диска). А система может не загружаться и м е н н о потому, что
администратор забыл после изменения ядра пересобрать карту: в карте
указан с п и с о к секторов, соответствовавших старому файлу с ядром, и п о ­
сле удаления старого файла в этих секторах может содержаться какой
угодно «мусор».
В-третьих, м о ж н о научить вторичный загрузчик распознавать струк¬
туру файловых систем и находить там ф а й л ы по и м е н и . Это заметно уве¬
личит его размер и потребует «удвоения функций» — ведь точно такое ж е ,
даже более м о щ н о е , распознавание будет и в самом ядре. Зато описанной
в ы ш е тупиковой ситуации м о ж н о избежать, если, скажем, не удалять ста­
рое ядро при установке нового, а переименовывать его. Тогда, если за­
грузка системы с новым ядром не удалась, м о ж н о загрузиться еще раз,
вручную указав имя файла (или каталога) со старым ядром, под управле¬
н и е м которого все работало исправно.
Вторичный загрузчик может не только загружать ядро, но и настра­
ивать его. Ч а щ е всего используется механизм настройки ядра, похожий на
командную строку shell: в роли команды выступает ядро, а в роли параме­
тров — настройки ядра. Настройки ядра нужны для временного измене­
н и я его функциональности: например, чтобы выбрать другой графичес¬
к и й режим виртуальных консолей, чтобы отключить поддержку дополни¬
тельных возможностей внешних устройств (если аппаратура их не под¬
держивает), чтобы передать самому ядру указания, как загружать систему
и т. п.
Очень часто конфигурация вторичного загрузчика предусматривает
несколько вариантов загрузки, начиная от нескольких вариантов загруз­
ки одного и того ж е ядра с р а з н ы м и настройками (например, стандарт-

181
Курс Операционная система Linux

н ы й профиль и профиль с отключенными р а с ш и р е н н ы м и возможностя­


ми) и заканчивая вариантами загрузки разных ядер и даже разных опера¬
ц и о н н ы х систем. Это требует от самого загрузчика некоторого разнообра¬
зия интерфейсных средств. С одной стороны, о н должен уметь работать в
непритязательном окружении, например обмениваться с пользователем
д а н н ы м и через последовательный порт, к которому подключена систем¬
ная консоль. С другой стороны, если есть стандартные графические уст­
ройства ввода/вывода, хотелось бы, чтобы загрузчик использовал и их.
Поэтому все загрузчики имеют универсальный текстовый интерфейс (за¬
частую с довольно богатыми возможностями) и разнообразный графиче¬
ский (чаще в виде меню).
Особенная ситуация возникает в случае, когда на компьютере уста¬
новлено несколько операционных систем (например, если персональный
компьютер используется также и для компьютерных игр, строго п р и в я ­
занных к определенной системе). В этом случае н е стоит надеяться на
«универсальность» вторичного загрузчика: даже если о н способен разли¬
чать множество файловых систем и несколько форматов загрузки ядер, не¬
возможно знать их все. Однако если в загрузочном секторе раздела опера¬
ц и о н н о й системы записан первичный загрузчик, м о ж н о просто загрузить
его, к а к если бы это произошло непосредственно после работы MBR. Та¬
к и м образом, вторичный загрузчик может выступать в роли предзагрузчи-
ка, передавая управление «по цепочке» (chainloading). К сожалению, ч е м
д л и н н е е цепочка, тем в ы ш е вероятность ее порвать: м о ж н о , например,
загрузить по цепочке M S - D O S , удалить с его п о м о щ ь ю раздел Linux, со¬
державший вторичный загрузчик, а затем переразметить этот раздел, ч е м
и привести компьютер в неработоспособное состояние.

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

Досистемная загрузка Linux

Несмотря на то, что досистемная загрузка н е зависит от типа опера­


ц и о н н о й системы, которая начинает работу после, большинство систем
предоставляют собственные средства по ее организации. В Linux наиболее
популярны подсистемы загрузки L I L O (LInux LOader) и GRUB (GRand
Unified Bootloader). Обе эти подсистемы имеют текстовый и графический
варианты интерфейса, предоставляющего пользователю возможность вы¬
брать определенный заранее настроенный тип загрузки.

182
Лекция 10 Этапы загрузки системы

LILO

Подсистема загрузки L I L O использует и для первичного, и для вто­


ричного загрузчика схему с картой размещения. Это делает работу с L I L O
занятием, требующем п о в ы ш е н н о й аккуратности, так к а к изменение
процедуры загрузки не атомарно: сначала пользователь изменяет ядро
или его модули, потом — редактирует файл / e t c / l i l o . c o n f , в котором
содержатся сведения обо всех вариантах загрузки компьютера, а затем —
запускает команду l i l o , которая собирает таблицы размещения для всех
указанных ядер и вторичного загрузчика и записывает первичный и вто¬
р и ч н ы й загрузчик вместе с картами в указанное место диска. П е р в и ч н ы й
загрузчик L I L O (он называется L I ) м о ж н о записывать и в M B R , и в нача¬
ло раздела Linux.
Простейший файл l i l o . c o n f может выглядеть так:

boot=/dev/hda

map=/boot/map

image=/boot/vmlimiz-up

root=/dev/hda1

Пример 10.1. Простейшая настройка L I L O : пример файла lilo.conf

Такая настройка L I L O определяет только один вариант загрузки:


первичный загрузчик записывается в начало первого жесткого диска
(строчка b o o t = / d e v / h d a ) , карту размещения утилита l i l o записывает в
файл /boot/map, ядро добывается из файла / b o o t / v m l i n u z - u p , а за­
пись r o o t = / d e v / h d a 1 указывает ядру, что корневая файловая система
находится на первом разделе первого диска.
Одна и з м а ш и н , за которыми случалось работать М е ф о д и ю , исполь­
зовалась иногда для запуска единственной программы, н а п и с а н н о й для
M S - D O S . Исходные тексты этой программы давно потерялись, автор —
тоже, поэтому на м а ш и н е пришлось устанавливать и M S - D O S и Linux. В
результате l i l o . c o n f оказался таким:

[root@localhost root]# cat /etc/lilo.conf

boot=/dev/hda

map=/boot/map

default=linux-up

prompt

timeout=5 0

image=/boot/vmlinuz-up

label=linux-up

183
Курс Операционная система Linux

root=/dev/hda5

initrd=/boot/initrd-up.img

read-only

image=/boot/vmlinuz-up

label=failsafe

root=/dev/hda5

initrd=/boot/initrd-up.img

vga=normal

append=" f a i l s a f e noapic nolapic acpi=off"

read-only

other=/dev/hda1

label=dos

other=/dev/fd0

label=floppy

unsafe

Пример 10.2. Настройка L I L O на двухсистемной м а ш и н е

Здесь Linux была установлена на пятый раздел диска (о нумерации


разделов в IBM-совместимых компьютерах будет рассказано в л е к ц и и
11), а на первом находится M S - D O S . К р о м е загрузки M S - D O S предусмо¬
трено два варианта загрузки Linux и еще один — любой операционной си¬
стемы с дискеты. Каждый вариант загрузки помечен строкой l a b e l = ва -
риант. П р и старте L I L O выводит простейшее* о к о ш к о , в котором пере­
ч и с л е н ы все метки (в д а н н о м случае — «linux-up», «failsafe», «dos» и «flop-
py»). Пользователь с п о м о щ ь ю «стрелочек» выбирает н у ж н ы й ему вари­
ант и нажимает Enter. П р и необходимости пользователь может вручную
дописать несколько параметров, о н и передадутся ядру системы. Если
пользователь ничего н е трогает, то п о истечении тайм-аута выбирается
метка, указанная в поле d e f a u l t .
Е щ е несколько пояснений. Метки l i n u x - u p и f a i l s a f e в п р и м е ­
ре используют одно и то ж е ядро ( v m l i n u z - u p ) , н о во втором случае п е ­
ренастраивается режим графической карты и добавляются параметры, от­
ключающие поддержку необязательных для загрузки аппаратных расши¬
р е н и й (многопроцессорность, автоматическое управление электропита¬
н и е м и т. п.). Строчку, стоящую после append=, пользователь мог бы вве­
сти и самостоятельно, это и есть параметры ядра. П о л е i n i t r d = указыва­
ет, в каком файле находится стартовый виртуальный диск (ему п о с в я щ е н
раздел «Стартовый виртуальный д и с к и модули» этой лекции), а внушаю¬
щая некоторые опасения надпись «unsafe» (для метки f l o p p y ) означает

* Если установлен графический вариант интерфейса, то о к н о может быть сколь угодно


изукрашенное.

184
Лекция 10 Этапы загрузки системы

всего л и ш ь , что дискета — съемное устройство, поэтому бессмысленно во


время запуска l i l o проверять правильность ее загрузочного сектора и
составлять карту.
Н а к о н е ц , записи вида o t h e r = y c T p o i f c T B o говорят о том, что L I L O
неизвестен тип о п е р а ц и о н н о й системы, находящейся на этом устройстве,
а значит, загрузить ядро невозможно. Зато ожидается, что в первом секто­
ре устройства будет обнаружен еще один первичный загрузчик, L I L O за­
грузит его и передаст управление п о цепочке. Так и загружается M S - D O S
на этой м а ш и н е : первичный загрузчик берется (по метке d o s ) и з начала
первого раздела первого диска.

GRUB

Подсистема загрузки GRUB устроена более сложно. О н а также имеет


первичный загрузчик, который записывается в первый сектор диска и л и
раздела, и вторичный загрузчик, располагающийся в файловой системе.
Однако карта размещения в GRUB обычно используется только для т а к н а ­
зываемого «полуторного» загрузчика («stage 1.5») — п о сути дела, драйве¬
ра одной определенной файловой системы. Процедура загрузки п р и этом
выглядит так. П е р в и ч н ы й загрузчик загружает полуторный п о записан­
н о й в него карте размещения. Эта карта может быть очень простой, т а к
как обычно полуторный загрузчик размещается непосредственно после
первичного в нескольких секторах* подряд, или в и н о м специально отве¬
д е н н о м месте вне файловой системы. Полуторный загрузчик умеет рас¬
познавать одну файловую систему и находить там вторичный уже п о име­
ни ( о б ы ч н о / b o o t / g r u b / s t a g e 2 ) . Н а к о н е ц , в т о р и ч н ы й загрузчик,
пользуясь возможностями полуторного, читает из файла
/ b o o t / g r u b / m e n u . l s t м е н ю , в котором пользователь может выбирать
варианты загрузки так ж е , к а к и в LILO. Таким образом, обновление и пе¬
ренастройка установленного GRUB не требует пересчета карт р а з м е щ е н и я
и и з м е н е н и я чего-то, кроме файлов в каталоге / b o o t / g r u b .
П о требованию М е ф о д и я Гуревич установил на двухсистемную м а ­
ш и н у GRUB. П р и этом ф а й л / b o o t / g r u b / m e n u . l s t получился таким:

[root@localhost root]# c a t /boot/grub/menu.lst

default 0

t i m e o u t 50

title linux-up

kernel (hd0,4)/boot/vmlinuz-up root=/dev/hda5

initrd (hd0,4)/boot/initrd-up.img

* Т. е. н а н у л е в о й д о р о ж к е н у л е в о г о ц и л и н д р а , н а ч и н а я с с е к т о р а 2. Э т а о б л а с т ь д и с к а ч а ­
с т о н е и с п о л ь з у е т с я п о д ф а й л о в ы е с и с т е м ы ( с м . л е к ц и ю 11).

185
Курс Операционная система Linux

title failsafe

kernel (hd0,4)/boot/vmlinuz-up root=/dev/hda5 f a i l s a f e noapic nolapic

acpi=off

initrd (hd0,4)/boot/initrd-up.img

title floppy

root (fd0)

chainloader +1

title dos

root (hd0,0)

chai nloader +1

Пример 10.3. Настройка GRUB на двухсистемной м а ш и н е

Разница между l i l o . c o n f только в синтаксисе, да е щ е в т о м , что


жесткие д и с к и и разделы на н и х GRUB именует по-своему, в виде ( h d H o -
мер_диска ,номер_раздела), причем нумеровать начинает с нуля.
Метки («title») тоже нумеруются с нуля, так что запись d e f a u l t 0 озна­
чает, что п о истечении тайм-аута будет загружена самая первая конфигу­
р а ц и я (по имени «linux-up»).
Изучая руководство п о GRUB, М е ф о д и й обнаружил гораздо более
важное отличие от LILO. Оказывается, в GRUB н е только параметры, н о и
сами ф а й л ы (ядро, стартовый виртуальный д и с к и т. п.) распознаются и
загружаются в процессе работы. Вместо пунктов м е н ю м о ж н о выбрать
р е ж и м к о м а н д н о й строки, подозрительно похожий на bash, в котором
м о ж н о заставить G R U B загрузить какое-нибудь другое, н е предписанное
конфигурацией, я д р о , посмотреть содержимое каталогов файловой сис¬
темы, распознаваемой полуторным загрузчиком, и даже содержимое этих
ф а й л о в , невзирая н и на какие права доступа: система-то е щ е н е загруже­
на. М а л о того, м о ж н о по-своему перенастроить загрузчик и записать р е ­
зультаты настройки. Так и н е успев насладиться н е о ж и д а н н о й свободой,
М е ф о д и й в один прекрасный день обнаружил, что выход в командную
строку з а щ и щ е н паролем.

Действия ядра Linux в процессе начальной загрузки


Итак, досистемная загрузка проходит в три этапа.
1. Загрузчик и з П З У определяет, с каких устройств м о ж н о грузиться и,
возможно, предлагает пользователю выбрать одно и з них. Он загру¬
жает с выбранного устройства первичный загрузчик и передает ему
управление.
2. Первичный загрузчик определяет (а ч а щ е всего — знает), где находит­
ся вторичный загрузчик — большая и довольно интеллектуальная
программа. Ему это сделать проще, ч е м программе и з ПЗУ: в о - п е р -

186
Лекция 10 Этапы загрузки системы

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


а во-вторых, потому что его м о ж н о легко изменять при изменении
настроек загружаемой системы. В схеме, предлагаемой L I L O и GRUB,
первичный загрузчик не вступает в разговоры с пользователем, а не¬
медленно загружает вторичный и передает ему управление.
3. Вторичный загрузчик достаточно умен, чтобы знать, где находится
ядро системы (возможно, не одно), предложить пользователю не¬
сколько вариантов загрузки на выбор, и даже, в случае GRUB, разре¬
шает задавать собственные варианты загрузки. Его задача — загру¬
зить в память ядро и все необходимое для старта системы (иногда —
модули, иногда — стартовый виртуальный д и с к ) , настроить все это и
передать управление ядру.
Ядро — это и мозг, и сердце Linux. Все действия, которые нельзя д о ­
верить отдельной подзадаче (процессу) системы, выполняются ядром.
Доступом к оперативной памяти, сети, д и с к о в ы м и прочим в н е ш н и м ус­
тройствам заведует ядро. Ядро запускает и регистрирует процессы, управ­
ляет разделением времени между н и м и . Ядро реализует разграничение
прав и вообще определяет политику безопасности, обойти которую, не
обращаясь к нему, нельзя просто потому, что в Linux больше никто не пре­
доставляет подобных услуг.
Ядро работает в специальном режиме, так называемом «режиме су¬
первизора», позволяющем ему иметь доступ сразу ко всей оперативной
памяти и аппаратной таблице задач. Процессы запускаются в «режиме
пользователя»: каждый жестко привязан ядром к одной записи таблицы
задач, в которой, в числе прочих данных, указано, к какой и м е н н о части
оперативной памяти этот процесс имеет доступ. Ядро постоянно нахо­
дится в памяти, выполняя системные вызовы — запросы от процессов на
в ы п о л н е н и е этих подпрограмм.

ядро
Набор подпрограмм, используемых для организации доступа к
ресурсам компьютера, для обеспечения запуска и взаимодейст­
вия процессов, для проведения политики безопасности систе­
м ы и для других действий, которые могут выполняться только в
режиме полного доступа (т. н. «режиме супервизора»).

Ф у н к ц и и ядра после того, к а к ему передано управление, и до того,


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

187
Курс Операционная система Linux

ра — определить список внешних устройств, составляющих компьютер,


на котором о н о оказалось, классифицировать их (определить диски, тер¬
м и н а л ы , сетевые устройства и т. п.) и, если надо, настроить. П р и этом на
системную консоль (обычно первая виртуальная консоль Linux) выводят­
ся диагностические сообщения (впоследствии их м о ж н о просмотреть
утилитой dmesg).
Затем ядро запускает несколько процессов ядра. Процесс ядра — это
часть ядра Linux, зарегистрированная в таблице процессов. Такому п р о ­
цессу м о ж н о послать сигнал и вообще пользоваться средствами м е ж п р о ­
цессного взаимодействия, на него распространяется политика планиров­
щ и к а задач, однако н и к а к о й задаче в режиме пользователя о н н е соответ­
ствует — это просто е щ е одна ипостась ядра. Команда p s - e f показыва­
ет процессы ядра в квадратных скобках, кроме того, в Linux принято (но
н е обязательно), чтобы и м е н а таких п р о ц е с с о в н а ч и н а л и с ь н а «k»:
[ k s w a p d ] , [ k e v e n t d ] и т. п.
Далее ядро подключает (монтирует) корневую файловую систему в
соответствии с п е р е д а н н ы м и п а р а м е т р а м и (в н а ш и х п р и м е р а х —
r o o t = /dev/hda5). Подключение это происходит в режиме «только для
чтения» (read-only): если целостность файловой системы нарушена, д а н ­
н ы й режим позволит, н е усугубляя положения, прочитать и запустить
утилиту f s c k (file system check). Позже, в процессе загрузки, корневая
файловая система подключится на запись.
Н а к о н е ц , ядро запускает из файла / s b i n / i n i t первый настоящий
процесс. Идентификатор процесса (PID) у него равен единице, о н — пер¬
вый в таблице процессов, даже несмотря на то, что до него там были заре­
гистрированы процессы ядра. Процесс i n i t — очень старое изобретение,
он чуть л и н е старше самой истории U N I X , и с давних п о р его и д е н т и ф и ­
катор равен 1.

Загрузка системы

С запуска i n i t начинается загрузка самой системы. Во времена м о ­


лодости Linux и ранее в этом месте никаких подводных камней н е наблю­
далось. Если ядро содержало подпрограммы для работы со всеми необхо¬
д и м ы м и устройствами (так называемые «драйверы»), о н о загружалось и
запускало i n i t . Если ядру недоставало каких-то важных драйверов (на¬
пример, поддержки дискового массива, с которого и шла загрузка) — о н о
не загружалось и н е запускало. И з положения выходили просто: в ядро
старались включить к а к м о ж н о больше драйверов. Такое ядро называлось
базовым (generic) и имело довольно внушительный размер. Загрузив с и с ­
тему с базовым ядром, администратор обычно пересобирал его: выбрасы­
вал из специального ф а й л а - п р о ф и л я драйверы всех отсутствующих в с и -

188
Лекция 10 Этапы загрузки системы

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

Стартовый виртуальный диск и модули ядра

Пересборка ядра в н а ш е время требуется очень редко. Во-первых, в


Linux поддерживается несметное количество различных внешних уст¬
ройств, драйверы которых (особенно похожих, но разных) вполне могут
помешать друг другу работать, если их использовать одновременно. При¬
шлось бы собирать множество разных ядер, без возможности указать
пользователю, какое из них подходит для его компьютера. Во-вторых, в ы ­
я с н е н и е м того, какой и м е н н о драйвер необходим найденному устройству,
занимаются сейчас специальные программы, в распоряжении которых
есть целые базы данных — ядру такую работу выполнять неудобно, да и
незачем. Это делает процедуру пересборки ядра почти что обязательной
(пока не загружено базовое ядро, н е п о н я т н о , какие драйверы добавлять в
профильное). А в-третьих, пересборка ядра требует весьма высокой ква­
л и ф и к а ц и и . Этот процесс нельзя н и автоматизировать, н и упростить.
Утилита l i n u x c o n f , устроенная и м е н н о для этого на основе окон и ме­
н ю , дает на выходе работоспособное ядро в трех случаях: (1) в руках п р о ­
фессионала, (2) при четком следовании полной инструкции и (3) по слу­
чайности*.
Совсем другие времена настали, когда изобрели и активно внедрили
в Linux загружаемые модули ядра. Модуль ядра — это часть ядра Linux, к о ­
торую м о ж н о добавлять и удалять во время работы системы. Модуль ядра
— не процесс, он работает в р е ж и м е супервизора и в таблице процессов не
регистрируется: это набор подпрограмм для работы с определенным уст­
ройством, которые добавляются к возможностям ядра**. П р и загрузке в
память модуль компонуется с ядром, образуя с н и м одно целое. П р о с м о ­
треть список загруженных модулей м о ж н о командой l s m o d , а подгрузить
модуль в память, добавив его к ядру, и удалить его оттуда — командами
i n s m o d и rmmod соответственно.

# lsmod

Module Size Used by Not tainted

usb-uhci 21676 0 (unused)

usbcore 58464 1 [usb-uhci]

af_packet 123 92 1 (autoclean)

* Не н а д о вручную пересобирать я д р о , даже если в учебнике п о Linux рекомендуется э т о


сделать!
** Э т и м о н с к о р е е п о х о ж н а д и н а м и ч е с к у ю библиотеку.

189
Курс Операционная система Linux

pcnet32 15140 1 (autoclean)

mii 2544 0 (autoclean)

crc32 2880 0 (autoclean)

floppy 48568 0 (autoclean)

subfs 4296 4 (autoclean)

ac 1792 0

rtc 6236 0 (autoclean)

ext3 62288 2

jbd 37852 2 [ext3]

Пример 10.4. Получение списка загруженных модулей

Изменилось и базовое ядро: теперь о н о включает в себя только уст­


ройства, необходимые для загрузки системы: главным образом диски и
графическую консоль. Остальные устройства определятся уже самой сис¬
темой — тогда м о ж н о будет и распознать экзотическую аппаратуру, и мо¬
дуль для нее подгрузить. Однако полностью перевести драйверы всех
внешних устройств в модули мешает следующее соображение: ч т о , если
загрузка системы происходит именно с того устройства, чей модуль е щ е не
загружен в ядро, например, с дискового массива (RAID)? Вторичный за­
грузчик и ядро м о ж н о , недолго думая, разместить на другом носителе (на¬
пример, на лазерном диске) или добыть с дискового массива средствами
BIOS (карты размещения позволяют н е обращать в н и м а н и я на логичес­
кую структуру R A I D ) . Н о к а к добыть модуль работы с R A I D , тот самый,
что распознает эту логическую структуру?

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

Подсистема загрузки GRUB умеет разбираться в файловых системах и


даже подключать модули к ядру, однако для того, чтобы сделать процесс
загрузки более или менее универсальным, пришлось бы обучить GRUB
всем видам логики R A I D и всем способам подключения модулей. И то, и
другое постоянно изменяется, и успевать за этими и з м е н е н и я м и означает
поддерживать собственную, параллельную Linux, дисковую подсистему.
Вдумаемся. Д л я того чтобы средствами Linux подключить модуль яд¬
ра, работающий с д и с к о в ы м устройством, необходимо загрузить Linux с
этого ж е устройства. Так л и это невозможно? Ведь если м о ж н о прочесть
оттуда «ядро», то, наверное, м о ж н о прочесть и «Linux»? Более точно, вдо­
бавок к одной области данных, соответствующей ядру, надо прочитать

190
Лекция 10 Этапы загрузки системы

вторую, соответствующую некоторой уменьшенной д о предела установке


Linux, в которой содержатся только нужные программы и модули, загру­
зить оттуда «маленький Linux», который настроит и подключит злополуч­
н ы й R A I D и запустит процесс загрузки п о л н о ц е н н о й системы оттуда.
Предельно сжатый вариант Linux есть — это проект b u s y b o x , и с ­
пользуемый во встроенных системах, где дорог каждый байт. Разместить
файловую систему в памяти тоже легко — этим, например, занимается м о ­
дуль t m p f s , который м о ж н о включить в базовое ядро (подробнее о типах
файловых систем будет рассказано в л е к ц и и 11). Осталось только обучить
подсистемы загрузки GRUB и L I L O считывать н е одну, а две области д а н ­
ных — ядро и образ файловой системы. Ядру п р и этом передается пара­
метр «пользуйся виртуальным диском», чтобы о н о подключило загружен­
н ы й образ в качестве временной корневой файловой системы. М о ж н о
также потребовать, чтобы память, занимаемая временной файловой сис¬
темой, освобождалась в процессе дальнейшей загрузки.
Такой механизм называется i n i t r d (initial ram disk, где «ram» — это
не «баран», а random access memory, то есть оперативная память) и л и стар­
товым виртуальным диском. Стартовый виртуальный д и с к собирается по
команде m k i n i t r d в соответствии с п р о ф и л е м компьютера и записыва­
ется на д и с к п о тем ж е правилам, что и ядро. В примере двухсистемной
м а ш и н ы , за которой работал М е ф о д и й , также был стартовый виртуаль¬
н ы й диск, причем довольно маленький:

[root@localhost r o o t ] # l s - l g /boot

drwxr-xr-x 2 root 4096 Nov 20 21:08 g r u b

-rw 1 root 205374 Nov 9 01:33 i n i t r d - 2 . 4 . 2 6-std-up. img

lrwxrwxrwx 1 root 29 Nov 9 01:33 i n i t r d - u p . img ->

initrd-2.4.26-std-up.img

-rw 1 root 45056 Nov 20 19:07 map

-rw-r--r-- 1 root 935892 Aug 3 21:59 v m l i n u z - 2 . 4 . 2 6 - s t d - u p

lrwxrwxrwx 1 root 26 Nov 9 01:33 v m l i n u z - u p -> vmlinuz-2.4.26-std-up

Пример 10.5. Размеры и н а и м е н о в а н и е файлов с ядром и стартовым


виртуальным диском

К а к видно из примера, ядро в четыре раза превосходит п о размеру


стартовый виртуальный диск. Стоит заметить, что и ядро, и образ диска
упакованы с п о м о щ ь ю утилиты g z i p (причем ядро умеет распаковывать­
ся в памяти самостоятельно), поэтому их действительный размер — боль­
ше. В файле map хранится карта размещения L I L O , а упомянутые в
l i l o . c o n f и m e n u . l s t ф а й л ы v m l i n u z - u p и i n i t r d - u p . i m g оказа­
лись символьными ссылками на ф а й л ы с более «говорящими» именами.

191
Курс Операционная система Linux

Н и к а к и х требований к названиям ядер в Linux нет, это дело авторов д и с ­


трибутива. В этом случае в и м е н и ядра и образа диска встречается версия
ядра (2.4.26), т и п сборки s t d (по-видимому, «standard») и т и п архитекту­
р ы up (uniprocessor, т. е. однопроцессорная).

стартовый виртуальный диск


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

Отец всех процессов


Если в параметрах н е указано иное, ядро считает, что i n i t называ­
ется / s b i n / i n i t . В стартовом виртуальном диске это обычно некоторый
простейший сценарий, а в п о л н о ц е н н о й системе у i n i t другая задача: о н
запускает все процессы. Если процессы запускает н е о н сам, то это делают
его потомки, так ч т о все процессы Linux, к р о м е ядерных, происходят от
i n i t , к а к весь род людской — от Адама.
Первым делом i n i t разбирает собственный к о н ф и г у р а ц и о н н ы й
файл — / e t c / i n i t t a b . Ф а й л этот имеет довольно простую структуру:
каждая строка (если она н е комментарий) имеет вид «id:уровни: дей­
ствие :процесс», где id — это некоторая двух- или однобуквенная мет­
ка, уровни — это слово, каждая буква которого соответствует уровню вы­
полнения (об уровнях в ы п о л н е н и я будет рассказано далее), действие —
это способ запуска процесса. Например, запись
4 : 2 3 4 5 : r e s p a w n : / s b i n / m i n g e t t y t t y 4 означает, что меткой "4"
помечен запуск / s b i n / m i n g e t t y t t y 4 * на уровнях в ы п о л н е н и я 2, 3, 4
и 5 по алгоритму «respawn» (запустить в ф о н е , а когда процесс завершит­
ся, запустить заново). П о м и м о «respawn», существуют методы «once» (за¬
пустить в ф о н е однократно), «wait» (запустить интерактивно, п р и этом
никаких других действий н е выполняется, пока процесс н е завершится) и
множество других, включая даже «ctrlaltdel» — процесс, запускаемый, ког­
да пользователь нажимает на консоли Ctrl+Alt+Del.**
Н а к о н е ц - т о М е ф о д и й до конца понял, отчего g e t t y ведет себя так
непохоже н а остальные процессы: н е просто запускает и з - п о д себя
l o g i n , а дожидается о к о н ч а н и я его работы, отсутствуя при этом в таб­
л и ц е процессов. Н а самом деле дожидается н е g e t t y , а i n i t , используя
метод «respawn»: порождается (в фоне) процесс g e t t y с определенным

* M i n g e t t y - у п р о щ е н н ы й а н а л о г getty, р а б о т а ю щ и й т о л ь к о н а в и р т у а л ь н ы х к о н с о л я х .
** П о н я т н о , ч т о C t r l + A l t + D e l — э т о н е r e s e t , а о б ы ч н о е с о ч е т а н и е к л а в и ш . Д л я удоб­
ства п о л ь з о в а т е л я его с п е ц и а л ь н о р а с п о з н а е т к л а в и а т у р н ы й д р а й в е р , а я д р о с о о б щ а е т об
этом i n i t - y .

192
Лекция 10 Этапы загрузки системы

PID, а i n i t бездействует до тех пор, пока существует процесс с этим P I D :


g e t t y , l o g i n , стартовый командный интерпретатор или программа, запу­
щ е н н а я из него с п о м о щ ь ю e x e c ( ) ; когда же процесс, наконец, умирает,
порождается н о в ы й g e t t y .

Запуск системных служб

П о л н о ц е н н о загруженная Linux-система — не только l o g i n на в и р ­


туальной консоли. Системе есть чем заняться и п о м и м о идентификации
пользователей. Даже если компьютер не работает W W W - , F T P - или поч­
товым сервером для «внешнего мира», себе самой и своим пользователям
система предоставляет множество услуг: отсылка заданий на печать и
обеспечение их очереди, запуск заданий по расписанию, проверка цело¬
стности и т. п. Набор утилит и системных программ, предназначенных
для предоставления таких услуг, принято называть подсистемами или
службами.

Чему служат демоны?

К а к правило, системная служба организована так. Во время началь­


н о й загрузки запускается в ф о н о в о м режиме программа, которая на п р о ­
тяжении работы системы находится в таблице процессов, однако боль­
шей частью бездействует, ожидая, когда ее о чем-нибудь попросят. Для
того чтобы попросить эту программу об услуге, которую она предостав¬
ляет, используются утилиты, взаимодействующие с ней по специальному
протоколу. П о аналогии с сократовским «даймонионом», который незри¬
мо присутствует, по своей инициативе не делает ничего, не дает совер¬
шать плохое и способствует хорошему, такую программу стали назы¬
вать «daemon». Н е знакомые с творчеством Платона программисты-лю¬
бители частенько переименовывали ее в «demon» (демон); к сожалению,
и м е н н о в такой, слегка и н ф е р н а л ь н о й форме, daemon и вошел в русско¬
язычную терминологию. Выходит, что в Linux услуги пользователям пре­
доставляют... демоны!

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

В ранних версиях U N I X все, что нужно было запускать при старте


системы, вписывалось в i n i t a b . Было довольно удобно в одном файле

193
Курс Операционная система Linux

указывать, какие и м е н н о демоны д о л ж н ы работать в системе, и в каком


порядке их запускать. Само поведение демона при запуске я в н о рассчита­
н о на использование в i n i t t a b п о методу «wait»: классический д е м о н за­
пускается интерактивно, п р о в е р я я правильность к о н ф и г у р а ц и о н н ы х
ф а й л о в и прочие условия работы, а затем самостоятельно уходит в фон
(попросту делая f o r k ( ) и завершая родительский процесс). Таким обра¬
зом, i n i t ждет, пока демон работает интерактивно, а когда служба, воз¬
главляемая этим д е м о н о м , готова к работе, переходит к следующей стро­
ке i n i t t a b . Однако часто бывает так, что автор демона знать н е знает,
к а к и е и м е н н о условия разработчики той или и н о й версии Linux сочтут
пригодными для запуска. Д л я этого и м и создается стартовый сценарий, в
котором запрограммирована логика запуска и останова службы. К р о м е
того, если на каждом из уровней в ы п о л н е н и я запускается много различ­
ных служб, попытка записывать их запуск в i n i t t a b делает его громозд¬
к и м и совсем неочевидным.
Гуревич посоветовал М е ф о д и ю отложить на время изучение загрузки
системы, а сначала посмотреть, к а к управлять стартовыми сценариями.

Стартовый сценарий системной службы

Стартовый сценарий — программа (обычно н а п и с а н н а я на shell), уп­


равляющая включением или выключением какого-нибудь свойства с и с ­
темы. Это может быть запуск и остановка HTTP-сервера, активизация и
деактивизация сетевых настроек, загрузка модулей и настройка звуковой
подсистемы и т. п. П р о с т е й ш и й стартовый сценарий обязан п р и н и м а т ь
один параметр, значение которого может быть словом «start» для запуска
(включения) и «stop» для остановки (выключения). Если в определенном
дистрибутиве Linux п р и н я т о р е ш е н и е , что стартовые сценарии д о л ж н ы
понимать и другие параметры, н а п р и м е р «restart» (обычно «stop»+«start»,
н о н е всегда) и «status» (для опроса состояния), это требование распрост­
раняется на все стартовые сценарии. Единообразие позволяет, н а п р и м е р ,
без труда запускать и останавливать д е м о н ы , н е в ы я с н я я , каков P I D оста¬
навливаемого процесса и какой именно сигнал ему следует послать. Доста¬
точно запуск написать так, чтобы P I D процесса откладывался в специаль­
н ы й ф а й л (обычно /var/run/имя_службы), а в остановку вписать ч т о -
то вроде k i l l -правильный_сигнал " c a t /var/run^MH_a7ry;sf6bz \
Все стартовые сценарии служб, которыми может воспользоваться
система, п р и н я т о хранить в каталоге / e t c / r c . d / i n i t . d (в некоторых
дистрибутивах, для совместимости со старыми версиями U N I X , исполь­
зуется / e t c / i n i t . d , и н о г д а это п р о с т о с и м в о л ь н а я с с ы л к а н а
/ e t c / r c . d / i n i t . d ) . Запустить или остановить службу м о ж н о , просто
вызвав соответствующий сценарий с параметром «start» или «stop». Часто

194
Лекция 10 Этапы загрузки системы

ту ж е самую задачу выполняет и специальная команда s e r v i c e , которая


проверяет, есть л и указанный стартовый сценарий, и запускает его*:

[root@localhost r o o t ] # lsmod > o l d

[root@localhost root]# /etc/red/init.d/sound stop

S a v i n g OSS m i x e r s e t t i n g s : [ DONE ]

Unloading sound module ( e s 1 3 7 1 ) : [ DONE ]

[root@localhost r o o t ] # lsmod > nosound

[root@localhost root]# s e r v i c e sound start

Loading sound module ( e s 1 3 7 1 ) : [ DONE ]

L o a d i n g OSS m i x e r s e t t i n g s : [ DONE ]

[root@localhost r o o t ] # lsmod > new

[root@localhost root]# d i f f 3 o l d new nosound

1:2,5c

2:2,5c

es1371 25608 0

ac97_codec 11880 0 [es1371]

soundcore 3652 4 [es1371]

gameport 1628 0 [es1371]

3:1a

Пример 10.6. Перезапуск звуковой подсистемы

Здесь М е ф о д и й сначала остановил, а потом снова активизировал


звуковую подсистему. Остановка привела к выгрузке звуковых модулей, а
повторный запуск — к загрузке, полностью аналогичной исходной. В этом
М е ф о д и й убедился, сравнив с п о м о щ ь ю утилиты d i f f 3 три списка мо¬
дулей: o l d (до остановки звуковой подсистемы), new (после повторного
запуска) и n o s o u n d (между остановкой и повторным запуском). Ф а й л ы
o l d и new одинаковы, а от n o s o u n d оба отличаются тем, что со второй
строки п о пятую содержат названия тех самых модулей ядра (в том числе
g a m e p o r t , отвечающий за джойстик).

Схема «.d»

Итак, существует способ единообразно и гибко управлять запуском


и остановкой каждой системной службы в отдельности (или включением
и выключением одного свойства системы). Однако задача целиком орга¬
низовать загрузку системы, от запуска i n i t д о п о л н о ц е н н о й работы,
* В некоторых дистрибутивах Linux такая команда может называться i n v o k e - r c . d , а
к о м а н д а , а н а л о г и ч н а я о п и с а н н о м у н и ж е c h k c o n f i g — u p d a t e - r c . d.

195
Курс Операционная система Linux

этим еще не исчерпывается. Первая из возникающих задач такова: чаще


всего нужно загружать не все из размещенных в / e t c / r c . d / i n i t . d сце¬
нариев, потому что некоторые из установленных в системе служб адми¬
нистратор р е ш и л не использовать. Удалять оттуда не используемые при
загрузке сценарии — значит, лишать администратора возможности запус¬
кать эти сценарии вручную.
Создателям ранних версий U N I X п р и ш л а в голову простая мысль:
написать один большой сценарий по имени / e t c / r c , в который и зано­
сить только нужные для запуска команды вида / e t c / i n i t . d / сценарий
s t a r t . М о ж н о даже занести туда все имеющиеся стартовые сценарии, но
строки, запускающие те, что не используются, закомментировать. Такая
(монолитная) схема имела существенный недостаток: добавление и уда¬
л е н и е службы в систему (например, добавление и удаление пакета, содер¬
жащего исполняемые ф а й л ы службы) требовало редактирования этого
файла. Если учесть, что порядок запуска служб весьма важен (например,
бессмысленно запускать сетевые д е м о н ы до активизации сетевых настро¬
ек), становится я с н о , что автоматическое изменение такого файла не мо¬
жет гарантировать нормальную загрузку системы, а значит, недопустимо.
На п о м о щ ь пришла тактика, известная к а к «схема .d». Суть ее в сле­
дующем. Пусть некоторый процесс управляется к о н ф и г у р а ц и о н н ы м
файлом, содержимое которого зависит от наличия и активации других
служб системы (таким процессом может быть демон централизованной
журнализации s y s l o g d , ведущий журнал всех событий системы, или се¬
тевой метадемон i n e t d , п р и н и м а ю щ и й сетевые запросы и превращаю¬
щ и й сетевой поток данных в о б ы к н о в е н н ы й посимвольный ввод-вывод).
Тогда, чтобы избежать постоянного редактирования конфигурационного
ф а й л а , его п р е в р а щ а ю т в каталог ( н а п р и м е р , вдобавок к ф а й л у
/ e t c / s y s l o g . c o n f заводится каталог / e t c / s y s l o g . d ) . Каждый файл
в таком каталоге соответствует настройке одной службы: при добавлении
ее в систему файл появляется, при удалении — исчезает. Остается только
обучить тот ж е s y s l o g читать н а с т р о й к и н е т о л ь к о из одного
s y s l o g . c o n f , но и из всех файлов в s y s l o g . d , и задача решена.
На случай запускаемых сценариев схема «.d» распространяется с
двумя дополнениями. Во-первых, как уже было сказано, стартовые сце­
нарии м о ж н о запускать, а м о ж н о и не запускать. Поэтому сам i n i t . d на
роль <<^»-каталога не годится. Впрочем, достаточно организовать еще
один каталог, скажем, r e d , и создать там ссылки (длянаглядности лучше
символьные) на те сценарии из i n i t . d , которые планируется запускать
при старте системы. О б щ и й стартовый сценарий r c как раз и будет зани¬
маться запуском стартовых сценариев из r e d .
Во-вторых, необходимо обеспечить строгий порядок запуска этих
сценариев. Теоретически это совсем просто: отсортировать их по алфави-

196
Лекция 10 Этапы загрузки системы

ту, как это далает ls, и запускать подряд. Практически ж е такое требование
накладывает ограничение на и м я ссылки в <<^»-каталоге, поэтому п р и ­
нято, чтобы в начале имени стояло двузначное число. Тогда, запуская под­
ряд все сценарии, отсортированные по алфавиту, r c будет в первую оче­
редь руководствоваться этим номером, а уж потом — названием службы,
которое после него стоит.

Уровни выполнения

В Linux схема начальной загрузки слегка сложнее, чем обычная «.d».


Связано это с тем, что одну и ту ж е систему в разных случаях бывает не¬
обходимо загружать с р а з н ы м набором служб. Если, скажем, использова¬
н и е сети нежелательно, удобнее сказать что-то вреде «Система! Загружай­
ся без сети!», чем вручную удалять стартовые сценарии всех предположи­
тельно сетевых служб из <<^»-каталога. Необходимость выбора также
возникает, если компьютер используется в качестве рабочей станции с за­
пуском графической среды и всего с н е ю связанного или в качестве сто­
ечного сервера, управлять которым лучше с системной консоли.
Поэтому в Linux предусмотрено несколько вариантов начальной за¬
грузки, называемых уровнями выполнения (run levels). Уровни выполнения
нумеруются с 0 до 9:
• Уровень 1 соответствует однопользовательскому режиму загрузки с и ­
стемы. П р и загрузке на уровень 1 не запускается никаких служб, и
даже системная консоль, как правило, бывает доступна только одна,
так что в системе может работать не более одного пользователя. В од¬
нопользовательском режиме изредка работает администратор — ис¬
правляет неполадки системы, изменяет ключевые настройки, обслу¬
живает файловые системы.
• Уровень 2 соответствует многопользовательскому режиму загрузки
системы с отключенной сетью. В этом режиме не запускаются ника¬
кие сетевые службы, что, с одной стороны, соответствует строгим
требованиям безопасности, а с другой стороны, позволяет запускать
службы и настраивать сеть вручную.
• Уровень 3 соответствует многопользовательскому сетевому режиму за¬
грузки системы. Сеть при загрузке на этот уровень настроена, и все
необходимые сетевые службы запущены. На этом уровне обычно ра¬
ботают компьютеры-серверы.
• Уровень 5 соответствует многопользовательскому графическому режи¬
му загрузки системы. Н а этом уровне обычно функционируют рабо¬
ч и е станции, предоставляя пользователям возможность работать с
графической подсистемой X11. Сеть на этом уровне настроена, а вот
список запущенных сетевых служб может быть меньше, так как ра-

197
Курс Операционная система Linux

бочая станция не всегда выполняет серверные ф у н к ц и и (хотя, безус­


ловно, может).
• Уровни 0 и 6 — специальные. О н и соответствуют останову и переза­
грузке системы. В сущности, это удобные упрощения для действий,
обратных загрузке на уровень: все службы останавливаются, диски
размонтируются. В случае останова даже электропитание м о ж н о от­
ключать программно, если аппаратура позволяет, а в случае переза¬
грузки система идет на повторную загрузку.
Остальные уровни н и к а к специально в Linux не описаны, однако ад­
министратор может использовать и их, определяя особый профиль рабо­
ты системы. Переход с уровня на уровень выполняется очень просто: по
команде i n i t номер_уровня. На какой уровень загружаться при старте
системы, написано в i n i t t a b (в поле действия должно быть написано
«initdefault», а в поле уровни — только одна цифра). Узнать текущий уро­
вень в ы п о л н е н и я м о ж н о с п о м о щ ь ю команды r u n l e v e l :

[root@localhost root]# grep i n i t d e f a u l t /etc/inittab

id:3:initdefault:

[root@localhost root]# r u n l e v e l

N 3

Пример 10.7. Задание и просмотр уровня в ы п о л н е н и я

уровень выполнения
Сохраненный профиль загрузки системы. В Linux реализован
выполнением всех сценариев остановки и запуска служб из
подкаталога гсуровеньЛ каталога / e t c или / e t c / r e d

Схема «. d» легко учитывает у р о в н и в ы п о л н е н и я . В каталоге


/ e t c / r e d * заводится несколько <<^»-подкаталогов, соответствующих
каждому уровню выполнения: /etc/rc.d/гсуровень .d. И м е н н о отту­
да их запускает стартовый сценарий / e t c / r c . d / r c :

[root@localhost r o o t ] # l s -F /etc/red

init.d/ r c . p o w e r f a i l * rc0.d/ rc2.d/ rc4.d/ rc6.d/

rc* rc.sysinit* rc1.d/ rc3.d/ rc5.d/ scripts/

[root@localhost root]# l s /etc/rc2.d

K10power K75netfs S15random S31klogd S37gpm S54sshd

K 4 4 r a w d e v i c e s K95kudzu S30sound S32hotplug S40crond S98splash

K50xinetd S10network S30syslogd S35keytable S41anacron S99local

[root@localhost root]# l s - l /etc/rc2.d/ K75netfs

* В н е к о т о р ы х д и с т р и б у т и в а х — в каталоге / e t c / .

198
Лекция 10 Этапы загрузки системы

lrwxrwxrwx 1 r o o t r o o t 15 Nov 9 01:16 /etc/rc2.d/K75netfs ->

../init.d/netfs

Пример 10.8. Содержимое каталогов / e t c / r e d и


/etc/rc.d/rc2.d

Переход с уровня на уровень должен сопровождаться не только запу­


ском, но и остановкой служб. Это касается не только уровней 0 и 6, но и
любых других. Н а п р и м е р , при переходе с уровня 3 на уровень 2 необхо­
д и м о остановить все сетевые службы. Поэтому схема «.d» была р а с ш и р е ­
на: сначала с параметром «stop» запускаются сценарии, имена которых
начинаются на «K» (Kill), а затем, с параметром «start» — те, имена кото­
рых начинаются на «S» (Start). В приведенном примере при переходе на
уровень 2 останавливается несколько служб, в том числе сетевой метаде-
м о н ( K 5 0 x i n e t d ) и монтирование по сети удаленных файловых систем
(K7 5 n e t f s ) . Если при переходе с уровня на уровень некой службе не тре­
буется менять своего состояния, сценарий не запускается вовсе. Так, при
переходе с уровня 3 на уровень 2 сетевые настройки остаются активными,
поэтому соответствующий сценарий ( S l O n e t w o r k ) , скорее всего, запу­
щ е н не будет.
Долгое время считалось, что определение порядка загрузки — дело
системного администратора, поэтому расставлять символьные ссылки в
каталогах r c * . d приходилось вручную. Однако одно из другого не следу­
ет: м о ж н о предусмотреть и более простой способ наполнения этих ката¬
логов ссылками. Один и з способов такой: поставить в стартовый сцена¬
р и й комментарий особого вида, в котором описать, на каких уровнях
служба должна быть активизирована, и какой по порядку должна быть за¬
пущена и остановлена:

[root@localhost root]# grep c h k c o n f i g /etc/init.d/netfs

# c h k c o n f i g : 345 25 75

[root@localhost root]# chkconfig - - l i s t netfs

netfs 0:off 1:off 2:off 3:on 4:on 5:on 6:off

[root@localhost root]# l s/etc/rc.d/rc*.d/*netfs

/etc/rc.d/rc0.d/K75netfs /etc/rc.d/rc3.d/S25netfs

/etc/rc.d/rc6.d/K75netfs

/etc/rc.d/rc1.d/K75netfs /etc/rc.d/rc4.d/S25netfs

/etc/rc.d/rc2.d/K75netfs /etc/rc.d/rc5.d/S25netfs

Пример 10.9. Управление порядком выполнения стартовых сценариев


Здесь М е ф о д и й использовал утилиту c h k c o n f i g , которая ищет в
стартовом сценарии комментарий вида c h k c o n f i g : уровни вкл выкл,

199
Курс Операционная система Linux

и самостоятельно проставляет ссылки в соответствии с э т и м и полями: во


всех каталогах, упомянутых в уровнях соответствующий n e t f s сцена­
р и й имеет вид S B X T i n e t f s , а во всех остальных — K B b i x T m e t f s . Эта ж е
утилита позволяет добавлять и удалять службу на каждом уровне в отдель­
ности или запрещать ее вовсе.

Загрузка типичной системы на уровень выполнения 5

Итак, что ж е происходит после запуска i n i t ?

[root@localhost root]# grep r c /etc/inittab

si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0

l1:1:wait:/etc/rc.d/rc 1

l2:2:wait:/etc/rc.d/rc 2

l3:3:wait:/etc/rc.d/rc 3

l4:4:wait:/etc/rc.d/rc 4

l5:5:wait:/etc/rc.d/rc 5

l6:6:wait:/etc/rc.d/rc 6

[root@localhost root]# grep i n i t d e f a u l t /etc/inittab

id:5: i n i t d e f a u l t :

Пример 10.10. Стартовые сценарии в / e t c / i n i t t a b

Метод «sysinit» в i n i t t a b означает, что процесс запускается во вре­


мя начальной загрузки системы, до перехода на какой-нибудь уровень
выполнения. Следовательно, первым запускается сценарий
/ e t c / r c . d / r c . s y s i n i t . О н настраивает аппаратуру дисковых масси­
вов, проверяет и монтирует д и с к о в ы е файловые системы, инициализиру¬
ет область подкачки, межсетевой экран — словом, делает все, без чего
дальнейшая п о л н о ц е н н а я загрузка системы невозможна. Далее из строч­
к и с «initdefault» i n i t узнает, что уровень в ы п о л н е н и я п о умолчанию —
пятый (многопользовательский графический), и выполняет все строки из
i n i t t a b , в поле уровни которых есть 5. В частности, запускается сцена­
р и й r c с параметром 5 ( l 5 : 5 : w a i t : / e t c / r c . d / r c 5), который и в ы ­
полняет необходимые действия из <<^»-каталога / e t c / r c . d / r c 5 . d .
Метод запуска r c — «wait», так что i n i t ждет, пока н е выполнятся все
стартовые сценарии, а потом продолжает разбор i n i t t a b :

[root@localhost root]# l s /etc/rc.d/rc5.d/

K10acpid S10network S30syslogd S37gpm S50xinetd

K20nfs S13portmap S31klogd S40crond S54sshd

200
Лекция 10 Этапы загрузки системы

K65apmd S15random S32hotplug S41anacron S56rawdevices

K86nfslock S25netfs S35keytable S44xfs S64power

S05kudzu S30sound S3 6update_wms S45dm S98splash

Пример 10.11. П р о ф и л ь системы на уровне выполнения 5

Мефодий заметил, что сценарий K2 0 n f s (с параметром «stop») не


выполнился: соответствующего сообщения на системной консоли н е п о ­
явилось. Беглый просмотр / e t c / r c . d / i n i t . d / n f s показал, что этот
сценарий предназначен для запуска и остановки сервера сетевой файловой
системы (NFS). Сервер используется на уровне 3, а на уровне 5 — нет, п о ­
этому при переходе с 3 на 5 его следует останавливать. Поскольку во время
начальной загрузки останавливать нечего, сценарий н е выполнился.
И з служб, запускаемых и м е н н о на пятом уровне, примечателен
ш р и ф т о в ы й сервер, под номером 44 (the Xfont server, x f s ) — программа,
у которой графическая подсистема получает ш р и ф т ы (нередко п о сети;
тогда такой сервер может быть один на несколько рабочих станций), и эк­
ранный диспетчер*, под номером 45 (the X display manager, xdm) — п р о ­
грамма, регистрирующая пользователя на манер l o g i n , с той разницей,
что регистрация и запуск графических приложений могут происходить по
сети с удаленного компьютера. Тут разрешилась еще одна загадка: вместо
обычной виртуальной консоли и l o g i n , М е ф о д и й нередко наблюдал ок¬
но графической подсистемы с надписью «Login:» и «Password:», а кое-где
даже «Логин:», «Пароль» и портрет самого пользователя! Оказывается,
это были различные версии xdm. Дабы н е забивать себе голову разрознен­
н ы м и сведениями, М е ф о д и й решил до поры (до л е к ц и и 15) н е использо­
вать графическую среду и нажал C t r l + A l t + F 1 , переключившись в текс¬
товую консоль.
Текстовая к о н с о л ь н а п я т о м у р о в н е доступна: з а п и с и вида
1 : 2 3 4 5 : r e s p a w n : / s b i n / m i n g e t t y t t y 1 обычно включают 5 в поле
уровни.

Останов системы
К а к уже говорилось, операция, обратная загрузке системы — останов
— устроена в Linux как специальный уровень выполнения: 0 — если требу­
ется выключить систему, и 6 — если требуется перезагрузка. Соответству­
ю щ и е каталоги r c 0 . d и r c 6 . d будут состоять почти сплошь из ссылок
вида K*, н о к а к м и н и м у м один сценарий, k i l l a l l , будет запущен с п а ­
раметром «start». Этот сценарий остановит все процессы, которые н е бы­
ли остановлены K-сценариями: программы пользователей, демоны, запу¬
щ е н н ы е администратором вручную, и т. п.
* Н е п у т а т ь с диспетчером окон, о п и с а н н ы м в л е к ц и и 15.

201
Курс Операционная система Linux

Нечего и говорить, что отключение электропитания в разгар работы


системы — операция очень рискованная. Даже в самом удачном случае
при повторной загрузке r c . s y s i n i t увидит, что файловые системы не
были размонтированы, и станет проверять их целостность. В не самом
удачном случае эта целостность будет нарушена: некоторые открытые на
запись и не закрытые ф а й л ы окажутся в странном, недописанном состо­
я н и и , появятся индексные дескрипторы, не связанные н и с каким ката­
логом и т. п. К а к правило, такие о ш и б к и исправляются программой вос­
становления файловых систем f s c k : с одной стороны, за счет д о п о л н и ­
тельных свойств файловой системы (журнализация, сводящая вероят­
ность порчи к минимуму, логически упорядоченная запись и т. п.), с дру¬
гой — за счет некоторых предположений, которые делает сама утилита
f s c k . Однако надеяться на нее нельзя: очень редко, но бывают неразре­
ш и м ы е противоречия в л и ш е н н о й цельности файловой системе, и тогда
f s c k обращается за п о м о щ ь ю к администратору, требуя подтверждения
действий (например, для удаления испорченного файла, который точно
р а н ь ш е был), или в ы п о л н я я эти р и с к о в а н н ы е действия автоматически. В
первом случае все время взаимодействия с администратором система бу­
дет работать в однопользовательском режиме, причем администратору
предстоит разбираться с тем, что получилось; а во втором есть нешуточ­
ная вероятность того, что система испортится, а замечено это будет слиш¬
ком поздно.
Останов системы может занимать больше времени, чем загрузка: н а ­
пример, процессы, в ы п о л н я ю щ и е системный вызов (скажем, чтения с
дискеты), не завершаются по сигналу TERM сразу, а получив его, могут н е ­
которое время заниматься обработкой (дописыванием в файл и т. п.). Ос­
тановка службы, особенно сетевой, тоже может длиться долго: например,
когда требуется сообщить о закрытии сервиса каждому клиенту. Однако
только в этом случае м о ж н о быть уверенным, что все процессы заверши¬
лись нормально, и что после перезагрузки они продолжат нормально ра¬
ботать.
В экстренных случаях (например, когда при сбое электропитания
демон, обслуживающий устройство бесперебойного снабжения, сообща¬
ет, что ресурсы на исходе) безопаснее все-таки быстро поостанавливать
процессы, чем дожидаться отключения питания на работающей системе.
Для этого м о ж н о послать всем процессам сначала TERM, а короткое вре­
мя спустя — K I L L . Для обработки таких ситуаций в i n i t t a b есть методы,
начинающиеся со слова «power», а в / e t c / r e d — специальный сцена­
р и й r c . p o w e r f a i l . На самый к р а й н и й случай существуют команды
h a l t и r e b o o t с ключом - f , однако их почти мгновенное действие прак­
тически эквивалентно внезапному отключению питания, и использовать
их не рекомендуется.

202
Лекция 10 Этапы загрузки системы

Для останова или перезагрузки системы м о ж н о выполнять команды


i n i t 0 и i n i t 6. О н и вполне справятся с оповещением и остановкой
активных программ, что займет минуту-две. А вот с пользователями, рабо­
т а ю щ и м и в системе, все сложнее. К а к правило, для завершения работы
требуется хотя бы минут пять, а лучше — десять. Поэтому вежливые адми­
нистраторы пользуются утилитой s h u t d o w n , которая запускается за н е ­
сколько минут до времени перезагрузки, каждую минуту предупреждая
пользователей о грядущем событии, после чего уже запускают i n i t :

[root@localhost root]# shutdown - r +3 " S o r r y , we need t o r e b o o t "

Broadcast message f r o m r o o t (ttyS0) (Sun Nov 28 14:05:41 2004):

Sorry, we need t o r e b o o t

The s y s t e m i s g o i n g DOWN t o m a i n t e n a n c e mode i n 3 m i n u t e s !

Broadcast message f r o m r o o t (ttyS0) (Sun Nov 28 14:06:41 2004):

Sorry, we need t o r e b o o t

The s y s t e m i s g o i n g DOWN t o m a i n t e n a n c e mode i n 2 m i n u t e s !

Broadcast message f r o m r o o t (ttyS0) (Sun Nov 28 14:07:41 2004):

Sorry, we need t o r e b o o t

The s y s t e m i s g o i n g DOWN t o m a i n t e n a n c e mode i n 1 m i n u t e !

Broadcast message f r o m r o o t (ttyS0) (Sun Nov 28 14:08:41 2004):

Sorry, we need t o r e b o o t

The s y s t e m i s g o i n g down t o m a i n t e n a n c e mode NOW!

INIT: Switching to runlevel: 6

Пример 10.12. Использование s h u t d o w n

Остается заметить, ч т о у s h u t d o w n есть обязательный параметр —


время начала останова (в примере о н равен " + 3", то есть «через три м и ­
нуты»), и необязательный — " - r " (reboot, перезагрузка) и л и " - h " (halt,
останов). Б е з необязательных параметров выполняется переход н а п е р ­
вый уровень в ы п о л н е н и я , причем запускается стартовый командный ин­
терпретатор суперпользователя, а после его завершения система вновь п е ­
реходит на уровень выполнения п о умолчанию (используется, например,
для профилактических действий в системе). Нажатие Ctrl+Alt+Del или
к н о п к и выключения питания (в системах, где эта к н о п к а ничего н е вы¬
ключает, а л и ш ь посылает соответствующий аппаратный сигнал) приво¬
дит к запуску и м е н н о s h u t d o w n - r или s h u t d o w n -h.

203
Курс Операционная система Linux

Лекция 11. Работа с внешними устройствами

Последняя из лекций, посвященных файловым системам и способам


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

Ключевые слова: fifo, атрибут файла, виртуальная память, виртуальная


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

Представление устройства в системе


В л е к ц и и 10 говорилось о том, что аппаратный профиль компьютера
определяется ядром на ранних этапах загрузки системы и л и в процессе
подключения модуля. Это н е означает, что устройство, н е распознанное
ядром, задействовать невозможно. Если неизвестным ядру устройством
м о ж н о управлять п о какому-нибудь стандартному протоколу, вполне воз­
м о ж н о , что среди пакетов Linux найдется утилита или служба, способная
с этим устройством работать. Н а п р и м е р , программа записи на лазерный
д и с к c d r e c o r d знает великое множество разнообразных устройств, отве­
ч а ю щ и х стандарту SCSI, в то время как ядро, как правило, только позво­
ляет работать с таким устройством как с о б ы ч н ы м лазерным приводом (на
чтение) и передавать ему различные SCSI-команды.
К сожалению, иногда обратное неверно: если производитель создает
новое устройство, управлять которым нужно по-новому, а распознается
оно как одно из старых, о ш и б к и неизбежны. М н о г и е стандарты внешних
устройств предусматривают строгую и д е н т и ф и к а ц и ю модели, однако хо¬
рошего мало и тут: незначительно изменив схемотехнику, производитель
меняет и идентификатор, и устройство перестает распознаваться д о тех
пор, пока автор соответствующего модуля Linux н е заметит этого и не до¬
бавит н о в ы й идентификатор в список поддерживаемых.

204
Лекция 11 Работа с внешними устройствами

Большинству распознанных устройств, если они д о л ж н ы поддержи¬


вать операции ч т е н и я / з а п и с и или хотя бы управления ( i o c t l ( ) , о п и с а н ­
н ы й ниже), соответствует файл-дырка в каталоге / d e v или одном из его
подкаталогов. В зависимости от того, выбрана ли в системе статическая
или динамическая схема именования устройств, файлов-дырок в / d e v мо¬
жет быть и очень много, и относительно мало. П р и статической схеме
именования то, что ядро распознало внешнее устройство, н и к а к не соот­
носится с тем, что в / d e v имеется для этого устройства файл-дырка:

[root@localhost root]# c a t /dev/sdg14

cat: /dev/sdg14: No such d e v i c e or address

Пример 11.1. Обращение к несуществующему устройству

Здесь М е ф о д и й п о п ы т а л с я п р о ч и т а т ь ч т о - л и б о из устройства
/ d e v / s d g 1 4 , что соответствует четырнадцатому разделу SCSI-диска под
номером 7. Такого диска в этой м а ш и н е , конечно, нет, а файл-дырка для
него заведен на всякий случай: вдруг появится? Поскольку появиться м о ­
жет любое из поддерживаемых Linux устройств, таких файлов «на всякий
случай» в системе бывает и десять тысяч, и двадцать. Файл-дырка не за¬
нимает места на диске, однако использует индексный дескриптор, поэтому
в корневой файловой системе, независимо от ее объема, должен быть и з ­
р я д н ы й запас индексных дескрипторов.
П р и динамической схеме именования применяется специальная
виртуальная файловая система, которая либо полностью подменяет ката­
лог /dev, либо располагается в другом каталоге (например, / s y s ) , и м е ю ­
щ е м непохожую на / d e v иерархическую структуру; в этом случае ф а й л ы -
д ы р к и в / d e v заводит специальная служба. Этот способ гораздо удобнее
и для человека, который запустил команду l s /dev, и для компьютера (в
случае подключения внешних устройств, например, съемных жестких
дисков, «на лету»). Однако он требует соблюдать дополнительную логику
«привязки» найденного устройства к и м е н и , иногда весьма запутанную
из-за той ж е нечеткой идентификации. Поскольку происходить это долж¬
но в самый ответственный момент, при загрузке системы, динамическую
схему именования используют с осторожностью.

виртуальная файловая система


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

205
Курс Операционная система Linux

Файлы-дырки и другие типы файлов

К о е - к а к и е идеи динамического именования устройств присутствуют


и в статической схеме. Так, ф а й л ы /dev/mouse и л и / d e v / c d r o m на са­
м о м деле представляют собой символьные ссылки на соответствующие
ф а й л ы - д ы р к и . Если тип м ы ш и и л и лазерного привода изменится, доста¬
точно изменить эти ссылки и перезапустить соответствующие службы:

[root@localhost r o o t ] # l s - l /dev/cdrom /dev/mouse

lrwxrwxrwx 1 root root 8 Nov 20 23:23 /dev/cdrom -> /dev/hdc

lrwxrwxrwx 1 root root 5 Nov 9 01:16 /dev/mouse -> psaux

[root@localhost r o o t ] # l s - l L /dev/cdrom /dev/mouse /dev/hda1 / d e v / u r *

/dev/ze*

brw-r 1 root cdrom 22, 0 Jul 26 16:59 /dev/cdrom

brw-rw 1 root disk 3, 1 Jul 26 16:59 /dev/hda1

crw 1 root root 10, 1 Dec 2 11:58 /dev/mouse

crw-r--r-- 1 root root 1, 9 Nov 28 14:10 /dev/urandom

crw-rw-rw- 1 root root 1, 5 Jul 26 16:59 / d e v / z e r o

Пример 11.2. И д е н т и ф и к а ц и я внешних устройств в /dev/

Файл-дырка н е имеет размера: сколько в него н и записывай, в файл


на диске ничего не попадет. Вместо этого ядро передает все записанное
драйверу, отвечающему за файл-дырку, а тот по-своему обрабатывает эти
данные. Точно так ж е работает и чтение из файла-дырки: все запрашивае¬
м ы е д а н н ы е в нее подсовывает драйвер. Большинство драйверов — диско¬
вые, звуковые, последовательных и параллельных портов и т.п. — обраща­
ются за д а н н ы м и к какому-нибудь внешнему устройству или передают их
ему. Н о есть и такие, которые сами все «выдумывают»: это и / d e v / n u l l ,
черная дыра, в которую что угодно можно записать, и все пропадет безвоз­
вратно, и / d e v / z e r o , из которого можно считать сколько угодно нулей
(на запись о н о ведет себя к а к / d e v / n u l l ) , и /dev/urandom, и з которого
можно считать сколько угодно относительно случайных байтов.
Изучив выдачу команды l s - l L (ключ " - L " заставляет l s выводить
и н ф о р м а ц и ю н е о символьной ссылке, а о файле, на который она указы¬
вает), М е ф о д и й обнаружил, что та вместо размера файла-дырки (который
равен нулю) выводит два числа. Первое из этих чисел называется старшим
номером устройства (major device number), о н о , упрощенно говоря, соот­
ветствует драйверу, отвечающему за устройство. Второе называется млад¬
шим номером устройства (minor device number), о н о соответствует способу
работы с устройством, а для дисковых носителей — разделу. В частности,
из примера видно, что устройствами / d e v / r a n d o m и / d e v / u r a n d o m за-

206
Лекция 11 Работа с внешними устройствами

нимается один и тот ж е драйвер со старшим номером 1. П р и этом часть


устройств (по преимуществу — дисковые) имеет тип «b», а другая часть —
«c» (этот тип имеют, например, терминалы). Тип указан в атрибутах фай¬
ла первым символом. Это блочные (block) устройства, обмен д а н н ы м и с
которыми возможен только п о р ц и я м и (блоками) определенного размера,
и символьные (character) устройства, запись и чтение с которых происхо¬
дит побайтно. Блочные устройства, вдобавок, могут поддерживать коман¬
д ы прямого доступа вида «прочитать блок номер такой-то» и л и «запи­
сать д а н н ы е на диск, начиная с такого-то блока».
Блочные и символьные устройства — полноправные объекты файло¬
вой системы, такие ж е , к а к ф а й л ы , каталоги и символьные ссылки. Есть
еще два типа специальных файлов — каналы и сокеты. Канал-файл (или
fifo) называют е щ е именованным каналом (named pipe): это такой ж е объ¬
ект системы, к а к и тот, что используется командной оболочкой для орга¬
н и з а ц и и конвейера (его называют неименованным каналом), разница меж¬
ду н и м и в том, что у fifo есть и м я , о н зарегистрирован в файловой систе­
ме. Это — т и п и ч н ы й файл-дырка, причем дырка двухсторонняя: любая
программа может записать в канал (если позволяют права доступа) и л ю ­
бая программа может оттуда прочитать. Создать и м е н о в а н н ы й канал
м о ж н о с п о м о щ ь ю команды m k f i f o :

methody@localhost:~ $ m k f i f o hole

methody@localhost:~ $ ( d a t e >> h o l e & head -1 < h o l e ) 2> / d e v / n u l l

Птн Дек 3 15:11:05 MSK 2 004

methody@localhost:~ $ ( c a l >> h o l e & h e a d -1 < h o l e ) 2> / d e v / n u l l

Декабря 2 004

m e t h o d y @ l o c a l h o s t : ~ $ rm h o l e

Пример 11.3. Использование именованного канала

Здесь важно, что утилита h e a d показывает начало н е «файла» h o l e ,


а и м е н н о последней записываемой п о р ц и и данных, к а к и подобает трубе*.

канал
Объект Linux, используемый в межпроцессном взаимодействии.
Доступен в виде двух дескрипторов: один открыт на запись, другой —
на чтение. Все данные, записываемые в первый дескриптор, немед¬
ленно можно прочитать из второго. Различают неименованный ка¬
нал, уничтожаемый с закрытием обоих дескрипторов, и именован¬
ный канал (FIFO) — файл-дырку, создаваемый в файловой системе.
* Е с л и с т а н д а р т н ы й в ы в о д о ш и б о к всего к о н в е й е р а п е р е н а п р а в л е н в / d e v / n u l l , т о к о ­
м а н д н ы й и н т е р п р е т а т о р н е в ы в о д и т с о о б щ е н и й о запуске и о с т а н о в к е ф о н о в о г о п р о ц е с с а .