Uploaded by Aleksey Krivenya

Основы Red Hat Linux

advertisement
Оглавление
Введение ...................................................................................................................................................... 6
История развития GNU/Linux .................................................................................................................. 6
Linux .......................................................................................................................................................... 8
Архитектура и философия UNIX®..........................................................................................................11
Установка дистрибутива ...........................................................................................................................13
Этапы установки ....................................................................................................................................13
Предварительная настройка ................................................................................................................17
Страницы руководств ................................................................................................................................19
Команда whatis ......................................................................................................................................19
Поиск справки, команда apropos .........................................................................................................20
Команда info ..........................................................................................................................................20
Дополнительные источники .................................................................................................................22
Linux Documentation Project..................................................................................................................22
Виртуализация ...........................................................................................................................................23
Программная виртуализация ...............................................................................................................23
Аппаратная виртуализация...................................................................................................................24
Xen...........................................................................................................................................................25
Работа с Xen .......................................................................................................................................26
Пример установки виртуальной машины .......................................................................................27
Управление виртуальными машинами ...........................................................................................28
Мониторинг виртуальных машин ........................................................................................................29
Инициализация системы ..........................................................................................................................30
Процесс init и файл /etc/inittab ............................................................................................................30
Уровни выполнения ..............................................................................................................................30
Основные конфигурационные файлы .................................................................................................33
Загрузка в однопользовательском режиме ........................................................................................37
GNU GRUB ...............................................................................................................................................37
Конфигурация GRUB ..........................................................................................................................38
Файловая система .....................................................................................................................................42
Файлы .....................................................................................................................................................42
Каталоги..................................................................................................................................................44
Типы файлов ..........................................................................................................................................46
Файлы физических устройств ...............................................................................................................47
Именованные каналы (pipes) ...............................................................................................................49
Сокеты (sockets) .....................................................................................................................................49
Символические ссылки .........................................................................................................................50
Inode .......................................................................................................................................................51
Управление файловой системой..........................................................................................................53
Разбиение диска на разделы, fdisk ..................................................................................................53
Создание и монтирование файловых систем .................................................................................56
Команды для работы с файлами ......................................................................................................61
Команда find и символы шаблонов для имен файлов .......................................................................64
Команда split — разбиваем файл на несколько частей .....................................................................67
Сравнение файлов и команда patch ....................................................................................................68
Команды архивирования файлов ........................................................................................................69
Программа tar ....................................................................................................................................69
Программа gzip ..................................................................................................................................72
Программа bzip2 ................................................................................................................................74
Примеры применения tar .................................................................................................................75
Оболочка, Shell, командный интерпетатор.............................................................................................76
Начало работы с Shell ............................................................................................................................77
Программы.............................................................................................................................................78
Выполнение команд..........................................................................................................................78
Команды Shell ........................................................................................................................................79
Опции..................................................................................................................................................81
Аргументы ..........................................................................................................................................83
Исключения ........................................................................................................................................85
Виртуальные консоли ...........................................................................................................................86
Псевдонимы и переменные .................................................................................................................87
Навигация и редактирование ...............................................................................................................92
История команд .....................................................................................................................................94
2
Простые регулярные выражения .........................................................................................................96
Запуск команды на выполнение ........................................................................................................102
Стандартный ввод/вывод ...................................................................................................................102
Фильтры................................................................................................................................................107
Сценарий ..............................................................................................................................................109
Запуск сценария...................................................................................................................................111
Поиск файлов. ......................................................................................................................................112
Поиск внутри файла ............................................................................................................................113
Управление пользователями .................................................................................................................114
Структура файла /etc/passwd .............................................................................................................114
Структура файла /etc/shadow .............................................................................................................115
Структура файла /etc/group ................................................................................................................116
Псевдопользователи ...........................................................................................................................116
Команды работы с учетными записями пользователей ..................................................................116
Модель прав доступа в Linux ..............................................................................................................118
Изменение пользователя и группы владельца ................................................................................120
Знакомство с chmod ............................................................................................................................121
Числовые режимы ...........................................................................................................................121
umask ....................................................................................................................................................122
suid и sgid..............................................................................................................................................123
Права и директории ............................................................................................................................124
Директории и флаг sgid ...................................................................................................................124
Установка программного обеспечения .................................................................................................126
Утилита rpm ..........................................................................................................................................126
Менеджер пакетов Yum ......................................................................................................................131
Обновление пакетов .......................................................................................................................132
Обновление и установка ядра с помощью Yum ...........................................................................133
Поиск, перечисление и отображение информации о пакете .....................................................134
Установка пакетов ...........................................................................................................................137
Установка группы пакетов ..............................................................................................................138
Удаление ..........................................................................................................................................139
Настройка Yum .................................................................................................................................140
3
Добавление репозиториев .............................................................................................................144
Сборка ПО из исходных кодов ...............................................................................................................146
Необходимые сведения о программировании на языке Си .......................................................146
Инсталляция из исходных текстов .................................................................................................148
Процессы ..............................................................................................................................................149
Управление процессами .........................................................................................................................150
Команда ps .......................................................................................................................................150
Команда top .....................................................................................................................................152
Приоритеты ......................................................................................................................................154
Сигналы и команда kill ....................................................................................................................155
Перевод процесса в фоновый режим............................................................................................157
Автоматическое выполнение заданий ..................................................................................................160
Настройка задач Cron ..........................................................................................................................161
Запуск и остановка службы ................................................................................................................163
Системное время .................................................................................................................................163
Сетевые средства Linux ...........................................................................................................................165
Общие сведения о сетях .....................................................................................................................165
Стек TCP/IP........................................................................................................................................165
Адресация Internet ..........................................................................................................................171
Система имен доменов (DNS - Domain Name System) ..................................................................172
Модель Клиент-Сервер ...................................................................................................................174
Адреса TCP/IP ...................................................................................................................................177
Преобразование адресов ...............................................................................................................179
Конфигурация сетевых интерфесов ...................................................................................................180
Адрес сети ........................................................................................................................................180
Широковещательный адрес ...........................................................................................................180
Адрес шлюза ....................................................................................................................................180
Адрес сервера имен ........................................................................................................................180
Маска сети ........................................................................................................................................180
4
Файлы конфигурации TCP/IP ..............................................................................................................181
файл /etc/hosts.................................................................................................................................182
файл /etc/networks ..........................................................................................................................183
файл /etc/init.d/network ..................................................................................................................183
Параметры DNS................................................................................................................................184
файл host.conf ..................................................................................................................................185
Файл /etc/resolv.conf .......................................................................................................................186
Команда ifconfig...................................................................................................................................186
Основы безопасности Linux ....................................................................................................................189
Меры предосторожности ...................................................................................................................190
Принципы защиты ...............................................................................................................................191
Идентификаторы пользователя и группы пользователей ...............................................................192
PAM .......................................................................................................................................................193
Безопасность файлов ......................................................................................................................194
Важные системные файлы..................................................................................................................197
Проблемы защиты /etc/passwd и /etc/shadow .................................................................................201
Скрытые пароли...............................................................................................................................202
Устаревание паролей ......................................................................................................................203
5
Введение
История развития GNU/Linux
Linux основан на системных программах, разработанных в рамках проекта GNU, и на ядре Linux.
Обычно по историческим причинам (и для краткости) эта система называется просто «Linux».
В отличие от большинства других операционных систем, GNU/Linux не имеет единой
«официальной» комплектации. Вместо этого GNU/Linux поставляется в большом количестве так
называемых дистрибутивов, в которых программы GNU соединяются с ядром Linux и другими
программами. Наиболее известными дистрибутивами GNU/Linux являются Slackware, Red Hat,
Fedora Core, Mandriva, SuSE, Debian, Gentoo, Ubuntu. Из дистрибутивов российских разработчиков
наиболее известны ALT Linux и ASPLinux.
В отличие от Microsoft Windows, Mac OS (Mac OS X) и коммерческих UNIX®-подобных систем,
GNU/Linux не имеет географического центра разработки. Нет и организации, которая владела бы
этой системой; нет даже единого координационного центра. Программы для GNU/Linux —
результат работы тысяч проектов. Некоторые из этих проектов централизованы, некоторые
сосредоточены в фирмах, но большинство объединяют программистов со всего света, которые
знакомы только по переписке. Создать свой проект или присоединиться к уже существующему
может любой и, в случае успеха, результаты работы станут известны миллионам пользователей.
Пользователи принимают участие в тестировании свободных программ, общаются с
разработчиками напрямую, что позволяет быстро находить и исправлять ошибки и реализовывать
новые возможности.
Linux – это свободный диалект операционной системы UNIX®
В начале 80-х начались проблемы в виде войн стандартов и коммерциализации программного
обеспечения.
В конце 80-х годов молодой руководитель программистской компании со скромным названием
"Micro-soft", торгующей интерпретатором Basic без ведома авторов (Дик Уипл и Джон Арнольд),
стал писать сатьи относительно пиратства сокрушаясь о том, что, дескать, никто не станет
бесплатно писать качественные программы. Другими словами только то, что только программы за
деньги это хорошо, а бесплатно - это коммунисты и враги. И кто же станет от денег отказываться?
При таком подходе преимущество модульности UNIX® позволявшее разработчикам никогда не
"изобретая велосипед" использовать имеющиеся компоненты и их код в новых разработках
потребовало при каждом чихе или становится пиратом или погружаться в финансовую и
юридическую трясину.
"Мы программисты или кто?" - сказали программисты и придумали Open Source.
Довольно быстро появилось все необходимое для свободного диалекта UNIX®, не хватало только
ядра. Точнее все было примерно так: Было время фантастической коммерции на компьютерных
технологиях - «Золотая лихорадка» силиконовой долины.
6
В лаборатории искусственного интеллекта MIT разрабатывались так называемые LISP-машины,
умевшие на аппаратном уровне интерпретировать язык программирования, похожий на LISP –
развитый и перспективный язык программирования.
Некоторые сотрудники лаборатории искусственного интеллекта выкупили у MIT права на LISPмашины и математическую систему MACSIMA и основали собственные коммерческие компании
для дальнейших разработок в этой области. Очень многие сотрудники лаборатории перешли
работать в эти компании, после чего все их разработки уже становились закрытыми для научного
сообщества. Новые LISP-машины поставляются с лицензиями, запрещающими пользователям
модифицировать и распространять исходные тексты программ. Программы, которые раньше для
сотрудников MIT были аналогом научных публикаций, стали принадлежащим кому-то
коммерческим продуктом.
Одному из сотрудников, оставшемуся в лаборатории искусственного интеллекта MIT, Ричарду
Столлману, такое положение дел казалось недопустимым нарушением открытого научного
процесса разработки программного обеспечения. Он в одиночку пытался в рамках прежней
академической модели развивать LISP-машины и открыто реализовывать изменения,
аналогичные сделанным в рамках закрытой коммерческой разработки, чтобы LISP-машины MIT
могли конкурировать с коммерческими аналогами.
В поисках единомышленников Ричард Столлман создает некоммерческую организацию Фонд
свободного программного обеспечения (Free Software Foundation, FSF). Своей основной целью
организаторы Фонда видят сохранение программного обеспечения, процесс разработки которого
всегда будет гарантированно открытым, а исходные тексты – всегда доступными. Более
масштабная цель Фонда – разработка операционной системы, целиком состоящей из открыто
разрабатываемого программного обеспечения.
Операционная система, разрабатываемая в рамках Фонда, должна была стать совместимой с
операционной системой UNIX®. Эта будущая операционная система получила название GNU.
GNU - псевдоаббревиатура, для которой сам Столлман предлагал рекурсивную расшифровку:
GNU's Not UNIX® ("Гну – Не UNIX®").
В рамках деятельности Free Software Foundation была разработана лицензия GPL (General Public
License - Лицензия Общего пользования).
Она служит для защиты прав разработчиков открытого ПО. Под правами в данном случае
понимается не право на получение дохода от продажи программного кода, а право на свободный
доступ к исходному коду. Вместе с тем не запрещается продавать его и получать доход. При этом
обеспечивается защита от "приватизации" и растаскивания разработок по закрытым
коммерческим продуктам.
Вкратце GPL можно свести к следующему:
1. Вы имеете право использовать как угодно (в том числе - модифицировать и
распространять) код, находящийся под GPL, при соблюдении следующих условий:
2. любой, кому вы передаете этот код, получает в его отношении все те же самые
права;
7
3. любой код, являющийся кодом, производным от кода, распространяемый на
условиях GPL, также можно распространять только на условиях GPL.
4. При этом GPL в частности и Free Software Foundation вообще прямо поощряют
бизнес, связанный с оказанием сопутствующих услуг, - обучение, консультации, и,
как это ни покажется странным, - коммерческое тиражирование.
Лицензия, содержащая такие условия, получила название "copyleft". Условие "copyleft" прямо
противоположно по смыслу авторскому праву: авторское право призвано ограничить
пользователя в копировании и распространении копий продукта, а "авторское лево", наоборот,
строго запрещает его ограничивать.
В настоящее время помимо GPL известны и другие лицензии, под которыми может
распространяться свободное ПО. Самая распространенная из таких лицензий – BSD4) License.
Лицензия BSD отличается от GPL главным образом тем, что в ней отсутствует условие "copyleft", т.
е. на основании свободного ПО, распространяемого под этой лицензией, можно производить
несвободные модификации. Однако лицензия BSD и другие лицензии будут оставаться
лицензиями на свободное программное обеспечение до тех пор, пока они соответствуют
условиям, оговоренным принципами свободного ПО, объявленными Фондом.
GPL защищает права разработчика и создает условия для защиты прав потребителя. Главное
условие существования свободного ПО – не лицензия, а люди, которые готовы делиться текстами
своих программ и совершенствовать тексты чужих. Свободное ПО унаследовало модель открытой
научной разработки, а вместе с ней – и специфичеcкую организацию сообщества разработчиков и
пользователей, в некоторых отношениях напоминающую академическое сообщество.
Программное обеспечение с открытым кодом распространяемым свободно и бесплатно
появилось не без причины. По другому и быть не могло.
Особенности архитектуры UNIX® связанные возможностью развития системы на основе
заимствования функций программ и компонентов в сочетании с возможностью заимствования и
совершенствования программного кода создали уникальные условия для возможности
коллективной разработки мощнейшей системы силами интернет сообщества. К началу 90-х годов
сложилась революционная ситуация. Для появления Linux было все готово. Начал бурно
развиваться интернет, сформировалось интернет-сообщество разработчиков, в рамках проекта
GNU, кирпичик за кирпичиком собирались компоненты для свободного диалекта UNIX® –
операционной системы GNU. И 17 сентября 1991 года финский студент Линус Торвальдс выложил
на FTP-сайт Linux версии 0.01.
Linux
Линус Бенедикт Торвальдс (Linus Benedict Torvalds) родился 28 декабря 1969 года.
Его дед по материнской линии, Лео Вальдемар Тёрнквист был профессором статистики в
Университете Хельсинки. В 1981 он купил компьютер Commodore VIC-20. Это был первый
компьютер, к которому Линус получил доступ - он помогал деду набивать программы, которые
профессор старательно писал на бумаге, потому что не привык делать это непосредственно за
компьютером.
8
Когда он выжал из VIC-20 все, что смог, он стал копить деньги на модель следующего поколения. В
1987 году он купил Sinclair QL. В этом компьютере был установлен 32-разрядный процессорный
чип 68008 компании Motorola с частотой 8 мегагерц. Sinclair имел 128 килобайт (не мегабайт!)
памяти, что по тем временам было очень много для домашнего компьютера.
Когда снова пришло время снова менять компьютер ему было не просто, как правоверному
программисту, решиться перейти с правильной архитектуры Motorola 68008 на презренную
платформу IBM PC .
Но это свершилось, и 2 января 1991 года Линус приобрел в рассрочку новый компьютер, на основе
процессора Intel 80386 с 4 мегабайтими ОЗУ и тактовой частотой 33 мегагерца.
Он установил на него систему Minix., однако возникло множество претензий к этой ОС. Хуже всего
была эмуляция терминала, очень важная для Торвальдса программа, потому что именно ее он
использовал для подключения к университетскому компьютеру MicroVAX, на котором стояла Ultrix
– один из диалектов UNIX®, созданный корпорацией Digital Equipment. Пришлось писать
собственную программу эмуляции.
Торвальдс решил не строить её под Minix, а опираться прямо на аппаратный уровень. Разработка
программы позволяла, кроме всего прочего, детально изучить работу 386-го процессора.
Постепенно эмулятор терминала обрастал наворотами. Был написан драйвер для дисковода.
Линус сделал свою файловую систему совместимой с системой Minix, для того, чтобы она могла
читать файлы, созданные программой эмуляции терминала. Программа росла, эмулятор
терминала превращался в нечто гораздо большее.
17 сентября 1991 года Линус положил на FTP-сайт Linux версии 0.01. Затем был сделан большой
шаг вперед - в Linux перенесен компилятор GCC, так что можно было компилировать небольшие
программы.
В один прекрасный день у Линуса рухнула базовая операционка - Minix. Это был решающий
момент: можно было переустановить Minix или принять вызов и объявить, что Linux может
полностью ее заменить. Торвальдс написал программы для компиляции Linux внутри нее самой и
каждый раз, когда требовалась Minix, он просто добавлял в Linux нужную функцию. Когда в Linux
появилась поддержка подкачки виртуальной памяти (в Minix её не было)
Linux стали сравнивать с Coherent, небольшой коммерческой UNIX®-системой компании
Mark Williams. Люди стали переходить от Minix к Linux.
В 1992 году под Linux заработала графическая система X Window.
В марте 1994-го Linux 1.0 была с большой помпой представлена в аудитории факультета
информатики Университета Хельсинки.
1995 год. У Linux появилось множество коммерческих версий, Linux-компании завоевывают
признание. В университете Линуса повысили с ассистента до научного сотрудника.
9
Когда в марте 1995-го была выпущена версия 1.2, ядро уже включало в себя 250 тысяч строк кода,
новый журнал "Linux Journal" хвалился десятитысячным тиражом, a Linux могла работать на
процессорах Intel, Digital и Sun SPARC. Это был большой прогресс.
Но 1995 год был знаковым. На праздник Хелоуин появилась операционная система Windows 95
для настольных копьютеров. Нет она не была хороша. Наиболее совершенной тогда была OS/2. И
серверный вариант Windows тогда только смех вызывал у специалистов. Что это за сервер
который можно командой ping уложить?
Проект настольной операционной системы "Looking-glass" у компании Novell был закрыт как
неперспективный.
Проект OS/2 у IBM развивался вяло. Этот проект на начинался с Microsoft, неизбежное следствие лицензионные проблемы и отсутствие поддержки от сыграло свою роль.
1994 - 95 годы были для Линуса непростыми, - родилось двое детей и магистерская диссертация
отнимали все время.
Перенос Linux на другие платформы стал темой магистерской диссертации Торвальдса.
А Windows не терял времени. Вся планета была атакована грандиознейшей рекламой Windows.
Эту операционную систему покупали даже те, кто о компьютерах и не слышал. На смену черному
досу и синему нортону пришла красочная операционная система со свистками и колокольчиками.
Установить ее мог кто угодно.
Она победила в конкурентной борьбе даже BeOS, настольную ОС превосходившую Windows по
производительности в несколько раз. BeOS предъявляла более низкие требования к аппаратуре
компьютера и была более устойчива, чем Windows.
BeOS нравилась многим и некоторые производители стали устанавливать BeOS на новые
компьютеры.
Но Microsoft имела лицензиноое соглашение со всеми производителями компьютеров и
последовательно потребовала с них: (1)убрать иконку перезагрузки в BeOS с рабочего стола
Windows, (2)убрать с упаковки компьютера либо логотип Windows, либо логотип BeOS, (3)удалить
из системы мультизагрузчик. Все эти требования родились не на пустом месте, оказалось, что все
они давно были включены в стандартное лицензионное соглашение Microsoft с производителями
компьютеров, то есть компания Билла Гейтса сумела опередить Be, Inc. и заранее ограничить
возможность выпуска компьютеров с другими ОС.
Microsoft в последствии выплатила около 23 миллионов долларов ради снятия претензий со
стороны Be Inc.
Логотип Linux придумали в 1996 году. Тогда в рассылке linux-kernel mailing list прозвучала идея о
выборе логотипа для Linux.
Логотип Linux — это выбор Линуса. Он говорит, что сам похож на пингвина. Логотип создал Ларри
Ивинг (Larry Ewing), причем он нарисовал его прямо в Linux с помощью программы GIMP (The GNU
Image Manipulation Program). Если вы хорошо знаете зоологию (или хотя бы видели пингвинов по
10
телевизору), то, наверное, заметили, что у настоящих пингвинов клюв и ласты — черные, а у
нашего пингвиненка — оранжевые. Это сделано специально, чтобы пингвин был узнаваем.
Архитектура и философия UNIX®.
UNIX® - операционная система построенная просто, чрезвычайно рационально и понятно. В UNIX®
есть понятие процесса: процесс - это все, что что-нибудь делает.
Простой пример: - команда оболочки, которую вводят, чтобы войти в систему, не встроена в ядро.
Это просто процесс. Ничем не отличающийся от остальных. Просто это процесс читает с
клавиатуры и пишет на монитор.
В UNIX® все, что что-то делает, - процесс. А еще там есть файлы.
Почти все, что делается в UNIX®, выполняется с помощью шести базовых операций (называемых
"системными вызовами", потому что они представляют из себя вызовы системы для выполнения
тех или иных действий), А уж из этих шести базовых вызовов можно построить почти все на свете.
Одной из фундаментальных операций UNIX® является "операция порождения (fork)". Выполняя
"fork", процесс создает свою точную копию. Таким образом вы получаете две идентичные копии.
Любой процесс, который хочет создать еще один процесс, должен сначала создать свою копию с
помощью системного вызова fork, после чего порожденный процесс, который является полной
копией предыдущего за исключением нескольких параметров, таких как PID (Process ID) и PPID
(Parent Process ID) использует системный вызов exec для того, чтобы загрузить в свое адресное
пространство код новой программы и начать его выполнение. Соответственно, все процессы
организуют дерево, когда у каждого процесса есть родительский процесс (исключение составляет
процесс init, запущенный ядром на этапе загрузки).
Еще четыре вызова - open (открыть), close (закрыть), read (читать) и write (писать) - предназначены
для доступа к файлам. Эти шесть системных вызовов представляют собой простые операции, из
которых и состоит UNIX®.
Конечно, есть еще много других системных вызовов, которые осуществляют детализацию. Но то,
что базовых всего шесть, это изумительно.
Любого уровня сложности можно достичь за счет сочетания простых вещей. Для решения
сложной проблемы нужно лишь создать связи ("каналы" в терминологии UNIX®) между простыми
процессами.
Для взаимодействия с оборудованием, процессами, службами и прочими ресурсами
используются файлы – записать в файл, прочитать из файла.
Никаких сложных интерфейсов. Воспроизвести звук в UNIX® – это значит отправить содержимое
файла (он не обязательно должен быть в звуковом формате) в файл /dev/dsp. Все просто.
Простота структуры UNIX® всегда поражает программистов разработчиков ранее не имевших
опыта работы с ним.
Вы скажете – это слишком просто, это устарело? Ничего подобного! Эта система существует уже
более 40 лет и ничего более совершенного пока не придумано. Простота – признак совершенства.
11
Взгляните как происходила эволюция языков. Китайский язык наиболее древний.
В китайском вы сразу же получаете в свое распоряжение огромное количество символов, которые
можно комбинировать ограниченным образом. Более поздние языки стали совершеннее. В
английском 26 букв, и с их помощью можно написать все. А в китайском для каждой мыслимой
вещи - своя буква.
В UNIX® основная идея: "Чем меньше, чем рациональнее, тем красивее". Здесь есть небольшой
набор простых базовых строительных блоков, из которых можно строить бесконечно сложные
конструкции.
Это простирается дальше архитектуры. Большинство новых компонентов разрабатываемых для
UNIX® делается с использованием уже существующих. Это обеспечивает резко сократить
трудоемкость разработки и повысить стабильность, но, в случае коммерческих систем, это требует
постоянного согласования с разработчиками этих компонентов, тесного взаимодействия,
документального оформления и, разумеется, денежных расчетов.
12
Установка дистрибутива
Первое знакомство с операционной системой происходит при ее установке на локальный
компьютер. Рассмотрим подробнее этот процесс.
Установка дистрибутива CentOS может выполняться различными способами:
1. Установка с CD или DVD носителя
2. Сетевая установка
При локальной установке дистрибутива можно использовать CD или DVD диски, а также flash
накопители. На них необходимо записать файлы из установочного образа, который доступен в
репозитории. Например, для CentOS 5.7 образы доступны по адресу:
http://ftp.byfly.by/pub/CentOS/5.7/isos/i386/
Для установки по сети можно использовать образ netinstall, который содержит лишь базовые
ресурсы и предполагает загрузку дополнительных пакетов из сетевого репозитория.
Если bios компьютера поддерживает PXE, то установка может быть проведена в полностью
автоматическом режиме без использования локальных носителей.
Этапы установки
Рассмотрим типичный процесс установки дистрибутива CentOS на локальный компьютер.
Установка в графическом режиме является опцией, используемой по умолчанию. Для установки в
текстовом режиме (linux text) или, например, для входа в консоль восстановления (linux
rescue) используются дополнительные опции. Весь список опций можно увидеть, нажав F2.
13
Кроме активации текстового режима установки, возможна сетевая установка (linux askmethod),
проверка носителя на ошибки (linux mediacheck), тестирование ОЗУ (memtest86). Через некоторое
время после инициализации системы стартует программа установки Anaconda, внешний вид
которой стилизован по CentOS.
Установка в графическом режиме возможна только при наличии 512 Мб ОЗУ, при меньшем ее
количестве следует использовать текстовый режим.
На первом шаге мы можем ознакомиться с особенностями устанавливаемого релиза. Далее
переходим к выбору языка программы установки (в списке доступен русский). Затем указываем
раскладку клавиатуры.
Первое, что может вызвать сложности у новичков – это разметка диска. Для создания разделов
используется программа Disk Druid, которая также используется в дистрибутивах Red Hat. Для
автоматической разметки диска, достаточно нажать кнопку «Удалить разделы Linux на выбранных
дисках и создать разбиение по умолчанию». Обратите внимание будут удалены именно разделы,
на которых установлен какой-нибудь Linux. Хотя для контроля не забудьте установить флажок
«Просмотр и изменение разбиения раздела». Нажав на стрелки справа от надписи, можно
получить список других вариантов. Но при автоматическом создании разделов будет
использована технология LVM, на десктопе это не всегда нужно.
Для ручного создания разделов выбираем «Создать собственное разбиение», есть и вариант
использования всего диска. Список файловых систем несколько меньше предлагаемых в
14
большинстве дистрибутивов: семейство ext(2,3 и 4), swap, VFAT, софтовый RAID и LVM. Как видите,
ReiserFS и XFS в списке нет, хотя, если заранее подготовить такой раздел, установить на них CentOS
можно. Для нового раздела можно задать фиксированный размер или указать на заполнение
нужного пространства.
В качестве точки монтирования может выступать любая директория файловой системы Linux. Для
нормальной работы системы достаточно создать лишь два раздела:

Swap раздел

Раздел для монтирования корневой файловой системы /
Размер раздела подкачки зависит от объема оперативной памяти в используемой машине. Он не
должен быть меньше 200 МБ, максимальный объем ограничен лишь возможностями вашего
жесткого диска. Для большинства нужд 1ГБ будет достаточно.
Если указать один раздел для всей корневой файловой системы, то все поддиректории будут
смонтированы в этот раздел. Для более гибкой настройки системы можно использовать разные
разделы для следующих точек монтирования:

/boot - содержит статичные файлы загрузчика (образы initrd*и vmlinuz, конфигурационные
файлы). Для использования данной точки монтирования подойдет раздел с файловой
системой ext2 и объемом около 100МБ.
15

/home – содержит домашние директории всех пользователей кроме root. Основной
объем пользовательских файлов будет храниться здесь, поэтому объем раздела должен
быть соответствующий. В качестве файловой системы можно использовать ext3 или ext4.

/tmp – содержит временные файлы

/var – содержит изменяемые данные. В CentOS используется для хранения файлов,
доступных извне (по ftp или http)

/opt – дополнительные пакеты ПО.
После разметки диска, установщик Anaconda самостоятельно находит все ОС имеющиеся на
компьютере и заносит их в список загрузчика. По большому счету на этом этапе достаточно просто
просмотреть заданные установки для GRUB. Но при необходимости можно изменить настройки
или вообще отказаться от установки загрузчика.
По умолчанию сетевой интерфейс настроен на автоматическое получение адреса посредством
DCHP, поддержка протокола IPv6 активирована. При необходимости мы можем изменить
установки. Здесь же добавляем адрес шлюза и DNS сервера.
Далее стандартные шаги – выбор часового пояса, установка пароля root а также выбор задач, на
которые будет ориентирован наш компьютер. По умолчанию предлагается рабочий стол GNOME,
16
все остальные варианты – KDE, Server, Виртуализация, Кластеризация и прочие отключены. На
этом же этапе мы можем выбрать пакеты, которые будут установлены в системе.
Выбор пакетов является последним этапом установки CentOS. Далее Anaconda скопирует все
необходимые данные с носителя и предложит перезагрузку.
Предварительная настройка
После перезагрузки вас встретит мастер предварительной настройки, при помощи которого
можно сконфигурировать работу межсетевого экрана, режим работы SELinux, задать дату и
время.
17
Далее мастер позволяет создать еще одну учетную запись для повседневной работы, настроить
звуковую карту и установить дополнительное ПО.
В данном курсе мы не будем подробно рассматривать iptables и SELinux, поэтому отключим ихдля
упрощения работы с системой.
Все настройки, сделанные в этом мастере, можно изменить непосредственно из операционной
системы.
18
Страницы руководств
Страницы руководств, или man (от англ. manual — руководство) страницы, ман-страницы, далее
просто маны — это классическая форма справочной документации UNIX и Linux. В идеале, вы
можете найти ман для любой команды, конфигурационного файла или библиотеки. Однако, на
практике, Linux это бесплатное программное обеспечение и некоторые страницы руководств не
были написаны или устарели. Тем не менее, маны остаются первым местом, куда следует
обращаться за помощью.
Все страницы руководства отнесены к восьми разделам:
1.
2.
3.
4.
5.
6.
7.
8.
пользовательские утилиты и прочие инструменты;
системные вызовы;
библиотечные вызовы (функции);
внешние устройства (и их представление в системе);
форматы и таблицы (типы файлов, протоколы и пр.);
игры и всевозможные "ненужные" утилиты (например, fortune);
прочее, т. е. то, что не подходит под другие разделы;
команды и инструменты системного администратора.
В некоторых версиях UNIX® добавляется девятый раздел, посвященный структуре ядра системы.
Если у кого-то возникнет желание исправить или развить ядро, самую ответственную часть любой
системы, ему будет где искать помощи.
Для доступа к ману просто введите man, а затем ваш запрос. Запустится программа-пейджер
(просмотрщик, обычно less или more) со справочной информацией. Для того, чтобы закрыть
её, нажмите клавишу q. Например, чтобы посмотреть информацию о команде ls, введите:
$ man ls
Знание структуры мана поможет быстро перемещаться к необходимой вам информации. Обычно,
вы найдете следующие разделы в мане:
NAME
Имя и однострочное описание команды
SYNOPSIS
DESCRIPTION
EXAMPLES
SEE ALSO
Краткий обзор
Углублённое описание функционала команды
Советы по использованию
Связаные темы (обычно также ман-страницы)
Команда whatis
Самая краткая часть страницы руководства - однострочное поле NAME - тоже играет очень важную
роль в системе информационной поддержки. Дело в том, что при установке руководства в
систему содержимое этого поля добавляется в файл whatis, лежащий в базовом каталоге.
Текстовый файл whatis - оглавление всей системы руководств, находящейся в соответствующем
каталоге. Если поискать некоторое слово в этом файле, мы увидим только те заголовки
руководств, в которых оно встречается. Поиском ключевых слов в whatis занимаются утилита
whatis(1) и apropos(1), которая ищет не целое слово, а просто подстроку в строке.
19
Некоторые темы существуют более чем в одной секции. Для демонстрации этого воспользуюемся
командой whatis, показывающей доступные маны по теме:
$ whatis printf
printf
(1)
- format and print data
printf
(3)
- formatted output conversion
В данном случае, man printf по-умолчанию обратится к странице в секции 1 (Пользовательские
программы). Если мы пишем программу на языке C, нас вероятно больше интересует страница из
секции 3 (Библиотечные функции). Вы можете вызывать ман необходимой секции указав это в
командной строке, так для вызова printf(3) мы введём:
$ man 3 printf
Поиск справки, команда apropos
Иногда сложно найти правильную ман-страницу по заданной теме. В этом случае можно
воспользоваться man -k для поиска по разделам «ИМЯ» ман-страниц. Но будьте осторожны,
поскольку осуществляется поиск по подстроке и что-то, навроде man -k ls, выдаст очень много
всего! Вот пример использования уточняющего запроса:
$ man -k whatis
apropos
(1)
- search the whatis database for strings
makewhatis
(8)
- Create the whatis database
whatis
words
(1)
- search the whatis database for complete
Предыдущий пример не случаен. Во-первых, команда apropos полностью соответствует команде
man -k. (На самом деле, я даже вам раскрою небольшой секрет. Когда вы запускаете man -k,
фактически «за кулисами» стартует apropos). Во-вторых, существует команда makewhatis, которая
сканирует все страницы в вашей Linux системе и создает базу данных для whatis и apropos.
Обычно она запускается периодически из-под рута, чтобы поддерживать базу в актуальном
состоянии:
# makewhatis
Для более подробной информации о команде «man» и её друзьях, вам стоит начать с изучения её
собственной ман-страницы:
$ man man
Команда info
Альтернатива manpages - гипертекстовая система info(1). Info - часть системы документирования
texinfo, разработанной GNU. У texinfo есть масса преимуществ перед roff. Во-первых, из texinfoдокументации можно изготавливать не только info-файлы, но и документы в формате HTML и
20
XML, и даже настоящие книжки в формате TeX. Во-вторых, формат texinfo более новый, в нем
существенно больше средств разметки, индексирования текста, организации таблиц и т. п. Втретьих, в отличие от man, info - система документирования, в которой на уровне просмотра
реализован переход по гипертекстовым ссылкам.
Структура info-документации опирается на понятия "узел", "меню", "ссылка" и "индекс". Узел - это
некоторый цельный текст, посвященный определенной теме, имеющий собственное имя. Узлы
строго упорядочены (так из них получается книга), но еще они включены в иерархию отделов
книги (по принципу часть - лекция - раздел - подраздел). Узлом может быть, например, текст в
начале и в конце главы, разделенный меню.
Меню - это оглавление соответствующего узла (например, раздела), каждый элемент которого
ссылается на нижележащий узел (в данном случае - подраздел). Тексты всех нижележащих узлов
меню и самого узла составят весь текст раздела.
Ссылка - один из двух видов гипертекстовых ссылок в info. При просмотре документации утилитой
info достаточно переместить текстовый курсор при помощи клавиши Tab к нужному пункту меню
и нажать enter, чтобы перейти к соответствующему узлу, т. е. проследовать по ссылке. Другой вид
гипертекстовых ссылок называется перекрестными ссылками.
Индекс - сводное меню, содержащее ссылки на узлы, в описании которых помечено, что они
этому меню принадлежат. Иными словами, индекс не надо писать вручную, он собирается при
изготовлении info-файла из texinfo-документации. Несколько индексов в info-странице всегда
определено, например, concept index - список всех сущностей, упоминающихся в документе.
Такая структура делает texinfo-документ пригодным для создания разветвленной и подробной
документации: учебника, статьи, содержащей научные и исторические сведения, полного
описания некоторой прикладной системы и т. д. Авторы texinfo-документа - сами разработчики
этой системы, чаще всего независимой от какой-либо операционной среды. Под этим углом
зрения можно рассматривать сообщество GNU, в котором документирование при помощи texinfo
считается стандартом. Однако именно по причине независимости включать info-страницы в общее
информационное пространство определенной ОС бывает затруднительно.
$ info
Простой вызов команды info даст список доступных инфо-страниц в вашей системе. Вы можете
перемещаться по нему используя стрелки, переходить по ссылкам (которые обозначены
звездочкой) с помощью клавиши Enter и выйти нажав q. Навигация основана на таковой в Emacs,
так что если вы знакомы с этим редактором, вам будет легко освоиться. Чтобы познакомиться с
Emacs, посмотрите руководство на developerWorks: Living in Emacs.
Вы также можете указать нужную инфо-страницы в командной строке:
$ info diff
Чтобы получить больше информации об использовании просмотрщика инфо-страниц, попробуйте
прочитать его собственную инфо-страницу. Вы сможете перемещаться по документу просто
используя несколько клавиш о которых я уже упоминал:
21
Дополнительные источники
Есть еще один источник помощи в вашей системе Linux. Большинство программ поставляются с
дополнительной документацией в других форматах, таких как: простые текстовые файлы, PDF,
PostScript, HTML. Посмотрите в каталоге usr/share/doc (или /usr/doc на более старых системах). Вы
найдете длинный список директорий, каждая из которых идет с определенным приложением на
вашей системе. Поиск по этой документации может навести вас на очень ценную информацию,
которая не доступна в манах или инфо-страницах, такую как учебники или дополнительная
технической документация. Беглый взгляд указывает на то, что здесь очень много материала для
чтения:
$ cd /usr/share/doc
$ find . -type f | wc -l
7582
Linux Documentation Project
В дополнение к системной документации, в интернете существует ряд отличных ресурсов
посвященных Linux. "Linux Documentation Project" (http://www.tldp.org/ )— это группа
добровольцев, которые занимаются составлением полного набора свободной документации по
Linux. Данный проект существует чтобы собрать различные части документации по Linux в
определенным месте, где её будет легко искать и использовать.
LDP состоит из следующих разделов:

Guides (руководства) — большие, очень серьезные пособия, такие как The Linux
Programmer's Guide (Руководство программиста Linux)

HOWTOs — помощь по конкретной теме, например DSL HOWTO

FAQs — сборники ответов на часто задаваемые вопросы, навроде этого Brief Linux FAQ

Man pages — помощь по конкретной команде (это те же самые маны, что вы видите в
вашей системе, когда используете команду man).
Если вы не уверены какой раздел смотреть, вы можете воспользоваться богатыми возможностями
поиска, который позволит найти всё, что есть по теме.
LDP вдобавок предоставляет доступ к списку ссылок и ресурсов, таких как Linux Gazette и Linux
Weekly News, а также к спискам рассылки и архивам новостей.
22
Виртуализация
Одним из важнейших требований к типичному корпоративному серверу является
надежность. Надежность сервера зависит от надежности железа и операционной
системы, поэтому ее обеспечение зачастую обходится дорого. Предположим, мы хотим,
чтобы в нашей сети работали FTP сервер, почтовый сервер, сервер баз данных, система
контроля версий, транспорт jabber и так далее. Устанавливать каждый сервер на отельную
машину дорого, с другой стороны, при установке на одну машину могут возникнуть
проблемы.
 Безопасность. Нужно четко разделять ресурсы доступные только во внутренней
сети и ресурсы, доступные извне. Совмещение таких ресурсов на одной
физической машине небезопасно.
 Конфликты. Некоторые программы требуют различные версии библиотек
Одним из решений этой проблемы является использование виртуальных машин.
Виртуализация — это общий термин, охватывающий абстракцию ресурсов для многих
аспектов вычислений. Типы виртуализации приводятся ниже.
Программная виртуализация
1. Динамическая трансляция
При динамической трансляции (бинарной трансляции) проблемные команды гостевой OC
перехватываются гипервизором. После того как эти команды заменяются на безопасные,
происходит возврат управления гостевой ОС.
2. Паравиртуализация
Паравиртуализация — техника виртуализации, при которой гостевые операционные
системы подготавливаются для исполнения в виртуализированной среде, для чего их
ядро незначительно модифицируется. Операционная система взаимодействует с
программой гипервизора, который предоставляет ей гостевой API, вместо использования
напрямую таких ресурсов, как таблица страниц памяти.
Метод паравиртуализации позволяет добиться более высокой производительности, чем
метод динамической трансляции.
Метод паравиртуализации применим лишь в том случае, если гостевые ОС имеют
открытые исходные коды, которые можно модифицировать согласно лицензии, или же
гипервизор и гостевая ОС разработаны одним производителем с учетом возможности
паравиртуализации гостевой ОС (хотя при условии того, что под гипервизором может
быть запущен гипервизор более низкого уровня, то и паравиртуализации самого
гипервизора).
23
3. Встроенная виртуализация
Преимущества:
 Совместное использование ресурсов обоими ОС (папки, принтеры и т.д. ).
 Удобство интерфейса для окон приложений из разных систем (перекрывающиеся
окна приложений, одинаковая минимизация окон, как в хост-системе)
 При тонкой настройке на аппаратную платформу производительность мало
отличается от оригинальной нативной ОС. Быстрое переключение между
системами (менее 1 сек.)
 Простая процедура обновления гостевой ОС.
 Двухсторонняя виртуализация (приложения одной системы запускаются в другой и
наоборот)
Аппаратная виртуализация
Преимущества:
 Упрощение разработки программных платформ виртуализации за счет
предоставления аппаратных интерфейсов управления и поддержки виртуальных
гостевых систем. Это уменьшает трудоемкость и время на разработку систем
виртуализации.
 Возможность увеличения быстродействия платформ виртуализации. Управление
виртуальными гостевыми системами осуществляет напрямую небольшой
промежуточный слой программного обеспечения, гипервизор, что дает
увеличение быстродействия.
 Улучшается защищённость, появляется возможность переключения между
несколькими запущенными независимыми платформами виртуализации на
аппаратном уровне. Каждая из виртуальных машин может работать независимо, в
своем пространстве аппаратных ресурсов, полностью изолированно друг от друга.
Это позволяет устранить потери быстродействия на поддержание хостовой
платформы и увеличить защищенность.
 Гостевая система становится не привязана к архитектуре хостовой платформы и к
реализации платформы виртуализации. Технология аппаратной виртуализации
делает возможным запуск 64-битных гостевых систем на 32-битных хостовых
системах (с 32-битными средами виртуализации на хостах).
24
Дистрибутивы CentOS до версии 6.0 в качестве монитора виртуальный машин
используется Xen.
Xen
Xen — это монитор виртуальных машин (VMM, Virtual Machine Monitor) или гипервизор
(hypervisor) с поддержкой паравиртуализации (para-virtualization) для процессоров x86
архитектуры, распространяющийся с открытым исходным кодом (opensource). Xen может
организовать совместное безопасное исполнение нескольких виртуальных машин на
одной физической системе с производительностью близкой к непосредственной (native).
Xen обладает функциональностью ПО корпоративного уровня; в нём, в частности,
обеспечивается:
 Производительность виртуальных машин близкая к производительности при
непосредственном исполнении на железе;
 Возможность живой миграции работающих виртуальных машин между хостами;
 Поддержка до 32 виртуальных процессоров на одну гостевую машину с
возможностью горячего добавления (hotplug) процессоров;
 Поддержка платформ x86/32, x86/32 с PAE, x86/64, IA64, а также частичная
поддержка платформ ARM и PPC;
 Поддержка аппаратной виртуализации для запуска немодифицированных
операционных систем (включая Microsoft Windows);
 Отличная поддержка оборудования (поддерживаются практически все драйверы
устройств Linux).
25
Работа с Xen
Прежде всего, нужно убедиться, что установлены все необходимые пакеты для работы с
Xen, а именно kernel-xen, xen и virt-manager для управления виртуальными машинами.
Чтобы выполнить установку этих пакетов используем yum. Проверить наличие пакетов на
машине можно при помощи утилиты rpm
# rpm -qa | grep virt
libvirt-client-0.8.1-27.el6.x86_64
libvirt-0.8.1-27.el6.x86_64
python-virtinst-0.500.3-7.el6.noarch
libvirt-python-0.8.1-27.el6.x86_64
virt-manager-0.8.4-8.el6.noarch
По умолчанию виртуальные машины хранятся в /var/lib/xen/images, поэтому должно быть
выделено необходимое дисковое пространство для хранения образов.
За работу виртуальной среды отвечают демоны xend и libvirtd, запустим их
# chkconfig xend on
# chkconfig libvirtd on
Установка виртуальной машины
Если вы работали в VMware или VirtualBox, вы, вероятно, использовать графический
интерфейс для настройки клиентов. В операционной системе Linux также возможна
работа с виртуальными машинами в графическом режиме, но прежде чем его
использовать, разберемся с интерфейсом командной строки. Использование Xen из
командной строки облегчает администрирование (в основном потому, что вы можете
автоматизировать процессы, посредством скриптов). При помощи команды virtinstall вы можете создавать, управлять и автоматизировать работу с виртуальными
машинами.
Синтаксис команды выглядит следующим образом:
#
virt-install -name NAME -ram RAM STORAGE INSTALL [options]
Как вы видите, принцип работы очень простой, основные нюансы заключаются в опциях
установки. Их список довольно большой, для его вывода используйте опцию help.
#
virt-install –help
Эта команда может использоваться в интерактивном режиме или в скриптах для
автоматической установки и настройки множества виртуальных машин.
Помимо virt-install вы также можете использовать графическую утилиту virtmanager, которая может выполнять многие из тех же задач. Независимо от того, какой
26
метод вы используете, вы можете установить операционную систему на виртуальную
машину так же как и на физическую машину используя установочный диск или образ,
через сетевую установку по ftp или http,а также через PXE.
Пример установки виртуальной машины
Любая виртуальная машина может быть установлена и сконфигурирована различными
способами. Рассмотрим несколько примеров использования virt-install
# virt-install --name Client03 --ram 512 -–disk
path=/var/lib/libvirt/images/client03.img,size=8 --network
network=default --cdrom /dev/cdrom
В этом примере мы создаем виртуальную машину с именем Client03, с 512 Гб
оперативной и 8 Гб дисковой памяти. Сетевой интерфейс устанавливается по умолчанию
(первый виртуальный сетевой адаптер), а установка происходит с диска, смонтированного
в /dev/cdrom.
Помните, что вы также можете использовать virt-manager, если вам удобнее работать
с графическим интерфейсом. Пример интерфейса показан на рисунках 3 и 4.
Рисунок 3. Выбор диска для установки образа.
Рисунок 4. Задание объема оперативной памяти
27
Управление виртуальными машинами
После установки виртуальной машины нам понадобиться интерфейс для взаимодействия
с ней, чтобы выполнять такие задачи, как запуск/остановка, перезагрузка, создание
snapshot а также миграции на другие физические сервера. Эти действия можно выполнить
используя графическую утилиту virt-manager, или в командной строке при помощи
virsh.
Так же, как и virt-install, virsh имеет множество дополнительных команд. Их
можно разделить на два больших класса – управление и мониторинг. Рассмотрим
команды управления виртуальными хостами, представленные в таблице 2.
help
Вывести подсказку для команды
connect
Подключиться к гипервизору
start
Запуск виртуальной машины
reboot
Перезагрузить машину
save|restore
Сохранить и восстановить машину
suspend|resume
Приостановить и возобновить работу
виртуальной машины
shutdown
Выключить машину
migrate
Мигрировать на другой сервер
Таблица 2. Команды управления virsh
Таким образом, для того чтобы подключиться к гипервизору и, например, поставить на
паузу виртуальную машину test нужно использовать следующую свзяку команд
# virsh connect test
# virsh suspend test
Для того, чтобы виртуальная машина запускалась при загрузке физического зоста,
используем
# virsh autostart test
28
Мониторинг виртуальных машин
Рассмотрим команды мониторинга virsh
list
Получить список виртуальных хостов
vcpuinfo
Показать информацию о процессоре
виртуального хоста
domblkstat
Отображает статистику по блочным
устройствам
domifstat
Показывает статистику сетевых
подключений
Таблица 3. Мониторинг виртуальных машин
Так же, как и при управлении виртуальными хостами, вам нужно подключиться к
гипервизору прежде чем вы сможете приступить к использованию этих команд.
В рамках каждого виртуального гостя вы можете использовать любые стандартные
утилиты мониторинга (top, free и так далее), однако, эти дополнительные опции
virsh могут дать вам информацию, о том как взаимодействует виртуальный и
физический хост.
При мониторинге системные ресурсы, у вас также есть возможность использовать утилиту
virt-manager. Она имеет все те же параметры, но он позволяет увидеть вывод в
графическом режиме.
29
Инициализация системы
Для начала надо отметить, что все, о чем будет рассказано в этом разделе, относится к
дистрибутивам SuSE Linux, Red Hat и аналогам. В других дистрибутивах (например, Debian)
процедуры загрузки могут быть организованы иначе.
Процесс init и файл /etc/inittab
Как вы знаете, после включения питания компьютера и завершения тестирования аппаратной
части BIOS считывает из первого сектора загрузочного диска короткую программу- загрузчик. Эта
программа запускает основной системный загрузчик (например, grub), который, в свою очередь,
загружает в память ядро системы, которое обычно хранится в файле vmlinuz-x.y.z-a в каталоге
/boot. Здесь x.y.z— это номер версии ядра, а вместо символа a часто стоит указание на какие-то
конкретные модификации ядра. Впрочем, название файла ядра может быть и другим, для
загрузчика это не имеет значения, только это имя надо указать в конфигурационном файле
загрузчика.
Сразу после загрузки ядро монтирует корневую файловую систему и запускает процесс init.
Процесс init— это программа, которая ответственна за продолжение процедуры загрузки, и
перевод системы от начального состояния, возникающего после загрузки ядра, в стандартное
состояние обработки запросов многих пользователей. Init выполняет еще массу различных
операций, необходимых для дальнейшей работы системы: проверку и монтирование файловых
систем, запуск различных служб (демонов), запуск процедур логирования, оболочек
пользователей на различных терминалах и т.д.
Уровни выполнения
Точный список этих операций зависит от так называемого уровня выполнения (run level). Уровень
выполнения определяет перечень действий, выполняемых процессом init, и состояние системы
после загрузки, т.е. конфигурацию запущенных процессов. Уровень выполнения
идентифицируется одним символом. В ОС Linux существует 8 основных уровней выполнения:








0— остановка системы;
1— однопользовательский режим (для специальных случаев
администрирования) ;
2— многопользовательский режим без NFS (то же, что и 3, если компьютер не
работает с сетью);
3— полный многопользовательский режим;
4— использование не регламентировано;
5— обычно используется для запуска системы в графическом режиме;
6— перезагрузка системы;
S (или s)— примерно то же, что и однопользовательский режим, но S и s
используются в основном в скриптах. (Single user mode; from the boot prompt,
only with US keyboard mapping)
Как видите, уровни 0, 1 и 6 зарезервированы для особых случаев. Относительно того, как
использовать уровни со 2 по 5, единого мнения не существует. Некоторые системные
администраторы используют разные уровни для того, чтобы задать разные варианты работы,
например, на одном уровне запускается графический режим, на другом работают в сети и т.д. Вы
30
можете сами решить, как использовать разные уровни для создания разных вариантов загрузки.
Но для начала проще всего воспользоваться тем способом определения разных уровней, который
был задан при установке.
Первым делом после старта процесс init считывает свой конфигурационный файл /etc/inittab. Этот
файл состоит из отдельных строк. Если строка начинается со знака # или пуста, то она
игнорируется. Все остальные строки состоят из 4 полей, разделенных двоеточиями:
id:runlevels:action:process
где:




id— идентификатор строки. Это произвольная комбинация, содержащая от 1 до
4 символов. В файле inittab не может быть двух строк с одинаковыми
идентификаторами;
runlevels— уровни выполнения, на которых эта строка будет задействована.
Уровни задаются цифрами или буквами без разделителей, например, 345;
process— процесс, который должен запускаться на указанных уровнях. Другими
словами в этом поле указывается имя программы, вызываемой при переходе
на указанные уровни выполнения;
action— действие.
В поле action стоит ключевое слово, которое определяет дополнительные условия выполнения
команды, заданной полем process. Допустимые значения поля action:









respawn— перезапустить процесс в случае завершения его работы;
once— выполнить процесс только один раз при переходе на указанный
уровень;
wait— процесс будет запущен один раз при переходе на указанный уровень и
init будет ожидать завершения работы этого процесса, прежде, чем
продолжать работу;
sysinit— это ключевое слово обозначает действия, выполняемые в процессе
загрузки системы независимо от уровня выполнения (поле runlevels
игнорируется). Процессы, помеченные этим словом, запускаются до процессов,
помеченных словами boot и bootwait;
boot— процесс будет запущен на этапе загрузки системы независимо от уровня
выполнения;
bootwait— процесс будет запущен на этапе загрузки системы независимо от
уровня выполнения, и init будет дожидаться его завершения;
initdefault— строка, в которой это слово стоит в поле action, определяет
уровень выполнения, на который система переходит по умолчанию. Поле
process в этой строке игнорируется. Если уровень выполнения, используемый
по умолчанию, не задан, то процесс init будет ждать, пока пользователь,
запускающий систему, не введет его с консоли;
off— игнорировать данный элемент;
powerwait— позволяет процессу init остановить систему, когда пропало
питание. Использование этого слова предполагает, что имеется источник
бесперебойного питания (UPS) и программное обеспечение, которое
отслеживает состояние UPS и информирует init о том, что питание отключилось;
31

ctrl-alt-del— разрешает init перезагрузить систему, когда пользователь
нажимает комбинацию клавиш <Ctrl>+<Alt>+<Del> на клавиатуре. Обратите
внимание на то, что системный администратор может определить действия по
комбинации клавиш <Ctrl>+<Alt>+<Del>, например игнорировать нажатие этой
комбинации (что вполне разумно в системе, где много пользователей).
Этот список не является исчерпывающим. Более подробно о файле inittab можно узнать из manстраниц init (8), inittab (5) и getty (8).
Обработка файла /etc/inittab процессом init начинается в однопользовательском режиме (уровень
1), в котором единственным пользователем является пользователь root, работающий с консоли.
Первым делом init находит строку, которая определяет, какой уровень выполнения запускается по
умолчанию:
id:3:initdefault:
Это и будет тот уровень, в котором запустится и будет работать система после загрузки, поэтому
естественно, что нельзя указывать в строке initdefault уровни 0 и 6.
Далее init выполняет команды, указанные в строке с ключевым словом sysinit. В стандартной
конфигурации здесь выполняется скрипт rc.sysinit из каталога /etc/rc.d. После этого процесс init
просматривает файл /etc/inittab и выполняет скрипты, соответствующие однопользовательскому
уровню (1 во втором поле строки), всем уровням (строки с пустым вторым полем) и уровню,
заданному по умолчанию. В строке, соответствующей уровню по умолчанию, вызывается скрипт rc
из каталога /etc/rc.d. Этот скрипт один и тот же для всех уровней (т.е. обязательно вызывается, на
какой бы уровень выполнения не загружалась система), только в зависимости от уровня
выполнения ему передается соответствующее значение параметра вызова, так что, например, для
3-го уровня вызов скрипта осуществляется строкой типа
l3:3:wait:/etc/rc.d/rc 3
Следующая важная функция, которую выполняет этот процесс (на уровнях со 2 по5)— запуск
шести виртуальных консолей (процессов getty), чтобы предоставить пользователям возможность
регистрироваться в системе с терминалов. Для этого init порождает процессы, именуемые gettyпроцессами (от "get tty"— получить терминал), и следит за тем, какой из процессов открывает
какой терминал. Каждый getty-процесс устанавливает свою группу процессов, используя вызов
системной функции setpgrp, открывает отдельную терминальную линию и обычно
приостанавливается во время выполнения функции open до тех пор, пока машина не получит
аппаратную связь с терминалом. Когда функция open возвращает управление, getty-процесс
исполняет программу login (регистрации в системе), которая требует от пользователей, чтобы они
идентифицировали себя указанием регистрационного имени и пароля. Если пользователь
зарегистрировался успешно, программа login, наконец, запускает командный процессор shell и
пользователь приступает к работе. Этот вызов shell именуется "login shell" (регистрационный shell,
регистрационный интерпретатор команд). Процесс, связанный с shell, имеет тот же
идентификатор, что и начальный getty-процесс, поэтому login shell является процессом,
возглавляющим группу процессов.
Если пользователь не смог успешно зарегистрироваться, программа регистрации завершается
через определенный промежуток времени, закрывая открытую терминальную линию, а процесс
32
init порождает для этой линии следующий getty-процесс, открывающий терминал, вместо
прекратившего существование.
После завершения загрузки init продолжает работать в фоновом режиме, отслеживая изменения в
состоянии системы. Например, если будет подана команда telinit, позволяющая изменить уровень
выполнения, процесс init обеспечит выполнение команд, заданных для нового уровня файлом
/etc/inittab. Этот файл прочитывается заново и в случае поступления сигнала HUP; эта особенность
избавляет от необходимости перезагружать систему для того, чтобы сделать изменения в
начальной конфигурации.
Таким образом, процесс начальной загрузки init постоянно находится в оперативной памяти и при
получении соответствующих сигналов повторно выполняет цикл чтения из файла /etc/inittab
инструкций о том, что нужно делать, причем этот набор инструкций различен для разных уровней
выполнения.
Когда суперпользователь останавливает систему (командой shutdown), именно init завершает все
другие исполняющиеся процессы, размонтирует все файловые системы и останавливает
процессор.
Основные конфигурационные файлы
В обычной ситуации процесс init помимо запуска процессов getty выполняет 2 основных действия:


запускает скрипт /etc/init.d/rc;
запускает скрипт rc из того же каталога с опцией, равной уровню выполнения
(обычно rc 3).
В файле /etc/init.d/rc содержатся команды инициализации системы, в том числе команды
установки системных переменных, загрузки таблиц раскладки клавиатуры (командой loadkeys) и
системного шрифта (команда consolechars), монтирования и проверки файловых систем, загрузки
модулей, задания предпочитаемой графической оболочки и т.д.
Прежде чем рассматривать функции, выполняемые скриптом rc, надо сказать несколько слов о
каталоге /etc/init.d. Этот каталог вообще играет важную роль в процессе загрузки, поскольку он
содержит основные скрипты (программы на языке командного процессора shell), служащие для
организации процесса загрузки.
Каталог /etc/init.d содержит следующий набор подкаталогов:









boot.d
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
init.d
Если вы просмотрите (например, с помощью команды ls -l) содержимое подкаталогов rcX.d, то
увидите, что в этих подкаталогах содержатся не файлы, а только ссылки на файлы скриптов,
33
находящиеся в других каталогах, а именно (за редким исключением), в каталоге /etc/rc.d/init.d.
Названия этих ссылок имеют имена, начинающиеся либо с буквы K, либо с буквы S. Подкаталог
init.d содержит по одному скрипту для каждой из возможных в системе служб (NFS, sendmail,
httpd и т.п.).
Теперь вспомним, что процесс init после скрипта rc.sysinit запускает скрипт rc с опцией, равной
заданному уровню выполнения. Этот скрипт предназначен в общем случае для перевода системы
из одного уровня выполнения на другой. В процессе начальной загрузки этот скрипт переводит
систему из однопользовательского режима на уровень, задаваемый по умолчанию. Общий
алгоритм работы rc состоит в следующем. При переходе на уровень X сначала просматривается
каталог rcX.d и для всех ссылок, которые начинаются на K, вызываются файлы, на которые идет
ссылка, с опцией stop, т.е. осуществляется останов соответствующих служб (которые не должны
работать на данном уровне выполнения). Затем запускаются службы, которые на данном уровне
выполнения должны быть запущены. Это осуществляется путем последовательного просмотра
ссылок, которые начинаются с символа S, и запуска соответствующих скриптов с опцией start. Из
сказанного ясно, что буквы (символы) S и K, с которых начинаются имена ссылок в подкаталогах
rcX.d, происходят от start и kill, соответственно. Заметим еще, что после S и K в именах ссылок
стоят двузначные номера, которые служат для задания порядка запуска скриптов.
Главные скрипты располагаются в директории /etc/init.d. Они выполняют всю работу и все
симлинки указывают на них. Симлинки для запуска и остановки указывают на скрипт в
директории /etc/rc.d/ с таким же именем. Поэтому скрипты могут быть вызваны с различными
параметрами, например start, stop, restart, reload, status. Когда скрипту передается аргумент stop,
то вызывается К симлинк. Когда скрипту передается аргумент start, то вызывается S симлинк.
Есть только одно исключение. симлинки начинающиеся с S в директориях rc0.d и rc6.d не могут
быть запущены никогда. Они могут бать вызваны только с параметром stop для остановки чего
либо. Логика состоит в том, что если вы перезапустили или остановили систему, вам не надо
запускать что либо, а только остановить систему.
Одна из последних ссылок вида SXXname, используемых скриптом rc на уровнях 2–5, является
ссылка на скрипт /etc/rc.d/rc.local. Как сказано в самом этом файле, этот скрипт выполняется после
всех других скриптов в процессе инициализации системы, поэтому если вы хотите, чтобы в
процессе загрузки были выполнены какие-то дополнительные команды или ваши персональные
настройки, то их целесообразно поместить именно сюда.
Тот вариант этого скрипта, который устанавливается из дистрибутива, выполняет очень
ограниченные задачи: выводит на экран логотип дистрибутива и формирует файлы /etc/issue и
/etc/issue.net, содержащие текст сообщений, выдаваемых пользователю при входе в систему.
Другие файлы, влияющие на процесс загрузки (SLES10)
Boot
Этот скрипт выполняет команды для старта системы независимо от выбранного уровня
выполнения. Если система загружается впервые после установки, скрипт инициализирует
начальную системную конфигурацию. Запускается демон blogd. Скрипт отвечает за установку
34
времени, проверку файловых систем и запуск всех сценариев в /etc/init.d/boot.d с именем,
которое начинает с S.
boot.local
Запускает дополнительные команды для выполнения до перехода на runlevel. Это напоминает
назначение AUTOEXEC.BAT в системах DOS.
boot.setup
Этот скрипт выполняется при переходе на любой другой runlevel и отвечает за множество базовых
установок, например, раскладка клавиатуры и т.п..
halt
Этот скрипт выполняется при переходе на runlevel 0 или 6. Выполняет действия для останова или
перезагрузки. Отключение системы или перезагрузка, действие зависит от выбранного runlevel.
rc
Этот сценарий определяет список стартовых и стоповых скриптов для выполнения перехода на
выбранный runlevel.
Кроме этих файлов на процесс загрузки (и, следовательно, формирующуюся в результате
конфигурацию системы), оказывают влияние те скрипты и отдельные программы, которые
вызываются из только что перечисленных файлов, а также некоторые чисто конфигурационные
файлы. Рассмотреть их все невозможно, но о некоторых необходимо упомянуть.
Все важнейшие общесистемные конфигурационные файлы расположены в каталоге /etc и его
подкаталогах. Приведем краткий список с указанием на роль некоторых из этих файлов в системе
и ссылки на то, где искать более подробную информацию.







/etc/grub.conf — файл, определяющий конфигурацию загрузчика grub.Если
используется загрузчик grub, то это файл /boot/grub/menu.lst ;
/etc/modprobe.conf или /etc/modules.conf)— файл, определяющий
конфигурацию загружаемых модулей ядра (см. man-страницу по modules.conf);
/etc/fstab— содержит информацию, необходимую для автоматического
монтирования файловых систем ;
/etc/passwd— различная регистрационная информация, включая пароли;
/etc/profile — глобальный файл профилей— устанавливает переменную $PATH
и другие важнейшие переменные; заглянув в него, вы увидите, что в нем
вызываются все файлы из подкаталога /etc/profile.d, в частности, файл,
задающий параметры локализации системы;
/etc/bashrc — глобальный файл конфигурации bash, устанавливает синонимы
(алиасы) и функции, и т.п.;
/etc/issue— содержит сообщение, выдаваемое на терминал перед входом в
систему (перед запросом имени и пароля); однако редактировать этот файл с
целью изменения текста сообщения не стоит, потому что сам он формируется
инициализационным скриптом /etc/rc.d/rc.local;
35


/etc/motd— устанавливает сообщение, выдаваемое пользователю после входа
в систему (после правильного ввода пароля);
/etc/redhat-release— содержит название и номер версии дистрибутива,
используется скриптом rc.local.
Перечисленные выше конфигурационные файлы оказывают влияние на процесс загрузки системы
и процесс входа в систему любого пользователя. Но существуют и такие файлы, которые влияют
только на процедуры входа в систему отдельного пользователя, позволяют создать для него
индивидуальную рабочую среду. Такие файлы будут рассмотрены в следующем разделе.
Процессы при регистрации пользователя
Последовательность событий при полной регистрации выглядит так.
1. Пользователь вводит регистрационное имя по приглашению login: процесса getty.
2. getty выполняет программу login, используя в качестве аргумента указанное имя.
3. login запрашивает пароль и сверяет имя и пароль с записанными в файле
/etc/passwd.
4. login выводит на экран из файла /etc/motd "сообщение дня".
5. login запускает интерпретатор shell, указанный в бюджете пользователя
иустанавливает переменную среды TERM.
6. shell выполняет соответствующие файлы запуска, после чего выводит на экран
приглашение и ожидает ввода информации.
О файлах запуска надо сказать несколько слов дополнительно. В домашнем каталоге
пользователя находятся несколько личных файлов конфигурации. Если таких файлов в домашнем
каталоге нет, то после входа в систему будут прочитаны глобальные файлы, содержащие значения
"по умолчанию". Если в качестве оболочки используется Bourne-shell, выполняется файл .profile,
если C-shell— .login и .cshrc, если Korn-shell— .profile и .kshrc (мы в дальнейшем рассматриваем
только случай оболочки bash).
Если вы хотите установить для себя переменные среды (PATH или другие), отличающиеся от тех,
которые по умолчанию задаются для всех пользователей, или вы хотите изменить сообщение,
которое будет выдаваться вам после входа в систему, или хотите, чтобы после того, как вы
войдете в систему, автоматически запускалась какая-то программа, вы можете сделать это с
помощью следующих файлов:
/home/your_home/.bashrc— устанавливает ваши алиасы (т.е. псевдонимы или альтернативные
имена команд, удобные для упрощения ввода часто используемых команд, имеющих
значительную длину из-за большого количества опций) и функции;
/home/your_home/.bash_profile или /home/your_home/.profile— устанавливает переменные
среды и запускает ваши программы.
Если такие файлы существуют (заметим, что это скрытые файлы), они будут считаны после входа в
систему, и команды, записанные в них, будут выполнены.
Если вы хотите, чтобы при входе пользователя в систему выполнялся какой-то скрипт, то можно
вызов этого скрипта поместить в файл ~/.profile. Это может сделать и сам пользователь.
36
Эти команды будут исполняться только при входе пользователя в систему. Можно, например,
приветствовать каждого пользователя по имени или посылать индивидуальные сообщения:
if test $USER = jim; then
echo 'Здравствуйте, уважаемый Jim!' fi
Загрузка в однопользовательском режиме
Процесс загрузки ОС, к сожалению, не всегда происходит так, как это задумано. Бывают случаи,
когда система отказывается загружаться нормальным образом. Основные причины, приводящие к
такой ситуации :





неисправности аппаратных средств;
дефектные блоки на диске, в частности, блоки, в которых находится программазагрузчик или ядро системы;
повреждения файловых систем;
неверно сконфигурированное ядро (например, при попытках установить
самостоятельно скомпилированную или экспериментальную версию ядра);
ошибки в сценариях запуска (появившиеся, например, из-за того, что вы внесли
в эти сценарии какие-то исправления).
Первое, что надо знать пользователю в таком случае— как войти в контакт с системой, заставить
ее воспринимать команды, чтобы попытаться что-то исправить. Один из возможных вариантов
действий в этом случае— попытаться запустить систему в однопользовательском режиме, т.е. с
уровнем выполнения 1 .
Обычно о необходимости перехода в однопользовательский режим говорит то, что fsck не может
автоматически восстановить файловую систему при загрузке. В таких случаях бывает необходимо
запустить fsck в разделе /usr, для чего требуется, чтобы раздел был размонтирован, а этого нельзя
сделать, пока не будут отключены почти все системные службы. Тут-то и требуется перейти в
однопользовательский режим, в котором запускается минимум служб и сервисов системы.
Вы можете заставить процесс init загрузить систему в однопользовательском режиме, если
зададите в командной строке загрузки ядра (в поле параметров загрузки grub) ввведите «1» и
вместо процесса init запустится bash и даже не спросит пароля.
По умолчанию ядро начинает процесс init, но мы можем это изменить.
GNU GRUB
Загрузчик операционной системы - это программа, расположенная в первых секторах жесткого
диска (далее просто загрузчик), например в MBR (главная загрузочная запись) жесткого диска.
После теста системы, в момент загрузки, BIOS (базовая система ввода-вывода) передает
управление MBR, если система настроена для загрузки из неё. Затем программа, расположенная
в MBR начинает выполняться. Эта программа называется загрузчиком, её задача - передать
управление ядру операционной системы, которое продолжит загрузку.
Существуют несколько загрузчиков, включая GNU GRUB (универсальный загрузчик), Boot manager,
LILO (загрузчик ОС Linux), NTLDR (загрузчик Windows NT систем) и другие. Я решил описать GNU
GRUB и как его использовать.
37
GRUB - это очень мощный загрузчик, который может загружать разнообразные операционные
системы, такие как Windows, DOS, Linux, GNU Hurd, *BSD и другие. В данное время LILO является
самым популярным загрузчиком, используемым почти всеми c мультизагрузочными системами.
Но если Вы используете LILO, то не должны забывать перезапускать LILO каждый раз, когда вы
меняете конфигурацию или инсталлируете новое ядро. Также LILO не такой гибкий как GRUB.
GRUB - это второе имя гибкости. Его последняя версия- 0.5.96.1. Эта версия поддерживает такие
файловые системы, как ext2 (используемая ОС Linux), FAT16 и FAT32 (используемые Win9x и
WinME), FFS (быстрая файловая система, используемая *BSD UNIX), ReiserFS (журналируемая
файловая система, разработанная для ОС Linux и интегрированная в ядро Linux 2.4.1) и minix
(старая файловая система, разработанная для ОС MINIX, используемая также в ранних версиях ОС
Linux). С GRUB Вы можете "видеть" содержимое файловой системы без загрузки операционной
системы. Например, если Вы хотите посмотреть дату и время, записанные в файле, но не имеете
времени для загрузки операционной системы, то можете использовать командную строку GRUB
("grub>") и написать:
grub> cat (partition number)/home/god/filename.txt
Вы получите полное содержимое файла, включая дату и время. Самая большая польза загрузчика
GRUB в том, что он может загрузить любое ядро из любого раздела диска. Например, если Вы
забыли добавить недавно откомпилированное ядро в список, компьютер должен нормально
загрузиться, добавить его в список и перезагрузиться, чтобы его использовать. Но Вы можете
легко использовать командную строку загрузчика GRUB и загрузить нужное ядро.
Конфигурация GRUB
В этой секции мы рассмотрим, как загружать разные операционные системы и составить
menu.conf - конфигурационный файл меню.
Давайте начнем с процедуры загрузки, поддерживаемой GRUB. Загрузка может быть выполнена
двумя путями:
1. Передача управления ядру ОC
2. Передача управления другому загрузчику
Загрузочная процедура по первому методу:
1. Указать корневое устройство или корневую файловую систему.
2. Указать GRUB место нахождения ядра системы и параметры.
3. Перезагрузить компьютер и испробовать это.
У меня ядро Linux находится в каталоге /boot под названием bzImage, а корневая файловая
система - /dev/hda5 или (hd0,4) в GRUB.
Следовательно, моя процедура загрузки выглядит следующим образом:
1. root (hd0,4) [Указывает корневой раздел]
2. kernel /boot/bzImage root=/dev/hda5 [Указывает ядро]
3. boot [Начинает загрузку Linux]
Загрузочная процедура по второму методу подразумевает наличие другого загрузчика, например
LILO или NTLDR, установленного в один из разделов жесткого диска:
1. Указать корневой раздел, но не монтировать его.
38
2. Активировать раздел
3. Указать первый сектор устройства, которому будет передано управление.
4. Перезагрузить компьютер и испробовать это.
Приведу пример с ОС Windows, проинсталлированной в /dev/hda1 или (hd0,0). процедура
загрузки Windows следующая:
5.
6.
7.
8.
rootnoverify (hd0,0)
makeactive
chainloader +1 [+1 указывает первый сектор текущего основного раздела]
boot [передает контроль]
menu.conf файл используется для загрузки различных операционных систем и конфигурации
меню. Составить menu.conf файл не сложно. Как Вы увидите в этом разделе, в нем используется
текст на английском языке.
Все записи меню начитаются с "title TITLENAME" без запятых. Вы можете присвоить TITLENAME что
угодно.
Для создания меню загрузки Linux:
1.
2.
3.
4.
Установите title.
Установите корневой раздел.
Установите ядро и параметры.
Загрузитесь.
Для создания работающего меню:
title Debian GNU/Linux 2.2 kernel 2.4.1
root (hd0,4)
kernel /boot/bzImage.2.4.1
boot
#---(Символ (#) в начале строки обозначает комментарий.)
Чтобы создать меню для Windows или DOS:
title Windows
rootnoverify (hd0,0)
makeactive
chainloader +1
boot
#---А что если Вы хотите установить на ваш компьютер два экземпляра операционной системы
Windows, одну лично для себя, другую для своей семьи, а Windows при установке сообщает, что
уже один экземпляр ОС установлен ?
Существует легкий путь инсталляции двух экземпляров ОС на Ваш компьютер путем скрытия
одного из разделов жесткого диска в момент загрузки и использования другого. При этом Вы
можете защитить раздел паролем, так что никто не сможет использовать его по ошибке. Ниже
39
приведен пример, как создать несколько экземпляров ОС Windows, hda1 и hda2 или (hd0,0) и
(hd0,1), используя команды lock, password, hide и unhide.
Для ОС Windows "My Entry":
title My Entry
lock
unhide (hd0,0)
hide (hd0,1)
rootnoverify (hd0,0)
makeactive
chainloader +1
boot
#---Для эффективного использования команды lock Вы должны указать команду password в начале
конфигурационного файла. Синтаксис команды password следующий: password secret ("secret" это пароль). Вы можете ввести пароль в любое время с помощью нажатия клавиши p.
Для ОС Windows "Family Entry":
title Family Entry
unhide (hd0,1)
hide (hd0,0)
rootnoverify (hd0,1)
makeactive
chainloader +1
boot
---Любой может загрузиться с этих разделов, если не требуется пароль. Существует ещё один
интересный трюк с использованием команды password. Для скрытия элементов в списке
конфигурационного файла по умолчанию, Вы можете загрузить собственный список, используя
следующую команду:
password secret
/boot/grub/secret-list.conf В этой команде "secret" - это пароль, а /boot/grub/secret-list.conf - это
файл паролей. Перед тем, как делать это, Вы должны установить корневой раздел и полный путь.
Например:
password secret (hd0,4)/boot/grub/secret-list.conf
Ещё одной важной командой является команда "map", которую Вы можете использовать, когда у
Вас есть два жестких диска и операционная система, которая не может загружаться со второго
диска, например ОС Windows. Вы можете отобразить hd0 как hd1 и hd1 как hd0. Другими словами,
можно виртуально переставлять жесткие диски.
Пример:
40
grub> map (hd0) (hd1)
grub> map (hd1) (hd0)
Для загрузки ОС FreeBSD:
title FreeBSD 4.0
root (hd0,4,a)
kernel /boot/loader
boot
#---Здесь мы передаем управление загрузчику ОС FreeBSD. Вы видите, что корневой раздел (hd0,4,a)
включает три аргумента, это потому, что
FreeBSD виртуально делит существующий раздел жесткого диска. Мы
передаем управление корневому подразделу раздела жесткого диска "a". Если FreeBSD
полностью занимает диск вашей системы, тогда корневой подраздел будет называться (hd0,a).
Итак, мы передаем управление загрузчику FreeBSD, что намного лучше, чем передать управление
непосредственно ядру этой ОС по ряду причин.
(ПРИМЕЧАНИЕ: ОС OpenBSD и GNU/Hurd ещё не тестировались, рекомендую использовать
передачу управления загрузчикам этих ОС вместо ядра).
Вы ознакомились с базовой инсталляцией пакета GRUB, непосредственно загрузчика, а так же
базовой конфигурацией. Чем больше Вы будете узнавать GRUB, тем больше будете находить его
самым мощным средством управления загрузкой.
Различные команды GRUB:
default xx
xx - это метка для загрузки по умолчанию.
timeout yy
yy - это таймаут, после которого GRUB начнет загрузку по умолчанию.
fallback zz
zz - это метка для загрузки, которую GRUB станет загружать, если по истечении таймаута не
удастся загрузить метку по умолчанию.
color
Используется для раскраски меню. Синтаксис следующий: color normal current_selection. Оба поля
могут иметь два значения, такие как приоритетный и фоновый цвета.
Например:
color green/black or light-gray/blue
Вы также можете использовать соответствующие номера.
ЗАПОМНИТЕ: все значения начинаются с 0, следовательно, 0 - первый элемент.
41
Файловая система
Теперь, когда вы научились запускать Linux и завершать работу с этой системой, надо
познакомиться с устройством одной из основных ее частей — файловой системы. Файловая
система — это структура, с помощью которой ядро операционной системы предоставляет
пользователям (и процессам) ресурсы долговременной памяти системы, т. е. памяти на
различного вида долговременных носителях информации — жестких дисках, магнитных лентах.
CD-ROM и т. п.
Подобно луне, которая обращена к нам всегда одной стороной, файловая система тоже обращена
к пользователю (может быть, лучше сказать — к приложениям) постоянно одной стороной. С этой,
видимой для пользователей стороны, файловая система выглядит как логическая структура
каталогов и файлов. Но у нее есть и другая сторона, обращенная к носителям, образующая
внутреннее (с точки зрения пользователя) устройство файловой системы. Эта невидимая сторона
файловой системы устроена далеко не просто. Дело в том, что она реализует механизмы записи
файлов на различные носители, алгоритмы доступа (выборки нужной информации) и многое
другое.
Файлы
Компьютер есть не что иное, как инструмент для обработки информации. А информация в любой
ОС хранится на носителях в виде файлов. С точки зрения ОС файл представляет собой
непрерывный поток (или последовательность) байтов определенной длины. Внутренний формат
файла операционную систему не интересует. Но ОС должна дать файлу какое-то имя, с помощью
которого пользователь, а точнее, программы-приложения, будут обращаться к файлу. Как
организовать это обращение — дело файловой системы, пользователя это чаще всего не
интересует. Поэтому с точки зрения пользователя файловая система выглядит как логическая
структура каталогов и файлов.
Имена файлов в Linux могут иметь длину до 255 символов и состоять из любых символов, кроме
символа с кодом 0 и символа / (слэша). Однако имеется еще ряд символов, которые имеют в
оболочке shell специальное значение и которые поэтому не рекомендуется включать в имена. Это
следующие символы:
! @ # $ & ~ % * ( ) [ ] { } ' " \ : ; > < ` пробел.
Если имя файла содержит один из этих символов (это не рекомендуется, но возможно), то вы
должны перед этим символом поставить символ обратного слэша "\" (в том числе и перед самим
этим слэшем, т. е. повторить его дважды).
mkdir \\my\&his
Можно также заключить имя файла или каталога с такими символами в двойные кавычки.
Например, для создания каталога с именем "My old files" следует использовать команду:
[user]$ mkdir "My old files"
так как команда
[user]$ mkdir My old files
создаст каталог с именем "My".
42
Аналогичным образом можно поступать и с другими символами, перечисленными выше, т. е. их
можно включать в имена файлов, если имя файла взять в двойные кавычки или отменить
специальное значение символа с помощью обратного слэша. Но все же предпочтительнее не
использовать эти символы, включая пробел, в именах файлов и каталогов, потому что могут
возникнуть проблемы при обращении к таким файлам из некоторых приложений, а также при
переносе таких файлов в другие файловые системы.
Но к точке сказанное не относится, и в Linux часто ставят более одной точки в именах файлов,
например, This_is.a.forth-chapter_of_my_book.about.Linux. При этом теряет смысл такое понятие
(принятое в DOS), как расширение имени файла, хотя все же часто последние части имени,
отделенные точками, используют для обозначения файлов каких-то особых типов (например,
.tar.gz используется для обозначения сжатых архивов). Но исполняемые и неисполняемые файлы
в Linux распознаются не по расширениям имен файлов. Для этого существуют другие признаки, о
которых мы скажем чуть позже. Точка имеет особое значение в именах файлов. Если она является
первым символом имени, то данный файл считается скрытым для некоторых команд, например,
он не показывается при выполнении команды ls.
В Linux различаются символы верхнего и нижнего регистра в именах файлов. Поэтому
FILENAME.tar.gz и filename.tar.gz вполне могут существовать одновременно и являться именами
разных файлов.
Каждому файлу в Linux соответствует так называемый "индексный дескриптор" файла, или
"inode", (однозначного перевода этого термина на русский язык не существует, в разных книгах
эту структуру называют по-разному). Именно индексный дескриптор содержит всю необходимую
файловой системе информацию о файле, включая информацию о расположении частей файла на
носителе, типе файла и многое другое. Индексные дескрипторы файлов содержатся в
специальной таблице (inode table), которая создается при создании файловой системы на
носителе. Каждый логический и физический диск имеет собственную таблицу индексных
дескрипторов. Дескрипторы в этой таблицы пронумерованы последовательно, и именно номер
дескриптора файла является его истинным именем в системе (этот номер мы будем называть
индексом файла). Однако для человека такая система имен неудобна. Сможете ли вы вспомнить,
что сохранили в файле с номером 56734? Поэтому файлам даются еще "человеческие" имена, и
помимо этого файлы группируются в каталоги.
Приведенная выше информация нужна здесь только для того, чтобы сказать, что имя любого
файла в Linux является ни чем иным, как ссылкой на индексный дескриптор файла. Поэтому
каждый файл может иметь сколько угодно разных имен. Эти имена называют еще "жесткими"
ссылками. Когда вы удаляете файл, имеющий несколько разных имен — жестких ссылок, то
фактически удаляется только одна ссылка — та, которую вы указали в команде удаления файла.
Даже когда вы удаляете последнюю ссылку, это еще может не означать удаления содержимого
файла — если файл еще используется системой или каким- то приложением, то он сохраняется до
тех пор, пока он не "освободится".
Для того, чтобы дать файлу (или каталогу) дополнительное имя (создать жесткую ссылку),
используется команда ln в следующем формате:
ln имя_существующего_файла новое_имя
43
Пример:
[user]$ ln /home/howto/font-HOWTO-ru/Font-HOWTO.html ~/fonts.html
(специальный символ ~ здесь и вообще в системе означает домашний каталог пользователя, о
котором будет сказано чуть дальше). Теперь можно вместо длинного имени /home/howto/fontHOWTO-ru/Font-HOWTO.html использовать просто ~/fonts.html. Подробнее о команде ln вы
можете прочитать на странице интерактивного руководства man.
Число жестких ссылок на файл (т. е. разных имен файла) можно узнать, выполнив команду ls с
параметром – l. Сразу за перечислением прав доступа к файлу следует число, которое и
обозначает число жестких ссылок на файл:
[user]# ls -l total 9
drwxr-xr-x 2 user users 1024 Jul 1 2000 Autostart
-rw-r--r-- 1 user users 230 Sep 14 1999 Printer.kdelnk
-rw-r--r-- 1 user users 159 Sep 15 1999 Red Hat
Каталоги
Если бы файловая структура не позволяла использовать ничего кроме просто имен файлов, даже
сколь угодно длинных (т. е. все файлы располагались бы в одном общем списке), то обращаться к
ним было бы чрезвычайно трудно. Вообразите себе список из нескольких тысяч файлов! Поэтому
файлы группируются в каталоги, которые, в свою очередь, могут быть включены в другие
каталоги. В результате получается иерархическая структура каталогов, начинающаяся с корневого
каталога. Каждый (под)каталог может содержать как отдельные файлы, так и подкаталоги.
Иерархическую структуру каталогов обычно иллюстрируют рисунком "дерева каталогов", в
котором каждый каталог изображается узлом "дерева", а файлы — "листьями". В MS Windows или
DOS каталоговая структура строится отдельно для каждого физического носителя (т. е., имеем не
отдельное "дерево", а целый "лес") и корневой каталог каждой каталоговой структуры
обозначается какой-нибудь буквой латинского алфавита (отсюда уже возникает некоторое
ограничение). В Linux (и UNIX® вообще) строится единая каталоговая структура для всех
носителей, и единственный корневой каталог этой структуры обозначается символом "/". В эту
единую каталоговую структуру можно подключить любое число каталогов, физически
расположенных на разных носителях (как говорят, "смонтировать файловую систему" или
"смонтировать носитель").
Имена каталогов строятся по тем же правилам, что и имена файлов. И, вообще, каталоги в
принципе ничем, кроме своей внутренней структуры (до которой ОС уже есть дело) не отличаются
от "обычных" файлов, например, текстовых.
Полным именем файла (или путем к файлу) называется список имен вложенных друг в друга
подкаталогов, начинающийся с корневого каталога и оканчивающийся собственно именем файла.
При этом имена подкаталогов в этом списке разделяются тем же символом "/", который служит
для обозначения корневого каталога. Например, на моем компьютере /home/
kos/ve/book/filesystem1.htm является полным именем того файла, в котором я сохранил первый
вариант данного текста.
44
В каждый момент времени пользователь работает с одним экземпляром оболочки shell и эта
оболочка хранит значение так называемого "текущего" каталога, т. е. того каталога, в котором
пользователь сейчас работает. Имеется специальная команда, которая сообщает вам значение
текущего каталога — pwd.
Примечание
Если быть более точным, то следует сказать, что текущий каталог — это понятие, относящееся к
каждому запущенному в системе процессу (в частности к оболочке); поэтому иногда запуск какойто программы в shell может привести к тому, что после завершения работы этой программы
текущий каталог сменится.
Кроме текущего каталога для каждого пользователя определен еще его "домашний каталог" —
каталог, в котором пользователь имеет все права: может создавать и удалять файлы, менять права
доступа к ним и т. д. В каталоговой структуре Linux домашние каталоги пользователей обычно
размещаются в каталоге /home и имеют имена, совпадающие с именем пользователя. Например,
/home/jim. Каждый пользователь может обратиться к своему домашнему каталогу с помощью
значка ~, т. е., например, пользователь jim может обратиться к каталогу /home/jim/doc как к ~/doc.
Когда пользователь входит в систему, текущим каталогом становится домашний каталог данного
пользователя.
Для изменения текущего каталога служит команда cd. В качестве параметра этой команде надо
указать полный или относительный путь к тому каталогу, который вы хотите сделать текущим.
Понятие полного пути уже было пояснено, а понятие относительного пути требует
дополнительного пояснения. Относительным путем называется перечисление тех каталогов, то
другому каталогу (назовем его целевым). Если целевой каталог, т. е. каталог, который вы хотите
сделать текущим, расположен ниже текущего в структуре каталогов, то сделать это просто: вы
указываете сначала подкаталог текущего каталога, затем подкаталог того каталога и т. д., вплоть
до имени целевого каталога. Если же целевой каталог расположен выше в каталоговой структуре,
или вообще на другой "ветви" дерева, то ситуация несколько сложнее. Конечно, можно было бы
пользоваться полным путем, но тогда придется записывать очень длинные маршруты.
Эта трудность преодолевается следующим образом. Для каждого каталога (кроме корневого) в
дереве каталогов однозначно определен "родительский каталог". В каждом каталоге имеются две
особых записи. Одна из них обозначается просто точкой и является указанием на этот самый
каталог, а вторая запись, обозначаемая двумя точками, — указатель на родительский каталог. Эти
имена из двух точек и используются для записи относительных путей. Чтобы сделать текущим
родительский каталог, достаточно дать команду
[user]$ cd ..
А чтобы перейти по дереву каталогов на два "этажа" вверх, откуда спуститься в подкаталог
kat1/kat2 надо дать команду
[user]$ cd ../../kat1/kat2
Команда ls служит для вывода на экран списка имен файлов и подкаталогов текущего каталога.
Нужно отметить, что фактически команда ls просто выводит содержимое файла, который
описывает данный каталог, и не происходит никаких обращений к самим файлам. Любой каталог,
45
как уже говорилось, — это обычный файл, в котором перечислены все файлы и подкаталоги этого
каталога.
Примечание
Задумайтесь, кстати: нет никаких особых "ящиков с файлами", есть просто файлы-списки, которые
причисляют данный файл к определенному каталогу.
Если дать команду ls без параметров, то выводятся только имена файлов текущего каталога. Если
нужно просмотреть содержимое не текущего, а какого-то другого каталога, надо указать команде
ls полный или относительный путь к этому каталогу.
Кроме имени файла (или подкаталога) запись о нем в соответствующем каталоге содержит еще
массу информации об этом файле. Для того, чтобы получить эту информацию, надо использовать
дополнительные параметры команды ls. Если дать команду ls с параметром - l, то будут выданы
не только имена файлов, но также данные о правах доступа к файлу (подробнее о правах будет
рассказано ниже), количество жестких ссылок или имен файла (для каталога указывается число
дополнительных блоков). , имя владельца файла и группы файла, его размер и дата последней
модификации. Вот небольшой пример.
[user]$ ls -l итого 1171
drwxrwxr-x 2 kos kos 1024 Jun 20 22:42 NotR
drwx------ 2 kos kos 1024 Jun 27 21:02 Star
-rw-rw-r-- 1 kos kos 17351 Nov 2 23:59 arch.htm
-rw-rw-r-- 1 kos kos 19847 Dec 11 20:23 contents.htm
-rw-rw-r-- 1 kos kos 48866 Nov 2 23:59 edit.htm
-rw-rw-r-- 1 kos kos 38867 Dec 12 20:58 filesystem1.htm
-rw-rw-r-- 1 kos kos 29545 Dec 11 20:23 first_start.htm drwxr-xr-x 3
kos kos 2048 Sep 24 21:33 img
-rw-rw-r-- 1 kos kos 21590 Dec 11 19:42 init.htm drwxrwxr-x 2 kos kos
1024 Sep 27 22:35 pic
-rw-rw-r-- 1 kos kos 11084 Nov 8 21:26 preface.htm
Если дополнительно задать параметр -i, то в первой колонке будут отображены индексы файлов
(номера соответствующих inode). При задании параметра -t сортировка файлов будет
производиться не по именам, а по времени модификации файла. Задание параметра -u приводит
к тому, что вместо времени модификации файла будет выводиться время последнего доступа к
файлу. Параметр -r меняет порядок сортировки на обратный (используется вместе с параметрами
-l и -t). Заметим еще, что параметры можно перечислять как отдельно:
[user]$ ls -l -i — r так и объединять: [user]$ ls -lir
Типы файлов
В предыдущих разделах мы рассмотрели два типа файлов: обычные файлы и каталоги. Но в Linux
существует еще несколько типов файлов. С ними мы познакомимся в этом разделе.
Как уже было сказано, с точки зрения операционной системы файл представляет собой просто
поток байтов. Такой подход позволяет распространить концепцию файла на физические
46
устройства и некоторые другие объекты. Это позволяет упростить организацию данных и обмен
ими, потому что аналогичным образом осуществляется запись данных в файл, передача их на
физические устройства и обмен данными между процессами. Во всех этих случаях используется
один и тот же подход, основанный на идее байтового потока. Поэтому наряду с обычными
файлами и каталогами, файлами с точки зрения Linux являются также:




файлы физических устройств;
именованные каналы (named pipes);
сокеты (sockets);
символические ссылки (symlinks).
Файлы физических устройств
Как уже говорилось, с точки зрения ОС Linux, все подключаемые к компьютеру устройства
(жесткие и съемные диски, терминал, принтер, модем и т. д.), представляются файлами. Если,
например, надо вывести на экран какую-то информацию, то система как бы производит запись в
файл /dev/tty01.
Физические устройства бывают двух типов: символьными (или байт-ориентированными) и
блочными (или блок-ориентированными). Различие между ними состоит в том, как производится
считывание и запись информации в эти устройства. Взаимодействие с символьными устройствами
производится посимвольно, в режиме потока байтов. К таким устройствам относятся, например,
терминалы. На блок-ориентированных устройствах информация записывается (и, соответственно,
считывается) блоками. Примером устройств этого типа являются жесткие диски. На диск
невозможно записать или считать с него один байт: обмен с диском производится только
блоками.
Взаимодействием с физическими устройствами в Linux управляют драйверы устройств, которые
либо встроены в ядро, либо подключаются к нему как отдельные модули. Для взаимодействия с
остальными частями операционной системы каждый драйвер образует коммуникационный
интерфейс, который выглядит как файл. Большинство таких файлов для различных устройств как
бы "заготовлены заранее" и располагаются в каталоге /dev.
Если вы заглянете в каталог /dev, то увидите там огромное количество файлов физических
устройств. ("Заглянуть в каталог" означает выполнить последовательно две команды cd и ls.) В
табоицеОшибка! Источник ссылки не найден. приведена небольшая справка по именам
наиболее часто используемых специальных файлов.
47
Имя
Значение
/dev/console Системная консоль, т.е. монитор и клавиатура, физически подключенные к
компьютеру
/dev/hd
Жесткие диски с IDE-интерфейсом. Устройство /dev/hda1 соответствует
первому разделу на первом жестком диске (/dev/hda), т.е. на диске,
подключенном как Primary Master
/dev/sd
Жесткие диски с SCSI-интерфейсом
/dev/fd
/dev/tty
/dev/pty
/dev/ttS
/dev/cua
/dev/null
Файлы дисководов для гибких дисков. Первому дисководу соответствует
/dev/fd0, второму /dev/fd1
Файлы поддержки пользовательских консолей. Название сохранилось с тех
пор, когда к системе UNIX® подключались телетайпы в качестве терминалов.
В Linux эти файлы устройств обеспечивают работу виртуальных консолей
(переключаться между которыми можно с помощью <Alt>+<F1>—
<Alt>+<F6>)
Файлы поддержки псевдо-терминалов. Применяются для удаленных
рабочих сессий с использованием telnet
Файлы, обеспечивающие работу с последовательными портами. /dev/ttS0
соответствует COM1 в MS-DOS, /dev/ ttS1— COM2. Если ваша мышь
подключается через последовательный порт, то /dev/mouse является
символической ссылкой на соответствующий /dev/ttSN
Специальные устройства для работы с модемами
Это устройство— просто черная дыра. Все, что записывается в /dev/null,
навсегда потеряно. На это устройство можно перенаправить вывод
ненужных сообщений. Если /dev/null используется как устройство ввода, то
оно ведет себя как файл нулевой длины
Каждому типу устройств в системе может соответствовать несколько файлов устройств. Поэтому
файлы устройств характеризуются двумя номерами: старшим и младшим. Старший номер
устройства говорит ядру о том, к какому драйверу относится данный файл, а младший номер
показывает, к какому именно устройству данного типа следует обращаться.
Для файлов устройств команда ls -l вместо размера файла выдает старший и младший номера
данного устройства.
Более подробную информацию об устройствах можно найти здесь:
less /usr/src/linux/Documentation/devices.txt
man MAKEDEV
Как написано в /usr/src/linux/Documentation/devices.txt, может понадобиться создание некоторых
символьных ссылок на файлы устройств для настройки системы. Это - не рекомендация, а просто
практический совет. Если ссылки существуют, то они используются для следующих целей:
/dev/mouse Используемый порт мыши
/dev/tape
Используемое tape устройство
48
/dev/cdrom Используемое CD-ROM устройство
/dev/cdwriter
Используемое
/dev/cdrecorder)
/dev/scanner
CD-writer
устройство
(RedHat
использует
Используемый сканер.
/dev/modem Используемый порт модема
/dev/root
Используемая корневая файловая система
/dev/swap Используемое swap устройство
Например, если у меня будут проблемы с мышью, я буду делать что-то вроде этого (под root):
ls -l /dev/mouse
[посмотреть, присутствует ли устройство mouse и куда оно указывает]
ln -s /dev/ttyS0 /dev/mouse
[создать символьную ссылку - теперь /dev/mouse ссылается на первый последовательный порт]
Для SCSI (и ATAPI) устройств, /dev/tape и /dev/cdrom должны ссылаться на "cooked"- устройства
(/dev/st* and /dev/sr*, соответственно), а /dev/cdwriter и /dev/scanner должны ссылаться на
соответствующие SCSI устройства (/dev/sg*).
В /dev могут находиться непереходные сокеты и именованные pipes (Non-transient sockets and
named pipes). Основные приведены здесь:
/dev/printer socket локальный сокет lpd
/dev/log
socket локальный сокет syslog
/dev/gpmdata socket gpm mouse multiplexer
Именованные каналы (pipes)
Еще один тип специальных файлов — именованные каналы, или буферы FIFO (First In — First Out).
Файлы этого типа служат в основном для того, чтобы организовать обмен данными между
разными приложениями (pipe переводится с английского как труба).
Канал — это очень удобное и широко применяемое средство обмена информацией между
процессами. Все, что один процесс помещает в канал, другой может оттуда прочитать. Если два
процесса, обменивающиеся информацией, порождены одним и тем же родительским процессом
(а так чаще всего и происходит), канал может быть неименованным. В противном случае
требуется создать именованный канал, что можно сделать с помощью программы mkfifo. При
этом собственно файл именованного канала участвует только в инициации обмена данными.
mkfifo fifo1
Наблюдаем за содержимым:
tail -f fifo1
В другой консоли
echo 123 > fifo1 echo 567 > fifo1
Сокеты (sockets)
Сокеты — это соединения между процессами, которые позволяют им взаимодействовать, не
подвергаясь влиянию других процессов. Вообще сокеты (и взаимодействие программ при
49
помощи гнезд) играют очень важную роль во всех UNIX®-системах, включая и Linux: они являются
ключевым понятием TCP/IP и соответственно на них целиком строится Интернет. Однако с точки
зрения файловой системы сокеты практически неотличимы от именованных каналов: это просто
метки, позволяющие связать несколько программ. После того как связь установлена, общение
программ происходит без участия файла сокета: данные передаются ядром ОС непосредственно
от одной программы к другой.
Несмотря на то, что другие процессы могут видеть файлы гнезд как элементы каталога, процессы,
не участвующие в данном конкретном соединении, не могут осуществлять над файлами гнезд
операции чтения/записи. Среди стандартных средств, использующих сокеты — система X Window,
система печати и система syslog.
Символические ссылки
В разделе об именах файлов уже говорилось о том, что файл в Linux может иметь несколько имен
или "жестких ссылок".
Жесткая ссылка является просто еще одним именем для исходного файла. Она прописывается в
индексном дескрипторе исходного файла. После создания жесткой ссылки невозможно
различить, где исходное имя файла, а где ссылка. Если вы удаляете один из этих файлов (точнее
одно из этих имен), то файл еще сохраняется на диске (пока у него есть хоть одно имя-ссылка).
Очень трудно различить первоначальное имя файла и позже созданные жесткие ссылки на него.
Поэтому жесткие ссылки применяются там, где отслеживать различия и не требуется. Одно из
применений жестких ссылок состоит в том, чтобы предотвратить возможность случайного
удаления файла.
Особенностью жестких ссылок является то, что они прямо указывают на номер индексного
дескриптора, а, следовательно, такие имена могут указывать только на файлы внутри той же
самой файловой системы (т. е., на том же самом носителе, на котором находится каталог,
содержащий это имя).
Но в Linux имеется другой тип ссылок, так называемые символические ссылки. Эти ссылки тоже
могут рассматриваться как дополнительные имена файлов, но в то же время они представляются
отдельными файлами — файлами типа символических ссылок. В отличие от жестких ссылок
символические ссылки могут указывать на файлы, расположенные в другой файловой системе,
например, на монтируемом носителе, или даже на другом компьютере. Если исходный файл
удален, символическая ссылка не удаляется, но становится бесполезной. Используйте
символические ссылки в тех случаях, когда хотите избежать путаницы, связанной с применением
жестких ссылок.
Создание любой ссылки внешне подобно копированию файла, но фактически как исходное имя
файла, так и ссылка указывают на один и тот же реальный файл на диске. Поэтому, например,
если вы внесли изменения в файл, обратившись к нему под одним именем, вы обнаружите эти
изменения и тогда, когда обратитесь к файлу по имени-ссылке. Для того, чтобы создать
символическую ссылку, используется уже упоминавшаяся команда ln с дополнительной опцией -s:
ln -s имя_файла_или_каталога имя_ссылки
Пример:
50
[user]$ ln -s /home/kos/ve/HOWTO/font-HOWTO-ru/ ~/FONTS
После выполнения такой команды в моем домашнем каталоге появился подкаталог FONTS. Если
теперь мы просмотрим список файлов в каталоге /home/kos с помощью команды ls - l, то среди
прочих увидим такую строку:
lrwxrwxrwx 1 kos kos 31 Dec 13 21:13 FONTS -> /home/kos/ve/HOWTO/fontHOWTO-ru/
Обратите внимание на самый первый символ в этой строке: он показывает, что данная запись
соответствует символической ссылке. Впрочем, это видно и в поле имени, где после нового имени
и стрелки указано исходное имя файла (в данном случае — каталога).
Если вы создали в каталоге kat1 символическую ссылку, которая указывает на какой-то другой
каталог, то вы можете переместить каталог kat1 куда угодно, символическая ссылка при этом
будет оставаться корректной. Точно так же можно перемещать сами символические ссылки. Но
остерегайтесь использовать ".." (т. е. ссылку на родительский каталог) в полных именах файлов,
включающих символические ссылки, поскольку по символической ссылке нельзя проследовать в
обратном направлении, а ".." всегда означает истинный родительский каталог данного каталога.
Информацию о файле можно получить командой file.
Примеры:
file /etc/fstab
/etc/fstab: ASCII text
file dcom95.exe
dcom95.exe: MS-DOS executable PE for MS Windows (GUI) Intel 80386 32bit, MS CAB- Installer self-extracting archive
file /bin/bash
/bin/bash: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV),
for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for
GNU/Linux 2.6.9, stripped
file /opt/cxoffice/bin/cxtcl
/opt/cxoffice/bin/cxtcl:
version 1 (SYSV), for
ELF
32-bit
LSB
executable,
Intel
80386,
GNU/Linux 2.0.30, dynamically linked (uses shared libs), for GNU/Linux
2.0.30, stripped
Inode
Каждому объекту файловой системы назначен уникальный индекс, называемый номером инода.
Это может показаться банальным, но понятие инодов очень важно для понимания большинства
операций в файловой системе. Рассмотрим например ссылки "." и "..", которые появляются в
каждой директории. Чтобы полностью понять, чем на самом деле является директория "..", мы
сперва взглянем на номер инода у /usr/local:
$ ls -id /usr/local
5120 /usr/local
51
У директории /usr/local номер инода равен 5120. А теперь посмотрим номер инода у
/usr/local/bin/..:
$ ls -id /usr/local/bin/..
5120 /usr/local/bin/..
Как видно, директория /usr/local/bin/.. имеет такой же номер, как у /usr/local! Посмотрим, как
можно справиться с этим шокирующим откровением. В прошлом мы полагали, что /usr/local сама
является директорией. Теперь же, мы обнаружили, что фактически директория — это инод с
номером 5120, и нашли, по меньшей мере, два элемента (называемых «ссылками»), которые
указывают на данный инод. И /usr/local, и /usr/local/bin/.. — ссылки на 5120-ый инод. Хотя этот
инод и существует только в одном месте на диске, тем не менее на него может быть множество
ссылок.
На самом деле, мы даже можем увидеть общее количество ссылок ведущих на этот, 5120 инод,
используя команду ls -dl:
$ ls -dl /usr/local
drwxr-xr-x
8 root
root
240 Dec 22 20:57 /usr/local
Если взглянуть на вторую колонку слева, то видно, что на директорию /usr/local (инод 5120)
ссылаются восемь раз. На моей системе на этот инод ведут следующие пути:
/usr/local
/usr/local/.
/usr/local/bin/..
/usr/local/games/..
/usr/local/lib/..
/usr/local/sbin/..
/usr/local/share/..
/usr/local/src/..
52
Управление файловой системой
Разбиение диска на разделы, fdisk
Обычно переразбиение диска производится с помощью программы fdisk для Linux, которая
запускается на одном из этапов установки. Кроме этого, в современных дистрибутивах,
пользователь может столкнуться со специальными мастерами(wizard), являющимися
надстройками fdisk, и позволяющими графически представлять разбиение диска на разделы.
Программа fdisk имеет интерфейс командной строки.
После загрузки средств инсталляции выполните команду fdisk, напечатав
fdisk <drive>
где <drive> имя устройства в Linux, которому вы хотите выделить раздел. Например, если вы
хотите выполнить fdisk для первого IDE-диска, используйте команду fdisk /dev/hda.
/dev/hda (первый IDE-диск) берется по умолчанию, если вы не описали другого.
Если вы создаете разделы для Linux более, чем на одном диске, для каждого диска.
# fdisk /dev/hda
Command (m for help):
В этот момент fdisk ждет команды; вы можете ввести ``m'', чтобы получить перечень опций
Команда (m для справки):
m
Действия
a установить признак загрузочного раздела
d удалить раздел
l показать список известных типов раздела
m вывести это меню
n добавить раздел
p вывести таблицу разделов
q выйти без сохранения изменений
t сменить системный идентификатор раздела
v проверить таблицу разделов
w записать таблицу разделов на диск и выйти
x дополнительные возможности(для опытных пользователей)
Команда (m для справки):
Для создания нового раздела используется команда n. О большинстве других опций вы можете не
вспоминать. Выйти из программы fdisk, без сохранения произведенных изменений, можно
командой q. Выйти из программы fdisk с записью изменений в таблице разделов можно
командой w.
Первое, что вы должны сделать, это получить и записать текущее состояние таблицы разделов.
Используйте команду p.
53
Command (m for help):
Disk /dev/hda:
p
16 heads, 38 sectors, 683 cylinders
Units = cylinders of 608 * 512 bytes
Device Boot Begin Start End Blocks Id
/dev/hda1
*
1
1
203
61693
6
System
DOS
16-bit >=32M
Command (m for help):
Это пример, когда у нас один MS-DOS-раздел на /dev/hda1, который имеет 61693 блоков (около
60M - блок в Linux - 1024bytes). Этот раздел начинается на цилиндре 1 и заканчивается на
цилиндре 203. Всего у нас на диске 683 цилиндров. Так что остается 480 цилиндров для создания
раздела Linux.
Для создания нового раздела используйте команду ``n''. В этом примере мы создадим два новых
первичных раздела (/dev/hda2 and /dev/hda3) для Linux.
Command (m for help):
n
Command action
e extended
p primary partition (1-4)
p
Здесь fdisk спрашивает тип создаваемого раздела: extended (расширенный) или primary
(первичный). В нашем примере мы создаем только первичный раздел, так что выбираем p.
Partition number (1-4):
Затем fdisk спросит число создаваемых разделов; поскольку раздел 1 уже использован, наш
первый раздел Linux получит номер 2.
Partition number (1-4):
2
First cylinder (204-683):
Теперь введите номер первого цилиндра раздела. Поскольку цилиндры с 204 по 683 не
используются, мы используем первый свободный (номер 204). Нет смысла оставлять пустые места
между разделами.
First cylinder (204-683):
204
Last cylinder or +size or +sizeM or +sizeK (204-683):
Программа fdisk запрашивает размер создаваемого раздела. Мы можем указать последний номер
свободных цилиндров или размер в байтах, килобайтах или мегабайтах. Поскольку мы хотим,
чтобы наш раздел был размером в 80M, мы укажем +80M. При указании размера раздела таким
способом fdisk округлит действительный размер раздела до ближайшего числа цилиндров.
Last cylinder or +size or +sizeM or +sizeK (204-683):
Warning:
Linux
cannot currently
use 33090
+80M
sectors of this
partition
Если вы увидите предупреждение, вроде этого, его можно проигнорировать.
Программа fdisk выдает сообщение, поскольку это старая программа, написанная еще до того,
когда в Linux были разрешены разделы более, чем 64M. Теперь мы готовы создать второй раздел
для Linux. С целью демонстрации мы создадим его размером в 10M.
54
Command (m for help):
n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4):
3
First cylinder (474-683):
474
Last cylinder or +size or +sizeM or +sizeK (474-683): +10M
Наконец, мы выдадим таблицу разделов. Вновь запишите всю информацию, особенно размеры в
блоках ваших новых разделов. Вам потребуется знать размер разделов позже при создании
файловой системы. Попутно проверьте, что разделы не накладываются друг на друга.
Command (m for help):
Disk /dev/hda:
p
16 heads, 38 sectors, 683 cylinders
Units = cylinders of 608 * 512 bytes
Device Boot Begin Start
/dev/hda1
/dev/hda2
*
1
204
End
Blocks
Id
1
203
61693
6
204
473
82080
81
System
DOS
16-bit >=32M
Linux/MINIX
/dev/hda3
474
474
507 10336
81 Linux/MINIX
Как вы видите, теперь есть /dev/hda2 - раздел размером в 82080 блоков (что соответствует
приблизительно 80M), и /dev/hda3 - 10336 блоков (около 10M).
Имейте в виду, что много дистрибутивов требуют использования команды t в программе fdisk для
изменения области своппинга ``Linux swap'', которая обычно имеет номер 82. Вы можете
воспользоваться командой l для печати кодов типов известных разделов, а затем использовать t,
чтобы установить тип области своппинга, соответствующий ``Linux swap''.
При этом программы инсталляции смогут автоматически найти ваши разделы своппинга,
основываясь на типе. Если ваши программы инсталляции не распознают области своппинга, вы
можете снова запустить программу fdisk и использовать команду ``t'' в режиме вопросов.
В вышеприведенном примере оставшиеся цилиндры диска (номера с 508 по 683) не
использованы. Вы можете позже создать дополнительные разделы.
Наконец, мы используем команду w, чтобы записать изменения и выйти из fdisk
Command (m for help):
w
#
Имейте в виду, что ни одно из сделанных изменений не даст эффекта то тех пор, пока вы не
дадите команду w. Так что вы можете играть с различными конфигурациями и сохранить их, когда
закончите. Кроме того, если вы захотите выйти из fdisk в любое время без сохранения изменений,
используйте команду q.
55
Не забывайте также, что вы не сможете загружать Linux с разделов, использующих номера
цилиндров, превышающие 1023. Поэтому, вы должны попытаться создать корневой раздел Linux
на цилиндрах до 1023-го. Но если это невозможно - загружайтесь с дискеты.
Некоторые дистрибутивы Linux требуют перезагрузки системы после окончания работы fdisk. Это
позволяет изменениям в таблице разделов оказать свое влияние на последующую инсталляцию.
Новые версии fdisk автоматически изменяют соответствующую информацию в ядре, так что
перезагрузка не требуется. Чтобы обезопасить себя, после выполнения fdisk вам следует снова
загрузить средства инсталляции как и раньше - перед продолжением инсталляции.
Создание и монтирование файловых систем
В предыдущих разделах мы кратко рассмотрели основные команды для работы с уже
сформированной файловой системой. Теперь надо остановиться на вопросе о том, как создать
файловую систему и модифицировать ее.
Общее дерево файлов и каталогов системы Linux формируется из отдельных "ветвей",
соответствующих различным физическим носителям. Часто говорят, что оно формируется из
отдельных файловых систем. Говорить так позволяет тот факт, что в UNIX® нет понятия
"форматирования диска" (и команды форматирования), а используется понятие "создание
файловой системы". Когда мы получаем новый носитель, например, жесткий диск, мы должны
создать на нем файловую систему. То есть каждому носителю ставится в соответствие отдельная
файловая система. Чтобы эту файловую систему использовать для записи в нее файлов, надо ее
вначале подключить в общее дерево каталогов ("смонтировать"). Вот и получается, что можно
говорить о монтировании файловых систем или о монтировании носителей (с созданными на них
файловыми системами).
Можно еще в виде предисловия отметить, что обычно жесткий диск предварительно разбивается
на разделы (особенно современные диски, имеющие емкость, исчисляемую десятками гигабайт).
Создание разделов облегчает выполнение резервного копирования, решение задач
разграничения полномочий, повышает производительность и ограничивает потенциальный
ущерб, наносимый вышедшими из-под контроля программами. Поэтому в дальнейшем будем
говорить о создании файловой структуры в одном разделе (диск, не имеющий разделов, можно
тоже рассматривать как один раздел).
Еще один момент, существенный в контексте этого раздела, связан с тем, что Linux может
работать с разными типами файловых систем. "Родной" файловой системой для него в настоящее
время является "вторая расширенная файловая система" (second extended filesystem) ext2fs. Ho в
Linux можно работать и с 16-разрядной файловой системой FAT, создаваемой в MS-DOS, и с 32разрядной FAT32, разработанной для MS Windows 95, и с файловой системой ISO9660,
используемой для записи информации на CD-ROM, и с другими типами файловых систем (в число
которых пока, правда, не входит NFTS). То есть, при рассмотрении вопросов создания и
монтирования файловых систем надо постоянно помнить о том, что типы файловых систем на
разных носителях могут различаться.
Итак, вначале рассмотрим случай, когда требуется создать в каком-то разделе диска файловую
систему. Будем предполагать, что создается файловая система типа ext2fs (создание файловых
систем других типов — тема для книг, посвященных другим операционным системам). Создание
56
файловой системы типа ext2fs подразумевает создание в данном разделе на диске суперблока,
таблицы индексных дескрипторов и совокупности блоков данных. Делается все это все с
помощью команды mkfs. В простейшем случае достаточно дать эту команду в следующем
формате:
[root]# mkfs -t ext2 /dev/hda5,
где /dev/hda5 надо, естественно, заменить указанием на соответствующее устройство или раздел.
Например, если вы хотите создать файловую систему на дискете, то команда примет вид:
[root]# mkfs -t ext2 /dev/fd0
(Можно сказать, что мы "отформатировали дискету", но учтите, что в DOS или Windows такие
дискеты не читаются. Для создания под Linux дискет, которые бы читались в DOS или Windows,
служат специальные утилиты.)
После выполнения команды mkfs в указанном разделе будет создана файловая система ext2fs
(еще раз повторю, что подробнее об этом вы узнаете в гл. 16). В новой файловой системе
автоматически создается один каталог с именем lost+found. Он используется в экстренных случаях
программой fsck, поэтому не удаляйте его. Для того, чтобы начать работать с новой файловой
системой (например, переписать какие-то файлы на новый носитель), необходимо подключить ее
в общее дерево каталогов, что делается с помощью команды mount.
В качестве параметров команде mount надо, как минимум, указать устройство и "точку
монтирования". Точкой монтирования называется тот каталог в уже существующем и известном
системе дереве каталогов, который будет теперь служить корневым каталогом для подключаемой
файловой системы. Пример: команда
[root]# mount /dev/hdb1 /mnt/disk2
подсоединяет файловую систему первого раздела на втором жестком диске к каталогу /mnt/disk2
(этот каталог должен существовать!).
Отметим, что после монтирования файловой системы в каталог /mnt/disk2 прежнее содержимое
этого каталога станет для вас недоступно (так же, как информация о прежнем владельце и правах
доступа к этому каталогу) до тех пор, пока вы не размонтируете вновь подключенную файловую
систему. Прежнее содержимое не уничтожается, а просто становится временно недоступным.
Поэтому в качестве точек монтирования лучше использовать пустые каталоги (заранее
заготовленные).
В той простейшей форме, которую мы использовали в приведенном выше примере, команда
mount будет работать только при условии, что все недостающие ей для выполнения параметры
она найдет в файле /etc/fstab. Если же такого файла не существует, или он не содержит
необходимых данных, надо применять более полную форму команды mount:
[root]# mount -t type device path
где type задает тип файловой системы, device указывает, на каком устройстве (в каком разделе)
она находится, а path задает точку монтирования.
Конфигурационный файл /etc/fstab используется в основном для того, чтобы обеспечить
автоматическое монтирование файловых систем в процессе загрузки. Каждая строка этого файла
57
содержит описание одной файловой системы и состоит из 6 полей, разделяемых пробелами (для
удобочитаемости поля обычно выравнивают, но делать это не обязательно):






имя устройства. В качестве имени может использоваться как имя локального
устройства, например, /dev/hda5, так и путевое имя сетевой файловой системы
NFS, например, pc21:/home/jim, что указывает на каталог /home/jim на машине
с именем pc21;
точка монтирования (полное имя каталога, в который будет монтироваться
файловая система);
тип файловой системы;
опции монтирования (по умолчанию подразумевается rw — чтение, запись);
уровень дампа. Это поле используется программой dump, предназначенной
для создания резервных копий. Если файловая система должна участвовать в
процессе резервного копирования, то здесь должно стоять число 1, если нет —
0. Возможны и другие значения (см. руководство к программе dump);
порядок (приоритет) проверки файловых систем программой fsck. Системы с
меньшими значениями этого поля проверяются раньше. Системы с
одинаковыми номерами проверяются, если это возможно, параллельно.
В настоящее время Linux поддерживает следующие типы файловых систем (см. страницу man fs,
где дано их краткое описание): minix, ext, ext2, xia, msdos, umsdos, vfat, proc, nfs, iso9660, hpfs, sysv,
smb, ncpfs. Вместо типа файловой системы в поле "тип файловой системы" (и в опции -t команды
mount) можно задать значение auto. В таком случае команда mount попытается самостоятельно
определить тип монтируемой файловой системы. Однако это во многих случаях приводит к
ошибкам, поэтому лучше указать тип явно. Можно перечислить несколько типов (через запятую).
В команде mount можно также вначале задать список типов файловых систем, которые не надо
монтировать. Этот список задается с помощью флага no. Такая возможность может оказаться
полезной в том случае, когда используется команда mount с аргументом -a. По этой команде
производится монтирование всех файловых систем, перечисленных в файле /etc/fstab. С
помощью дополнительного аргумента -t type в этом случае можно ограничиться монтированием
файловых систем только определенного типа, а с помощью флага no можно указать типы, которые
не надо монтировать. Например, команда
[root]# mount -a -t nomsdos,ext
монтирует все файловые системы, за исключением тех, которые относятся к типам msdos и ext.
Когда монтируется файловая система, упомянутая в файле /etc/fstab, то в команде монтирования
достаточно указать только один аргумент — либо имя устройства, либо точку монтирования. Все
остальные параметры команда mount возьмет из файла /etc/fstab.
Обычно монтировать файловые системы может только суперпользователь, но если в поле опций
монтирования файла /etc/fstab указать опцию user, то соответствующую файловую систему смогут
смонтировать все пользователи. Так, если в /etc/fstab имеется строка
/dev/cdrom /cd iso9660 ro,user,noauto,unhide,
то любой пользователь сможет смонтировать файловую систему на своем CDROM, используя
команду
[user]$ mount /dev/cdrom
58
или
[user]$ mount /cd
В Ошибка! Источник ссылки не найден. приведены еще некоторые опции, которые могут
использоваться в команде mount
и в файле /etc/fstab
Команды mount и umount (см. ниже) поддерживают в актуальном состоянии таблицу (или
перечень) смонтированных файловых систем. Этот перечень сохраняется на диске в виде файла
/etc/mtab. Этот файл можно просмотреть непосредственно, или вывести на экран командой
mount без аргументов.
Если вы хотите монтировать какую-то систему только для чтения из нее, то в соответствующей
строке файла /etc/fstab надо либо указать опцию r (read only, по умолчанию подразумевается rw,
т. е. и чтение, и запись), либо использовать команду mount с параметром -r.
Перед тем как отключить от компьютера носитель, на котором расположена файловая система,
(чаще всего это требуется делать с дискетами в дисководе, но иногда и с носителями других
типов), необходимо "размонтировать" файловую систему (другими словами, "размонтировать
носитель"). Эта операция выполняется с помощью команды umount
59
Опция
Значение
async
auto
defaults
Весь ввод-вывод в файловую систему должен производиться асинхронно
Файловая система может монтироваться командой mount c опцией -a
Использовать набор опций, задаваемый по умолчанию: rw, suid, dev, exec,
auto, nouser, async
Файлы байт-ориентированных и блок-ориентированных устройств в файловой
системе интерпретируются как специальные файлы
Файловая система может монтироваться только явно. Опция -a не приведет к
монтированию файловой системы
Разрешает выполнение двоичных файлов
dev
noauto
exec
remount
ro
Позволяет перемонтировать уже смонтированную файловую систему. Обычно
используется для изменения опций монтирования файловой системы,
особенно для того, чтобы расширить права доступа (вместо прав только на
чтение установить права на чтение/запись)
онтирует файловую систему только на чтение
rw
Монтирует файловую систему для чтения и записи
suid
Позволяет задействовать биты смены идентификатора пользователя и смены
идентификатора группы
sync
Весь ввод-вывод в файловую систему должен производиться синхронно
user
Позволяет непривилегированному пользователю монтировать файловую
систему. Для таких пользователей монтирование всегда выполняется с
опциями noexec, nosuid, nodev
nodev
Файлы байт-ориентированных и блок-ориентированных устройств в файловой
системе не интерпретируются как специальные файлы
nosuid
Не позволяет задействовать биты смены идентификатора пользователя и
смены идентификатора группы
Запрещает непривилегированному пользователю монтировать файловую
систему
nouser
В качестве аргумента команде umount надо дать либо имя устройства, либо точку монтирования.
Демонтировать файловую систему может только тот пользователь, который ее смонтировал (и
суперпользователь, конечно). Для того, чтобы операцию демонтирования мог выполнить любой
пользователь, в поле параметров соответствующей строки файла /etc/fstab надо указать опцию
users (вместо user).
Демонтирование файловой системы возможно только тогда, когда в ней нет открытых файлов (в
частности, не должно быть запущено программ, файлы которых расположены в данной системе) и
в системе нет процессов, использующих эту файловую систему (т. е. демонтируемая файловая
система не должна быть занятой).
Надо признать, что, в сравнении с DOS или Windows, работа с дискетами и другими сменными
носителями (CD-ROM, Iomega Zip и т.п.) в ОС типа UNIX® менее удобна. Для того, чтобы обратиться
к дискете, вы должны вначале смонтировать ее в какой-то каталог в файловой структуре. А для
смены дискеты требуется вначале размонтировать предыдущую дискету, а затем смонтировать
60
новую. То же самое с другими сменными носителями. Поскольку с дискетами и другими
сменными носителями так или иначе приходиться работать, лучше сразу заготовить в файловой
структуре стандартные каталоги для монтирования всех имеющихся в вашем распоряжении типов
сменных носителей. Например, создать каталог /mnt, а в нем подкаталоги floppy, cdrom, zip и т. д.
Пожалуй, это все, что нужно знать начинающему пользователю системы Linux о файловых
системах. Еще раз повторю, что здесь была рассмотрена только одна сторона файловой системы
ext2fs, обращенная к пользователям, т. е. в основном, логика построения структуры каталогов и
файлов. Обратная сторона файловой системы, ее внутреннее устройство, а также различные типы
файловых систем, в настоящем разделе только упоминались по мере необходимости.
Команды для работы с файлами
В предыдущих разделах мы уже упоминали некоторые команды для работы с файлами и
каталогами: pwd, cd, ls, ln, chmod. В этом разделе рассмотрим (очень кратко) еще несколько часто
используемых команд.
Команды chown и chgrp
Эти команды служат для смены владельца файла и группы файла. Выполнять смену владельца
может только суперпользователь, смену группы может выполнить сам владелец файла или
суперпользователь. Для того, чтобы иметь право сменить группу, владелец должен
дополнительно быть членом той группы, которой он хочет дать права на данный файл. Формат
этих двух команд аналогичен:
[root]# chown vasja имя-файла
[root]# chgrp usersgrp имя-файла
Команда mkdir
Команда mkdir позволяет создать подкаталог в текущем каталоге. В качестве аргумента этой
команде надо дать имя создаваемого каталога. Во вновь созданном каталоге автоматически
создаются две записи: . (ссылка на этот самый каталог) и .. (ссылка на родительский каталог).
Чтобы создать подкаталог, вы должны иметь в текущем каталоге право записи. Можно создать
подкаталог не в текущем, а в каком-то другом каталоге, но тогда необходимо указать путь к
создаваемому каталогу:
[user]$ mkdir /home/kos/book/glava5/part1
Команда mkdir может использоваться со следующими опциями:
-m mode — задает режим доступа для нового каталога (например, -m 755);
-p — создавать указанные промежуточные каталоги (если они не существуют).
Команда cat
Команда cat часто используется для создания файлов (хотя можно воспользоваться и командой
touch). По команде cat на стандартный вывод (т. е. на экран) выводится содержимое указанного
файла (или нескольких файлов, если их имена последовательно задать в качестве аргументов
команды). Если вывод команды cat перенаправить в файл, то можно получить копию какого-то
файла:
61
[user]$ cat file1 > file2
Собственно, первоначальное предназначение команды cat как раз и предполагало
перенаправление вывода, так как эта команда создана для конкатенации, т. е. объединения
нескольких файлов в один:
[user]$ cat file1 file2 ... fileN > new-file
Именно возможности перенаправления ввода и вывода этой команды и используются для
создания новых файлов. Для этого на вход команды cat направляют данные со стандартного
ввода (т. е. с клавиатуры), а вывод команды — в новый файл:
[user]$ cat > newfile
После того, как вы напечатаете все, что хотите, нажмите комбинацию клавиш <Ctrl>+<D> или
<Ctrl>+<C>, и все, что вы ввели, будет записано в newfile. Конечно, таким образом создаются, в
основном, короткие текстовые файлы.
Команда cp
Хотя для копирования файлов иногда пользуются командой cat, но в Linux существует для этого
специальная команда cp. Ее можно применять в одной из двух форм:
[user]$ cp [options] source destination
[user]$ cp [options] source_directory new_directory
В первом случае файл или каталог source копируется, соответственно, в файл или каталог
destination, а во втором случае файлы, содержащиеся в каталоге source_directory копируются в
каталог new_directory. Для копирования надо иметь права на чтение файлов, которые копируются,
и права на запись в каталог, в который производится копирование.
Если в качестве целевого указывается существующий файл, то его содержимое будет затерто,
поэтому при копировании надо соблюдать осторожность. Впрочем, можно использовать команду
cp с опцией -i, тогда перед перезаписью существующего файла будет запрашиваться
подтверждение (очень рекомендую вам всегда использовать эту опцию!).
У команды cp имеется еще несколько полезных опций
62
Опция
Значение
-p
Сохраняет время модификации файла и максимально возможные
полномочия. Без этой опции для нового файла задаются полномочия,
соответствующие полномочиям запустившего команду пользователя
-R или -r
Если source— каталог, то копируется как он, так и все входящие в него
подкаталоги, т.е. сохраняется исходная форма дерева каталогов
-d
Если задать эту опцию, то символические ссылки будут оставаться ссылками (а
иначе вместо ссылки копируется файл, на который дается ссылка)
-f
Перезаписывать файлы при копировании (если такие уже есть) без
дополнительных предупреждений
Команда mv
Если вам необходимо не скопировать, а переместить файл из одного каталога в другой, вы
можете воспользоваться командой mv. Синтаксис этой команды аналогичен синтаксису команды
cp. Более того, она сначала копирует файл (или каталог), а только потом удаляет исходный файл
(каталог). И опции у нее такие же, как у cp.
Команда mv может использоваться не только для перемещения, но и для переименования
файлов и каталогов (т. е. перемещения их внутри одного каталога). Для этого надо просто задать в
качестве аргументов старое и новое имя файла:
[user]$ mv oldname newname
Но учтите, что команда mv не позволяет переименовать сразу несколько файлов (используя
шаблон имени), так что команда mv *.html *.htm не будет работать, файлы с расширением html
будут удалены.
При использовании команды mv, также как и при использовании cp, не забывайте применять
опцию -i для того, чтобы получить предупреждение, когда файл будет перезаписываться.
Команды rm и rmdir
Для удаления ненужных файлов и каталогов в Linux служат команды rm (удаляет файлы) и rmdir
(удаляет пустой каталог) . Для того, чтобы воспользовался этими командами, вы должны иметь
право записи в каталоге, в котором расположены удаляемые файлы или каталоги. При этом
полномочия на изменение самих файлов не обязательны. Если хотите перед удалением файла
получить дополнительный запрос на подтверждение операции, используйте опцию -i.
Если вы попытаетесь использовать команду rm (без всяких опций) для удаления каталога, то будет
выдано сообщение, что это каталог, и удаления не произойдет. Для удаления каталога надо
удалить в нем все файлы, после чего удалить сам каталог с помощью команды rmdir. Однако
можно удалить и непустой каталог со всеми входящими в него подкаталогами и файлами, если
использовать команду rm с опцией -r.
63
Если вы дадите команду rm *, то удалите все файлы в текущем каталоге. Подкаталоги при этом не
удалятся. Для удаления как файлов, так и подкаталогов текущего каталога надо тоже
воспользоваться опцией -r. Однако всегда помните, что в Linux нет команды восстановления
файлов после их удаления (даже если вы спохватились сразу же после ошибочного удаления
файла или каталога)!
Так что дважды подумайте до удаления чего-либо и не пренебрегайте опцией -i.
Команды more и less
Команда cat позволяет вывести на стандартный вывод (на экран) содержимое любого файла,
однако она используется для этих целей очень редко, разве что для вывода очень небольших по
объему файлов. Дело в том, что содержимое большого файла мгновенно проскакивает на экране,
и пользователь видит только последние строки файла. Поэтому cat используется в основном по ее
прямому назначению — для конкатенации файлов, а для просмотра содержимого файлов
(конечно, текстовых) используются команды more и less (или текстовые редакторы).
Команда-фильтр more выводит содержимое файла на экран отдельными страницами, размером
как раз в целый экран. Для того, чтобы увидеть следующую страницу, надо нажать на клавишу
пробела. Нажатие на клавишу <Enter> приводит к смещению на одну строку. Кроме клавиш
пробела и <Enter> в режиме паузы еще некоторые клавиши действуют как управляющие
(например, клавиша <B> возвращает вас на один экран назад), но мы здесь не будем приводить
полного их перечня, как и перечня опций команды. Вам для начала надо еще только запомнить,
что выйти из режима просмотра можно с помощью клавиши <Q>, так как если вы этого не знаете,
то вам придется долго и нудно нажимать пробел, пока вы не доберетесь до конца длинного
файла. Обо всех опциях команды more вы можете прочитать в интерактивном руководстве man
или info.
Утилита less, разработанная в рамках проекта GNU, содержит все функции и команды управления
выводом, имеющиеся в программе more, и некоторые дополнительные, например, позволяет
использовать клавиши управления курсором (<Стрелка вверх>, <Стрелка вниз>, <PgUp>,
<PgDown>) для перемещения по тексту. Вспомните, мы уже говорили об этом, когда
рассматривали интерактивную подсказку man.
Команды more и less позволяют производить поиск подстроки в просматриваемом файле, причем
команда less позволяет производить поиск как в прямом, так и в обратном направлении. Для
организации поиска строки символов string надо набрать в командной строке программы в
нижней части экрана (там, где двоеточие) /string. Если искомая строка будет найдена, будет
отображен соответствующий кусок текста, причем найденная строка будет находиться в самом
верху экрана.
Команда find и символы шаблонов для имен файлов
Еще одной часто используемой командой для работы с файлами в Linux является команда поиска
нужного файла find. Команда find может искать файлы по имени, размеру, дате создания или
модификации и некоторым другим критериям.
Общий синтаксис команды find имеет следующий вид:
64
find [список_каталогов] критерий_поиска
Параметр "список_каталогов" определяет, где искать нужный файл. Проще всего задать в качестве
начального каталога поиска корневой каталог /, однако, в таком случае поиск может затянуться
очень надолго, так как будет просматриваться вся структура каталогов, включая смонтированные
файловые системы (в том числе сетевые, если таковые есть). Можно сократить объем поиска, если
задать вместо одного корневого каталога список из нескольких каталогов (естественно, тех, в
которых может находиться искомый файл):
[user]$ find /usr/share/doc /usr/doc /usr/locale/doc -name instr.txt
Началом "критерия_поиска", определяющего, что именно должна искать программа find,
считается первый аргумент, начинающийся на "-", "(", ")"', "," или "!". Все аргументы,
предшествующие "критерию_поиска", трактуются как имена каталогов, в которых надо
производить поиск. Если не указано ни одного пути, поиск производится только в текущем
каталоге и его подкаталогах.
Чаще всего поиск проводится по именам файлов, как это показано в предыдущем примере, т. е.
"критерий_поиска" задается как "-name имя_файла". Вместо опции -name можно использовать
опцию -path, тогда команда будет искать совпадения в полном имени файла, с указанием пути.
Например, команда
[user]$ find . -path './sr*sc'
найдет в текущем каталоге подкаталог './src/misc'. Вместо полного имени файла или каталога в
этом примере использован так называемый "шаблон имени". Поскольку шаблоны имен файлов
могут использоваться не только с командой find, но и со многими другими командами (включая
уже рассмотренные команды chmod, chown, chgrp, cp, rm, cat, mv), то правилам составления
шаблонов стоит уделить некоторое внимание.
Чаще всего шаблоны имен файлов строятся с помощью специальных символов "*" и "?". Значок
"*" используется для замены произвольной строки символов. В Linux
"*" — соответствует всем файлам, за исключением скрытых;
".*" — соответствует всем скрытым файлам (но также текущему каталогу "." и каталогу уровнем
выше "..": не забывайте об этом!);
"*.*" — соответствует только тем файлам и каталогам, которые имеют "." в середине имени, или
оканчиваются на точку;
"p*r" — соответствует и "peter" и "piper"; "*c*" — соответствует и "picked" и "peck".
Значок ? заменяет один произвольный символ, поэтому index?.htm будет соответствовать именам
index0.htm, index5.htm и indexa.htm.
Кроме "*" и "?" в Linux при задании шаблонов имен можно использовать квадратные скобки [], в
которых дается либо список возможных символов, либо интервал, в который должны попадать
возможные символы. Например, [abc]* соответствует всем именам файлов, начинающимся с a, b,
c; *[I-N1-3] соответствует файлам, имена которых оканчиваются на I, J, K, L, M, N, 1, 2, 3.
65
А теперь вернемся к команде find и расскажем подробнее о том, какие критерии поиска
возможны. Несколько примеров простых критериев поиска перечислены в таблице.
Опция
Значение
-name
шаблон
Ищет файлы, имена которых соответствуют шаблону
-group имя
Ищет файлы, принадлежащие указанной группе
-size
число[c]
Ищет файлы, размером в число 512-байтных блоков. Если после числа стоит
символ c, значит размер указан в байтах (символах)
-mtime
число
Ищет файлы, которые в последний раз изменялись указанное число дней
назад
-newer
образец
Ищет файлы, которые изменялись после изменения файла, указанного в
образце
-type
тип_файла
Ищет файлы указанного типа. Тип задается одним из символов b (блокориентированные устройства), c (байт-ориентированные устройства), d
(файл каталога), f (обычный файл), p (именованный канал) либо l
(символическая ссылка
Другие простые критерии вы можете узнать, если просмотрите man-страницу о команде find.
Здесь же надо только сказать, что из простых критериев можно строить более сложные с
помощью логических операций and, or или операции отрицания, знаком которой служит
восклицательный знак. Например, если вы хотите найти все файлы, имена которых оканчиваются
на .txt и .doc, то критерий можно записать как (-name *.txt -or –name *.doc). Можно
комбинировать таким образом любое число критериев (и не только простых!). Если операция не
указана явно, то подразумевается -and, т. е. вместо (-name *.txt -and -name *.doc) можно записать
просто (-name *.txt -name *.doc). Если применяется только одна операция -and или !, то скобки
обычно можно опустить, а с операцией -or и в сложных выражениях скобки необходимы. Перед
скобкой нужно поставить обратную косую черту, а после скобки — пробел. Например, если вы
хотите найти каталог по его имени, то можно сделать это командой [user]$ find /usr -name doc type d или (с соблюдением правил построения сложных критериев)
[user]$ find /usr \( -name doc -and -type d \)
В следующем примере мы ищем файлы по такому критерию: либо имя файла оканчивается на
*.tmp, либо размер файла больше 100 Кбайт.
[user]$ find /home/kos \( \( -name *.tmp \) -or \( -size +200 \) \)
В последнем примере стоит обратить внимание на то, что перед значением размера стоит
знак "+". Такой знак можно использовать с любым числовым параметром в критериях поиска
команды find. Он означает, что нужно искать файлы, у которых значение параметра больше
66
заданного. Соответственно, знак "-" означает, что надо искать файлы, у которых значение
параметра меньше заданного. Если знаки + или — отсутствует, ищутся файлы, у которых значение
параметра равно заданному.
Чтобы закончить рассмотрение команды find, надо сказать еще о том, что после критерия поиска в
этой команде можно сразу же задать операцию, которая будет применяться ко всем файлам,
найденным по указанному критерию. Простейшим примером использования такой возможности
является указание команды –print.
[user]$ find /home/kos -name *.tmp -print
по которой выдается на экран список имен всех найденных файлов с указанием полного пути к
файлу. Эта операция применяется по умолчанию, т. е. когда никаких операций вообще не указано
(как это было во всех приведенных выше примерах). Другим примером операции, применяемой
ко всем найденным файлам, может служить операция -exec cmd {} \;, где
cmd — произвольная команда оболочки shell. То есть в этом случае ко всем найденным файлам
(их именами заменяются поочередно фигурные скобки) применяется команда cmd. За cmd {} в
этом случае должна следовать точка с запятой, экранированная обратной косой чертой.
Например, если вы хотите удалить в текущем каталоге все файлы, к которым пользователи не
обращались в течение 30 дней, дайте команду:
[root]# find . -type f -atime +30 -exec rm {} \;
Вместо -exec можно поставить -ok, тогда перед выполнением указанной команды cmd
применительно к каждому файлу будет запрашиваться подтверждение.
В общем, команда find является очень мощным, полезным и чрезвычайно адаптируемым
инструментом поиска в файловой системе. Все ее возможности здесь не перечислены, изучайте
соответствующую man-страницу. И будьте очень осторожны с применением таких возможностей
команды, как вызов других команд, применяемых ко всем найденным файлам. Помните, что
изменения часто необратимы!
Команда split — разбиваем файл на несколько частей
Иногда бывает необходимо разбить один большой файл на несколько файлов меньшего объема.
Для примера рассмотрим ситуацию, когда вы хотите перенести на свой домашний компьютер
файл song.mp3 формата "MP3", размером в 4,894,425 байт. Возможности перекачать этот файл по
сети у вас нет, и единственно возможный способ переноса — воспользоваться дискетами. Но,
поскольку на одну дискету файл не помещается, требуется разбить его на несколько маленьких
файлов, а потом "собрать" снова. Для решения этой задачи можно воспользоваться командой
split.
Команда split копирует файл, разбивая его на отдельные файлы заданной длины. В качестве
аргументов ей надо указать имя исходного файла и префикс имен выходных файлов. Имена
выходных файлов будут составляться из этого префикса и двух дополнительных букв `aa', `ab', `ac'
и т. д. (без пробелов и точек между префиксом и буквами). Если префикс имен файлов не задан,
то по умолчанию используется ‘x’, так что выходные файлы будут называться `xaa', `xab' и т. д..
67
Кроме аргументов можно задать опцию -b, определяющую размер выходных файлов в байтах.
Вслед за –b должно стоять число, а за ним — буква k (показывающая, что размер выходного файла
указан в килобайтах) или m (значит размер задан в мегабайтах). Если опция не задана, то по
умолчанию размер выходных файлов принимается равным 1 Мбайту. Таким образом, чтобы
перенести на дискетах файл song.mp3 надо вначале дать команду
[user]$ split -b1400k song.mp3 song.
скопировать полученные файлы song.aa, song.ab, song.ac, song.ad, song.ae на отдельные дискеты,
перенести их на домашний компьютер, скопировать в какой-нибудь каталог и восстановить
исходный файл с помощью команды
[user]$ cat song.* > song.mp3
после чего можно удалить временные файлы song.xx.
Сравнение файлов и команда patch
Вы не замечали, что задача сравнения содержимого двух различных файлов возникает при работе
с компьютером удивительно часто? Конечно, ведь так легко скопировать файл, а потом
забываешь, какая же из версий новее или качественнее (по одному автору ведомым критериям).
Так что инструменты для сравнения файлов просто необходимы и Linux такие инструменты
предоставляет.
Простейший из них — команда cmp. Эта команда просто сравнивает содержимое двух файлов побайтно:
[user]$ cmp file1 file2
Если файлы полностью совпадают, она молча заканчивает свою работу (происходит возврат к
командной строке без каких-либо дополнительных сообщений), а если файлы различаются,
выдаются номер строки и номер байта в строке, где имеет место первое различие.
Опции команды







-b --print-bytes Выводить различающиеся байты.
-i Н--ignore-initial=Н
Игнорировать различия в первых Н байтах ввода.
-i Н1:Н2 --ignore-initial=Н1:Н2
Пропустить первые Н1 байт файла ФАЙЛ1 и первые Н2 байт файла ФАЙЛ2.
-l --verbose
Выводить номера и значения всех различающихся байт.
-n ПРЕДЕЛ
--bytes=ПРЕДЕЛ
Сравнивать не более указанного числа
байт.
-s --quiet --silent Не выводить, только сообщить возвращаемое значение.
Информации, выдаваемой командой cmp, маловато для того, чтобы принять, например, решение
о том, какой из двух файлов нам более ценен, но для использования в скриптах с целью
выявления отличающихся файлов больше ничего и не надо.
Команда diff служит для получения полного отчета о том, каковы же различия в интересующих нас
файлах. Для получения отчета достаточно указать команде, какие именно файлы сравнивать:
[user]$ diff paper.old paper.new
Отчет о выявленных различиях будет выдан на стандартный выход. Естественно, его лучше
перенаправить в файл:
68
[user]$ diff paper.old paper.new >paper.diff
Для оценки версий одного и того же файла более удобна может оказаться команда sdiff, которая
выдает результат сравнения в виде двух столбцов, разделенных пробелами. Если строки с
одинаковыми номерами в файлах различаются, то в выводе команды sdiff они разделены
вертикальной чертой |. Если строка имеется только в первом файле, она отмечена знаком <.
Соответственно, строка, встречающаяся только во втором файле, помечена знаком >.
Существует также команда diff3, которая позволяет сравнить сразу 3 файла.
Но все же наиболее часто используется традиционная для UNIX®-систем команда diff. Эта ее
востребованность объясняется тем, что создаваемый ею отчет о различиях двух файлов может
быть использован командой patch. Чаще всего эти возможности используются при
распространении обновлений программного обеспечения. Предположим, что некоторое
программное приложение было разослано пользователям в виде файла program.c, содержащего
исходный код программы на языке Си. После этого разработчик внес в программу некоторые
исправления и сохранил текст в виде файла program.c.new. Требуется довести исправленный текст
программы до пользователей. Очевидно, что пользователям достаточно сообщить только
исправления, т. е. отчет об изменениях, создаваемый по команде
[user]$ diff program.c program.c.new > program.c.diff
Естественно, объем файла program.c.diff существенно меньше объема файла program.c.new, так
что можно было бы получить существенную экономию на передаче файлов, если отправлять
пользователям только файл program.c.diff (ведь объемы современных программных приложений
составляют десятки мегабайт). Однако пользователи должны иметь возможность внести эти
исправления в имеющуюся у них версию программы. Эту задачу позволяет решить команда patch.
Имея файлы program.c и program.c.diff, пользователь может дать команду
[user]$ patch program.c program.c.diff > program.c.new
в результате выполнения которой он получит файл program.c.new.
Команды архивирования файлов
При работе с Linux вы, может быть, еще не скоро встретитесь с необходимостью работать с
большинством консольных команд, поскольку имеются такие оболочки, как Midnight Commander
или графические оболочки типа KDE. Но с командами архивирования (точнее, разархивирования)
вам работать придется обязательно, хотя бы потому, что вы будете часто встречать
архивированные файлы в Интернете.
Основным средством архивирования в UNIX® (а, следовательно, и в Linux) является комплекс из
двух программ — tar и gzip. Хотя никто не запрещает пользоваться arj, pkzip, lha, rar и т. д. —
версии этих программ для Linux общедоступны. Просто уж исторически сложилось, что
пользователи UNIX® чаще применяют именно tar и gzip, и именно в таком формате
распространяется большая часть программного обеспечения для UNIX®. Поэтому овладеть
работой с tar и gzip — дело чести любого пользователя Linux.
Программа tar
У читателя, привыкшего к архиваторам типа arj, которые собирают файлы в единый архив и сразу
"сжимают" их, может возникнуть вопрос "А зачем использовать две программы?” Все дело в том,
что tar расшифровывается как Tape ARchiver, он не сжимает данные, а лишь объединяет их в
69
единый файл с последовательным доступом для последующей записи на ленту. По умолчанию
этот архивный файл создается на ленточном накопителе, точнее на устройстве /dev/rmt0. Если вы
хотите создать архивный файл на диске, то необходимо использовать команду tar с опцией f,
после которой указывается имя архивного файла.
У программы tar имеется 8 опций, отличающихся от остальных тем, что при вызове программы
должна обязательно задаваться одна из этих опций. Эти опции определяют основные функции
программы.
Опция
Значение
-A, --catenate, --concatenate
Добавляет файлы в существующий архив
-c, --create
Создает новый архив
-d, --diff, --compare
Найти различия между архивом и файловой системой
--delete
Удалить из архива (не может использоваться с магнитной
лентой!)
-r, --append
Дописывает файлы в конец архива
-t, --list
Выводит список файлов архива
-u, --update
Добавляет только файлы, которые новее, чем имеющаяся
в архиве копия
-x, --extract, --get
Извлечь файлы из архива
Если вы работаете с файлами архивов на дисках, а не с ленточным устройством, то, очевидно,
обязательной будет и опция f. Другие опции не являются обязательными, они служат только для
конкретизации задания программе. Например, опция v заставляет программу выводить список
обрабатываемых файлов.
Однобуквенные опции программы tar могут перечисляться друг за другом (вы увидите это в
приводимых ниже примерах).
Я не буду давать здесь описание всех опций команды tar, просто приведу несколько командных
строк для выполнения самых необходимых действий с архивами.
Чтобы создать один tar-архив из нескольких файлов, используется команда:
[user]$ tar -cf имя_архива файл1 файл2 ...,
где опция -c сообщает программе, что необходимо создать (create) архив, а опция f говорит о том,
что архив должен создаваться в виде файла (имя которого должно следовать сразу за этой
опцией).
70
В именах файлов, которые сохраняются в архиве, можно использовать шаблоны имен файлов, в
том числе просто символы-заместители * и ?. Благодаря этому можно очень короткой командой
отправить в архив сразу много файлов. Например, для того, чтобы создать архив, содержащий все
файлы одного из подкаталогов (пусть это будет sub_dir) текущего каталога, достаточно дать
команду
[user]$ tar -cvf имя_архива ./sub_dir/*
или даже просто
[user]$ tar -cvf имя_архива sub_dir
По этой команде в архиве будут сохранены не только файлы, расположенные непосредственно в
подкаталоге sub_dir, но и рекурсивно все файлы из подкаталогов каталога sub_dir. При этом в
архиве сохраняется вся структура подкаталогов каталога sub_dir.
Заметим, что если в только что приведенном примере вместо * поставить *.*, то будут сохранены
только те файлы, которые расположены непосредственно в подкаталоге sub_dir, а подкаталоги
каталога sub_dir архивированы не будут. Если в том же примере не указать имя подкаталога, то
будут архивироваться все файлы (и подкаталоги) текущего каталога. Но если вы дадите команду
следующего вида
[user]$ tar -cvf имя_архива ./.*
то в архиве будут сохранены не только все файлы (и подкаталоги) текущего каталога, но и файлы
из родительского каталога, а хотели ли вы этого?
Теперь вы знаете как создать архив, а для того, чтобы распаковать (извлечь) файлы из архива,
нужно дать команду:
[user]$ tar -xvf имя_архива файлы
Получить список файлов архива можно командой:
[user]$ tar -tf имя_архива | less
Программа tar является удобным средством для создания резервных копий файлов. Конечно,
существуют специальные утилиты резервного архивирования, но даже если вы о них еще не
знаете, то по меньшей мере, вы можете сделать следующее:
[user]$ tar -Mcvf /dev/fd0H1440 /каталог
Такая команда создаст на дискетах архив с содержимым каталога, разбивая его на тома.
Монтировать дискеты перед запуском команды не нужно, программа просто пишет на устройство
потоком (в данном случае на дискету по секторам). При этом никакой файловой системы на
дискете не создается. После заполнения дискеты вам будет выдан запрос на смену дискеты.
Только, прежде чем запускать такую команду на выполнение, приготовьте достаточное число
свободных дискет (помните, что tar не сжимает файлы), которые лучше всего соответствующим
образом пометить и обязательно пронумеровать. Кроме того, имейте в виду, что вся информация
на дискетах будет молча уничтожена.
Чтобы восстановить сохраненные данные, воспользуйтесь командой:
[user]$ tar -Mxpvf /dev/fd0H1440
Если вы ошибетесь в порядке вставляемых дискет, программы сообщит вам об этом и попросит
заменить том.
71
В заключение раздела заметим, что всегда можно получить подсказку по использованию
программы tar, дав команду
[user]$ tar -help
При этом, если вы используете русифицированный дистрибутив Linux, например, Black Cat 6.02, то
подсказка будет выдаваться по-русски.
Программа gzip
Хотя программа tar создает архивы, она, как было сказано, не сжимает архивы, а просто
соединяет отдельные файлы в единый архивный файл. Для сжатия этого файла часто применяют
команду gzip. В простейшем случае она вызывается в следующем формате:
[user]$ gzip файл
В командной строке можно указать сразу несколько имен файлов или шаблон имени файла. Но в
этом случае каждый из указанных файлов будет заархивирован отдельно (общий архив не
создается).
Для того, чтобы распаковать архив, используйте команду
[user]$ gzip -d файл_архива
или
[user]$ gunzip файл_архива
Исходные файлы после сжатия удаляются, остается только архивный файл (файлы перемещаются
в архив), а при разархивации удаляется архив.
Перечислим кратко другие полезные опции программы gzip.
Поскольку программа gzip не умеет сохранять в одном архиве несколько файлов, то
обычно ее применяют для сжатия архивов, созданных программой tar. Более того, среди
опций программы tar имеется специальная опция -z, позволяющая сразу после создания
сжать его с помощью программы gzip. Для выполнения такого сжатия надо использовать
команду tar примерно следующим образом:
[user]$ tar -czf имя_архива шаблон_имен_файлов (или имя_каталога)
Только имейте в виду, что в этом случае суффикс .gz не добавляется автоматически к имени
создаваемого архива, поэтому лучше сразу задать имя архива с указанием обеих суффиксов:
имя.tar.gz.
72
Опция
Значение
-h, --help
Вызов краткой помощи по использованию программы
-l, --list
Выдает имя файла, содержащегося в архиве, его объем и степень сжатия
-L, --license
Отображает номер версии и лицензию на программу
-N, --name
Сохранять (или восстанавливать) исходное имя и время создания файла
-n, --no-name
Не сохранять (не восстанавливать) исходное имя и время создания файла
-q, --quiet
Подавляет выдачу на экран предупреждающих сообщений
-r, --recursive
Рекурсивно обрабатывать подкаталоги (используется в случае. когда задан
шаблон имен обрабатываемых файлов)
-S .suf,
--suffix .suf
Добавить суффикс .suf к имени сжатого файла (вместо добавляемого по
умолчанию суффикса gz; но учтите, что при разархивации файлов с
суффиксами, отличными от gz, программа вас не поймет)
-t, --test
Протестировать архивный файл
-v, --verbose
Выдача дополнительных сообщений в процессе работы программы
-V, --version
Отобразить версию программы
-1, --fast
Быстрое сжатие
-9, --best
Более высокая степень сжатия
73
Программа bzip2
В последнее время все чаще вместо программы gzip используется архиватор bzip2, который
обеспечивает более высокую степень сжатия и работает несколько быстрее. Команда bzip2
обычно не устанавливается автоматически при инсталляции Linux. Но она имеется на
дистрибутивном диске в виде rpm-пакета и ее легко установить.
Работает bzip2 примерно так же, как команда gzip, т. е. замещает каждый файл, имя которого
задано в командной строке, сжатой версией, добавляя к имени файла суффикс .bz2.
Сжатый файл имеет то же самое время модификации, права доступа и, по возможности, того же
владельца, что и исходный файл, что дает возможность восстановить эти атрибуты при
извлечении файлов из архива.
В некоторых случаях сжатый файл может оказаться даже больше по размеру, чем исходный. Это
происходит, например, для файлов длиной менее 100 байт, потому что механизм сжатия
использует заголовок длиной около 50 байт. Для файлов, представляющих собой случайную
последовательность символов (в том числе для выходных файлов большинства файловых
архиваторов) длина файла увеличивается примерно на 0.5%.
Команда bunzip2 (или bzip2 -d) разархивирует указанные в командной строке файлы. Если эти
файлы не были созданы программой bzip2, они не будут разархивироваться, будет выдано
соответствующее предупреждение. При разархивации bzip2 пытается угадать имя
разархивируемого файла по следующим правилам:
filename.bz2 заменяется на filename; filename.bz заменяется на filename; filename.tbz2 заменяется
на filename.tar; filename.tbz заменяется на filename.tar; любое другое "имя" заменяется на
"имя.out".
Опции командной строки для bzip2 очень похожи на опции команды gzip, но все же они не
идентичны.
Аргументы командной строки, которым предшествует двойное тире и пробел, трактуются как
имена файлов, даже если они начинаются с тире. Например,
[user]$ bzip2 -- -myfilename
Я думаю, что приведенных данных достаточно для квалифицированного применения архиваторов
tar, gzip и bzip2. За дополнительными сведениями, как всегда, обращайтесь к интерактивной
подсказке man. По утилите bzip2 имеется "Bzip2-HOWTO”, который даже переведен на русский
язык
74
Опция
Значение
-d,
-decompress
Принудительная разархивация. Эта опция необходима в силу того, что bzip2,
bunzip2 и bzcat— это на самом деле одна и та же программа, которая сама
по расширению имени файла принимает решение о том, какое действие
надо выполнить над указанным файлом. Опция -d отключает этот механизм
и
заставляет программу
разархивировать указанные файлы
Принудительная
архивация
-z,
--compress
-t, --test
Проверка целостности указанного файла(ов) без разархивации
-f, --force
Перезапись существующего файла. По умолчанию bzip2 не перезаписывает
существующие файлы. Если вы хотите перезаписать существующий файл,
надо задать опцию -f
Сохранять (не удалять) исходные файлы при архивации или разархивации
-k, --keep
-s, --small
-q, --quiet
Снижает требования к объему используемой оперативной памяти за счет
снижения скорости архивации. Эту опцию рекомендуется применять на
Не
выводить малосущественные
сообщения
компьютерах
с малым объемом ОЗУ
(8Мбайт и меньше)
-v, --verbose
-L, --license,
-V, --version
Выводить дополнительную информацию в процессе работе (представляет
интерес в диагностических целях)
Отобразить версию программы и лицензионное соглашение
Примеры применения tar
Для экономии дискового пространства при создании резервного архива еще лучше использовать
сжатие. Команда tar обеспечивает сжатие данных программой gzip с помощью опции командной
строки z либо bzip2 - опция j. Достаточно включить ее в командную строку создания резервной
копии и изменить имя архива. Например:
# tar cvzf users.tar.bz /home #архивация
# tar xvzf users.tar.bz #Извлечение из архива
# tar cvjf users.tar.bz /home #архивация
# tar xvjf users.tar.bz #Извлечение из архива
75
Оболочка, Shell, командный интерпетатор.
Когда мы говорим, что "пользователь работает с операционной системой", фактически это не
верно, поскольку на деле взаимодействие с пользователем организует специальная программа.
Существует два вида таких программ — оболочка, или shell, для работы в текстовом режиме
(интерфейс командной строки) и графический интерфейс пользователя GUI (Graphical User
Interface), организующий взаимодействие с пользователем в графическом режиме.
Сразу надо сказать, что в принципе любая программа в Linux может быть запущена как через
оболочку (если запущен X-сервер), так и через графический интерфейс пользователя. Запуск
программ из оболочки эквивалентен (двойному) щелчку мышкой по иконке программы в GUI.
Передача аргументов программе в текстовом режиме аналогична тому, что мы "бросаем" что-то
на иконку программы в графическом. Но, с другой стороны, некоторые программы не
приспособлены для запуска через GUI и, соответственно, могут быть исполнены, только из
командной строки.
Когда-то (в первых UNIX®-системах) это была программа с именем sh, которое было сокращением
от shell. Потом были разработаны несколько ее улучшенных вариантов, в частности, Bourne shell
— расширенная версия sh, написанная Стивом Борном (Steve Bourne). В рамках проекта GNU
(проект Р.Столлмана по разработке свободного ПО, см. www.gnu.org) была создана оболочка bash,
название которой расшифровывается как Bourne-again shell, т. е. "снова оболочка Борна". Поанглийски в этом названии просматривается еще и игра слов, связанная с тем, что Bourne звучит
как borne (рождаться, рожденный), и получается "заново рожденная shell". Оболочка bash была
написана Брайеном Фоксом (Brian Fox — основной разработчик) и Четом Рэми (Chet Ramey).
Именно bash мы и будем далее рассматривать, и всюду ниже, где говорится об оболочке вообще,
вы смело можете считать, что речь идет о bash.
Сама по себе оболочка bash не выполняет никаких прикладных задач. Но она обеспечивает
выполнение всех приложений: нахождение вызываемых программ, их запуск и организацию
ввода/вывода. Кроме того, оболочка отвечает за работу с переменными окружения и выполняет
некоторые преобразования (подстановки) аргументов.
Но главное свойство оболочки, которое делает ее мощным инструментом пользователя — это то,
что она включает в себя простой язык программирования. Как давно доказано в математике,
любой алгоритм можно построить из пары-тройки основных операций и одного условного
оператора. Реализацию условных операторов (а также операторов цикла) и берет на себя
оболочка. Она использует все остальные утилиты и программы (и те, которые имеются в составе
операционной системы, и те, что устанавливаются отдельно) как базовые операции
поддерживаемого ею языка программирования, обеспечивает передачу им аргументов, а также
передачу результатов их работы другим программам или пользователю. В результате получается
очень мощный язык программирования. И в этом основная сила и одна из существенных функций
оболочки.
UNIX® это многозадачная, многопользовательская операционная система. Это означает, что много
людей может одновременно использовать один компьютер, выполняя много различных задач.
(Это существенное отличие от MS-DOS, где только один человек может использовать в данный
76
момент операционную систему). В UNIX® пользователи должны себя идентифицировать при
входе, что состоит из двух шагов: ввода имени (имя, по которому вас идентифицирует система) и
входной пароль, который является вашим секретным словом для открытия вашего счета
(регистрации в системе). Поскольку только вы знаете пароль, никто не может войти в систему под
вашим именем.
В традиционных UNIX®-системах системный администратор присвоит вам имя и начальный
пароль при вашей регистрации в системе (при заведении в системе нового пользователя). Но
поскольку на своем персональном компьютере вы и системный администратор, вы должны себя
(как пользователя) зарегистрировать в системе, прежде чем в нее войдете. Для дальнейших
разговоров возьмем условное имя ``larry''.
Кроме прочего, каждая система UNIX® имеет приписанное ей hostname (имя).
Hostname используется для идентификации отдельных машин в сети, но даже если ваша машина
не в сети, она все равно должна иметь hostname.
После регистрации в системе Вы увидите на экране приглашение. Вид приглашения может
зависеть от имени пользователя. Стандарное правило: - пользователь root имееет приглашение
заканчивающиеся симоволом «#».
Например:
linux:/ora_idx/backup/depot #
А у обычного пользователя это может выглядеть так:
user@linux:/ora_idx/backup/depot >
Таким образом приглашение формируется из
имени_пользователя@имени_хоста:/имени_текущего_каталога.
Начало работы с Shell
При входе вы увидите на экране подсказку, например, такого вида:
mousehouse login:
Введите свое имя и нажмите клавишу Return. Наш герой larry напечатает следующее:
mousehouse login:
larry
Password:
Теперь введите ваш пароль (password). При вводе пароль не будет отображаться на экране, так
что набирайте внимательнее. Если вы неправильно набрали пароль, то увидите на экране
сообщение
Login incorrect
и вам следует попытаться еще раз.
Когда вы наконец правильно введете имя пользователя и пароль, вы официально будете
допущены в систему и можете в ней свободно путешествовать.
Вы также должны представлять, как можно менять пароль. Команда "passwd" (именно с
пропущенными буквами она и пишется) спросит вас про старый пароль и про новый. Она
77
попросит дважды ввести новый пороль для надежности. Внимание! Не забывайте свой пароль,
иначе вам придется просить системного администратора уничтожить его и установить новый.
Прежде, чем идти дальше, мы расскажем, как выйти из системы. При наличии подсказки shell
используйте команду
/home/larry# exit
для выхода. Есть другие способы выхода, но этот самый безопасный. Завершение работы с
отключением питания (доступно только root по умолчанию) используется одна из команд:
/home/larry# poweroff
/home/larry# halt
/home/larry# shutdown -p now
Программы
Программа - это набор инструкций для компьютера. Программы, которые могут быть выполнены
компьютером без предварительной трансляции, называются исполняемыми программами или
командами. Как обычному пользователю системы UNIX® вам доступно множество стандартных
программ и инструментальных средств. Если вы используете систему UNIX® для написания
программ и развития программного обеспечения, то вы также можете задействовать системные
вызовы, подпрограммы и другие инструментальные средства. И, конечно, любая написанная вами
программа будет в вашем распоряжении.
Выполнение команд
Чтобы ваш запрос был понятен системе UNIX® вы должны ввести каждую команду в корректном
формате или синтаксисе командной строки. Этот синтаксис определяет порядок, в котором вы
вводите компоненты командной строки. И вы должны расположить все составные части
командной строки в требуемом синтаксисом порядке, иначе shell не сможет интерпретировать
ваш запрос.
Пример синтаксиса командной строки:
command option(s) argument(s) <CR>
Для каждой командной строки системы UNIX® вы должны ввести как минимум два компонента:
имя команды и клавишу <RETURN>. (Обозначение <CR> используется в документации как
инструкция для нажатия клавиши RETURN). Командная строка может также содержать ключи и
аргументы. В указанном примере синтаксиса командной строки: command - это имя программы,
которую вы хотите выполнить;
option - ключи, которые указывают как запустить команду;
argument - указывает на данные, которые эта команда обрабатывает, обычно это имя каталога или
файла.
В командной строке, которая включает ключи и/или аргументы, каждый компонент отделяется
друг от друга по крайней мере одним пробелом. Если аргумент содержит пробел, его надо
заключить в двойные кавычки. Например, если аргумент sample 1, то вы должны указать его в
командной строке как "sample 1". Если вы позабудете поставить двойные кавычки, то shell будет
78
интерпретировать sample и 1 как два отдельных аргумента. Некоторые команды позволяют вам
указывать несколько и/или аргументов в одной командной строке. Например:
Пример
Ls
-li
file1 file2 file3
Комманда
Ключи
аргументы
В этом примере команда ls использует два ключа -l и -i и три аргумента file1, file2 и file3. Ключ -l
обеспечивает информацию в длинном формате, включая режим, владельца и размер, а ключ -i
печатает номер inode. Система UNIX® обычно позволяет вам группировать ключи, например -li, и
выводить их в любом порядке. Этого нельзя делать с аргументами.
Невзирая на разное количество компонентов, не забудьте в конце командной строки нажать
клавишу <RETURN>.
Чтобы выполнить команду, введите командную строку, когда на экране появится подсказка
(например, символ #). Shell рассмотрит вашу команду как ввод, найдет один или более каталогов,
чтобы вызвать программу, которую вы указали, и перенаправит ваш запрос вместе с
затребованными программами ядру. Ядро последует инструкциям в программе и выполнит
команду, которую вы запрашивали.
После завершения выполнения программы, shell сигнализирует, что готов выполнить следующую
команду, напечатав подсказку.
Команды Shell
Командная директива (или просто команда) - основная единица, посредством которой
пользователь взаимодействует с шеллом. Она образуется по определенным правилам,
именуемым синтаксисом. Синтаксис командной директивы определяется, в первую очередь,
языком, принятым в данной командной оболочке. Кроме того, некоторые команды (не очень
многочисленные, но весьма употребимые) имеют собственный, нестандартный синтаксис.
Однако в целом базовые правила построения команд имеют много общего - по крайней мере, в
POSIX-совместимом семействе. И именно эти базовые правила будут предметом данного раздела.
Синтаксические особенности отдельных нестандартных команд будут оговариваться по ходу
изложения.
Итак, командная директива образуется:



именем команды, однозначно определяющим ее назначение,,
опциями, определяющими условия выполнения команды, и
аргументами - объектами, над которым осуществляются действия.
Очевидно, что имя команды является обязательным компонентом, тогда как опции и аргументы
могут и отсутствовать (или подразумеваться в неявном виде по умолчанию).
Еще один непременный компонент командной директивы - это специальный невидимый символ
конца строки: именно его ввод отправляет команду на исполнение. В обыденной жизни этот
символ вводится нажатием и отпусканием клавиши Enter. Почему обычно и говорят: для
исполнения команды нажмите клавишу Enter. Тот же эффект, как правило, достигается
79
комбинацией клавиш Control+M. Конца командной строки, знаменующего исполнения команды,
мы на экране не видим. Однако важно, что это - такой же символ, как и любой другой (хотя и
имеющий специальное значение). Это знание нам понадобится, когда речь дойдет до
специальных символов вообще (и даже немного раньше).
В подавляющем большинстве случаев опции (или их последовательности) задаются
непосредственно за именем команды, а аргумент (или группа аргументов) команду завершает,
хотя это правило имеет некоторые исключения. Вне зависимости от порядка опций и аргументов,
принятых для данной команды, интерпретация их осуществляется слева направо.
Команды, опции и аргументы обязательно разделяются между собой пробелами. Кроме того,
опции обычно предваряются (без пробела) символом дефиса или двойного дефиса. Впрочем,
немногочисленные (но весьма употребимые) команды могут использоваться с опциями без
всяких предваряющих символов.
Как уже говорилось, имя команды определяет выполняемые ею функции. Существуют команды,
встроенные в оболочку, то есть не имеющие соответствующих им исполняемых файлов, и
команды внешние. В последнем случае имя команды однозначно указывает на имя исполняемого
файла программы, выполняемой при отдаче соответствующей директивы. Часто встроенные и
внешние команды одного назначения имеют одинаковые имена - в этом случае по некоторым
причинам, которые станут ясными через раздел, обычно предпочтительно использование
встроенных команд.
Некоторые команды могут выступать под несколькими именами. Это связано с тем, что
исторически в различных UNIX®-системах команды, исполнявшие одинаковые функции, могли
получать разные имена. В каждой конкретной системе обычно используется только одна из таких
команд-дублеров. Но при этом имена дублирующих команд также могут присутствовать в системе
- для совместимости. Не следует думать, что это две различные программы одного назначения:
как правило, такая синонимичность команд реализуется посредством механизма ссылок или
псевдонимов (alias), о которых речь пойдет позднее.
Иногда команда, вызванная через имя своего синонима, может отличаться по своей
функциональности от самой же себя, вызванной под родным именем. В этом случае говорят о
эмуляции одной команды другой. Типичный пример - командная оболочка bash в большинстве
дистрибутивов Linux имеет своего дублера - sh; вызванная таким образом, она воспроизводят
функциональность того самого пресловутого POSIX-шелла, о котором я недавно говорил как о
явлении мифическом.
Для правильного применения команд, конечно же, нужно знать их имена и назначение. Однако
нас никто не заставляет напрягать пальцы вводом имени команды полностью. Потому что нам на
помощь приходит великий принцип автодополнения: для любой команды достаточно ввести
первые несколько ее символов - и нажать клавишу табуляции (Tab). И, если введенных буковок
достаточно для однозначной идентификации, полное имя команды волшебным образом
возникнет в строке. Если же наш ввод допускает альтернативы продолжения имени - все они
высветятся на экране, и из них можно будет выбрать подходящую.
80
Пример Создание пустого файла выполняется командой touch. Чтобы ввести ее имя в строку,
достаточно набрать первые три ее буквы - tou, - и клавишу Tab, остальные два символа будут
добавлены автоматически. Если же мы из естественной человеческой лени ограничимся только
двумя первыми символами, то после нажатия табулятора нам будет предложен список
возможных дополнений:
# to toc2cue
toc2mp3
toe top touch
из которого мы и выберем подходящее. В данном случае достаточно набора еще одной буковки и
повторного нажатия на Tab. А вот если прибегнуть к табулятору в пустой командной строке - перед
нами предстанет список имен всех команд, доступных в данной системе.
Большинство употребимых команд POSIX-систем - коротки и ясны. И может показаться. что не
такое уж это облегчение - заменить ввод двух-трех символов нажатием табулятора (а то еще и
неоднократным). Однако когда речь дойдет до аргументов команд - тут вся мощь автодополнения
станет явной.
И еще маленькое отступление. Автодополнение - стандартная возможность bash и всех других
командных оболочек, относимых к категории развитых. Но как раз в стандарте POSIX эта
возможность не предусмотрена, и потому POSIX shell ее лишен.
Опции
Как уже говорилось, указания имени достаточно для выполнения некоторых команд. Типичный
пример - команда ls (от list), предназначенная для просмотра имен файлов (строго говоря,
содержимого каталогов, но к этому понятию еще предстоит вернуться). Данная без аргументов,
она выводит список имен файлов, составляющих текущий каталог, представленный в некоторой
форме по умолчанию.
Исполнение же многих других команд невозможно без указания опций и (или) аргументов. Для
них в ответ на ввод одного ее имени часто следует не сообщение об ошибке (или не только оно),
но и краткая справка по использованию команды. Например, в ответ на ввод команды для
создания каталогов mkdir (от make directory) последует следующий вывод:
usage: mkdir [-pv] [-m mode] directory ...
Для одних опций достаточно факта их присутствия в командой директиве, другие же требуют
указания их значений (даваемых после опции через пробел или знак равенства). В приведенном
примере команды mkdir к первым относятся опции -v, предписывающая выводит информацию о
ходе выполнения команды (запомним эту опцию - в том же смысле она используется чуть ли не во
всех командах UNIX®), и -p, которая позволяет создать любую цепочку промежуточных каталогов
между текущим и новообразуемым (в случае их отсутствия).
А вот опция -m, определяющая атрибуты доступа к создаваемому каталогу, обязательно требует
указания значения - этих самых атрибутов, заданных в символьной форме.
Многие опции имеют две формы - краткую, односимвольную, и полную, или многосимвольную,
Некоторые же опции могут быть даны только в многосимвольной форме.
Общее правило здесь таково: если одного символа достаточно для однозначного определения
опции, могут употребляться обе формы в качестве равноправных. Однако поскольку количество
символов латинского алфавита ограниченно (а человеческая фантазия, конструирующая опции 81
безгранична), при большом количестве опций одной команды некоторые из них приходится
делать исключительно многосимвольными.
Продемонстрирую это на примере опций все той же команды mkdir. Полный их список будет
следующим:





-m, --mode=MODE установить код доступа (как в chmod)
-p, --parents не выдавать ошибок если существует, создавать родительские
каталоги если необходимо
-v, --verbose печатать сообщение о каждом созданном каталоге
--help показать помощь и выйти
--version вывести информацию о версии и выйти
Очевидно, что для опции --version краткая форма совпала бы с таковой для опции --verbose, и
потому первая существует только в полной форме. А вот для опции --help краткая форма в
большинстве команд возможна, и она выглядит как -h. Более того, во многих командах вызов
помощи может быть вызван посредством опции -?. К слову сказать - приведенный выше список
опций команды mkdir получен именно таким способом.
Раз уж зашла речь об опциях --version и -h (--help, -?), давайте и их запомним на будущее: как и
опция -v, --verbose, смысл их идентичен почти во всех командах.
Опять-таки, из того же примера видно, что опции в односимвольной форме ghtldfhz.ncz
единичным символом дефиса и могут быть даны единым блоком, без пробелов:
# mkdir -vpm 777 dir/subdir
При этом, естественно, опция, требующая указания значений, ставится последней, и ее значение
отделяется пробелом. Опции же в многосимвольной форме требуют предварения удвоенным
дефисом, обязательно должны разделяться пробелами и значения их, если таковые требуются,
присваиваются через символ равенства (по научному он называется еще оператором
присваивания):
# mkdir --parents --mode=777 dir/subdir
Загадочные семерки после опции -m (--mode) - это и есть те самые атрибуты доступа, данные в
символьной нотации. Смысл их прояснится позднее.
Опции команды именуются также флагами (реже ключами) или параметрами. Однозначной
трактовки этих терминов нет. Однако обычно под флагами подразумеваются опции, не
требующие указания значений. Термин параметр же применяется к опции, такового требующей, и
объединяет опцию и ее значение. Правда, мне встречалось определение параметра как
совокупности опций и аргументов, но я буду придерживаться приведенных определений.
Опции определяют условия выполнения команды. Можно использовать команду ls без опций.
Однако на самом деле отсутствием опций при ней определяется вид выводимого списка по
умолчанию - как состоящего из имен файлов без учета т.н. скрытых файлов (а таковыми являются
файлы, имена которых начинаются с символа точки, почему они еще называются dot-файлами),
без каких-либо их атрибутов и без визуального различения файлов различных типов.
Различные же опции команды ls определяют состав и формат выводимого списка файлов. Так, в
форме
82
# ls -a
она обеспечивает вывод списка имен всех файлов, включенных в текущий каталог, включая
скрытые файлы вида .* (символ * здесь обозначает шаблон имени, соответствующий любому
количеству любых символов - в том числе и нулевому, то есть отсутствию оных, а также символы
текущего (./) и родительского (../) каталогов; в форме
# ls -l
дается вывод списка имен файлов в "длинном" формате (отсюда название опции -l - от long), то
есть с указанием атрибутов доступа, принадлежности, времени модификации, размера и
некоторых других характеристик, которые будут подробно рассмотрены в следующем разделе;
форма
# ls -F
позволяет получить список файлов с символьным различением файлов различных типов.
Например, имя каталога будет выглядеть как dirname/, имя исполнимого файла - как filename*
(здесь звездочка - не шаблон имени, а символическое обозначение исполняемого файла), и так
далее; а форма
# ls --color=auto
представит те же типы файлов в списке в различной цветовой гамме (впрочем, при некоторых
условиях; и, добавлю, auto - лишь одно из возможных значений опции --color).
Я столь подробно остановился на команде ls не только из-за многочисленности ее опций: это одна из самых употребимых команд для просмотра файловой системы. И, должным образом
настроенная (в том числе и с помощью приведенных опций), она дает ничуть не менее
информативную и зрительно выразительную картину, чем развитые файловые менеджеры.
Порядок опций, если их приводится более одной, для большинства команд не существенен. Хотя,
например, для команды tar, создающей файловые архивы, опция -f, значением которой является
имя создаваемого или распаковываемого архива, традиционно указывается последней. И, к слову
сказать, именно эта команда - одна из немногих, опции которой не обязаны предваряться
символами дефиса. Так, директивы
# tar cf filename.tar dir
и
# tar -cf filename.tar dir
абсолютно равноценны: и та, и другая создает единый архивный файл filename.tar из отдельных
файлов каталога dir.
Особый смысл имеет символ удвоенного дефиса --, если после него не следует никакой опции:
таким образом обозначается конец списка опций, и все последующие, отделенные пробелом,
символы интерпретируются как аргументы (со временем я расскажу, когда это оказывается
необходимым). Одинарный же дефис с последующим пробелом, напротив, подменяет аргументы
команды: то есть в качестве таковых рассматривается стандартный ввод.
Аргументы
Однако тема стандартного ввода (а равно и вывода) - у нас еще впереди. А пока мы подобрались к
понятию аргументов командной директивы. Аргументами определяется, как правило, объект (или
83
объекты) действия команды. В большинстве случаев в качестве аргументов команд выступают
имена файлов и (или) пути к ним. Выше говорилось, что при отсутствии аргументов команда ls
выводит список имен файлов текущего каталога. Это значит, что текущий каталог выступает как
заданный неявным образом (по умолчанию) аргумент команды ls. Если же требуется вывести
список имен файлов каталога, отличного от текущего, путь к нему должен быть указан в качестве
аргумента команды явно, например:
# ls /usr/local/bin
Для правильного построения аргументов команды требуется рассмотрение еще одного понятия пути к файлу. Путь - это точное позиционирование файла в файловой системе относительно ее
корня (обозначаемого символом прямого слэша - /) или нашего в ней положения - текущего
каталога (который, напомню, символически обозначается единичной точкой - .).
Так, если пользователь находится в своем домашнем каталоге (абсолютный путь к нему обычно
выглядит как /home/username), то просмотреть содержимое каталога /usr/local/bin он может
двумя способами - тем, который был дан в предыдущем примере, и вот так:
# ls ../../usr/local/bin
Первый путь в аргументе команды ls - абсолютный, отсчитываемый от корневого каталога, второй
- задается относительно каталога текущего, ведь ../ - это родительский каталог к нему.
Пути в аргументах команд могут быть весьма длинными. Например, чтобы просмотреть
доступные раскладки клавиатуры, нужно дать команду примерно следующего вида:
# ls /usr/share/kbd/keymaps/i386/qwerty
И Вы вправе спросить? неужели мне все это вводить вручную. Отнюдь! Потому что
автодополнение, о котором упоминалось по ходу разговора об именах команд, действует также
для путей в их аргументах. И в данном случае обязательный ввод будет выглядеть следующим
образом:
# ls /ushkki3qy
Большинство команд допускает указание не одного, а нескольких (и даже очень многих)
аргументов. Так, единой директивой вида
# cp file1 file2 ... fileN dir
можно скопировать (команда cp - от copy) сколько угодно файлов из текущего каталога в каталог
dir (на самом деле на это "сколько угодно" накладываются некоторые ограничения, но
практически предел очень далек).
Маленькое отступление. Упоминание команды cp - удобный случай чуть вернуться назад и
рассмотреть одну очень важную опцию, почти универсальную для команд POSIX-систем. Для
начала попробуем скопировать один каталог в другой:
# cp dir1 dir2
Как вы думаете, что получится в результате? Правильно, сообщение о невозможности выполнения
этой операции вида
cp: omitting directory 'dir1'
поскольку команда cp в чистом виде для копирования каталогов не предназначена. Что делать?
Очень просто - указать опцию -R (от Recursive; в большинстве систем проходит и опция -r с тем же
84
смыслом, но первая форма работает абсолютно везде). В результате в каталог dir2 не только будут
скопированы сам каталог dir1 и все входящие в него файлы, но и вложенные подкаталоги из dir1,
если таковые имеются.
Маленькое уточнение: вполне возможно, что в дистрибутиве, который имеется в вашем
распоряжении, проходит и копирование каталогов просто через cp, без всяких дополнительных
опций. Это - потому, что команда cp часто определяется как псевдоним самой себя с опцией
рекурсивного копирования, о чем скоро пойдет речь в этом разделе.
Вообще рекурсия (то есть определение некоего выражения через самого себя) - очень важное
понятие в UNIX®, пронизывающее происходящие от нее системы насквозь. Однако сейчас для нас
важно только то, что рекурсия применима практически ко всем файловым операциям, позволяя
распространить действие одной командной директивы не только на файлы данного каталога, но и
на все вложенные подкаталоги и их содержимое.
Однако вернемся к аргументам. Действие некоторых команд неоднозначно в зависимости от
аргументов, к которым она применяется. Например, команда mv служит как для переименования
файлов, так и для их перемещения в другой каталог. Как же она узнает, что ей делать в данном
конкретном случае? Да именно по аргументам. Если дать ее в форме
# mv filename1 filename2
то следствием будет переименование filename1 в filename2. А вот если первым аргументом указан
файл, а вторым - каталог, например
# mv filename dir
то результатом будет перемещение filename из текущего каталога в каталог dir. К слову сказать,
команды типа mv воспринимают разное количество аргументов в зависимости от того, какие они,
эти аргументы В первом примере аргументов может быть только два - имя исходного файла и имя
файла целевого. Зато во втором примере в качестве аргументов можно задать сколько угодно
файлов и каталогов (с учетом вышеприведенной оговорки относительно "сколько угодно") - все
они будут перемещены в тот каталог, который окажется последним в списке. То есть директивой:
# mv file1 ... fileN dir1 ... dirM dirN
в каталог dirN будут перемещены все файлы file1 ... fileN и все каталоги dir1 ... dirM. Характерно,
что для этого команде mv, в отличие от команды cp не требуется каких-либо дополнительных
опций - она рекурсивна по самой своей природе.
Исключения
Итак, типичная форма POSIX-команды в обобщенном виде выглядит следующим образом:
# command -[otions] [arguments]
Из этого правила выбиваются немногочисленные, но весьма полезные и часто используемые
команды. Однако и для таких команд с нестандартным синтаксисом устанавливаются те же
компоненты - имя, опции, аргументы, хотя по ряду причин (в том числе исторических) порядок их
может меняться.
Это можно проиллюстрировать на примере полезнейшей команды find, предназначенной для
поиска файлов (и не только для этого - она являет собой почти универсальное орудие в деле
85
всякого рода файловых манипуляций). Подробный разговор о ней - дело будущего, однако пока
можно заметить, что в типичной своей форме она выглядит примерно следующим образом:
# find dir -option1 value -option2 [value]
Здесь dir - каталог, в котором выполняется поиск, - может рассматриваться в качестве аргумента
команды. Опция -option1 (обратим внимание, что здесь, не смотря на многосимвольность опций,
они предваряются единичным символом дефиса) и ее значение value определяют критерий
поиска, например, -name filename - поиск файла с указанным именем, а опция -option2
предписывает, что же делать с найденным файлом (файлами), например, -print - вывести его имя
на экран. Причем опция действия также может иметь значение. Например, значением опции -exec
будет имя команды, вызываемой для обработки найденного файла (файлов). Так, директива вида
# find ~/ -name *.tar -exec tar xf {} \;
требует отыскать в домашнем каталоге (~/), выступающем в качестве аргумента, файлы, имя
которых (первая опция - критерия поиска) соответствует шаблону *.tar (значение первой опции), и
выполнить (вторая опция - действия) в их отношении команду tar с собственными опциями,
обеспечивающими распаковку архивов (значение второй опции). Интересно, что в этом контексте
в качестве значений второй опции команды find выступает не только внешняя команда, но и все
относящиеся к ней опции.
В последнем примере имеется несколько символов, смысл которых может показаться
непонятным. Он прояснится достаточно скоро.
Виртуальные консоли
Системная консоль - это монитор и клавиатура, связанные непосредственно с системой.
(Поскольку UNIX® многопользовательская система, вы можете иметь дополнительные терминалы,
связанные через последовательные порты с вашей системой, но они не будут консолями). Linux,
как и некоторые другие версии UNIX®, обеспечивает доступ к виртуальным консолям (или VC),
которые позволяют войти в систему под несколькими именами в одно время.
Для демонстрации этого войдите в систему (как было показано ранее). Теперь нажмите alt- F2. Вы
должны снова увидеть подсказку login: , то есть перед вами вторая виртуальная консоль, а вы
вошли через первую. Чтобы переключиться обратно на первую VC, нажмите alt-F1. Вы снова на
первой консоли.
Свежеинсталлированный Linux возможно позволит вам работать с 4-6 первыми VC, используя от
alt-F1 до alt-F6. Но возможно обеспечить работу с 12-ю VC - по одной на каждую функциональную
клавишу. Как видите, использование VC может быть очень эффективным - вы можете работать на
нескольких VC одновременно.
В то время, как использование виртуальных консолей ограничено (кроме прочего, в каждый
момент времени вы можете видеть только одну виртуальную консоль) оно дает вам
представление о многопользовательских возможностях UNIX®. Пока вы работаете на VC #1, вы
можете переключиться на VC #2 и начать работу над чем-то другим.
По команде
[root@newsrv root]# tty
86
/dev/tty2
выводится наименование текущей консоли (виртуального терминала).
Псевдонимы и переменные
Вернемся на минуту к команде ls. У Вас может возникнуть вполне резонный вопрос: а если я
всегда хочу видеть ее вывод в цвете, да еще с символическим различением типов файлов, да еще
в "длинном" формате; ну и без вывода скрытых файлов мне никак не прожить. И что же - мне
каждый раз вводить кучу опций, чтобы получить столь ,элементарный эффект?
Отнюдь! Потому что этот вопрос задавали себе многие поколения пользователей. И ответили на
него просто - введением понятия псевдонима команды (alias).
Что это такое? В большинстве случаев - просто некоторое условное имя, подменяющее
определенную команду с теми ее опциями, которые мы используем чаще всего. Причем, что
характерно, псевдоним команды может совпадать с ее именем. То есть - набирая просто Kls, мы
получаем список файлов не в формате по умолчанию, а в том, в каком угодно нам.
Устанавливаются псевдонимы очень просто - одноименной командой alias, в качестве аргументов
которой выступают имя псевдонима и его значение, соединенные оператором присваивания
(именуемым в просторечии знаком равенства). А именно, если мы хотим ныне, и присно, и во
веки веков видеть вывод команды ls в цвете и символьным различением типов файлов, нам
достаточно дать команду вроде следующей:
# alias ls='ls -F --color=auto'
Где следует обратить внимание на два момента:


на то, что имя псевдонима совпадает с именем команды (что отнюдь не
препятствует создания псевдонима типа ll='ls -l' специально для вывода
файловых списков в длинном формате)
на одинарные кавычки, в которые заключено значение псевдонима. Смысл из
станет ясен позже, а пока просто запомним, что кавычки (и именно одинарные
- обязательный атрибут команды установки псевдонима).
Таким образом мы можем наделать себе псевдонимов на все случаи жизни. В разумных пределах
конечно - иначе вместо упрощения жизни мы создадим себе необходимость запоминания
множество невнятных сочетаний символов. Однако на наиболее важных псевдонимах я
остановлюсь.
Вспомним команды типа cp и mv, которыми мы, в частности, можем скопировать или переместить
какие-то файлы из каталога в каталог. А что произойдет, если чисто случайно в целевом каталоге
уже имеются файлы, одноименные копируемым/перемещаемым? Произойдет штука, могущая
иметь весьма неприятные последствия: файлы в целевом каталоге будут заменены новыми, теми,
что копируются туда или перемещаются. То есть исходное содержание этих файлов будет
утрачено - и безвозвратно, восстановить его невозможно будет никакими силами.
Разумеется, иногда так и нужно, например, при резервном копировании старые версии файлов и
должны быть заменены их более свежими вариантами. Однако такое приемлемо далеко не
всегда. И потому в большинстве команд, связанных с необратимыми изменениями файловой
системы, предусматривается специальная опция - -i (или --interactive). Если задать эту опцию с
87
командой cp или mv, то при совпадении имен исходного и целевого файлов будет запрошено
подтверждение на выполнение соответствующего действия:
# cp file1 file2
10:13 pts/0 cp: overwrite file2'?
И пользователь может решить, нужно ли ему затирать существующий файл, ответив yes (обычно
достаточно y), или это нежелательно, и должно ответить no (а также просто n - или не отвечать
ничего, это равноценно в данном случае отрицательному ответу).
Так вот, дабы не держать в голове необходимость опции -i (ведь, как я уже говорил, пропуск ее в
неподходящий момент может привести к весьма печальным результатам, в подавляющем
большинстве систем для команд cp и mv (а также для команды rm, служащей для удаления
файлов - в POSIX-системах эта операция также практически необратима) определяются
одноименные им псевдонимы такого вида:
# alias cp='cp -i'
# alias mv='mv -i'
# alias rm='rm -i'
Все это, конечно, очень благородно, заметит внимательный читатель. Но что, если мне заведомо
известно, что сотни, а то и тысячи файлов целевого каталога должны быть именно переписаны
новыми своими версиями (как тут не вспомнить про случай с резервным копированием)? Что же,
сидеть и, как дурак, жать на клавишу Y?
Не обязательно. Потому что все команды рассматриваемого класса имеют еще опцию -f (в
"длинной" своей форме, --force, она также практически универсальна для большинства команд).
Которая, отменяя действие опции -i, предписывает принудительно переписать все файлы
целевого каталога их обновленными тезками. И никто не мешает нам на этот случай создать еще
один псевдоним для команды cp, например:
# alias cpf='cp -f'
Правда, предварительно нужно убедиться, что в системе нет уже команды с именем,
совпадающим с именем псевдонима - иначе эффект может быть весьма неожиданным (впрочем,
это относится ко всем псевдонимам, не совпадающим с именами подменяемых команд).
Есть и другой способ обойти опции, установленные для команды-псевдонима: просто отменить
псевдоним. Что делается командой обратного значения
# unalias alias_name
То есть дав директиву
# unalias cp
мы вернем команде копирования ее первозданный смысл. Ну а узнать, какие псевдонимы у нас
определены в данный момент, и каковы их значения, еще проще: команда
# alias
без опций и аргументов выведет полный их список:
la='ls -A'
color=auto'
less='less
-M'
li='ls
-ial'
ll='ls
-l'
ls='ls
-F
-88
и так далее.
Когда я сказал о пользовании псевдонимами ныне, и присно, и вовек, - то был не совсем точен.
Ныне, то есть в текущем сеансе пользователя - да, они работают. Однако после рестарта системы
(или просто после выхода из данной оболочки) они исчезнут без следа. Чтобы заданные
псевдонимы увековечить, их нужно прописать в конфигурационном файле пользовательского
шелла. Но этим мы займемся впоследствии. А пока обратимся к переменным.
Переменные
Переменные играют для аргументов команд примерно такую же роль, что и псевдонимы - для
команд. То есть избавляют от необходимости мрачного ввода повторяющихся
последовательностей символов. Конечно, это - далеко не единственное (а может и не главное)
назначение переменных, однако на данном этапе для нас наиболее существенное.
Что такое переменная? Ответ просто - некоторое имя, которому присвоено некоторое значение.
Имена переменных в принципе могут быть любыми, хотя некоторые ограничения также
существуют. Некоторые имена зарезервированы за внутренними, или встроенными,
переменными оболочки (некий минимальный их набор имеется в любом шелле). То есть
значения их определены раз и навсегда. и пользователем не изменяются. То есть он, конечно,
может их изменить, если очень хочет - но ничего доброго, кроме путаницы, их этого не выйдет.
Таким встроенных переменных довольно много. И одна из первых по значению – переменная
PATH. Это - список каталогов, в которых оболочка, в ответ на ввод пользователя в командной
строке, ищет исполнимые файлы - то есть просто команды. Вы, наверное, обратили внимание, что
во всех приведенных выше примерах имена команд указывались без всяких путей к ним (в
отличие от файлов-аргументов, путь к которым - обязателен). Так вот, успех ее поисков и
определяется списком значений переменной PATH, которые могут быть просмотрены командой
echo
# echo $PATH
Обратим внимание на то, что в качества аргумента команды выступает не просто имя
переменной, а оно же, но предваренное символом доллара. Который, в данном случае, никакого
отношения к приглашению командной строки не имеет, а предписывает команде echo подменить
имя переменной ее значением (значениями). В данном случае вывод команды будет примерно
таким:
/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
Тем временем вернемся к переменной PATH Значение ее - полный абсолютный путь к домашнему
каталогу пользователя. То есть, чтобы перейти в него, пользователю по имени alv вместо
# cd /home/alv
достаточно набрать
# cd $HOME
и он в своих владениях. Может показаться, что экономия - грошовая, но минуту терпения - и
выгоду от использования переменных вы увидите.
89
Кроме переменных, предопределенных в шелле, пользователю предоставляется почти полная
свобода в определении переменных собственных. И вот тут-то и наступает ему обещанное
облегчение при наборе аргументов команд.
Предположим, что у нас имеется глубоко вложенный подкаталог с данными, постоянно
требующимися в работе. Условимся, что путь к нему - следующий:
/home/alv/data/all.my.works/geology/plate-tectonics
Весьма удручающе для набора, даже если исправно работать табулятором для автодополнения,
не так ли? Прекрасно, упрощаем себе жизнь определением переменной:
# PLATE=/home/alv/data/all.my.works/geology/plate-tectonics
Дело в шляпе, Теперь, если нам нужно просмотреть состав этого каталога, достаточно будет
команды
# ls $PLATE
А вызвать из него любой файл для редактирования можно так:
# vim $PLATE/filename
Подобно псевдонимам, переменные, определенные таким образом (то есть просто в командной
строке), имеют силу только в текущем сеансе работы - по выходе из оболочки они утрачиваются.
Для того, чтобы они действовали перманентно, переменные должны быть прописаны в
конфигурационном файле пользовательского шелла. Однако, в отличие от псевдонимов, и этого
оказывается не всегда достаточно. Ибо переменная, определенная посредством
# NAME=Value
работает не просто только в текущем сеансе - но еще и только в конкретном экземпляре шелла.
Почему и называется переменной оболочки - shell variable. Звучит это. быть может, пока не очень
понятно. Однако изучая раздел о процессах мы увидим, что практически любое действие в шелле
- запуск команды или программы, например, - начинается с того, что оболочка, в которой это
действие совершается, запускает новый экземпляр самой себя - дочерний шелл, или, как иногда
говорят, субшелл.
Так вот, этот самый субшелл не наследует переменные родительской оболочки. И в итоге
запущенная из командной строки программа ничего не будет знать, например, о путях к
исполняемым файлам. Что автоматически ведет к невозможности запуска из нее команд просто
по имени, без указания точного пути.
Чтобы избежать такой неприятной ситуации, было придумано понятие переменной окружения,
или переменной среды - environment variable. Это - те переменные, которые наследуются от
родительского шелла всеми дочерними программами. И чтобы сделать их таковыми, переменные
следует экспортировать. Как? Командой export, которая может быть применена двояким образом.
Можно сначала определить переменную:
# NAME=Value
а затем применить к ней команду export:
# export NAME
А можно сделать это в один прием:
90
# export NAME=Value
Второй способ применяется, если нужно определить и экспортировать одну переменную. Если же
за раз определяется несколько переменных:
# NAME1=Value1 $ NAME2=Value2 ... $ NAMEN=ValueN
то проще прибегнуть к первому способу, так как команда export может иметь сколько угодно
аргументов:
# export NAME1 NAME2 ... NAMEN
Нам еще не раз придется обращаться к вопросу о переменных. Однако для начала сказанного,
наверное, достаточно.
Существуют и иные способы присвоения значений переменным. Одно неизменно - значение
переменной это строка. Например, значение переменной можно присвоить используя строку
вывода некоторой команды.
variab3=`cat /var/run/inetd.pid`
Здесь переменной variab3 присваивается значение вывода, полученной от команды, заключенной
в одинарные кавычки. В данном случае значение переменной variab3 будет PID демона inetd.
Значение переменной можно получить и интерактивно, т.е. с клавиатуры.
echo -n "Введите свое имя" read username
При запуске командный интерпретатор выведет строку "Введите свое имя" и будет ждать ввода с
клавиатуры. Строка, введенная пользователем, и будет значением переменной username. Вообще
говоря, read может присвоить значения сразу нескольким переменным.
echo -n "Введите свое имя и фамилию" read username userfamname
Если пользователь введет свое имя и фамилию через пробелы, то переменным username и
userfamname присвоятся соответственно строки с именем и фамилией пользователя. Если же
введенных значений больше чем определено read, они игнорируются. В случае же пустых
присвоений, значение переменной также пусто.
При использовании любой переменной Shell подставляет ее значение. Существуют также и более
сложные конструкции получения непосредственно значения переменной.
$variable - Значение variable, или ничего если переменная не определена.
${variable} - Аналогично, с отделением имени variable от последующих символов.
${variable:-string} - Значение variable, если переменная определена. В противном случае string.
Значение variable остается неизменным.
${variable:=sring} - Значение variable, если переменная определена. В противном случае string, при
этом variable присваивается значение string.
${variable:?string} - Так называемая "обязательная переменная". Если variable не определена,
выводится строка string и интерпретатор прекращает работу. Если же и строка string пуста, в таком
случае выводится variable: parameter not set
${variable:+string} - Строка string, если переменная variable определена. В противном случае
ничего.
91
Навигация и редактирование
Имя команды, ее опции и аргументы образуют т.н. командные "слова". В качестве разделителей
слов выступают пробелы. Кроме того, как разделители "слов" интерпретируется ряд специальных
символов - прямой слэш (/ - элемент пути к файлу), обратный слэш (), служащий для
экранирования специальных символов, операторы командных конструкций, о которых будет
сказано позднее.
В некоторых случаях имеет смысл различать "большое слово" и "малое". Первое включает в себя
словоразделитель (например, пробел), в качестве же второго интерпретируются символы,
лежащие между словоразделителями. Если не очень понятно - надеюсь, станет яснее при
рассмотрении примеров.
Подчеркнем, что командное "слово" прямо не соотносится ни с опциями, ни с аргументами
команды. Введение этого понятия призвано просто облегчить навигацию в командной строке и ее
редактирование.
Ибо одно из великих достижений командного интерфейса POSIX-систем, оценить которое могут в
полной мере только те, кто застал времена "черного DOS'а", - это возможность перемещения
внутри командной строки и внесения необходимых изменений в имя команды, ее опции и
аргументы. Делается это различными способами.
Самый привычный и, казалось бы, очевидный - использование клавиш перемещения курсора Left,
Right, End и Home, действующих в командной строке точно так же, как и в каком- нибудь вордпроцессоре для Windows (клавиши Up, Down, PageUp, PageDown зарезервированы для других
целей). То есть они позволяют перемещаться на один символ влево и вправо. в начало и конец
командной строки. А если добавить сюда еще клавиши Delete и Backspace, позволяющие удалять
символы в позиции курсора или перед ней - то, казалось бы, чего еще желать?
Оказывается - есть чего, и самый очевидный способ навигации и редактирования оказывается не
самым эффективным. Для начала заметим, что в общем случае привычные
клавиши перемещения курсора и редактирования в POSIX-системах не обязаны работать также,
как они делают это в DOS/Windows. Это зависит от многих причин, в том числе и исторических.
Ведь POSIX-системы по определению предназначены работать на любых машинах (в том числе и
на тех, клавиатуры которых таких клавиш просто не имели).
Однако это не главное - в большинстве Linux-дистрибутивов командная оболочка настраивается
так, чтобы пользователь при желании мог использовать привычные ему клавиши. Однако тут-то и
оказывается, что плюс к этому оболочка предоставляет ему много более эффективную систему
навигации по командной строке и ее редактирования. И это - система управляющих
последовательностей, так называемых keybindings. То есть сочетания специальных клавиш,
именуемых управляющими, с обычными алфавитно-цифровыми.
Основные управляющиеся клавиши, которые используются в таких последовательностях (и
имеются на клавиатурах почти любых машин - как говорят в таких случаях, в любых типах
терминалов) - это клавиши Control и Meta. На Вашей клавиатуре нет клавиши Meta, не ищите, на
PC-клавиатурах функции Meta выполняют:
92
а) нажатие и отпускание клавиши Escape
б) нажатие и удерживание клавиши Alt.
Например, если у Вашего терминала нет функциональных клавиш (F1-F12), а в Midnight
Commander нужно дать команду F5, щелкаем клавишей Esc и затем нажимаем на цифру 5.
Несколько простых рецептов, практически универсальных для любых командных оболочек в
терминалах любых типов:
Рецепт первый: большая часть управляющих последовательностей состоит из сочетания клавиши
Control и алфавитно-цифрового символа. Под сочетанием (или комбинацией, для чего я уже
употреблял ранее символ плюс) понимается то, что, удерживая нажатой клавишу Control, мы
одновременно нажимаем и какую-нибудь литерную.
Так, действие клавишной комбинации Control+F (от Forward - в большинстве случаев регистр
алфавитной клавиши у правляющей последовательности значения не имеет) эквивалентно
нажатию клавиши Right - это перемещение на один символ вправо, комбинации Control+B (от
Back) - нажатию Left (перемещение на один символ влево). Комбинации Control+A и Control+E
действуют аналогично Home и End, перемещая курсор в начало и конец командной строки,
соответственно, Ну а с помощью комбинаций Control+D и Control+H можно удалить единичный
символ в позиции курсора или перед ней (также, как и клавишами Delete и Backspace,
соответственно).
Предвижу резонный вопрос: а какие достоинства в комбинации клавиш Control+Что_то по
сравнению с элементарными End или Left? Конечно, одно достоинство - очевидно: при массовом
вводе команд (а также, забегая вперед, замечу - и любых иных наборов символов. от исходных
текстов до романов), при использовании keybindings руки не отрываются от основной (алфавитноцифровой) части клавиатуры. И в итоге, по приобретении некоторого минимального навыка, дело
движется быстрее.
Главное же преимущество клавиатурных последовательностей перед стандартными
навигационными клавишами - много более широкая их функциональность.
Управляющие последовательности позволяют при навигации и редактировании оперировать не
только единичными символами, но и целыми словами. Например, комбинация Meta+F смещает
курсор на одно "слово" вперед, та же Meta в сочетании с B - на одно слово назад, и так далее.
Прошу обратить внимание: действие алфавитной клавиши в комбинации с Meta сходно по смыслу
ее сочетанию с клавишей Control, но как бы "усилено":
последовательность Meta+D уничтожает не символ в позиции курсора, как это было бы для D в
сочетании с Control, а все командное "слово".
Рассматривать ключевые последовательности подробно здесь я не буду: детали здесь зависят от
командной оболочки и ее настроек, а этим темам будут посвящены специальные разделы в
соответствующей главе). Отмечу только два существенных обстоятельства. Первое: keybindings
предоставляют пользователю полный комплекс приемов для любых действий в командной строке
- вплоть до преобразования регистров уже введенных символов и "слов" (из нижнего в верхний и
93
наоборот), "перетасовки" символов в команде или ее аргументах, и так далее. И не только в
командной строке - большинство популярных в POSIX-мире текстовых редакторов, от простых
nano или joe до грандиозного Vim и монструозного emacs. построены по тому же принципу). Так
что навыки, полученные при работе с keybindings, например, в bash, весьма поспособствуют
виртуозному освоению любого из этих инструментов.
И второе - действие ключевых последовательностей, как правило. не зависит не только от типа
терминала и физического устройства клавиатуры, но и от ее раскладки - при переключении на
кириллицу они будут работать столь же справно, как и в латинице.
Ctrl+b переместить на символ назад
Ctrl+f переместить на символ вперед
Del
удалить символ слева от курсора
Ctrl+d удалить символ под курсором
Ctrl+a переместить курсор в начало строки
Ctrl+e переместить курсор в конец строки
Alt+f
переместить на слово вперед
Alt+b
переместить на слово назад
Ctrl+l
очистить экран
Alt+d
удалить слово после позиции курсора
Ctrl+w удалить слово перед позицией курсора
Эти комбинации определены в файле /etc/inputrc.
История команд
Возможности навигации и редактирования строки особенно ярко проявляются в сочетании с
другой замечательной особенностью, предоставляемой командными оболочками - доступом к
истории команд. То есть: раз введенная в строке команда не уходит в небытие после исполнения,
я помещается в специальный буфер памяти (который, как и все в Linux, именуется весьма
незатейливо - буфер истории команд). Откуда команда (со всеми ее опциями и аргументами)
может быть извлечена для повторного использования. Или - для редактирования и исполнения в
новой реинкарнации.
Буфер истории команд сохраняется в течении всего сеанса работы. Однако в большинстве случаев
командные оболочки настраиваются так, что по выходе из сеанса буфер истории сохраняется в
специальном файле в домашнем каталоге пользователя, и таким образом его содержимое
оказывается доступным при следующем запуске шелла. Имя этого файла может быть различным в
разных оболочках, но обычно включает компонент history (в bash - ~/.bash_history).Так что, можно
сказать, что введенным нами командам суждена вечная жизнь.
94
Конечно, не совсем вечная. И размер буфера истории, и количество строк в файле истории величины конечные. Так что, если установленный передел превышен, то старые команды
вытесняются более новыми. Однако и величину буфера, и количество строк в файле истории
можно установить любыми (в разумных пределах - не знаю, существует ли принципиальное
ограничение на них, за исключением объема памяти и дискового пространства). А если учесть, что
и из буфера, и из памяти с помощью соответствующих настроек (со временем я расскажу, каких)
можно исключить дубликаты и еще кое-какой мусор - то мое заявление о вечной жизни команд
не выглядит столь уж преувеличенным.
Универсальное средство доступа к буферу истории команд - специальная команда, встроенная во
все шеллы, таковой поддерживающие - history. Данная без опций, она выводи полный список
команд в их исторической (издревле к современности) последовательности, или некоторое
количество команд, определенных соответствующими настройками (о которых будет говориться
позднее).
В качестве опции можно указать желаемое количество одновременно выведенных команд.
Например, директива
# history -2
выведет две последние команды из буфера истории вместе с их номерами:
1023 joe shell.html 1024 less ~/.zshrc
Любая из команд в буфере истории может быть повторно запущена на исполнение. Для этого
достаточно набрать в командной строке символ ! (восклицательный знак) и затем, без пробела номер команды в списке буфера. Например,
# !1023
для приведенного выше примера повторно откроет файл shell.html в текстовом редакторе joe.
Другой способ доступа к командам из буфера истории - комбинации клавиш Control+P и
Control+N, служащие для последовательного его просмотра (как бы "пролистывания") назад и,
соответственно, вперед (разумеется, если есть куда). Они дублируются клавишами управления
курсором Up и Down (назад и вперед, соответственно). Кроме того, последовательности Meta+< и
Meta+> обеспечивают переход к первой и последней команде в буфере истории.
Любая извлеченная (с помощью стрелок или управляющими последовательностями) из буфера
истории в текущую строку команда может быть повторно запущена на исполнение - нажатием
клавиши Enter или дублирующей ее комбинацией Control+M. Причем предварительно ее можно
отредактировать - изменить опции, или аргументы, - точно так же, как и только что введенную.
Во всех современных "развитых" шеллах предусмотрены средства поиска команды в буфере
истории - простым перебором (обычно Meta+P - назад и Meta+N - вперед). Впрочем, не смотря на
громкое название, это ничем практически не отличается от обычного пролистывания стрелками.
Что при обширной истории команд может быть весьма утомительным. И потому для ее
облегчения предусмотрена такая интересная возможность, как наращиваемый поиск (incremental
search) нужной команды в буфере истории по одному (или нескольким) из составляющих ее
символов.
95
Выполняется он так: после нажатия (при пустой командной строке) клавишной комбинации
Control+R появляется предложение ввести алфавитный символ (или - последовательность
символов произвольной длины), заведомо входящий в состав требуемой команды:
# bck-i-search: _
Ввод такого символа выведет последнюю из команд, его содержащих. При этом введенный
символ будет отмечен знаком курсора. Он не обязан входить в имя команды, но может быть
составляющим ее опций или аргументов (имени файла или пути к нему, например). Следующее
нажатие Control+R зафиксирует курсор на предыдущем символе, в пределах этой же или более
ранней по списку команды, и т.д. Однако вместо этого в строке поиска можно вводить
дополнительные символы, детализирующие условия поиска команды (или - ее опций и
аргументов).
Процедуру поиска можно продолжать вплоть до достижения требуемого результата - то есть
нахождения той команды, которая нужна именно сейчас. Нажатие клавиши Enter в любой из этих
моментов запускает найденную (то есть помещенную в командную строку) команду на
исполнение, с завершением поиска. Поиск обрывается также и нажатием комбинации Control+C.
Перед запуском найденная команда может быть отредактирована стандартными средствами - с
использованием управляющих последовательностей.
Некоторые шеллы допускают чрезвычайно изощренные средства обращения с буфером истории
команд. Например, в командной оболочке zshell предусмотрены способы извлечения из него
отдельных командных "слов", входящих в сложные конструкции.
Простые регулярные выражения
Основное назначение регулярных выражений -- это поиск текста по шаблону и работа со
строками.
Звездочка -- * -- означает любое количество символов в строке, предшествующих "звездочке", в
том числе и нулевое число символов.
Выражение "1133*" -- означает 11 + один или более символов "3" + любые другие символы: 113,
1133, 113312, и так далее.
Квадратные скобки -- [...] -- предназначены для задания подмножества символов. Квадратные
скобки, внутри регулярного выражения, считаются одним символом, который может принимать
значения, перечисленные внутри этих скобок..
Выражение "[xyz]" -- соответствует одному из символов x, y или z.
Выражение "[c-n]" соответствует одному из символов в диапазоне от c до n, включительно.
Выражение "[B-Pk-y]" соответствует одному из символов в диапазоне от B до P или в диапазоне от
k до y, включительно.
Выражение "[a-z0-9]" соответствует одному из символов латиницы в нижнем регистре или цифре.
Выражение "[^b-d]" соответствует любому символу, кроме символов из диапазона от b до d,
включительно. В данном случае, метасимвол ^ означает отрицание.
96
Объединяя квадратные скобки в одну последовательность, можно задать шаблон искомого слова.
Так, выражение "[Yy][Ee][Ss]" соответствует словам yes, Yes, YES, yEs и так далее. Выражение "[09][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]" определяет шаблон для поиска любого номера карточки
социального страхования (для США).
Элементарная, и весьма частая, задача: из каталога dir1 требуется скопировать все файлы в
каталог dir2. Так неужели все они должны быть перечислены в качестве аргументов команды cp.
Нет, нет, и еще раз нет. Ибо для этой цели придуманы шаблоны имен файлов. Самый часто
используемый из них - специальный символ * (вроде бы я о нем уже говорил?). Он подменяет
собой любое количество любых символов (в том числе - и нулевое, то есть отсутствие символов
вообще). То есть для решения предложенной задачи нам достаточно дать команду:
# cp dir1/* dir2
Чуть усложним условия: к копированию из dir1 предназначены не все файлы, а только htmlдокументы, традиционно имеющие расширение html (строго говоря, в POSIX-системах нет
расширений в понимании DOS, но к этому мы когда-нибудь вернемся). Решение от этого не
становится сложнее:
# cp dir1/*html dir2
Обращаем внимание: в Linux, в отличие от DOS/Windows, шаблон * подменяет действительно
любые последовательности символов, в том числе и точки в середине имени, то есть
необходимости указывать шаблон как *.html, нет.
Однако тут можно вспомнить, что html-документы могут иметь и расширение htm (как известно, в
DOS имя файла строится по схеме 8.3). Не пропустим ли мы их таким образом при копировании.
Таким - безусловно, пропустим. Однако нам на помощь придет другой шаблон - символ ?. А
соответствует он любому единичному символу (или - его отсутствию, т.е. символу Null). То есть,
если команда из примера будет модифицирована таким образом:
# cp dir1/*htm* dir2
то она гарантированно охватит все возможные маски html-документов.
Вроде все хорошо. Однако нет: из каталога dir1 нам нужно скопировать только три определенных
файла - file1, file2, file3. Не придется ли каждый из них указывать в командной строке с полным
путем (а ведь они могут быть и в глубоко вложенном подкаталоге типа dir1/ dir11/dir111)? Все
равно не придется, и на сей предмет у нас есть прием - символы группировки аргументов,
обозначаемые фигурными скобками. Что на практике выглядит так:
# cp dir1/{file1,file2,file3} dir2
И приведет к единоразовому копированию всех трех файлов в каталог dir2. Заметим, что
сгруппированные аргументы разделяются запятыми без пробелов. И еще: в оболочке bash
группируемые аргументы придется полностью вводить руками. Но вот в zsh на них
распространяется возможность автодополнения.
Группировка аргументов может быть сколь угодно глубоко вложенной. Так, команда
# mkdir -p dir1/{dir11/{dir111,dir112},dir12/{dir121,dir122}}
97
в один заход создаст трехуровневую структуру каталогов внутри текущего - если только не забыть
про опцию -p, которая предписывает создавать промежуточные подкаталоги в случае их
отсутствия.
И еще несколько примеров. Регулярное выражение для диапазона - то есть вида [...], подменяет
любой из символов, заключенных в квадратные скобки. Символы эти могут даваться списком без
пробелов (например, выражение [12345] соответствует любому символу от 1 до 5) или
определяться в диапазоне, крайние значения которого разделяются дефисом без пробелов
(эквивалентное первому выражение - [1-5]). Кроме того, символ ^, предваряющий список или
диапазон, означает отрицание: выражение [^abc] подменяет любой символ, исключая символы a,
b и c.
Последние примеры регулярных выражений могут показаться надуманными. Однако представим.
что в том же каталоге dir1, кроме html-документов, содержатся также файлы изображений в
различных форматах - GIF, JPEG, TIFF и так далее (традиционно имеющие одноименные
расширения). И все они должны быть скопированы в каталог dir2, а вот как раз html-файлы нам в
данный момент без надобности.
# cp dir1/*[^html] dir2
И в каталоге dir2 окажется все содержимое каталога dir1, за исключением html-файлов. Из
приведенных примеров можно видеть, что метасимволы, образующие регулярные выражения,
интерпретируются командной оболочкой особым образом, не так, как обычные алфавитноцифровые символы, составляющие, скажем, имена файлов. В то же время в следующем разделе
мы увидим, что собственно POSIX-системы накладывают на имена файлов очень мало
ограничений. И в принципе система не запретит вам создать файл с именем, содержащим
метасимволы. Другое дело, что работать с таким образом именованными файлами может быть
сложно - командная оболочка будет пытаться интерпретировать их в соответствии с правилами
для регулярных выражений.
Конечно, использовать метасимволы в именах файлов весьма не рекомендуется. Однако,
возможны элементарные ошибки при наборе и файлы, полученные при обмене с другими
операционными системами, могут иметь довольно непривычный вид. Вспомним, что MS Word в
качестве имени файла спокойно берет первую фразу документа. А если это - вопрос? И тогда
завершающий имя символ ? будет в шелле интерпретироваться как шаблон, а не как элемент
имени. Думаю, не нужно обладать очень развитым воображением, чтобы представить
последствия. Что делать в таких ситуациях? Для их разрешения придумано было понятие
экранирования.
Маленькое отступление. Команды, с многочисленными их опциями, особенно в полной форме, и
аргументами могут оказаться весьма длинными, не укладывающимися в пределы экранной
строки. Правда, обычно командная оболочка по умолчанию настраивается с разрешением так
называемого word wrapping (то есть переноса "слов" команды без обрыва строки - последнее, как
мы помним, достигается нажатием клавиши Enter или комбинации Control+M и приводит к
немедленному исполнению введенной команды; если ввод ее не окончен - последует сообщение
об ошибке). Однако перенос "слов" при этом происходит, как бог на душу положит. И в результате
команда теряет читабельность и становится сложной для понимания.
98
Тут-то и приходит на помощь понятие экранирования, упомянутое выше. Знак экранирования обратный слэш ( - превращает символ, имеющий специальное значение (а таковыми являются,
например, упоминавшийся ранее шаблон в именах файлов - *), в самую обычную звездочку. А раз
конец строки - тоже символ, хотя и специальный, то и он доступен для экранирования. Так что
если завершить введенный фрагмент команды обратным слэшем (некоторые оболочки требуют
предварить его пробелом, и лучше так и делать, хотя в bash пробел не обязателен), после чего
нажать Enter, то вместо попытки исполнения будет образована новая строка. в которой можно
продолжать ввод. Вид приглашения к вводу при этом изменится - это будет так называемое
вторичное приглашение командной строки, которое я в дальнейшем буду обозначать как >, хотя и
его представление настраиваемо.
Возвращаемся к экранированию обратным слэшем, Действие его распространяется только на
непосредственно следующий за ним символ. Если символы, могущие быть воспринятые как
специальные, идут подряд, каждый из них должен предваряться обратным слэшем. У обратного
слэша есть еще одна интересная особенность - я назвал бы ее инвертированием специального
значения символов. Для примера: некая последовательность цифр (например, 033), введенная в
командной строке, будет воспринята как набор обычных символов. Однако она же может
выступать как код какого-либо символа (в частности, 033 - код символа Escape в восьмеричной
системе счисления). И подчас возникает необходимость ввода таких кодов (тот же код для Escape.
скажем, затруднительно ввести каким-либо иным образом). И вот тут обратный слэш проявляет
свое инвертирующее действие: последовательность # будет восприниматься уже не как набор
символов, а как код символа Escape (обратим внимание, что тут достаточно единичного слэша).
Непосредственно в командной строке такой способ инвертированного экранирования обычно не
используется, но находит широкое применение в сценариях. Почему и запомним этот прием - он
со временем потребуется нам для русификации системы).
Есть и экраны, распространяемые на все что заключено внутри них. Это - кавычки, двойные и
одинарные: большая часть символов между ними утрачивает свое специальное значение. Но это
не все. В двойных кавычках сохраняют специальное значение метасимволы $ и , а также обратные
кавычки (`), о назначении которых я скажу чуть позже. То есть в них сохраняется возможность, с
одной стороны, получения значений переменных (как мы помним, с помощью $ИМЯ). А с другой
стороны, если нам требуется дать символ бакса в его прямом и привычном значении, у нас есть
возможность заэкранировать его обратным слэшем. И если потребуется вывести на экран
сообщение "с вас $500", то это сообщение можно вызвать из скрипта таким образом:
# echo "с вас, $500"
Еще одно широко применяемое использование двойных кавычек - экранирование пробелов,
предотвращающих разбиение аргументов команды на отдельные "слова". Правда, в случае с
командой echo это, как правило, не требуется (хотя настоятельно рекомендуется экранировать ее
аргумент таким образом). Однако представьте, что в качестве аргумента команды копирования и
перемещения выступает файл, переписанный с Windows-машины. Ведь там пробелы в именах вещь обычная. Тут-то экранирование двойными кавычками и придется к месту.
Из сказанного понятно, почему двойные кавычки именуются еще неполными, или не строгими они все же допускаю внутри себя использование символов со специальными значениями). В
противоположность им, кавычки одинарные носят имя строгих, или полных. Потому что между
99
ними утрачивают специальное значение все метасимволы, кроме их самих - в том числе и символ
единичного экранирования. В итоге они используются там, где гарантированно требуется
отсутствие специальных символов. Если вы помните, мы применили строгие кавычки при
установке псевдонимов. Они же часто оказываются обязательными при определении
переменных, что будет обосновано в главе о шеллах.
Завершая тему экранирования. Осталось сказать только об обратных кавычках. Их функция очень
узка: они служат для экранирования команд. То есть, скажем, команда
# echo date
в полном соответствие со своим именем, просто выведет нам собственный аргумент:
# date
# echo `date`
Втр Дек 16 11:45:12 MSK 2003
Если вспомнить, что обратные кавычки сохраняют свое специальное значение внутри кавычек
двойных, становится ясной польза от их применения: они незаменимы в тех случаях, когда
требуется вывод результатов работы одной команды внутри другой. К как в нашем примере с
выводом даты.
Конечно, в данном случае добиться той же цели можно было бы гораздо легче - просто командой
date. Однако представьте, что у нас возникло желание одновременно и получить сведения о
количестве пользователей в системе (для чего предназначена команда who). Тут- то и выясняется.
что проще всего это сделать командой типа следующей:
# echo "На момент `date` в системе зарегистрированы `who`"
Ответом на что будет сообщение, подобное тому, что часто можно наблюдать на главной
странице многих сайтов:
На момент Втр Дек 16 12:11:36 MSK 2003 в системе зарегистрированы alv lis
А теперь последнее, чем и закроем тему регулярных выражений вообще. В этом разделе
рассматривалось использование метасимволов в командной оболочке (конкретно, в данном
случае. в bash). В других оболочках применение метасимволов и условия их экранирования могут
несколько отличаться. И к тому же многие запускаемые из строки шелла команды могут иметь
свои правила построения регулярных выражений. Так что в итоге их форма определяется
сочетанием особенностей конкретной оболочки и команды, из нее запущенной. Все это по
возможности будет оговариваться в дальнейшем.
Специальные символы
Оболочка bash использует несколько символов из числа 256 символов набора ASCII в специальных
целях, либо для обозначения некоторых операций, либо для преобразования выражений. В число
таких символов входят символы:
` ~ ! @ # $ % ^ & * ( ) _ — [ ] { } : ; ' " / \ > <
а также символ с кодом 0, символ возврата каретки (генерируемый клавишей <Enter>) и пробел. В
зависимости от ситуации эти специальные символы могут трактоваться либо в их специальном
значении, либо в буквальном, т. е. как литералы. Но мы в основном будем предполагать, что все
100
эти символы зарезервированы и не должны использоваться в качестве литералов. Это касается в
первую очередь использования их в именах файлов и каталогов. Однако символы _, - и . (знак
подчеркивания, дефис и точка) часто используются в именах файлов, так что именно этот пример
показывает, что специальное значение эти символы имеют не всегда. В именах файлов только
символы точки (.) и слэша (/) имеют специальное значение. Символ слэша служит для разделения
имен отдельных каталогов, а точка имеет специальное значение только если она является первым
символом в имени файла (что означает, что файл является «скрытым»).
Давать сейчас точное определение того, какое специальное значение и в каких ситуациях имеет
тот или иной специальный символ, нецелесообразно. Мы будем рассматривать их постепенно в
следующих разделах, по мере того, как они потребуются. Однако есть три символа, которые
имеют особое значение и которые поэтому необходимо рассмотреть в первую очередь.
Символ \ (обратный слэш) можно назвать "символом отмены специального значения" для любого
из специальных символов, который стоит сразу вслед за \. Например, если мы хотим использовать
символ пробела в имени файла, мы должны вместо простого пробела поставить \. Например,
возможна следующая команда:
[user]# cp two_words two\ words
Символы ' и " (одинарные и двойные кавычки) могут быть названы "символами цитирования".
Любой из этих символов всегда используется в паре с его копией для обрамления какого-то
выражения, совсем как в обычной прямой речи. Если какой-то текст взят в одинарные кавычки, то
все символы внутри этих кавычек воспринимаются как литералы, никаким из них не придается
специального значения. Если вернуться к тому же примеру с пробелами в имени файла, то можно
сказать, что для того, чтобы дать файлу имя "two words" надо взять имя в кавычки:
[user]# cp two_words 'two words'
Различие в использовании символов ' и " состоит в том, что внутри одинарных кавычек теряют
специальное значение все символы, а внутри двойных кавычек — все специальные символы
кроме $, ' и \ (знака доллара, одинарных кавычек и обратного слэша).
Выполнение команд
Как было отмечено выше, одна из основных функций оболочки состоит в том, чтобы организовать
исполнение команд пользователя, вводимых им в командной строке. В частности, оболочка
предоставляет пользователю два специальных оператора для организации задания команд в
командной строке: ; и &.
Оператор ;
Хотя чаще всего пользователь задает команды в командной строке по одной, имеется
возможность задать в одной строке несколько команд, которые будут выполнены
последовательно, одна за другой. Для этого используется специальный символ -оператор ;. Если
не поставить этот разделитель команд, то последующая команда может быть воспринята как
аргумент предыдущей. Таким образом, если написать в командной строке что-то вроде:
[user]# command1 ; command2
101
то оболочка вначале запустит на выполнение команду command1, дождется, пока ее выполнение
завершится, после чего запустит command2, дождется ее завершения, после чего снова выведет
приглашение командной строки, ожидая следующих действий пользователя.
Оператор &
Оператор & используется для того, чтобы организовать исполнение команд в фоновом режиме.
Если поставить значок & после команды, то оболочка вернет управление пользователю сразу
после запуска команды, не дожидаясь, пока выполнение команды завершится. Например, если
задать в командной строке "command1 & command2 &", то оболочка запустит команду command1,
сразу же затем команду command2, и затем немедленно вернет управление пользователю.
Операторы && и ||
Операторы && и || являются управляющими операторами. Если в командной строке стоит
command1 && command2, то command2 выполняется в том, и только в том случае, если статус
выхода из команды command1 равен нулю, что говорит об успешном ее завершении. Аналогично,
если командная строка имеет вид command1 || command2, то команда command2 выполняется
тогда, и только тогда, когда статус выхода из команды command1 отличен от нуля.
Запуск команды на выполнение
Сама техника организации запуска команд на выполнение не является предметом нашего
рассмотрения. Можно только кратко сказать, что оболочка должна найти код команды, загрузить
его в память, передать команде аргументы, заданные в командной строке, а после завершения
выполнения соответствующего процесса передать каким-то образом пользователю или другому
процессу результаты выполнения данной команды. Эти этапы мы кратко и рассмотрим.
Итак, первый этап — поиск кода команды. Команды бывают встроенные (те, код которых включен
в код самой оболочки) и внешние (код которых расположен в отдельном файле на диске).
Встроенную команду оболочка всегда найдет, а для поиска внешней команды пользователь, в
принципе, должен указать оболочке полный путь до соответствующего файла. Однако для
облегчения жизни пользователей оболочка умеет искать внешние команды в каталогах, которые
перечислены в специально заданных "путях поиска". Только если она не находит нужных файлов в
таких каталогах, она решает, что пользователь ошибся при вводе имени команды. О том, как
включить каталог в пути поиска, будет сказано ниже, а сейчас рассмотрим, как оболочка
организует передачу данных исполняемой команде и выдачу результатов пользователю.
Стандартный ввод/вывод
Потоки ввода-вывода
Каждому процессу сопоставлена таблица открытых им файлов. Три первых позиции в этой
таблице заняты всегда: каждый процесс открывает потоки (помните, что в UNIX файл — это и есть
поток данных?) для ввода и вывода данных, а также вывода сообщений об ошибках и другой
диагностической информации.
Эти потоки:

0 — стандартный ввод (stdin), по этому каналу данные передаются программе;
102


1 — стандартный вывод (stdout), по этому каналу программа выводит
результаты своей работы;
2 — стандартный поток сообщений об ошибках (stderr). По этому каналу
программы выдают информацию об ошибках.
Ссылаться на эти потоки можно по их файловым дескрипторам. 0,1 и 2 - это и есть такие
дескрипторы.
Из стандартного входа программа может только читать, а два других потока могут использоваться
программой только для записи.
По умолчанию входной поток связан с клавиатурой, а выходной поток и поток сообщений об
ошибках направлены на терминал пользователя. Другими словами, вся выходная информация
запущенной пользователем команды или программы, а также все сообщения об ошибках,
выводятся в окно терминала. Однако, как мы увидим чуть ниже, можно перенаправить выходные
сообщения (например, в файл).
Для того, чтобы продемонстрировать, как работает стандартный поток ошибок, выполните
команду ls с неверным аргументом, например, задав в качестве аргумента имя несуществующего
файла. В таком случае ls выведет сообщение об ошибке в стандартный поток ошибок. Для нас,
однако, в данном случае стандартный поток ошибок неотличим от выходного потока, поскольку
сообщение об ошибке мы видим в окне терминала.
Работу со стандартными входным и выходным потоками лучше всего проиллюстрировать на
примере команд echo и cat.
Команда echo
Команда echo предназначена для выдачи на стандартный вывод строки символов, которая задана
ей в качестве аргумента. После этого она выдает сигнал перевода строки и завершается.
Попробуйте выполнить команду
[user]# echo ‘Привет, дружище!’
и, думаю, дальнейших пояснений не потребуется (только используйте именно одиночные
кавычки, иначе результат может быть несколько иным).
Команда cat
Мы уже рассматривали кратко команду cat в предыдущем разделе. В данном разделе эта
команда интересует нас в основном потому, что чаще всего она работает как раз с входным и
выходным потоками. По умолчанию выход команды cat направляется в выходной поток. Чтобы
убедиться, что эта команда по умолчанию воспринимает входной поток, запустите команду cat
без аргументов. В результате курсор переместится в новую строку, и более как будто ничего не
будет происходить. В это время команда ожидает поступления символов во входном потоке.
Введите любой символ, и вы увидите, что он сразу же появился на экране, что говорит о том, что
программа сразу же направила его в выходной поток. Можно продолжить ввод символов, и они
также появятся на экране.
Обычно клавиатура настроена на построчный ввод, поэтому если вы нажмете клавишу <Enter>,
последняя набранная строка передается команде cat, которая вновь выводит данные на монитор
103
через стандартный вывод. Таким образом, каждая строка будет показана дважды: один раз при
наборе и второй раз — командой cat.
Если нажать комбинацию клавиш <Ctrl>+<D>, которая служит командой окончания процедуры
ввода, вы вновь вернетесь к подсказке в командной строке. Можно также использовать
комбинацию клавиш <Ctrl>+<C>, которая является в оболочке командой завершения работы
запущенной программы.
Если команде cat в качестве аргумента задать имя файла, это будет означать, что содержимое
файла будет направлено во входной поток, откуда его примет команда cat и выдаст в выходной
поток. Но это только частный случай перенаправления ввода, очень полезного механизма
оболочки, который, безусловно, заслуживает более подробного рассмотрения.
Перенаправление, каналы и фильтры
Хотя обычно, как было сказано, ввод/вывод программы связаны со стандартными потоками, в
оболочке существуют специальные средства для перенаправления ввода/вывода.
Операторы >, < и >>
Для обозначения перенаправления используются символы ">", "<" и ">>". Чаще всего
используется перенаправление вывода команды в файл. Вот соответствующий пример:
[user]# ls -l > /home/jim/dir.txt
По этой команде в файле /home/jim/dir.txt будет сохранен перечень файлов и подкаталогов того
каталога, который был текущим на момент выполнения команды ls; при этом если указанного
файла не существовало, то он будет создан; если он существовал, то будет перезаписан; если же
вы хотите, чтобы вывод команды был дописан в конец существующего файла, то надо вместо
символа > использовать >>. При этом наличие пробелов до или после символов > или >>
несущественно и служит только для удобства пользователя.
Вы можете направить вывод не только в файл, но и на вход другой команды или на устройство
(например, принтер).
Так, для подсчета числа слов в файле /home/jim/report.txt можно использовать следующую
команду:
[user]# cat /home/jim/report.txt > wc -w
а для вывода файла на печать — команду:
[user]# cat /home/jim/report.txt > lpr
Как видите, оператор > служит для перенаправления выходного потока. По отношению к
входному потоку аналогичную функцию выполняет оператор <. Приведенный выше пример
команды для подсчета числа слов в определенном файле можно переписать следующим образом
(обратите внимание на отсутствие команды cat):
[user]# wc -w < /home/jim/report.txt
Этот вариант перенаправления часто используется в различных скриптах, применительно к тем
командам, которые обычно воспринимают ввод (или ожидают ввода) с клавиатуры. В скрипте же,
автоматизирующем какие-то рутинные операции, можно дать команде необходимую
104
информацию из файла, в который заранее записано то, что нужно ввести для выполнения этой
команды.
В силу того, что символы <, > и >> действуют на стандартные потоки, их можно использовать не
только тем привычным образом, как это делается обычно, но и несколько по-другому. Так,
следующие команды эквивалентны:
[user]# cat > file
[user]# cat>file
[user]# >file cat
[user]# > file cat
Однако сам по себе (без какой-либо команды, для которой определены стандартные потоки)
символ перенаправления не может использоваться, так что нельзя, например, введя в командной
строке
[user]# file1 > file2
получить копию какого-то файла. Но это не уменьшает значения данного механизма, ведь
стандартные потоки определены для любой команды. При этом перенаправить можно не только
стандартный ввод и вывод, но и другие потоки. Для этого надо указать перед символом
перенаправления номер перенаправляемого потока. Стандартный ввод stdin имеет номер 0,
стандартный вывод stdout — номер 1, стандартный поток сообщений об ошибках stderr — номер
2. То есть полный формат команды перенаправления имеет вид (напомним, что пробелы возле >
не обязательны):
# command N > M
где N и M — номера стандартных потоков (0,1,2) или имена файлов. Употребление в некоторых
случаях символов <, > и >> без указания номера канала или имени файла возможно только
потому, что вместо отсутствующего номера по умолчанию подставляется 1, т. е. стандартный
вывод. Так, оператор > без указания номера интерпретируется как 1 >.
Кроме простого перенаправления стандартных потоков существует еще возможность не просто
перенаправить поток в тот или иной канал, а сделать копию содержимого стандартного потока.
Для этого служит специальный символ &, который ставится перед номером канала, на который
перенаправляется поток:
command N > &M
Такая команда означает, что выход канала с номером N направляется как на стандартный вывод,
так и дублируется в канал с номером M. Например, для того, чтобы сообщения об ошибках
дублировались на стандартный вывод, надо дать команду 2>&1, в то время как
1>&2 дублирует stdout в stderr. Такая возможность особенно полезна при перенаправлении
вывода в файл, так как мы тогда одновременно и видим сообщения на экране, и сохраняем их в
файле.
Например:
ls /usr/ /rrr > list 2>&1
105
Эта команда создаст файл «list» который будет содержать список файлов в каталоге /usr и
сообщение об ошибке, что каталога /rrr не существует. Приведем еще примеры использования
перенаправления стандартных потоков. Пусть к примеру, вы хотите отправить своему другу
послание по электронной почте.
$ mail vasya@pupkin.ru < message.txt
Здесь в качестве стандартного ввода для программы mail используется перенаправление на файл
message.txt. По умолчанию же программа mail ассоциирует стандартный поток ввода с
терминалом.
Другой Пример Пусть у вас есть некоторая "капризная" программа, при запуске выводящая
сообщения об ошибках. Вам, как системному администратору, необходимо связаться с
разработчиками, послав им это самое сообщение.
$ bad_prog >> /var/log/bad_prog.log
Вывод программы bad_prog будет производиться в конец файла bad_prog.log, т.е. все
предыдущие записи сохраняются. Если же файла bad_prog.log не существует, он будет создан.
Всем трем стандартным потокам ввода, вывода и ошибок назначены также численные значения,
так называемые дескрипторы, соответственно 0, 1, 2. Используя эти дескрипторы можно
объединять и перенаправлять конкретные потоки. Например, вернемся к предыдущему случаю:
$ bad_prog >>/var/log/bad_prog.log 2>&1
В таком случае происходит объединение потоков вывода и ошибок в один, и происходит
перенаправление в файл bad_prog.log. Знак "&" перед дескриптором потока необходим для того,
чтобы отличить его например от файла с именем "1". В инициализационных скриптах системы
также очень часто используется подавление потока вывода и ошибок.
$ prog1 >/dev/null 2>&1
/dev/null это псевдоустройство, которое уничтожает направленный в него
поток.
Оператор |
Особым вариантом перенаправления вывода является организация программного канала (иногда
называет трубопроводом или конвейером). Для этого две или несколько команд, таких, что вывод
предыдущей служит вводом для следующей, соединяются (или разделяются, если вам это больше
нравится) символом вертикальной черты — "|". При этом стандартный выходной поток команды,
расположенной слева от символа |, направляется на стандартный ввод программы,
расположенной справа от символа |.
Например:
[user]# cat myfile | grep Linux | wc -l
Эта строка означает, что вывод команды cat, т. е. текст из файла myfile, будет направлен на вход
команды grep, которая выделит только строки, содержащие слово "Linux". Вывод команды grep
будет, в свою очередь, направлен на вход команды wc -l, которая подсчитает число таких строк.
Программные каналы используются для того, чтобы скомбинировать несколько маленьких
программ, каждая из которых выполняет только определенные преобразования над своим
106
входным потоком, для создания обобщенной команды, результатом которой будет какое-то
более сложное преобразование.
Надо отметить, что оболочка одновременно вызывает на выполнение все команды, включенные в
конвейер, запуская для каждой из команд отдельный экземпляр оболочки, так что как только
первая программа начинает что-либо выдавать в свой выходной поток, следующая команда
начинает его обрабатывать. Точно так же каждая следующая команда выполняет свою операцию,
ожидая данных от предыдущей команды и выдавая свои результаты на вход последующей. Если
вы хотите, чтобы какая-то команда полностью завершилась до начала выполнения последующей,
вы можете использовать в одной строке как символ конвейера |, так и точку с запятой ;. Перед
каждой точкой с запятой оболочка будет останавливаться и ожидать, пока завершится
выполнение всех предыдущих команд, включенных в конвейер.
Статус выхода (логическое значение, возвращаемое после завершения работы программы) из
канала совпадает со статусом выхода, возвращаемым последней командой конвейера. Перед
первой командой конвейера можно поставить символ "!", тогда статус выхода из конвейера будет
логическим отрицанием статуса выхода из последней команды. Оболочка ожидает завершения
всех команд конвейера, прежде чем установить возвращаемое значение.
Передача потока вывода одной программы в поток ввода другой используется часто. Например:
$ gzip -d archive.tar.gz | tar -xf
Здесь происходит разархивация файла archive.tar.gz, запакованного двумя архиваторами.
Выходной поток от утилиты gzip передается во входной поток утилите tar. Аналогично эту же
операцию можно было выполнить и по другому:
$ gzip -d archive.tar.gz
$ tar -xf archive.tar
Фильтры
Фильтры — это команды (или программы), которые воспринимают входной поток данных,
производят над ним некоторые преобразования и выдают результат на стандартный вывод
(откуда его можно перенаправить куда-то еще по желанию пользователя). К числу командфильтров относятся уже упоминавшиеся выше команды cat, more, less, wc, cmp, diff, а также
следующие команды.
107
Таблица 0.1 Комманды фильтры
Команда
Краткое описание
grep, fgrep, egrep Ищут во входном файле или данных со стандартного ввода строки,
содержащие указанный шаблон, и выдают их на стандартный вывод
tr
comm
pr
sed
Заменяет во входном потоке все встречающиеся символы, перечисленные
в заданном перечне, на соответствующие символы из второго заданного
перечня
Сравнивает два файла по строкам и выдает на стандартный вывод 3
колонки: в одной— строки, которые встречаются только в 1 файле, во
второй— строки, которые встречаются только во 2-ом файле: и в третьей—
строки, имеющиеся в обоих файлах
Форматирует для печати текстовый файл или содержимое стандартного
ввода
Строковый редактор, использующийся для выполнения некоторых
преобразований над входным потоком данных (берется из файла или со
стандартного ввода)
Особым фильтром является команда tee, которая "раздваивает" входной поток, с одной стороны
направляя его на стандартный вывод, а с другой — в файл (имя которого вы должны задать).
Легко видеть, что по своему действию команда tee аналогична оператору перенаправления
1>&file.
Возможности фильтров можно существенно расширить за счет использования регулярных
выражений, позволяющих организовать, например, поиск по различным, зачастую очень
сложным, шаблонам.
egrep -- то же самое, что и grep -E. Эта команда использует несколько отличающийся,
расширенный набор регулярных выражений, что позволяет выполнять поиск более гибко.
fgrep -- то же самое, что и grep -F. Эта команда выполняет поиск строк символов (не регулярных
выражений), что несколько увеличивает скорость поиска.
Утилита agrep имеет более широкие возможности поиска приблизительных совпадений. Образец
поиска может отличаться от найденной строки на указанное число символов.
Для поиска по сжатым файлам следует использовать утилиты zgrep, zegrep или zfgrep. Они с
успехом могут использоваться и для не сжатых файлов, но в этом случае они уступают в скорости
обычным grep, egrep и fgrep. Они очень удобны при выполнении поиска по смешенному набору
файлов -- когда одни файлы сжаты, а другие нет.
Для поиска по bzip-файлам используйте bzgrep.
Команда look очень похожа на grep, и предназначена для поиска по "словарям" -отсортированным файлам. По-умолчанию, поиск выполняется в файле /usr/dict/words, но может
быть указан и другой словарь.
108
Сценарий
В простейшем случае, скрипт -- это ни что иное, как простой список команд системы, записанный в
файл. Создание скриптов поможет сохранить ваше время и силы, которые тратятся на ввод
последовательности команд всякий раз, когда необходимо их выполнить.
Пример: Сценарий очистки лог-файлов в /var/log
# cleanup
# Для работы сценария требуются права root. cd /var/log
cat /dev/null > messages cat /dev/null > wtmp
echo "Лог-файлы очищены."
Здесь нет ничего необычного, это простая последовательность команд, которая может быть
набрана в командной строке с консоли или в xterm. Преимущество размещения
последовательности команд в скрипте состоит в том, что вам не придется всякий раз набирать эту
последовательность вручную. Кроме того, скрипты легко могут быть модифицированы или
обобщены для разных применений.
Пример: Расширенная версия предыдущего сценария.
#!/bin/bash
# cleanup, version 2
# Для работы сценария требуются права root.
LOG_DIR=/var/log
ROOT_UID=0 #
LINES=50
Только пользователь с $UID 0 имеет привилегии
# Количество сохраняемых строк по-умолчанию.
E_XCD=66
# Невозможно сменить каталог? E_NOTROOT=67 #
отсутствия root-привилегий.
root.
Признак
if [ "$UID" -ne "$ROOT_UID" ]
then
echo "Для работы сценария требуются права root." exit $E_NOTROOT
fi
if [ -n "$1" ]
# Проверка наличия аргумента командной строки. then
lines=$1 else
lines=$LINES # Значение по-умолчанию, если число не задано в командной
строке fi
#
Stephane Chazelas предложил следующее,
#+ для
строки,
проверки
корректности
аргумента,
переданного
из
командной
#+ правда это достаточно сложно для данного руководства.
109
#
#
E_WRONGARGS=65
# Не числовой аргумент
#
#
case "$1" in
#
""
) lines=50;;
#
*[!0-9]*)
$E_WRONGARGS;;
#
*
#
esac
echo
"Usage:
`basename
$0`
file-to-cleanup";
exit
) lines=$1;;
#
#* Конец проверки корректности аргумента
cd $LOG_DIR
if [ `pwd` != "$LOG_DIR" ] # или if [ "$PWD" != "$LOG_DIR" ]
# Не в /var/log?
then
echo "Невозможно перейти в каталог $LOG_DIR." exit $E_XCD
fi
# Проверка каталога перед очисткой лог-файлов.
# более эффективный вариант:
#
# cd /var/log || {
#
echo "Невозможно перейти в требуемый каталог." >&2
#
exit $E_XCD;
# }
tail -$lines messages > mesg.temp # Сохранить последние строки в логфайле. mv mesg.temp messages
# cat /dev/null > messages
#* Необходимость этой команды отпала, поскольку очистка выполняется
выше.
cat /dev/null > wtmp #
команды ': > wtmp' и '> wtmp'
же эффект. echo "Лог-файлы очищены."
имеют
тот
exit 0
110
#
Возвращаемое значение 0
#+ указывает на успешное завершение работы сценария.
Если вы не желаете полностью вычищать системные логи, то выше представлена улучшенная
версия предыдущего сценария. Здесь сохраняются последние несколько строк (по-умолчанию -50).
Sha-bang
Если файл сценария начинается с последовательности #!, которая в мире UNIX называется shabang, то это указывает системе какой интерпретатор следует использовать для исполнения
сценария. Это двухбайтовая последовательность, или -- специальный маркер, определяющий тип
сценария, в данном случае -- сценарий командной оболочки (см. man magic). Более точно, shabang определяет интерпретатор, который вызывается для исполнения сценария, это может быть
командная оболочка (shell), иной интерпретатор или утилита.
Примеры sha-bang
#!/bin/sh
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/tcl
#!/bin/sed -f
#!/usr/awk -f
Запуск сценария
Запустить сценарий можно командой
sh scriptname
или
bash scriptname
Не рекомендуется запуск сценария командой sh <scriptname>, поскольку это запрещает
использование устройства стандартного ввода stdin в скрипте.
Более удобный вариант -- сделать файл скрипта исполняемым, командой chmod.
chmod 555 scriptname
пользователю в системе
или
#
выдача
прав
на
чтение/исполнение
любому
chmod +rx scriptname #выдача прав на чтение/исполнение любому
пользователю в системе chmod u+rx scriptname #выдача прав на
чтение/исполнение только "владельцу" скрипта
После того, как вы сделаете файл сценария исполняемым, вы можете запустить его примерно
такой командой
./scriptname
Если, при этом, текст сценария начинается с корректной сигнатуры ("sha-bang"), то для его
исполнения будет вызван соответствующий интерпретатор.
111
И наконец, завершив отладку сценария, вы можете поместить его в каталог /usr/local/bin
(естественно, что для этого вы должны обладать правами root), чтобы сделать его доступным для
себя и других пользователей системы. После этого сценарий можно вызвать, просто напечатав
название файла в командной строке и нажав клавишу [ENTER]
В общем случае при запуске скрипта запускается новый процесс. Для того, чтобы выполнить
скрипт внутри текущей сессии bash, необходимо использовать команду source, синонимом
которой является просто точка ".". Скрипт оболочки служит просто аргументом этой команды. Ее
формат:
source filename [arguments]
или
. filename [arguments]
Эта команда читает и выполняет команды из файла с именем filename в текущем окружении и
возвращает статус, определяемый последней командой из файла filename. Если filename не
содержит слэша, то пути, перечисленные в переменной PATH, используются для поиска файла с
именем filename. Этот файл не обязан быть исполняемым. Если в каталогах, перечисленных в
PATH, нужный файл не найден, его поиск производится в текущем каталоге.
Если заданы аргументы, на время выполнения скрипта они становятся позиционными
параметрами. Если аргументов нет, позиционные параметры не изменяются. Значение (статус),
возвращаемое командой source, совпадает со значением, возвращаемым последней командой,
выполненной в скрипте. Если ни одна команда не выполнялась, или файл filename не найден, то
статус выхода равен 0.
Поиск файлов.
Команда find используется для поиска файлов. Если написать в консоли просто "find", то на экран
будут выведены все файлы из текущей директории и ее поддиректорий. find -type d покажет
только директории, а file -type f покажет только файлы. Но для настоящего поиска используется
команда
find -name <имя файла>
Например, find -name '*.c' найдет все файлы с расширением ".c", а find -name file.txt найдет все
файлы с именем file.txt.
find -size [+|-]<размер> найдет файлы, которые больше указанного размера (+), или меньше (-),
или которые занимают ровно столько, сколько указано (если число без знака).
find <директория> запустит find для поиска именно в этой директории (можно указывать
несколько).
$ find ~ -atime +100 -delete
будут автоматически стерты все файлы, к которым не было обращения за последние 100 дней (из
молчаливого предположения, что раз к ним три месяца не обращались - значит, они и вообще не
нужны). Истреблению подвергнутся файлы в подкаталогах любого уровня вложенности - но не
включающие их подкаталоги (если, конечно, последние сами не подпадают под критерии отбора).
112
Использовать опцию -delete, как мы это только что сделали - не самое здоровое решение, ибо
файлы при этом удаляются без запроса, и можно случайно удалить что-нибудь нужное. И потому
достигнем той же цели следующим образом:
$ find ~/ -atime +100 -exec rm -i {} \;
В этом случае на удаление каждого отобранного файла будет запрашиваться подтверждение.
Обращаю внимание на последовательность символов {} ; (с пробелом между закрывающей
фигурной скобкой и обратным слэшем) в конце строки. Пара фигурных скобок {} символизирует,
что свои аргументы исполняемая команда (в примере - rm) получает от результатов отбора
команды find, точка с запятой означает завершение строки (без нее на нажатие Enter последовало
бы вторичное приглашение командной строки), а обратный слэш экранирует ее специальное
значение.
И, наконец, опция -exec - именно ею обусловлено величие утилиты find. В качестве значения ее
можно указать любую команду с необходимыми опциями - и она будет выполнена над
отобранными файлами, которые будут рассматриваться в качестве ее аргументов.
Проиллюстрируем это на примере.
$ find ~/ -name *.png -exec cp {} imagesdir \;
В результате все png-файлы будут найдены и скопированы (или - перемещены, если
воспользоваться командой mv вместо cp) в одно место.
$ find ~/ -type f -mtime -7 | xargs tar -rf weekly_incremental.tar
gzip weekly_incremental.tar
Команда заархивирует файлы измененные за последние 7 дней.
Существует еще множество опций для поиска, которые описаны в man-странице. Недостатком find
является медленный поиск, поэтому существует альтернативная команда locate <имя файла>,
которая ищет конкретный файл по уже созданной базе данных.
Поиск внутри файла
Так же часто бывает нужна возможность поиска в файлах какого-нибудь слова или фразы.
Команда grep ищет текст в файлах и выводит только те строки, в которых был обнаружен этот
самый текст.
grep 'Linux' *.txt - ищет во всех файлах с расширением txt слово
"Linux".
grep -n <выражение> <имя файла> выводит номер строки, в которой было
найдено выражение.
grep -<количество> <выражение> <имя файла> выводит <количество> строк
перед и после той строки, в которой было найдено выражение.
grep -v <выражение> <имя файла> выведет только те строки, в которых не
было найдено указанное выражение.
grep -i <выражение> <имя файла> проводит поиск, нечувствительный к
регистру. Так же grep поддерживает регулярные выражения.
113
Управление пользователями
В качестве источника списка пользователей может быть использовано (на выбор или
одновременно) большое количество служб. Неполный список возможных вариантов средств
аутентификации: NIS, OpenLDAP, Novell eDirectory, MS Active Directory, Samba+winbind, Radius и т.д.
Для авторизации может использоваться Kerberos.
В любом случае список пользователей используемых систем аутентификации будет отображаться
на список UID-GID классической системы управления доступом.
Классический метод управления пользователями (доступом) в Linux осуществляется на основе
содержания файлов:







/etc/passwd — учетная информация о пользователе;
/etc/shadow — скрытая информация о пользователях: пароли в зашифрованном
виде;
/etc/group — информация о группах;
/etc/gshadow — скрытая информация о группах;
/etc/default/useradd — свойства, назначаемые по умолчанию новым учетным
записям;
/etc/login.def s — настройки безопасности пароля (время истечения,
минимальная длина);
/etc/skel — каталог, содержащий личные файлы настроек по умолчанию (когда
для нового пользователя создается домашний каталог, в него помещаются эти
файлы).
Структура файла /etc/passwd
Формат файла /etc/passwd практически един для всех диалектов UNIX®. Этот файл содержит
строки следующего вида, разделенные двоеточием:
username:pswd:uid:gid:uid comments:directory:shell то есть







username - имя пользователя
pswd - пароль
uid - уникальный идентификатор пользователя в пределах системы
gid - уникальный идентификатор группы в пределах системы, к которой
принадлежит пользователь
uid comments - комментарий, расширенное описание пользователя, например,
ФИО
directory - домашний каталог пользователя
shell - имя программы - интерпретатора команд пользователя
Имя пользователя - это то, что пользователь вводит в ответ на приглашение login:. Это поле не
должно содержать символа двоеточия. Кроме того, не рекомендуется употреблять в имени точку
(.), а также начинать его с символов + или -.
114
Поле пароля может быть представлено различным образом. Оно может быть пустым, указывая,
что для регистрации пользователя пароль не нужен. Оно может также содержать до 13 символов
зашифрованной версии пароля.
uid является простым числовым значением отдельного пользователя. Обычно это положительное
число до 65535, хотя некоторые системы распознают 32-битные идентификаторы пользователя.
Некоторые идентификаторы зарезервированы для специального использования. К ним относятся
0(суперпользователь), 1-10(демоны и псевдопользователи), 11-99(системные и
зарезервированные пользователи), 100+(обычные пользователи).
Поскольку /etc/passwd обычно доступен для чтения, в целях обеспечения безопасности обычно
используются схемы со скрытыми паролями. Обычно при этом зашифрованные пароли
перенаправляются в файл с ограниченным доступом, который к тому же может содержать
дополнительную информацию. Эта схема используется, поскольку достаточно средние машины в
состоянии за приемлемое время вскрыть пароль, если пользователь выбрал его неудачно. В
категорию неудачных паролей входят словарные слова, регистрационное имя, отсутствие пароля
или информация, содержащаяся в поле комментария пользователя. такие пароли хранятся в
файле /etc/shadow.
/etc/shadow
Структура файла /etc/shadow
Итак, сами пользовательские аккаунты определены в /etc/passwd. Системы Linux вдобавок к
/etc/passwd содержат его файл-компаньон /etc/shadow. Он, в отличие от /etc/passwd, доступен
для чтения только суперпользователю и содержит зашифрованную информацию о паролях.
Взглянем на образец строки из /etc/shadow:
student:$1$1234567890123456789012345678901:11664:0:-1:-1:-1:-1:0
Каждая строка определяет информацию о пароле конкретного аккаунта, поля в ней разделены
знаком ":". Первое поле определяет конкретный пользовательский аккаунт, которому
соответствует данная «теневая» запись. Во втором поле содержится зашифрованный пароль.
Оставшиеся поля описаны в таблице ниже:

поле 3 — количество дней с 01.01.1970 до момента, когда пароль был изменен

поле 4 — количество дней до того, как будет разрешено сменить пароль («0» — «менять в
любое время»)

поле 5 — количество дней до того, как система заставит пользователя сменить пароль ("-1"
— «никогда»)

поле 6 — количество дней до истечения срока действия пароля, когда пользователь
получит предупреждение об этом ("-1" — «не предупреждать»)

поле 7 — количество дней после истечения срока действия пароля, по прошествии
которых аккаунт будет автоматически отключен системой ("-1" — «не отключать»)
115

поле 8 — количество дней, прошедшее с момента отключения этого аккаунта ("-1" — «этот
аккаунт включен»)

поле 9 — зарезервировано для будущего использования
Структура файла /etc/group
Файл /etc/group относится к общей схеме защиты систем типа UNIX®: пользователь, группа и
права достапу к файлам. Формат записи в данном файле следующий:
group_name:password:group_id:list
Поле group_name содержит текстовое имя для группы. В поле password размещается
зашифрованный пароль данной группы. Если это поле пустое, то пароль не требуется. Поле
group_id содержит уникальное число-идентификатор этой группы. Поле list содержит список
пользователей, относящихся к этой группе, разделенный запятыми. Пользователям не нужно
упоминаться в списке тех групп, которые указаны в качестве основной для них в файле
/etc/passwd.
Псевдопользователи
Каждый из вариантов UNIX® содержит в файле паролей строки описания псевдопользователей.
Эти описания никогда не редактируются. Пользователи этих имен не регистрируются в системе и
нужны лишь для подтверждения владения соответствующими им процессами. Наиболее
известными являются:
daemon - Используется служебными процессами системы
bin - Дает права на владение исполняемыми файлами команд sys - Владеет системными файлами
adm - Владеет файлами регистрации uucp - Используется программой UUCP
lp - Используется подсистемами lp или lpd nobody - Используется NFS
Существуют и другие псевдопользователи, например, audit, cron, mail, new или usenet. Все они
нужны для работы ассоциированных с ними процессов и файлов.
Команды работы с учетными записями пользователей
Создание, изменение и удаление строк в файлах паролей и групп зависит от версии операционной
системы, которой Вы пользуетесь. Обычно файлы паролей редактируются непосредственно из
командной строки, либо используются утилиты с графическим интерфейсом. Эти утилиты
позволяют очень легко и удобно редактировать учетные записи пользователей.
Основные команды для работы с учетными записями в Linux - useradd, userdel, и usermod, а также
средство редактирования файлов паролей vipw. Интерфейс команд следующий:
useradd [-c uid comment] [-d dir] [-e expire] [-f inactive] [-g gid]
[-m [ -k skel_dir]] [-s shell] [-u uid [-o]] username
userdel [-r] username
usermod [-c uid comment] [-d dir [-m]] [-e expire] [-f inactive]
[-g gid] [-G gid[,gid]] [-l new username] [-s shell] [-u uid [-o]]
username
116
Основные параметры имеют следующие значения:















username - регистрационное имя пользователя. Это единственный
обязательный параметр во всех командах.
uid comment - это дополнительный комментарий о пользователе с указанным
именем.
dir - указывает на домашний каталог пользователя.
expire - указывает точную дату, до которой действует регистрационная запись.
inactive - указывает непрерывное число дней без регистрации в системе до
того, как данная запись будет блокирована.
gid - определяет идентификатор или имя группы, к которой относится
пользователь.
new_username - является заменой прежнего имени регистрационной записи.
shell - определяет оболочку интерпретатора команд для данного пользователя.
skel_dir - содержит файлы, которые должны быть скопированы в новый
домашний каталог пользователя.
uid - является уникальным идентификатором пользователя, связанным с этим
именем.
-m - указывает на необходимость создания нового домашнего каталога
(useradd) или переноса текущего в новое место (usermod).
-o - позволяет повторяться одному и тому же идентификатору пользователя.
-g - выбирает главную группу для регистрационного имени.
-G - выбирает дополнительные группы.
-r - сообщает, что домашний каталог пользователя будет перемещен. Если
домашний каталог для регистрационной записи устарел, существующие файлы
будут перенесены в новый каталог.
Чтобы переместить каталог пользователя, выполните:
cd /old_dir; tar -cf - . | (cd /new_dir; tar -xpf -)
Сравните результаты, а затем удалите old_dir. При переносе особое внимание следует уделить
скрытым файлам запуска, или дот-файлам (имена начинаются с точки). Вот наиболее важные из
них:










.login - файл, исполняемый после регистрации в оболочках csh и tcsh.
.cshrc - файл, исполняемый после запуска новой копии оболочки csh.
.tcshrc - то же самое для оболочки tcsh.
.profile - файл, исполняемый после регистрации в оболочках sh или ksh.
.kshrc - файл, исполняемый после запуска новой копии оболочки ksh.
.bashrc - файл, исполняемый после запуска новой копии оболочки bash.
.history - содержит список последних команд, выполненных в оболочке.
.rhosts - списки удаленных машин/пользователей, допускаемых к регистрации в
данной системе. Rlogin, rexec, rsh/remsh используют этот файл, чтобы
разрешить регистрацию, доступ к фалам и запуск команд без ввода паролей.
.netrc - используется при автоматической регистрации в FTP.
.forward - позволяет перенаправлять почту на другие адреса, в файлы или в
программы обработки.
117



.mailrc - стартовый файл для почтового агента, позволяющий установить опции
или почтовые псевдонимы.
.exrc - файл с опциями запуска редакторов ex или vi.
.xinitrc - файл запуска для системы X Window.
При удалении регистрационного имени из файла паролей Вы должны также удалить все файлы,
принадлежащие этому пользователю. Сделать это можно с помощью команды
find / -user username
Чтобы не ошибиться, Вы можете упаковать эти файлы, прежде чем удалять их. Чтобы удалить их
сразу во время поиска, выполните:
find / -user username -exec rm {} \;
Команда смены пароля passwd
Эта команда используется для изменения паролей пользователей. Формат ее вызова:
passwd [-k] [-l] [-u [-f]] [-d] [-S] [username]
Значение опций данной команды:


-k - используется для обновления только тех паролей, срок действия которых
истек.
-l - блокирует указанного пользователя (доступна только администратору).
Блокировка осуществляется добавлением к паролю префикса !.








stdin - принимать новый пароль из стандартного ввода.
-u - разблокирование пользователя и удаление префикса ! (доступна только
администратору).
-d - отмена пароля для пользователя (доступна только администратору).
Позволяет пользователю войти в систему без пароля и сменить его
самостоятельно.
-n - устанавливает минимальный срок в днях до смены пароля (доступна только
администратору).
-x - устанавливает максимальный срок в днях до смены пароля (доступна
только администратору).
-w - устанавливает срок в днях, когда пользователь начнет получать сообщения
о необходимости смены пароля(доступна только администратору).
-i - устанавливает срок в днях до момента, когда старый пароль перестанет быть
активным и регистрационная запись блокируется (доступна только
администратору).
-S - выводит краткую информацию о состоянии пароля (о сроке его действия).
Доступна только администратору.
Модель прав доступа в Linux
В этом разделе мы рассмотрим права доступа в Linux и модель владения (ownership). Мы уже
видели, что каждый файл принадлежит одному пользователю и одной группе. Это сама суть
модели прав доступа в Linux. Вы можете узнать, какому пользователю и группе принадлежит файл
в выводе команды ls -l.
118
$ ls -l /bin/bash
-rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash
В данном примере исполнимый файл /bin/bash принадлежит пользователю root и группе wheel.
Модель прав доступа позволяет задать три независимых уровня прав на каждый объект файловой
системы — для владельца, для группы и для всех остальных пользователей.
Давайте рассмотрим вывод команды ls -l. Взглянем на первую колонку листинга:
$ ls -l /bin/bash
-rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash
Первое поле -rwxr-xr-x содержит символическое представление прав на данный файл. Первый
знак (-) в этом поле определяет тип файла, в данном случае это обычный файл. Другие возможные
значения:
'd' директория
'l' символическая ссылка
'c' устройство символьного ввода-вывода
'b' устройство блочного ввода-вывода
'p' FIFO
's' сокет
Остальная часть поля состоит из трех троек символов. Первая тройка представляет права
владельца файла, вторая представляет права группы файла и третья права всех остальных
пользователей.
"rwx"
"r-x"
"r-x"
Выше r означает, что чтение (просмотр данных содержащихся в файле) разрешено, w означает
запись ( изменение, а также удаление данных) разрешено и x означает исполнение (запуск
программы разрешен). Собрав все воедино мы видим, что кому угодно разрешено читать
содержимое и исполнять этот файл, но только владельцу (root) разрешено как либо
модифицировать этот файл. Так что если нормальным пользователям разрешено копировать
содержимое этого файла, то только root может изменять или удалять его.
Перед тем, как мы узнаем как изменить владельца или группу которой принадлежит файл,
давайте сперва рассмотрим, как узнать вашего текущего пользователя и группу к которой вы
принадлежите. Если вы не использовали команду su недавно, ваш текущий пользователь это тот,
119
которым вы вошли в систему. Если вы часто используете su, вы можете не помнить пользователя
под которым вы работаете в данный момент. Чтобы узнать под каким пользователем вы
работаете, наберите whoami:
# whoami
root
# su student
$ whoami
student
Чтобы увидеть к каким группам вы принадлежите используйте команду groups:
$ groups
student wheel audio
Из этого примера видно, что я состою в группах student, wheel, и audio. Если вы хотите посмотреть,
в каких группах состоит другой пользователь, то передайте его имя в качестве аргумента.
$ groups root daemon
root : root bin daemon sys adm disk wheel floppy dialout tape video
daemon : daemon bin adm
Изменение пользователя и группы владельца
Чтобы изменить владельца или группу файла (или другого объекта) используется команды chown
или chgrp соответственно. Сначала нужно передать имя группы или владельца, а потом список
файлов.
# chown root /etc/passwd
# chgrp wheel /etc/passwd
Вы также можете изменить пользователя и группу одновременно используя команду chown в
другой форме:
# chown root:wheel /etc/passwd
Вы не можете использовать команду chown без прав суперпользователя, но chgrp может быть
использована всеми, чтобы изменить группу-владельца файла на ту группу, к которой они
принадлежат.
120
Команды chown и chgrp могут быть использованы с параметром -R, что позволяет рекурсивно
изменить владельца или группу у всех объектов в данной директории и ниже. Пример:
# chown -R drobbins /home/drobbins
Знакомство с chmod
Команды chown и chgrp используются для изменения владельца и группы объекта файловой
системы, но кроме них существует и другая программа, называемая chmod, которая используется
для изменения прав доступа на чтение, запись и исполнение, которые мы видим в выводе
команды ls -l. chmod использует два и более аргументов: метод, описывающий как именно
необходимо изменить права доступа с последующим именем файла или списком файлов, к
которым необходимо применить эти изменения:
$ chmod +x scriptfile.sh
В примере выше в качестве метода указано +x. Как можно догадаться, метод +x указывает chmod,
что файл необходимо сделать исполняемым для пользователя, группы и для всех остальных. Если
мы решим отнять все права на исполнение файла, то сделаем вот так:
$ chmod -x scriptfile.sh
До сих пор, наши примеры команды chmod влияли на права доступа всех трех наборов прав
доступа — пользователя, группы и всех остальных пользователей. Часто бывает удобно изменить
только один или два набора за раз. Чтобы сделать это, просто используйте специальный символ
для обозначения набора прав доступа, который вам необходимо изменить, со знаком + или —
перед ним. Используйте u для пользователя, g для группы и o для остальных пользователей.
$ chmod go-w scriptfile.sh
Мы только что удалили право на запись для группы и всех остальных пользователей, но оставили
права владельца нетронутыми.
Помимо переключения бит, отвечающих за права доступа, в состояние вкл/выкл, мы можем
задать конкретные значения для всех сразу. Используя оператор равенства мы можем указать
chmod, что хотим задать только указанные права доступа:
$ chmod =rx scriptfile.sh
Этой командой мы установили все биты чтения и исполнения и сбросили все биты записи. Если вы
хотите задать значения конкретной тройки бит, то можете сделать это, указав ее символьное
наименование перед оператором равенства:
$ chmod u=rx scriptfile.sh
Числовые режимы
До сих пор, мы использовали то, что называется символическим способом указания прав доступа
для команды chmod. Однако есть еще один достаточно распространенный способ указания прав:
использование четырехзначных восьмеричных чисел. Этот синтаксис, называется числовым
синтаксисом прав доступа, где каждая цифра представляет тройку разрешений. Например, в 1777,
777 устанавливают флаги о которых мы говорим в этом разделе, для владельца, группы, и
121
остальных пользователей. 1 используется для указания специального бита прав доступа, который
мы рассмотрим позже (смотрите «Неуловимая первая цифра» в конце раздела). Эта таблица
показывает как транслируются права доступа на числовые значения.
Режим
Число
rwx
7
rw-
6
r-x
5
r--
4
-wx
3
-w-
2
--x
1
---
0
Числовой синтаксис прав доступа особенно полезен когда требуется указать все разрешения для
файла, как показано в следующем примере:
$ chmod 0755 scriptfile.sh
$ ls -l scriptfile.sh
-rwxr-xr-x 1 drobbins drobbins 0 Jan 9 17:44 scriptfile.sh
В этом примере мы назначили права доступа 0755, что равносильно комбинации прав -rwxr-xr-x.
umask
Когда процесс создает новый файл, он указывает, какие права доступа нужно задать для данного
файла. Зачастую запрашиваются права 0666 (чтение и запись всеми), что дает больше
разрешений, чем необходимо в большинстве случаев. К счастью, каждый раз, когда в Linux
создается новый файл, система обращается к параметру, называемому umask. Система использует
значение umask чтобы понизить изначально задаваемые разрешения на что-то более разумное и
безопасное. Вы можете просмотреть текущие настройки umask набрав umask в командной строке:
$ umask
0022
В Linux-системах значением по умолчанию для umask является 0022, что позволяет другим читать
ваши новые файлы (если они могут до них добраться), но не изменять их. Чтобы автоматически
обеспечивать больший уровень защищенности для создаваемых файлов, можно изменить
настройки umask:
$ umask 0077
122
Такое значение umask приведет к тому, что группа и прочие не будут иметь совершенно никаких
прав доступа для всех, вновь созданных файлов. Итак, как работает umask? В отличие от
«обычного» назначения прав доступа к файлу, umask задает какие права доступа должны быть
отключены.
Последние три знака в 0077 обозначают ---rwxrwx. Теперь вспомните, что umask показывает
системе, какие права доступа отключить. Совместив первое и второе становится видно, что все
права для группы и остальных пользователей будут отключены, в то время как права владельца
останутся нетронутыми.
suid и sgid
В момент вашего входа в систему запускается новый процесс оболочки. Вы уже знаете об этом, но
можете не знать о том, что этот новый процесс оболочки (обычно это bash) работает от имени
вашего пользователя. И таким образом программа bash может обращаться ко всем файлам и
директориям, владельцем которых вы являетесь. В действительности мы, как пользователи,
полностью зависим от программ, выполняющих операции от нашего имени. И поскольку
программы, которые вы запускаете, наследуют ваш пользовательский идентификатор, они не
могут обращаться объектам файловой системы, к которым вам не предоставлен доступ. К
примеру, обычные пользователи не могут напрямую изменять содержимое файла passwd потому
что флаг записи отключен для всех пользователей кроме root:
$ ls -l /etc/passwd
-rw-r--r-- 1 root wheel 1355 Nov 1 21:16 /etc/passwd
Однако, обычным пользователям тоже нужно иметь возможность хотя бы опосредованно менять
содержимое /etc/passwd когда им понадобится сменить пароль. Но если пользователь не может
изменить этот файл, как это сделать?
К счастью, в модели прав доступа Linux имеются два специальных бита, называемых suid и sgid.
Когда для запускаемой программы установлен бит suid, она будет работать от имени владельца
исполняемого файла, а не от имени того, кто запустил программу. Теперь можем вернуться к
вопросу с /etc/passwd. Если посмотрим на исполняемый файл passwd, увидим, что его владельцем
является пользователь root:
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root wheel 17588 Sep 24 00:53 /usr/bin/passwd
Обратите внимание, что вместо x в триплете прав доступа владельца стоит s. Это означает что для
этой конкретной программы установлены биты suid и права на запуск. По этой причине при
запуске программы passwd она будет работать от имени пользователя root (со всеми правами
доступа суперпользователя), а не пользователя, запустившего её. И поскольку passwd работает с
правами суперпользователя, она способна редактировать /etc/passwd без каких либо сложностей.
Мы увидели как работает suid, sgid работает похожим образом. Она позволяет программе
наследовать права доступа группы, а не текущего пользователя.
Важно!
123
Во-первых, биты suid и sgid занимают те же поля в выводе команды ls -l. Если бит x тоже задан,
соответствующие биты будут показаны как s (в нижнем регистре). Однако, если бит x не задан то
он будет отображаться как S (в верхнем регистре).
Важно!
Еще одно важное замечание: suid и sgid бывают удобны во многих ситуациях, но неправильное их
использование может привести к появлению уязвимостей в защите системы. Лучше всего иметь
как можно меньшее количество suid программ. Команда passwd — одна из немногих, которая
должна быть suid.
Способ установки и удаления битов suid и sgid чрезвычайно прост. Вот так мы задаем бит suid:
# chmod u+s /usr/bin/myapp
А в следующем примере мы снимаем флаг sgid с директории. Вы увидите, как бит sgid работает с
директориями немного ниже:
# chmod g-s /home/student
Права и директории
До текущего момента мы рассматривали права доступа с точки зрения обычных файлов. Когда
речь заходит о директориях, появляются некоторые отличия. Директории используют те же флаги
прав доступа, но их интерпретация имеет немного другой смысл.
Если для директории задан флаг чтения, то вы можете просматривать список содержимого
директории; флаг записи означает, что вы можете создавать файлы в директории; и флаг
исполнения означает, что вы можете войти в директорию и обращаться ко всем поддиректориям
внутри. Без флага исполнения у вас не будет доступа к объектам файловой системы внутри
директории. Без флага чтения объекты файловой системы внутри директории нельзя просмотреть,
но к объектам внутри директории все еще можно обратиться, если вы знаете полный путь к
объекту на диске.
Директории и флаг sgid
В случае же, если для директории установлен бит sgid, все объекты файловой системы,
создаваемые внутри, наследуют группу директории. Эта возможность бывает кстати, когда вам
необходимо создать дерево директорий и все они должны принадлежать одной группе. Это
можно сделать вот так:
# mkdir /home/groupspace
# chgrp mygroup /home/groupspace
# chmod g+s /home/groupspace
Теперь любые пользователи группы mygroup могут создавать файлы и директории внутри
/home/groupspace и им также будет автоматически задана принадлежность группе mygroup. В
зависимости от настроек umask для данного пользователя новые объекты файловой системы
могут быть или не быть читаемыми, изменяемыми или исполняемыми другими пользователями
группы mygroup.
124
По умолчанию директории в Linux ведут себя не самым удобным во многих ситуациях образом.
Обычно кто угодно может переименовать или удалить файл внутри директории если у них есть
права на запись в этой директории. Для директорий, которыми владеют отдельные пользователи,
такое поведение обычно не вызывает проблем.
Однако для директорий, которыми пользуется большое количество пользователей, в особенности
/tmp и /var/tmp, это может вызвать целую кучу проблем. Все потому, что кто угодно может писать
в эти директории, кто угодно может удалять и переименовывать чьи угодно файлы — даже если
они им не принадлежат! Очевидно, довольно сложно использовать /tmp даже для временного
хранения чего угодно, когда любой пользователь в любой момент может напечатать rm -rf /tmp/*
и уничтожить файлы всех остальных.
Хорошая новость в том, что в Linux существует так называемый sticky бит. Когда для /tmp
установлен sticky бит (командой chmod +t), единственные, кто могут удалить или переименовать
файлы в /tmp — это либо владельцы этих файлов либо суперпользователь.
В завершение этого раздела мы наконец обратим внимание на первый знак, используемый в
численном синтаксисе. Он используется для задания битов sticky, suid и sgid:
suid
sgid
sticky режим
on
on
on
7
on
on
off
6
on
off
on
5
on
off
off
4
off
on
on
3
off
on
off
2
off
off
on
1
off
off
off
0
Ниже приведен пример того, как использовать 4-значный режим для установки прав доступа на
директорию, которая будет использоваться рабочей группой:
# chmod 1775 /home/groupfiles
125
Установка программного обеспечения
Необходимость в установке новых программных пакетов под LINUX возникает в двух основных
случаях:


когда появляется новая версия одного из уже установленных у вас пакетов;
когда возникает желание или необходимость использовать какой-то пакет, еще
не установленный в системе.
Во втором случае это может быть один из пакетов, имеющихся на вашем установочном диске, но
не установленный в процессе инсталляции. Однако чаще всего новое ПО вы будете находить в
Интернете, тем более, что значительная часть этого ПО бесплатна. Как бы то ни было, но рано или
поздно вы все равно окажетесь перед необходимостью установить новый пакет.
Для дистрибутивов, основанных на Red Hat Linux, существует две основных формы
распространения ПО: в исходных текстах и в виде исполняемых модулей. В первом случае пакет
ПО обычно поставляется в виде tar-gz архива, во втором случае— в виде rpm-пакета (но это не
обязательно, исполняемые модули также могут распространяться в виде tar-gz- архива).
Проще всего установить ПО, представленное в виде rpm-пакета, содержащего исполняемые
файлы, этот способ и рассмотрим первым. Отметим только, что для инсталляции новых пакетов
вы должны войти в систему как пользователь root.
Утилита rpm
Название этой программы (или команды) является аббревиатурой от Redhat Package Manager.
Такая расшифровка дается в большинстве книг и руководств по Linux и кажется мне более
правильной и логичной, хотя в главе 6 "The Official Red Hat Linux Reference Guide" говорится: "The
RPM Package Manager (RPM), is an open packaging system available for anyone to use, and works on
Red Hat Linux as well as other Linux and UNIX® systems", т.е. предлагается рекурсивная расшифровка
названия RPM, подобная расшифровке GNU— GNU is Not UNIX®).
Программа rpm в некотором смысле аналогична программам типа setup wizard для MS Windows.
Преимуществом использования этой программы по сравнению с установкой из исходных кодов
является то, что она автоматически проделает все необходимые действия по установке ПО:
создаст необходимые каталоги, распределит по ним файлы, создаст ссылки. Кроме того, она
может быть использована не только для установки нового пакета, но и для обновления версий ПО,
получения перечней установленного ПО и проверки установки, а также для деинсталляции
отдельных пакетов (например, если после периода пробной работы с программой вы решили
отказаться от ее дальнейшего использования). С помощью той же программы rpm можно самому
создать пакет формата rpm, однако для начинающих лучше, наверное, этим не заниматься, а
воспользоваться готовыми rpm-пакетами.
Rpm-пакеты— это специальным образом подготовленные архивы, предназначенные для
обработки программой rpm. Название rpm-пакетов оканчивается на суффикс .rpm, например:
xzip-180-1.i386.rpm или xzip-180-1.src.rpm.
Как видите, перед суффиксом .rpm стоит еще один суффикс. Если это .i386, .i686 или .i586, то в
пакете находятся исполняемые файлы (оптимизированные для соответствующего типа
процессора), а если этот суффикс .src,— то в пакете исходные тексты, которые после установки
126
еще надо скомпилировать. Обычно как на установочных компакт-дисках, так и в интернеткаталогах rpm-пакеты с исполняемыми файлами располагаются в каталогах с названием RPMS, а
rpm-пакеты с исходными текстами — в подкаталогах SRPMS. Часто встречаются также rpm-пакеты
с суффиксом .noarch.rpm, содержащие файлы, которые просто без всякой дополнительной
обработки устанавливаются в соответствующие каталоги (например, файлы страниц
интерактивного руководства man).
И, наконец, если rpm-пакет рассчитан на версию Linux, предназначенную для другой аппаратной
платформы (AMD, DEC Alpha, SUN Sparc, MIPS, PowerPC), это тоже будет отображено в имени
пакета: вместо i386 в суффиксе будет стоять, соответственно, athlon, alpha, sparc, mips или ppc.
В Интернете rpm-пакеты можно найти на различных серверах. По моему опыту наиболее удобным
сервером в Интернете для поиска rpm-архивов является сервер http://rufus.w3.org (недаром он
имеет другое имя http://rpmfind.net). На нем установлена поисковая система, которая позволяет
упорядочивать список пакетов наиболее удобным для вас способом:





по именам пакетов;
по дистрибутивам;
по группам приложений;
по датам;
по поставщикам (производителям) ПО.
Общий объем архива rpm-пакетов на этом сервере составляет более 66 Гигабайт. Очень богатые
архивы хранят также два ftp-сервера в России: ftp://ftp.chg.ru/pub/Linux и ftp://ftp.nc.orc.ru/.
Итак, вы нашли и скачали rpm-архив с исполняемой версией нужного вам пакета. Если вы ставите
совершенно новый пакет (у вас не было на компьютере предыдущих версий этого ПО), то для
установки пакета из этого архива достаточно перейти в тот каталог, где находится архив, и дать
команду (для самых нетерпеливых: не спешите выполнять эту рекомендацию, прочитайте еще
хотя бы пару абзацев)
[root]# rpm -i имя_rpm-архива
Если у вас была установлена предыдущая версия пакета, то в простейшем случае надо дать
команду следующего формата:
[root]# rpm -U --force имя_rpm-архива
Здесь параметр -U говорит программе, что надо произвести обновление (upgrade) пакета, а опция
--force требует безусловно (и без лишних вопросов) обновить все входящие в пакет файлы.
Заметьте, что это очень сильное требование, и в некоторых случаях может быть лучше сохранить
какие-то (например, конфигурационные) файлы от предыдущей версии. Если установка проходит
нормально, и никаких дополнительных сообщений не появляется, то после завершения работы
программы (после появления приглашения оболочки) вы можете пользоваться вновь
установленным пакетом.
К сожалению, не всегда все так просто. Приведу конкретный пример. У меня был установлен
RedHat Linux версии 5.2, причем программа Midnight Commander (mc) была версии 4.1.36. На ftpсервере я увидел версию 4.5.30 этой программы (пакет mc-4.5.30-12.i386.rpm) и, естественно,
решил ее поставить. Однако оказалось, что для этого необходимо установить еще 4 других пакета,
о чем rpm мне и сообщила:
127
ошибка: неудовлетворенные зависимости: redhat-logos
4.5.30-12 libglib-1.2.so.0 нужен для mc-4.5.30-12
нужен
для
mc-
libc.so.6(GLIBC_2.1) нужен для mc-4.5.30-12 libc.so.6(GLIBC_2.0) нужен
для mc-4.5.30-12
Это не удивительно, если вы вспомните, что и при первоначальной установке Linux программа
инсталляции тоже проверяла взаимозависимости пакетов и предлагала установить недостающие.
Однако в случае инсталляции с CD-ROM все необходимые пакеты находятся на том же диске, а
здесь мне пришлось вначале поискать нужные пакеты. Два пакета (redhat-logos-1.0.5-1.noarch.rpm
и glibc-2.1.1-6.i386.rpm) я нашел без труда, после чего rpm перестала просить и GLIBC_2.0. А вот с
libglib.so.1 вышло сложнее. Во-первых, я никак не мог найти пакета с таким названием. Как
оказалось, такого пакета и не существует, файл libglib.so.1 входит в состав пакета glib-1.0.63.i386.rpm.
Программа rpm позволяет выяснить, какие файлы установит тот или иной пакет. Для этого надо
дать следующую команду (только учтите, что текущим должен быть каталог, содержащий
интересующий вас пакет):
[root]# rpm -qpl имя_rpm-архива
А для получения информации о том, для чего служит ПО, содержащееся в rpmпакете,используйте команду
[root]# rpm -qpi имя_rpm-архива
Дело в том, что файлы RPM кроме собственно архива файлов содержат информацию о пакете,
включая имя, версию и краткое описание. С помощью той же программы rpm вы можете
просмотреть эту дополнительную информацию. Например, для пакета
glib-1.0.6-3.i386.rpm вывод команды
[root]# rpm -qpi glib-1.0.6-3.i386.rpm будет примерно таким:
Name : glib Relocations: (not relocateable) Version : 1.0.6 Vendor:
Red Hat Software
Release : 3 Build Date: Суб 10 Окт 1998 04:49:03
Install date: (not installed) Build Host : porky.redhat.com
Group : Libraries Source RPM: glib-1.0.6-3.i386.rpm
Size : 55305
Packager : Red Hat Software <bug@redhat.com> Summary : Handy library
of utility functions
Description : Handy library of utility functions. Development libs and
headers are in gtk+-devel.
Если дать команду:
[root]# rpm -qpl glib-1.0.6-3.i386.rpm
будет выдан список входящих в пакет файлов с указанием того, куда они
будут установлены:
/usr/lib/libglib.so.1
/usr/lib/libglib.so.1.0.6
128
RPM также предоставляет мощную систему запросов по установленным в системе пакетам. По
команде
[root]# rpm -qа
вы получите перечень всех установленных в системе пакетов (перечень будет очень большим, так
что лучше сразу направить вывод в фильтр more или в файл, который потом просматривать с
помощью less или встроенной программы просмотра из оболочки Midnight Commander). Вы
можете искать информацию об отдельном пакете или об отдельных файлах. Например, вы
можете легко найти, какому пакету принадлежит файл и откуда появился. Команда
[root]# rpm -qf /etc/bashrc
сообщит:
bash-1.14.7-16.
Если вы беспокоитесь о том, что случайно удалили важный файл из установленного пакета, просто
проверьте это:
[root]# rpm -Va
Вы будете оповещены об любых аномалиях. Потом можно переустановить пакет, если это
необходимо. Любые конфигурационные файлы будут сохранены.
Как видите, rpm это очень полезная утилита, и у нее имеется много разных опций. Выше
приведено только несколько примеров. Всего rpm имеет 16 основных режимов работы, которые
можно объединить в 6 групп (после двоеточия приводится формат команды для
соответствующего режима).
Запросы.


Запрос: rpm [--query] [queryoptions]
Показать метки запросов (Querytags): rpm [--querytags]
Установка и поддержка установленных пакетов.




Установка: rpm [--install] [installoptions] [package_file]+
Обновление: rpm [--freshen|-F] [installoptions] [package_file]+
Деинсталляция: rpm [--uninstall|-e] [uninstalloptions] [package]+
Проверка: rpm [--verify|-V] [verifyoptions] [package]+
Подписи (пакеты подписываются электронной цифровой подписью в формате PGP, с целью
обеспечения неизменяемости и сохранения авторства пакетов).



Проверка подписи: rpm [--verify|-V] [verifyoptions] [package]+
Переподписывание: rpm [--resign] [package_file]+
Добавление подписи: rpm [--addsign] [package_file]+
Работа с базой.


Инициализация базы: rpm -i [--initdb]
Обновление базы (Rebuild Database): rpm -i [--rebuilddb]
Создание rpm-пакетов.


Создать пакет: rpm [-b|t] [package_spec]+
Перекомпилировать пакет: rpm [--rebuild] [sourcerpm]+
129

Скомпилировать пакет из tar-архива: rpm [--tarbuild] [tarredsource]+



Показать конфигурацию программы rpm: rpm [--showrc]
Задать пользователей: rpm [--setperms] [package]+
Задать группы: rpm [--setgids] [package]+
Разное.
Примечание
Как и другие программы для Linux, программа rpm постоянно развивается и совершенствуется.
При этом при замене версии этой программы могут возникнуть трудности с установкой пакетов,
созданных в предыдущих версиях. Так было, например, при переходе с третьей на четвертую
версию rpm. Так что надо использовать пакеты, соответствующие установленной у вас версии
программы.
Приведенное выше описание программы rpm предполагает, что она запускается с консоли или в
эмуляторе терминала. Между тем в разных дистрибутивах имеются графические оболочки для
управления rpm-пакетами. В составе графической среды KDE такая оболочка называется kpackage.
Вы можете запустить ее либо из командной строки, либо из основного меню KDE. Однако, на мой
взгляд, она не дает никаких преимуществ по сравнению с работой из командной строки.
Проблемные ситуации при работе с rpm
Если при попытке установить пакет будет обнаружено, что он уже установлен, Вы увидите на
экране сообщение:
hydro package hydro-1.0-1 is already installed error: hydro-1.01.i386.rpm cannot be installed
Если Вы хотите продолжить установку, то можете ввести параметр --replacepkgs, который сообщит
RPM, что ошибку нужно игнорировать:
rpm -ivh --replacepkgs hydro-1.0-1.i386.rpm
Если Вы пытаетесь установить пакет, содержащий файл, уже установленный другим пакетом, Вы
увидите сообщение:
hydro /usr/bin/ hydro conflicts with file from
hydro-1.0-1.i386.rpm cannot be installed
Для того чтобы RPM проигнорировал эту ошибку, введите команду
soft-1.0-1
error:
rpm -ivh --replacefiles hydro-1.0-1.i386.rpm
Пакеты RPM могут зависеть от других пакетов. Это означает, что для правильной работы им
требуется установка других пакетов. При установке пакета с неразрешенной зависимостью, Вы
увидите на экране сообщение:
failed dependencies:
hydro is needed by soft-1.0-1
Для того чтобы исправить эту ошибку, следует установить требуемое приложение. Если Вы, тем не
менее, хотите продолжить установку (чего делать не рекомендуется, поскольку приложение,
возможно, не будет работать корректно), введите команду с параметром --nodeps.
130
При удалении пакета может возникнуть ошибка зависимости, если от данного пакета зависит
какое-либо другое приложение:
removing these packages would break dependencies:
hydro is needed by soft-1.0-1
Для того чтобы RPM игнорировал ошибку и удалил пакет в любом случае (чего делать не
рекомендуется, так как пакет, который ссылается на него, скорее всего, не будет работать
корректно), введите команду с параметром --nodeps.
При попытке установить более раннюю, чем уже установлена версию пакета, будет выдано
сообщение:
hydro package hydro-2.0-1 (which is newer) is already installed error:
hydro-1.0-1.i386.rpm cannot be installed
Для того чтобы RPM все равно выполнил модернизацию, введите команду с параметром
--oldpackage :
rpm -Uvh --oldpackage hydro-1.0-1.i386.rpm
Менеджер пакетов Yum
Yum — это менеджер пакетов Red Hat, который умеет запрашивать информацию о пакетах,
получать пакеты из репозиториев, устанавливать и удалять их, используя автоматическое
разрешение зависимостей, а также обновлять целиком систему до последних версий пакетов.
Yum выполняет автоматическое разрешение зависимостей для пакетов, которые обновляются,
устанавливаются или удаляются, и, таким образом, позволяет автоматически определять,
получать и устанавливать все доступные по зависимостям пакеты. Для Yum можно настроить
новые, дополнительные репозитории, или, по другому, источники пакетов, кроме того, для него
доступны многие дополнения, которые улучшают и расширяют его возможности. Yum позволяет
выполнять многие из задач, которые выполняет RPM; кроме того, многие из опции командной
строки у него также подобны. Yum обеспечивает простое и легкое управление пакетами на одной
машине или же на группе машин.
Yum обеспечивает безопасное управление пакетами путем включения проверки сигнатур GPG для
пакетов, подписанных с помощью GPG, дл всех репозиториев пакетов или для отдельных
репозиториев. В случае включения проверки сигнатур, Yum откажется устанавливать любые
пакеты, не подписанные корректным ключом для данного репозитория. Это означает, что можно
доверять пакетам RPM, которые скачиваются и устанавливаются на машине в том случае, если они
получены из доверенных источников, например, Red Hat, и они не были изменены в процессе
передачи.
Yum также позволяет легко создавать собственные репозитории RPM-пакетов для скачивания и
установки их на других машинах.
Проверка обновлений и обновление пакетов
Вы можете использовать команду yum check-update для просмотра доступных обновлений для
вашей системы.
131
Необходимо иметь права суперпользователя, чтобы использовать yum для установки, обновления
или удаления пакетов. Все примеры в этом разделе подразумевают, что права суперпользователя
уже получены с помощью команды su.
# yum check-update
Loaded plugins: presto, refresh-packagekit, security
PackageKit.x86_64
0.5.8-2.el6
PackageKit-glib.x86_64
0.5.8-2.el6
PackageKit-yum.x86_64
0.5.8-2.el6
PackageKit-yum-plugin.x86_64
0.5.8-2.el6
glibc.x86_64
2.11.90-20.el6
glibc-common.x86_64
2.10.90-22
kernel.x86_64
2.6.31-14.el6
kernel-firmware.noarch
2.6.31-14.el6
rpm.x86_64
4.7.1-5.el6
rpm-libs.x86_64
4.7.1-5.el6
rpm-python.x86_64
4.7.1-5.el6
udev.x86_64
147-2.15.el6
yum.noarch
3.2.24-4.el6
Все перечисленные пакеты имеют доступные обновления. Первый пакет в списке — PackageKit,
графический менеджер пакетов. Первая строка вывода говорит вот о чем:
PackageKit — имя пакета
х86_64 — архитектура процессора, под которую пакет был собран
0.5.8 — версия обновленного пакета, который будет установлен
В выводе также показано, что можно обновить ядро, сам Yum и RPM, а также как и их зависимости
(kernel-firmware, rpm-libs и rpm-python), используя yum.
Обновление пакетов
Для обновления можно выбрать одиночный пакет, множество пакетов или же все пакеты сразу.
Если какие-либо зависимости пакетов, выбранных для обновления, сами имеют более свежие
версии, они также будут обновлены. Для обновления одного пакета введите команду yum update:
# yum update udev
132
Loaded plugins: presto, refresh-packagekit, rhnplugin, security
Setting up Update Process
Resolving Dependencies
--> Running transaction check
---> Package udev.x86_64 0:147-2.15.el6 set to be updated
--> Finished Dependency Resolution
Dependencies Resolved
======================================================================
=====
Package
Size
Arch
Version
Repository
======================================================================
=====
Updating:
udev
337 k
x86_64
147-2.15.el6
rhel
Transaction Summary
======================================================================
=====
Install
0 Package(s)
Upgrade
1 Package(s)
Total download size: 337 k
Is this ok [y/N]:
вывод содержит несколько интересных вещей:
Loaded plugins: presto, refresh-packagekit, rhnplugin, security — yum всегда сообщает, какие
дополнения установлены и включены. В данном случае, yum использует дополнения presto,
refresh-packagekit и security.
Обновление и установка ядра с помощью Yum
yum всегда устанавливает новое ядро, подобно тому, как RPM устанавливает новое ядро с
помощью команды rpm -i kernel. Другими словами, нет необходимости беспокоиться о разнице
между установкой и обновлением пакета ядра при использовании yum: все будет сделано
правильно независимо от того, используется ли команда yum update, или же yum install.
133
С другой стороны, при использовании RPM, важно использовать команду rpm -i kernel (которая
установит новое ядро) вместо rpm -u kernel (которая заместит текущее ядро).
yum показывает информацию об обновлени, а затем делает запрос о необходимости выполнить
обновление; yum по умолчанию работает в интерактивном режиме. Если заранее известно, какие
транзакции yum планирует выполнить, можно использовать опцию -y, которая автоматически
отвечает yes на все вопросы, которые yum может задать (в этом случае он запускается неинтерактивно). Как бы то ни было, всегда можно проверить, какие изменения yum планирует
произвести в системе, поэтому можно легко разрешить любую проблемы, которая может
возникнуть. Если транзакция прошла неправильно, можно посмотреть лог транзакции с помощью
команды cat /var/log/yum.log. Самые последние транзакции представлены в конце файла.
Для обновления всех пакетов и их зависимостей просто введите yum update (без аргументов):
# yum update
Поиск, перечисление и отображение информации о пакете
Можно искать пакеты по имени, подписи и описанию, используя команду yum search
<выражение>. yum отобразит список соответствий для каждого выражения.
# yum search meld kompare
Loaded plugins: presto, refresh-packagekit, rhnplugin, security
============================ Matched: kompare
=============================
kdesdk.x86_64 : The KDE Software Development Kit (SDK)
Warning: No matches found for: meld
yum search полезен для поиска пакетов, имя которых неизвестно, но известно к чему они
относятся.
yum list и связанные с ним команды предоставляет информацию о пакетах, группах пакетов и
репозиториях.
Все команды Yum позволяют фильтровать результаты путем добавления одного и нескольких
регулярных выражений в качестве аргументов. Глобальные выражения — это обычная строка
символов, которые содержат один или множество wildcard-символов * (кототый соответветствует
нескольким любым символам) и ? (который соответствует одному любому символу). Необходимо
использовать экранирование обеих символов для передачи их в качестве аргумента команде yum.
Если это не сделать, bash будет интерпретировать глобальное выражение в качестве расширения
имени пути, и потенциально передаст все файлы в текущей директории в качестве соответствия
команде yum, но это не то, что требуется. Напротив, необходимо передать сами регулярные
выражения yum, что можно сделать экранируя сиволы.
В следующих примерах показаны оба способа:
# yum list available gstreamer\*plugin\*
134
Loaded plugins: presto, refresh-packagekit, rhnplugin, security
Available Packages
gstreamer-plugins-bad-free.i686
rhel
0.10.17-4.el6
gstreamer-plugins-base.i686
rhel
0.10.26-1.el6
gstreamer-plugins-base-devel.i686
rhel
0.10.26-1.el6
gstreamer-plugins-base-devel.x86_64
rhel
0.10.26-1.el6
gstreamer-plugins-good.i686
rhel
0.10.18-1.el6
# yum list installed "krb?-*"
Loaded plugins: presto, refresh-packagekit, rhnplugin, security
Installed Packages
krb5-libs.x86_64
@rhel
1.8.1-3.el6
krb5-workstation.x86_64
@rhel
1.8.1-3.el6
— yum list <регулярное_выражение> — показывает информацию об установленных или
доступных пакетах, соответствующих регулярному выражению.
# yum list abrt-addon\* abrt-plugin\*
Loaded plugins: presto, refresh-packagekit, rhnplugin, security
Installed Packages
abrt-addon-ccpp.x86_64
@rhel
1.0.7-5.el6
abrt-addon-kerneloops.x86_64
@rhel
1.0.7-5.el6
abrt-addon-python.x86_64
@rhel
1.0.7-5.el6
abrt-plugin-bugzilla.x86_64
@rhel
1.0.7-5.el6
135
abrt-plugin-logger.x86_64
@rhel
1.0.7-5.el6
abrt-plugin-sosreport.x86_64
@rhel
1.0.7-5.el6
abrt-plugin-ticketuploader.x86_64
@rhel
1.0.7-5.el6

yum list all — список всех установленных И доступных пакетов

yum list installed — список всех пакетов, установленных в системе. Колонка с правой
стороны показывает репозиторий, из которого пакет был получен.

yum list available — список всех доступных пакетов во всех включеных репозиториях

yum grouplist — список всех групп пакетов

yum repolist — список ID репозиториев, имя и количество пакетов, которые предоставлены
для каждого включенного репозитория.
yum info <имя_пакета> отображает информацию об одном или множестве пакетов (регулярные
выражения в данном случае также работают):
# yum info abrt
Loaded plugins: presto, refresh-packagekit, rhnplugin, security
Installed Packages
Name
: abrt
Arch
: x86_64
Version
: 1.0.7
Release
: 5.el6
Size
: 578 k
Repo
: installed
From repo
: rhel
Summary
: Automatic bug detection and reporting tool
URL
: https://fedorahosted.org/abrt/
License
: GPLv2+
136
Description: abrt is a tool to help users to detect defects in
applications
: and to create a bug report with all informations needed by
: maintainer to fix it. It uses plugin system to extend its
: functionality.
yum info <имя_пакета> аналогично команде rpm -q --info <имя_пакета>, но предоставляет в
качестве дополнительной информации ID репозитория Yum, в котором пакет найден (взгляните на
строку From repo: в выводе).
yumdb info <имя_пакета> может быть использован для запроса к базе данных Yum для получения
альтернативной и полезной инормации о пакете, включая контрольную сумму пакета (и алгоритм,
использующийся для ее создания, например, SHA-256), команды, набранной в командной строке,
вызванной для установки пакета и причины, по которым пакет был установлен в системе (где user
означает, что он был установлен пользователем, а dep — что был установлен в качестве
зависимости:
# yumdb info yum
yum-3.2.27-4.el6.noarch
checksum_data =
15c8eaf583fabad6974a35b9f6c6527e49362fe4e23baec1682ef51a598e4abb
checksum_type = sha256
command_line = update
from_repo = rhel
from_repo_revision = 1271991599
from_repo_timestamp = 1271991721
reason = user
releasever = 6
И наконец, команда yum history, новая для Red Hat Enterprise Linux 6, может быть использована
для показа временных отметок транзакций Yum, даты и времени, когда они произошли,
количество неисправных пакетов, были ли транзакции успешными или были прерваны, и
изменилась ли база данных RPM между транзакциями. Обратитесь к разделу history в man yum за
подробностями.
Установка пакетов
Можно установить пакет и все его неустановленные зависимости введя:
# yum install <имя_пакета>;
137
Можно установить множество пакетов одновременно, добавив их имена как аргументы.
Если устанавливаются пакеты на многобиблиотечной системе, например, AMD64 или Intel64,
можно указать архитектуру пакета, добавив .arch к имени пакета:
# yum install sqlite2.i586
Можно использовать регулярные выражения для быстрой установки пакетов с похожими
именами:
# yum install audacious-plugins-\*
В дополнение к имени пакета и регулярному выражению можно предоставить команде yum имя
файла. Если известно имя бинарного файла для установки, но не известно имя пакета, можно дать
просто пусть:
# yum install /usr/sbin/named
yum, при поиске по списку пакетов, найдет пакет, который предоставляет /usr/sbin/named, если он
есть, и спросит подтверждения установки.
Что делать, если необходимо установить пакет, который содержит бинарный файл named, но
непонятно, в какой директории, /bin или /sbin, этот файл находится? В этой ситуации, можно
передать yum provides глобальное выражение:
# yum provides "*bin/named"
Loaded plugins: presto, refresh-packagekit, rhnplugin, security
32:bind-9.7.0-4.P1.el6.x86_64 : The Berkeley Internet Name Domain
(BIND)
: DNS (Domain Name System) server
Repo
: rhel
Matched from:
Filename
: /usr/sbin/named
~]# yum install bind
yum provides «*/<имя_файла>» — общий и полезный трюк для быстрого поиска пакета,
содержащего указанное имя файла
Установка группы пакетов
Группа пакетов подобна пакету: она не используется сама по себе, но ее установка скачивает
группу зависимых пакетов, которые обеспечивают конечный результат. Группа пакетов имеет имя
и ID группы. Команда yum grouplist -v показывает имена всех групп пакетов и, один за другим, ID
группы в круглых скобках. ID группы это всегда термин в паре круглых скобок, например, как kdedesktop и kde-software-development в этом примере:
138
# yum -v grouplist kde\*
KDE (K Desktop Environment) (kde-desktop)
KDE Software Development (kde-software-development)
Можно установить группу пакетов путем передачи ее полного имени (без ID группы) команде
groupinstall:
# yum groupinstall "KDE (K Desktop Environment)"
Также можно установить с помощью ID группы:
# yum groupinstall kde-desktop
Точно также передается ID группы (или имя в ковычках) команде install, если предварить его
символов «@» (который говорит yum, что необходимо выполнить groupinstall):
# yum install @kde-desktop
Удаление
yum remove <имя_пакета> деинсталлирует пакет, также как и пакеты, которые от него зависят. Как
можно устанавливать несколько пакетов за раз, так можно и удалять их так же:
# yum remove foo bar baz
Подобно install, remove может принимать такие же аргументы:

имена пакетов

глобальные выражения

списки файлов

предоставленные пакеты
Yum не может удалить пакет, не удаляя при этом пакеты, которые зависят от него. Этот тип
операции может быть выполнен с помощью RPM, но не рассматривается, и потенциально может
привести систему в неработоспособное состояние или же послужить причиной странного
поведения приложений или же их краха.
Удаление группы пакетов
Можно удалить группу пакетов, используя синтаксис, соответствующий синтаксису install.
# yum groupremove "KDE (K Desktop Environment)"
# yum groupremove kde-desktop
# yum remove @kde-desktop
139
Настройка Yum
В этом разделе показано, как:

установить глобальные опции Yum, отредактировав сецию [main] в файле конфигурации
/etc/yum.conf

установить опции для отдельных репозиториев, отредактировав секции [repository] в
/etc/yum.conf и файлы .repo в каталоге /etc/yum.repos.d/

использовать переменные Yum в /etc/yum.conf и файлы в /etc/yum.repos.d/ так, чтобы
динамические значения версий и архитектуры обрабатывались корректно

настроить ваш собственный репозиторий Yum
Файл конфигурации /etc/yum.conf содержит одну обязательную секцию [main], в которой можно
установить опции Yum. Значения, определенные в этой секции имеют глобальный эффект, и могут
быть переопределены значениями, установленными в конкретной секции [repository]. Также
можно добавлять секции [repository] в /etc/yum.conf, однако, гораздо лучше определять
отдельные репозитории в новом или существующем файле .repo в каталоге /etc/yum.repos.d/.
Установка опций [main]
Файл /etc/yum.conf содержит ровно одну секцию [main]. Можно добавлять дополнительные
опции в эту секцию в начале /etc/yum.conf. Некоторые из пар ключ-значение в этой секции влияют
на то, как будет действовать yum; другие влияют на работу репозиториев. Лучшим источником
информации по всем опциям Yum является разделы [main] OPTIONS и [repository] OPTIONS в man
yum.conf.
Ниже показан пример файла конфигурации /etc/yum.conf:
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=3
[comments abridged]
140
# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d
Далее приведен список наиболее часто использующихся опций в секции [main] и описание
каждой их них:
assumeyes=<значение>
...где <значение> одно из:
0 — yum будет запрашивать подтверждение критических действий для выполнения. Установлено
по умолчанию.
1 — Не запрашивать подтверждение для критически важных действий. Если установлеон это
значение, yum ведет себя подобно тому, как если было бы использовалась опция -y.
cachedir=/var/cache/yum/$basearch/$releasever
Эта опция указывает каталог, в котором Yum будет хранить свой кэш и базу данных файлов. По
умолчанию, каталог кэша /var/cache/yum/ $basearch/$releasever.
debuglevel=значение
...где <значение> — это число между 1 и 10. Установка высокого значения приводит к
отображению более детального вывода отладочной информации. debuglevel=0 отключает вывод
отладки, тогда как debuglevel=2 — значение по умолчанию.
exactarch=<значение>
...где <значение> — одно из:
0 — не использовать точное значение архитектуры при обновлении пакетов
1 — принимать во внимание точную архитектуру при обновлении пакетов. При этой установке
yum не сможет установить пакет i686 для обновления пакета i386, уже установленного в системе.
Это занчение установлено по умолчанию.
exclude=<имя_пакета> [несколько_имен_пакетов]
Эта опция позволяет исключить пакеты по ключевым словам из процесса установки/обновления.
Список из нескольких пакетов для исключения может быть заключен в ковычки с пробелом в
качестве разделителя списка. Позволено использование глобальных выражений оболочки
(например, * и ?).
gpgcheck=<значение>
...где <значение> одно из:
0 — отключить проверку сигнатуры GPG для пакетов из всех репозиториев, включая локальную
установку пакетов.
141
1 — Включить проверку сигнатуры GPG для всех пакетов во всех репозиториях, включая
локальную установку пакетов. gpgcheck=1 установлено по умолчанию, таким образом,
проверяются сигнатуры всех пакетов.
Если эта опция установлена в секции [main] в файле /etc/yum.conf, она устанавливает правило
проверки для всех репозиториев. С другой стороны, можно также отпределить
gpgcheck=<значение> для конкретного репозитория; т.е. можно включить проверку для одного
репозитория, отключив при этом для другого. Установка gpgcheck=<значение> для отдельного
репозитория с соответствующем файле .repo переопределяет занчение по умолчанию,
представленное в /etc/yum.conf.
groupremove_leaf_only=<значение>
...где <значение> одно из:
0 — yum не должен проверять для каждого пакета, которые удаляется при удалении группы
пакетов. С этим значением yum удаляет все пакеты в группе пакетов, не обращая внимания,
требуются ли эти пакеты другим пакетам ли группам. groupremove_leaf_only=0 — это значение по
умолчанию.
1 — yum будет проверять зависимости каждого пакета при удалении группы пакетов, и удалит
только те пакеты, которые не требуются ли какому-либо еще пакету или группе.
installonlypkgs=<разделенный><пробелами><список><пакетов>
Здесь есть возможность предоставить разделенный пробелами список пакетов, которые yum
может установить, но никогда не будет обновлять. Обратитесь к man yum.conf за списком всех
пакетов, которые подпадают под это правило по умолчанию. Если добавить директиву
installonlypkgs в /etc/yum.conf, необходимо убедиться, что перечислены все пакеты, которые будут
только устанавливаться, включая любые из перечисленных в разделе installonlypkgs man yum.conf.
В частности, пакеты ядра всегда должны быть перечислены в installonlypkgs (они там по
умолчанию) и значение installonly_limit должно быть всегда больше 2, чтобы резервная копия
ядра всегда была доступна, если умолчальное не сможет загрузиться.
installonly_limit=<значение>
...где <значение> — число, определяющее максимальное количество версий, которые могут быть
установленны одновременно для любого единичного пакета, перечисленного в директиве
installonlypkgs. Значение по умолчанию для директивы installonlypkgs включает несколько
различных пакетов ядер, так что, убедитесь, что изменение значения installonly_limit также
повлияет на максимальное количество установленных версий любого одного пакета ядра.
Значение по умолчанию, указанное в /etc/yum.conf — installonly_limit=3, и не рекомендуется его
уменьшать, особенно делать ниже 2.
keppcache=<значение>
...где <значение> одно из:
142
0 — не сохранять кэш заголовков и пакетов после успешной установки. Это значение по
умолчанию.
1 — Сохранять кэш после успешной установки.
logfile=/var/log/yum.log
Эта опция указавает, куда yum будет отправлять вывод логов. По умолчанию, yum хранит
информацию в /var/log/yum.log.
multilib_policy=<значение>
...где <значение> одно из:
best — установить наиболее подходящую архитектуру для этой системы. Например, установка
этого значения на системе AMD64 приведет к тому, что yum установит 64-битную версии всех
пакетов.
all — всегда устанавливать каждую возможную архитектуру для каждого пакета. Например, при
установке этого значения на системе AMD64, yum установит как i586, так и AMD64 версии пакета,
если они оба доступны.
obsoletes=<значение>
...где <значение> одно из:
0 — отключает устаревшую логику обработки при выполнении обвноления
1 — включает устаревшую логику обработки при выполнении обновления. Когда один пакет
заявляет в своем spec-файле, что он устарел по отношению к другому пакету, более аоздний пакет
будет замещен пакетом разработчика, если пакет разработчика установлен. Устаревание
объявляется, например, когда пакет переименовывается. obsoletes=1 — значение по умолчанию.
plugins=<значение>
...где <значение> одно из:
0 — Отключает все дополнения Yum глобально.
1 — Включает все дополнения глобально. С этим значением все еще можно отключить конкретное
дополнение, установив enabled=0 в конфигурационном файле этого дополнения.
reposdir=
Эта опция позволяет указать каталог, в котором будут расположены файлы .repo. Все эти файлы
содержат информацию о репозиториях (подобно секции [repository] в файле /etc/yum.conf). yum
собирает всю информацию о репозиториях из файлов .repo и секции [repository] файла
/etc/yum.conf для создания главного списка репозиториев для использования при транзакциях.
Если reposdir не установлено, yum использует стандартный каталог /etc/yum.repos.d/.
retries=<значение>
143
...где <значение> — число 0 или больше. Это значение определяет количество времени, которое
yum будет пытаться полусить файл до того, как вернет ошибку. При установке значения в 0 yum
будет пытаться постоянно. Значение по умолчанию — 10.
Добавление репозиториев
Можно определить отдельный репозиторий, добавив секцию [repository] (где repository —
уникальный ID репозитория, например, [my_personal_repo]) в /etc/yum.conf или в файл .repo в
каталоге /etc/yum.repos.d/. Все файлы .repo в /etc/yum.repos.d/ читаются yum; лучше всего
указывать свой репозиторий именно здесь, а не в /etc/yum.conf. Можно создать новые,
отдельные файлы .repo в этом каталоге, добавить в них секцию [repository] и при следующем
запуске команды yum вновь созданные репозитории будет добавлены.
Здесь показан (крайне минимальный) пример вида файла .repo:
[repository_ID]
name=A Repository Name
baseurl=http://path/to/repo или ftp://path/to/repo или
file://path/to/local/repo
Каждая секция [repository] должна содержать следующие минимальные части:
[repository_ID]
repository_ID — это уникальная строка из одного слова (без пробелов, но нижнее подчеркивание
попускается) символов (заключенная в квадратные скобки), которая указывает идентификатор
репозитория.
name=<Имя моего репозитория>
В этой строке содержится понятное для человека описание этого репозитория.
baseurl=http://path/to/repo, ftp://path/to/repo, file://path/to/local/repo
Это пусть до каталога, в котором расположен каталог repodata этого репозитория. Как правило,
этот URL — ссылка на HTTP, например:
baseurl=http://path/to/repo/releases/$releasever/server/$basearch/os/
Yum всегда разворачивает переменные $releasever, $arch и $basearch в URL.

если репозиторий доступен по FTP, используйте: ftp://path/to/repo

если репозиторий находитяс на локальной машине, используйте: file://path/to/local/repo

если указанный репозиторий требует базовую аутентификацию HTTP, можно указать имя
пользователя и пароль в http://path/to/repo с помощью
имя_пользователя:пароль@ссылка. Например, если репозиторий на
http://www.example.com/repo/ требует имя пользователя в виде «user», а пароль —
«password», то запись baseurl может быть следующей:
144
baseurl=http://user:password@www.example.com/repo/
Далее показана еще одна полезная директива [repository]:
enabled=<значение>
...где <значение> одно из:
0 — не считать этот репозиторий в качестве источника пакетов при выполнении обновления и
установке. Это простейший пусть быстро включить или выключить репозиторий, который полезен
только при установке единственного пакета из репозитория, не требующегося для обновления
или установки.
1 — позволяет использовать этот репозиторий в качестве источника пакетов.
Включение или отключение репозиториев также может быть сделано путем передачи опции либо
--enablerepo=, либо --disablerepo= команде yum.
Существует гораздо больше опций [repository]. Обратитесь к разделу [repository] OPTIONS man
yum.conf за более подробным списком и описанием для каждой.
145
Сборка ПО из исходных кодов
Если rpm-пакеты с необходимым вам программным обеспечением нужно еще поискать (и не
всегда можно найти), то tar-gz-архив любого ПО для Linux найдется в Интернете непременно. В
некоторых случаях такие архивы содержат исполняемые модули приложений. Тогда установка
приложения лишь немного сложнее, чем в случае установки из rpm-пакета: необходимо просто
развернуть архив с помощью программ gunzip и tar, перейти в созданный каталог и можно уже
запускать полученное приложение. Но чаще всего приложения поставляются в исходных текстах,
т.е. в виде программы на языке Си. Установить их в этом случае немного сложнее, хотя и тут нет
ничего невозможного даже для начинающего пользователя. Давайте рассмотрим, как это
делается.
Необходимые сведения о программировании на языке Си
Начать стоит с того, что операционная система UNIX® родилась на свет одновременно с языком
программирования C (Си). Более того, язык C был создан специально для разработки этой ОС,
значительная часть UNIX® была написана на языке С. ОС Linux тоже написана на Си. Поэтому, а
также в соответствии с принципом свободного распространения исходных кодов, многие
приложения для Linux распространяются в виде текстов на С (а в последнее время— и на С++).
Естественно, что для установки и запуска такого приложения на исполнение, его необходимо
предварительно скомпилировать. Для выполнения процедур компиляции обычно используется
программа gcc (хотя существуют и некоторые альтернативные разработки).
Примечание
Изначально аббревиатура GCC имела смысл GNU C Compiler, но в апреле 1999 года сообщество
GNU решило взять на себя более сложную миссию и начать создание компиляторов для новых
языков с новыми методами оптимизации, поддержкой новых платформ, улучшенных runtimeбиблиотек и других изменений (http://gcc.gnu.org/gccmission.html). Поэтому сегодня GCC
расшифровывается как GNU Compiler Collection (коллекция компиляторов GNU) и содержит в себе
компиляторы для языков C, C++, Objective C, Chill, Fortran, Ada и Java, а также библиотеки для этих
языков
(libstdc++, libgcj, ...).
GNU-компилятор с языка С gcc, содержит в себе 4 основных компонента, соответствующие
четырем этапам преобразования исходного кода в исполняемую программу.
Первый компонент— это препроцессор, который модифицирует исходный код программы перед
компиляцией в соответствии с командами препроцессора, содержащимися в С- программе. В
соответствии с этими командами выполняются простые подстановки текста. Второй— собственно
компилятор, который обрабатывает исходный код и преобразует его в код на языке ассемблера.
Третий компонент— ассемблер, который генерирует объектный код. И, наконец, четвертый
компонент— компоновщик, который собирает исполняемый файл из файлов объектного кода.
Дело в том, что большие программы обычно пишутся по частям, в виде множества отдельных
файлов, содержащих исходный код соответствующей части. Компилятор обрабатывает каждый
такой файл отдельно и создает отдельные объектные модули (файлы таких модулей обычно
имеют расширение o). Создание единой исполняемой программы из таких модулей и является
146
задачей компоновщика. При таком подходе, если в какой-то модуль программист вносит
исправление, нет необходимости заново компилировать всю программу: достаточно
откомпилировать исправленный модуль и заново запустить компоновщик.
Для выполнения стандартных операций программист может использовать функции из
стандартных библиотек. Самый характерный пример— это библиотека libc, которая содержит
функции, выполняющие такие задачи, как управление памятью и операции ввода- вывода.
Программисты могут создать свои собственные библиотеки и использовать их при написании
новых программ.
Библиотеки бывают статическими, разделяемыми и динамическими. Статическая библиотека —
это библиотека, код которой встраивается в программу при компиляции. Код разделяемой
библиотеки не встраивается в программу, а загружается в память одновременно с программой и
программа получает доступ к функциям этой библиотеки. Динамические библиотеки—
разновидность разделяемых, но библиотечные функции загружаются в память только тогда, когда
из программы поступит вызов соответствующей функции. В процессе выполнения программы они
могут выгружаться и заменяться другими функциями из той же или другой библиотеки. Имена
статических библиотек обычно имеют суффикс .a, а имена разделяемых библиотек— суффикс .so,
за которым следует старший и младший номера версии. Имя может быть любой строкой, которая
однозначно характеризует библиотеку. Обычно имена библиотек начинаются с lib. Примеры:
libm.so.5— общая математическая библиотека, libX11.so.6— библиотека для работы с системой X
Window. Библиотека libc.so.5 компонуется автоматически, в то время как большинство других
библиотек необходимо явно указывать в командной строке при вызове программы gcc. Это
делается через опцию -l, за которой следует уникальная часть имени библиотеки, например, для
вызова математической библиотеки достаточно указать -lm.
Многие системные библиотеки располагаются в системных каталогах, например, в /usr/lib и / lib,
но некоторые могут располагаться и в других местах. Список этих каталогов помещается в файл
/etc/ld.so.conf. Каждый раз, когда разделяемая библиотека изменяется или инсталлируется вновь,
нужно выполнять команду ldconfig, чтобы обновить файл /etc/ld.so.conf, а также ссылки на него.
Если библиотека инсталлируется из RPM-пакета, это обычно делается автоматически, хотя и не
всегда.
При компиляции больших программ, использующих фрагменты исходного кода, расположенные в
разных файлах, бывает очень трудно отследить, какие файлы нужно перекомпилировать, а какие
только компоновать. В таких случаях очень помогает утилита make, которая автоматически
определяет, следует ли компилировать файл исходного кода, по дате его последней
модификации. Утилита make оперирует файлами, исходя из их зависимости друг от друга. Эти
зависимости определяются файлом с именем makefile. Строка файла makefile состоит из трех
частей: имени целевого файла, списка файлов, от которых он зависит, и команды. Если какой-либо
файл из списка изменился после целевого файла, то выполняется указанная в строке команда. В
строке может быть указано несколько команд. Обычно команда— это вызов компилятора для
компиляции файла исходного кода или компоновки файлов объектного кода. Строки,
определяющие зависимости, отделяются друг от друга пустой строкой.
147
Инсталляция из исходных текстов
Теперь, когда мы получили общее представление о компиляции программ на языке С, можно
рассмотреть обращение с пакетами программ, распространяемыми в виде исходных кодов.
Первое, что надо сказать в этой связи, это то, что для установки таких пакетов вы, естественно,
должны иметь в своей системе утилиты gcc и make.
Непосредственно процесс инсталляции пакета состоит из следующих шагов:
5. Перейти (с помощью команды cd) в каталог, содержащий исходные коды
устанавливаемого пакета.
6. Выполнить команду ./configure, которая осуществляет конфигурирование пакета в
соответствии с вашей системой. Процесс выполнения этой команды занимает
довольно длительное время, причем команда выдает на экран сообщения о том,
какие именно особенности системы испытываются.
7. Выполнить команду make, для того, чтобы скомпилировать пакет.
8. После этого можно выполнить (это шаг не является обязательным) команду
makecheck, которая вызывает запуск процедур самотестирования, которые
поставляются с пакетом.
9. Выполнить команду make install для установки программ, а также файлов данных и
документации.
10. Заключительный этап состоит в выполнении команды make clean, которая удаляет
промежуточные объектные и двоичные файлы из каталога с исходными кодами.
Для удаления временных файлов, которые создала команда configure (после чего
пакет можно компилировать для другого типа компьютеров), надо выполнить
команду make distclean.
В большинстве случаев выполнение этой последовательности команд достаточно для установки
нового пакета.
Основная проблема, с которой приходится сталкиваться при инсталляции программ из исходных
кодов, связана с конфликтами версий: для вновь устанавливаемого пакета требуются новые
версии каких-то системных утилит, которые пока еще не установлены в вашей системе. Более
того, часто возникает целая цепочка (или даже дерево): для программы нужна какая-то новая
версия утилиты, для последней нужно обновить еще какие-то утилиты, и т.д.. Но, если вы не очень
давно устанавливали (или обновляли) дистрибутив, то таких проблем не возникает, и обновление
пакета пройдет без затруднений.
148
Процессы
В самом первом приближении можно считать, что процесс — это загруженная в оперативную
память программа. Но это не совсем точно, правильнее было бы сказать, что "процесс выполняет
программу". Дело в том, что в Linux вначале запускается процесс, который загружает в
оперативную память программу из указанного ему файла и начинает ее выполнять. Это означает,
что каждый процесс должен быть запущен (как говорят — "порожден") каким-то другим
процессом. То есть для каждого процесса однозначно определен его "родитель" (или "предок"),
для которого данный процесс является "дочерним" (или "потомком"). Если вы хотите увидеть
"дерево" запущенных в вашей системе процессов, выполните команду pstree. Вывод этой
команды позволяет увидеть, что "отцом" всех процессов в системе (или "корнем дерева
процессов") является процесс init, который первым запускается после загрузки ядра.
Каждый процесс в системе имеет уникальный идентификатор — PID, назначаемый процессу при
запуске. Процесс с идентификатором 1 выполняет программу init. Именно по этим
идентификаторам система различает процессы. Каждый запущенный процесс в любой момент
времени находится в одном из следующих состояний: активен (R), приостановлен (T) или "спит"
(S). Текущее состояние процесса называют статусом процесса.
Кроме идентификатора и статуса для каждого процесса в специальных структурах ядра
сохраняются следующие данные (приводимый ниже перечень является далеко не полным):









полная командная строка запуска выполняемой процессом задачи;
информация об отведенном процессу адресном пространстве;
ссылка на текущий рабочий каталог и корневой каталог процесса (последний
служит для ограничения доступа процесса к файловой структуре);
таблица открытых процессом файлов;
так называемое окружение процесса, т. е. перечень заданных для данного
процесса переменных с их текущими значениями;
атрибуты, определяющие права и привилегии процесса,
таблица обработчиков сигналов;
указание на родительский процесс;
пользовательская маска (umask) или маска доступа — указание на то, какие
права надо удалить при создании нового файла или каталога из стандартного
набора прав, присваиваемых файлу (каталогу).
Поскольку Linux — система многозадачная, одновременно может быть запущено много
процессов. Впрочем, слово "одновременно" здесь применено не совсем корректно, поскольку на
самом деле в каждый момент времени выполняется только один процесс. (Для точности следует
заметить, что в многопроцессорных системах, на которых Linux тоже может работать,
одновременно могут выполняться несколько процессов, но мы рассматриваем только
однопроцессорные системы). Планировщик процессов выделяет каждому процессу небольшой
квант времени и по истечении этого кванта передает управление следующему процессу. Кванты
времени, выделяемые каждому процессу, так малы, что у пользователя создается иллюзия
одновременного выполнения многих процессов. А для того, чтобы некоторые, наиболее важные
процессы, получали больше процессорного времени, для каждого процесса установлен
приоритет.
149
Пользователи могут "общаться" с процессами путем посылки им сигналов. Процессы тоже
общаются друг с другом посредством сигналов. Когда мы нажимаем комбинацию клавиш
<Ctrl>+<C>, чтобы завершить выполнение какой-то программы, мы фактически посылаем
соответствующему процессу сигнал "Завершить работу". Завершаясь, процесс посылает
родительскому процессу сигнал о своем завершении. Но бывают случаи, когда родительский
процесс завершается раньше дочернего. Процессы, не имеющие родителя, называются
"сиротами". "Сироты" автоматически усыновляются процессом init, который и принимает сигналы
об их завершении. Если процесс-родитель по каким-то причинам не может принять сигнал о
завершении дочернего процесса, то процесс-потомок превращается в "зомби" и получает статус Z.
Процессы-зомби не занимают процессорного времени (т. е. их выполнение прекращается), но
соответствующие им структуры ядра не освобождаются. Наконец, процесс может надолго "впасть
в сон", прервать который не удается. Статус таких процессов обозначается символом D.
Уничтожить их удается только при перезагрузке системы.
Особым видом процессов являются демоны. Вообще-то в них нет ничего особого. Это просто
процессы, выполняющиеся в фоновом режиме, без вывода каких-либо данных на терминал.
Демоны обычно используются для выполнения сервисных функций, обслуживания запросов от
других процессов, причем не обязательно выполняющихся на данном компьютере.
Надо еще упомянуть, что процессы могут запускать ("внутри себя") отдельные нити (thread), или
потоки. Нити — это параллельно выполняемые части одной программы, которые в Linux
реализованы как процессы, запускаемые со специальным флагом. С точки зрения системы они
отличаются от других процессов только тем, что для них не создается отдельное окружение, они
выполняются в среде родительского процесса.
Управление процессами
Первым делом научимся определять, какие процессы в системе запущены. Для этого в Linux (как и
во всех UNIX®-системах) имеется команда ps. Если ее запустить без всяких параметров, то она
выдает список процессов, запущенных в текущей сессии. Если вы хотите увидеть список всех
процессов, запущенных в системе, надо задать ту же команду с параметром -ax.
Команда ps
Когда я заглянул в man-страницу, посвященную команде ps, я был поражен, как много у нее
разных опций. Как оказалось, GNU-версия этой программы, входящая в состав Linux,
поддерживает опции в стиле трех разных типов UNIX®. Опции в стиле UNIX®98 состоят из одного
или нескольких символов, перед которым(и) должен стоять дефис. Опции в стиле BSD имеют
аналогичный вид, только используются без дефиса. Опции, характерные только для GNU-версии
представляют собой слово, перед которым должно стоять два дефиса. Их нельзя объединять, как
однобуквенные опции двух предшествующих типов. Таким образом, существует три
равноправных формата задания этой команды:
ps [-опции]
ps [опции]
ps [-- длинное_имя_опции [-- длинное_имя_опции] ...]
150
При этом опции разных типов нельзя употреблять в одной команде. Дадим краткую
характеристику наиболее важных опций.
Первая группа опций регулирует вывод команды. Независимо от наличия опций этой группы
команда ps выдает для каждого процесса отдельную строку, но содержимое этой строки может
быть разным. В зависимости от заданных опций могут присутствовать следующие поля:














USER— имя владельца процесса;
PID— идентификатор процесса в системе;
PPID— идентификатор родительского процесса;
%CPU— доля времени центрального процессора (в процентах), выделенного
данному процессу;
%MEM— доля реальной памяти (в процентах), используемая данным
процессом;
VSZ— виртуальный размер процесса (в килобайтах);
RSS— размер резидентного набора (количество 1K-страниц в памяти);
STIME— время старта процесса;
TTY— указание на терминал, с которого запущен процесс;
S или STAT— статус процесса;
PRI— приоритет планирования;
NI— значение nice (см. описание команды nice ниже);
TIME— сколько времени центрального процессора занял данный процесс;
CMD или COMMAND— командная строка запуска программы, выполняемой
данным процессом;
а также и другие поля, полный список которых приведен на man-странице, посвященной команде
ps.
Значения, выводимые в большинстве этих полей вы поймете без дополнительных пояснений. В
поле Статус процесса, как уже говорилось выше, могут стоять следующие значения:





R— выполнимый процесс, ожидающий только момента, когда планировщик
задач выделит ему очередной квант времени;
S— процесс "спит";
D— процесс находится в состоянии подкачки на диске;
T— остановленный процесс;
Z— процесс-зомби.
Рядом с указателем статуса могут стоять дополнительные символы из следующего набора:




W— процесс не имеет резидентных страниц;
<— высоко-приоритетеный процесс;
N— низко-приоритетный процесс;
L— процесс имеет страницы, заблокированные в памяти.
Вторая группа опций регулирует то, какие именно процессы включаются в вывод команды. Чтобы
получить список всех процессов надо использовать команду ps с опциями ax или –A.
Вывод в этих двух случаях отличается только в поле CMD: в первом случае выдается полная
командная строка запуска программы, а во втором— только имя запущенной программы.
151
Описание всех опций программы ps здесь привести невозможно. Поэтому приведем только
несколько примеров ее применения, которые покажут, как пользоваться этой командой в
типичных ситуациях.
Для того чтобы увидеть все процессы в системе, используя стандартную форму вывода:
[user]$ ps –e
Можно к той же команде добавить опцию –o, после которой указать через запятую, какие именно
поля вы хотите видеть в выводе команды:
[user]$ ps –eo pid,user,cmd
Для того, чтобы увидеть все процессы в системе, используя форму вывода BSD-систем:
[user]$ ps ax
Для того, чтобы увидеть все процессы в системе, с применением графического отображения
отношения "предок-потомок":
[user]$ ps –ef
Впрочем, для того, чтобы увидеть "лес" деревьев "предок-потомок", лучше воспользоваться очень
интересным аналогом команды ps -ef— командой pstree.
Для того, чтобы увидеть, сколько % ЦПУ и памяти занимают запущенные вами процессы:
[user]$ ps –u
Чтобы узнать приоритет процесса и значение nice, воспользуйтесь опцией -l:
[user]$ ps –l
Вот пример командной конструкции для просмотра наиболее прожорливых процессов:
# ps -eo pmem,args,user | sort -nr | head -n 10
14.0 amavisd (ch1-avail)
amavis
13.8 amavisd (virgin child)
amavis
13.8 amavisd (master) amavis
5.4 /usr/sbin/mysqld --defaults mysql
5.4 /usr/sbin/mysqld --defaults mysql
5.4 /usr/sbin/mysqld --defaults mysql
5.4 /usr/sbin/mysqld --defaults mysql
5.4 /usr/sbin/mysqld --defaults mysql
5.4 /usr/sbin/mysqld --defaults mysql
5.4 /usr/sbin/mysqld --defaults mysql
Команда top
Команда ps позволяет сделать как бы "моментальный снимок" процессов, запущенных в системе.
В отличие от ps команда top отображает состояние процессов и их активность "в реальном
режиме времени". На Рисунок 0.1 изображено окно терминала, в котором запущена программа
top
152
Рисунок 0.1 Вывод команды top
Как видите, в верхней части окна отображается астрономическое время, время, прошедшее с
момента запуска системы, число пользователей в системе, число запущенных процессов и число
процессов, находящихся в разных состояниях, данные об использовании ЦПУ, памяти и свопа. А
далее идет таблица, характеризующая отдельные процессы. Число строк, отображаемых в этой
таблице, определяется размером окна: сколько строк помещается, столько и выводится. Графы
таблицы обозначены так же, как поля вывода команды ps , так что дополнительных пояснений
здесь не требуется.
Содержимое окна обновляется каждые 5 секунд. Список процессов может быть отсортирован по
используемому времени ЦПУ (по умолчанию), по использованию памяти, по PID, по времени
исполнения. Переключать режимы отображения можно с помощью команд, которые программа
top воспринимает. Это следующие команды (просто нажимайте соответствующие клавиши, только
с учетом регистра, то есть вместе с клавишей Shift):





<Shift>+<N>— сортировка по PID;
<Shift>+<A>— сортировать процессы по возрасту;
<Shift>+<P>— сортировать процессы по использованию ЦПУ;
<Shift>+<M>— сортировать процессы по использованию памяти;
<Shift>+<T>— сортировка по времени выполнения.
Кроме команд, определяющих режим сортировки, команда top воспринимает еще ряд команд,
которые позволяют управлять процессами в интерактивном режиме. С помощью команды <K>
можно завершить некоторый процесс (его PID будет запрошен), а с помощью команды <R> можно
переопределить значение nice для некоторого процесса. Таким образом, эти две команды
аналогичны командам kill и renice.
153
Примеры:
Весь список процессов
top -b
Весь список процессов один раз.
top -b -n 1
Мониторинг выбранных процессов
top -p 4360,4358
Мониторинг процессов пользователя
top -u johndoe
top -u 500
Подробнее здесь:
http://www.linuxforums.org/misc/using_top_more_efficiently.html
Приоритеты
О том, что такое приоритет, мы уже кратко говорили в начале этой главы, Но некоторые факты
надо изложить дополнительно. Приоритет для каждого процесса устанавливается в тот момент,
когда процесс порождается. Приоритет процесса определяется так называемым "значением nice",
которое лежит в пределах от +20 (наименьший приоритет, процесс выполняется только тогда,
когда ничто другое не занимает процессор), до -20 (наивысший приоритет).
Значение nice устанавливается для каждого процесса в момент порождения этого процесса и при
обычном запуске команд или программ принимается равным приоритету родительского
процесса. Но существует специальная команда nice, которая позволяет изменять значение nice
при запуске программы. Формат использования этой программы:
nice [- adnice] command [args]
где adnice— значение (от –20 до +19), добавляемое к значению nice процесса-родителя.
Полученная сумма и будет значением nice для запускаемого процесса. Отрицательные значения
может устанавливать только суперпользователь. Если опция— adnice не задана, то по умолчанию
для процесса-потомка устанавливается значение nice, увеличенное на 10 по сравнению со
значением nice родительского процесса. Очевидно, что если вы не суперпользователь, то
применять эту команду имеет смысл только тогда, когда вы хотите запустить некий процесс с
низким значением приоритета.
Другая команда, renice, служит для изменения значения nice для уже выполняющихся процессов.
Ее формат таков:
renice priority [[-p] PID] [[-g] grp] [[-u] user]
Например, команда
[root]# renice -1 987 –u daemon –p 32
увеличивает на 1 приоритет процессов с PID 987 и 32, а также всех процессов пользователя
daemon.
154
Суперпользователь может изменить приоритет любого процесса в системе. Другие пользователи
могут изменять значение приоритета только для тех процессов, для которых данный пользователь
является владельцем. При этом обычный пользователь может только уменьшить значение
приоритета (увеличить значение nice), но не может увеличить приоритет, даже для возврата
значения nice к значению, устанавливаемому по умолчанию. Поэтому процессы с низким
приоритетом не могут породить "высокоприоритетных детей".
Сигналы и команда kill
Сигналы— это средство, с помощью которого процессам можно передать сообщения о некоторых
событиях в системе. Сами процессы тоже могут генерировать сигналы, с помощью которых они
передают определенные сообщения ядру и другим процессам. С помощью сигналов можно
осуществлять такие акции управления процессами, как приостановка процесса, запуск
приостановленного процесса, завершение работы процесса. Всего в Linux существует 63 разных
сигнала, их перечень можно посмотреть по команде
[user]$ kill –l
Сигналы принято обозначать номерами или символическими именами. Все имена начинаются на
SIG, но эту приставку иногда опускают: например, сигнал с номером 1 обозначают или как SIGHUP,
или просто как HUP.
Когда процесс получает сигнал, то возможен один из двух вариантов развития событий. Если для
данного сигнала определена подпрограмма обработки, то вызывается эта подпрограмма. В
противном случае ядро выполняет от имени процесса действие, определенное по умолчанию для
данного сигнала. Вызов подпрограммы обработки называется перехватом сигнала. Когда
завершается выполнение подпрограммы обработки, процесс возобновляется с той точки, где был
получен сигнал.
Можно заставить процесс игнорировать или блокировать некоторые сигналы. Игнорируемый
сигнал просто отбрасывается процессом и не оказывает на него никакого влияния.
Блокированный сигнал ставится в очередь на выдачу, но ядро не требует от процесса никаких
действий до разблокирования сигнала. После разблокирования сигнала программа его обработки
вызывается только один раз, даже если в течение периода блокировки данный сигнал поступал
несколько раз.
Как видите, некоторые сигналы можно сгенерировать с помощью определенных комбинаций
клавиш. Но такие комбинации существуют не для всех сигналов. Зато имеется команда kill,
которая позволяет послать заданному процессу любой сигнал. Как уже было сказано, с помощью
этой команды можно получить список всех возможных сигналов, если указать опцию -l. Если
после этой опции указать номер сигнала, то будет выдано его символическое имя, а если указать
имя, то получим соответствующий номер.
Для посылки сигнала процессу (или группе процессов) можно воспользоваться командой
kill в следующем формате:
[user]$ kill [-сигн] PID [PID..]
где сигн— это номер сигнала, причем если указание сигнала опущено, то посылается сигнал
155
15 (TERM— программное завершение процесса). Чаще всего используется сигнал 9 (KILL), с
помощью которого суперпользователь может завершить любой процесс. Но сигнал этот очень
"грубый", если можно так выразиться, поэтому его использование может привести к нарушению
порядка в системе. Поэтому в большинстве случаев рекомендуется использовать сигналы TERM
или QUIT, которые завершают процесс более "мягко".
Естественно, что наиболее часто команду kill вынужден применять суперпользователь. Он должен
использовать ее для уничтожения процессов-зомби, зависших процессов (они показываются в
листинге команды ps как <exiting>), процессов, которые занимают слишком много процессорного
времени или слишком большой объем памяти и т.д. Особый случай— процессы, запущенные
злоумышленником. Но обсуждение этого особого случая выходит за рамки данной книги.
156
Таблица 0.1 Некоторые из часто встречающихся сигналов
№ Имя
Описание
Можно
перехватывать
Можно
блокировать
1
HUP
Hangup. Отбой
Да
Да
2
INT
Interrupt. В случае
выполнения простых
команд вызывает
прекращение выполнения, в
интерактивных
программах— прекращение
активного процесса
3 QUIT Как правило, сильнее
сигнала Interrupt
9 KILL
Всегда прекращает
выполнение процесса
11 SEGV Segmentation Violation.
Доступ к недозволенной
области памяти
13 PIPE
Была предпринята попытка
передачи данных с
помощью конвейера или
очереди FIFO, однако не
существует процесса,
способного принять эти
данные
15 TERM Software Termination.
Требование закончить
процесс (программное
завершение)
17 CHLD Изменение статуса
порожденного процесса
Да
Да
<Ctrl>+<C>
или <Del>
Да
Да
<Ctrl>+<\>
Нет
Нет
Да
Да
Да
Да
Да
Да
Да
Да
18 CONT Продолжение выполнения
приостановленного
процесса
19 STOP Приостановка выполнения
процесса
Да
Да
Нет
Нет
20 TSTR
Да
Да
Сигнал останова,
генерируемый клавиатурой.
Переводит процесс в
фоновый режим
Комбинация
клавиш
<Ctrl>+<Z>
Перевод процесса в фоновый режим
Если вы запускаете какой-то процесс путем запуска программы из командной строки, то обычно
процесс запускается, как говорят, "на переднем плане". Это значит, что процесс "привязывается" к
157
терминалу, с которого он запущен, воспринимая ввод с этого терминала и осуществляя на него
вывод. Но можно запустить процесс в фоновом режиме, когда он не связан с терминалом. Для
запуска процесса в фоновом режиме в конце командной строки запуска программы добавляют
символ &.
В оболочке bash имеются две встроенные команды, которые служат для перевода процессов на
передний план или возврата их в фоновый режим. Но прежде, чем рассказывать об этих
командах, надо рассказать о команде jobs. Она всегда вызывается без аргументов и показывает
задания, запущенные из текущего экземпляра shell. В начале каждой строки вывода этой команды
указывается порядковый номер задания в виде числа в квадратных скобках. После номера
указывается состояние процесса: stopped (остановлен), running (выполняется) или suspended
(приостановлен). В конце строки указывается команда, которая исполняется данным процессом.
Один из номеров выполняющихся заданий помечен знаком +, а еще один— знаком -. Процесс,
помеченный знаком +, будет по умолчанию считаться аргументом команд fg или bg, если они
вызываются без параметров. Процесс, помеченный знаком -, получит знак +, если только
завершится по какой-либо причине процесс, который был помечен знаком +.
А теперь можно рассказать и о командах fg и bg, которые служат для перевода процессов на
передний план или возврата их в фоновый режим. В качестве аргумента обеим этим командам
передаются номера тех заданий, которые присутствуют в выводе команды jobs.
Если аргументы отсутствуют, то подразумевается задание, помеченное знаком +. Команда fg
переводит указанный в аргументе процесс на передний план, а команда bg— переводит процесс в
фоновый режим. Одной командой bg можно перевести в фоновый режим сразу несколько
процессов, а вот возвращать их на передний план необходимо по одному.
Кроме того, существует сочетание клавиш ctrl+z, переводящии активный процесс в фоновый
режим.
Команды nohup, disown
Предположим, вы запустили из оболочки bash несколько процессов, часть из них в фоновом
режиме. И по каким-то причинам завершили текущую сессию работы в оболочке. При
завершении сессии оболочка посылает всем порожденным ею процессам сигнал "отбой", по
которому некоторые из порожденных ею процессов могут завершиться, что не всегда желательно.
Если вы хотите запустить в фоновом режиме программу, которая должна выполняться и после
вашего выхода из оболочки, то ее нужно запускать с помощью утилиты nohup. Делается это так:
nohup команда &
Запускаемый таким образом процесс будет игнорировать посылаемые ему сигналы. Стандартный
выходной поток и стандартный поток ошибок при таком запуске команд перенаправляются в файл
nohup.out или $HOME/nohup.out.
Команда nohup имеет побочный эффект, заключающийся в том, что значение nice для
запускаемого процесса увеличивается на 5, т.е. процесс выполняется с более низким
приоритетом.
158
В некоторых оболочках (bash 3.0) nohup не работает, вместо этого применяется disown
команда & disown
или
disown beep-media-player &
Подробности смотрите в man bash.
159
Автоматическое выполнение заданий
Для выполнения рутинных действий, таких, как ротация лог-файлов, очистка каталогов от
временных файлов, регулярное резервное копирование и т.п. в UNIX® существуют специальные
средства автоматизации: at (batch) и cron. Команда at предназначена для однократного
выполнения программы или сценария оболочки в заданное время. Формат команды следующий:
at [-q queue] [-f file] [-mldv] TIME
-q queue определяет очередь заданий. По умолчанию для at имя очереди a, для batch имя
очереди b. Может принимать значения a-z, A-Z. Очереди с более старшими буквами исполняются
с пониженным приоритетом.
-f file файл, в котором записаны задания (команды) для исполнения.
-m отправить сообщение пользователю по электронной почте по завершении исполнения задания
-l показать очередь заданий (то же, что и atq)
-d удалить задание (то же, что и atrm)
-v показать время, в которое задание будет выполнено.
Для периодического регулярного выполнения заданий по расписанию используется cron. Демон
crond запускается при инициализации системы из /etc/rc.d/rc или
/etc/rc.d/rc.local.
Он проверяет каталог /var/spool/cron на наличие файлов с именами пользователей,
существующих в системе, каждую минуту. Cron также проверяет файл /etc/crontab и каталог /
etc/cron.d/ . После выполнения задания вывод команд отправляется по электронной почте
пользователю или тому, чей адрес указан в переменной MAILTO. Расписание заданий создается
при помощи утилиты crontab.
crontab [ -u user ] file
crontab [ -u user ] { -l | -r | -e }
-u user позволяет системному администратору оперировать расписанием заданий другого
пользователя. Если опция не задана, то имеется в виду расписание пользователя, запустившего
crontab.
file – взять расписание из файла file. Если указать вместо имени файла -, используется стандартный
ввод.
-l отображает текущее расписание на стандартный вывод
-r удаляет текущее расписание
-e вызывает редактор по умолчанию для редактирования расписания. По завершении
редактирования расписание инсталлируется автоматически.
160
При редактировании по команде crontab -e или создании файла расписания используется
следующий формат:
# Задается командный интерпретатор (необязательно) SHELL=/bin/sh
# Отправлять отчеты по email пользователю (необязательно, по
# умолчанию - себе) MAILTO=peter
# Собственно расписание заданий:
# мин(0-59) час(0-23) дата(1-31) мес(1-12) день_нед(0-7) команда
# Выполнять каждый день в 00:05
5 0 * * *
/path/to/program
# Выполнять по первым числам каждые десять минут четных часов
*/10 */2 1 * *
$HOME/bin/monthly
Поля, определяющие расписание (минута, час, дата, месяц, день_недели) могут быть
представлены в форматах
конкретное значение (например, “5”). “*” - все возможные значения. список значений,
разделенный запятыми (“1,3,6,15”).
промежуток значений (“3-12”), допускается комбинация со списком (“1-4,6,9,11-13”). кратные
значения (“*/2” - каждое второе, “1-7/3” - каждое третье из промежутка) После инсталляции
расписание загружается в память и проверяется каждую минуту.
Структура записи
# minute (0-59),
# |
hour (0-23),
# |
|
day of the month (1-31),
# |
|
|
month of the year (1-12),
# |
|
|
|
day of the week (0-6 with 0=Sunday).
# |
|
|
|
|
commands
*/5 *
*
*
>/dev/null 2>&1
*
fetchmail -aKv -m "user/bin/procmail -d %T"
#frequent
Настройка задач Cron
Основной файл конфигурации cron, /etc/crontab, содержит следующие строки: SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
161
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
Первые четыре строки - это переменные, настраивающие среду окружения, в котором будут
работать задачи cron. Значение переменной SHELL сообщает системе о том, какую оболочку
использовать (в этом примере будет использована оболочка bash), а переменная PATH
определяет пути, используемые для выполнения команд. Результат выполнения задач cron будет
выслан по электронной почте пользователю, определённому в переменной MAILTO. Если в
качестве значения переменной MAILTO задана пустая строка (MAILTO=""), электронные письма
отправляться не будут. Переменная HOME задаёт домашний каталог, используемый при
выполнения команд или сценариев.
Каждая строка в файле /etc/crontab имеет следующий формат:
minute hour day month dayofweek command minute — любое целое число от 0 до 59
hour — любое целое от 0 до 23
day — любое целое от 1 до 31 (день должен быть корректным, если указан месяц)
month — любое целое от 1 до 12 (или короткое название месяца, например: jan, feb и так далее)
dayofweek — любое целое от 0 до 7, где 0 или 7 означает Воскресенье (или короткое название дня
недели, например: sun, mon и так далее)
command — команда, которая должны быть выполнена. Командой может быть как простая
команда, например, ls /proc >> /tmp/proc, или команда запуска написанного вами специального
сценария.
Для любых указанных выше параметров можно использовать звездочку (*), что означает все
допустимые значения. Например, если поставить звёздочку в значении месяца, команда будет
выполняться каждый месяц во время, указанное другими параметрами.
Дефис (-) между целыми числами обозначает диапазон чисел. Например, 1-4 означает целые
числа 1, 2, 3 и 4.
Список значений, разделенных запятыми (,), обозначает перечень. Например, перечисление
3, 4, 6, 8 означает четыре указанных целых числа.
Косая черта (/) используется для определения шага значений. Целочисленное значение может
быть пропущено в диапазоне, если после диапазона указать /<целое>. Например, значение минут
0-59/2, определяет, что будет пропущена каждая вторая минута. В качестве шага значений также
может быть указана звёздочка. Например, значение месяца */3 определяет, что будет пропущен
каждый третий месяц.
Любые строки, начинающиеся с символа решетки (#), являются комментариями, и не
обрабатываются.
Примеры файлов crontab
162
# record the memory usage of the system every monday
# at 3:30AM in the file /tmp/meminfo
30 3 * * mon cat /proc/meminfo >> /tmp/meminfo
# run custom script the first day of every month at 4:10AM
10 4 1 * * /root/scripts/backup.sh
Как видно из файла /etc/crontab, в нём используется сценарий run-parts, чтобы запускающий
сценарии в каталогах /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly и /etc/cron.monthly
соответственно ежечасно, ежедневно, еженедельно и ежемесячно. Файлы в этих каталогах
должны быть сценариями оболочки.
Если задачи cron должны выполняться по расписанию, но не ежечасно, ежедневно, еженедельно
или ежемесячно, их можно добавить в каталог /etc/cron.d. Все файлы в этом каталоге имеют тот
же синтаксис, что и /etc/crontab.
Демон cron каждую минуту ищет изменения в файле etc/crontab и каталогах etc/cron.d/ и /var/
spool/cron. Если какие-либо изменения будут найдены, они загружаются в память. Таким образом,
демон не нуждается в перезапуске при изменении файла crontab.
Другие пользователи (не root) также могут настраивать задачи cron, используя программу crontab.
Все созданные пользователями файлы crontab, хранятся в каталоге /var/spool/cron и выполняются,
от имени создавшего их пользователя. Чтобы создать файл crontab для пользователя, войдите в
систему под его именем и введите команду crontab -e, чтобы отредактировать crontab
пользователя, с помощью редактора, указанного в значении переменной окружения VISUAL или
EDITOR. Этот файл использует тот же формат, что и
/etc/crontab. Когда изменения фала crontab будут сохранены, этот файл crontab будет записан в
соответствии с именем пользователя, под названием /var/spool/cron/username.
Запуск и остановка службы
Чтобы запустить службу cron, выполните следующую команду: /sbin/service crond start. Чтобы
остановить её, выполните команду: /sbin/service crond stop. Рекомендуется, чтобы эта служба
запускалась при загрузке системы.
Системное время
Для установки системного времени и даты можно применять несколько различных
инструментальных средств, в зависимости от используемого дистрибутива. Команда date
командного интерпретатора позволяет задать дату и время в любом дистрибутиве.
В системе Red Hat и других дистрибутивах можно использовать утилиту Linuxconf или Control Panel
Time. Напомним, что дату и время можно правильно установить непо- средственно во время
инсталляции систем. Обычно последующая корректировка этих значений не требуется. Однако,
если вы ввели время неправильно или переехали в местность с другим часовым поясом, с
помощью этих утилит вы сможете изменить системное время. Установить дату и время можно и с
помощью команды date, которая вводится командной строке пользователем root. В качестве
параметра в этой команде указывают (без разделителей) месяц, число, время и год. В следующем
примере устанавливается дата
163
6 марта 2004 года и время 14:59 (03 обозначает март, 06 — число, 1459
— время, 04 — год).
# date 0306145904
Чтобы установить системное время и дату при помощи 'Linuxconf, выберите элемет Time and Date
в категории Control. На экране появится панель с полями ввода дат и времени Утилита Linuxconf
настроена на получение времени и даты не-посредственно от системных часов. В утилите Webmin
выберите панель Hardware, затем щелкните на пиктограмме System Time, чтобы открыть
страницу, на которой в сможете проверить и отредактировать время и дату.
Кроме того, вы можете использовать утилиту TimeTool системы Red Hat, входящую в состав многих
дистрибутивов. Ее пиктограмма находится на панели Control Panel. Для того чтобы открыть окно
Time Configuration, дважды щелкните на пиктограмме TimeTool или выберите соответствующую
команду в меню. Вы можете вносить любые изменения в значения времени и даты. При работе с
утилитой COAS можно выбрать элемент System Clock в меню или окне System Administration. В
результате появится окно System Time с отображенным в нем текущим временем и всплывающим
меню для выбора часового пояса.
164
Сетевые средства Linux
Linux-системы способны работать в любых сетях, но ориентированы на подключение к сетям, в
которых используются протоколы TCP/IP. Именно эти протоколы применяются в Internet и многих
локальных сетях. Эти протоколы были разработаны в семидесятых годах в рамках специального
проекта Управления перспективных исследований и разработок Министерства обороны США с
целью развития системы связи между учебными заведениями и научно-исследовательскими
институтами. Разрабатывались эти протоколы для UNIX®- систем, при этом основные
исследования проводились в Калифорнийском университете (г. Беркли). ОС Linux во многом
выигрывает благодаря этой изначальной ориентации протоколов на UNIX®.
Общие сведения о сетях
Семейство протоколов TCP/IP работает на любых моделях компьютеров, произведенных
различными производителями компьютерной техники и работающих под управлением различных
операционных систем. С помощью протоколов TCP/IP можно объединить практически любые
компьютеры. И что самое удивительное, сегодняшние реализации протокола TCP/IP очень далеки
от того, как он задумывался исходно. В конце 60-х годов начался исследовательский проект,
финансируемый правительством США, по разработке сети пакетной коммутации, а в 90-х годах
результаты этих исследований превратились в наиболее широко используемую форму сетевого
взаимодействия между компьютерами. В настоящее время это действительно открытая система, а
именно, семейство протоколов и большое количество бесплатных реализаций (либо достаточно
дешевых). Они составляют основу того, что в настоящее время называется словом Internet.
Стек TCP/IP
Сетевые протоколы обычно разрабатываются по уровням, причем каждый уровень отвечает за
собственную фазу коммуникаций. Семейства протоколов, такие как TCP/IP, это комбинации
различных протоколов на различных уровнях. TCP/IP состоит из четырех уровней, как показано в
таблице
Прикладной
Транспортный
Сетевой
Канальный
Telnet, FTP, e-mail и т.д.
TCP,UDP
IP, ICMP, IGMP
драйвер устройства и интерфейсная плата
Каждый уровень несет собственную функциональную нагрузку.
1. Канальный уровень (link layer). Еще его называют уровнем сетевого интефейса.
Обычно включает в себя драйвер устройства в операционной системе и
соответствующую сетевую интерфейсную плату в компьютере. Вместе они
обеспечивают аппаратную поддержку физического соединения с сетью (с кабелем
или с другой используемой средой передачи).
2. Сетевой уровень (network layer), иногда называемый уровнем межсетевого
взаимодействия, отвечает за передачу пакетов по сети. Маршрутизация пакетов
осуществляется именно на этом уровне. IP (Internet Protocol - протокол Internet),
ICMP (Internet Control Message Protocol - протокол управления сообщениями
Internet) и IGMP (Internet Group Management Protocol - протокол управления
группами Internet) обеспечивают сетевой уровень в семействе протоколов TCP/IP.
165
3. Транспортный уровень (transport layer) отвечает за передачу потока данных между
двумя компьютерами и обеспечивает работу прикладного уровня, который
находится выше. В семействе протоколов TCP/IP существует два транспортных
протокола: TCP (Transmission Control Protocol) и UDP (User Datagram Protocol). TCP
осуществляет надежную передачу данных между двумя компьютерами. Он
обеспечивает деление данных, передающихся от одного приложения к другому, на
пакеты подходящего для сетевого уровня размера, подтверждение принятых
пакетов, установку тайм-аутов, в течение которых должно прийти подтверждение
на пакет, и так далее. Так как надежность передачи данных гарантируется на
транспортном уровне, на прикладном уровне эти детали игнорируются. UDP
предоставляет более простой сервис для прикладного уровня. Он просто отсылает
пакеты, которые называются датаграммами (datagram) от одного компьютера к
другому. При этом нет никакой гарантии, что датаграмма дойдет до пункта
назначения. За надежность передачи данных, при использовании датаграмм
отвечает прикладной уровень. Для каждого транспортного протокола существуют
различные приложения, которые их используют.
4. Прикладной уровень (application layer) определяет детали каждого конкретного
приложения. Существует несколько распространенных приложений TCP/IP,
которые присутствуют практически в каждой реализации:
 Telnet - удаленный терминал
 FTP, File Transfer Protocol - протокол передачи файлов
 SMTP, Simple Mail Transfer Protocol - простой протокол передачи электронной
почты
 SNMP, Simple Network Management Protocol - простой протокол управления
сетью.
Если у нас есть два компьютера в локальной сети, (например, Ethernet) и на обоих запущен FTP, то
данные протоколы будут работать так, как показано на рисунке.
Мы пометили один квадратик на прикладном уровне как FTP клиент, а другой как FTP сервер.
Большинство сетевых приложений работают именно таким образом, то есть, на одном конце
166
клиент, а на другом сервер. Сервер предоставляет некоторые типы сервиса клиентам. В данном
случае это доступ к файлам на сервере. Telnet предоставляет сервис, позволяющий клиенту зайти
на сервер удаленным терминалом.
Каждый уровень имеет один или несколько протоколов, который позволяет общаться с
удаленным узлом на том же уровне. Один протокол, например, позволяет общаться двум TCP
уровням, а другой протокол обеспечивает коммуникации между двумя IP уровнями.
С правой стороны на рисунке мы видим, что прикладной уровень обеспечивается
пользовательским процессом, тогда как три нижних уровня обычно встроены в ядро
операционной системы. Несмотря на то, что возможны и другие способы реализации, во всех
UNIX системах все построено именно по такому принципу.
Существует еще одно отличие между верхним уровнем и тремя нижними уровнями,
приведенными на рисунке. Прикладной уровень обычно является приложением и
взаимодействует с пользователем, а не занимается передачей данных по сети. Три нижних уровня
ничего не знают о работающих над ними приложениях, однако отвечают за все детали
коммуникаций.
На рисунке мы показали четыре протокола, каждый на своем уровне. FTP это протокол
прикладного уровня, TCP - протокол транспортного уровня, IP - протокол сетевого уровня, а
протоколы Ethernet обеспечивают канальный уровень. Семейство протоколов TCP/IP объединяет
в себе множество протоколов, однако наиболее часто используемые названия для данного
семейства это TCP/IP, TCP и IP (иногда семейство называют Семейство Протоколов Internet).
Цели, решаемые сетевым и прикладным уровнями, различны - первый обеспечивает
взаимодействие с различными средами передачи (Ethernet, Token ring, и т.д.), второй работает с
конкретными пользовательскими приложениями (FTP, Telnet, и т.д.). На первый взгляд, разница
между сетевым и транспортным уровнями достаточно туманна. На основании чего между ними
проводится разграничение? Чтобы понять это, мы рассмотрим не одну отдельно взятую сеть, а
несколько сетей.
Одной из причин феноменального роста сетевых технологий в течение 80-х годов явилось
понимание того, что отдельно стоящий компьютер практически бесполезен. Несколько отдельных
систем были объединены вместе в сеть. Однако, как выяснилось позже, а именно в 90-х годах,
отдельно стоящая сеть также практически бесполезна. Поэтому люди начали объединять сети
вместе. Именно результат такого объединения получил название internet (межсетевое
взаимодействие). internet это несколько объединенных сетей, которые используют одно и то же
семейство протоколов.
Наиболее простой путь осуществить межсетевое взаимодействие - это объединить две или более
сетей с помощью маршрутизатора. Как правило, маршрутизатор представляет из себя аппаратное
устройство. Огромное достоинство маршрутизаторов заключается в том, что они могут
объединить сети, построенные на различных физических принципах: Ethernet, Token ring, point-topoint, FDDI (Fiber Distributed Data Interface), и так далее.
Эти устройства также иногда называются IP маршрутизаторами (IP router), однако мы будем
использовать термин маршрутизатор (router).
167
Исторически эти устройства назывались шлюзами (gateway), и этот термин до сих пор широко
используется в литературе о TCP/IP. Сегодня чаще всего термин шлюз используется для
обозначения шлюза между приложениями: процесс, который объединяет два различных
семейства протоколов (скажем, TCP/IP и IBM SNA) в одном конкретном приложении (чаще всего
это электронная почта или передача файлов).
На Ошибка! Источник ссылки не найден. показано объединение двух сетей: Ethernet и Token ring
с помощью маршрутизатора. Несмотря на то что мы показали связь только между двумя
компьютерами, подсоединенными к маршрутизатору из разных сетей, любой компьютер в
Ethernet может общаться с любым компьютером в Token ring.
На рисунке мы также можем проследить разницу между конечной системой (end system), в
данном случае это два компьютера на каждой стороне, и промежуточной системой (intermediate
system), в данном случае это маршрутизатор в середине. Прикладной и транспортный уровни
используют протоколы, ориентированные на соединение (end-to-end). На рисунке эти два уровня
используются только конечными системами. Сетевой уровень, однако, использует протокол, не
требующий соединения (пересылка-за-пересылкой - hop-by-hop), он используется в данном
случае двумя конечными системами и каждой промежуточной системой.
В семействе протоколов TCP/IP сетевой уровень - IP. Он предоставляет ненадежный сервис. Это
означает, что в процессе своей работы протокол передает пакет от источника к пункту назначения,
однако не предоставляет никаких гарантий того, что пакет дойдет по назначению. TCP, с другой
стороны, предоставляет надежный транспортный уровень, который пользуется ненадежным
сервисом IP. Чтобы обеспечить подобный сервис, TCP выставляет тайм-ауты и осуществляет
повторные передачи, отсылает и принимает подтверждения и так далее. Транспортный уровень и
сетевой уровень несут различную ответственность за передачу данных.
Маршрутизатор, по определению, имеет два или несколько интерфейсов сетевого уровня (если он
объединяет две или более сетей). Любая система с несколькими интерфейсами
называется многоинтерфейсной (multihomed). Компьютер, имеющий несколько интерфейсов, но
не перенаправляющий пакеты с одного интерфейса на другой, не может называться
168
маршрутизатором. Большинство реализаций TCP/IP позволяют компьютерам с несколькими
интерфейсами функционировать в качестве маршрутизаторов. Однако компьютеры должны быть
специально сконфигурированы, чтобы решать задачи маршрутизации. Таким образом, мы можем
называть систему хостом, когда на нем работают такие приложения как FTP или Telnet, или
маршрутизатором, когда он осуществляет передачу пакетов из одной сети в другую. В
зависимости от того какие функции выполняются компьютером, мы будем использовать тот или
иной термин.
Одна из основных задач объединения сетей заключается в том, чтобы скрыть все детали
физического процесса передачи информации между приложениями, находящимися в разных
сетях. Поэтому нет ничего удивительного в том, что в объединенных сетях, как, например,
наОшибка! Источник ссылки не найден., прикладные уровни не заботятся (и не должны
заботиться) о том, что один компьютер находится в сети Ethernet, а другой в сети Token ring с
маршрутизатором между ними. Даже если бы между сетями было 20 маршрутизаторов и
различные типы физического соединения, приложения работали бы точно так же. Подобная
концепция, при которой детали физического объединения сетей скрыты от приложений,
определяет мощность и гибкость такой технологии объединения сетей.
Существует еще один метод объединения сетей - с помощью мостов (bridge). В этом случае сети
объединяются на канальном уровне, тогда как маршрутизаторы объединяют сети на сетевом
уровне.
Стоит отметить, что объединение TCP/IP сетей осуществляется в основном с помощью
маршрутизаторов, а не с помощью мостов. Поэтому мы более подробно рассмотрим
маршрутизаторы.
Уровни TCP/IP
В действительности, семейство протоколов TCP/IP объединяет значительно больше протоколов.
На Рисунок 0.1 показаны некоторые дополнительные протоколы, которые мы рассмотрим в книге.
TCP и UDP - два основных протокола транспортного уровня. Оба используют IP в качестве сетевого
уровня.
TCP предоставляет надежный транспортный уровень, даже несмотря на то что он использует
ненадежный сервис IP.
UDP отправляет и принимает датаграммы (datagram). Датаграмма это блок информации
(определенное количество байт информации, которое указывается отправителем), который
отправляется от отправителя к приемнику. В отличие от TCP, UDP является ненадежным
протоколом. Не существует гарантий, что датаграмма достигнет конечной точки назначения.
169
Рисунок 0.1 Различные протоколы на разных уровнях семейства протоколов TCP/IP
IP это основной протокол сетевого уровня. Он используется как TCP, так и UDP. Каждый блок
информации TCP и UDP, который передается по объединенным сетям, проходит через IP уровень
в каждой конечной системе и в каждом промежуточном маршрутизаторе. На Рисунок 0.1
показаны приложения, которые имеют прямой доступ к IP. Такой доступ используется довольно
редко, но существует возможность его осуществить (некоторые ранние протоколы
маршрутизации были разработаны именно подобным образом). Также в процессе экспериментов
при создании новых транспортных уровней используется возможность доступа к протоколу IP.
ICMP является дополнением к протоколу IP. Он используется IP уровнем для обмена
сообщениями об ошибках и другой жизненно важной информацией уровня IP. Протокол
управления группами Internet (IGMP - Internet Groupe Management Protocol), используется при
групповой адресации: при этом UDP датаграммы рассылаются нескольким получателям.
Протокол определения адреса (ARP - Address Resolution Protocol) и обратный протокол
определения адреса (RARP - Reverse Address Resolution Protocol) это специализированные
протоколы, используемые только с определенным типом сетевых интерфейсов (такие как Ethernet
и Token ring). Они применяются для преобразования формата адресов, используемого IP уровнем
в формат адресов, используемый сетевым интерфейсом.
170
Адресация Internet
Каждый интерфейс в объединенной сети должен иметь уникальный IP адрес. Эти адреса
представляют из себя тридцатидвухбитовые числа. Cуществует определенная структура
адреса Internet. На Ошибка! Источник ссылки не найден. показано 5 классов адресов Internet.
Эти 32-битные адреса обычно записываются как 4 десятичных числа, по одному на каждый байт
адреса. Такая форма записи называется "десятичной записью с точками" (dotted-decimal).
Например, адрес сети класса B может быть записан как 140.252.13.33.
Определить класс адреса, или класс сети, можно по первому числу в адресе. На Ошибка!
Источник ссылки не найден. показаны различные классы, причем первое число выделено.
Класс
A
B
C
D
E
Диапазон
0.0.0.0 - 127.255.255.255
128.0.0.0 - 191.255.255.255
192.0.0.0 - 223.255.255.255
224.0.0.0 - 239.255.255.255
240.0.0.0 - 247.255.255.255
Здесь хотелось бы отметить, что хосты с несколькими интерфейсами имеют несколько IP адресов:
по одному на каждый интерфейс.
Так как каждый интерфейс, подключенный к сети, должен иметь уникальный адрес, встает вопрос
распределения IP адресов в глобальной сети Internet. Этим занимается сетевой информационный
центр (Internet Network Information Center или InterNIC). InterNIC назначает только сетевые
идентификаторы (ID). Назначением идентификаторов хостов в сети занимаются системные
администраторы.
171
Регистрация сервисов Internet (IP адреса и имена доменов DNS) осуществляется в NIC, nic.ddn.mil.
InterNIC была создана 1 апреля 1993 года. В настоящее время NIC регистрирует сервисы только
для сети министерства обороны (DDN - Defence Data Network). Все другие пользователи Internet в
настоящее время используют регистрационный сервис InterNIC в rs.internic.net.
Существует три типа IP адресов: персональный адрес (unicast) - указывает на один
хост, широковещательный адрес (broadcast) - указывает на все хосты в указанной сети,
и групповой адрес (multicast) - указывает на группу хостов, принадлежащей к группе адресации.
Система имен доменов (DNS - Domain Name System)
Несмотря на то что каждый сетевой интерфейс компьютера имеет свой собственный IP адрес,
пользователи привыкли работать с именами хостов. Существует распределенная мировая база
данных TCP/IP, называемая системой имен доменов (DNS - Domain Name System), которая
позволяет установить соответствие между IP адресами и именами хостов.
А теперь мы должны быть уверены, что любое приложение может вызвать функцию из
стандартной библиотеки, для того чтобы определить IP адрес (или адреса, соответствующие
данному имени хоста). Точно так же эта функция предоставляет возможность осуществить и
обратную процедуру, то есть по заданному IP адресу определить соответствующее имя хоста.
Инкапсуляция
Когда приложение посылает данные с использованием TCP, данные опускаются вниз по стеку
протоколов, проходя через каждый уровень, до тех пор пока они не будут отправлены в виде
потока битов по сети. Каждый уровень добавляет свою информацию к данным путем пристыковки
заголовков (а иногда завершителей). На Ошибка! Источник ссылки не найден. показан этот
процесс. Блок данных, который TCP посылает в IP, называется TCP сегментом. Блок данных,
который IP посылает в сетевой интерфейс, называется IP датаграммой. Поток битов, который
передается по Ethernet, называется фреймом (frame).
Числа, стоящие под заголовком и завершителем Ethernet фрейма на Ошибка! Источник ссылки не
найден., показывают стандартный размер заголовков в байтах. В следующих разделах мы
расскажем о заголовках более подробно.
Одной из физических характеристик фрейма Ethernet является та, что размер данных должен быть
в диапазоне между 46 и 1500 байт.
Все стандарты Internet и большинство книг про TCP/IP используют термин октет (octet) вместо
слова байт. Такая терминология сложилась исторически, однако мы будем использовать именно
слово байт (byte).
Чтобы быть максимально точными, рассматривая Ошибка! Источник ссылки не найден., мы
должны сказать, что блок данных, передаваемый между IP и сетевым интерфейсом,
называется пакетом (packet). Этот пакет может быть как IP датаграммой, так и фрагментом IP
датаграммы.
Что касается UDP данных, то картина там практически идентичная. Единственное различие
заключается в том, что блок информации, который UDP передает в IP, называется UDP
датаграммой, а размер UDP заголовка составляет 8 байт.
172
IP должен добавить какой-либо идентификатор к IP заголовку, который он генерирует, чтобы
указать какому уровню принадлежат данные. IP делает это путем сохранения восьмибитного
значения в своем заголовке, которое называется полем протокола. Это значение равно 1 для
ICMP, 2 для IGMP, 6 для TCP и 17 для UDP.
Точно так же различные приложения могут использовать TCP или UDP в одно и то же время.
Протоколы транспортного уровня сохраняют в заголовке идентификатор приложения, которое их
использует. TCP и UDP оба используют шестнадцатибитный номер порта (port number), чтобы
указать на приложения. TCP и UDP сохраняют номер порта источника и номер порта назначения в
своих заголовках.
Сетевой интерфейс посылает и принимает фреймы, принадлежащие IP, ARP и RARP. Должна
существовать форма идентификации в заголовке Ethernet, которая бы указывала, какой сетевой
уровень сгенерировал данные. Для этого существует шестнадцатибитное поле типа фрейма в
заголовке Ethernet.
Демультиплексирование (Demultiplexing)
Когда фрейм Ethernet принимается компьютером приемником, он начинает свой путь вверх по
стеку протоколов, при этом все заголовки удаляются в соответствующих уровнях. Каждый
протокол просматривает определенные идентификаторы в заголовке, чтобы определить, какой
следующий верхний уровень должен получить данные. Этот процесс
называется демультиплексированием (demultiplexing), он проиллюстрирован на рисунке
173
Местоположение квадратиков, помеченных именами протоколов "ICMP" и "IGMP", всегда
различно. На Рисунок 0.1 мы показали их на том же уровне, что и IP, потому что в
действительности они являются дополнением к протоколу IP. Однако здесь мы показали их выше
чем IP, чтобы подчеркнуть то, что сообщения ICMP и IGMP инкапсулируются в IP датаграммы.
Тот же самый подход был использован с квадратиками, помеченными "ARP" и "RARP". Здесь мы
показали их выше чем драйвер устройства Ethernet, потому что оба они имеют свой собственный
тип фреймов Ethernet, как IP датаграммы.
Естественно, что рисунки, иллюстрирующие протоколы и их взаимодействия, всегда
несовершенны.
Когда мы будем рассматривать TCP более подробно, мы увидим, что в действительности
демультиплексирование входящих сегментов использует номер порта назначения, IP адрес
источника и номер порта источника.
Модель Клиент-Сервер
Большинство сетевых приложений написано таким образом, что с одной стороны присутствует
клиент, а с другой - сервер. При этом сервер предоставляет определенные сервисы клиентам.
Можно подразделить серверы на два класса: последовательные (iterative) и конкурентные
(concurrent). Последовательный сервер функционирует следующим образом.
174
В процессе выполнения шага П2 могут возникнуть проблема. Она заключается в том, что в это
время никакие другие клиенты не могут быть обслужены.
Конкурентный сервер, с другой стороны, работает следующим образом.
Запуск нового сервера на шаге К2 для обработки запроса клиента может выглядеть как создание
нового процесса, задачи, в зависимости от того какая операционная система лежит в основе этого
сервера. Новый сервер обрабатывает поступивший запрос клиента целиком. По завершении
сервер уничтожается.
Преимущество конкурентного сервера заключается в том, что он просто запускает другие сервера
для обработки запросов от клиентов. В подобном случае каждый клиент имеет собственный
сервер. Предполагается, что операционная система поддерживает многозадачность и
обслуживание нескольких клиентов одновременно.
175
Мы подразделили именно сервера, а не клиентов, специально, потому что в обычных условиях
клиент не может сказать, с каким сервером, последовательным или конкурирующим, он
общается.
В общем случае, серверы TCP - конкурентные, а серверы UDP - последовательные. Однако из этого
правила могут быть исключения.
Номера портов
Как мы уже сказали, TCP и UDP идентифицируют приложения с использованием 16-битных
номеров порта. Рассмотрим, как выбираются эти номера портов.
Обычно серверы знают свои заранее известные (well-known) номера портов. Например, каждая
реализация TCP/IP, предоставляющая FTP сервер, знает, что сервисный порт TCP номер 21
зарезервирован для FTP сервиса. Каждый Telnet сервер имеет порт номер 23. Каждая реализация
TFTP (Trivial File Transfer Protocol) использует UDP порт 69. Подобные сервисы, предоставляемые в
любой реализации TCP/IP, имеют заранее известные номера портов в диапазоне от 1 до 1023.
Заранее известные порты обслуживаются Internet Assigned Numbers Authority (IANA).
До 1992 года номера заранее известных портов находились в диапазоне от 1 до 255. Порты между
256 и 1023 обычно использовались UNIX системами для специальных сервисов. Эти сервисы
присутствовали в UNIX системах, однако могли не присутствовать в других операционных
системах. В настоящее время IANA обслуживает порты в диапазоне от 1 до 1023.
В качестве примера различия между Internet сервисом и специализированным UNIX сервисом
можно показать различие между Telnet и Rlogin. Оба позволяют осуществить терминальный заход
по сети на удаленный компьютер. Telnet это стандарт TCP/IP с номером заранее известного порта
23. Он поддерживается практически во всех операционных системах. Rlogin, с другой стороны,
исходно был разработан в UNIX системах (однако многие не UNIX системы в настоящее время
также предоставляют этот сервис). Однако заранее известный порт был выбран в начале 80-годов
и установлен в значение 513.
176
Клиент обычно не заботится о том, какой порт используется с его стороны. Все что ему
необходимо, это быть уверенным, что данный номер порта уникален на его компьютере. Номер
порта клиента называется динамически назначаемым портом (ephemeral port), то есть портом с
коротким временем жизни. Это объясняется тем, что клиент обычно существует ровно столько
времени, сколько пользователь нуждается в клиентском сервисе, тогда как сервера
функционируют все время, пока запущен компьютер.
Большинство реализаций TCP/IP располагают номера динамически назначаемых портов в
диапазоне значений между 1024 и 5000. Номера портов свыше 5000 предназначены для других
серверов (не зарезервированных в сети Internet) . Далее по тексту мы встретим множество
примеров того, как располагаются или назначаются динамически назначаемые порты.
В большинстве UNIX систем номера заранее известных портов находятся в файле /etc/services.
Чтобы найти номер порта для сервера Telnet и Domain Name System, можно исполнить
следующую команду:
sun % grep telnet /etc/services
telnet 23/tcp используется порт TCP 23
sun % grep domain /etc/services
domain 53/udp используются порты UDP 53
domain 53/tcp и TCP порт 53
Адреса TCP/IP
IP-адреса, это 32-битовые числа. Каждая машине в данной сети должна иметь уникальный адрес.
В локальной сети, которая не использует TCP/IP для связи с другими сетями, вы можете назначить
эти адреса согласно вашим персональным предпочтениям. Однако, для участков Internet, они
назначаются NIC (Network Information Center). Есть несколько диапазонов IP-адресов,
зарезервированных для частных сетей.
Для более легкого чтения, IP-адреса разбивают на четыре 8-битовых числа, названных octets.
Например, quark.physics.groucho.edu имеет IP-адрес 0x954C0C04, который записывается как
149.76.12.4. Этот формат часто называют dotted quad notation (запись с точками- разделителями).
Другая причина такой записи в том, что IP-адреса разбиваются на адрес сети (network), который
написан в первых octets, и адрес машины (хоста, host), который является остатком. При
обращении к NIC за адресами, вы не получаете адрес для каждого отдельного хоста, который вы
планируете поставить. Вместо этого Вам дают сетевой адрес и позволяют назначать машинам
любые IP-адреса из заданного таким образом диапазона.
В зависимости от размера сети машинная часть адреса может быть меньшей или большей. В
зависимости от различных потребностей имеются несколько классов сетей, определяющих
различное разбиение IP-адресов:
Класс A
Класс A включает сети от 1.0.0.0 до 127.0.0.0. Сетевой адрес содержится в первом octet, что
предусматривает 24-разрядную хост-часть, сеть приблизительно из 1.6 миллиона хостов. Большая.
177
Класс B
Класс B содержит сети от 128.0.0.0 до 191.255.0.0. Сетевой адрес находится в первых двух octets.
Это предполагает 16320 подсетей с 65024 хостами в каждой.
Класс C
Класс C включает диапазон сетей от 192.0.0.0 до 223.255.255.0. Адрес сети содержится
в первых трех octets. Это предполагает почти 2 миллиона подсетей по 254 хоста каждая.
Классы D, E и F
Адреса в диапазоне от 224.0.0.0 до 254.0.0.0 являются экспериментальными или сохранены для
будущего использования и не определяют какую-либо сеть. IP Multicast, сервис, который
позволяет транслировать в internet данные из одной точки на несколько, может быть связан с
этим диапазоном.
Если мы вернемся к примеру в главе 1, увидим, что 149.76.12.4, адрес quark, относится к хосту 12.4
в сети 149.76.0.0 класса B.
Вы можете заметить, что в вышеупомянутом списке для каждого octet в части хоста возможны не
все значения. Это потому, что адреса хоста со всеми octets равными 0 и 255 сохранены для
специальных целей. Адрес, в котором все биты хост-части выставлены в 0, относится ко всей сети,
а адрес, где все биты хост-части выставлены в 1, назван broadcast address (широковещательным
адресом). Он относится ко всем хостам указанной сети. Таким образом, 149.76.255.255 не
существующий адрес хоста, он относится ко всем хостам сети 149.76.0.0.
Имеются еще два зарезервированных адреса: 0.0.0.0 и 127.0.0.0. Первый назван default route (путь
по умолчанию), последний loopback address (кольцевой адрес). default route используется при
маршрутизации IP-пакетов, с которым мы будет иметь дело чуть позже.
Сеть 127.0.0.0 сохранена для работы IP внутри хоста. Обычно адрес 127.0.0.1 будет назначен
специальному интерфейсу на вашем хосте, так называемому интерфейсу loopback interface,
который действует подобно кольцу. Любой IP-пакет, переданный ему от TCP или UDP, будет
возвращен к ним, как будто он только что прибыл из некоторой сети. Это позволяет тестировать
сетевое программное обеспечение без использования реальной сети. Также он полезен, когда вы
хотите использовать сетевое программное обеспечение на автономном компьютере (в терминах
сети, хосте).
Некоторые диапазоны адресов каждого из сетевых классов были отложены и обозначены
“reserved” или “private”. Эти адреса зарезервированы для использования частными сетями и не
направлены на Internet. Они обычно используются организациями, формирующими их
собственный intranet (локальные сети с архитектурой и логикой Internet), но даже маленькие сети
часто находят их полезными.
Диапазоны IP-адресов, зарезервированных для частных сетей
178
Класс
Сети
A
от 10.0.0.0 до 10.255.255.255
B
от 172.16.0.0 до 172.31.0.0
C
от 192.168.0.0 до 192.168.255.0
Преобразование адресов
Теперь, когда Вы видели, как составлены IP-адреса, можно задаться вопросом, как они
используются в сетях Ethernet или Token Ring, чтобы адресовать различные компьютеры. В конце
концов эти протоколы имеют их собственные адреса для идентификации компьютеров, которые
не имеют абсолютно ничто общего с адресом IP, не так ли?
Необходим механизм, чтобы отобразить адреса IP на адреса основной сети. Используемый
механизм Address Resolution Protocol (ARP, протокол преобразования адресов). Фактически, ARP
не ограничен сетями Ethernet или Token Ring, он используется и на других типах сетей, типа
любительского радио протокола AX.25. Идея, лежащая в основе ARP, точно такая, какую
большинство людей использует, когда они должны найти человека X в толпе из 150 людей:
человек, который хочет его видеть, зовет достаточно громко, чтобы каждый в толпе мог его
услышать, а тот, кого зовут, отвечает. Когда он отвечает, мы узнаем, который человек нам нужен.
Когда ARP хочет найти адрес Ethernet, соответствующий данному IP-адресу, он использует
свойство Ethernet под названием broadcasting, в котором пакеты адресуются всем машинам в сети
одновременно. Пакет, который посылает ARP, содержит запрос IP-адреса. Каждый компьютер,
получивший запрос, сравнивает его содержимое с собственным IP-адресом и, если он совпадает с
указанным в запросе, возвращает ответ. Запрашивающий компьютер может теперь извлекать
адрес Ethernet из ответа.
Возникает проблема: как обратиться к Internet-адресу, который может быть в другой сети в
другом полушарии? Ответ на этот вопрос называется routing, а именно нахождение физического
расположения компьютера в сети. Мы обсудим эту проблему в следующем разделе.
Давайте поговорим немного более подробно относительно ARP. Как только компьютер
обнаружил адрес Ethernet, он сохраняет этот адрес в кэше ARP так, чтобы не делать запрос снова,
когда в следующий раз потребуется послать пакет рассматриваемому компьютеру. Однако,
неблагоразумно хранить эту информацию всегда; плата Ethernet удаленного компьютера может
быть заменена из-за технических проблем, так что ARP-запись становится недопустимой.
Следовательно, записи в кэше ARP будут сброшены через некоторое время, чтобы вызвать другой
запрос для поиска IP-адреса.
Иногда необходимо найти адрес IP, связанный с данным адресом Ethernet. Это случается, когда
машина без диска хочет загружаться с сервера по сети, что является частой ситуацией в локальных
сетях. Клиент без диска, однако, не имеет фактически никакой информации относительно себя,
кроме адреса Ethernet! Так что он передает сообщение, содержащее запрос к серверу начальной
загрузки, чтобы обеспечить себя адресом IP. Имеется другой протокол для этой ситуации Reverse
Address Resolution Protocol (RARP, протокол обратного преобразования адреса). Наряду с
179
протоколом BOOTP он служит, чтобы определить процедуру начальной загрузки клиентов без
диска по сети.
Конфигурация сетевых интерфесов
Адрес сети
Адрес сети можно легко установить по адресу хост-компьютера - зто сетевая часть адреса хосткомпьютера плюс нуль; например, в хост-адрессе 199.35.209.72 адрес сети - 199.35.209.0.
Системы определяют адрес сети по адресу хост-компьютера с помощь маски сети. Для знакомых с
программированием скажем, что поразрядная операция И, проведенная с маской сети и адресом
хост-компьютера, приводит к обнулению машинной части адреса и получению его сетевой части.
Широковещательный адрес
Широковещательный адрес позволяет системе посылать сообщение одновременно всем
системам в сети. Как и сетевой адрес, широковещателый адрес можно легко определить по
адресу хост-компьютера; машинная часть в нем установлена равной 255, а сетевая часть не
меняется. Например, широковещательный адрес для адреса хост-компьютера
199.35.209.72 - 199.35.209.255 (т.е. сетевая часть адреса остается прежней, а машинная меняется
на 255).
Адрес шлюза
Довольно часто один из компьютеров сети назначают шлюзом, задача которого - обеспечивать
взаимодействие с другими сетями. Все соединения, устанавливаемые из данной сети с какойлибо иной и наоборот, осуществляются через этот шлюзовой компьютер. Если вы работаете в
такой сети, то необходимо указать адрес шлюза. Если же шлюза в сети нет либо вы работаете в
автономной системе. Как правило, адрес шлюза имеет ту же сетевую часть, что и адрес хосткомпьютера, но в его машинной части стоит 1. Например, если адрес хост-компьютера 199.35.209.72, то адрес шлюза (возможно) - 199.35.209.1. Однако такая договоренность
выполняется не всегда. Чтобы узнать адрес шлюза наверняка, обратитесь к администратору своей
сети.
Адрес сервера имен
Во многих сетях, включая Internet, есть компьютеры, которые работают как серверы доменных
имен, преобразуя доменные имена сетей и хост-ма-шин в IP-адреса. Это позволяет
идентифицировать ваш компьютер в сети, пользуясь не IP-адресом, а доменным именем. К
другим системам тоже можно обращаться по доменным именам, поэтому их IP-адреса знать не
обязательно. При этом, однако, следует знать IP-адреса серверов доменных имен своей сети. Эти
адреса (обычно их несколько) можно узнать у системного администратора. Даже если вы
работаете с провайдером Internet, вам нужно будет знать адреса серверов доменных имен,
которые обслуживает данный провайдер.
Маска сети
Маска сети используется для получения адреса сети, к которой вы подключены. При определении
маски сети адрес хост-компьютера выступает в роли трафарета. Все числа в сетевой части хостадреса устанавливаются равными 255, а в машинной части ставится нуль. Это и есть маска сети.
Так, маска сети для хост-адреса 199.35.209.72 - 55.255.255.0. Сетевая часть, 199.35.209, заменена
на 255.255.255, а машинная часть-72, заменена нулем. С помощью этой маски системы
180
определяют по вашему хост- адресу адрес вашей сети. Они могут установить, какая часть адреса
хост-компьютера является сетевой и из каких чисел она состоит.
Файлы конфигурации TCP/IP
Конфигурирование в Linux-системе сетевого соединения, устанавливаемого по протоколу TCP/IP, и
управление им - не слишком сложная задача. К услугам пользователя имеется набор
конфигурационных файлов, с помощью которых система настраивает и поддерживает сетевые
соединения.
Адрес
Хост-адрес
Описание
IP-адрес локальной системы. Сетевая часть обозначает сеть, в которой
находится локальная система, а машинная часть обозначает
собственно систему
Адрес сети
IP-адрес сети (это сетевая часть IP-адреса хост-системы с нулем в
машинной части)
Широковещательный IP-адрес для отправки сообщений одновременно всем хост-машинам
адрес
сети
(сетевая часть
IP-адреса хост-системы
числом 255
в машинной
части)
Адрес шлюза
IP-адрес
системы-шлюза,
если таковаясимеется
(обычно
представляет
собой сетевую часть IP-адреса хост-системы с единицей в машинной
части)
Адреса серверов
IP-адреса серверов доменных имен, обслуживающих данную сеть
доменных имен
Маска сети
В сетевой части IP-адреса хост-машины - три числа 255, а в машинной
части - нуль (255.255.255.0)
Файлы
/etc/hosts
Связывает хост-имена с IP-адресами
/etc/networks
Связывает доменные имена с адресами сетей
/etc/init.d/networking
Сценарий, конфигурирующий при начальной загрузке сетевой
интерфейс
Список опций определителя (resolver) адресов
/etc/host.conf
/etc/resolv.conf
/etc/protocols
Список имен серверов имен, IP-адресов (поле Name-server) и
имен доменов, по которым можно найти удаленные системы
(поле Search)
Список
протоколов, имеющихся в системе
/etc/services
Список доступных сетевых служб, например ftp и telnet
/etc/hosts
Список доменных имен удаленных хост-машин с их IP-адресами
/etc/hostname
Содержит имя локальной системы
/etc/network/interfaces
Файл конфигурации сетевых интерфесов
Многими из них можно управлять с помощью административных программ. Допускается также
использование более специализированных программ, например таких, как netstat, ifconfig и route.
Некоторые конфигурационные файлы легко поддаются редактированию с помощью текстового
редактора.
181
Программы для настройки соединений
Программа
Описание
netcfg (RedHat) yast (SuSE), Графические утилиты конфигурирования сетевых интерфейсов и
network manager (ubuntu) управления ими.
ifconfig
Программа конфигурирования сетевого интерфейса
_хост_флаг IР_адрес опции
route
действие IР_адрес
ping
хост_имя
netstat
Программа маршрутизации сетевого интерфейса. При вызове
без аргументов выдает таблицу маршрутизации
Проверяет доступность удаленной системы. Останавливается
командой [Ctrl
+c]
Выдает отчеты о состоянии сетевых соединений
hostname
Выдает текущее хост-имя локальной системы
Dip
опции dip _сценарий
Для модемной связи устанавливает SLIP-соединение
pppd chat_cцeнapuй
Для модемной связи устанавливает РРР-соединение
устройство скорость опции
Для настройки и поддержки работы сети, работающей под управлевд протоколов TCP/IP,
используется набор файлов конфигурации, расположиных в каталоге /etc. В этих файлах
содержится информация о сети, в частности имена хост-машин и доменов, IP-адреса и
характеристики интерфейсов. Именно в эти файлы вводятся IP-адреса и доменные имена других
хост-компьютеров Internet, к которым вы хотите получить доступ. Если в процессе инсталляции
системы вы конфигурировали сеть, то вся эта информация в файлах конфигурации уже есть.
Файл
/etc/hosts
Функция
Связывает хост-имена с IP-адресами
/etc/networks
Связывает доменные имена с адресами сетей
/etc/init.d/networking
/etc/hostname
Содержит команды конфигурирования сетевого интерфейса при
начальной загрузке
Содержит хост-имя вашей системы
/etc/host.conf
Опции конфигурирования
/etc/resolv.conf
Содержит список серверов доменных имен
файл /etc/hosts
Без уникального IP-адреса, которым в сети TCP/IP идентифицируруются компьютеры, нужный
компьютер найти нельзя. Поскольку IP-адреса трудны для запоминания и работы, вместо них
используются доменные имена. Каждому IP-адресу ставится в соответствие доменное имя.
Система преобразует доменное имя, по которому пользователь обращается к определенному
182
компьютеру, в соответствующий IP-адрес, и он используется для установления соединения с
указанным компьютером.
Вначале ведение списка хост-имен с их IP-адресами было обязанностью всех компьютеров сети.
Этот список до сих пор хранится в файле /etc/host Получив от пользователя доменное имя,
система ищет в файле hosts cooтветствующий адрес. За ведение этого списка отвечает системный
администратор. Вследствие стремительного роста Internet и появления все новых новых очень
больших сетей функции преобразования доменных имен в IP-адреса были переданы серверам
доменных имен. Тем не менее файл hosts продолжает использоваться для хранения доменных
имен и IP-адрес хост-компьютеров, соединения с которыми устанавливаются наиболее часто.
Перед тем как обращаться к серверу имен, ваша система всегда буде проверять файл hosts и
искать в нем IP-адрес заданного ей доменного имени.
Каждая запись в файле hosts состоит из IP-адреса, пробела и доменного имени. Для хост- имени
можно создавать псевдонимы. В одной строке c записью можно ввести комментарий, который
всегда предваряется символом #. В файле hosts уже имеется запись для локального
компьютера localhost с IP-адресом 127.0.0.1. Localhost - это специальный зарезервированный IPадрес 127.0.0.1, которой позволяет пользователям вашей системы связываться друг с другом в
локальном режиме. Он служит для идентификации так называемого закольцовывающего
интерфейса.
/etc/hosts
127.0.0.1
199.35.209.72
204.32.168.56
202.211.234.1
turtle.trek.com
turtle.trek.com
pangol.train.com
rose.berkeley.edu
localhost
файл /etc/networks
В файле /etc/networks хранятся доменные имена и IP-адреса сетей, с которыми у вашей системы
есть соединение, а не доменные имена конкретных компьютеров. Сети имеют сокращенные IPадреса. В зависимости от типа сети в IP-адресах может использоваться одно, два или три числа.
Сетевой IP-адрес для localhost - 127.0.0.0 . Этот сетевой адрес используется для
закольцовывающего устройства.
IP-адреса записываются в файле /etc/networks вместе с соответствующими им доменными
именами сетей. Вспомните, что IP-адрес состоит из сетевой части и машинной части. Сетевая часть
- это адрес сети, который хранится в файле networks. В этом файле всегда будет присутствовать
отдельная запись для сетевой части IP-адреса вашего компьютера. Это и есть адрес сети, к
которой подключен ваш компьютер.
/etc/networks loopback
127.0.0.0 trek.corn 199.35.209.0
файл /etc/init.d/network
В файле //etc/init.d/network находятся команды, обеспечивающие конфигурирование сетевого
соединения. Многие записи в этом файле автоматически создаются при использовании утилиты
183
netcfg (RedHat) yast (SuSE) и конфигурировании сетевого соединения в процессе инсталляции.
Например, здесь находятся команды ifconfig и route. Кроме того, здесь задаются хост-имя вашей
системы, адрес сети и другие необходимые адреса. Непосредственно редактировать этот файл
можно лишь в том случае, если вы уверены в том, что все делаете правильно и обладаете
начальными познаниями в области программирования в shell. В других дистрибутивах Linux,
например в Slackware, файл инициализации может
иметь имя /etc/ rec.d/rc-inet1 или просто /etc/rc.inet1.
файл /etc/hostname
В файле /etc/HOSTNAME содержится хост-имя вашей системы (Для SuSE - без имени домена).
Чтобы изменить имя, нужно отредактировать данный файл. Хост-имя можно узнать не только
путем вывода на экран этого файла, но и с помощью команды hostname.
$ hostname
turtle.trek.corn
Параметры DNS
Каждый компьютер, подключенный к сети, работающей по протоколу TCP/IP (например, к
Internet), идентифицируется своим IP-адресом. IP-aдрес представляет собой комбинацию четырех
чисел, определяющих конкретную сеть и конкретный хост-компьютер в этой сети. IP-адреса очень
трудно запоминать, поэтому для идентификации хост-компьютера вместо его IР-адрреса можно
пользоваться доменным именем. Доменное имя состоит из двух частей - хост-имени и имени
домена. Хост-имя – это собственно имя компьютера, а домен обозначает сеть, частью которой
этот компьютер является. Домены, используемые в США, обычно имеют расширения,
обозначающие тип сети. Например, для учебных заведений использую расширение .edu, а для
коммерческих организаций - расширение .com. Международные домены обычно имеют
расширения, которые обозначают страну в которой они расположены, например .du для
Германии и .аu для Австралии. Комбинация хост-имени, имени домена и расширения
представляет собой уникальное имя, по которому можно обращаться к компьютеру. Домен, в
свою очередь, иногда разбивается на поддомены.
Как вы знаете, компьютер в сети можно идентифицировать только по его IP-адресу, даже если он
имеет доменное имя. Обратиться к компьютеру в сети по доменному имени можно, но это
предполагает поиск соответствующего IP-адреса в базе данных. Сеть использует для доступа к
компьютеру не доменное имя, а IP-адрес. До появления очень больших сетей с протоколами
TCP/IP, в частности Internet, каждый компьютер сети мог вести файл, перечнем доменных имен и
IP-адресов всех компьютеров, включенных в эту сеть. В случае обращения по доменному имени
компьютер искал его в этом файле и находил соответствующий IP- адрес. Так можно поступать и
сейча в отношении удаленных систем, соединения с которыми устанавливаются чаще всего.
По мере роста сетей ситуация изменилась. Ведение отдельного списка всех доменных имен и IPадресов на каждом компьютере стало непрактичным, а в случае с Internet - просто невозможным.
Чтобы обеспечивать преобразование доменных адресов в IP-адреса, были разработаны и
установлены на особые серверы базы данных, содержащие доменные имена и соответствующие
им IP-адреса. Для того чтобы найти IP-адрес доменного имени, на сервер имен посылается
соответствующий запрос. Сервер имен ищет IP-адрес и посылает его обратно. В крупной сети
184
может быть нескольк серверов имен, обслуживающих различные части сети. Если какой-либо
сервер имен не может найти необходимый IP-адрес, он
посылает запрос на другой сервер. Серверы имен могут предоставлять и такую информацию, как
наименование предприятия, на котором находится искомый компьютер, его адрес и даже
фамилию лица, обслуживающего этот компьютер.
Запросы на серверы имен посылают особые программы, которые называют определителями
(resolver). Определитель - это программа, предназначенная для получения адресов с серверов
имен. Чтобы пользоваться у себя в системе доменными именами, вам придется конфигурировать
собственный определитель. Конфигурация локального определителя задается файлами
/etc/host.conf и /etc/resolv.conf.
файл host.conf
В файле host.conf содержатся опции программы-определителя (см. следующую таблицу). Каждая
опция может иметь несколько полей, отделенных друг от друга пробелами или знаками
табуляции. Для ввода комментария в начале строки нужно ставить знак #. Опции указывают
определителю, каким сервисом пользоваться. Важное значение имеет порядок следования
опций. Определитель начинает обработку с первой из указанных опций и переходит по очереди к
следующим. Файл host.conf находится в каталоге /etc вместе с другими файлами конфигурации.
order Задает последовательность методов преобразования имен


hosts
Проверяется наличие имени в локальном файле /etc/host
bind
Запрашивается адрес у сервера имен DNS
nis
Для получения адреса используется база данных центра сетевой
информации (NIS) alert
Проверяет наличие в локальной системе адресов
удаленных узлов, пытающихся получить к ней доступ; устанавливается и
отменяется ключевыми словами on и off
nospoof
Подтверждает правильность адресов удаленных узлов, пытающихся получить
доступ к локальной системе
trim
Удаляет имя домена из полного имени и проверяет наличие только хост-имени.
Позволяет использовать вместо IP-адреса не полное имя
хост.домен.расширение, а просто хост-имя, указанное в файле hosts.
multi
Позволяет хост-машине иметь несколько IP-адресов в локальном файле hosts.
Включается и выключается ключевыми словами on и off
В следующем примере, где представлен файл host.conf, опция order дает программеопределителю указание искать имена в локальном файле /etc/ hosts, а в случае неудачи
направлять запрос на сервер имен. Не допускается использование нескольких адресов системы.
/etc/host.conf
# host.conf file
# Lookup names in host file and then check DNS
order bind host
# There are no multiple addresses
185
multi off
Файл /etc/resolv.conf
Для того чтобы программа-определитель могла выполнять свою задачу ей должен быть
предоставлен доступ к серверам доменных имен. В фале resolv.conf содержатся адреса серверов
имен, к которым имеет доступ данная система. В этом файле можно создавать три типа записей,
каждая из которых предваряется одним из трех ключевых слов: domain, nameserver, search. В
записи domain вводится доменное имя локальной системы. В записи search приводится список
доменов на тот случай, если задается только хост-имя. Если к какой-либо системе пользователь
обращается часто, он может ввести имя ее домена в запись search, а затем использовать в
качестве адреса только хост-имя. Определитель попытается найти полное доменное имя по
имени домена, указанному в записи search.
После записей search идут записи nameserver, если таковые имеются. Для каждого сервера имен,
к которому имеет доступ данная система, вводиься ключевое слово nameserver и IP- адрес. Таких
серверов может быть несколько, и порядок их следования в списке очень важен. Во многих сетях
имеется основной сервер имен и несколько вспомогательных. Основной сервер должен
запрашиваться первым. Для этого его IP-адрес должен быть введен в первую запись nameserver.
Ниже приведен пример файла resolv.conf. Домен хост- компьютера berkeley.edu. IP-адреса
серверов имен этого домена указаны в записях name server. Запись search позволяет использовать
в качестве адреса только xoct-имя для компьютеров в домене unc.edu. Например, чтобы
обратиться системе sunsite.unc.edu , пользователь должен ввести в качестве адреса толькй хостимя, sunsite.
/etc/resolv.conf
# resolv.conf file
domain berkeley.edu
search unc.edu nameserver 204.199.87.2
nameserver 204.199.77.2
Команда ifconfig
В качестве аргументов команда ifconfig использует имя интерфейса и IP-адрес. Кроме того, она
имеет ряд опций. Команда ifconfig используется для того, чтобы присвоить заданному сетевому
интерфейсу указанный IP-адрес. Таким образом она дает вашей системе знать о том, что данный
интерфейс существует и что она обращается к нему по указанному IP- адресу. Кроме того, можно
указать, каким адресом является IP-адрес - адресом хост- компьютера или адресом сети. Вместо
IP-адреса можно использован доменное имя при условии, что оно указано вместе с IP-адресом в
файле /etc/hosts . Команда ifconfig имеет следующий синтаксис:
# ifconfig интерфейс -хост_сеть_флаг адрес опции
Флаг -хост_сеть_флаг может принимать одно из двух значений - -host или -net. Флаг -host
свидетельствует о том, что данный IP-адрес является адресом хост-компьютера, a -net означает,
что данный IP-адрес являете адресом сети. По умолчанию принимается флаг -host. У команды
ifconfig есть несколько опций, которые задают различные характеристики интерфейса, например
максимальное число байтов, которое он может передать за оди раз (mtu), широковещательный
186
адрес и т.д. Опция up активизирует интер фейс, а опция down деактивизирует его. В следующем
примере коман ifconfig используется для конфигурирования интерфейса Ethernet.
# ifconfig ethO 204.32.168.56
Для такой простой конфигурации, как эта, ifconfig автоматически создаёт стандартный
широковещательный адрес и маску сети. Стандартный широковещателъный адрес - это сетевой
адрес с машинной частью, указанной как 255. Напомним, что стандартная маска сети 255.255.255.0. Если же вы подключены к сети с другой сетевой маской и конкретным
широковещательным адресом, их необходимо указать в командной строке ifconfig .
Широковещательный адрес указывается в опции broadcast, а маска сети - в опции netmask. В
следующее примере ifconfig задает сетевую маску и широковещательный адрес.
# ifconfig eth0 204.32.168.56 broadcast 204.128.244.127 netmask
255.255.255.0
Интерфейсы типа "точка-точка", такие как PLIP (межсетевой протокол для параллельного канала),
SLIP (межсетевой протокол для последовательного канала) и РРР (протокол "точка- точка"),
требуют включения в команде ifconfig опции pointopoint. Имя интерфейса PLIP обозначается
словом plip и номером; например, plip0 - это первый интерфейс PLIP. Интерфейсы SLIP имеют
имена slip0, slip1 и т.д., а интерфейсы РРР - имена ррр0, ррр1 и т.д. Двухточечные интерфейсы - это
интерфейсы, работающие, как правило, между двумя хост- компьютерами, например между
двумя машинами, соединенными через модем.
Устанавливая опцию pointopoint, необходимо указать IP-адрес хост-машины. Позже вы узнаете,
как с помощью интерфейсов SLIP и РРР можно связываться по телефонной линии с провайдером
Internet и устанавливать с ним соединение.
В следующем примере показано, как конфигурируется интерфейс PLIP, который соединяет
компьютер, имеющий IP-адрес 199.35.209.72, с компьютером, адрес которого
204.166.254.14. Если бы в файле /etc/hosts были указаны доменные имена этих систем, то вместо
IP-адресов можно было бы использовать их доменные имена.
# ifconfig plip0 199.35.209.72 pointopoint 204.166.254.14
В случае необходимости можно с помощью команды ifconfig конфигурировать
закольцовывающий интерфейс. Этот интерфейс имеет имя lо и специальный IP-адрес,
127.0.0.1. Процедура конфигурирования закольцовывающего интерфейса показана в следующем
примере.
# ifconfig 1о 127.0.0.1
Команда ifconfig очень полезна для проверки статуса интерфейса. Если ввести ее только с именем
интерфейса, то ifconfig выдаст информацию об этом интерфейсе.
# ifconfig eth0
Чтобы посмотреть, конфигурирован ли закольцовывающий интерфейс, нужно дать команду
ifconfig с именем этого интерфейса, lо:
# ifconfig lо
lo
Link encap:Local Loopback
187
inet addr:127.O.O.1 Beast:127.255.255.255 Mask:255.О.О.О
UP BROADCAST LOOPBACK RUNNING MTU:2000 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0
TX packets:12 errors:0 dropped:0 overruns:0
188
Основы безопасности Linux
Технические аспекты
С точки зрения пользователя, нарушение безопасности может принимать одну из трех форм:
1. Чтение приватных данных.
2. Изменение и фальсификация приватных данных.
3. Помехи в работе.
Под "приватными данными" понимаются как файлы в компьютерах, так и электронная
корреспонденция.
Нарушение безопасности всегда происходит по одной из двух причин. Первая -- несовершенство
программных средств. Вторая -- ошибки человека.
С технической точки зрения, нарушение безопасности может включать:







"Подглядывание" информации, передаваемой по сети (sniffing).
"Подделка" информации, передаваемой по сети (spoofing).
Помехи в работе различных подсистем ОС (т.н. "DOS-атаки" -- сокращение от
"Denial Of Service", дословно "отказ в обслуживании").
Приведение ОС в неработоспособное состояние -- завешивание или
перезагрузка.
Взлом пользователького эккаунта.
Получение прав одного из специальных псевдопользователей ("bin", "daemon",
"mail" и т.д.). Например, права "mail" дают возможность читать почту любого
пользователя.
Получение прав пользователя "root".
Последний случай наиболее опасен, поскольку наличие прав "root" позволяет делать с системой
все, что угодно, включая первые шесть вариантов.
Атаки могут проводиться одним из трех основных способов:



По сети (как из локальной сети организации, так и через Internet).
При помощи т.н. "троянских коней" -- программ, в которые кроме (а то и
вместо) нужной функциональности заложен код, выполняющий
несанкционированные действия.
Пользователями, зарегистрированными на компьютере -- при этом
возможностей намного выше, чем при атаке через сеть.
При взломе в подавляющем числе случаев используется один и тот же прием -- программе,
исполняющейся с высокими привилегиями, "скармливаются" такие данные, на которые она не
рассчитана, и она или просто "падает" (DOS-атака), или исполняет код, "подсунутый" взломщиком.
Причем в качестве такой уязвимой программы может выступать и ядро. Например, в конце 1997го/начале 1998-го года весьма популярны были атаки, основанные на посылке машине- жертве
"неправильного" IP-пакета, так что система просто "падала замертво" (именно на этом принципе
была основана программа WinNuke).
189
Хорошую возможность взлома дает физический доступ к компьютеру. Например, достаточно
загрузить свой экземпляр системы с дискеты и с правами пользователя "root" делать все, что
заблагорассудится. Хотя большинство современных BIOS дают возможность отключить загрузку с
дискеты (а изменение настроек самого BIOS закрыть паролем), остается еще возможность
переставить жесткий диск в другой компьютер. Впрочем, защититься от "отверточного" взлома
очень трудно, и это совсем отдельная тема.
После успешного взлома злоумышленник обычно модифицирует системные файлы (например,
подменяет некоторые программы своими). Обнаружить такую замену зачастую можно, регулярно
выполняя команду "rpm -ya" и анализируя ее результаты.
Меры предосторожности
Основные меры предосторожности, которые следует соблюдать, достаточно просты и диктуются
здравым смыслом (вести себя аккуратно, не вступать в беспорядочные связи):








Выбирать пароли, которые нельзя угадать или подобрать. Лучше всего пароли,
состоящие из 8 символов, среди которых встречаются и маленькие и заглавные
буквы, и иные символы (цифры и знаки препинания). Не следует в качестве
пароля использовать русское слово, набранное на латинском регистре
(например, "остолоп!" #-># "jcnjkjg!").
Никогда не записывать пароли (на бумаге или в файле) и не передавать их по
сети в открытом виде (в частности, не пользоваться telnet и неанонимным ftp).
Никогда не работать как пользователь "root". При необходимости выполнить
некую работу, требующую привилегий супервизора (добавление/удаление ПО
и пользователей, просмотр закрытых log-файлов и т.д.) следует временно
получить их при помощи команды "su", а по завершении этой работы
немедленно выйти "из под" супервизора. При необходимости наличия прав
супервизора в течение продолжительного времени лучше всего открыть
отдельное окно, в котором выполнить "su", а не переключаться все время
между обычным пользователем и "root".
Постараться никогда не "превращаться" в супервизора при входе на компьютер
по сети, а делать это только с локального терминала. Еще лучше -- не
пользоваться "su" из-под X- Window, а только с консоли.
Никогда не устанавливать ПО, полученное из непроверенных источников. В
частности, следует с большим подозрением относиться к программам,
поставляемым без исходных текстов.
При установке ПО, требующего для работы прав "root", следует проверить,
реально ли требуются такие права, и если да, то лучше воздержаться от
использования этого ПО. Сюда относится как необходимость запуска из-под
пользователя "root", так и наличие у исполняемых файлов флажка смены
идентификатора пользователя (setuid) или группы (setgid).
Никогда не устанавливать ПО "просто так", "на всякий случай". Ведь чем
больше установлено программ, тем выше вероятность, что в какой-нибудь из
них найдется "дыра". В основном это относится к сетевому ПО.
Следить за появлением обновленных и исправленных версий ПО, в
особенности -- ядра. В последнее время одна из основных причин появления
новых версий -- исправлениеошибок в security.
190


По возможности ограничить доступ к компьютеру по сети. В частности,
ограничить набор компьютеров, с которых разрешен доступ, и уменьшить до
минимума количество сетевых сервисов. Так, вместо ftp, telnet и rlogin/rsh/rcp
следует пользоваться пакетом ssh.
При обнаружении случаев взлома надо не пытаться разобраться
самостоятельно, а немедленно связаться с компетентным персоналом. В
частности, в ИЯФ следует обращаться в ОВС.
Не следует считать безопасность своего компьютера личным делом -- "пускай ломают, мне не
жалко". Дело в том, что взломав чей-то личный компьютер, на порядок легче взломать другие
машины в той же организации -- взлом "изнутри" всегда проще.
Обычно вместо громоздкого термина "программа с флагом смены идентификатора пользователя"
используется "сетъюидная программа" или "сюидная программа" (калька с английского "suid
program") -- этот термин мы и будем употреблять далее.
Принципы защиты
Поскольку ОС UNIX® с самого своего зарождения задумывалась как многопользовательская
операционная система, в ней всегда была актуальна проблема авторизации доступа различных
пользователей к файлам файловой системы. Под авторизацией доступа мы понимаем действия
системы, которые допускают или не допускают доступ данного пользователя к данному файлу в
зависимости от прав доступа
пользователя и ограничений доступа, установленных для файла. Схема авторизации доступа,
примененная в ОС UNIX®, настолько проста и удобна и одновременно настолько мощна,
что стала фактическим стандартом современных операционных систем (не претендующих на
качества систем с многоуровневой защитой).
Но операционную систему Linux нельзя назвать безопасной. Впрочем, как и любую другую
систему, имеющую выход в сеть. Для создания абсолютно непробиваемой защиты придется
изолировать компьютер от всех устройств доступа (и, возможно, поместить его специальную
комнату, стены которой не пропускают электромагнитное излучение). Кто
может себе это позволить? Кое-что для повышения надежности системы, разумеется, сделать
можно. Но идеальная безопасность все же недостижима, ибо в модели безопасности Linux есть
несколько фундаментальных изъянов, которые невозможно преодолеть.
Как и UNIX®, операционная система Linux ориентирована прежде всего на удобство применения,
что отнюдь не предполагает естественность и простоту ее защиты. Концепция Linux заключается в
обеспечении удобного манипулирования данными в сетевой многопользовательской среде.
Стратегия защиты в Linux, по сути, предполагает всего два варианта статуса пользователя:
пользователь, не обладающий привилегиями, либо суперпользователь. Такие средства Linux, как,
например, выполнение программ с установленным битом смены идентификатора пользователя,
предназначены для обеспечения привилегированного доступа ко всем вычислительным ресурсам
системы. При этом из-за незначительных программных огрехов может быть поставлено под угрозу
нормальное функционирование всей системы.
191
Linux разрабатывается большим сообществом программистов. Все они имеют разную
квалификацию, по-разному относятся к своей работе и обладают неодинаковыми знаниями о
строении операционной системы и ее особенностях. Поэтому даже выпущенные с самыми
благими намерениями, самые современные средства защиты могут приводить к появлению
новых "дыр". С другой стороны, исходный код Linux доступен каждому, и тысячи людей могут
проверить каждую строчку этого кода на предмет наличия ошибок. Считается, что это приводит к
существенному повышению безопасности по сравнению с закрытыми операционными системами,
где доступ к "святая святых" — коду — имеет лишь небольшое число разработчиков.
В механизмах защиты Linux существует множество всем известных изъянов, которые либо никогда
не будут устранены, либо устранены, но не во всех версиях. Помимо этого, многие организации на
одну-две версии отстают: либо по причине сложности локализации либо потому, что они не
заключили с поставщиком договор о сопровождении систе-мы. Даже если производитель заткнул
маленькую дырочку в системе защиты, на устранение "лазейки" потребуется какое-то время.
Раньше считалось, что по мере выявления и устранения брешей безопасность операционной
системы Linux будет непрерывно повышаться.
Суровая реальность оказалась иной. Сложность системного программного обеспечения
стремительно растет деятельность все больше приобретает черты организованной преступности,
компьютеры оказываются все теснее связанными посредством сети Internet. Война переходит в
новые измерения, и, похоже, победителей не будет.
Запомните такую формулу:
Чем безопаснее система, тем труднее пользователям работать в ней.
Идентификаторы пользователя и группы пользователей
С каждым выполняемым процессом в ОС UNIX® связываются реальный идентификатор
пользователя (real user ID), действующий идентификатор пользователя (effective user ID) и
сохраненный идентификатор пользователя (saved user ID). Все эти идентификаторы
устанавливаются с помощью системного вызова setuid, который можно выполнять только в
режиме суперпользователя. Аналогично, с каждым процессом связываются три идентификатора
группы пользователей - real group ID, effective group ID и saved group ID. Эти идентификаторы
устанавливаются привилегированным системным вызовом setgid.
При входе пользователя в систему программа login проверяет, что пользователь зарегистрирован
в системе и знает правильный пароль (если он установлен), образует новый процесс и запускает в
нем требуемый для данного пользователя shell. Но перед этим login устанавливает для вновь
созданного процесса идентификаторы пользователя и группы, используя для этого информацию,
хранящуюся в файлах /etc/passwd и /etc/group. После того, как с процессом связаны
идентификаторы пользователя и группы, для этого процесса начинают действовать ограничения
для доступа к файлам. Процесс может получить доступ к файлу или выполнить его (если файл
содержит выполняемую программу) только в том случае, если хранящиеся при файле
ограничения доступа позволяют это сделать. Связанные с процессом идентификаторы передаются
создаваемым им процессам, распространяя на них те же ограничения. Однако в некоторых
случаях процесс может изменить свои права с помощью системных вызовов setuid и setgid, а
иногда система может изменить права доступа процесса автоматически.
192
Рассмотрим, например, следующую ситуацию. В файл /etc/passwd запрещена запись всем, кроме
суперпользователя (суперпользователь может писать в любой файл). Этот файл, помимо прочего,
содержит пароли пользователей и каждому пользователю разрешается изменять свой пароль.
Имеется специальная программа /bin/passwd, изменяющая пароли. Однако пользователь не
может сделать это даже с помощью этой программы, поскольку запись в файл /etc/passwd
запрещена. В системе UNIX® эта проблема разрешается следующим образом. При выполняемом
файле может быть указано, что при его запуске должны устанавливаться идентификаторы
пользователя и/или группы. Если пользователь запрашивает выполнение такой программы (с
помощью системного вызова exec), то для соответствующего процесса устанавливаются
идентификатор пользователя, соответствующий идентификатору владельца выполняемого файла
и/или идентификатор группы этого владельца. В частности, при запуске программы /bin/passwd
процесс получит идентификатор суперпользователя, и программа сможет произвести запись в
файл /etc/passwd.
И для идентификатора пользователя, и для идентификатора группы реальный ID является
истинным идентификатором, а действующий ID - идентификатором текущего выполнения. Если
текущий идентификатор пользователя соответствует суперпользователю, то этот идентификатор и
идентификатор группы могут быть переустановлены в любое значение системными вызовами
setuid и setgid. Если же текущий идентификатор пользователя отличается от идентификатора
суперпользователя, то выполнение системных вызовов setuid и setgid приводит к замене текущего
идентификатора истинным идентификатором (пользователя или группы соответственно).
PAM
Подключаемые модули аутентификации (Pluggable Authentication Modules, РАМ) были
разработаны компанией Sun в качестве гибкого средства аутентификации пользователей Долгие
годы под аутентификацией в среде UNIX® подразумевалось сопоставление регис- рационных
данных пользователей с их записями в файле /etc/passwd. Возникшая позднее необходимость в
усилении защиты и поддержке большего разнообразия средств аутентификации (например,
интеллектуальных карточек) потребовала более гибкого подхода.
Механизм РАМ включен в Red Hat, SuSE и Debian и не имеет отношения к текущей реализации
стандарта РАМ компании Sun. Концепция проста: программам, выполняющим аутентификацию,
достаточно "знать" лишь о том, что имеется некий модуль, кото-рый проведет аутентификацию за
них. Система конфигурируется таким образом, чтобы модули можно было добавлять, удалять и
перенастраивать в любое время. Вовсе не обязательно, чтобы тот или иной модуль был
скомпонован (или даже существовал) на этапе компиляции утилиты. Благодаря этому модули
РАМ стали удобным средством системного администрирования.
Модули РАМ настраиваются посредством файлов каталога /etc/pam.d. Для каждой службы в этом
каталоге содержится отдельный файл с записями следующего вида:
тип_модуля управляющий_флаг путь_к_модулю аргументы
Поле тип_модуля может иметь значения auth, account, session или password. Модуль типа auth
идентифицирует пользователя и может предоставлять ему право группового доступа. Модуль
типа account выполняет действия, не связанные с аутентификацией, например предоставляет
доступ в зависимости от времени суток. Действия, которые необходимо выполнить до или после
193
того, как пользователь получит доступ к требуемой службе реализуются модулем типа session.
Наконец, модуль типа password используется, когда пользователь должен ввести
аутентификационную информацию (например, пароль).
Поле управляющий_флаг имеет четыре возможных значения: required, requisite sufficient и
optional. Чаще всего используются флаги required и optional. Пер-вый из них указывает на то, что
для успешного продолжения работы модуль должен до-биться положительного результата.
Второй флаг говорит о том, что результат работы мо-дуля несущественен.
В третьем и четвертом полях указываются путь к динамически загружаемому файлу модуля и
аргументы его вызова. Если первым символом третьего поля является косая черта (/), то путь
считается абсолютным. В противном случае содержимое поля добавляется к стандартному имени
каталога: /lib/security.
Например, чтобы позволить команде passwd осуществлять проверку паролей с использованием
модуля РАМ библиотеки crack, добавьте следующие записи в файл
/etc/pam.d/passwd:
password
required
pam_cracklib.so
retry=3
password
required
pam_pwdb.so use_authtok
При наличии таких строк система будет сверять предлагаемые пользователями пароли со
словарем и правилами утилиты crack (необходимо, чтобы присутствовала системная биб- лиотека
libcrack и системный словарь /usr/lib/cracklib_dict). Аргумент retry=3 указывает на то, что
пользователю будут даны три попытки для ввода правильного пароля. Строка с аргу- ментом
use_authtok соединяет друг с другом различные уровни модуля password. Существуют десятки
модулей РАМ. Различные модули и документацию к ним можно по адресу
www.kernel.org/pub/linux/libs/pam
Безопасность файлов
Надежная операционная система нуждается в надежной файловой системе. В случае Linux это
файловыея системы ext2 (EXTended, version 2), ext3,reiserfs, xfs, jfs. Фактически, они аналогичны
файловым системам всех UNIX®-подобных ОС. Поддерживаются права доступа (read, write,
execute, sticky bit, suid, sgid и так далее), принадлежность (user, group, other) и другие стандартные
функции. Поддерживается журналирование и списки контроля доступа (Access Control Lists). Надо
отметить, что Linux имеет превосходный программный RAID, поддерживая уровни 0, 1 и 5 очень
хорошо (RAID не связан с защитой, но связан со стабильностью). Имеется превосходный HOWTO
по файловым системам в Linux на http://www.penguin.cz/~mhi/fs/Filesystems-HOWTO/FilesystemsHOWTO.html.
Основные утилиты для работы с файлами: “ls”, “chown”, “chmod” и “find”. Впрочем, есть еще
много других, в том числе ln (создает связи), stat (выдает сведения о файле). Для создания и
управления файловыми системами есть “fdisk” (старый добрый fdisk), “mkfs” (MaKe FileSystem,
форматирует разделы) и “fsck” (FileSystem ChecK, исправляет ошибки на дисках). Linux может быть
легко поставлена под угрозу, если получен доступ к некоторым файлам, например
зашифрованным паролям, чтобы использовать против них подбор паролей по словарю. Это общая
цель нападающих, приходящих по сети (плохо написанные CGI- скрипты, кажется, любимый
способ). Еще хуже, если пользователь получит доступ на запись к системным файлам. Тут можно
194
ждать чего угодно: от захвата управления до случайного стирания половины системы. Одной из
дыр является "tmp races", когда setuid-программа (работает с правами root) создает временный
файл, обычно в /tmp, и не проверяет существование ссылок. Хакер может создать жесткую ссылку
на данный файл, и когда исходный файл будет стерт, добраться по ссылке до нужного файла,
например, файла паролей . Как предотвратить такие нападения?
Просто: правильно настроить систему. Есть два каталога, в которые пользователи должны иметь
право записи: /tmp и /home, размещение которых на отдельных разделах позволяет избежать
заполнения пользователями критичных файловых систем (переполненная система / приводит к
очень плохим последствиям). Переполненная система /home приведет к тому, что никто из
пользователей в систему зайти не сможет (кроме root: его каталог /root). Разместите на
отдельном разделе /tmp и /home, если пользователям предоставлен shell-доступ к серверу,
размещение на отдельном разделе /etc, /var и /usr тоже хорошая идея.
Первичные инструментальные средства для получения информации относительно файлов и
файловых систем все относительно простые и легки в использовании. “df” (показывает
использование дисков) также покажет использование inode: “df –i” (inodes хранит данные о
файлах, их расположение на диске, и Вы можете исчерпать их прежде, чем Вы исчерпаете
дисковое пространство, если Вы имеете много маленьких файлов. Это кончается сообщением об
ошибке "disk full" когда “df” сообщает, что имеется свободное пространство (“df –i” покажет, что
все inodes используются). Это подобно записям о файлах в Windows с vfat, которая реально хранит
имена в формате 8.3, используя несколько записей для длинных имен с максимумом в 512
записей на каталог. Утилита “du” сообщит Вам размер относительно каталогов, который является
очень полезным для выяснения, какой сколько занимает, и куда же делось все место на диске.
Команда “du ” отобразит текущий каталог и все его подкаталоги, к которым Вы имеет доступ.
Команда “du /dir/name” отобразит то же самое для заданного каталога. Есть опция “-s” для
резюме, которое является полезным для каталогов подобных /usr/src/linux. Чтобы получить
информацию относительно файлов, первый инструмент ls, “ls” показывает только имена
файлов/каталогов, “ls –l ” показывает также размер файлов, их принадлежность, права доступа и
еще ряд технических сведений. Команда 'ls -la' также отобразит сведения о каталогах и файлах,
имена которых начинаются с точки (“.”), что нормально для файлов настройки (.bash_history,
.bash_logout). Утилита “ ls” имеет несколько дюжин параметров для разной сортировки
результатов. Подробности можно получить командой “man ls”. Команда “stat ” сообщает всю
жизненную статистику относительно данного файла (дата создание, последнее обращение, inode
и проччее).
Для управления файлами и каталогами есть утилиты cp, mv, rm (CoPy, MoVe и ReMove), для
настройки прав доступа есть chown (задает владельца и группу файла (группа "прочие" значит
"прочие", как в Novell или группа 'everyone' в NT), chmod (меняет права доступа к файлу).
Основные права: read (чтение), write (заись) и execute (выолнение), дополнительно есть setuid
(наследование идентификатора владельца), setguid (наследование группы владельца, бывает
нужно для запуска некоторых программ, которые хотят, чтобы их запускал определенный
пользователь, обычно root), sticky bit и другие. Используя присоединение пользователей к
группам и команды chmod и chown можно имитировать ACL, но гораздо менее гибко, чем рава
доступа в Sun/AIX/NT (по слухам, в ext3 появятся полноценные списки доступа). Пожалуйста,
195
будьте особенно осторожны с setuid/setguid- программами, так как любые проблемы в такой
программе сильно вырастут по сравнению с обычной!
Очень хороша команда “find”. Она ищет файлы и может фильтровать их на основании прав
доступа, владельца, размера, даты, имени и множества других критериев. Вот примеры поиска
setuid/guid-программ:
чтобы найти все setuid-программы:
find / -perm +4000
чтобы найти все setgid-программы:
find / -perm +2000
Основой защиты файлов являются права доступа. В Linux файл принадлежит ('owned')
пользователю и имеет 3 набора прав доступа для самого пользователя (User), его группы (Group) и
все остальных (Other). Вы можете установить кому принадлежит файл (и к какой группе относится)
командой:
chown user:group object
здесь object является файлом, каталогом или чем-то еще. Чтобы закрыть выполнение файла кемлибо, надо написать:
chmod x="" object
здесь x принимает значения a|g|u|o (All/User/Group/Other), и устанавливает права доступа в ""
(никакого доступа вообще), а object может быть каталогом или файлом. Помните, что root ВСЕГДА
может менять права доступа к файлу, и читать/записывать/выполнять его, Linux не обеспечивает
защиту root. Также, кто бы ни обладает каталогом, в котором находится
объект, он также может менять права доступа к объекту в данном каталоге (даже если сам объект
ему и не принадлежит). Так как root владеет каталогом /, он может менять права доступа к
любому объекту в файловой системе.
Безопасное удаление файлов
Одна из вещей, которые обычно забывают, в том, что если файл удаляется, то реально-то он
никуда не денется, и если его не уничтожить каким-то способом, то восстановить данные из него в
принципе возможно. Есть программы, которые переписывают файл при удалении, что делает
гарантированно невозможным восстановление его содержимого.
wipe (durakb@crit2.univ-montp2.fr)
wipe надежно удаляет данные, перезаписывая файл многократно разными образцами. Вы можете
использовать wipe для файлов или устройств. В первом случае помните, что имя файла и
техническая информация о нем удалена не будет, будет уничтожено только его содержимое,
после чего файл будет бесполезен для какого-либо восстановления. Скачать wipe можно с
http://gsu.linux.org.tr/wipe.
wipe (thomassr@erols.com)
196
Еще один удалитель для файлов, но он не поддерживает чистку устройств. Доступен на
http://users.erols.com/thomassr/zero/download/wipe.
Важные системные файлы
/etc/passwd
Файл паролей, возможно, наиболее критический системный файл в Linux (и большинстве других
UNIX®'ов). Он хранит сисок пользователей, соответствие их логинов, user ID и group ID. Он также
может хранить зашифрованные пароли, но кудабезопасней хранить их отдельно в файле
/etc/shadow (затенение паролей). Этот файл ДОЛЖЕН БЫТЬ открыт на чтение всем, иначе даже
такая простая команда, как ls правильно работать не сможет. Поле GECOS (иногда пишут GCOS)
может хранить реальное имя пользователя и его телефон. В данном файле также хранится
информация о домашнем каталоге пользователя (в него он попадает при входе в систему) и его
оболочке (shell, например, bash или программе menu), упомянутой в файле /etc/shells. Формат
записей такой:
username:encrypted_password:UID:GID:GECOS_field:home_directory:login_s
hell
Пароли зашифрованы одним способом (обычно crypt, новые дистрибутивы поддерживают MD5,
который является знаменательно более сильным). Пароли нельзя восстановить из
зашрифованного вида, но можно попробовать шифровать слова из словаря (или просто
перебором) и сравнивать результат с зашифрованным паролем. Как только совпал, пароль
найден. Само по себе такое не очень плохо, хуже когда пользователи выбирают легко
предполагаемые пароли. Самые современные результаты исследований показали, что 25%
паролей можно найти за час или около того, и что намного хуже, 4% пользователей, выбирают их
собственное имя как пароль. Пустые поля в поле пароля значат отсутствие пароля вообще. Так
появляются записи вида “::”, которые критичны для первых четырех полей в записи пользователя
(имя, пароль, uid и gid).
/etc/shadow
Файл shadow хранит пары "username:password" и дополнительные сведения о логине, например,
время окончания его действия. Он должен быть доступен на чтение и запись только для root.
/etc/groups
Файл groups хранит данные о принадлежности пользователей к группам и опциональные поля,
вроде групповых паролей (сейчас обычно хранятся в файле gshadow), данный файл должен быть
доступен на чтение всем пользователям для корректной работы системы. Его формат:
groupname:encrypted_password:GID:member1,member2,member3...
Группа может не содержать членов (не используется), одного члена или многих членов, а также
опционально иметь пароль доступа (обычно не используется).
/etc/gshadow
Аналогично файлу shadow, данный файл хранит группы и пароли для них. Данный файл должен
быть доступен на чтение и запись только для root.
197
/etc/login.defs
Этот файл (/etc/login.defs) позволяет Вам определять некоторые полезные значения по
умолчанию для различных программ типа useradd или окончания времени действия пароля. Он
имеет тенденцию немного изменяться в разных дистрибутивах, но обычно хорошо
прокомментирован и имеет тенденцию содержать нормальные значения по умолчанию.
/etc/shells
Файл shells хранит список доступных оболочек (shells), если оболочка пользователя в нем не
упомянута, зайти в систему он не сможет. Подробности в разделе man про telnetd.
/etc/securetty
Данный файл хранит список терминалов с которых может зайти root. Консоли обычно обозначены
с /dev/tty1 по /dev/tty6. Последовательные порты (если root может заходить по модему)
обозначены обычно начиная с /dev/ttyS0 и выше. Если допускается вход root по сети (плохая идея,
пользуйтесь лучше sudo), то добавьте /dev/ttyp1 и выше (если зашли 30 пользователей, а потом
попытался зайти root, то он зайдет с /dev/ttyp31). Лучше всего ограничьте доступ root устройством
/dev/tty1 и поставьте программу sudo: так оно безопасней.
Ключевые аспекты безопасности.
Существует множество аспектов компьютерной безопасности идеале все их нужно учитывать. Но
когда времени или терпения не хватает, приходит идти на компромисс. Ниже описаны шесть
наиболее важных аспектов, а также приведе ны общие правила соблюдения "техники
компьютерной безопасности".
Фильтрация пакетов
Если Linux-система подключается к сети, где есть выход в Internet, НЕОБХОДИМО, чтобы между
этой системой и внешним миром стоял брандмауэр либо маршрутизатор, фильтрующий пакеты. В
качестве альтернативы можно включить фильтрацию пакетов в ядре с помощью утилиты iptables.
Какой бы ни была реализация, фильтр должен пропускать через себя трафик только важнейших
служб, выполняющих "полезную" работу в сети.
Ненужные службы
Многочисленные версии Linux существенно отличаются друг от друга тем, какие сетевые службы
включены по умолчанию. Не поленитесь проверить эти установки и отключить службы, которые
совершенно бесполезны. В первую очередь просмотрите содержимое файла /etc/inetd.conf (в Red
Hat — файлов в каталоге /etc/xinetd.d).
Программные "заплаты"
Авторы основных дистрибутивов Linux регулярно (как правило, несколько раз в месяц) выпускают
"заплаты" для устранения новых брешей в защите системы. ВНИМАТЕЛЬНО следите за
появлением "заплат", имеющих отношение к вашей версии Linux (и любых установленным в ней
программам), и максимально оперативно инсталлируйте их. Помните: раз появилась "заплата",
198
значит, есть люди, которые еще раньше знали о сушествовании соответствующей дыры. Спешите,
пока не поздно.
Резервные копии
РЕГУЛЯРНО создавайте резервные копии всех систем, чтобы в случае инцидента можно было
свести ущерб к минимуму. Никакие технологии зеркального дублирования, "горячей" замены
или RAID не отменяют необходимость резервного копирования.
Пароли
Все мы любим простые правила. Вот одно из них: у каждой учетной записи должен быть пароль
который трудно угадать. Но даже самые лучшие пароли нельзя передавать через Internet в
текстовом виде. Поэтому, если в системе допускается удаленная регистрация, следует применять
SSH или какой-нибудь другой механизм аутентификации.
Бдительность
Чтобы быть уверенным в безопасности системы, следите за ее состоянием, сетевыми
соединениями, таблицей процессов. Делать это нужно регулярно (желательно каждый день)
Проблема всегда начинается с малого, а затем нарастает, как снежный ком, так что чем раньше
будет обнаружена аномалия, тем меньшим окажется ущерб.
Общие принципы защиты
Эффективная система безопасности должна базироваться на здравом смысле. Она во многом
напоминает борьбу с мышами в доме. Вот ряд правил, которые при этом следует соблюдать.






Не оставляйте на ночь на кухонном столе то, что может привлечь мышей.
Лучшие лакомства для них — сыр и масло.
Позаботьтесь о том, чтобы в доме не было мест, где мыши могли бы свить
гнездо. Мыши любят устраивать гнезда в кучах тряпья.
Расставьте мышеловки в тех местах, где вы хотя бы раз видели мышь.
Каждый день проверяйте мышеловки, меняйте приманки и выбрасывайте
дохлых грызунов. В заполненные мышеловки грызуны уже не попадают, к тому
же от них идет мерзкий запах.
Избегайте ядовитых приманок. Отравленные мыши могут навсегда остаться в
стенах дома. Кроме того, есть риск, что отравится ваша собака. Лучше
пользоваться традиционными мышеловками.
Заведите кота!
Этими же правилами (в компьютерном варианте) можно с успехом руководствоваться я
организации защиты Linux-систем. Вот как они звучат применительно к Linux.

Не оставляйте без присмотра файлы, которые могут представлять интерес для
хакеров и не в меру любопытных сослуживцев. Коммерческие тайны,
персональные Досье, бухгалтерские ведомости, результаты выборов и т.д. — за
всем этим нужен глаз да глаз. Гораздо надежнее зашифровать данные, чем
просто пытаться предотвратить несанкционированный доступ к ним.
199

В организации должен существовать порядок работы с секретной
информацией.
Некоторые рекомендации по этому поводу даны в документе RFC2196.





Старайтесь, чтобы в системе не было мест, где хакеры могли бы закрепиться.
Хакеры часто вламываются в одну систему, а затем используют ее как базу для
взлома других систем. Каталоги, доступные для записи по протоколу FTP в
анонимном Режиме, групповые учетные записи, учетные записи с плохо
подобранными паролями — вот основные уязвимые места.
Устанавливайте ловушки для обнаружения вторжений или попыток вторжения
Такие утилиты, как tripwire, tcpd и crack, помогут преду-преждать возможные
проблемы.
Следите за отчетами, которые генерируются этими утилитами. Незначительная
проблема, проигнорированная в отчете, к моменту получения следующего
отчета может перерасти в катастрофу.
Учитесь защищать Linux-системы своими силами. Применяйте традиционные
технологии, обучайте пользователей, руководствуйтесь, в конце концов
здравым смыслом. В случае необходимости приглашайте специалистов со
стороны, но при этом тщательно контролируйте их работу.
Постоянно следите за тем, не появились ли отклонения от нормального хода
рабо-ты системы. Обращайте внимание на все необычное, например на
непонятные журнальные сообщения или изменение характера использования
какой-либо учетной записи (резкий рост активности, работа в необычное
время, использова-ние учетной записи во время отпуска ее владельца).
Cлабые места в системе защиты
Рассмотрим наиболее распространенные проблемы, связанные с безопасностью Linux- систем, и
стандартные контрмеры, позволяющие избежать этих проблем. Но прежде чем перейти к
деталям, необходимо взглянуть на ситуацию в целом и определить основные источники
неприятностей.


Человеческий фактор. Пользователи (и администраторы) системы часто
являются ее слабейшим звеном. Например, компания America Online печально
прославилась тем, что ее многократно атаковали хакеры, притворявшиеся
служащими компании. Они посылали письма потенциальным жертвам с
просьбой выслать пароль для "системного теста" или "плановой проверки
учетной записи". Наивные пользователи часто выполняли такую просьбу
(некоторые до сих пор так делают). Есть масса разновидностей подобного
шарлатанства. Одна из задач системного администратора состоит в обучении
пользователей правилам техники безопасности. Многие пользователи, начиная
работать в Internet, часто не подозревают, сколько там всякого жулья. Научите
их выбирать хорошие пароли и правильно хранить их, а главное — никогда не
разговаривать с незнакомцами! Не забудьте в своих наставлениях упомянуть
некомпьютерные средства коммуникации: в умелых руках телефон тоже может
оказаться опасным оружием.
Ошибки в программах. За много лет в программном обеспечении Linux
(включая сторонние программы, как коммерческие, так и бесплатные) было
200

выявлено несметное число ошибок, связанных с безопасностью. Используя
незаметные программистские просчеты или контекстные зависимости, хакерам
удавалось манипулировать системой по своему усмотрению. Что может
сделать в этом случае аднистратор? Немногое, по крайней мере до тех пор,
пока разработчик не выявит ошибку и выпустит "заплату" для ее исправления.
Быть в курсе последних событий — святая обязанность администратора.
Открытые двери. Многие компоненты программного обеспечения можно
сконфигурировать в режиме полной или частичной безопасности. К сожалению,
по умолчанию чаще всего принят второй вариант. Хакеры вламываются в
системы, иезуитски эксплуатируя функциональные возможности, которые с
миссионерской щедрости были предоставлены разработчиками в надежде
сделать работу пользователей удобнее и гуманнее: учетные записи без
паролей, глобальный совместный доступ к жестким дискам и т.д., и т.п. Одна из
наиболее важных задач, связанных с обеспечением безопасности системы, —
убедиться в том, что, заботясь о благополучии пользователей, вы не пригласили
на вечеринку монстра в маскарадном костюме.
Проще всего устранить проблемы последней категории, хотя их может быть очень много и не
всегда очевидно, что именно следует проверять.
Проблемы защиты /etc/passwd и /etc/shadow
Очень часто источником неприятностей является плохое управление паролями. В файлах
/etc/passwd и /etc/shadow содержатся данные о том, кто может входить в систему и что он при
этом имеет право в ней делать. Эти файлы представляют собой передовую линию защиты
системы от захватчиков. Их нужно вести с особой тщательностью, стараясь не допускать ошибок и
не загромождать файлы устаревшими данными.
Проверка и выбор паролей
Регулярно (желательно каждый день) проверяйте, все ли учетные записи имеют пароль. В записях
файла /etc/shadow (или /etc/passwd, если в системе не используются скрытые пароли),
содержащих описания псевдопользователей наподобие daemon (такие пользователи являются
владельцами некоторых системных файлов, но, естественно, никогда не регистрируются в
системе), в поле пароля должна стоять звездочка (*). Она не соответствует ни одному паролю и,
таким образом, предотвращает использование учетной записи. Существует несколько
специализированных программных пакетов, осуществляющих проверку файла /etc/shadow на
предмет наличия проблем, связанных с безопасностью, хотя для поиска пустых паролей вполне
достаточно и такой команды:
perl -F:
-ane 'print if not $F[1];' /etc/shadow
Сценарий, выполняющий эту проверку и направляющий по электронной почте результаты
администратору, можно запускать с помощью демона cron. Дополнительно обезопасьте себя с
помощью сценария, который будет ежедневно сверять файл /etc/passwd с его версией за
предыдущий день (это позволяет делать команда diff) и сообщать о выявленных различи-ях• Это
даст возможность контролировать правомерность внесенных изменений.
Доступ к файлам /etc/passwd и /etc/group следует организовать так, чтобы их могли читать все
пользователи, но право записи имел только пользователь root. Если в системе имеется файл
/etc/shadow, он должен быть недоступен рядовым пользователям.
201
В Linux пользователи могут задавать собственные пароли. Это, конечно, очень удобно, но влечет
за собой массу проблем, связанных с безопасностью. Выделяя пользователям учетные записи,
обязательно давайте им указания о том, как правильно выбрать пароль.
Следует предупредить пользователей о недопустимости выбора их фамилий или инициалов.
имен детей и супругов, а также слов, которые можно найти в словаре. Пароли,
сконфигурированные на основе таких личных данных, как номера телефонов и адреса, не менее
легко поддаются расшифровке.
Рекомендуется выбирать пароль, состоящий не менее чем из восьми знаков, среди которых
должны встречаться цифры, знаки препинания, а также прописные и строчные буквы.
Бессмысленные сочетания знаков, слогов, первые буквы слов легко запоминаемой фразы — вот
самые лучшие пароли. При этом легко запоминаемая фраза не должна быть одной из широко
распространенных. Лучше придумать свою собственную.
В некоторых системах (в зависимости от используемых библиотек аутентификации) значащими
являются лишь первые 8 символов пароля. Остальные просто игнорируют (DES).
Скрытые пароли
Каждая запись файла /etc/passwd состоит из семи полей. Второе поле содержит строку, которая
представляет собой зашифрованный пароль пользователя. Для того чтобы могли работать такие
команды, как ls и ей подобные, файл /etc/passwd должен быть открыт для чтения. Следовательно,
зашифрованная строка пароля доступна всем пользователям системы Злоумышленнику ничего не
стоит представить в зашифрованном виде целый сло-варь или отдельные слова и провести
сравнение с указанным полем во всех записях файла /etc/passwd. При совпадении сравниваемых
элементов злоумышленник получает пароль.
Насколько это опасно? В 80-е гг. существовал по крайней мере один способ очень быстрой
расшифровки паролей, но рядовому хакеру приходилось довольствоваться библиотечной
функцией crypt() Для шифрования слов из словаря с целью их последующего сравнения. В то
время "быстродействующий" компьютер мог выполнять порядка нескольких сотен операций
шифрования в секунду. В 1998 г. Джон Гилмор (John Gilmore) из организации Electronic Frontier
Foundation и шифровальщик Пол Кошер (Paul Kocher) взломали 56-разрядный ключ DES методом
"грубой силы" за 56 часов. Последние исследования показывают, что с помощью
специализированного компьютера стоимостью 1млн. долларов можно взломать любой 56разрядный ключ DES за считанные часы.
Из этих далеко не обнадеживающих подсчетов вытекает настоятельная необходимость в
ограничении доступа пользователей к зашифрованным строкам паролей. Самый
распространенный способ — поместить пароли в отдельный файл, доступный только
суперпользователю, а остальную часть файла /etc/passwd оставить без изменений. Файл,
содержащий информацию о паролях, называется файлом скрытых паролей (/etc/shadow).
"большинстве дистрибутивов Linux этот файл используется по умолчанию.
Групповые и совместно используемые Учетные записи
202
Опасно, если учетная запись используется несколькими людьми. Групповые регистрационые
имена (например, guest или demo) представляют собой удобную лазейку для хакеров, поэтому
применять их не следует.
Нельзя допускать, чтобы пользователи делили учетные записи с членами семьи или зьями. Если
маленькому Джонни нужно войти в систему, чтобы решить домашнее задание, лучше
предоставить ему для этой конкретной цели отдельное имя. В случае злоупотребления проще
удалить регистрационное имя Джонни, чем папину учетную запись особенно если речь идет о
правительственном учреждении.
Во многих организациях учетная запись root является групповой. Это слишком опасно!
Рекомендуем контролировать предоставление прав суперпользователя с помощью утилиты sudo.
Устаревание паролей
В Linux можно реализовать механизм так называемого устаревания паролей, при котором
пользователей заставляют периодически менять пароли. На первый взгляд, это хорошая идея,
однако ее практическая реализация влечет за собой определенные проблемы. Не вся- кому
пользователю по душе периодически менять пароль, поскольку это сопряжено с запоминанием
нового пароля. Обычно для пароля выбирается простое слово, которое легко вводится и
запоминается, а когда приходит время замены, многие пользователи, не желая себя утруждать,
опять берут предыдущий пароль. Таким образом, дискредитируется сама идея.
А вот пароль пользователя root следует модифицировать регулярно. При вводе он должен легко
"скатываться" с пальцев, чтобы его трудно было определить, следя за движением пальцев по
клавиатуре. В нашей организации многие администраторы работают с утилитой sudo, не вводя
пароль суперпользователя напрямую, но к его выбору мы все равно относимся с особой
ответственностью.
Пользовательские интерпретаторы команд
Не используйте сценарии как средство для неконтролируемой (беспарольной) регистрации в
системе. Вход в систему без пароля допустимо разрешать только для прогона небольших
неинтерактивных утилит, таких как date, sync или lpq.
Привилегированные учетные записи
Единственная отличительная черта пользователя root состоит в том, что его идентификатор равен
0. Поскольку в файле /etc/passwd может быть несколько записей с таким идентификатором, то
существует и несколько способов входа в систему в качестве суперпользователя.
Один из способов, который хакеры, получив доступ к интерпретатору команд суперпользователя,
широко применяют для открытия "черного хода", — редактирование файла /etc/passwd
посредством ввода в него новых учетных записей с идентификатор пользователя, равным 0.
Поскольку такие команды, как who и w, работают с регистрационным именем, хранящимся в
файле /var/run/utmp, а не с идентификатором владельца регистрационного интерпретатора, они
не в состоянии разоблачить хакера, который выглядит как рядовой пользователь, хотя на самом
деле зарегистрирован в системе в качестве суперпользователя.
203
Спасением от этого вероломства является мини-сценарий, подобный тому, который используется
для поиска учетных записей, не имеющих пароля:
perl -F: -ane 'print if not $F[2];' /etc/passwd
Этот сценарий отображает любые записи файла passwd, в которых идентификатор ползователя не
указан или равен 0. Сценарий можно адаптировать для поиска записей с подозрительными
идентификаторами групп или идентификаторами пользователей, совподающими с
идентификаторами руководящих сотрудников организации. Пристального внимания заслуживают
также записи файла passwd, в которых нет имени пользователя либо вместо имени стоят знаки
препинания. Эти записи могут показаться бессмысленными, но очень часто они позволяют
свободно входить в систему.
Программы с установленным битом смены идентификатора пользователя
Программы, выполняемые с установленным битом SUID (Set User ID — смена иден тификатора
пользователя), являются источником проблем для безопасности системы, особенно если речь
идет о получении привилегий суперпользователя. Такие программы, поставляемые вместе с Linux,
являются безопасными, по крайней мере теоретически. Тем не менее огрехи в защите
обнаруживались в прошлом и, несомненно, будут обнаруживаться в будущем.
Самый надежный способ уменьшения количества проблем, вызванных сменой идентификатора,
— сведение к минимуму числа программ с установленным битом SUID. Подумайте дважды,
прежде чем инсталлировать такую программу, и вообще избегайте устанавливать этот бит для
своих программ.
Особенно подвержены подобным проблемам сценарии интерпретатора команд. Они
автоматически ставят систему под угрозу. Интерпретаторы допускают множество возможностей
для настройки, поэтому их легко обмануть. Интерпретатор, запускаемый для выполнения
сценария, не всегда читает пользовательские файлы конфигурации, но есть и другие способы
воздействия на него: посредством пользовательских переменных среды, содержимого текущего
каталога, способа вызова сценария и т.д.
Нет правила, требующего, чтобы программы с установленным битом SUID запускались от имени
суперпользователя. Если нужно всего лишь ограничить доступ к файлу или базе данных,
достаточно добавить в файл /etc/passwd псевдопользователя, единственное назначение которого
будет заключаться во владении нужными ресурсами. Следуйте обычным соглашениям о
добавлении псевдопользователей: используйте низкое значение UID, поставьте в поле пароля
звездочку и сделайте начальным каталогом псевдопользова- теля каталог /dev/null.
Выполнение программ с установленными битами SUID и SGID (Set Group ID — смена
идентификатора группы) можно отключать в отдельных файловых системах с помощью опции -о
nosuid команды mount. Хорошими кандидатами на это являются файловые системы, содержащие
начальные каталоги пользователей или смонтированные из ненажных административных
доменов.
Полезно периодически сканировать диски на предмет выявления новых программ с
установленным битом SUID. Хакер, взломавший систему, вполне может создать собственный
командный SUID-интерпретатор, который облегчит ему последующий вход в систему
204
Для обнаружения таких программ вполне подойдет и простая команда find, например:
/usr/bin/find / -user root -perm -4000 -print| \
/bin/mail -s "Setuid root files" netadmin
В данном случае пользователю netadmin по электронной почте посылается список всех файлов
принадлежащих пользователю root и имеющих установленный бит SUID.
Специальные права доступа
Многие файлы в Linux должны иметь специальные права доступа, чтобы не возникали проблемы,
связанные с безопасностью. Некоторые поставщики выпускают дистрибутивы, в которых права
доступа заданы в расчете на собственную "дружественную" среду разработки. Для пользователей
такие установки могут оказать "медвежью услугу" .
Файл устройства /dev/kmem позволяет получить доступ к виртуальному адресному пространству
ядра. Его используют программы (например, ps), которые работают со структурами данных ядра.
Право чтения указанного файла должно предоставляться только его владельцу и членам
соответствующей группы и никому больше. Если необходимо получить доступ к этому файлу из
определенной программы, то для нее должен быть установлен идентификатор группы, которой
принадлежит файл (обычно это kmem), и бит SGID.
Раньше некоторые поставщики беззаботно выпускали дистрибутивы, в которых файл
/dev/kmem был открыт для чтения. Это создавало серьезную угрозу для безопасности сис- темы,
потому что опытный программист, получив доступ к данным и буферам ядра мог
найти там не зашифрованные пароли. Если в вашей системе файл/dev/kmem могут читать все
пользователи, немедленно исправьте этот промах. Правда, после таких изменений может
оказаться, что некоторые программы перестанут работать. В этом случае следует поступить так,
как говорилось в предыдущем абзаце.
Файлы /etc/passwd и /etc/group должны быть доступны для записи только владельцу
(пользователю root) и его группе. Режим доступа в данном случае — 644. Для файла /etc/shadow
режим доступа равен 640, т.е. он вообще недоступен рядовым пользователям. Все эти файлы
должны принадлежать какой-нибудь системной группе (обычно это root), Чтобы пользователи, не
имея права записи в файлы /etc/passwd и /etc/shadow, могли изменять свои пароли, команда
passwd (владельцем которой является пользователь root) выполняется с установленным битом
SUID.
Каталоги анонимного FTP-сервера не должны быть открыты для записи. Такие каталоги —
излюбленная мишень для хакеров, которые через них копируют программное обеспечение и
другие важные файлы. Если вы управляете FTP-архивом, допускающим добавление в него файлов,
не забывайте регулярно просматривать каталог добавлений.
При настройке анонимного FTP-сервера в каталог ~ftp/etc/passwd обычно копируется усеченный
файл паролей, чтобы правильно работала команда ls. He забудьте удалить из файла
зашифрованные строки паролей.
205
Еще один потенциальный источник проблем — файлы устройств для разделов жесткого диска.
Наличие права чтения или записи такого файла равнозначно наличию аналогичных прав для
любого элемента файловой системы этого раздела. Право чтения/записи должен иметь только
суперпользователь. Члены группы иногда могут получать право чтения с целью выполнения
резервного копирования. Прав доступа для категории "прочие быть не должно.
Сюидные программы
Сюидная программа -- это программа, которая исполняется с правами (uid) не запустившего ее
пользователя, а того, кому принадлежит файл программы. Реже используется смена
идентификатора группы ("эсгидная программа" -- "sgid program").
Внешне сюидная программа отличается тем, что в правах доступа, показываемых командой
"ls -l", вместо символа "x" в правах владельца стоит "s":
bobby:~% ls -l /usr/X11R6/bin/nxterm
-rws--x--x 1 root
root 127668 Aug 4
1998
/usr/X11R6/bin/nxterm
bobby:~% _
Сюидные программы используются в тех случаях, когда для выполнения некоей операции
требуются права "root". В основном это требуется для авторизации и для доступа к неким
файлам/ресурсам, недоступным обычному пользователю.
Примерами сюидных программ являются rlogin (права нужны для создания сокета с номером
порта < 1024), passwd (для записи в файл /etc/passwd или для чтения/записи /etc/shadow),
xterm/nxterm (для получения устройства виртуального терминала), x11amp (для получения
realtime-приоритета).
Вообще говоря, в настоящее время сюидность считается одной из самых неудачных (или, по
крайней мере, самых неудачно реализованных) концепций в UNIX®. Программ, которым реально
требуется сюидность, не так уж много.
Замечание
Возникает вопрос: если сюидность -- неудачная концепция, то как же надо было делать? Ответ -т.н. "capabilities", или отдельные права на выполнение отдельных операций (вместо
"всемогущего" root). Концепция "capabilities" введена стандартом POSIX.1e и поддерживается в
ядрах Linux начиная с 2.2. Документация на эту тему есть по адресу
http://www.kernel.org/pub/linux/libs/security/linux-privs/ зеркало в России -http://www.ru.kernel.org/pub/linux/libs/security/linux-privs/
Одно из применений сюидности при взломе -- непосредственно после взлома создать rootсюидную программу, позволяющую интерактивно вводить команды (на эту роль хорошо подходит
любой shell), или же запускающую shell с правами "root".
Поэтому надо уметь находить имеющиеся на компьютере сюидные программы -- во-первых,
чтобы знать программы, в которых потенциально могут обнаружиться дыры, а во-вторых, чтобы
обнаруживать уже произведенный взлом.
206
Как управлять атрибутом setuid
Поскольку атрибут setuid входит в права доступа файла, то для манипуляций с ним используется
команда chmod. Для установки этого атрибута служит команда
chmod u+s файл
(избегайте этого!), а для удаления -chmod u-s файл
Атрибут setgid отличается тем, что символ "s" отображается вместо "x" в правах доступа группы, а
не владельца:
bobby:~% ls -l /usr/bin/man
-rwxr-sr-x 1 root
man 31756 Sep 5
1998 /usr/bin/man bobby:~%
_
Для его установки/удаления команде chmod указывается "g+s" и "g-s" соответственно.
Поиск сюидных программ
Для поиска имеющихся на диске сюидных программ используется команда find. Команда
find / -type f -perm -u+s
найдет все файлы с установленным флагом setuid. Чтобы включить в список также файлы с
атрибутом setgid, следует воспользоваться командой
find / -type f '(' -perm -u+s -o -perm -g+s ')'
Чтобы сразу выдать листинг найденных файлов, подойдет команда
find / -type f '(' -perm -u+s -o -perm -g+s ')' -exec ls -ld '{}' ';'
Поиск сюидных программ следует выполнять, естественно, как пользователь "root".
Дистанционная регистрация сообщений
Система Syslog позволяет записывать журнальную информацию о процессах ядра и
пользовательских процессах в файл, рассылать эту информацию группе пользователей или
передавать на другой компьютер сети. Рассмотрите вопрос о выделении защищенного
компьютера, который будет служить центральной регистрационной станцией и выдавать
сообщения о нарушении защиты (регистрируются от имени средства auth) на старый матричный
принтер. Скормите ему рулон бумаги. Это не позвоолит хакерам заметать следы путем
перезаписи и удаления журнальных файлов.
Защищенные терминалы
Linux можно настроить так, чтобы пользователю root разрешалось регистрироваться в системе
только с определенных, "защищенных" терминалов. Рекомендуется запрещать
привилегированный вход в систему по таким каналам, как модемы и сетевые псевдотерминалы.
207
Защищенные каналы обычно задаются в виде списка TTY-устройств в файле/etc/securetty. Можно
также назначить непривилегированным пользователям разрешенные для них терминалы (файл
/etc/security/access.conf) и разрешенное время работы в системе (файл
/etc/security/time.conf).
Вирусы
Когда заходит речь о компьютерной безопасности, то первым делом вспоминаются вирусы.
Принято говорить, что у Linux есть большое преимущество перед Dos/Windows: в Linux вирусов
практически не существует.
Это не совсем так, вирусы как бы есть, но их почти никто не видел.
Основная причина этого заключается в ограничении прав доступа: в UNIX® у программ просто нет
возможности писать что угодно, куда угодно и когда угодно, что является необходимым условием
для существования и распространения вирусов. Даже если какой- нибудь пользователь случайно и
подхватит некую "зловредную" программу, то обычно максимум, что она сможет сделать -- это
испортить файлы самого пользователя, на операционную систему же это никак не повлияет.
Кроме того, хотя во многих UNIX® и существуют некоторые "дыры" в защите, разнообразие систем
делает создание программ, использующих эти дыры, крайне трудоемкой задачей. Даже разные
версии/дистрибутивы Linux на одной и той же платформе Intel x86 могут отличаться столь сильно,
что "нехорошая" программа попросту зайдет в тупик и не сможет ничего сделать.
В принципе, в UNIX® могут существовать "черви" -- программы, самостоятельно
распространяющиеся по сети и заражающие компьютеры. Однако их разработка является не
менее трудоемкой задачей, и количество известных червей крайне мало.
Даже знаменитый "Червь Морриса", который в ноябре 1988 года поразил большое количество
систем в США, заражал лишь компьютеры двух типов. В настоящее же время многообразие
систем несравненно выше, а таких огромных дыр в защите, какие существовали в конце 80-х,
практически не осталось. (Подробно почитать про Червь Морриса можно по адресу
http://www.msnbc.com/news/209745.asp.)
Таким образом, большинство атак на UNIX®-системы производится не автоматическими
средствами, а требует участия человека.
Троянские кони
Троянские кони — это программы, назначение которых полностью противоречит тому, чего от них
ожидают. В качестве примера можно привести программу turkey, которая когда-то
распространялась в Usenet. Она обещала нарисовать на экране терминала индейку, а на самом
деле удаляла файлы из начальных каталогов доверчивых пользователей.
Учитывая количество нападений, которые сообщество Linux пережило за последние годы,
остается удивляться малому числу инцидентов с троянскими конями. По сути, нам неизвестен ни
один задокументированный случай обнаружения программы, которая:
208




претендовала бы на полезное применение;
не распространялась как часть операционной системы;
предоставлялась в виде исходных текстов;
была широко распространена и при этом специально содержала
злонамеренный код или умышленно обходила меха-низмы защиты
операционной системы.
Таким положением вещей мы обязаны законопослушному сообществу пользователей Internet.
Наиболее очевидные проблемы, связанные с безопасностью, быстро выявляются и широко
обсуждаются. Злонамеренные программы не задерживаются на популярных серверах сети
Internet. Можете быть уверены: любая программа, у авторов которой были нечистые намерения,
будет выявлена и проанализирована в Internet. Если перед инсталляцией какой-нибудь
программы нужно узнать ее "репутацию", просто введите имя программы в любимой поисковой
системе.
Общие рекомендации по защите.
Во-первых, следует понимать, что абсолютной защиты не существует. Задача человека,
занимающегося обеспечением безопасности системы - сделать так, что бы затраты на ее взлом
превосходили ценность взлома. Во-вторых, с ростом защищенности системы падает удобство
работы с ней. В-третьих, само обеспечение безопасности требует ресурсов - человеческих,
денежных и вычислительных.
Физическая безопасность системы
Никакие брэндмауэры, антивирусы, настройка прав на файловой системе не помогут, если
взломщик может вынуть жесткий диск из сервера и унести домой. Даже если вы будете
шифровать данные на жестком диске, зачем облегчать ему задачу? А если он просто развинтит
винчестер? Держите ваши серверы под замком!





поставить все security fixes от вендоров вашего дистрибутива
отключить все ненужные сервисы
проверьте как сервисы, запускаемые из (x)inetd так и standalone, запускаемые
из
стартовых скриптов.
настроить syslogd для копирования важных сообщений на другую машину
Хранение копии файлов журналов на отдельной системе (доступ к которой, конечно, должен быть
максимально ограничен) позволит иметь журнал, который не был изменен вломщиком,
заметавшим следы, если взлом все-таки произошел. С другой стороны, syslogd обычно использует
UDP для доставки сообщений, что не позволяет гарантировать, полноту журнала на
протоколирующей системе. Кроме того, это открывает широкие возможности для спуфинга
сообщений и DoS с целью переполнения файловой системы, где хранятся файлы журналов.
Таким образом, может оказаться необходимым рассмотреть модифицированные версии syslogd
(например, syslog-ng), позволяющие использовать протокол tcp для доставки сообщений и
позволяющие выполнять их электронную подпись. Это особенно важно, если сообщения
доставляются через глобальные сети.
209
отказаться от использования протоколов с слабой авторизацией в первую очередь это относится к
так называемым r-командам: rlogin, rsh, rcp - соответствующие сервисы следует отключить или
заменить на аналоги с более стойкой аутентификацией (Kerberized или ssh). Если r-команды вам
таки необходимы (например, для работы с cisco, которая ssh не понимает), используйте TCP
Wrappers (man tcpd). Кроме того, не стоит применять без необходимости telnet, POP3, отключите
так же plain-text аутентификацию в IMAP, либо туннелируйте эти протоколы в SSL.
производить проверку изменений файлов
Для дистрибутивов, основанных на RPM, частично помогает rpm -Va, однако лучше использовать
специализированные программные пакеты, такие как Tripwire (http://www.tripwire.org/) или или
Aide (http://www.cs.tut.fi/~rammer/aide.html). Применение такого ПО позволит своевременно
обнаружить изменения в конфигурационных файлах или установку "троянских коней".
Использовать антивирусные программы и программы сканирования системы на предмет наличия
rootkit (http://www.rootkit.nl, http://www.chkrootkit.org) .
произвести тотальный chroot для всех возможных сервисов
в первую очередь, это касается Apache (описание тут) и BIND (описание тут), если вы пользуетесь
ими. Однако, я рекомендую вам помещать в chroot все ваши сервисы предоставляемые
пользователям через Internet.
Модифицировать систему безопасности
документация и патчи OpenWall под стандартное ядро ищите на http://www.openwall.com/linux/,
обратите внимание, что производитель вашего дистрибутива, возможно, уже включил этот патч в
свое ядро. Так же очень интересными возможностями обладает GrSecurity, SELinux, AppArmor.
Из перечисленных шагов каждый следующий требует несколько больше усилий чем предыдущий,
поэтому начинайте с начала, но доходить до конца необязательно - рассчитывайте ваши силы и
соблюдайте балланс между ресурсами, потраченными на защиту информации и ценностью этой
информации.
Постоянное наблюдение
Вам следует постоянно наблюдать за работой системы, анонсами по безопасности ваших систем,
подписаться на все возможные конференции и рассылки связанные с безопасностью Ваших
систем. Считается недопустимым для системного администратора тратить менее 2-х часов в день
на вопросы связанные с безопасностью.
Взломали! Что делать?
Во-первых, Don't panic! :) Не вы первый, не вы последний. Во-вторых, постарайтесь определить
для себя, какие действия вы должны предпринять. В-третьих, записывайте все, что вы сделали это поможет на досуге сесть, разобраться и сделать выводы.
Теперь подробней.
Идентифицируйте проблему
210
Насколько опасен взлом? Критична ли информация, которая могла подверчься утечке? Сколько
систем взломано? Может ли быть так, что о некоторых взломах вы не подозреваете? Стоит ли
немедленно выдернуть кабель из сетевого интерфейса или можно позволить себе понаблюдать
за действиями взломщика? Кого нужно оповестить о взломе? Стоит ли привлекать
правоохранительные органы?
Традиционно, для сохранения контроля над взломанной системой, взломщики устанавливают т.н.
rootkit - набор программ (и иногда - модулей ядра), которые скрывают факт взлома от системного
администратора, обеспечивают доступ к системе, или позволяют расширить привелегии
атакующего. Если у вас возникло подозрение, что в системе установлен rootkit, попробуйте
проверить ОС с помощью chkrootkit. Так же проверьте целостность файлов с помощью
Tripwire/Aide (см. так же п. 1.1).
Приступайте к решению проблемы
Не забудьте записывать все происходящее. Если вы решили понаблюдать за взломщиком,
отдавайте себе отчет, что он может это обнаружить и постараться уничтожить все следы.
Убедитесь, что он не использует ваши сервера как трамплин для новых атак. Будет очень
неприятно оказаться вовлеченным в DDoS или обнаружить у себя склад эксплоитов или вареза
(хотя, кому как, конечно :) ). Повторю прописную истину, что если вы следите за взломщиком
командой, не надо пользоваться e-mail для координации своих действий. Если у вас нет желания и
сил проводить расследование, переустановите OS с дистрибутива, восстановите данные из
резервных копий (у вас ведь есть резервные копии? :) ) и перечитайте данный FAQ для повышения
ее защищенности.
211
Download