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

ЗНАКОМСТВО С GNU/LINUX

1
Содержание
1 Что такое GNU/Linux?..............................................................................................................................6
2 Дистрибутив Linux....................................................................................................................................7
2.1 Компоненты дистрибутива Linux....................................................................................................7
3 Введение в ядро Linux.............................................................................................................................8
3.1.1 Свойства ядра Linux..................................................................................................................9
3.1.2 Основные подсистемы ядра Linux..........................................................................................9
Интерфейс системных вызовов...................................................................................................9
Управление процессами............................................................................................................10
Управление памятью..................................................................................................................10
Виртуальная файловая система................................................................................................10
Сетевой стек................................................................................................................................11
Драйверы устройств...................................................................................................................11
Архитектурно-зависимый код...................................................................................................11
4 Файлы и файловая система...................................................................................................................12
4.1 Типы файлов...................................................................................................................................12
4.2 Структура файловой системы ......................................................................................................18
5 Менеджеры пакетов..............................................................................................................................21
5.1 Компиляция программ и её недостатки......................................................................................21
5.2 Преимущества менеджеров пакетов...........................................................................................21
5.3 Разнообразие форматов пакетов.................................................................................................22
6 Работа с RPM-пакетами.........................................................................................................................22
6.1 Основные положения....................................................................................................................22
6.2 Учет RPM-пакетов...........................................................................................................................23
6.3 Формирование имен.....................................................................................................................23
6.4 Установка и удаление RPM-пакетов.............................................................................................23
7 Менеджер управления пакетами Yum.................................................................................................24
7.1 Преимущества Yum........................................................................................................................24
7.2 Главная конфигурация...................................................................................................................24
7.3 Настройка репозиториев...............................................................................................................25
7.4 Основные команды........................................................................................................................26
8 Установка и удаление DEB-пакетов......................................................................................................26
8.1 Основные положения....................................................................................................................26
8.2 Формирование имен.....................................................................................................................27
8.3 Установка и удаление пакетов......................................................................................................27
9 Менеджер пакетов АРТ.........................................................................................................................27
9.1 Преимущества APT.........................................................................................................................27
9.2 Основная конфигурация................................................................................................................28
9.3 Работа с пакетами..........................................................................................................................28
10 Работа с терминалами Linux...............................................................................................................29
10.1 Что такое текстовые терминалы.................................................................................................29

2
10.2 Запуск и закрытие терминалов...................................................................................................30
11 Краткое рассмотрение интерпретатора Bash....................................................................................30
11.1 Понятие командной оболочки....................................................................................................30
11.2 Основные возможности Bash......................................................................................................30
11.3 Командные оболочки и пользователи.......................................................................................31
12 Параметры и опции команд...............................................................................................................31
12.1 Выполнение команд с параметрами.........................................................................................31
12.2 Использование опций консольных команд...............................................................................31
13 Помощь по командам Linux................................................................................................................32
13.1 Причины использования справки..............................................................................................32
13.2 Использование опции Help.........................................................................................................33
13.3 Использование справочных страниц Man.................................................................................33
13.4 Тематические разделы man-страниц.........................................................................................33
14 Горячие клавиши терминала в Linux..................................................................................................34
14.1 Основные горячие клавиши........................................................................................................34
14.2 История команд, поиск и автодополнение...............................................................................35
15 Просмотр файлов в терминале Linux.................................................................................................36
15.1 Основные инструменты...............................................................................................................36
15.2 Просмотр содержимого файлов.................................................................................................36
Команда cat в Linux....................................................................................................................36
Команда tail в Linux....................................................................................................................39
Команда Head в Linux.................................................................................................................40
Комбинируем команды head и tail...........................................................................................41
Пейджеры more и less................................................................................................................41
15.3 Текстовый редактор Nano............................................................................................................43
15.4 Команда locate в Linux.................................................................................................................45
16 Потоки ввода-вывода в Linux..............................................................................................................47
16.1 Для чего нужны потоки ввода-вывода.......................................................................................47
16.2 Перенаправление потоков ввода-вывода.................................................................................48
17 Программные каналы в Linux.............................................................................................................49
17.1 Для чего нужны программные каналы......................................................................................49
17.2 Применение программных каналов..........................................................................................49
18 Работа с файлами и каталогами.........................................................................................................50
18.1 Именование файлов и каталогов...............................................................................................50
18.2 Вывод информации о файлах и каталогах.................................................................................51
19 Создание, копирование и удаление файлов в Linux........................................................................57
19.1 Создание пустого файла..............................................................................................................57
19.2 Создание папок в Linux................................................................................................................57
19.3 Копирование файла.....................................................................................................................57
19.4 Перемещение и переименование файла .................................................................................58
19.5 Удаление файла............................................................................................................................59

3
20 Поиск файлов в Linux...........................................................................................................................59
20.1 Поиск исполняемой программы................................................................................................59
20.2 Поиск файлов через базу данных...............................................................................................60
20.3 Поиск по текстовому содержимому...........................................................................................60
20.4 Подсчет слов в файле...................................................................................................................62
21 Права доступа файлов и папок в Linux...............................................................................................63
21.1 Система прав доступа файлов....................................................................................................63
21.2 Отличия прав доступа для папок................................................................................................63
21.3 Восьмеричное представление прав...........................................................................................64
21.4 Изменение прав доступа.............................................................................................................64
21.5 Изменение группы и владельца.................................................................................................65
22 Специальные биты доступа в Linux....................................................................................................66
22.1 Роль специальных битов.............................................................................................................66
22.2 Бит Setuid......................................................................................................................................66
22.3 Бит Setgid......................................................................................................................................67
22.4 Бит Sticky.......................................................................................................................................67
23 Создание и распаковка архивов в Linux............................................................................................67
23.1 Создание tar-архива без сжатия.................................................................................................68
23.2 Создание архива с использованием сжатия..............................................................................68
23.3 Распаковка архива.......................................................................................................................69
23.4 Просмотр содержимого архива без распаковки.......................................................................69
24 Процессы в Linux..................................................................................................................................69
24.1 Иерархия процессов....................................................................................................................69
24.2 Просмотр списка процессов.......................................................................................................70
24.3 Load Average.................................................................................................................................74
24.4 Статусы процессов.......................................................................................................................79
25 Завершение процесса в Linux.............................................................................................................79
25.1 Сигналы и способы завершения процесса................................................................................79
25.2 Завершение процесса по его PID................................................................................................82
25.3 Завершение программы по её имени........................................................................................82
25.4 Дополнительные инструменты...................................................................................................83
26 Приоритет процессов в Linux..............................................................................................................86
26.1 Введение в приоритеты процессов............................................................................................86
26.2 Назначение приоритета новому процессу................................................................................87
26.3 Управление ранее запущенным процессом.............................................................................87
27 Запуск процесса от имени другого пользователя.............................................................................88
27.1 Причины смены пользователя....................................................................................................88
27.2 Запуск от имени пользователя....................................................................................................88
28 Демоны в Linux.....................................................................................................................................90
28.1 Что такое демоны и сервисы......................................................................................................90
29 Запуск и остановка сервиса в Linux....................................................................................................91

4
29.1 Системы запуска сервисов..........................................................................................................91
29.2 Запуск сервисов............................................................................................................................92
29.3 Остановка сервисов.....................................................................................................................92
29.4 Перезапуск сервисов...................................................................................................................92
29.5 Автозапуск сервисов в Linux........................................................................................................93
29.6 Добавление сервиса в автозапуск..............................................................................................93
29.7 Удаление демона из автозагрузки.............................................................................................93
30 Планировщик задач в Linux................................................................................................................93
30.1 Область применения Cron...........................................................................................................93
30.2 Специальные директории...........................................................................................................94
30.3 Пользовательская настройка Cron..............................................................................................94
31 Получение сведений об обрудовании...............................................................................................95
31.1 Утилита dmidecode - отображение содержимого таблиц DMI компьютера..........................95
31.2 Утилита lshw..................................................................................................................................98
31.3 Прочие команды для получения сведений об оборудовании ...............................................99
Список вопросов для закрепления материала......................................................................100

5
1 Что такое GNU/Linux?
Linux — это операционная система: набор программ, которые позволяют вам работать с вашим
компьютером и запускать другие программы.
Операционная система (ОС) состоит из нескольких основных программ, которые нужны вашему
компьютеру, чтобы он мог общаться и получать инструкции от пользователей; читать и записывать
данные на жёсткие диски, другие накопители и принтеры; контролировать использование памяти;
запускать другие программы. На рис.1.1 отображена архитектура ОС Linux. Самая важная часть ОС
— ядро. В системе GNU/Linux ядром является Linux. Оставшаяся часть системы состоит из других
программ, многие из которых написаны проектом GNU или для проекта GNU. Поскольку одно ядро
Linux — это ещё не вся работающая ОС, мы предпочитаем использовать термин «GNU/Linux» для
обозначения систем, которые многие люди ошибочно называют «Linux».

Рис.1.1 Архитектура ОС Linux


Linux сделана по образцу операционной системы Unix. С самого начала Linux разрабатывалась как
многозадачная, многопользовательская система. Этих факторов достаточно, чтобы сделать Linux
отличной от других широко известных операционных систем. Однако, Linux отличается намного
сильнее, чем вы можете себе представить. В отличие от других операционных систем, Linux
никому не принадлежит. Значительная часть системы разработана добровольцами бесплатно.
Разработка того, что позже станет GNU/Linux, началась в 1984 году, когда Фонд Свободного
Программного обеспечения начал разработку свободной Unix-подобной операционной системы,
названной GNU.
Проект GNU разработал всеобъемлющий набор свободного программного обеспечения для
использования в Unix™ и Unix-подобных операционных системах, таких как Linux. Эти программы
позволяют пользователям выполнять задачи широкого спектра, от простых (копирование или
удаление файлов из системы) до сложных (написание и компилирование программ или
выполнение сложного редактирования в различных форматах документов).
Хотя многие рабочие группы и отдельные люди вложили свой труд в создание Linux, наибольшим

6
пока ещё остаётся вклад Фонда Свободного Программного Обеспечения. Помимо разработки
большинства используемых инструментов, фонд также создал философию и организовал
сообщество (независимых программистов и энтузиастов-пользователей). Благодаря этому, в свою
очередь, стало возможным появление отлаженных Linux систем.
Ядро Linux впервые появилось в 1991 году, когда финский студент-компьютерщик по имени Линус
Торвальдс (Linus Torvalds) анонсировал первую версию замены ядра Minix в группе новостей
comp.os.minix.
Пользователи Linux имеют огромную свободу в выборе программного обеспечения. Например,
пользователи Linux могут выбирать из дюжины различных оболочек командной строки и
нескольких графических рабочих столов. Этот выбор часто удивляет пользователей других
операционных систем, которые и не думали, что командные оболочки или рабочий стол можно
заменить.
Linux также менее подвержен сбоям, лучше приспособлен для одновременного выполнения
более чем одной программы и более защищён, чем многие другие системы. Благодаря этим
преимуществам, Linux быстро завоёвывает рынок серверных операционных систем. С недавних
пор, Linux начал становиться популярным среди домашних пользователей и в корпоративной
среде.

2 Дистрибутив Linux
Дистрибутив Linux — общее определение операционных систем, использующих ядро Linux,
готовых для конечной установки на пользовательское оборудование. Кроме ядра и, собственно,
операционной системы, дистрибутивы обычно содержат широкий набор приложений, таких как
редакторы документов и таблиц, мультимедиа-проигрыватели, системы для работы с базами
данных, и т. д. Поставляемая в рамках дистрибутива операционная система состоит из ядра Linux
и, как правило, включает в себя набор библиотек и утилит, выпускаемых в рамках проекта GNU, а
также графическую подсистему X Window System. Небольшие дистрибутивы могут и не включать в
поставке подсистему X, и, в целях экономии, предлагать альтернативы GNU-утилитам, такие как
Busybox, uClibc или dietlibs. В настоящее время существует более шестисот дистрибутивов Linux;
более половины из них поддерживаются в актуальном состоянии, что обеспечивается регулярным
выпуском обновлений разработчиками дистрибутива.
Поскольку ядро и сопутствующее ему программное обеспечение, в основном, являются
открытыми, тот или иной дистрибутив Linux может быть установлен на самый широкий спектр
аппаратуры, как-то: домашний компьютер, оборудованный по последнему слову техники, сервер,
ноутбук или нетбук, смартфон или планшетный компьютер. Кроме этого, некоторые из
дистрибутивов Linux специально предназначены для разворачивания в средах с ограниченными
ресурсами (например, в решениях на микроконтроллерах или на очень устаревшем оборудовании
для загрузки с дискеты).
Существуют дистрибутивы, разрабатываемые как при коммерческой поддержке (Red Hat / Fedora,
SLED / OpenSUSE, Ubuntu), так и исключительно усилиями добровольцев (Debian, Slackware,
Gentoo, ArchLinux).

2.1 Компоненты дистрибутива Linux


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

7
поставляться программы, распространяемые на условиях собственнических лицензий.
В состав многих дистрибутивов входит система установки, выполняющая те же функции, что и в
других современных ОС. Некоторые дистрибутивы, такие как Gentoo Linux, T2 SDE и Linux From
Scratch, содержат только ядро, средства для сборки ПО и собственно установщик, который в
процессе выполнения собирает всё необходимое ПО специально под архитектуру устройства, на
которое выполняется установка такого дистрибутива.

3 Введение в ядро Linux


Перейдем к общему обзору архитектуры операционной системы GNU/Linux. Операционную
систему можно условно разделить на два уровня, как показано на Рис.1.2.

Рис.1.2. Фундаментальная архитектура операционной системы GNU/Linux


На верхнем уровне находится пользовательское пространство (пространство приложений). Здесь
исполняются приложения пользователя. Под пользовательским пространством располагается
пространство ядра. Здесь функционирует ядро Linux.
Имеется также библиотека GNU C (glibc). Она предоставляет интерфейс системных вызовов,
который обеспечивает связь с ядром и дает механизм для перехода от приложения, работающего
в пространстве пользователя, к ядру. Это важно, поскольку ядро и пользовательское приложение
располагаются в разных защищенных адресных пространствах. При этом, в то время как каждый
процесс в пространстве пользователя имеет свое собственное виртуальное адресное
пространство, ядро занимает одно общее адресное пространство.
Ядро Linux можно, в свою очередь, разделить на три больших уровня. Наверху располагается
интерфейс системных вызовов, который реализует базовые функции, например, чтение и запись.
Ниже интерфейса системных вызовов располагается код ядра, точнее говоря, архитектурно-
независимый код ядра. Этот код является общим для всех процессорных архитектур,
поддерживаемых Linux. Еще ниже располагается архитектурно-зависимый код, образующий BSP
(Board Support Package - пакет поддержки аппаратной платформы). Этот код зависит от процессора
и платформы для конкретной архитектуры.

8
3.1.1 Свойства ядра Linux
Обсуждая архитектуру большой и сложной системы, можно рассматривать ее со многих разных
точек зрения. Одна из целей архитектурного анализа может состоять в том, чтобы лучше понять
исходный код системы. Именно этим мы здесь и займемся.
В ядре Linux реализован целый ряд важных архитектурных элементов. И на самом общем, и на
более детальных уровнях ядро можно подразделить на множество различных подсистем. С другой
стороны, Linux можно рассматривать как монолитное целое, поскольку все базовые сервисы
собраны в ядре системы. Такой подход отличается от архитектуры с микроядром, когда ядро
предоставляет только самые общие сервисы, такие как обмен информацией. ввод/вывод,
управление памятью и процессами, а более конкретные сервисы реализуются в модулях,
подключаемых к уровню микроядра. Каждая из этих точек зрения имеет свои достоинства, но я
здесь не буду вдаваться в это обсуждение.
С течением времени ядро Linux стало более эффективным с точки зрения использования памяти и
процессорных ресурсов и приобрело исключительную стабильность. Однако самый интересный
аспект Linux, учитывая размер и сложность этой системы - это ее переносимость. Linux можно
откомпилировать для огромного количества разных процессоров и платформ, имеющих разные
архитектурные ограничения и потребности. Например, Linux может работать на процессоре как с
блоком управления памятью (MMU), так и без MMU. Поддержка процессоров без MMU
реализована в версии ядра uClinux.

3.1.2 Основные подсистемы ядра Linux


Давайте рассмотрим некоторые основные компоненты ядра Linux, следуя структуре,
изображенной на рис.1.3.

Рис.1.3. Один из возможных взглядов на архитектуру ядра Linux

Интерфейс системных вызовов


SCI - это тонкий уровень, предоставляющий средства для вызова функций ядра из пространства
пользователя. Как уже говорилось, этот интерфейс может быть архитектурно зависимым, даже в
пределах одного процессорного семейства. SCI фактически представляет собой службу
мультиплексирования и демультиплексирования вызова функций. Реализация SCI находится в
./linux/kernel, а архитектурно-зависимая часть - в ./linux/arch.

9
Управление процессами
Управление процессами сконцентрировано на исполнении процессов. В ядре эти процессы
называются потоками (threads); они соответствуют отдельным виртуализованным объектам
процессора (код потока, данные, стек, процессорные регистры). В пространстве пользователя
обычно используется термин процесс, хотя в реализации Linux эти две концепции (процессы и
потоки) не различают. Ядро предоставляет интерфейс программирования приложений (API) через
SCI для создания нового процесса (порождения копии, запуска на исполнение, вызова функций
Portable Operating System Interface [POSIX]), остановки процесса (kill, exit), взаимодействия и
синхронизации между процессами (сигналы или механизмы POSIX).
Еще одна задача управления процессами - совместное использование процессора активными
потоками. В ядре реализован новаторский алгоритм планировщика, время работы которого не
зависит от числа потоков, претендующих на ресурсы процессора. Название этого планировщика -
O(1) - подчеркивает, что на диспетчеризацию одного потока затрачивается столько же времени,
как и на множество потоков. Планировщик O(1) также поддерживает симметричные
многопроцессорные конфигурации (SMP). Исходные коды системы управления процессами
находятся в ./linux/kernel, а коды архитектурно-зависимой части - в ./linux/arch).

Управление памятью
Другой важный ресурс, которым управляет ядро - это память. Для повышения эффективности,
учитывая механизм работы аппаратных средств с виртуальной памятью, память организуется в
виде т.н. страниц (в большинстве архитектур размером 4 КБ). В Linux имеются средства для
управления имеющейся памятью, а также аппаратными механизмами для установления
соответствия между физической и виртуальной памятью.
Однако управление памятью - это значительно больше, чем просто управление буферами по 4 КБ.
Linux предоставляет абстракции над этими 4 КБ буферами, например, механизм распределения
slab allocator. Этот механизм управления базируется на 4 КБ буферах, но затем размещает
структуры внутри них, следя за тем, какие страницы полны, какие частично заполнены и какие
пусты. Это позволяет динамически расширять и сокращать схему в зависимости от потребностей
вышележащей системы.
В условиях наличия большого числа пользователей памяти возможны ситуации, когда вся
имеющаяся память будет исчерпана. В связи с этим страницы можно удалять из памяти и
переносить на диск. Этот процесс обмена страниц между оперативной памятью и жестким диском
называется подкачкой. Исходные коды управления памятью находятся в ./linux/mm.

Виртуальная файловая система


Еще один интересный аспект ядра Linux - виртуальная файловая система (VFS), которая
предоставляет общую абстракцию интерфейса к файловым системам. VFS предоставляет уровень
коммутации между SCI и файловыми системами, поддерживаемыми ядром (см. Рис.1.4).
VFS предоставляет коммутационную матрицу между пользователями и файловыми системами
На верхнем уровне VFS располагается единая API-абстракция таких функций, как открытие,
закрытие, чтение и запись файлов. На нижнем уровне VFS находятся абстракции файловых систем,
которые определяют, как реализуются функции верхнего уровня. Они представляют собой
подключаемые модули для конкретных файловых систем (которых существует более 50).
Исходные коды файловых систем находятся в ./linux/fs.

10
Рис.1.4. VFS предоставляет коммутационную матрицу между пользователями и файловыми
системами
Ниже уровня файловой системы находится кэш буферов, предоставляющий общий набор функций
к уровню файловой системы (независимый от конкретной файловой системы). Этот уровень
кэширования оптимизирует доступ к физическим устройствам за счет краткосрочного хранения
данных (или упреждающего чтения, обеспечивающего готовность данных к тому моменту, когда
они понадобятся). Ниже кэша буферов находятся драйверы устройств, реализующие интерфейсы
для конкретных физических устройств.

Сетевой стек
Сетевой стек по своей конструкции имеет многоуровневую архитектуру, повторяющую структуру
самих протоколов. Вы помните, что протокол Internet Protocol (IP) - это базовый протокол сетевого
уровня, располагающийся ниже транспортного протокола Transmission Control Protocol, TCP). Выше
TCP находится уровень сокетов, вызываемый через SCI.
Уровень сокетов представляет собой стандартный API к сетевой подсистеме. Он предоставляет
пользовательский интерфейс к различным сетевым протоколам. Уровень сокетов реализует
стандартизованный способ управления соединениями и передачи данных между конечными
точками, от доступа к "чистым" кадрам данных и блокам данных протокола IP (PDU) и до
протоколов TCP и User Datagram Protocol (UDP). Исходные коды сетевой подсистемы ядра
находятся в каталоге ./linux/net.

Драйверы устройств
Подавляющее большинство исходного кода ядра Linux приходится на драйверы устройств,
обеспечивающие возможность работы с конкретными аппаратными устройствами. В дереве
исходных кодов Linux имеется подкаталог драйверов, в котором, в свою очередь, имеются
подкаталоги для различных типов поддерживаемых устройств, таких как Bluetooth, I2C,
последовательные порты и т.д. Исходные коды драйверов устройств находятся в ./linux/drivers.

Архитектурно-зависимый код
Хотя основная часть Linux независима от архитектуры, на которой работает операционная система,

11
в некоторых элементах для обеспечения нормальной работы и повышения эффективности
необходимо учитывать архитектуру. В подкаталоге ./linux/arch находится архитектурно-зависимая
часть исходного кода ядра, разделенная на ряд подкаталогов, соответствующих конкретным
архитектурам. Все эти каталоги в совокупности образуют BSP. В случае обычного настольного ПК
используется каталог i386. Подкаталог для каждой архитектуры содержит ряд вложенных
подкаталогов, относящихся к конкретным аспектам ядра, таким как загрузка, ядро, управление
памятью и т.д. Исходные коды архитектурно-зависимой части находятся в ./linux/arch.

4 Файлы и файловая система


Файлы в GNU/Linux играют ключевую роль, что не всегда справедливо для других операционных
систем. Трудно отрицать значение файлов для пользователей, поскольку все их данные хранятся в
виде файлов. Однако помимо этого, файлы в GNU/Linux определяют привилегии пользователей,
поскольку права пользователя в большинстве случаев контролируются с помощью прав доступа к
файлам. Файлы обеспечивают доступ к периферийным устройствам компьютера, включая диски,
накопители на магнитной ленте, CD-ROM, принтеры, терминалы, сетевые адаптеры и даже память.
Для приложений GNU/Linux доступ к дисковому файлу "неотличим" от доступа, скажем, к
принтеру. Наконец, все программы, которые выполняются в системе, включая прикладные задачи
пользователей, системные процессы и даже ядро GNU/Linux, являются исполняемыми файлами.
Как и во многих современных операционных системах, в GNU/Linux файлы организованы в виде
древовидной структуры (дерева), называемой файловой системой (file system). Каждый файл
имеет имя, определяющее его расположение в дереве файловой системы. Корнем этого дерева
является корневой каталог (root directory), имеющий имя «/» . Имена всех остальных файлов
содержат путь — список каталогов (ветвей), которые необходимо пройти, чтобы достичь файла. В
GNU/Linux все доступное пользователям файловое пространство объединено в единое дерево
каталогов, корнем которого является каталог «/». Таким образом, полное имя любого файла
начинается с «/» и не содержит идентификатора устройства (дискового накопителя, CD/ROM или
удаленного компьютера в сети), на котором он фактически хранится.
Однако это не означает, что в системе присутствует только одна файловая система. В большинстве
случаев единое дерево, такое каким его видит пользователь системы, составлено из нескольких
отдельных файловых систем, которые могут иметь различную внутреннюю структуру, а файлы,
принадлежащие этим файловым системам, могут быть расположены на различных устройствах.
Заметим, что имя файла является атрибутом файловой системы, а не набора некоторых данных на
диске, который не имеет имени как такового.
Каждый файл имеет связанные с ним метаданные (хранящиеся в индексных дескрипторах —
inode), содержащие все характеристики файла и позволяющие операционной системе выполнять
операции, заказанные прикладной задачей: открыть файл, прочитать или записать данные,
создать или удалить файл. В частности, метаданные содержат указатели на дисковые блоки
хранения данных файла. Имя файла в файловой системе является указателем на его метаданные, в
то время как метаданные не содержат указателя на имя файла.

4.1 Типы файлов


В GNU/Linux существуют 6 типов файлов, различающихся по функциональному назначению и
действиям операционной системы при выполнении тех или иных операций над файлами:
 Обычный файл (regular file)
 Каталог (directory)
 Специальный файл устройства (special device file)

12
 FIFO или именованный канал (named pipe)
 Связь (link)
 Сокет
Обычный файл представляет собой наиболее общий тип файлов, содержащий данные в
некотором формате. Для операционной системы такие файлы представляют собой просто
последовательность байтов. Вся интерпретация содержимого файла производится прикладной
программой, обрабатывающей файл. К этим файлам относятся текстовые файлы, бинарные
данные, исполняемые программы и т. п.
Каталог. С помощью каталогов формируется логическое дерево файловой системы. Каталог — это
файл, содержащий имена находящихся в нем файлов, а также указатели на дополнительную
информацию — метаданные, позволяющие операционной системе производить операции над
этими файлами. Каталоги определяют положение файла в дереве файловой системы, поскольку
сам файл не содержит информации о своем местонахождении. Любая задача, имеющая право на
чтение каталога, может прочесть его содержимое, но только ядро имеет право на запись в каталог.
В ОС Linux имеются так называемые специальные каталоги. Специальные каталоги, такие как «.» и
«..», обозначают, соответственно, текущий рабочий каталог и его родительский каталог.
На рисунке в качестве примера приведена структура каталога. По существу каталог представляет
собой таблицу, каждая запись которой соответствует некоторому файлу. Первое поле каждой
записи содержит указатель на метаданные (номер inode), а второе определяет имя файла.

Специальный файл устройства обеспечивает доступ к физическому устройству. В GNU/Linux


различают символьные (character) и блочные (block) файлы устройств. Доступ к устройствам
осуществляется путем открытия, чтения и записи в специальный файл устройства.
Файлы блочных и символьных устройств позволяют приложениям получать доступ к аппаратным
средствам и периферийному оборудованию системы. На этапе конфигурирования к ядру ОС Linux
динамически подгружаются необходимые модули, предназначенные для управления
аппаратными средствами системы. За управление конкретным устройством отвечает специальный
модуль, называемый драйвером устройства.
Драйверы устройств образуют стандартный интерфейс взаимодействия, который воспринимается
пользователем как набор обычных файлов. Получив запрос к файлу символьного или блочного
устройства, ядро передает данный запрос соответствующему драйверу. Файлы блочных и

13
символьных устройств сами по себе не являются драйверами. Их можно рассматривать как
шлюзы, через которые драйвер принимает запросы на выполнение предусмотренных операций.
Файлы символьных устройств не используют буферизацию в процессе операций ввода-вывода.
Все операции ввода-вывода осуществляются немедленно по мере поступления. К символьным
устройствам относятся виртуальные терминалы, модемы и другие устройства, не
поддерживающие произвольный доступ к данным.
Файлы блочных устройств обрабатываются драйверами, которые осуществляют ввод-вывод
данных цельными блоками. В данном случае, на уровне ядра выполняется буферизация данных
ввода-вывода. К блочным устройствам относятся такие устройства как жесткие диски, DVD
приводы, модули памяти, а так же все остальные устройства, поддерживающие произвольный
доступ к данным.
Файлы блочных и символьных устройств характеризуются двумя номерами: старшим (major) и
младшим (minor). Старший номер устройства позволяет ядру определить, к какому драйверу
относится файл, а младший номер идентифицирует конкретное физическое устройство.
Просмотреть номера файлов устройств можно, используя команду Is:
# Is -l1 /dev/
brw-г----- 1 root disk 8, 0 Dec 22 13:30 sda
brw-r----- 1 root disk 8, 2 Dec 22 13:30 sda2
brw-rw---- 1 root disk 22, 0 Dec 22 13:30 hdc
crw-rw---- 1 root root 4, 0 Dec 22 16:29 ttyO
crw--w---- 1 root tty 4, 1 Dec 23 00:05 ttyl
crw------- 1 root root 5, 1 Dec 22 16:43 console
Из данного листинга видно, что блочному устройству sda2 соответствует старший номер 8 (номер
драйвера) и младший номер 2 (номер устройства). Номер драйвера 8 в ОС Linux соответствует
драйверу SCSI дисков sd. Младший номер устройства 2 является порядковым номером данного
устройства, т.е, по сути, файл /dev/sda2 представляет второй раздел, созданный на жестком диске
SCSI sda.
И так, символьные файлы устройств используются для небуферизированного обмена данными с
устройством, в противоположность этому блочные файлы позволяют производить обмен данными
в виде пакетов фиксированной длины — блоков. Доступ к некоторым устройствам может
осуществляться как через символьные, так и через блочные специальные файлы.
FIFO или именованный канал — это файл, используемый для связи между процессами. FIFO
впервые появились в System V UNIX, но большинство современных систем поддерживают этот
механизм. Файлы данного типа подобны сокетам, поскольку тоже используются для
взаимодействия между процессами, однако в отличие от сокетов в именованных каналах данные
передаются только в одном направлении.
Связь. Как уже говорилось, каталог содержит имена файлов и указатели на их метаданные. В то же
время сами метаданные не содержат ни имени файла, ни указателя на это имя. Такая архитектура
позволяет одному файлу иметь несколько имен в файловой системе. Имена жестко связаны с
метаданными и, соответственно, с данными файла, в то время как сам файл существует
независимо от того, как его называют в файловой системе. Такая связь имени файла с его данными
называется жесткой связью (hard link). Например, с помощью команды ln мы можем создать еще
одно имя (second) файла, на который указывает имя first.
$ pwd
/home/user1
$ ln first /home/user2/second

14
Жесткие связи абсолютно равноправны. В списках файлов каталогов, которые можно получить с
помощью команды ls, файлы first и second будут отличаться только именем. Все остальные
атрибуты файла будут абсолютно одинаковыми. С точки зрения пользователя — это два разных
файла. Изменения, внесенные в любой из этих файлов, затронут и другой, поскольку оба они
ссылаются на одни и те же данные файла. Вы можете переместить один из файлов в другой
каталог — все равно эти имена будут связаны жесткой связью с данными файла. Легко проверить,
что удаление одного из файлов (first или second) не приведет к удалению самого файла, т. е. его
метаданных и данных (если это не специальный файл устройства).

15
По определению жесткие связи указывают на один и тот же индексный дескриптор inode. Поэтому
проверить, имеют ли два имени файла жесткую связь, можно, вызвав команду ls с ключом -i
$ ls -i /home/user1/first /home/user2/second
12567 first
12567 second
Информацию о наличии у файла нескольких имен, связанных с ним жесткими связями, можно
получить, просмотрев подробный листинг файлов с помощью команды ls - l
$ ls -l /home/user2
-rw-r—r-- 2 andrei staff 7245 Jan 17 8:05 second
Во второй колонке листинга указано число жестких связей данного файла.
Сразу оговоримся, что жесткая связь является естественной формой связи имени файла с его
метаданными и не принадлежит к особому типу файла.
Особым типом файла является символическая связь, позволяющая косвенно адресовать файл. В
отличие от жесткой связи, символическая связь адресует файл, который, в свою очередь,
ссылается на другой файл. В результате, последний файл адресуется символической связью
косвенно.
Данные файла, являющегося символической связью, содержат только имя целевого файла.
Проиллюстрируем эти рассуждения на примере. Команда ln с ключом -s позволяет создать
символическую связь:
$ pwd
/home/user1
$ ln -s first /home/user2/symfirst
$ cd /home/user2
$ ls -l
lrwxrwxrwx 1 user1 staff 15 Jan 17 8:05 symfirst->../user1/first
Как видно из вывода команды ls файл symfirst (символическая связь) существенно отличается от
файла second (жесткая связь). Во-первых, фактическое содержимое файла symfirst отнюдь не то
же, что и у файла first или second, об этом говорит размер файла — 15 байт. На самом деле в этом
файле хранится не что иное как имя файла, на которую символическая связь ссылается на
../user1/first — ровно 15 байт. Во-вторых, файл symfirst не содержит никаких ограничений на
доступ (2-10 символы в первой колонке).
Символическая связь является особым типом файла (об этом свидетельствует символ l в первой
позиции вывода ls, и операционная система работает с таким файлом не так, как с обычным.
Например, при выводе на экран содержимого файла symfirst появятся данные файла
/home/use1/first.

16
На рисунке ниже отображено символическая связь:

Сокеты предназначены для взаимодействия между процессами. В ОС Linux выделяется несколько


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

17
называть сокетами домена UNIX (UNIX domain socket). Несмотря на то, что другие процессы
распознают файлы сокетов как элементы каталога, только процессы, между которыми установлено
соответствующее соединение, могут осуществлять чтение и запись файлов сокета. С локальными
сокетами работают различные сервисы ОС Linux - CUPS, X Window и Syslog. Помимо локальных
сокетов существуют сетевые сокеты, позволяющие процессам обмениваться данными по сети.
Интерфейс сокетов часто используется для доступа к сети TCP/IP. В системах, ветви BSD UNIX
реализована система межпроцессного взаимодействия, с помощью которой работают многие
системные сервисы, например, система печати.

4.2 Структура файловой системы


Файловая система Linux будет непривычна именно для новичка, только что перешедшего с
Windows, ведь здесь все совсем по-другому. В отличие от Windows, программа не находится в
одной папке, а, как правило, распределена по корневой файловой системе. Это распределение
поддается определенным правилам. Вы когда-нибудь задавались вопросом, почему некоторые
программы находятся в папке /bin, или /sbin, /usr/sbin, /usr/local/bin, в чем разница между этими
каталогами?
Например, программа less, находится в каталоге /usr/bin, но почему не в /sbin или /usr/sbin. А
такие программы, как ifconfig или fdisk находятся в каталоге /sbin и нигде иначе.
Ниже будет рассмотрена структура файловой системы Linux, где вы сможете понять смысл
использования большинства папок в корневом каталоге Linux.

/ - Корень
Это главный каталог в системе Linux. По сути, это и есть файловая система Linux. Здесь нет дисков
или чего-то подобного, как в Windows. Вместо этого, адреса всех файлов начинаются с корня, а
дополнительные разделы, флешки или оптические диски подключаются в папки корневого
каталога.
Только пользователь root имеет право читать и изменять файлы в этом каталоге.
Обратите внимание, что у пользователя root домашний каталог /root, но не сам /.
/bin - (binaries) бинарные файлы пользователя
Этот каталог содержит исполняемые файлы. Здесь расположены программы, которые можно

18
использовать в однопользовательском режиме или режиме восстановления. Одним словом, те
утилиты, которые могут использоваться пока еще не подключен каталог /usr/. Это такие общие
команды, как cat, ls, tail, ps и т д.
/sbin - (system binaries) системные исполняемые файлы
Так же как и /bin, содержит двоичные исполняемые файлы, которые доступны на ранних этапах
загрузки, когда не примонтирован каталог /usr. Но здесь находятся программы, которые можно
выполнять только с правами суперпользователя. Это разные утилиты для обслуживания системы.
Например, iptables, reboot, fdisk, ifconfig,swapon и т д.
/etc - (etcetera) конфигурационные файлы
В этой папке содержатся конфигурационные файлы всех программ, установленных в системе.
Кроме конфигурационных файлов, в системе инициализации Init Scripts, здесь находятся скрипты
запуска и завершения системных демонов, монтирования файловых систем и автозагрузки
программ. Структура каталогов linux в этой папке может быть немного запутанной, но
предназначение всех их - настройка и конфигурация.
/dev - (devices) файлы устройств
В Linux все, в том числе внешние устройства являются файлами. Таким образом, все
подключенные флешки, клавиатуры, микрофоны, камеры - это просто файлы в каталоге /dev/. Этот
каталог содержит не совсем обычную файловую систему. Структура файловой системы Linux и
содержащиеся в папке /dev файлы инициализируются при загрузке системы, сервисом udev.
Выполняется сканирование всех подключенных устройств и создание для них специальных
файлов. Это такие устройства, как: /dev/sda, /dev/sr0, /dev/tty1, /dev/usbmon0 и т д.
/proc - (proccess) информация о процессах
Это тоже необычная файловая система, а подсистема, динамически создаваемая ядром. Здесь
содержится вся информация о запущенных процессах в реальном времени. По сути, это
псевдофайловая система, содержащая подробную информацию о каждом процессе, его Pid, имя
исполняемого файла, параметры запуска, доступ к оперативной памяти и так далее. Также здесь
можно найти информацию об использовании системных ресурсов, например, /proc/cpuinfo,
/proc/meminfo или /proc/uptime. Кроме файлов в этом каталоге есть большая структура папок
linux, из которых можно узнать достаточно много информации о системе.
/var (variable) - Переменные файлы
Название каталога /var говорит само за себя, он должен содержать файлы, которые часто
изменяются. Размер этих файлов постоянно увеличивается. Здесь содержатся файлы системных
журналов, различные кеши, базы данных и так далее. Дальше рассмотрим назначение каталогов
Linux в папке /var/.
/var/log - Файлы логов
Здесь содержатся большинство файлов логов всех программ, установленных в операционной
системе. У многих программ есть свои подкаталоги в этой папке, например, /var/log/apache - логи
веб-сервера, /var/log/squid - файлы журналов кеширующего сервера squid. Если в системе что-
либо сломалось, скорее всего, ответы вы найдете здесь.
/var/lib - базы данных
Еще один тип изменяемых файлов - это файлы баз данных, пакеты, сохраненные пакетным
менеджером и т д.
/var/mail - почта
В эту папку почтовый сервер складывает все полученные или отправленные электронные письма,
здесь же могут находиться его логи и файлы конфигурации.
/var/lock - файлы блокировок

19
Здесь находятся файлы блокировок. Эти файлы означают, что определенный ресурс, файл или
устройство занят и не может быть использован другим процессом. Apt-get, например, блокирует
свою базу данных, чтобы другие программы не могли ее использовать, пока программа с ней
работает.
/var/run - PID процессов
Содержит файлы с PID процессов, которые могут быть использованы, для взаимодействия между
программами. В отличие от каталога /run данные сохраняются после перезагрузки.
/tmp (temp) - Временные файлы
В этом каталоге содержатся временные файлы, созданные системой, любыми программами или
пользователями. Все пользователи имеют право записи в эту директорию.
Файлы удаляются при каждой перезагрузке. Аналогом Windows является папка Windows\Temp,
здесь тоже хранятся все временные файлы.
/usr - (user applications) Программы пользователя
Это самый большой каталог с большим количеством функций. Тут наиболее большая структура
каталогов Linux. Здесь находятся исполняемые файлы, исходники программ, различные ресурсы
приложений, картинки, музыку и документацию.
/usr/bin/ - Исполняемые файлы
Содержит исполняемые файлы различных программ, которые не нужны на первых этапах загрузки
системы, например, музыкальные плееры, графические редакторы, браузеры и так далее.
/usr/sbin/
Содержит двоичные файлы программ для системного администрирования, которые нужно
выполнять с правами суперпользователя. Например, таких как Gparted, sshd, useradd, userdel и т д.
/usr/lib/ - Библиотеки
Содержит библиотеки для программ из /usr/bin или /usr/sbin.
/usr/local - Файлы пользователя
Содержит файлы программ, библиотек, и настроек созданные пользователем. Например, здесь
могут храниться программы собранные и установленные из исходников и скрипты, написанные
вручную.
/home - Домашняя папка
В этой папке хранятся домашние каталоги всех пользователей. В них они могут хранить свои
личные файлы, настройки программ и т д. Например, /home/sergiy и т д. Если сравнивать с
Windows, то это ваша папка пользователя на диске C, но в отличии от WIndows, home как правило
размещается на отдельном разделе, поэтому при переустановке системы все ваши данные и
настройки программ сохранятся.
/boot - Файлы загрузчика
Содержит все файлы, связанные с загрузчиком системы. Это ядро vmlinuz, образ initrd, а также
файлы загрузчика, находящие в каталоге /boot/grub.
/lib (library) - Системные библиотеки
Содержит файлы системных библиотек, которые используются исполняемыми файлами в
каталогах /bin и /sbin.
Библиотеки имеют имена файлов с расширением *.so и начинаются с префикса lib*. Например,
libncurses.so.5.7. Папка /lib64 в 64 битных системах содержит 64 битные версии библиотек из /lib.
Эту папку можно сравнить с WIndows\system32, там тоже сгружены все библиотеки системы,
только там они лежат смешанные с исполняемыми файлами, а здесь все отдельно.
/opt (Optional applications) - Дополнительные программы

20
В эту папку устанавливаются проприетарные программы, игры или драйвера. Это программы
созданные в виде отдельных исполняемых файлов самими производителями. Такие программы
устанавливаются в под-каталоги /opt/, они очень похожи на программы Windows, все
исполняемые файлы, библиотеки и файлы конфигурации находятся в одной папке.
/mnt (mount) - Монтирование
В этот каталог системные администраторы могут монтировать внешние или дополнительные
файловые системы.
/media - Съемные носители
В этот каталог система монтирует все подключаемые внешние накопители - USB флешки,
оптические диски и другие носители информации.
/srv (server) - Сервер
В этом каталоге содержатся файлы серверов и сервисов. Например, могут содержаться файлы веб-
сервера apache.
/run - процессы
Еще один каталог, содержащий PID файлы процессов, похожий на /var/run, но в отличие от него, он
размещен в TMPFS, а поэтому после перезагрузки все файлы теряются.
/sys (system) - Информация о системе
Назначение каталогов Linux из этой папки - получение информации о системе непосредственно от
ядра. Это еще одна файловая система организуемая ядром и позволяющая просматривать и
изменить многие параметры работы системы, например, работу swap, контролировать
вентиляторы и многое другое.

5 Менеджеры пакетов

5.1 Компиляция программ и её недостатки


Большинство пользователей привыкли к тому, что в операционной системе Windows для
установки программы необходимо запустить специальный исполняемый файл. Например, с
именем setup.exe. Linux реализует совершенно иной подход.
Программа может быть скомпилирована из исходных кодов. Это довольно специфичный и долгий
процесс. К тому же чаще всего он отнимает много нервов. Большинству программ для нормальной
работы требуются зависимости, которые пользователю также придется самостоятельно разрешать
с помощью компиляции или установки пакетов.
С компиляцией связана одна неприятная особенность. В Linux не существует простого способа
удаления скомпилированных программ. Пользователю придется самостоятельно выискивать все
директории с данными, исполняемыми файлами и логами, чтобы очистить их. Также вы не
сможете быть уверенным в нормальном функционировании системы, так как удаленная
программа могла использоваться другими приложениями в качестве зависимости.
Чаще всего компиляция используется для установки самых новых версий программ, которые еще
не успели войти в репозитории пакетов, либо для установки с указанием специфичных опций.
Заметка: Справедливости ради отметим, что компиляция программы из исходных кодов может
быть произведена и в Windows. Однако данная операция является большой редкостью в этой
операционной системе.

5.2 Преимущества менеджеров пакетов


В каждом современном дистрибутиве Linux имеется менеджер пакетов. Он осуществляет учет

21
установленных программ и их зависимостей, что значительно облегчает администрирование
системы. Пакет по принципу действия схож с установочным файлом Windows, однако не является
исполняемым. Его можно считать чем-то вроде заархивированного набора инструкций,
говорящего менеджеру как правильно и с какими зависимостями произвести установку
программы.
Получить необходимый пакет можно скачав его в сети или через официальные репозитории. Во
втором случае менеджер самостоятельно скачает файл пакета и осуществит все необходимые
процедуры.
Работа через менеджеры пакетов дает ряд существенных преимуществ:
1. Установка и удаление программ осуществляется вызовом простых команд.
2. Не нужно самостоятельно разрешать зависимости всех пакетов. Если вам необходимо
установить программу, все её компоненты подтянутся из репозитория.
3. Файловая система не замусоривается. Зависимости, директории логов и данных могут
удаляться автоматически в случае не надобности.
4. Высокая степень безопасности. Пакеты скачиваются через официальные репозитории и
имеют криптографические подписи. Это исключает возможность установки программ с
вредоносным кодом. В случае компиляции вы можете получить исходные коды с любого
сайта или форума, и никто не гарантирует их безопасность.
5. Менеджер самостоятельно следит за обновлением версий пакетов.

5.3 Разнообразие форматов пакетов


В различных дистрибутивах Linux могут использоваться разные менеджеры пакетов. Так Debian и
все его производные поддерживают формат пакетов deb, а Red Hat следует своему пути с
форматом rpm. Существуют низкоуровневые команды, позволяющие осуществлять установку,
удаление и обновление пакетов. В Debian команда именуется как dpkg, а в Red Hat соответственно
rpm. Эти команды реализуют примитивный функционал. Например, они не осуществляют
автоматическую установку зависимостей пакетов.
На основе примитивных команд rpm и dpkg реализованы высокоуровневые системы управления
пакетами, позволяющие осуществлять простое и эффективное взаимодействие с форматами deb и
rpm. Именно об их преимуществах мы говорили выше. К данным системам относятся Yum в Red
Hat, APT и Aptitude в Debian/Ubuntu. Они являются консольными, но есть и системы управления
пакетами с графической оболочкой YumExtender и Synaptic.
Также существует ряд инструментов, созданных под конкретные дистрибутивы. Они не будут
рассмотрены в данном учебном курсе.

6 Работа с RPM-пакетами

6.1 Основные положения


Данный формат пакетов изначально создавался для Red Hat, что закреплено в расширении файлов
с помощью рекурсивного акронима (сокр. RPM, полн. Red Hat Package Manager — менеджер
пакетов Red Hat). В настоящее время этот формат используется во всех производных от Red Hat
дистрибутивах: Fedora, SUSE, Mandriva и т.д. Низкоуровневая команда, осуществляющая операции
с пакетами, имеет аналогичное название rpm.
Несмотря на все плюсы использования пакетов, команде rpm уделялось мало внимания, поэтому
её программный код разделился на две независимые ветки. Red Hat и основная масса

22
дистрибутивов Linux, произошедших от него, придерживаются версии RPM 4.*. Именно её мы
будем изучать далее. В настоящее время за разработку этого стандарта отвечает проект
http://rpm.org/.
Преимущества :
 Простота установки, удаления и обновления программ.
 Безопасность за счет криптографических подписей пакетов.
 Автоматизации развертывания системы с помощью скриптов.
 Специальные пакеты Delta-RPM позволяют обновлять программы частично, а не скачивать
целиком для переустановки.
Недостатки:
 Команда rpm не разрешает зависимости самостоятельно.
 Новые версии пакетов не совместимы со старыми консольными командами. Например, в
силу определенных обстоятельств вы не можете обновить команду rpm с версии 4.0, а
современные пакеты требуют наличия версии 4.7.

6.2 Учет RPM-пакетов


При установке, удалении и обновлении пакетов rpm ведется строгий учет. В директории
/var/lib/rpm создаются базы данных, хранящие списки установленных программ, их зависимостей.
Помимо простого учета rpm сохраняет информацию о том, как файлы и директории изменялись
при установке и удалении пакетов. Это позволяет сохранять целостность файловой системы и
предотвращать её замусоривание.
Информация о зависимостях, кратное описание и ряд другой административной информации,
необходимой для поддержания баз данных учета, хранится в метаданных пакетов.
Важно: Ни в коем случае не пытайтесь изменять содержимое баз данных rpm вручную. Это
обязательно приведет к нарушениям в работе системы.

6.3 Формирование имен


Согласно установленным стандартам имена файлов rpm-пакетов должны формироваться особым
способом. В общем виде такое имя можно представить схемой «[имя_пакета]-[версия]-
[релиз].[архитектура].rpm».
Описание компонентов:
 Имя пакета — произвольное название программы, выбранное создателем.
 Версия — текущая версия программы. Как правило, задается тремя числами в формате
1.0.0.
 Релиз — зачастую используется для краткой аббревиатуры имени дистрибутива, под
который собрана программа. Например, «mdv» для Mandriva.
 Архитектура — тип процессора. Например: i386, arm64, amd64 и т.д.
Настоящее имя файла, сформированное с учетом вышеописанных требований, могло бы
выглядеть как «program-1.0.0-mdv.amd64.rpm».

6.4 Установка и удаление RPM-пакетов


В общем виде использование консольной команды rpm можно записать как «rpm -опции
имя_пакета». Ниже мы рассмотрим ряд практических примеров, в которых происходят операции
установки, удаления и обновления пакетов. Они просты для понимания, поэтому не требуют

23
подробного описания. Вы также можете ознакомиться со всеми возможными опциями, вызвав
справку по команде.
Пример установки пакета из файла, присутствующего на диске
[user@localhost]$ rpm -i package_name.rpm
Пример скачивания и установки прямо с открытого ftp сервера
[user@localhost]$ rpm -i ftp://host.domain/directory/package_name.rpm
Пример установки с выводом дополнительной информации и статуса
[user@localhost]$ rpm -ivh package_name.rpm
Пример удаления. Обратите внимание на то, что имя пакета без расширения
[user@localhost]$ rpm -e package_name
Пример обновления пакета с помощью файла с новой версией
[user@localhost]$ rpm -U package_name.rpm
Пример вывода общей информации об установленном пакете
[user@localhost]$ rpm -qi package_name

7 Менеджер управления пакетами Yum

7.1 Преимущества Yum


Менеджер пакетов Yum является высокоуровневым решением по управлению rpm-пакетами в
Linux. В отличие от консольной программы rpm, рассмотренной нами в прошлом уроке, Yum имеет
множество дополнительных возможностей значительно упрощающих администрирование
системы.
Основные достоинства:
 Пакеты располагаются в централизованных хранилищах, именуемых репозиториями. Они
представляют из себя многочисленные сервера, к которым можно получить доступ из
глобальной сети. Пакеты организуются в Yum-архивы. Архив помимо всего прочего
содержит набор метаданных, описывающих зависимости. Таким образом, Yum получает
возможность планировать свою работу, не анализируя все пакеты целиком. Например, для
программы из репозитория A требуется установка зависимостей, которые расположены в
репозиториях B и С. Yum будет знать об этом заранее, т.к он выкачает из каждого
репозитория все метаданные.
 Yum автоматически разрешает взаимосвязи между пакетами. Если для установки
программы требуются дополнительные пакеты, они будут скачаны из репозиториев
автоматически. Также при удалении программ Yum проанализирует систему на предмет
неиспользуемых зависимостей и произведет их очистку.
 Yum настоящая находка для пользователей Linux. Он позволяет всего одной командой
осуществлять установку, удаление и обновление пакетов. При этом для обновления не
нужно перебирать вручную каждый пакет. Yum может самостоятельно обновить всю
систему.

7.2 Главная конфигурация


Yum имеет ряд глобальных настроек, значения которых задаются в конфигурационном файле
/etc/yum.conf. В большинстве случаев они не требуют изменений. Можно оставить настройки по
умолчанию, принятые в вашем дистрибутиве Linux. Ниже приводится пример содержимого
конфигурационного файла /etc/yum.conf, а сразу после него описание основных параметров.

24
cachedir=/var/cache/yum
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=3
Параметры конфигурации:
 cachedir — директория хранения скачанных метаданных пакетов.
 keepcache — нужно ли сохранять пакеты на диске или затирать их после установки
программы. По умолчанию пакеты не сохраняются. Функционал можно активировать,
установив значение «1». Однако это может вызвать большой расход дискового
пространства.
 logfile — место расположения файла для записи логов.
 gpgcheck — необходимо ли проверять цифровые подписи перед установкой пакетов.
Отключение этого параметра может привести к проблемам с безопасностью системы.
 exclude — после знака «=» через пробел можно указать имена пакетов. Они будут
запрещены к скачиванию, установке и обновлению.
Заметка: Конфигурационный файл /etc/yum.conf имеет множество дополнительных настроек.
Ознакомиться с ними можно посредством команды «man yum.conf», которая использует
стандартный механизм вывода справки в Linux.

7.3 Настройка репозиториев


Yum также позволяет конфигурировать отдельные репозитории, из которых может вестись
установка пакетов. Для каждого такого репозитория создается отдельный файл настроек в
директории /etc/yum.repos.d. Он должен иметь расширение «.repo». Ниже приводится пример
содержимого такого конфигурационного файла.
name=Fedora $releasever - $basearch
failovermethod=priority
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=fedora-
$releasever$arch=$basearch
enabled=1
metadata_expire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch

Параметры конфигурации репозитория:


 [repository] — в квадратных скобках указывается уникальное имя репозитория.
Необходимо заменить слово «repository» на другое.
 name — вольное название репозитория. Используется для краткого описания.
 mirrorlist — файл, содержащий список альтернативных адресов репозиториев. Если
стоящий вначале будет недоступен, Yum попробует обратиться к следующему в списке.
 enabled — статус активности репозитория. Поставьте значение «0», чтобы Yum игнорировал
его при установке и удалении пакетов.

25
 metadata_expire — срок по истечении, которого снова будут запрошены метаданные
пакетов, хранящихся в данном репозитории. Буква «d» после числа 7 говорит, что
обновление метаданных будет происходить каждые 7 дней.
 gpgcheck — нужно ли проверять цифровые подписи пакетов.
 gpgkey — место расположения открытого ключа шифрования.
Обратите внимание, что внутри конфигурации используются специальные переменные $releasever,
$arch и $basearch. Они будут заменены соответствующими значениями: $arch — результат
команды «uname -p», $basearch — результат команды «uname -i», $releasever — имя пакета, по
которому определяется версия текущего дистрибутива Linux.

7.4 Основные команды


Менеджер пакетов Yum очень прост в применении на практике. Большинство команд не требуют
подробного разбора. Ниже показаны несколько примеров, затрагивающих основные операции по
установке, обновлению и удалению пакетов.
Пример проверки репозиториев на доступность обновлений
[user@localhost]$ yum check-update
Пример обновления всех пакетов
[user@localhost]$ yum update
Пример обновления конкретного пакета
[user@localhost]$ yum update имя_пакета
Пример установки пакета
[user@localhost]$ yum install имя_пакета
Пример удаления пакета
[user@localhost]$ yum remove имя_пакета
Пример удаления пакетов из кэша
[user@localhost]$ yum clean packages
Пример удаления из кэша и пакетов и метаданных
[user@localhost]$ yum clean all

8 Установка и удаление DEB-пакетов

8.1 Основные положения


Формат пакетов «.deb» изначально создавался для дистрибутива Debian. В настоящее время он
используется практически во всех производных: Ubuntu, Mint, Sparky и т.д. Расширение пакетов
«.deb» происходит от первых букв слова Debian, которое в свою очередь берет начало из женского
имени Debra (бывшая подруга Яна Мердока - основателя Debian).
Выше было описано низкоуровневая программа, управляющую rpm-пакетами в Red Hat.
Существует аналогичный инструмент и для формата deb. Утилита dpkg позволяет осуществлять
основные операции установки и удаления пакетов, а также получения общей информации о них.
Однако, как и в случае с rpm, dpkg не разрешает зависимости между пакетами и не загружает их из
репозиториев самостоятельно.

26
На основе dpkg существует несколько высокоуровневых решений. Это настоящие системы
управления пакетами apt get в Ubuntu и aptitude в Debian. Их мы рассмотрим подробнее в
следующих статьях.

8.2 Формирование имен


Ubuntu/Debian, как и любые другие дистрибутивы Linux, определяют стандарты именования
пакетов. В общем виде схему можно представить как «[имя_пакета]-[дополнение]-
[версия]_[архитектура].deb»
Описание компонентов:
 Имя пакета — произвольное название программы.
 Дополнение — может меняться в зависимости от содержимого пакета: dev — заголовочные
файлы, dbg — отладочная информация, doc — документация, bin — исполняемые файлы.
 Версия — текущая версия пакета.
 Архитектура — тип процессора. Например: i386, arm64, amd64 и т.д.

8.3 Установка и удаление пакетов


Ниже мы приводим несколько примеров использования утилиты dpkg для установки и удаления
пакетов. При современном подходе к администрированию в решении этих задач используются
высокоуровневые системы управления пакетами. Поэтому не стоит заострять внимание на полном
изучении dpkg.
Пример установки пакета из файла, присутствующего на диске
[user@localhost]$ sudo dpkg -i package_name.deb
Пример удаления пакета с сохранением конфигурационных файлов
[user@localhost]$ sudo dpkg -r package_name
Пример полного удаления пакета, вместе с конфигурацией
[user@localhost]$ sudo dpkg -P package_name
Пример показа детальной информации о пакете
[user@localhost]$ sudo dpkg -p package_name
Пример вывода списка установленных пакетов
[user@localhost]$ sudo dpkg -l

9 Менеджер пакетов АРТ

9.1 Преимущества APT


Выше было описано консольная утилита dpkg, предназначенная для работы с deb-пакетами. Она
реализует простой функционал удаления и установки пакетов, без учета их зависимостей. Это
сильно ограничивает возможности администрирования системы.
Дистрибутивы Linux, произошедшие от Debian, имеют предустановленный менеджер пакетов APT,
который является более проработанным аналогом Yum из Read Heat. Для работы с пакетами через
APT существует две консольные команды: apt-get и aptitude. Apt-get в основном используется в
дистрибутиве Ubuntu, а aptitude рекомендована к применению в Debian (версии 5 и выше). Нужно
отметить, что обе команды устанавливаются по умолчанию, вне зависимости от используемой
сборки и дистрибутива.
Преимущества менеджера пакетов APT:

27
 Пакеты хранятся в общедоступных репозиториях, с которых они могут быть скачаны в
любое время.
 APT автоматически обрабатывает зависимости между пакетами во время установки и
удаления.
 Простота использования. Всего одной командой APT позволяет осуществлять установку,
удаление и обновление пакетов.

9.2 Основная конфигурация


Настройки менеджера пакетов APT собираются из нескольких мест. Тонкая конфигурация
происходит в директории /etc/apt/apt.conf.d/*, в которой по умолчанию располагаются несколько
файлов, содержащих параметры архивации, сброса кэша, автоматического обновления пакетов и
т. д. Эти настройки очень специфичны и, как правило, не требуют изменений для обычных
операций установки и удаления пакетов. Если вы все же хотите ознакомиться с ними глубже,
команда «man apt.conf» даст более подробное описание всех возможных опций.
Файл /etc/apt/sources.list содержит конфигурацию репозиториев пакетов. Каждая строка в этом
файле описывает отдельный репозиторий. В общем виде запись можно представить как
«тип_пакета адрес_репозитория имя_дистрибутива
дополнительные_компоненты».
Конфигурация репозитория:
 тип пакета — стандартным типом пакета в Debian/Ubuntu считается «deb». Если пакет
содержит исходные коды, тип записывается как «deb-src».
 адрес репозитория — URL-адрес ресурса, как правило, использующий протокол http, ftp
или ssh.
 имя дистрибутива — на сервере могут храниться несколько версий одного и того же
пакета, собранные для разных сборок дистрибутивов Linux. Поэтому, третий параметр
требует указания имени сборки. Например, на момент написания статьи «xenial» является
именем последней LTS сборки Ubuntu.
 дополнительные компоненты — могут быть записаны в ряд через пробел. Описывают
характеристики пакетов, которые могут быть установлены из данного репозитория.
Например, компонент non-free говорит, что установке подлежат пакеты, не
распространяемые бесплатно.
deb http://ru.archive.ubuntu.com/ubuntu/ xenial main restricted
deb https://apt.dockerproject.org/repo ubuntu-xenial main
deb http://archive.canonical.com/ubuntu xenial partner

9.3 Работа с пакетами


Ниже мы приводим примеры стандартных операций установки, удаления и обновления пакетов с
помощью консольной команды apt-get для Ubuntu и её аналога aptitude для Debian. Полные
списки опций команд вы можете получить с помощью стандартного механизма получения справки
в Linux.
Пример обновления метаданных пакетов из репозиториев
[user@localhost]$ sudo apt-get update
[user@localhost]$ aptitude update

28
Пример обновления всех установленных пакетов
[user@localhost]$ sudo apt-get upgrade
[user@localhost]$ aptitude upgrade
Пример установки пакета
[user@localhost]$ sudo apt-get install package_name
[user@localhost]$ aptitude install package_name
Пример удаления пакета с сохранением логов и конфигурации
[user@localhost]$ sudo apt-get remove package_name
[user@localhost]$ aptitude remove package_name
Пример полного удаления пакета вместе с конфигурацией
[user@localhost]$ sudo apt-get purge package_name
[user@localhost]$ aptitude purge package_name
Пример как показать полную информацию о пакете
[user@localhost]$ sudo apt-get show package_name
[user@localhost]$ aptitude show package_name

10 Работа с терминалами Linux

10.1 Что такое текстовые терминалы


В предыдущих уроках мы познакомились с графическими оболочками Linux. Они предоставляют
привычный способ взаимодействия с различными компонентами операционной системы. Тем не
менее, существует ряд задач, с которыми можно справиться только через текстовые терминалы.
Их также называют консолями.
С первого взгляда тема этой статьи может показаться непривычной и даже пугающей. Однако
получив навыки работы с терминалами, вы поймете, что это очень мощный и гибкий инструмент.
Профессионалы, работающие с Linux, во многих случаях предпочитают консоли графическим
оболочкам.
Понятие «текстовый терминал» берет свое начало от истоков IT-индустрии. В те времена
программисты взаимодействовали с компьютерными системами по средством ввода перфокарт.
Программы распечатывались на специальных бумагах с отверстиями и загружались в
считывающее устройство. Такой подход был не удобен, так как ошибка в коде или забракованная
перфокарта могли нарушить весь длительный процесс.
С течением времени появились специальные устройства, позволяющие осуществлять ручной ввод
команд и запуск программ. К одной системе могло быть подключено несколько таких устройств,
что давало программистам возможность работать одновременно. Первые модели больше
походили на печатные машинки. Позже добавились и мониторы для визуального контроля над
вводимыми символами. Такой набор аппаратных средств стали называть текстовыми
терминалами.
Заметка: Мы привыкли к более продвинутым средствам взаимодействия с компьютерами.
Терминалы ушли в историю, но практика, сложившаяся за время их эксплуатации, хорошо себя
зарекомендовала. Операционная система Linux создает уровень абстракции, позволяющий
запускать консоли в современных условиях.

29
10.2 Запуск и закрытие терминалов
Работа с терминалами ведется в Linux двумя способами: полноэкранный текстовый режим и
оконная консоль. В первом случае операционная система полностью игнорирует графическую
оболочку. Вы находитесь в черном экране с приглашением на ввод команд. Результат работы
запускаемых программ также выводится в виде текста.
Всего существует шесть отдельных терминалов. Их запуск происходит посредством нажатия
сочетания клавиш Ctr + Alt + F{номер терминала}. Номерами соответственно считаются
клавиши от F1 до F6. При открытии будет запрошен ввод имени пользователя и пароля. На разных
консолях можно войти под разными пользователями.
Для разлогиневания необходимо нажать сочетание клавиш Ctrl + D. Если вы хотите закрыть
текстовый терминал и вернуться к графической оболочке Linux, нажмите сочетание клавиш Ctr +
Alt + F7.

11 Краткое рассмотрение интерпретатора Bash

11.1 Понятие командной оболочки


Выше мы рассмотрели текстовые терминалы, которые одновременно являются историческим
наследием и удобным инструментом системного администрирования. На заре IT-индустрии они
использовались для решения простейших задач: последовательный запуск программ и просмотр
результата выполнения.
Современные операционные системы создают уровень абстракции, позволяющий использовать
терминалы совместно с командными оболочками. Оболочки имеют расширенные возможности
работы в текстовом режиме и идут в комплекте с любым дистрибутивом Linux.
Командная оболочка — это специальный программный интерпретатор. Он является посредником
между пользователем и операционной системой. При вводе команды в окне терминала оболочка
перехватывает её и осуществляет дополнительную обработку, что позволяет внедрить элементы
программирования. Например, вы можете запустить приложение и записать результат его
выполнения в файл. Операция не потребует дополнительных усилий, интерпретатор сделает всё
самостоятельно, а запись команды уместится в одну короткую строку.
В Linux есть несколько видов командных оболочек, но в целом они обладают схожим
функционалом. Данный и последующие уроки раскрывают принципы работы интерпретатора
Bash. Он и его производные чаще всего используются на практике.
Заметка: Осуществляя поиск информации по этой теме, вы заметите, что словосочетания
«текстовый терминал» и «командная оболочка» используются как синонимы. На самом деле это
разные компоненты системы. Однако по причине их неразрывной связанности, такое применение
определений допустимо.

11.2 Основные возможности Bash


История создания Bash берет свое начало с 1987 года. Командная оболочка была разработана
Брайаном Фоксом на основе ранее существовавшей Bourne shell. Она обладает широким спектром
возможностей. В последнее время появилось множество других интерпретаторов, значительно
обгоняющих Bash по скорости работы. Тем не менее, многочисленное сообщество и установка
практически на всех дистрибутивах Linux сохраняет её популярность.
Встроенные возможности:

30
1. Использование конвейеров для передачи результата одной программы в другую.
2. Встроенный язык программирования с условными операторами, циклами и т. д.
3. Запуск набора команд из файла (скрипта).
4. Авто дополнение имен файлов и директорий.
5. Просмотр истории введенных команд.
6. Перенаправление ввода-вывода.
7. Использование оболочковых переменных
При открытии текстового терминала Linux командная оболочка будет загружена в него
автоматически. От пользователя не требуется никаких дополнительных операций. Ниже мы
приводим простой пример команды echo и записи её результата в файл.
[user@localhost] $ echo "пример использования Bash" > ~/bash-test.txt
После выполнении команды интерпретатор Bash создаст в домашней папке пользователя файл с
именем bash-test.txt. Он будет содержать текст, стоящий после оператора echo.

11.3 Командные оболочки и пользователи


В вашей операционной системе может быть установлено несколько командных интерпретаторов.
Linux позволяет каждому отдельному пользователю определить конкретную оболочку, которая
будет подгружаться в терминал при его запуске.
Увидеть какие оболочки, к каким пользователям привязаны можно в файле /etc/passwd. Каждая
строчка в нем — это определение отдельного пользователя. В самом конце строки после
двоеточия указывается место расположения исполняемого файла командной оболочки.
Например, /bin/bash. Вы можете заметить, что у некоторых пользователей эта часть строки указана
как /bin/false. Такое определение запрещает использование любой оболочки.
Системный администратор может вручную исправить файл /etc/passwd. Если вы являетесь
обычным пользователем, необходимо выполнить команду chsh с указанием расположения
исполняемого файла командной оболочки.
[user@localhost] $ chsh -s /bin/bash

12 Параметры и опции команд

12.1 Выполнение команд с параметрами


В большинстве случаев программы, запускаемые через терминал Linux, требуют передачи хотя бы
одного параметра. Параметры — это значения, необходимые для выполнения основной логики.
Например, команда touch изменяет время последнего доступа к файлу, а в случае отсутствия
создает его. Она ожидает получить имя файла. Если вы забудете ввести его, в окне консоли
появится текст ошибки.
[user@localhost] $ touch some-new-file.txt
Существуют консольные команды, требующие указания двух и более параметров. Некоторые из
них могут выполнять различную логику в зависимости от количества переданных значений.

12.2 Использование опций консольных команд


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

31
как флаги. В Linux существует соглашение по использованию опций команд, запускаемых через
терминал.
Ключи должны задаваться с помощью знака «-» и следующей за ним латинской буквы. Буква
может быть записана как в верхнем, так и в нижнем регистре. Однако опции заданные одной и той
же буквой, но в разных регистрах считаются различными модификаторами логики. Если ключу
требуется указать значение, то оно должно быть записано сразу после него через пробел.
Общий вид строки вызова команды с ключами записывается как «имя_команды [-ключ
значение] [параметр]». Квадратные скобки указаны для логического разделения, они не
должны присутствовать при реальном вызове. Особенностью ключей в Linux является то, что они
могут быть записаны друг за другом. Обратите внимание на пример, приведенный ниже. Команда
ls показывает содержимое текущего каталога. Опция -l заставляет программу вывести
подробное описание файлов с указанием владельца, прав доступа, времени последнего доступа и
т. д. Опция -t сортирует файлы по времени последнего доступа.
[user@localhost] $ ls -lt
drwxr-xr-x 2 user user 20480 май 8 15:20 Загрузки
drwxr-xr-x 3 user user 4096 апр 20 22:11 Изображения
drwxr-xr-x 2 user user 4096 апр 17 20:59 Рабочий стол
...
Полноименные опции записываются с помощью последовательности знаков «--» и имени
модификатора. Они не могут быть объединены в одну строку. Для указания значения необходимо
поставить знак «=» после имени опции. Выражение в общем виде записывается как
«имя_команды [--имя_опции=значение] [параметр]».
[user@localhost] $ ls --all --size --block-size=M
1M . 1M .gphoto 1M .thunderbird
1M .. 1M .ICEauthority 1M .ViberPC
1M .adobe 1M .java 1M VirtualBox VMs
...
Приведенный выше пример демонстрирует вызов уже знакомой консольной команды ls с тремя
полноименными опциями. Они выполняют следующие действия: --all — выводит скрытые
файлы, --size — указывает размеры файлов в блоках, --block-size=M — указывает размеры
фалов в мегабайтах.
Заметка: Опции консольных команд в Linux могут иметь две записи одновременно. Как с
помощью ключа, так и с указанием полного имени. Это зависит от конкретной программы.

13 Помощь по командам Linux

13.1 Причины использования справки


Большинство команд, выполняемых в консоли, обладают расширенным функционалом. Он
задействуется с помощью дополнительных опций. Также поведение программы может меняться в
зависимости от количества входящих параметров.
Даже опытные пользователи Linux не в силах запомнить весь набор опций для множества команд.
Как правило, используются только основные. Если вам нужно изучить возможности незнакомой
консольной программы или освежить память, можно обратиться к справке.
Заметка: Помощь предоставляется несколькими способами. Есть методы получения краткой
информации, а также подробной многостраничной справки.

32
13.2 Использование опции Help
Вы можете получить помощь по конкретной команде Linux, вызвав её через терминал с указанием
опции --help или -h. За формирование такой информации отвечает сама программа. Она
содержит лаконичное описание принимаемых параметров и дополнительных опций. В
большинстве случаев этого достаточно.
Ниже приводится пример с вызовом помощи по команде find, отвечающей за поиск файлов и
директорий в файловой системе.
[user@localhost] $ find --help

13.3 Использование справочных страниц Man


Большинство программ Linux при установке добавляют в директорию /usr/share/man
специальные справочные файлы. В отличие от использования опции --help, они позволяют
получить подробное описание принципа работы.
Доступ к такой справке организуется с помощью команды man и указания имени программы. Её
запуск переключит ваш терминал в специальный режим. Это необходимо, так как справочная
информация очень объемна и располагается на нескольких страницах, что может доставлять
неудобства при работе в текстовом режиме.
Не для всех консольных команд Linux возможно получить такую помощь. Если файл справки
отсутствует, то в терминал будет выведен текст ошибки. Запущенная программа man позволяет
использовать несколько горячих клавиш.
Список горячих клавиш:
 pageUp или k — прокрутка текста вверх.
 PageDown или j — прокрутка текста вниз.
 Ctrl + u — прокрутка страницы в начало.
 Ctrl + d — прокрутка страницы в конец.
 ? - поиск текста. После активации этой клавиши необходимо ввести искомое слово и нажать
Enter. Все вхождения будут подсвечены.
 n — перейти к следующему вхождению искомого слова.
 N — перейти к предыдущему вхождению искомого слова.
 q — выйти из просмотра справочной информации.
 h — просмотр всех доступных горячих клавиш.
Вы можете ознакомиться с принципом работы команды man запустив пример, приведенный
ниже. Она покажет справочный файл для программы mkdir, отвечающей за создание директорий.
[user@localhost] $ man mkdir

13.4 Тематические разделы man-страниц


Открыв директорию /usr/share/man, вы увидите несколько дополнительных каталогов с
именами man1, man2 и т. д. Они являются тематическими разделами справочной информации. В
вашем дистрибутиве Linux может присутствовать несколько одноименных программ. В таком
случае требуется разделение справочных файлов по категориям, иначе появляется
неоднозначность.

33
У команды man есть дополнительный числовой параметр, указываемый перед именем
программы. Если он присутствует, будет осуществлен вывод справки из определенного
тематического раздела. Также можно использовать опцию -a, которая предоставит помощь по
одноименным программам, присутствующим во всех разделах. В таком случае выход из справки с
помощью клавиши q не вернет терминал в обычное состояние, а откроет следующую страницу с
информацией.
[user@localhost] $ man 1 mkdir
Список номеров тематических разделов:
 1 — стандартные команды. Самый объемный из всех разделов.
 2 — системные вызовы ядра Linux.
 3 — функции языка программирования C.
 4 — специализированные файлы устройств.
 5 — конфигурационные файлы приложений.
 6 — игры и развлечения.
 7 — описание различных стандартов.
 8 — команды для системного администрирования.
 9 — описание принципов работы ядра.
 n — не вошедшее в общую классификацию

14 Горячие клавиши терминала в Linux

14.1 Основные горячие клавиши


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

34
Список основных горячих клавиш терминала:

Значение Описание

Ctrl + a Перевод курсора в начало строки

Ctrl + b Перевод курсора на один символ назад

Alt + b
Перевод курсора на одно слово назад
Ctrl + leftArrow

Ctrl + u Удаляет содержимое строки от курсора до её начала

Ctrl + w Удаляет все символы до начала слова, находящиеся слева от курсора

Ctrl + e Перевод курсора в конец строки

Ctrl + f Перевод курсора на один символ вперёд

Alt + f
Переводит курсор на одно слово вперёд
Ctrl + leftArrow

Ctrl + k Удаляет содержимое строки от курсора до её конца

Alt + d Удаляет все символы до конца слова, находящиеся справа от курсора

Ctrl + t Меняет местами два символа слева от курсора

Alt + t Меняет местами два слова слева от курсора

Переводит букву под курсором в верхний регистр, а остальные, до конца слова, в


Alt + c
нижний

Переводит все буквы с текущей позиции курсора и до конца слова в нижний


Alt + l
регистр

Alt + u Переводит буквы с текущей позиции курсора и до конца слова в верхний регистр

Ctrl + l Очистка экрана от вывода предыдущих команд

14.2 История команд, поиск и автодополнение


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

35
Список дополнительных горячих клавиш:

Значение Описание

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


Tab
несколько подходящих вариантов, двойное нажатие Tab выведет их на экран

UpArrow Просмотр истории команд. Пролистывание назад

DownArrow Просмотр истории команд. Пролистывание вперед

Alt + < Переход к первой команде в истории

Alt + > Переход к последней команде в истории

Вывод списка возможных дополнений команды. То же самое, что и двойное нажатие


Alt + ?
Tab

Alt + * Размещает все возможные дополнения команд в строке терминала

Alt + / Дополнение имени файла или директории. То же самое, что и Tab

Alt + . Вставляет последний аргумент предыдущей команды

Текстовый поиск по истории команд. Нажатие Enter осуществит запуск подходящей


Ctrl + r
программы

Ctrl + j Выход из текстового поиска без запуска программ


Заметка: При попытке задействовать горячие клавиши в терминале Linux обратите внимание на
текущую языковую раскладку. Если в сочетании клавиш присутствуют символы «*», «?» и т.д,
действие может не сработать. Потребуется дополнительно нажать Shift.

15 Просмотр файлов в терминале Linux

15.1 Основные инструменты


В зависимости от потребностей, Linux предоставляет пользователю несколько подходов к
просмотру и редактированию текстовых файлов. Графические оболочки по умолчанию
устанавливаются с набором программ, упрощающих данные операции. Они понятны на
интуитивном уровне, поэтому текущий урок рассматривает более специфичные инструменты для
работы в терминале.
Любой дистрибутив Linux содержит несколько стандартных команд, позволяющих просматривать
содержимое текстовых файлов в окне терминала. Если требуется изменить содержимое файла,
нужно прибегнуть к использованию специальных текстовых редакторов таких как: Nano, Vim,
Emacs, Jove и т. д.

15.2 Просмотр содержимого файлов

Команда cat в Linux


Всё содержимое файла можно вывести в терминал с помощью команды cat. Такой подход удобен

36
для просмотра лаконичной информации. Команда cat позволяет создать один или несколько
файлов, просмотреть содержание файлов, объединять файлы и перенаправлять вывод в терминал
или файлы. Если файл содержит объемный текст, он заполнит всё пространство окна, а остальная
часть, скорее всего, будет утрачена.
Общий синтаксис команды cat
[user@localhost]$ cat [OPTION] [FILE]...
Ниже показаны пример использования команды cat:
1. Показать содержание файла
В приведенном ниже примере показано что содержится в файле /etc/passwd.
[user@localhost]$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
narad:x:500:500::/home/narad:/bin/bash
2. Посмотреть вместимое нескольких файлов в терминале
В примере ниже показано как отобразить содержимое в test и test1 файл в терминале.
[user@localhost]$ cat test test1
Hello everybody
Hi world,
3. Создание файла с командой cat
Мы создадим файл с именем test2
[user@localhost]$ cat >test2
hello everyone, how do you do?
Ожидая ввод от пользователя, наберите необходимый текст и нажмите Ctrl + D (нажмите и
удерживайте клавишу Ctrl и наберите 'D'), чтобы выйти. Текст будет написан на test2 файле. Вы
можете увидеть содержимое файлов со следующей командой cat.
[user@localhost]$ cat test2
hello everyone, how do you do?
4. Используйте команду cat с опциями more & less
Если файл имеет большую информационную наполненность, то он не поместится в выходной
разъем и экран прокрутится вверх очень быстро. В таком случае мы можем использовать
параметры more & less с командой cat, как показано выше.
[user@localhost]$ cat song.txt | more
[user@localhost]$ cat song.txt | less
5. Отображение номеров строк в файле
С опцией -n вы можете увидеть номера строк файла song.txt в выходном терминале.
[user@localhost]$ cat -n song.txt
1 "Heal The World"
2 There's A Place In
3 Your Heart
4 And I Know That It Is Love
5 And This Place Could
6 Be Much
7 Brighter Than Tomorrow
8 And If You Really Try
9 You'll Find There's No Need

37
10 To Cry
11 In This Place You'll Feel
12 There's No Hurt Or Sorrow
6. Отображение $ в конце файла
В приведенном ниже примере, можно увидеть с опцией -e, что "$" появляется в конце линии, а
также если есть разрыв между пунктами. Эта опция полезна для того, чтобы собрать несколько
строк в одну строку.
[user@localhost]$ cat -e test
hello everyone, how do you do?$
$
Hey, am fine.$
How's your training going on?$
$
7. Показать разделение строк Tab в файле
В приведенном ниже выходе мы видим как пространство TAB заполняется символом " ^I".
[user@localhost]$ cat -T test
hello ^Ieveryone, how do you do?
Hey, ^Iam fine.
^I^IHow's your training ^Igoing on?
Let's do ^Isome practice in Linux.
8. Одновременное отображение нескольких файлов
В приведенном ниже примере мы имеем три файла test, test1 и test2 и возможность просмотра
содержимого этих файлов, как показано выше. Мы должны разделить каждый файл с ; (точка с
запятой).
[user@localhost]$ cat test; cat test1; cat test2
This is test file
This is test1 file.
This is test2 file.
9. Используйте стандартный вывод с оператором перенаправления
Мы можем перенаправить стандартный вывод в файл в новый файл другого существующего файла
с символом ' > '(больше). Осторожно, содержимое из test1 будет перезаписано в содержимое
файла test.
[user@localhost]$ cat test > test1
10. Добавление стандартного выход с оператором перенаправления
Добавление в существующий файл символами ' >> '(двойные больше). Здесь содержимое в файле
test будет добавлено в конце файла test1.
[user@localhost]$ cat test >> test1
11. Перенаправление стандартного ввода с оператором перенаправления
Когда вы используете перенаправление со стандартным входом ' < '( символ меньше), он
использует имя файла test2 в качестве входа для команды и выход будет показан в терминале.
[user@localhost]$ cat < test2
This is test2 file.
12. Перенаправление содержимого нескольки файлов в однин файл
Тут создается файл с именем test3 и все исходящие будут перенаправлены во вновь созданный
файл.

38
[user@localhost]$ cat test test1 test2 > test3
13. Сортировка содержимого нескольких файлов в один файл
Тут создается файл test4 и выход команды cat по конвейеру для сортировки; результат будет
перенаправлен во вновь созданный файл.
[user@localhost]$ cat test test1 test2 test3 | sort > test4
Зачастую требуется получить несколько строк текста из начала или конца файла. Linux позволяет
осуществить данную операцию с помощью команд head (начало файла) и tail (конец файла). По
умолчанию они выводят десять строк текста. Вы можете указать количество получаемых строк с
помощью опций -n или --lines.
Начнем с команды tail, исследуем все ее особенности и увидим, как использовать ее
наилучшим образом для полного удовлетворения наших нужд. После этого посмотрим, что можно
и чего нельзя сделать с командой head.

Команда tail в Linux


Синтаксис команды tail
tail [OPTION]... [FILE]...
Tail печатает (выводит на экран) несколько последних строк указанного файла, после чего
завершается.
Пример 1: по умолчанию, tail печатает последние 10 строк файла, и завершается.

как видите, выводятся последние 10 строк файла /var/log/syslog

Пример 2: если мы хотим просмотреть последние 4 (3, 8, 15…) строк, мы применим параметр -n
--lines, чтобы увидеть желаемое количество строк вместо 10 по умолчанию.
head --lines=20 имя_файла
tail --lines=20 имя_файла

Пример 3: теперь рассмотрим возможно наиболее полезный и часто используемый параметр. В


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

39
Как вы можете видеть, в данном примере мы следим за логом системы /var/log/syslog . Мы
будем наблюдать изменения файла до тех пор, пока не прервем выполнение команды с помощью
CTRL+C.
Пример 4: еще одна опция «-s», которая обычно применяется вместе с «-f», назначит интервал (в
секундах), с которым команда будет опрашивать файл (по умолчанию этот интервал равен 1
секунде).

Пример 5: Одной командой tail мы можем просматривать несколько файлов. При этом на экране
мы будем видеть заголовок каждого файла, начинающийся с “==>”

Пример 6: параметр «-с» ограничивает объем выводимой информации, но в нем указывается не


количество строк (как в параметре «-n»), а количество байт. В примере ниже мы видим последние
10 байт файла /var/log/syslog , потом 100 байт и 500 байт того же файла.

Команда Head в Linux


Команда head в некотором смысле противоположна команде tail, ибо показывает не последние
строки файла, а первые (10 по умолчанию). Поэтому практически все примеры, которые мы

40
рассматривали для команды tail, применимы и к head, за исключением опции «-f», которая в
команде head отсутствует.
Синтаксис команды head
head [OPTION]... [FILE]...
Пример 1: как упоминалось выше, смотрим на первые 10 строк файла.

Пример 2: просматриваем первые 2 строки.

Пример 3: если в ключе «-n» перед значеним (перед цифрой) поставить «-« (к примеру -5), то
команда покажет нам не первые, а последние строки файла начиная со строки с указанным
номером.

Комбинируем команды head и tail


Пример 1: поскольку команды tail и head показывают «противоположные» части файла,
воспользуемся этим, чтобы заглянуть в его середину. Чтобы вывести с 15 по 20 стоки файла
/var/log/syslog, выполним следующую команду:
$ head -n 20 /var/log/syslog | tail – n 6
для лучшего понимания примере было добавлено нумерация строк с помощью команды cat -n

41
Пейджеры more и less
more - это то, что мы называем “пейджером” (от англ. page - страница). Довольно часто данных,
выводимых определённой командой, оказывается слишком много, чтобы уместиться на одном
экране. Отдельные команды не знают, как уместить свои выходные данные на нескольких
страницах. Эту работу они оставляют утилитам, называемых пейджерами.
Команда more разбивает выходные данные на отдельные экраны и ожидает от вас нажатия на
пробел, перед тем как вывести следующую порцию. Нажатие на клавишу Enter сдвинет вывод
только на одну следующую строку, а не на целую страницу. Вот пример:

Командой more можете листать текст вперёд. Текст из файла, в принципе, можно пролистать
назад, но это нетипичное использование more.
Основные интерактивные команды more:
 h – help
 q – выход
 SPACE – пролистать один экран
 d – пролистать пол экрана
 /pattern – пролистать до строки содержащей подстроку pattern
 = – показать номер текущей строки
 :n – перейти к следующему файлу
 :p – вернуться к предыдущему файлу
 :f – напечатать имя текущего файла и номер строки в нем
Только при просмотре файлов:
 b – пролистать экран назад

Команда more довольно удобна, однако часто оказывается, что вы уже пролистали нужный вам
экран. more не предоставляет возможности прокрутки назад. А команда less(1) имеет такую
функцию. Она используется таким же образом, как и more, поэтому предыдущие примеры также
будут работать с ней. Таким образом less больше, чем more (англ., игра слов: less - меньше, more -
больше). Джуст Кремерс (Joost Kremers) так говорит от этом:
less is more, but more then more is, so more is less less, so use more less, if you want less more.
Синтаксис команды less:
less имя_файла

42
Горячие клавиши команды less:

Значение Описание

UpArrow и DownArrow Построчное пролистывание вверх и вниз

Home или G Перемещение в начало текста

End или Shift + G Перемещение в конец текста

Q Выход в терминал

H Просмотр дополнительной информации

Поиск вхождения слова вперед. После нажатия горячей клавиши


/
потребуется ввести фразу и нажать Enter

N Переход к следующему вхождению искомого слова

Поиск вхождения слова назад. После нажатия горячей клавиши


?
потребуется ввести фразу и нажать Enter

H Переход к предыдущему вхождению слова

15.3 Текстовый редактор Nano


Nano — текстовый редактор для консоли. Используется в Unix-подобных ОС.
Установка редактора nano
Поскольку редактор nano входит в стандартные репозитории всех популярных дистрибутивов ОС
Linux, его установка выполняется одной командой:
CentOS:
yum install nano
Debian, Ubuntu:
apt-get install nano
Интерфейс и горячие клавиши nano:

43
1) Верхняя строка – показывает версию редактора, редактируемый файл, вносились ли изменения.
2) Область редактирования
3) Строка состояния – вывод информационных сообщений.
4) Внизу окна показаны комбинации клавиш основных функций редактирования (символ “^” –
одинарное нажатие Ctrl или двойное – Esc):
Сочетание клавиш:
 Ctrl+G или F1 — Показать справку
 Ctrl+X или F2 — Выйти из nano
 Ctrl+O или F3 — Сохранить внесенные изменения
 Ctrl+J или F4 — Выровнять текущий абзац (абзацы отделены пустой строкой)
 Ctrl+R или F5 — Добавить содержимое другого файла в текущий
 Ctrl+W или F6 — Поиск по файлу
 Ctrl+Y или F7 — Страница вперед
 Ctrl+V или F8 — Страница назад
 Ctrl+K или F9 — Вырезать текущую строку и запомнить
 Ctrl+U или F10 — Вставить
 Ctrl+C или F11 — Положение курсора
 Ctrl+T или F12 — Проверить орфографию
Опции работы с nano
Файл открывается командой:
nano имя_файла
либо с дополнительными опциями:
nano –Опция1 Опция2 … ОпцияN +строка,столбец имя_файла
Список всех опций можно найти в справке:
nano -h
Опции, которые могут быть полезными в начале работы с nano:
Опции и Значение:
-h, -? — Показывать данную информацию
+row, column — Начать с указанной строки и позиции
-S — Построчная прокрутка вместо полу-экранной
-c — Построчная прокрутка вместо полу-экранной
-i — Автоматический отступ на новых строках
-u — Разрешить функцию отмены действий (Alt-U — undo, Alt-E — redo.)
-v — Режим просмотра
-w — Не переносить длинные строки
-x — Не показывать две строки помощи cнизу
-B — Сохранять резервные копии существующих файлов.
Действия при редактировании в nano
Простейшие действия, которые доступны во время редактирования (символ Meta (m) можно
заменить Esc):

44
Сочетание клавиш:
 Alt+A — Начать выделение текста
 Ctrl+K — Вырезать выделенный текст
 Alt+6 — Скопировать выделенный текст
 Ctrl+U — Вставить из буфера обмена
 m+\ — На первую строку файла
 m+/ — На последнюю строку файла
 Ctrl+_ или m+G — Перейти на указанный номер строки и ряд ([строка], [ряд] – указываются
в появившемся сообщении)
 m+W — Повторить последний поиск
 m+6 — Копировать текущую строку и сохранить ее в буфере обмена
 m+} — Увеличить отступ строки
 m+{ — Уменьшить отступ строки
 Home — На начало текущей строки
 End — В конец текущей строки
 m+9 — На начало текущего абзаца; потом следующего абзаца
 m+0 — В конец текущего абзаца; потом следующего абзаца
 m+T — Вырезать с текущей позиции до конца файла
 m+J — Выровнять весь файл
 m+D — Подсчитать количество слов, строк и символов
 m+Y — Подсветка синтаксиса разрешить/запретить

15.4 Команда locate в Linux


Использование команды locate в Linux
Команда locate крайне проста в использовании. Все, что вам нужно сделать - это передать ей имя
файла, который необходимо найти.
$ locate [имя-файла]
Например, если вам нужно найти все файлы в именах которых содержится строка "test", вы
можете использовать locate следующим образом:

Примечание: команда locate test (без звездочек) также вполне применима, ведь locate
автоматически заменяет переданное имя файла (такое, как NAME), на соответствующий шаблон (в
данном случае, *NAME*).
Принцип работы locate или почему поиск осуществляется так быстро
Причина, по которой утилита locate работает настолько быстро, заключается в том, что она не
исследует файловую систему в поисках файла или директории с заданным именем. Вместо этого
она использует информацию из базы данных (собранную утилитой updatedb) в процессе поиска
элементов файловой системы с заданными именами и генерирует вывод на основе этой
информации.
Хотя данный подход и имеет массу преимуществ, он не лишен недостатков. Основной его
недостаток заключается в том, что после создания каждого нового файла или новой директории
для корректной работы утилиты приходится обновлять информацию в базе данных. В противном

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

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

Это означает, что информация в базе данных locate не была обновлена после создания
интересующего меня файла. Ну что же, давайте обновим информацию в базе данных с помощью
команды updatedb. Это делается следующим образом:
$ sudo updatedb
Теперь при исполнении приведенной выше команды locate выводится информация о найденных
файлах:

Аналогично, после удаления файла или директории вам придется убедиться в наличии актуальной
информации в базу данных locate, ведь в противном случае информация о них будет выводиться
при последующих операциях поиска.
Вывод информации о количестве найденных файлов и директорий
Как вы уже знаете, утилита locate выводит имена найденных файлов вместе с их полными или
абсолютными путями. Но при желании вы можете сообщить ей о том, что вместо вывода данной
информации нужно выводить лишь информацию о количестве найденных файлов и директорий.
Для этой цели предназначен параметр -c.

Игнорирование регистра символов


По умолчанию утилита locate осуществляет поиск файлов с учетом регистра их имен. Но вы можете
сообщить утилите о необходимости игнорирования различий в регистре символов имен файлов с
помощью параметра -i.
Например, в моей системе имеются два файла с именами new_file.txt и NEW_FILE.TXT. Очевидно,
что имена файлов отличаются лишь регистром символов. Если вы используете утилиту locate для
поиска файлов по шаблону *test*, она выведет лишь вариант имени файла в нижнем регистре.

46
Но в случае использования параметра -i утилита будет игнорировать регистр символов имен
файлов, поэтому оба имени появятся в выводе:

Вывод информации о базе данных locate


Если вам необходима информация об используемой утилитой locate базе данных, а также
статистические данные, касающиеся этой базы данных, вы можете воспользоваться параметром
-S:

Поиск файлов с четко заданным именем


По умолчанию при поиске файла с помощью locate переданное имя, такое, как NAME, будет
автоматически преобразовываться в в шаблон поиска *NAME*. Например, при поиске файла с
именем test1 будут выведены все имена файлов, соответствующие шаблону поиска *test1*:
Но что делать тогда, когда нужно искать лишь файлы с именем test1? Ну, в этом случае вы можете
воспользоваться регулярным выражением, которое активируется с помощью параметра -r. Исходя
из этого, вы можете найти все файлы с именами test1 с помощью регулярного выражения
аналогичным образом:
$ locate -r /testfile$

16 Потоки ввода-вывода в Linux

16.1 Для чего нужны потоки ввода-вывода


Любая программа, запускаемая в терминале Linux, имеет возможность считывать ввод с
клавиатуры и показывать результат своего выполнения. Так реализуется диалог приложения и
пользователя.
Ранее мы изучали запуск программ с указанием опций и параметров. Это является хорошим
примером считывания ввода. Приложение способно изменять свое поведение в зависимости от
входящих данных. Более того оно может останавливать выполнение и запрашивать
дополнительные данные.
Linux позволяет реализовать такое поведение за счет специальных дескрипторов ввода-вывода,
также именуемых потоками. Они являются своего рода файлами, но не в привычном для
понимания смысле. Каждая программа имеет доступ к трем таким потокам. Взаимодействие с
ними ведется, так же как и с обычными файлами, то есть можно читать из них информацию или
записывать.
Список потоков ввода-вывода:

47
 Стандартный ввод (stdin) — дает доступ к информации, вводимой пользователем с
клавиатуры или любого другого устройства.
 Стандартный вывод (stdout) — запись данных в такой поток осуществляет их показ на
стандартном устройстве вывода. Как правило, это дисплей монитора, то есть окно
терминала.
 Стандартные ошибки (stderr) — операционная система должна уметь распознавать,
завершилась ли программа успешно или с ошибкой. Для этого помимо стандартного
вывода существует специальный поток. Запись в него сигнализирует об ошибках во время
выполнения.
Заметка: Вы как пользователь консоли Linux не имеете прямого доступа к потокам ввода-вывода.
Операционная система и командные интерпретаторы создают над ними уровень абстракции. Их
использование будет рассмотрено в уроках о написании консольных программ на встроенном
языке программирования Bash.

16.2 Перенаправление потоков ввода-вывода


Как говорилось выше, пользователь консоли не имеете прямого доступа к потокам ввода-вывода.
Однако операционная система Linux и командные интерпретаторы реализуют механизмы их
перенаправления. Например, вместо вывода результата выполнения программы в терминал
можно сохранить его в файл.
Рассмотрим небольшой пример, приведенный ниже. Команда ls выводит список файлов,
находящихся в указанном каталоге. С помощью символа «>» мы приказываем командному
интерпретатору не выводить результат в терминал, а перенаправить его в файл result.txt. Набор
символов «~/», стоящий перед именем файла, сообщает операционной системе о необходимости
создать его в домашней директории текущего пользователя. Если файл уже существует, он будет
перезаписан.
test@test-VirtualBox:~$ ls /dev > ~/result.txt
В Linux есть и другие операторы перенаправления потоков ввода-вывода. Добавление числа 2
перед знаком «>» заставить обрабатывать только сообщения об ошибках, а конструкция «&>»
осуществляет данное действие, как для ошибок, так и для стандартного вывода. Ниже приводим
таблицу допустимых операторов перенаправлений.
Список операторов перенаправлений ввода-вывода
Пример команды Описание

Вызов_программы > файл Перенаправление стандартного вывода

Вызов_программы < файл Передача содержимого файла программе в качестве стандартного ввода

Вызов_программы 2> файл Перенаправление ошибок в файл

Вызов_программы &> файл Перенаправление ошибок и стандартного вывода в файл

Тоже что и «>», но в случае существования файла информация


Вызов_программы >> файл
дописывается в его конец

Тоже что и «>>», но в случае существования файла информация


Вызов_программы &>> файл
дописывается в его конец
Напоследок приведем ещё один пример перенаправления потоков ввода-вывода. В нем мы
осуществляем поиск конфигурационных файлов, имеющих расширение .ini. Если во время
выполнения возникнут ошибки, они будут записаны в файл results.txt. Так как поиск ведется по

48
всей файловой системе, начиная от корневой директории, ошибки доступа будут происходить на
защищенных системных папках.
test@test-VirtualBox:~$ find / -name .ini 2> ~/results.txt

17 Программные каналы в Linux

17.1 Для чего нужны программные каналы


Механизмы перенаправления потоков ввода-вывода, изученные в предыдущем уроке, имеют
схожие черты с предметом рассмотрения данной статьи. Однако программные каналы Linux
являются инструментами совершенно другого порядка. Они служат для передачи результата
одной программы на вход другой. Использование программных каналов (англ. pipe) очень
эффективно при решении широкого круга задач. Это проявляется как в лаконичности командных
конструкций, так и в скорости выполнения.
Приведем пример. Нам нужно получить первые десять записей пользователей, хранящихся в
файле /etc/passwd. Дополнительным условием является то, что эти пользователи по умолчанию
используют командный интерпретатор Bash. Для решения поставленной задачи можно применить
стандартные средства Linux по перенаправлению потоков ввода-вывода.
Сначала выполним cat с сохранением результата в файл users-test.txt. Затем достанем из него
информацию и передадим команде grep. Она осуществит фильтрацию строк, оканчивающихся
на /bin/bash. Далее мы снова извлечем информацию из файла и перезапишем, пропустив через
команду head, которая оставит первые десять записей.
test@test-VirtualBox:~$ cat /etc/passwd > ~/users-test.txt
test@test-VirtualBox:~$ grep /bin/bash < ~/users-test.txt > ~/users-
temp.txt
test@test-VirtualBox:~$ head < ~/users-temp.txt > ~/users-test.txt
unlink ~/users-temp.txt
Даже поверхностного анализа достаточно, чтобы сделать вывод о неэффективности таких
действий. Использование программных каналов позволило бы избавиться от лишних операций.

17.2 Применение программных каналов


Для использования программных каналов в консоли Linux существует специальный символ «|». Он
должен располагаться между вызовами двух программ. Принцип действия очень прост.
Программа, стоящая слева, будет передавать свой вывод программе, которая стоит справа.
Посмотрите, как записывается пример, приведенный выше, с применением новых возможностей.
test@test-VirtualBox:~$ cat /etc/passwd | grep /bin/bash | head >
~/users-test.txt
Рассмотрим ещё один пример. В нём используется три программных канала. Первая команда ls
выполняет рекурсивный поиск всех файлов и директорий, начиная от корня. Её ошибки
перенаправляются в системный файл /dev/null, являющийся своего рода «черной дырой». Вся
информация, попадающая в него, исчезает.
Вывод команды ls через первый программный канал передается на вход grep. Эта программа
фильтрует полученные строки, и оставляет только те, в которых присутствует слово .config. grep
передает свой вывод через второй канал программе sort. Она, согласно названию, сортирует
строки по алфавиту. Последний канал передает результат всех предыдущих команд на вход head,
что выводит в терминал первые десять строк.

49
18 Работа с файлами и каталогами
Данный урок открывает цикл учебных материалов, посвященных файлам и каталогам в
операционной системе Linux. Ниже мы рассматриваем основные принципы работы с ними:
правила именования, специальные символы консольных команд, общая структура директорий.

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


Уже не раз отмечалось, что Linux образует уровень абстракции. Текстовая информация,
подключенные устройства, запущенные процессы представлены в системе как файлы. Например,
выполнение команды «cat /proc/loadavg» выведет статистику использования ресурсов процессора.
Таким образом, через чтение файла были получены реальные характеристики системы на текущий
момент времени.
Пример вывода информации о использовании процессора
user@localhost:~$ cat /proc/loadavg
0.96 0.81 0.63 3/822 11004
Пример вывода технических характеристик процессора
user@localhost:~$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 69
model name : Intel(R) Core(TM) i5-4200U CPU @ 1.60GHz
...
Именование файлов и каталогов в Linux имеет ряд правил не зависимо от того какую информацию
они содержат. Активным пользователям других операционных систем нужно обратить на это
особое внимание. Может найтись несколько отличий от привычной схемы.
Правила именования файлов и каталогов:
1. Имя должно быть не длиннее 255 символов.
2. Имена чувствительны к регистру. Например, «example.txt» и «eXaMpLe.txt» являются
разными файлами, даже если расположены в одном каталоге.
3. Допускается использование символов нижнего подчеркивания, точек и дефисов.
4. Если имя файла или каталога начинается с точки, он будет воспринят системой как скрытый.
5. В имени также могут содержаться пробелы. Если консольная команда требует указания
имени файла или директории, в котором содержатся пробелы, его следует заключить в
кавычки. Например, «ls "my directory/user file.xlsx"».
6. Допускается использование, как латиницы, так и раскладки национального языка. Linux
полностью поддерживает кодировку UTF-8.

50
Заметка: Скрытые файлы имеют ряд особенностей. Большинство файловых менеджеров не
показывают их, пока не будет включена соответствующая настройка. Так же консольные команды
Linux работают с ними иначе. Например, вывод команды ls по умолчанию не захватывает скрытое
содержимое.
Структура каталогов
Напомним, что работа с каталогами в Linux строится по оригинальному принципу. Здесь нет
разделения на диски и устройства. Вся структура имеет древовидную форму, начиная от корневого
каталога «/». Другие файловые системы монтируются к ней в определенных местах. Например,
содержимое подключенного флеш-накопителя может быть доступно по адресу
«/media/user_name/flash».
Специальные символы
Существует три специальных символа заметно упрощающих использование консольных команд
при работе с файловой системой. Их описание и несколько примеров использования приводятся
ниже.
Специальные файловые символы:
 ~ - домашний каталог текущего пользователя. Неважно где вы находитесь в данный момент.
Использование символа «~» позволит обратиться к любому файлу в личной директории.
Например, команда «cp ~/uploads/best-video.mp4 ~/videos» скопирует скачанное видео в
новую директорию.
 .. - каталог, располагающийся на уровень выше. Если вы находитесь в «/home/user-
name/games», символ «..» будет указывать на «/home/user-name».
 . - текущий каталог. Использование аналогично символу «..», но не отбрасывает текущий
уровень.
Пример удаления файлов из указанного каталога в домашней директории
user@localhost:~$ rm -f ~/programs/old-builds/*
Пример копирования загруженных файлов в текущую директорию
user@localhost:~$ cd ~/new-awesome-videos
user@localhost:~$ cp ~/uploads/*.mp4 .
Пример аналогичного действия, но с перемещением по дереву каталогов
user@localhost:~$ cp ~/uploads/*.mp4 ../../another-user-dir/videos

18.2 Вывод информации о файлах и каталогах


Команда ls – вероятно наиболее используемая команда в любой UNIX-системе. Её
предназначение – вывод информации о файлах и каталогах. Дополнительные опции команды
позволяют получить более подробную информацию и сортировать её определённым образом.

51
Ниже приведены примеры опций и примеры их использования.
-R Рекурсивно обойти встретившиеся подкаталоги.

Вывести список всех файлов (без этой опции не выводятся скрытые файлы, имена которых
-a
начинаются с точки).

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

-C Вывод в несколько колонок с сортировкой по колонкам.

-x Вывод в несколько колонок с сортировкой по строкам.

-m Вывод в свободном формате, имена файлов разделяются запятыми.

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

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

-o То же, что и -l, но идентификатор группы не выводится.

-g То же, что и -l, но идентификатор владельца не выводится.

Изменить порядок сортировки на обратный алфавитный или, при наличии флага -t, сначала
-r
выводить более старые файлы.

Имена файлов сортируются не по алфавиту, а по времени (сначала идут самые свежие файлы). По
-t
умолчанию используется время последнего изменения. См. также флаги -u и -c.

Вместо времени последнего изменения использовать время последнего доступа для сортировки (с
-u
флагом -t) или для вывода (с флагом -l).

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


-c файла (т.е. время создания файла, изменения режима доступа к нему и т.п.) для сортировки (с
флагом -t) или для вывода (с флагом -l).

-p Если файл является каталогом, то выдавать после его имени символ /.

Если файл является каталогом, то выдавать после его имени символ /; если файл является
-F
выполняемым, то выдавать после его имени символ *.

-b Выдавать непечатные символы, входящие в имя файла, в восьмеричном виде (ddd).

-q Выдавать непечатные символы, входящие в имя файла, в виде символа ?.

-i Выдавать в первой колонке номера описателей файлов.

-s Выдавать размер файлов в блоках (включая косвенные блоки).

Рассматривать каждый аргумент как каталог и выводить его содержимое. Этот флаг отменяет флаги
-f -l, -t, -s, -r и включает флаг -a. Сортировка имен файлов не производится; имена выдаются в таком
порядке, в каком они перечислены в каталоге.

52
Теперь несколько примеров наиболее полезных опций.
Пример как вывести список только каталогов:
user@localhost:~$ ls -d -1 /home/user/*/
/home/user/Desktop/
/home/user/Downloads/
/home/user/Dropbox/
/home/user/Images/
/home/user/Soft/
/home/user/Temp/
/home/user/VirtualBox VMs/
То же самое, но с использованием “длинного” (полного) вывода о каталогах:
user@localhost:~$ ls -dl /home/user/*/
drwxr-xr-x 2 user user 4096 May 6 10:22 /home/user/Desktop/
drwxr-xr-x 2 user user 4096 May 5 10:38 /home/user/Downloads/
drwx—— 16 user user 4096 May 6 07:40 /home/user/Dropbox/
drwxr-xr-x 2 user user 4096 May 5 12:00 /home/user/Images/
drwxr-xr-x 2 user user 4096 May 5 18:29 /home/user/Soft/
drwxrwxr-x 2 user user 4096 May 5 20:15 /home/user/Temp/
drwxrwxr-x 4 user user 4096 May 5 19:09 /home/user/VirtualBox VMs/
Ключ -l весьма полезен, так как позволяет проверять владельца и права на файлы/каталоги:
user@localhost:~$ ls -l
total 32
drwxr-xr-x 2 root root 4096 Aug 23 2012 bin
drwxr-xr-x 2 root root 4096 Aug 23 2012 etc
drwxr-xr-x 2 root root 4096 Aug 23 2012 games
drwxr-xr-x 2 root root 4096 Aug 23 2012 include
drwxr-xr-x 4 root root 4096 May 5 11:13 lib
lrwxrwxrwx 1 root root 9 May 5 10:22 man -> share/man
drwxr-xr-x 2 root root 4096 Aug 23 2012 sbin
drwxr-xr-x 7 root root 4096 Aug 23 2012 share
drwxr-xr-x 2 root root 4096 Aug 23 2012 src
Для вывода информации о скрытых файлах (начинаются с точки) используйте ключ -a:
user@localhost:~$ ls -la
total 524
drwxr-xr-x 37 user user 4096 May 6 21:20 .
drwxr-xr-x 3 root root 4096 May 5 10:25 ..
drwx------ 3 user user 4096 May 5 10:39 .adobe
-rw------- 1 root root 517 May 5 11:53 .bash_history
-rw-r–-r–- 1 user user 220 May 5 10:25 .bash_logout
-rw-r–-r–- 1 user user 133 May 5 11:52 .bashrc
drwx------ 17 user user 4096 May 5 18:29 .cache
drwxrwxr-x 3 user user 4096 May 5 10:54 .compiz-1
drwx------ 20 user user 4096 May 6 10:38 .config
drwx------ 3 user user 4096 May 5 10:38 .dbus

Кратко остановимся на обозначениях прав доступа и обозначениях файлов/каталогов. Первый
символ:
 d – файл является каталогом;
 b – файл является специальным блочным файлом;
 c – файл является специальным символьным файлом;

53
 p – файл является именованным каналом;
 – – обычный файл.
Далее следуют три группы символов, обозначающих права доступа – r (read), w (write), x (execute) –
чтение, запись в файл/каталог и выполнение соответственно.
Обычный вывод ls без ключей выводит все файлы/каталоги одной строкой. Что бы вывести их в
колонку – выполняем:
user@localhost:~$ ls -1
Desktop
Downloads
Dropbox
file1.txt
file2.txt
Images
Soft
Temp
VirtualBox VMs
Ключ -h используется для вывода информации о размере в “человеко удобном” виде, т.е. в Kb,
Mb, Gb:
user@localhost:~$ ls -lh
total 36K
drwxr-xr-x 2 user user 4.0K May 6 10:22 Desktop
drwxr-xr-x 2 user user 4.0K May 5 10:38 Downloads
drwx------ 16 user user 4.0K May 6 07:40 Dropbox
-rw-r–-r–- 1 root root 2 May 6 21:06 file1.txt
-rw-r–-r–- 1 root root 2 May 6 21:06 file2.txt
drwxr-xr-x 2 user user 4.0K May 5 12:00 Images
drwxr-xr-x 2 user user 4.0K May 5 18:29 Soft
drwxrwxr-x 2 user user 4.0K May 5 20:15 Temp
drwxrwxr-x 4 user user 4.0K May 5 19:09 VirtualBox VMs
Отсортировать файлы/каталоги по их размеру, начиная с самого большого:
user@localhost:~$ ls -lS /var/log/
total 4152
-rw-r–-r–- 1 root root 1823273 May 6 19:46 dpkg.log
-rw-r----- 1 syslog adm 825505 May 6 08:05 syslog.1
-rw-r----- 1 syslog adm 589203 May 6 19:25 kern.log
-rw-r–-r–- 1 root root 47105 Aug 23 2012 bootstrap.log
-rw-r–-r–- 1 root root 37440 May 6 19:46 aptitude
-rw-r–-r–- 1 root root 20584 May 6 07:39 pm-
powersave.log
-rw-r----- 1 root adm 14329 May 5 11:38 dmesg.1.gz
-rw-r–-r–- 1 root root 6167 May 6 07:39 kdm.log
drwxr-xr-x 2 root root 4096 May 5 10:25 apt
-rw-r----- 1 root adm 31 Aug 23 2012 boot
-rw-r----- 1 syslog adm 0 May 5 10:38 ufw.log
Осотрировать файлы/каталоги по дате последней модификации, новые – в конце списка:
user@localhost:~$ ls -rtl /var/log/
total 4152
drwx------ 2 speech-dispatcher root 4096 Feb 6 2012 speech-
dispatcher
drwxr-xr-x 2 root root 4096 Mar 12 2012 unattended-
upgrades

54
drwxr-xr-x 2 root root 4096 Aug 10 2012 dist-upgrade

-rw-r–-r–- 1 root root 47105 Aug 23 2012 bootstrap.log

-rw-r–-r–- 1 root root 2990 May 5 19:20
fontconfig.log

-rw-r----- 1 syslog adm 60874 May 6 21:14 syslog
Что бы вывести новые в начале списка – используйте комбинацию опций без ключа -r:
user@localhost:~$ ls -tl /var/log/
То же самое, но сортировать по дате последнего доступа к файлу, а не дате его модификации,
используйте ключ -u:
user@localhost:~$ ls -tlu /var/log/
Вывести список файлов/каталогов, разделённый на 5 колонок, разделённых на всю ширину
окна:
user@localhost:~$ ls /usr/local | pr -T5 -W$COLUMNS
bin games lib sbin src
etc include man share
Добавлять символ обозначения принадлежности файла/каталога – каталог (/), исполняемый
файл (*), FIFO (|), символьная ссылка (@), сокеты семейства AF_UNIX (=):
user@localhost:~$ ls -F -1
Desktop/
Downloads/
Dropbox/
file1
file1.txt
file2
file2.txt
file3
file4.txt@
Images/
Soft/
Temp/
VirtualBox VMs/
Впрочем, ту же информацию выводит и ls -l – первый символ d для каталогов (directory) и ->; для
ссылок:
user@localhost:~$ ls -l
total 36
drwxr-xr-x 2 user user 4096 May 6 10:22 Desktop

lrwxrwxrwx 1 root root 9 May 6 21:20 file4.txt -> file1.txt
Выводить список через запятую:
user@localhost:~$ ls -m
Desktop, Downloads, Dropbox, file1, file1.txt, file2, file2.txt,
file3, file4.txt, Images, Soft, Temp, VirtualBox VMs
Вывести список рекурсивно, включая подкаталоги и их содержимое:
user@localhost:~$ ls -R
.:
Desktop
Downloads
Dropbox

55
Images
Soft
Temp
VirtualBox VMs

./Desktop:
PDF-Viewer.desktop
PDF-Viewer.lnk

./Downloads:

./Dropbox:
172210-1920×1080.jpg
271027-1366×768.jpg

Остортировать файлы/каталоги в обратном алфавитном порядке:
user@localhost:~$ ls -r
VirtualBox VMs Temp Soft Images file4.txt file3 file2.txt file2
file1.txt file1 Dropbox Downloads Desktop
Вывести информацию о номерах inode файлов и каталогов:
user@localhost:~$ ls -i -1
2368762 Desktop
1969746 Downloads
1987155 Dropbox
1987223 file1
1969890 file1.txt
1987865 file2
1969805 file2.txt
1987866 file3
1987863 file4.txt
1969751 Images
2141585 Soft
2368300 Temp
2141811 VirtualBox VMs
Вывести информацию о пользователе/группе в виде UID и GID, вместо символьных имён:
user@localhost:~$ ls -n
total 36
drwxr-xr-x 2 1000 1000 4096 May 6 10:22 Desktop
drwxr-xr-x 2 1000 1000 4096 May 5 10:38 Downloads
drwx------ 16 1000 1000 4096 May 6 07:40 Dropbox
-rw-r–-r–- 1 0 0 0 May 6 21:10 file1
-rw-r–-r–- 1 0 0 2 May 6 21:06 file1.txt
-rw-r–-r–- 1 0 0 0 May 6 21:10 file2
-rw-r–-r–- 1 0 0 2 May 6 21:06 file2.txt
-rw-r–-r–- 1 0 0 0 May 6 21:10 file3
lrwxrwxrwx 1 0 0 9 May 6 21:20 file4.txt -> file1.txt
drwxr-xr-x 2 1000 1000 4096 May 5 12:00 Images
drwxr-xr-x 2 1000 1000 4096 May 5 18:29 Soft
drwxrwxr-x 2 1000 1000 4096 May 5 20:15 Temp
drwxrwxr-x 4 1000 1000 4096 May 5 19:09 VirtualBox VMs

56
19 Создание, копирование и удаление файлов в Linux

19.1 Создание пустого файла


Выполнить данную операцию в Linux можно несколькими способами. Целесообразнее всего
использовать команду touch. Она применяется для обновления времени доступа к файлу, но в
случае отсутствия создает его. После команды touch необходимо указать место расположения
создаваемого файла. Если требуется создать несколько файлов, просто запишите их имена через
пробел. Например, «touch имя_первого_файла директория/имя_второго_файла»
Остальные способы вы можете увидеть в примере, приведенном ниже. Они не так очевидны и
больше всего похожи на нецелевое использование возможностей операционной системы.
Поэтому, если вы создаете файл внутри Bash-скрипта лучше использовать touch.
Пример базового способа создания файла
user@localhost:~$ touch ~/todo-list.txt
Пример других неочевидных способов
user@localhost:~$ > ~/name_file
user@localhost:~$ echo > todo-list.txt
user@localhost:~$ cp /dev/null todo-list.txt
user@localhost:~$ cat > todo-list.txt

19.2 Создание папок в Linux


Создание папок в Linux выполняется с помощью замечательной утилиты — mkdir. Все что она
может — это создавать папки. Рассмотрим ее синтаксис:
user@localhost:~$ mkdir опции имя_папки
Опций в утилиты не так много, а передавать программе вы чаще всего будете только один
параметр — имя папки
Для создания каталога в текущей директории наберите следующую команду:
user@localhost:~$ mkdir folder1
В текущей директории будет создана папка с указанным именем. Если нужно создать папку в
другой директории, перед именем укажите путь к той директории:
user@localhost:~$ mkdir home/user/Downloads/folder
Утилита создаст папку в подпапке Downloads. Можно использовать не только путь относительно
текущей папки, но и указать полный путь в файловой системе:
user@localhost:~$ mkdir ~/Downloads/folder
user@localhost:~$ mkdir home/user/folder
Например, нам нужно создать несколько папок, тогда можно сделать все одной командой:
user@localhost:~$ mkdir {folder1,folder2,folder3}
Если нужно создать папку Ubuntu, а в ней еще несколько папок, можно воспользоваться
командой:
user@localhost:~$ mkdir -p ~/Downloads/Ubuntu/folder/folder/folder
Или, например, сложная структура:
user@localhost:~$ mkdir -p ~/Downloads/Ubuntu/folder/
{folder1,folder2,folder3}

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


Копирование файла в Linux происходит с помощью команды cp. Общий принцип использования

57
довольно прост. После команды cp, через пробел указываются имена файлов, предназначенных
для копирования, а последний параметр будет считаться местом назначения. Также для захвата
нескольких фалов вы можете использовать механизмы подстановки. В общем виде команда
копирования может выглядеть как :
«cp имя_первого_файла имя_второго_файла место_назначения».
Обратите внимание: Linux при копировании позволяет задать новому файлу другое имя. Это
возможно при явном указании имени в последнем параметре. Если местом назначения является
директория, новый файл будет размещен в неё и назван как оригинал.
Пример копирования с изменением имени
user@localhost:~$ cp docs/file.txt archive/old-file.txt
Пример копирования с сохранением имени
user@localhost:~$ cp docs/file.txt archive
Пример копирования файлов подстановкой
user@localhost:~$ cp docs/*.txt archive

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


Команда mv — перемещение, переименование файла (каталога)
Команда mv чем та похоже на команду cp, но в отличии команды cp которая копирует файл,
команда mv удаляет исходный файл (перемещает).
Например, переместим файл с одной папки в другую:
user@localhost:~$ mv /folder1/file1 /folder2/file1
Так же можно переместить файл с одной папки в другую и переименовать файл:
user@localhost:~$ mv /folder1/file1 /folder2/file2
Если необходимо просто переименовать файл, то используем следующую команду:
user@localhost:~$ mv /folder1/file1 /folder1/file2
Для удобства можно перейти в каталог, что бы не указывать полный путь к файлу:
user@localhost:~$ cd /folder1/
user@localhost:~$ mv file1 file2
Простой пример, переместим изображение в каталог «Pictures»:
user@localhost:~$ mv /home/user/TITEL.BMP /home/user/Pictures
Переименуем файл TITEL.BMP на новой имя:
user@localhost:~$ mv /home/user/Pictures/TITEL.BMP
/home/user/Pictures/picture1.BMP
На следующем примере мы переместим все файлы из каталога «folder1»в каталог «folder2»:
user@localhost:~$ mv /home/user/folder1/* /home/user/Pictures
А если указать расширение файлов, то переместится файлы только с данным расширением,
например:
user@localhost:~$ mv /home/user/folder1/*.png /home/user/Pictures
Каталог «folder1» при этом не удаляется.
Помимо работы с файлами, команда mv может работать с каталогами.
Например переместим каталог «folder1» в каталог «Pictures»:
user@localhost:~$ mv /home/user/folder1 /home/user/Pictures

58
В данном случае, каталог «Pictures» существует, поэтому происходит перемещение а не
переименование каталога.
В следующем примере переименуем каталог «folder1» в «folder2»:
user@localhost:~$ mv /home/user/folder1 /home/user/folder2
В данном случае, каталог «folder1» был переименован в каталог «folder2», так как каталога
«folder2» не существовало.

19.5 Удаление файла


Для удаления файла используйте команду rm. Она действует по аналогии с предыдущими
примерами. Выражение в общем виде может быть записано как
«rm имя_первого_файла имя_второго_файла». Для удаления нескольких файлов можно
также использовать механизмы подстановки.
Команда «rm ~/temp/archive*.txt» удалит все файлы, расположенные в папке temp,
имеющие расширение .txt и начинающиеся со слова archive.
Есть ещё несколько способов осуществления данной операции. Например, команда find обычно
используемая для поиска файлов и директорий, позволяет также выполнять над ними действия.
Так строка «find ~/temp -regex 'archive[a-f0-9\-]*\.txt' - delete \»
выполнит тоже действие, что и пример, приведенный выше.
Пример удаления нескольких файлов
user@localhost:~$ rm first-file second-file
Пример удаления файлов через find
user@localhost:~$ find ~/temp -regex 'archive[a-f0-9\-]*\.txt

20 Поиск файлов в Linux

20.1 Поиск исполняемой программы


Не самой распространенной задачей, но всё же имеющей место быть, является поиск
исполняемого файла программы. Для этого в Linux есть специальная команда which. Она
принимает в качестве параметра имя программы, а после выполнения выводит в терминал список
с расположением совпадающих файлов.
Пример поиска системной программы
user@localhost:~$ which cat
/bin/cat
Пример поиска пользовательской программы
user@localhost:~$ which docker-stack
/home/username/.local/bin/docker-stack
Заметка: Команда which ищет только те файлы, у которых есть право на выполнение как
программы. Поиск осуществляется по директориям, заданным в переменной окружения PATH.
Содержимое переменной PATH может отличаться для различных пользователей.
Чтобы охватить как можно большее количество системных директорий, необходимо войти в
систему под учетной записью администратора.

59
20.2 Поиск файлов через базу данных
Linux имеет встроенные механизмы индексирования файловой системы и осуществления
быстрого поиска. Для этого раз в день запускается сканирование директорий и формирование
системной базы данных. Обычно она располагается в /var/lib/mlocate/mlocate.db. Механизм
сканирования также можно вызвать вручную с помощью команды updatedb.
Для осуществления поиска файлов в системной базе данных нужно использовать команду
locate. Просто укажите имя файла сразу за именем команды. Например, «locate my-
favorite-book».
Пример поиска по вхождению фразы
user@localhost:~$ locate config
/var/lib/dpkg/info/cups-bsd.config
/var/lib/dpkg/info/dash.config
/var/lib/dpkg/info/debconf.config
/var/lib/dpkg/info/dictionaries-common.config
...
Заметка: Поиск, производимый командой locate очень быстр. Однако учитывайте тот факт, что
системная база данных может быть не актуальной на момент осуществления операции. Механизм
сканирования файловой системы, время его проведения и вообще наличие такого инструмента
может разниться в различных дистрибутивах Linux.

20.3 Поиск по текстовому содержимому


Команды locate и which полезны лишь при поиске файла по его имени. Однако для проверки
текстового содержимого документов на вхождение искомых данных нужно использовать другой
инструмент. Linux имеет специальную команду grep, которая принимает шаблон для поиска и
имя файла. В случае нахождения совпадений, они будут выведены в терминал. В общем виде
выражение можно составить как «grep шаблон_поиска имя_файла».
Шаблон для поиска является регулярным выражением, а имя файла может быть задано с
использованием механизмов подстановки и групповых символов. Таким образом, поиск текста
осуществляется по нескольким файлам сразу.
Команда grep имеет много дополнительных опций. Например, опция -v заставит выводить
текстовые строки, не совпадающие с шаблоном, а опция -P позволит интерпретировать регулярное
выражение в стиле языка программирования Perl.
Некоторые дополнительные ключи команды grep:
 -v - Выводи реверсивные результаты. Вместо того чтобы вывести строки где искомое было
найдено — выводи те строки где искомой подстроки нет.
 -c - Отключает стандартный способ вывода результата и вместо этого отображает только
число обозначающее количество найденых строк.
 -i - Делает поиск регистронезависимым
 -w - Ведет поиск по цельным словам. Например при обычном поиске строки ‘wood’ grep
может найти слово ‘hollywood’. А если используется данный ключ то будут найдены только
строки где есть слово ‘wood’.
 -l - Выводит только имена файлов где была найдена строка.
 -r - Производит поиск рекурсивно по всем поддиректориям.

60
Пример как достать все сообщения ядра из лог-файла
user@localhost:~$ grep "kernel" /var/log/syslog
Пример комбинирования grep с выводом других команд
user@localhost:~$ ls -l ~/ | grep "username"
Пример использование grep в чистом виде
user@localhost:~$ grep '12:00' /home/user/backup/log.txt
Эта команда показывает как можно использовать grep для того чтобы получить строки из файла
содержащие подстроку указаную в командной строке. Файл не обязательно должен оканчиваться
на .txt. Показаная выше команда производит поиск подстроки 12:00 в файле
/home/user/backup/log.txt и отображает все строки где эта подстрока встречается.
Эта комбинация может быть использована например для поиска бекапов которые происходили в
12:00.
Пример использование grep -v
user@localhost:~$ grep -v '12.00' /home/user/backup/log.txt
А вот эта команда (с использованием ключа -v) наоборот покажет только те строки где подстрока
’12:00′ НЕ встречается.
Пример использование grep -l
user@localhost:~$ grep -l 'delay' /code/*.c
Эта команда будет искать все файлы оканчивающиеся на .c и текст в найденых файлах
соответствующий подстроке 'delay' и в конечном итоге выведет только имена файлов где эта
подстрока встречается.
Пример использование комбинации из grep -w
user@localhost:~$ grep -w '\<bay' * $ grep -w 'watch\>' *
Эта команда уже более сложная и состоит из комбинации двух команд grep. Первая ищет строки
которые начинаются со слова ‘bay’ а вторая строки которые заканчиваются на слово ‘watch’.
Пример использования grep вместе с потоками
user@localhost:~$ ls -l | grep rwxrwxrwx
Команда ls -l отображает подробный список файлов в директории. Часть grep rwxrwxrwx фильтрует
результат полученый от ls -l и выводит только те директории у которых установлены
соответствующие права доступа. В данном случае это открытый доступ на чтение, запись и поиск
для всех пользователей и групп. Так что вместо того чтобы увидеть полный список файлов вы
увидите только те файлы у которых установлены нужные вам права доступа.
Вывод от команды grep может также быть направлен потоком в другую команду, например как в
следующем примере:
user@localhost:~$ du | grep 'mp3' | more
Пример отображенный выше выводит постранично список mp3 файлов найденых в текущей
директории.
Следующая команда отобразит все строки в файле /home/user/script1 которые начинаются с
символа ‘#’. Определение тип ‘^#’ означает что символ ‘#’ должен быть первым символом с троке.
user@localhost:~$ grep '^#' /home/user/script1 | more
Эта команда ищет строки содержащие в первом символе цифры от 0 до 9 а потом выводит только
те строки которые не попали в результаты поиска. Как вы видите — был использован ключ ‘-v’
означающий реверсивный поиск.
user@localhost:~$ grep -v '^[0-9]' /home/user/backup/log.txt | more
Важно: Необходимо заключать искомые строки в одинарные кавычки как указано в двух
предыдущих примерах для того чтобы интерпретатор командной строки мог воспринимать их

61
корректно. Иначе интерпретатор может понять это как другую команду и результат выполнения
будет непредсказуем.
Универсальный поиск по файлам
Своего рода швейцарским ножом в поиске файлов является команда find. Отметим, что она
имеет множество опций, которые могут кардинально изменять механизм поиска. Мы изложим
лишь основные принципы, а с остальными возможностями ознакомьтесь в справке по команде.
Базовый принцип использования find состоит в указании директории поиска и опций. Например,
выражение «find ~/ -name *.cpp» осуществит поиск файлов, имеющих расширение «cpp»
по всем каталогам, находящимся в личной директории пользователя.
Значение, указанное после опции -name, задает шаблон соответствия имени файла. Вы можете
использовать опцию -type для указания типа файла, где в качестве значений нужно использовать
специальные буквы: d — директория, f — файл, l - символическая ссылка и т. д. Опции -user, -group
и -size также довольно полезны. Их значениями являются имя пользователя, имя группы и размер
файла в байтах.
С помощью опции -exec каждому файлу, предназначенному для установки соответствия, можно
добавить произвольную обработку. Таким образом, появляется возможность осуществления
поиска, как по имени файла, так и по содержимому. Ниже приводится пример комбинирования
команды find и grep за счет использования опции -exec.
Пример поиска по имени файла
user@localhost:~$ find ~/ -name *.cpp
Пример поиска по конкретному пользователю и группе
user@localhost:~$ find ~/ -name *.cpp -user 'my-username' -group 'my-
group'

20.4 Подсчет слов в файле


Команда wc (Word Count - подсчёт слов) используется для подсчёта числа строк и слов в файлах.
Она также полезна для подсчёта байтов, символов и длины самой длинной строки.
Синтаксис:
wc [опции] [файл(ы)]
Опции:
 -l - вывод количества новых строк;
 -w - вывод количества слов;
 -m - вывод общего количества символов;
 -c - вывод количества байт;
 -L - вывод длины самой длинной строки в заданном тексте.
Примеры использования:
Пример как определить число пользователей в системе:
user@localhost:~$ wc -l /etc/passwd
Пример как посчитать количество слов в файле:
user@localhost:~$ wc -w /data/file
Пример как посчитать количество файлов в папке:

62
user@localhost:~$ find /var/log/ -type f | wc -l
Пример как посчитать количество запущенных процессов php-fpm:
user@localhost:~$ ps -A | grep php-fpm | wc -l

21 Права доступа файлов и папок в Linux

21.1 Система прав доступа файлов


Операционная система Linux является многопользовательской. Это позволяет нескольким людям
одновременно или по очереди использовать одно и то же окружение: файловую систему, ресурсы,
программы. Для исключения несанкционированного доступа пользователя к определенной
информации или запуска небезопасной программы была разработана специфичная система прав.
Каждый файл или директория хранит особые метаданные:
 Идентификатор владельца файла.
 Идентификатор группы файла.
 Девять битов прав доступа владельца, группы и остальных пользователей.
 Другие административные биты.
Информацию о правах доступа, а также имени владельца и группы можно получить с помощью
команды ls, используя её дополнительную опцию -l. Таким образом, результат выполнения
программы примет подробный вид.
user@localhost:~$ ls -l ~/
drwxr-xr-x 3 user user 4096 июл 28 2016 Видео
drwxr-xr-x 3 user user 4096 июн 12 14:23 Документы
drwxr-xr-x 3 user user 20480 окт 10 22:28 Загрузки
drwxr-xr-x 2 user user 4096 сен 30 17:45 Изображения
drwxr-xr-x 2 user user 4096 июн 17 2016 Музыка
...
Каждая строка вывода команды ls формируется установленным набором данных. Ниже дается
подробный разбор следующего содержания «-rw-r—r-- 1 user user 4096 июн 12 14:23 Документы».
Участок «-rw-r—r--» определяет информацию о типе файла, а также правах доступа владельца,
группы и остальных пользователей. Первый символ обозначает тип файла, он может принимать
следующие значения: d — директория, l — символическая ссылка, - - обычный файл (прочерк).
Оставшаяся часть разбита на комбинации по три символа. Первая комбинация отвечает за права
владельца, вторая за группу, а третья предназначена для остальных пользователей.
Комбинация, определяющая права на файл, содержит три символа «rwx», следующих друг за
другом. Они имеют определенный смысл: r — право на чтение файла, w — право на изменение, x
— право на выполнение как программы. Если какая либо буква заменена символом «-» это
означает, что данный вид операции запрещен.
Число «1» говорит о количестве вложенных файлов. Если бы данная строка относилась к
определению параметров директории, число могло иметь любое значение больше нуля. Для
файлов оно всегда равно единице.
Строка «user user» определяет имя владельца и группы соответственно. Далее содержится
информация о весе файла в байтах, дате создания и его имени.

21.2 Отличия прав доступа для папок


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

63
Для файлов они устанавливают права на чтение, запись и выполнение. Однако в отношении папок
их роль меняется кардинально.
Бит «r» устанавливает пользователю право на просмотр содержимого директории с помощью
команды ls. Бит «x» дает право на перемещение в папку, используя команду cd. Если
одновременно установлены биты «x» и «w», пользователь получает право на создание файлов
внутри директории.

21.3 Восьмеричное представление прав


Выше рассматривались базовые принципы работы с системой прав Linux. Мы узнали, что получить
текущие права файлов и директорий можно с помощью команды ls и её опции -l. Результат
выполнения содержит примерно такой участок «rwxrw-rw-». Это текстовое представление прав
доступа, разделенное на три сегмента по три буквы.
Сегменты отвечают за права владельца, группы и остальных пользователей. Буквы означают
следующее: r — разрешение на чтение файла, w — возможность изменения, x — право
выполнения файла как программы, - - прочерк говорит о запрете действия. В Linux помимо
буквенной записи зачастую используется и числовая.
Числовая запись прав доступа представляется в восьмеричной системе счисления. Она может
показаться сложной для понимания, однако на практике оказывается более удобной. Такой подход
подразумевает, что все права можно записать всего тремя числами. Каждое из них, как и в
предыдущем случае, отвечает за права владельца, группы и остальных пользователей. Число
формируется как сумма величин: 4 — право на чтение, 2 — право на запись, 1 — разрешение на
выполнение как программы.
Таким образом, если мы хотим дать владельцу неограниченные права, группе право на чтение и
редактирование, а всем остальным запретить доступ полностью, можно использовать две формы
записи: «rwxrw----» и «760».

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


В Linux есть универсальная команда chmod, работающая как с числовой записью прав, так и
буквенной. В случае буквенного представления общий вид использования команды выглядит как
«chmod [ugo][+-=][rwx] имя_файла». Квадратные скобки, говорят об опциональности
параметров.
Первые квадратные скобки определяют, для кого изменяется право доступа: u — владелец файла,
g — группа, o — остальные пользователи. Вторые квадратные скобки описывают возможные
действия: «+» - добавление права, «-» - удаление права, «=» - использование точно заданных
значений. Содержимое третьих скобок мы разбирали выше.
Пример как убрать все права для владельца, группы и остальных
user@localhost:~$ ls -l ~/temp-file.txt
-rw-rw-r-- 1 user user 0 июл 18 2016 temp-file.txt
user@localhost:~$ chmod ugo-rwx temp-file.txt
user@localhost:~$ ls -l ~/temp-file.txt
---------- 1 user user 0 окт 17 22:36 temp-file.txt
Разрешим владельцу читать и изменять
user@localhost:~$ chmod u+rw temp-file.txt
user@localhost:~$ ls -l ~/temp-file.txt
-rw------- 1 user user 0 окт 17 22:36 temp-file.txt
Разрешим группе и остальным читать и выполнять
user@localhost:~$ chmod go+rx temp-file.txt

64
user@localhost:~$ ls -l ~/temp-file.txt
-rw-r-xr-x 1 user user 0 окт 17 22:36 temp-file.txt
Используем жесткую установку правил. Обратите внимание на исчезновение права выполнения
user@localhost:~$ chmod go=r temp-file.txt
user@localhost:~$ ls -l ~/temp-file.txt
-rw-r--r-- 1 user user 0 окт 17 22:36 temp-file.txt
Использование восьмеричной записи при изменении прав доступа аналогично буквенной. В
общем виде команду можно записать как «chmod [0-7][0-7][0-7] имя_файла». Каждая
квадратная скобка определяет единственное число от 0 до 7.
Назначение прав с помощью числовой записи
user@localhost:~$ chmod 764 temp-file.txt
user@localhost:~$ ls -l ~/temp-file.txt
-rwxrw-r-- 1 user user 0 окт 17 22:36 temp-file.txt
Если вам нужно поменять права для нескольких файлов, используйте механизмы постановки и
опцию -R. Подстановка обеспечит обработку всех файлов, попавших под заданный шаблон, а за
счет опции -R поиск будет продолжен и во вложенных директориях.
Заметка: Команда chmod также изменяет права доступа для директорий. При рекурсивном
назначении и использовании механизмов подстановки будьте внимательны. Задавая шаблон
соответствия, исключайте возможность совпадений с нежелательными файлами или
директориями.

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


При создании файла или директории, им в качестве владельца назначается пользователь, под
которым осуществлен вход в систему. Помимо самого пользователя будет приписана и его группа.
Как правило, основная группа имеет то же самое имя, что и пользователь. Вы можете посмотреть
список имен и идентификаторов всех доступных групп в файле /etc/group.
user@localhost:~$ cat /etc/group
user:x:1000:
sambashare:x:128:user
nm-openvpn:x:131:
memcache:x:132:
mysql:x:129:user
...
В Linux для изменения группы используется команда chgrp. Первым параметром она принимает
имя или идентификатор группы, а вторым имя файла или директории. Изменения могут
применяться сразу к нескольким файлам, аналогично команде chmod, за счет механизмов
подстановки и опции -R.
Заметка: chgrp изменит права файла или директории только в том случае, если пользователь,
вызвавший команду на выполнение, сам состоит в указанной группе.
Изменение владельца файла происходит с помощью команды chown. В общем виде вызов
команды можно записать как «chown владелец:группа имя_файла». Как вы могли заметить,
команда chown может устанавливать и группу файла, если указать её имя после имени нового
владельца. При этом имя пользователя должно быть отделено от группы двоеточием «:».
Изменение группы специальной функцией
user@localhost:~$ chgrp mysql ~/temp-file.txt
ls -l ~/temp-file.txt
-rwxrw-r-- 1 user mysql 0 окт 17 22:36 temp-file.txt
Изменение владельца и группы одновременно

65
user@localhost:~$ sudo chown mysql:docker ~/temp-file.txt
ls -l ~/temp-file.txt
-rwxrw-r-- 1 mysql docker 0 окт 17 22:36 temp-file.txt
Заметка: Если у вас нет прав на редактирование файла, единственно возможным способом
осуществить изменение его группы или пользователя является выполнение команды chown от
лица администратора.

22 Специальные биты доступа в Linux

22.1 Роль специальных битов


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

22.2 Бит Setuid


Признак setuid также сокращенно называют suid (set user ID upon execution — «установка ID
пользователя во время выполнения»). В Linux он может быть установлен только для файла. Бит
suid позволяет всем пользователям имеющим доступ на выполнение файла запускать его с
правами владельца. Если программа принадлежит администратору, любой пользователь, запустив
ее, будет взаимодействовать с системой как администратор.
Специальный бит suid устанавливается с помощью команды chmod. В буквенной записи
назначения прав используйте символ «s». Например, в общем виде команду можно записать как
«chmod u+s имя_файла». Обратите внимание, устанавливать этот бит для группы и остальных
пользователей не имеет смысла. Если suid задан для владельца, а для группы и остальных
пользователей дано разрешение на выполнение файла, то запуск будет происходить от имени
владельца.
Восьмеричная запись немного сложнее. Мы говорили, что права представлены с помощью трех
символов, каждый из которых является суммой значений: 4 — право на чтение, 2 — право на
запись, 1 — разрешение на выполнение как программы. Чтобы разрешить владельцу и группе все
действия, а остальных пользователей игнорировать нужно, установить права «770». Бит setuid
также добавляется к этой последовательности за счет сложения. Однако он имеет числовое
значение «4000», что меняет последовательность на «4770».
Пример установки бита setuid для нового временного файла
user@localhost:~$ touch ~/temp-file.txt
user@localhost:~$ chmod u+x ~/temp-file.txt
user@localhost:~$ ls -l ~/temp-file.txt
-rwxrw-r-- 1 user user 0 окт 20 22:21 /home/user/temp-file.txt
user@localhost:~$ chmod u+s ~/temp-file.txt
user@localhost:~$ ls -l ~/temp-file.txt
-rwsrw-r-- 1 user user 0 окт 20 22:21 /home/user/temp-file.txt
Команда «ls -l» позволяет распознать наличие бита setuid за счет специальной буквы «s», которая
заменяет «x» в правах владельца. При этом маленькая буква «s» говорит о том, что до назначения

66
setuid у владельца уже было право на выполнение, а большая «S» свидетельствует об обратном.
Заметка: Устанавливайте специальный бит setuid только по необходимости. Linux считается очень
защищенной операционной системой от разного рода атак. Однако бездумное распределение
прав может привести к нежелательным последствиям.

22.3 Бит Setgid


В отличие от предыдущего специального бита Setgid (set group ID upon execution — «установка ID
группы во время выполнения» ) может быть установлен как для файла, так и для директории. Если
он применен для исполняемого файла, любой пользователь, запустивший его на выполнение,
будет иметь права группы, привязанной к этому файлу. Установка Setgid для директории имеет
другое значение. Ко всем файлам, вновь созданным в такой директории, автоматически
привязывается группа директории, а не создателя.
Аналогично setuid вы можете использовать как буквенную запись назначения прав, так и
восьмеричную. В буквенной записи используйте символ «s» с привязкой к группе, а в
восьмеричной системе сложите с основной последовательностью чисел значение «2000».
Пример установки бита Setgid для временного файла
user@localhost:~$ ls -l ~/temp-file.txt
-rwxrw-r-- 1 user user 0 окт 20 22:21 /home/user/temp-file.txt
user@localhost:~$ chmod g+s ~/temp-file.txt
user@localhost:~$ ls -l ~/temp-file.txt
-rwsrwSr-- 1 user user 0 окт 20 22:21 /home/user/temp-file.txt
Наличие специального бита Setgid можно увидеть, запустив команду «ls -l». Если он присутствует,
право на выполнение для группы будет заменено символом «s» или «S».

22.4 Бит Sticky


Последний бит из расширенных прав доступа Linux используется только для директорий. Его
наличие позволяет удалять файлы, присутствующие внутри директории, только их владельцам.
Назначение бита происходит в буквенной записи команды chmod с помощью символа «t», а в
восьмеричной за счет сложения основного ряда чисел со значением «1000».
Пример установки бита sticky для директории
user@localhost:~$ mkdir ~/new-directory
user@localhost:~$ ls -l ~/
drwxrwxr-x 2 user user 4096 окт 20 22:29 new-directory

user@localhost:~$ chmod +t ~/new-directory
user@localhost:~$ ls -l ~/
drwxrwxr-t 2 user user 4096 окт 20 22:29 new-directory

Как и в прошлых примерах, команда ls покажет наличие бита sticky. Маленькая буква «t» заменит
флаг «x» в участке, отвечающим за права остальных пользователей, а если «x» не был установлен,
на его месте появится большая «T».

23 Создание и распаковка архивов в Linux


Самой популярной для Linux утилитой для архивации есть tar. В случае с Linux для работы с
архивами достаточно базовых компонентов системы, а именно Tar, Gzip и Bzip2, которые при
создании сжатого архива работают как единое целое, т.к. сам по себе архиватор Tar не

67
предусматривает возможность сжатия данных то есть архивирование в linux это не одно и то же
что и сжатие файлов linux. Архивирование — это объединение нескольких небольших файлов в
один, с целю более удобной последующей передачи, хранения, шифрования или сжатия. Для
сжатия данных используется Gzip или Bzip2. Архивы, созданные с применением Gzip, обычно
имеют расширение .tar.gz, а при использовании Bzip2 — .tar.bz2. Сначала выполняется архивация,
затем сжатие, отдельными программами. Автоматический запуск некоторых утилит сжатия для
только что созданного архива поддерживается в tar и других подобных программах с помощью
специальных опций.
Также полезной возможностью архивации есть шифрование. Но теперь давайте рассмотрим какие
существуют утилиты, с помощью которых выполняется архивирование файлов linux и как ими
пользоваться.

23.1 Создание tar-архива без сжатия


Tar — это стандартная утилита, с помощью которой выполняется архивирование файлов Linux.
Постепенно из небольшой программы архивации она превратилась в мощный инструмент,
поддерживающий работу со многими вариантами архивов и алгоритмами сжатия. Программа
поддерживает большое количество параметров. Давайте рассмотрим ее синтаксис и основные
параметры:
$ tar опцииf файл_для_записи /папка_файлами_для_архива
А теперь разберем основные опции:
 A — добавить файл к архиву
 c — создать архив в linux
 d — сравнить файлы архива и распакованные файлы в файловой системе
 j — сжать архив с помощью Bzip
 z — сжать архив с помощью Gzip
 r — добавить файлы в конец архива
 t — показать содержимое архива
 u — обновить архив относительно файловой системы
 x — извлечь файлы из архива
 v — показать подробную информацию о процессе работы
 f — файл для записи архива
 -C — распаковать в указанную папку
 —strip-components — отбросить n вложенных папок
Теперь давайте рассмотрим архивирование файлов в Linux. Чтобы создать архив используйте
такую команду:
user@localhost:~$ tar -cf filename.tar file1 file2 fileN
Параметр —cf отвечает за создание архива filename.tar, в который войдут указанные файлы.
Вместо файлов могут быть указаны и директории.

23.2 Создание архива с использованием сжатия


Сжатый архив создается точно так же, только с опцией -z, это в случае, если использовалось
шифрование gizp, если нужно bzip то применяется опция -j. Поскольку для сжатия доступны как
минимум два метода, для использования каждого из них используется отдельный набор
параметров.

68
Пример сжатия Gzip:
user@localhost:~$ tar -cvzf filename.tar.gz dir_name
В данном случае мы попытались запаковать папку dir_name в архив filename.tar.gz. Из указанных
параметров -z указывает на использование метода Gzip, а -v выводит результаты процесса
создания архива с указанием упакованных файлов или папок.
Пример сжатия Bzip2:
user@localhost:~$ tar -cvjf filename.tar.bz2 dir_name
Данная команда аналогична предыдущей и имеет отличие в параметре –j, т.к. именно он отвечает
за использование метода сжатия Bzip2.

23.3 Распаковка архива


Для того, чтобы распаковать архив, используется команда:
user@localhost:~$ tar -xvf filename.tar.bz2
В данном случае архив filename.tar.bz2 будет распакован в ту папку, в которой вы находились в
момент запуска команды. Для того, чтобы распаковать архив в какую-либо другую директорию,
можно использовать команду:
user@localhost:~$ tar -xvf filename.tar.bz2 -C /path/to/folder
В этом случае архив распакуется в указанной директории.
Очень просто запомнить для упаковки используется опция c — Create, а для распаковки — x —
eXtract.

23.4 Просмотр содержимого архива без распаковки


Для этих целей используется следующая команда:
user@localhost:~$ tar -tf filename.tar.gz
В результате выполнения команды выведется список файлов и папок, хранящихся в архиве. Если в
перечень параметров добавить -v, то получится расширенный вывод информации о содержимом с
указанием размера файлов, прав доступа, именами владельцев и их групп, и т.п.
Просмотреть полный список возможностей архиватора tar можно при помощи команд:
tar --help #вызов справки по командам и параметрам
man tar #вызов расширенной документации

24 Процессы в Linux

24.1 Иерархия процессов


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

69
Каждый процесс, зарегистрированный в системе, получает уникальный идентификационный
номер PID (англ. process identifier). Linux устроен так, чтобы у каждого процесса был родитель,
который может следить за его состоянием. Это позволяет системе быть устойчивой к отказам.
Например, если в дочернем процессе произошла логическая ошибка, и он перестал отвечать,
родитель может уничтожить его и пересоздать.
Получить дерево процессов можно с помощью команды pstree. Она выводит в терминал
структуру, построенную из графических примитивов. Дочерние процессы лежат в ней правее и
соединены линиями с родителями. Обратите внимание на пример, приведенный ниже. Если
пройти по иерархии родителей, в итоге мы доберемся до единственного процесса с именем
systemd или init (в зависимости от дистрибутива). Это первый процесс, стартующий при
инициализации системы. Именно он в дальнейшем запустит важнейшие фоновые задачи и станет
их родителем.
user@localhost:~$ pstree
systemd─┬─ModemManager─┬─{gdbus}
│ └─{gmain}
├─NetworkManager─┬─dhclient
│ ├─dnsmasq
│ ├─{gdbus}
│ └─{gmain}
├─accounts-daemon─┬─{gdbus}
│ └─{gmain}
├─acpid
├─agetty
├─aptd───{gmain}
├─avahi-daemon───avahi-daemon
├─bluetoothd
├─colord─┬─{gdbus}
│ └─{gmain}
├─cron
├─dbus-daemon
...

24.2 Просмотр списка процессов


Для получения списка процессов, работающих в настоящее время, используется ряд команд. По
умолчанию команда ps отобразит только те процессы, которые были запущены вами через один
из доступных терминалов. Она также имеет ряд дополнительных опций, изменяющих характер
выводимых данных.
Некоторые опции, отбирающие процессы для отчёта:
 -A : все процессы;
 -a : связанные с конкретным терминалом, кроме главных системных процессов сеанса,
часто используемая опция;
 -N : отрицание выбора;
 -d : все процессы, кроме главных системных процессов сеанса;
 -e : все процессы;
 -p: только перечисленные процессы (следом указывается один или несколько PID);
 -f : расширение информации

70
 r : информация только о работающих процессах;
 x : процессы, отсоединённые от терминала.
Независимо от наличия опций, команда ps выдает для каждого процесса отдельную строку, но
содержимое этой строки может быть разным. В зависимости от заданных опций могут
присутствовать следующие поля:
 UID : идентификатор пользователя;
 PID : идентификатор процесса;
 PPID : идентификатор родительского процесса;
 C : приоритет процесса, используемый планировщиком задач;
 STIME : время старта процесса;
 TTY : терминал, с которым связан данный процесс;
 TIME : процессорное время, занятое этим процессом;
 CMD : команда, запустившая данный процесс «с некоторыми опциями выводит и каталог
откуда процесс был запущен»;
 STAT : состояние, в котором на данный момент находится процесс.
Для примера запустим текстовый редактор в фоновом режиме
user@localhost:~$ gedit &
[1] 18009
Теперь посмотрим вывод процессов текущего пользователя
user@localhost:~$ ps
PID TTY TIME CMD
17585 pts/2 00:00:00 bash
18009 pts/2 00:00:00 gedit
18017 pts/2 00:00:00 ps
Теперь посмотрим вывод всех доступных процессов в системе
user@localhost:~$ ps -A
PID TTY TIME CMD
1 ? 00:00:03 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 kworker/0:0H
6 ? 00:00:00 kworker/u16:0
7 ? 00:00:02 rcu_sched
...
Примечания:
 Альтернативой ps является команда top, удобно выводящая на экран постоянно
обновляющуюся информацию, однако top ограничена размерами окна, поэтому всё, что не
может поместиться на экран, просто игнорируется.
 Для команды ps удобно пользоваться конвейером и утилитой less для пролистывания
выводимой информации с помощью кнопок вверх и вниз, например ps ax | less
 С помощью утилиты grep удобно искать и выводить только нужные процессы, например ps
ax | grep smbd.
Команда ps позволяет сделать как бы "моментальный снимок" процессов, запущенных в системе.
В отличие от ps команда top отображает состояние процессов и их активность "в реальном режиме
времени". Команда top осуществит вывод таблицы со списком текущих процессов. Она
заблокирует терминал и будет обновлять данные через небольшие промежутки времени. Помимо

71
стандартной информации вывод будет содержать процентную долю загрузки процессора и
объема оперативной памяти. Попасть в строку ввода команд можно, нажав клавишу «Q». Список
процессов может быть отсортирован по используемому времени ЦПУ (по умолчанию), по
использованию памяти, по PID, по времени исполнения. Переключать режимы отображения
можно с помощью команд, которые программа top воспринимает. Это следующие команды
(просто нажимайте соответствующие клавиши, только с учетом регистра, то есть вместе с
клавишей Shift):
 <Shift>+<N> — сортировка по PID;
 <Shift>+<A> — Сортировка строк по максимальному потреблению различных системных
ресурсов. Полезна для быстрой идентификации задач, для которых в системе не хватает
ресурсов. ;
 <Shift>+<P> — сортировать процессы по использованию ЦПУ;
 <Shift>+<M> — сортировать процессы по использованию памяти;
 <Shift>+<T> — сортировка по времени выполнения;
 <Shift>+<Z> - Выбрать цвет подсветки.
Кроме команд, определяющих режим сортировки, команда top воспринимает еще ряд команд,
которые позволяют управлять процессами в интерактивном режиме.
 <t> - Включение и выключение выдачи на экран суммарных данных.
 <m> - Включение и выключение выдачи на экран информации об использовании памяти.
 <1> - По умолчанию выводятся данные для одного ЦП (ядра). Этот переключатель
позволяет увидеть данные по каждому ЦП.
 <f> - Вход в меню интерактивного конфигурирования данных, выдаваемых на экран
командой top. Полезна для настройки команды top для выполнения специфической
задачи.
 <c> - Абсолютный путь расположения модуля команды и её аргументы.
 <r> - Изменение приоритета процессов с помощью команды renice.
 <k> - Удаление процесса с помощью команды kill. Программа запрашивает у вас код
процесса и сигнал, который будет ему послан.
 <z> - Переключение между цветным / монохромным вариантом выдачи изображения.
 <q> - Выйти из программы
 <Пробел> - Немедленно обновить содержимое экрана.
 <n> - Изменить число отображаемых процессов. Вам предлагается ввести число.
 <u> - Сортировать по имени пользователя.
Ниже приведен пример использования команды top.
unifun@ubuntu:~$ top
top - 09:16:10 up 85 days, 23:04, 1 user, load average: 0.13, 0.03,
0.01
Tasks: 125 total, 1 running, 124 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0
si, 0.2 st
KiB Mem : 2039436 total, 1367312 free, 56632 used, 615492
buff/cache
KiB Swap: 645116 total, 645116 free, 0 used. 1906556 avail
Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+

72
COMMAND
9289 unifun 20 0 41796 3780 3192 R 0.3 0.2 0:00.16
top
1 root 20 0 37776 5816 3976 S 0.0 0.3 0:30.13
systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.74
kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:03.56
ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00
kworker/0:0H
7 root 20 0 0 0 0 S 0.0 0.0 2:39.20
rcu_sched
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00
rcu_bh

где:
Загрузка системы
 09:16:10 — текущее время;
 up 85 days - время работы системы после включения питания;
 1 user - количество пользователей, которые в данный момент работают в системе;
 load average: 0.13, 0.03, 0.01 - общая средняя загрузка системы (измеряется каждые 1, 5 и 15
минут). Общей средней загрузкой системы называется среднее число процессов,
находящихся в состоянии выполнения (R) или в состоянии ожидания (D), эту информацию
можно увидеть в колонке S вывода команды top, она может принимать 5 значений:
1. 'D' = uninterruptible sleep (состояние ожидания)
2. 'R' = running (состояние выполнения)
3. 'S' = sleeping
4. 'T' = traced or stopped
5. 'Z' = zombie
Состояния процессов
 total — общее количество процессов в системе;
 running — количество процессов, выполняемых процессором или стоящих в очереди на
выполнение;
 sleeping — количество процессов, ожидающих какого-либо события ввода-вывода;
 stoped — количество приостановленных процессов;
 zombie — количество процессов, находящихся в состоянии «зомби».

Состояния процессора (ЦП)


 us — (User CPU time) процент использования процессорного времени программами
пользователей;
 sy — (System CPU time) процент использования процессорного времени процессами ядра
Linux;

73
 ni — (Nice CPU time) процент использования процессорного времени программами с
измененным приоритетом;
 id — простой процессора
 wa — (iowait) время, затраченное на завершение ввода/вывода (IO)
 hi — (Hardware IRQ) процент времени, которое процессор тратит на обработку прерываний
на уровне оборудования (hardware- прерываний).
 si — (Software Interrupts) процент времени, затраченное на работу обработку software-
прерываний (network)
 st — (Steal Time) время, «украденное» гипервизором у этой виртуальной машины для
других задач (например работа другой виртуальной машины)

Состояние оперативной памяти (ОЗУ)


 total - общее количество оперативной памяти (2039436k / 1024 = 1991MB (мегабайт) = 2GB);
 used - количество использованной оперативной памяти (55MB);
 free - количество свободной оперативной памяти (1335MB);
 buffers - (601MB).
Состояние Swap
 total — общее количество swap- раздела (645116 k / 1024 = 629 MB);
 used — количество использованного swap- раздела (0);
 free — количество свободного swap- раздела (645116 k / 1024 = 629 MB).
Расшифровка столбцов
 PID - идентификатор процесса;
 USER - пользователь, от которого запущен процесс;
 PR - текущий приоритет процесса;
 NI - приоритет, выставленный командой nice. От −20 (наивысший) до 19;
 VIRT - (kb - килобайты). Общее количество виртуальной памяти, используемой программой;
VIRT = SWAP + RES.
 RES - (kb). Количество резидентной (не перемещаемой в swap) памяти. RES = CODE + DATA;
 SHR - (kb). Количество разделяемой (shared) памяти программы;
 S - статус процесса. ( S=sleep (ожидает событий) R=running (работает) Z=zombie (ожидает
родительский процесс));
 %CPU - процент использования центрального процессора данным процессом;
 %MEM - процент использования оперативной памяти данным процессом;
 TIME+ - общее время активности процесса;
 COMMAND - имя процесса.

24.3 Load Average


Посмотреть текущую загрузку системы можно командной
uptime
Также ее значения выводят утилиты top и htop, а также множество других инструментов. В ответ
мы получим следующее:
load average: 0,12, 0,10, 0,03

74
Чтобы понять, что такое загрузка системы следует обратиться к логике работы центрального
процессора. Вне зависимости от того, мощный у вас процессор или слабый, многоядерный или
нет, он выполняет некий программный код для некоторых процессов. Если процесс один, то
вопросов нет, а вот когда их несколько? Надо как-то распределять ресурсы между ними и,
желательно, равномерно, чтобы один процесс, "дорвавшись" до CPU, не оставил без вычислений
другие.
Каждому нуждающемуся в вычислениях процессу выделяется некий промежуток времени,
который зависит от типа процессора и системы, если говорить о современных процессорах Intel, то
это значение обычно составляет 10 мс и называется тиком. Каждый тик - процессорное время
отдается какому-то одному процессу в порядке очереди, но если процесс имеет повышенный или
пониженный приоритет, то он, соответственно получит большее или меньшее количество тиков.
Количество использованных тиков, в первом приближении, и представляет загрузку системы. В
Linux для оценки загрузки используется интервал в 500 тиков (5 секунд), при этом учитываются как
работающие процессы (использованные тики), так и ожидающие (которым не хватило тика, либо
они не смогли его использовать, ожидая завершения иной операции).
Если мы используем все тики за указанный промежуток времени и у нас не будет ожидающих
сводного тика процессов, то мы получим загрузку процессора на 100% или load average (LA) равное
1.
Давайте рассмотрим следующую схему:

Для простоты будет использоватся в расчетах более короткий интервал - 9 тиков. На схеме слева
видно, что процессорные ресурсы сначала понадобились системе, затем браузеру и файловому
менеджеру, потом активности в системе не было, затем еще один тик взял файловый менеджер и
еще два браузер, последние два тика также не понадобились. Несложные расчеты показывают,
что было использовано 67% процессорного времени или load average системы составил 0,67.
Справа показана ситуация, когда каждый тик был занят своим процессом, но некоторые процессы
так и не получили своего тика или не смогли получить, например, ждали окончания операции
ввода-вывода. В таком случае загрузка процессора составит все те же 100%, но load average
вырастет до 1,33, указывая на наличие очереди.
Чтобы лучше понять ситуацию давайте представим себе небольшой супермаркет, касса
представляет собой аналог процессора, тик - среднее время обслуживания покупателя (скажем, 1
минута), а процессы - это покупатели. В разгар рабочего дня людей в магазине немного, и вы
спокойно прошли на свободную кассу, рассчитались и пошли по своим делам. Это хорошо, но как
оценить нагрузку на кассу? Для этого нужно взять некий промежуток времени, допустим 10 минут.
Если за 10 минут в магазине кроме вас было еще три человека, то средняя загрузка составит 0,4.
А теперь зайдем в магазин вечером, все кассы заняты, и чтобы оплатить покупки придется ждать.

75
Теперь если за 10 минут касса обслужила 10 человек и еще 10 стоят в очереди, то средняя загрузка
будет равна 2, хотя касса загружена всего на 100%.
Вернемся к процессору и еще одному моменту, процессам, ожидающим окончания операций
ввода-вывода (диск, сеть и т.п.). Во многих источниках указывается, что такие процессы искажают
результат load average и мы можем получить высокие значения LA при отсутствии загрузки
процессора. Да, это так. Посмотрим на еще одну схему ниже:

Как видно на рисунке, из 9 тиков было использовано только 6, т.е. процессор загружен всего на
67%, но так как три процесса ждут данные от диска, то load average по-прежнему равен 1.
Искажают ли такие процессы значение load average? На наш взгляд нет. Следует понимать, что
средняя загрузка - это не показатель производительности процессора, не результат бенчмарка, не
текущая нагрузка, а отношение числа процессов, которым требуются вычислительные ресурсы
системы к имеющимся в наличии ресурсам.
Т.е. если имеется 1 процессор и 500 тиков, но за это время процессорные ресурсы требуются
тысяче процессов, то нагрузка явно вдвое превышает имеющиеся ресурсы. И то, что часть
процессов ждут жесткий диск и процессор работает вхолостую, не говорит о том, что система
находится в простое, наоборот, она не может обработать нагрузку, правда по другой, не зависящей
от процессора причине.
Пользователю ведь все равно по какой причине тормозит сайт или приложение, тем более что
недостаток дисковых ресурсов обычно выражается в подвисании приложения, в то время как при
недостатке процессорных оно просто начинает тормозить.
То есть - Load average показывает отношение имеющихся запросов на вычислительные ресурсы к
количеству этих самых ресурсов (тиков). Для одного процессора (одного процессорного ядра)
использование всех имеющихся ресурсов обозначает load average = 1. Причем это будет
справедливо и для Core i7 и для Pentium I, хотя производительность у этих двух процессоров
разная.
Теперь перейдем к многопроцессорности и многоядерности. При появлении второго процессора
или второго ядра, появляются дополнительные вычислительные ресурсы, т.е. те самые 500 тиков.
Но за эти 500 тиков система уже может обработать уже 1000 запросов, что покажет load average =
2.
Значит ли это, что производительность выросла в два раза? Нет! Производительность зависит от
того, сколько вычислений способен произвести процессор в течении одного тика. Понятно, что
более мощный процессор выполнит за этот промежуток времени больше вычислений, но оба из
них сделают одинаковое число тиков (для каждого процессорного ядра). В многопроцессорных
(многоядерных) системах часть процессорного времени вместо вычислений занимают задачи
межпроцессорного взаимодействия, переключения контекста и т.д. Поэтому появление второго

76
ядра никогда не даст 100% прироста производительности, но всегда позволяет обработать вдвое
большее количество запросов.
Это хорошо видно на примере технологии Hyper-threading, которая позволяет сделать из одного
физического ядра процессора два виртуальных. Физическая производительность ядра процессора,
т.е. количество производимых им вычислений в единицу времени не меняется, но появляется,
хоть и виртуальное, но второе ядро, а это еще 500 тиков. Как показывают тесты, прирост
производительности от Hyper-threading составляет 15-30%, что еще раз подтверждает старую
поговорку, что лучше плохо ехать, чем хорошо стоять. Второе ядро, хоть и виртуальное, позволяет
обрабатывать вычислительные запросы тех процессов, которые в одноядерном варианте стояли
бы в очереди.
Непонимание этого момента приводит к тому, что load average ошибочно связывают не с
доступностью и достаточностью вычислительных ресурсов, а с производительностью процессора,
что приводит к неверным выводам.
Теперь разберемся с самими цифрами. Мы получаем три значения load average для промежутков в
1, 5 и 15 минут. Для отображения load average используется экспоненциально взвешенная
скользящая средняя, подобный тип кривых используется для для сглаживания краткосрочных
колебаний и выделения основных тенденций или циклов.
Именно усредненные по особому алгоритму значения позволяют нам окинуть ситуацию взглядом
вширь и вглубь и разглядеть за деревьями лес. В этом отношении временные значения load
average представляют собой не время, за которое посчитали среднее значение, а период времени
относительно которого проводится усреднение.
Можно точно смоделировать различные значения load average при заданной модели нагрузки. К
примеру если смоделировать ситуацию, когда первые 30 минут единственное ядро CPU было
нагружено на 100%, без ждущих в очереди процессов, в последующие полчаса нагрузка была
полностью снята.

Как видим, разные периоды усреднения дают совершенно различные результаты, так LA 1 (1 min),

77
начинает показывать реальные значения где-то через 4 минуты, LA 5 для отражения текущей
нагрузки потребовалось уже 20 минут, а LA 15 за полчаса полной загрузки вышла только на 0,8.
О чем это говорит и как интерпретировать данные значения? Можно сказать, что LA 1
представляет собой недавнее прошлое (несколько минут назад), LA 5 прошлое (полчаса-час) и LA
15 отдаленное прошлое (несколько часов).
Теперь, располагая этим багажом знаний, можно правильно интерпретировать простые, на
первый взгляд, три числа load average.
Для примера возьмем такое значение:
load average: 0.99 0.75 0.35
Это говорит о том, что имеет место достаточно кратковременный (около десятка минут) всплеск
нагрузки, при этом вычислительных ресурсов пока достаточно.
А вот значение:
load average: 0.00 0.36 0.59
Говорит о том, что не так давно система испытывала значительные нагрузки в течении довольно
продолжительного времени (полчаса-час).
А вот такая картина:
load average: 4.55 4.22 4.18
Для четырехядерного процессора означает, что он работает на пределе своих возможностей в
течении длительного времени (несколько часов).
Как видно, load average, несмотря всего на три цифры, способна представить системному
администратору огромный пласт информации о фактической загрузке системы на протяжении
последних нескольких часов.
Для одного ядра считается приемлемыми следующие значения:
 LA 1 - может превышать 1.00, свидетельствуя о кратковременной пиковой нагрузке на
систему.
 LA 5 - не должен превышать 1.00, в противном случае налицо явный недостаток
вычислительных ресурсов.
 LA 15 - максимальное значение 0.7 - 0.8, но в любом случае не выше 1.0.
На многоядерной (многопроцессорной) системе значения load average следует откорректировать
пропорционально числу ядер. Узнать их количество можно командой
nproc
или
cat /proc/cpuinfo | grep "cpu cores"
Так, например, с учетом вышесказанного, для четырехядерной системы LA 15 не должен
превышать 3.00, для двухядерной 1.5, а для одноядерной 0.75.
Теперь, понимая, что такое load average и каким образом формируются его значения вы всегда
сможете быстро оценить производительность собственной системы и вовремя принять меры если
в работе вашего сервера возникнут узкие места.

24.4 Статусы процессов


Как вы могли заметить, вывод программы ps содержит поле «STAT», а в top присутствует поле «S» с
аналогичным содержимым. Это статусы процессов. В один и тот же промежуток времени любой
процесс может иметь только один статус.
Расшифровка статусов:

78
 R : процесс выполняется в данный момент или ожидает своей очереди.
 S : процесс ожидает (т.е. спит менее 20 секунд).
 I : процесс бездействует (т.е. спит больше 20 секунд).
 D : процесс ожидает ввода-вывода (или ожидает какого-либо события системы),
непрерываемый сон.
 Z : zombie или defunct процесс. Означает своего рода «зависание». Скорее всего, такой
процесс больше не выполнит ничего полезного, но останется зарегистрирован в системе по
причине того, что не сможет отдать родителю код своего завершения.
 T : процесс приостановил свое выполнение. Возможно, происходит отладка.
 W : процесс в свопе
 < : процесс в приоритетном режиме.
 N : процесс в режиме низкого приоритета.
 L : real-time процесс, имеются страницы, заблокированные в памяти.
 s : лидер сессии.

25 Завершение процесса в Linux

25.1 Сигналы и способы завершения процесса


В Linux любой процесс может быть завершен несколькими способами. Наиболее
распространенный из них - самостоятельная остановка. Она происходит после того как программа
выполнила всю заложенную логику. В таком случае процесс вернет операционной системе код
своего завершения. Он может сигнализировать об успешном выполнении или ошибке. В данном
случае важно лишь то, что программа завершила свою работу корректно.
Существуют и другие ситуации, требующие ручного завершения работы программы. Такое может
потребоваться, если процесс работает в фоновом режиме и в его задачи входит бесконечная
обработка каких-либо событий. Также программа может зависнуть. При этом она, скорее всего,
заблокирует некоторые ресурсы системы.
Для завершения работы процесса в Linux используется несколько специальных команд, но
принцип их работы один и тот же. С помощью них вы посылаете операционной системе
специальный сигнал и идентификационный номер процесса. Сигнал говорит о специфике
остановки программы. Чаще всего используются SIGTERM (англ. Termination — завершение) и
SIGKILL (англ. Kill — убийство).
SIGTERM пытается завершить работу программы корректно. Процесс в таком случае попробует
завершиться самостоятельно. Например, если вы работали в текстовом редакторе, все изменения
сохранятся на диск, а затем закрывается графический интерфейс. SIGKILL также останавливает
выполнение программы, но более грубым способом. Это безусловный сигнал завершения. Он не
дает шанса на корректную остановку. Операционная система «убьет» процесс, а также высвободит
занимаемую им оперативную память и ресурсы.
Каждый тип сигнала имеет свой числовой код. Посмотреть все доступные виды сигналов и их коды
можно с помощью команды kill -l. Существует в общей сложности 60 сигналов, которые
можно использовать, но все, что вы действительно должны запомнить это - SIGTERM (15) и SIGKILL
(9). Ниже приведен пример использования команды kill -l для отображения сигналов.
user@localhost:~$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1

79
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP

Описание некоторых сигналов
 SIGABRT - Этот сигнал посылает сигнал процессу, чтобы прервать операцию. ABRT как
правило, направлен на сам процесс, когда он вызывает функцию abort() языка
программирования С, чтобы сигнализировать аварийное завершение, но он может быть
направлен из любого процесса, как и любой другой сигнал.
 SIGALRM, SIGVTALRM и SIGPROF - отправляется процессу, когда лимит времени, указанный
при вызове функции сигнализации (например, setitimer) истекает. ALRM - Посылается, когда
настоящее время или часы с течением времени. VTALRM - Посылается, когда процессорное
время, используемое в процессе истечет. PROF - Посылается, когда процессорное время,
используемое процессом и системы от имени процесса истекает.
 SIGBUS - BUS сигнал посылает процессу, когда это приводит к ошибке шины. Условия,
которые приводят к данному сигналу, например, неправильное выравнивание доступа к
памяти или отсутствие физического адреса.
 SIGCHLD - Сигнал CHLD отправляет процессу, когда дочерний процесс завершается,
прерывается или возобновляется после прерывания. Один из распространенного
использование сигнала — это дать сигнал ОС на очистку ресурсов, которые используются в
процессе дочернего процесса после его окончания без явного системного вызова.
 SIGCONT - Сигнал CONT инструктирует операционную систему, и дает сигнал перезапустить
процесс который ранее был приостановлен в режиме СТОП или сигнала TSTP. Одной из
важных особенностей этого сигнала является контроль работы в оболочке Unix.
 SIGFPE - Сигнал FPE посылает процессу, когда он выполняет ошибочное, арифметические
срабатывания, например, такие как деление на ноль.
 SIGHUP - Сигнал HUP посылает процессу, когда его управляющий терминал закрыт.
Первоначально он был разработан, чтобы уведомить процесс после последовательного
падения линии (HUP ответственный за «зависания»). В современных системах, этот сигнал
обычно означает, что контроль псевдо или виртуальным терминалом был закрыт.
 SIGILL - ILL сигнал, посылаемый процессу при попытке выполнить вредоносные,
неизвестные или привилегированные команды (инструкции).
 SIGINT - Сигнал INT посылает процессу от управляющего терминала, когда пользователь
желает прервать процесс. Это как правило, инициируется нажатием Control-C, но на
некоторых системах, «delete» или «break».
 SIGKILL - Сигнал KILL посылает процессу чтобы он немедленно прекратил работу. В отличие
от SIGTERM и SIGINT этот сигнал не может быть захвачен или проигнорирован и
принимающий процесс не может выполнить какие-либо очистку после получения этого
сигнала.
 SIGPIPE - Сигнал PIPE посылается процессу, когда он пытается записать в трубе без процесса,
подключенного к другому концу.
 SIGQUIT - QUIT сигнал посылается процессу от его управляющего терминала, когда
пользователь запрашивает процесс выполнения дампа.
 SIGSEGV - Сигнал SEGV отправляется в процесс, когда он делает недопустимую ссылку
виртуальной памяти или сбой сегментации, то есть когда он выполняет нарушение
сегментации.
 SIGSTOP - STOP сигнал указывает ОС, чтобы остановить процесс для последующего

80
возобновления.
 SIGTERM - Сигнал TERM посылается в процесс чтобы запросить о его прекращении. В
отличие от сигнала «kill», он может быть и интерпретируемым или игнорируемым в
процессе. Это позволяет процессу выполнять «nice» выполнение для прекращения
высвобождения ресурсов и сохранения состояния в случае необходимости. Следует
отметить, что SIGINT почти идентичен SIGTERM.
 SIGTSTP - Сигнал TSTP посылается в процесс его управляющего терминала и говорит ему,
что нужно временно приостановить. Это обычно инициируется пользователем нажатием
Control-Z. В отличие от SIGSTOP, этот процесс может зарегистрировать обработчик сигнала
или чтобы игнорировать сигнал.
 SIGTTIN и SIGTTOU - В TTIN и TTOU сигналы посылаются процессу, когда он пытается
прочитать или записать соответственно с (tty) терминала на заднем плане. Как правило,
этот сигнал может быть получен только с помощью процессов находящихся под контролем
рабочей панели; демоны не имеют управляющие терминалы и никогда не должны
получать этот сигнал.
 SIGUSR1 и SIGUSR2 - Сигналы USR1 и USR2 отправляются процессу и указывают
определенные пользователем условия.
 SIGPOLL - Сигнал POLL отправляется в процессе, когда происходит асинхронное событие
ввода / вывода.
 SIGSYS - Сигнал SYS отправляется в процессе, когда он пропускает плохой аргумент для
системного вызова.
 SIGTRAP - TRAP сигнал посылает процессу когда возникает состояние что отладчик просил
быть информированным — Например, когда конкретная функция выполняется или когда
меняется определенное значение переменной.
 SIGURG - Сигнал URG отправляется процессу, когда socket имеет срочные или вне диапазона
данных, доступных для чтения.
 SIGXCPU - Сигнал XCPU отправляется в процессе, когда он использует центральный
процессор в течение времени превышающего определенное заданное значение,
установленным пользователем. Прибытие сигнала XCPU обеспечивает процессу быстро
сохранить все промежуточные результаты и завершиться хорошо, прежде чем он
завершиться операционной системы с помощью сигнала SIGKILL.
 SIGXFSZ - Сигнал XFSZ отправляется в процессе, когда файл вырастает (превышает заданное
значение), чем максимально допустимое значение.
 SIGRTMIN to SIGRTMAX - Сигналы RTMIN — RTMAX предназначены для использования в
пользовательских целей. Они сигналы реального времени.
 Следующие сигналы не стандартизированы POSIX, но иногда используются на некоторых
системах.
 SIGEMT - Сигнал ЕМТ отправляется в процессе, когда происходит прерывание эмулятора.
 SIGINFO - Сигнал INFO отправляется в процессе, когда запрос статуса получен от
управляющего терминала.
 SIGPWR - Сигнал PWR отправляется в процессе, когда система испытывает сбой питания.
 SIGLOST - LOST сигнал посылается к процессу, когда «file lock» теряется.
 SIGWINCH - Сигнал WINCH отправляется в процессе, когда его управляющий терминал
меняет свой размер.

81
25.2 Завершение процесса по его PID
Если известен уникальный идентификационный номер процесса — PID, вы можете завершить его
выполнение или убить с помощью команды kill. PID указывается в качестве первого параметра.
При запуске команды kill без дополнительных опций, Linux посылает процессу сигнал SIGTERM.
Для отправки другого сигнала его код нужно передать в опции.
Для примера запустим текстовый редактор в фоновом режиме
user@localhost:~$ gedit &
[1] 15892
Примеры завершения работы с указанием кода сигнала и без
user@localhost:~$ kill 15892
user@localhost:~$ kill -9 15892
Заметка: Команда kill может завершить работу процесса, принадлежащего только текущему
пользователю. Если вам нужно осуществить эту операцию над чужими процессами, необходимо
войти в систему под администратором.

25.3 Завершение программы по её имени


Зачастую гораздо удобнее убить все процессы, принадлежащие конкретной программе. Для этого
в Linux есть команда killall. Принцип её использования аналогичен команде kill, с тем лишь
исключением, что вместо PID процесса указывается имя программы.
Пример обычной остановки работы процесса
user@localhost:~$ killall gedit
Пример остановки процесса с указанием сигнала
user@localhost:~$ killall -s 9 gedit

25.4 Дополнительные инструменты


Существует ещё несколько способов убийства процессов в Linux. Один из них связан с горячими
клавишами. Если вы запустили программу в терминале и хотите завершить её не дожидаясь конца
выполнения, нажмите сочетание клавиш Ctrl + C.
Несколько стандартных значений по умолчанию перечислены ниже:
 CTRL+C - Отправить SIGINT (прерывание). По умолчанию это вызывает процесс прекращать.
 CTRL+Z - Отправить SIGTSTP (Suspend). По умолчанию это вызывает процесс приостановить
все операции.
 CTRL+S - Остановка вывода на терминал.
 CTRL+Q - Возобновление вывода на терминал. Попробуйте эту комбинацию клавиш,
если ваш терминал непонятно почему перестал отвечать на ваши запросы.
Также команда top, рассмотренная в прошлом уроке, имеет встроенный механизм завершения
процессов. Для его использования необходимо нажать клавишу "k", ввести PID процесса и нажать
Enter.
Когда приложения ведут себя неправильно и вызвают к зависанию системы, это очень заманчиво,
чтобы перезагрузить компьютер и начать сеанс снова и снова. С помощью этих команд «kill», вы
сможете лучше управлять плохим поведением приложений которые вызывают или могут вызвать
крах системы.
Некоторая работа или команда занимает много времени. Если вы не уверены, когда закончится
задание, лучше оставить работу в фоновом режиме. Все процессы (кроме at и batch), выполняют
завершение при выходе из системы. Утилита nohup дает возможность, чтобы при выходе из

82
системы процесс продолжал работу в фоновом режиме.
nohup — UNIX-утилита, запускающая указанную команду с игнорированием сигналов потери
связи (SIGHUP). Таким образом, команда будет продолжать выполняться в фоновом режиме и
после того, как пользователь выйдет из системы. Если стандартным выводом (stdout) команды
является терминал, то он и стандартный вывод ошибок (stderr) перенаправляются с добавлением
в файл «nohup.out» в текущей директории; если это невозможно сделать, то перенаправление
происходит в файл «$HOME/nohup.out». Если и это невозможно сделать, то команда не
запускается совсем. При создании файлов «nohup.out» или «$HOME/nohup.out» команда nohup
устанавливает им атрибуты доступа только для владельца этих файлов (группа и остальные
пользователи не имеют прав доступа к этим файлам). Если же эти файлы уже существуют, то их
права доступа не изменяются.
Заметка: nohup не переводит автоматически команду в фоновый режим; пользователь должен
сделать это явным образом, завершив командную строку символом «&».
Для примера – запустим ping с помощью команды nohup:
user@localhost:~$ nohup ping ya.ru
nohup: ignoring input and appending output to `nohup.out'
Посмотрим запущенные процессы с фильтром по слову ping.
user@localhost:~$ ps aux | grep ping
root 1318 0.1 0.0 4544 916 pts/0 S+ 05:56 0:00 ping
ya.ru
И попробуем ему отправить сигнал HUP (отбой):
user@localhost:~$ kill -1 1318
Проверим если процесс остановился:
user@localhost:~$ ps aux | grep ping
root 1318 0.0 0.0 4544 920 pts/0 S+ 05:56 0:00 ping
ya.ru
Процесс продолжает выполняться. Отправим ему сигнал KILL:
user@localhost:~$ kill -9 1318
user@localhost:~$ ps aux | grep ping
root 1326 0.0 0.0 4356 748 pts/1 S+ 05:59 0:00 grep
ping
Процесс “убит”. Посмотрим в консоли, где выполнялся ping:
user@localhost:~$ nohup ping ya.ru
nohup: ignoring input and appending output to `nohup.out'
Killed
Стоит отметить особенности работы процессов, запущенных с помощью команды nohup. Все
выводимые данные отправляются не на стандартный вывод (stdout или stderr), а записываются в
файл nohup.out, который создаётся в том каталоге, в котором находился пользователь,
запустивший программу. В случае, если в этом каталоге создать файл невозможно – он будет
создан в домашнем каталоге пользователя. Если не будет и такой возможности – команда
выполнена не будет. Например – если у пользователя, запускающего nohup нет прав записи в
файл:
user@localhost:~$ ls -l | grep nohup
-r--------. 1 user user 151393 May 18 06:46 nohup.out
user@localhost:~$ nohup ping ya.ru
nohup: failed to open `nohup.out': Permission denied
nohup: failed to open `/home/user/nohup.out': Permission denied
Кроме того, nohup продолжит выполнять программу даже после выхода пользователя из системы,
т.е. – проигнорирует сигнал TERM, который передаст ему командный интерпретатор при

83
завершении сессии пользователя. Однако, это не значит что процесс будет выполняться в фоном
режиме – для этого его необходимо запускать со знаком &:
user@localhost:~$ nohup ping ya.ru &
Посмотрим, как этой действует. Допустим, у нас открыты два терминала:
user@localhost:~$ w
06:11:33 up 36 min, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
user pts/0 192.168.1.100 05:35 0.00s 0.34s 0.26s sshd:
user [priv]
user pts/1 192.168.1.100 06:11 3.00s 0.04s 0.04s -bash
На одном из них мы запустим тот же ping с помощью nohup:
user@localhost:~$ nohup ping ya.ru
nohup: ignoring input and appending output to `nohup.out'
Вернёмся в первое окно:
user@localhost:~$ w
06:13:00 up 38 min, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
user pts/0 192.168.1.100 05:35 0.00s 0.27s 0.26s sshd:
user [priv]
user pts/1 192.168.1.100 06:11 6.00s 0.08s 0.03s ping
ya.ru
Как видно – пользователь user на терминале pts/1 выполняет команду ping.
Теперь – проверим его наличие в процессах:
user@localhost:~$ ps aux | grep ping
user 1408 0.0 0.0 4544 916 pts/1 S+ 06:12 0:00 ping
ya.ru
Теперь – попросту завершим работу второго терминала:
user@localhost:~$ skill -9 -v pts/1
pts/1 user 1373 bash
И проверим состояние процесса ping, запущенного user:
user@localhost:~$ ps aux | grep ping
user 1408 0.0 0.0 4544 916 ? S 06:12 0:00 ping
ya.ru
Процесс продолжает выполняться, но уже без указания управляющего терминала.
Еще один пример использования nohup Linux и выполнение длительных операции. Рассмотрим
ситуацию при которой необходимо скачать очень объемный файл при помощи wget и
использование nohup Linux утилиты, позволяющей продолжать процесс в фоне.
Процесс может длиться несколько часов.
nohup wget http://example.com/some-large-package.iso &
Подключившись из другой сессии можно убедиться в том, что процесс все еще выполняется
ps aux | grep wget
Контроля над процессом, тем не менее, нет. Можно только дождаться его завершения или
насильственно прекратить его выполнение:
killall wget
Значительно шире, чем nohup применяется утилита screen. Она позволяет в любое время
подключиться к сессии после выхода из нее и продолжить работу. При этом можно использовать
ту же машину или другую.
Screen очень полезная команда, которая предлагает возможность использовать несколько окон

84
оболочки (сеансов) от одного сеанса SSH в Linux. Когда сеанс отсоединен или есть нарушения сети,
процесс, который запускается в сеансе экрана по-прежнему будет работать, и вы можете повторно
подключиться к сессии экрана в любое время. Это также очень удобно, если вы хотите запустить
длительный процесс постоянно или подключиться к оболочке сеансов из нескольких мест.
Экран поставляется с предустановленной на некоторых из популярных дистрибутивов. Вы можете
проверить установлен он или нет на сервере с помощью следующей команды
user@localhost:~$ screen -v
Screen version 4.00.03 (FAU)
Если у вас нет экрана к VPS, вы можете легко установить его с помощью менеджера пакетов,
предоставляемой с операционной системой.
CentOS/RedHat/Fedora
user@localhost:~$ yum -y install screen
Ubuntu/Debian
user@localhost:~$ sudo apt-get -y install screen
Как начать сеанс экрана
Вы можете начать экран, набрав слово “screen” в командной строке и новый сеанс экран будет
запущен, который выглядит так же, как в командной строке
user@localhost:~$ screen
Это хорошая практика, чтобы начать занятия экрана с описательными именами, так что вы можете
легко вспомнить, какой процесс выполняется в сеансе. Чтобы создать новый сеанс с именем
сеанса выполните следующую команду
user@localhost:~$ screen -S name
и заменить ‘name‘ с понятным названием для вашей сессии.
Отсоединить экран от сессии
Для того, чтобы отключиться от текущего сеанса экрана вы можете нажать клавишу ‘Ctrl-A‘ и ‘ D‘ на
клавиатуре. Все сеансы экрана будут по- прежнему активны, и вы можете повторно
подсоединиться к ним в любое время позже.
Заново на экран сессии
Если вы оторваны от сеанса или ваше соединение прерывается по какой-то причине, вы можете
легко повторно подсоединиться, выполнив следующую команду:
user@localhost:~$ screen -r
Если у вас есть несколько сеансов экрана вы можете перечислить их с ‘ls‘
user@localhost:~$ screen -ls
There are screens on:
7880.session (Detached)
7934.session2 (Detached)
7907.session1 (Detached)
3 Sockets in /var/run/screen/S-root.
В нашем примере, у нас есть три активных сеансов экрана. Итак, если вы хотите восстановить
сеанс “session2”, вы можете выполнить
user@localhost:~$ screen -r 7934
или вы можете использовать имя экрана
user@localhost:~$ screen -r -S session2
Завершить сеанс экрана
Есть несколько способов, чтобы завершить сеанс экрана. Вы можете сделать это, нажав Ctrl+D на
клавиатуре или с помощью команды командной строки ‘exit‘.
Для того чтобы увидеть все полезные свойства экрана команды вы можете проверить man page

85
screen.
user@localhost:~$ man screen
NAME
screen - screen manager with VT100/ANSI terminal emulation

SYNOPSIS
screen [ -options ] [ cmd [ args ] ]
screen -r [[pid.]tty[.host]]
screen -r sessionowner/[[pid.]tty[.host]]
...

26 Приоритет процессов в Linux

26.1 Введение в приоритеты процессов


В ядро любой операционной системы, в том числе и Linux, входит планировщик задач. В общих
чертах планировщик является программным модулем осуществляющим распределение
процессорного времени между работающими программами. Он решает, какому процессу отдать
управление в зависимости от его приоритета. Это необходимо, чтобы ни одна программа не
смогла захватить все доступные ресурсы и выполняться монопольно.
Программа не может самостоятельно изменить свой приоритет. Распределение ведется исходя из
множества факторов. Например, процесс, обрабатывающий операции ввода-вывода получит
управление с большей вероятностью, чем осуществляющий математические операции. Смысл
такого поведения в том, что математическую операцию легко повторить, а данные, присланные по
сети и не сохраненные на диск, могут быть бесследно утрачены.
Значение приоритета процесса в Linux определяется числом от -20 до 19. Чем меньше число, тем
больше приоритет. По умолчанию большинство программ запускается со значением 0. Увидеть
приоритеты запущенных процессов можно с помощью команды top. В её выводе присутствует
колонка с именем «PR». Также команда ps с опцией -l выведет схожую информацию. Нужная
колонка называется «NI».
Для примера запустим текстовый редактор в фоновом режиме
user@localhost:~$ gedit &
[1] 1242
Теперь выведем список процессов с их приоритетами
user@localhost:~$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 935 916 0 80 0 - 6008 wait pts/2 00:00:00 bash
0 S 1000 1242 935 6 80 0 - 165790 poll_s pts/2 00:00:00 gedit
0 R 1000 1426 935 0 80 0 - 7541 - pts/2 00:00:00 ps
Заметка: В Linux помимо планировщика задач приоритетом процессов может управлять
пользователь. Это довольно полезно в ряде случаев. Например, вы выполняете резервное
копирование жесткого диска, но предпочли бы продолжить работу с ПК. Для этого можно
понизить приоритет соответствующей задачи, что заставит её выполняться дольше, зато вы не
почувствуете дискомфорт и каких-либо «тормозов».

26.2 Назначение приоритета новому процессу


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

86
Опция -n ожидает получить числовое значение приоритета, а в качестве параметра необходимо
указать имя запускаемой программы и список её атрибутов. В общем виде запуск команды можно
представить как «nice -n -10 имя_программы [-опции] [параметры]».
Пример запуска архивирования пользовательской директории
user@localhost:~$ nice -n 20 tar -czf ~/archive ~/some-dir &
[2] 10077
user@localhost:~$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 10077 935 2 99 19 - 7708 pipe_w pts/2 00:00:00 tar
0 R 1000 10078 10077 48 99 19 - 1160 - pts/2 00:00:02 gzip
...

26.3 Управление ранее запущенным процессом


Команда renice позволяет управлять приоритетом уже запущенного процесса. При этом
существует одно правило — обычный пользователь Linux может только уменьшать приоритеты, а
повышать только администратор. Renice в качестве первого параметра ожидает получить значение
приоритета, а вторым должен быть PID процесса.
Теперь снова используем текстовый редактор для примера
user@localhost:~$ nice -n 10 gedit &
[1] 1242
Далее посмотрим текущий приоритет
user@localhost:~$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 16342 935 3 90 10 - 165823 poll_s pts/2 00:00:00
gedit
Попробуем изменить приоритет процессам
user@localhost:~$ renice 19 16342
16342 (process ID) старый приоритет 10, новый приоритет 19
ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 16342 935 0 99 19 - 165823 poll_s pts/2 00:00:00
gedit

27 Запуск процесса от имени другого пользователя

27.1 Причины смены пользователя


Как вы уже знаете, система безопасности Linux базируется на определении прав доступа для трех
сущностей: владелец файла, группа и остальные пользователи. Исполнять можно только те
программы, к которым имеется доступ. Более того процесс, созданный пользователем, также
наследует его права. Это означает, что программа не сможет выполнять действия недоступные
пользователю. К таким операциям можно отнести: создание и редактирование файлов, запуск
других процессов, доступ к аппаратным устройствам и т.д.
Такой подход не всегда бывает удобным. Зачастую необходимо выполнить ряд административных
задач с расширенными правами. Это требует от пользователя выхода из системы и повторения
процедуры входа под учетной записью администратора. В Linux существует негласное правило, по
которому не полагается работать под администратором на постоянной основе. Данная учетная
запись должна использоваться при крайней необходимости. Она имеет неограниченные права,

87
что может повлечь неисправимые последствия в случае ошибочных действий.
Заметка: Существуют дистрибутивы, в которых учетная запись администратора отсутствует, а
получение административных прав происходит на короткие промежутки времени с помощью
специальных команд. Например, такой подход используется в дистрибутиве Ubuntu.

27.2 Запуск от имени пользователя


Различные дистрибутивы Linux имеют собственные инструменты для запуска программ от имени
других пользователей. Мы рассмотрим только универсальные и присутствующие по умолчанию во
всех сборках.
Команда su позволяет имитировать вход в систему под заданным пользователем. Для этого в
первом параметре необходимо передать его имя. В общем виде вызов команды можно записать
как «su [имя_пользователя]». После выполнения, терминал войдет в специальный режим.
Это будет заметно по изменившейся строке ввода. В ней будет отражено имя нового пользователя.
В таком режиме можно работать также как и в обычном терминале. Все программы и команды
оболочки будут запускаться от указанного при вызове su пользователя. Для выхода из этого
режима необходимо нажать сочетание клавиш Ctrl + D или использовать команду exit.
Если команда su выполняется не администратором, потребуется ввести пароль указанного
пользователя. Обратите внимание, что переменные окружения останутся прежними. Если вы
хотите чтобы терминал при выполнении su создавал окружение специфичное для другого
пользователя, необходимо указать опцию -l.
Заходим под другим пользователем и создаем файл
user@localhost:~$ su -l test-user
Пароль: *****
whoami
test-user
user@localhost:~$ touch ~/simple-file.txt
user@localhost:~$ exit
Теперь убеждаемся что он является владельцем файла
user@localhost:~$ ls -l /home/test-user
-rw-rw-r-- 1 test-user test-user 0 дек 9 19:49 simple-file.txt
...
Далее выполняем команду более коротким способом
su -l -c "touch ~/simple-file.txt" test-user
Пароль: *****
Заметка: Также Linux позволяет запускать команды от имени другого пользователя без входа в
специальный режим терминала. Для этого используйте опцию -c. Например, «su -l -c
"touch ~/test-file" some-user».
Запуск от имени администратора
В Linux есть очень интересная команда sudo. Она используется для запуска команд от имени
любых пользователей. По умолчанию выделяются права администратора. В дистрибутиве Ubuntu
данная команда является единственным инструментом выполнения административных задач, так
как учетная запись суперпользователя отсутствует.
Для применения sudo просто подставьте его в начало любой команды. Потребуется ввести пароль
текущего пользователя, а не администратора. Это может показаться необычным. Суть в том, что
sudo привязано к конфигурационному файлу /etc/sudoers, содержащему правила выделения
административных прав различным пользователям.
Выполняем операции, дозволенные только администратору

88
user@localhost:~$ sudo useradd -p password another-user
Пароль: *****
При повторном использовании пароль не требуется
sudo deluser another-user
Конфигурацию может редактировать только суперпользователь. Таким образом, мы заранее
сообщаем системе о допустимости тех или иных действий, и требуем лишь подтверждения пароля
обычного пользователя. С подробными правилами составления этого файла вы можете
ознакомиться на страницах справки «man sudoers». Дадим краткий разбор конфигурации,
представленной ниже.
Defaults env_reset
Defaults mail_badpass
Defaults
secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/
bin:/snap/bin"
%admin ALL=(ALL) ALL
Описание настроек:
Defaults env_reset — после смены пользователя возвращает переменные окружения к
исходным значениям.
Defaults mail_badpass — при неудачном входе в систему администратору отправляется
предупреждение.
Defaults secure_path — задает значение переменной окружения PATH для выполнения
sudo.
%admin ALL=(ALL) ALL — наличие знака процента обозначает, что правило действует для
группы с именем admin, иначе применилось бы к пользователю с аналогичным именем. Первый
ALL обозначает любое имя хоста, в противном случае необходимо указать конкретное имя.
Последний ALL сообщает о возможности выполнения любой команды. Вы можете ограничить
набор команд, указав их имена через запятую.

28 Демоны в Linux

28.1 Что такое демоны и сервисы


Демонами в Linux называют специальные программы, не требующие для выполнения явного
вызова через терминал или графическую оболочку. Как правило, они запускаются ядром
операционной системы самостоятельно. Тем не менее, пользователь может управлять демонами с
помощью ряда инструментов.
Linux автоматически создает несколько важных демонов, которые, по сути, не являются
самостоятельными программами, а существуют как потоки ядра операционной системы. Они
выполняют ряд административных задач: управление вводом/выводом, буфером блочных
устройств, контроль системных прерываний и т.д. Пользователю не следует вмешиваться в работу
таких демонов, так как это может повлечь за собой необратимые последствия. Например, потерю
данных.
Помимо потоков ядра существует масса демонов, занимающихся более высокоуровневыми
задачами. Их чаще всего называют сервисами. Linux реализует ряд специальных команд для
удобного взаимодействия пользователей и сервисов. Нужно отметить, что потоки ядра не имеют
таких интерфейсов. Это сделано для предотвращения случайного вмешательства в работу
операционной системы.

89
Краткий список возможных сервисов:
Имя Описание

apaсhe2 Веб-сервер apache

nginx Веб-сервер nginx

сron Менеджер запуска программ по расписанию

dhclient DHCP-клиент

mysqld Сервер базы данных MySQL

sshd Сервер подключения через SSH

udevd Управление устройствами

bluetoothd Управление Bluetooth соединениями

sendmail Почтовый сервер

Заметка: Отличительной особенностью демонов является то, что при запуске они не связываются с
конкретным терминалом, не блокируют его и не перестают выполнять свою логику после закрытия
консоли.
Просмотр запущенных сервисов
Разделение терминов демон и сервис имеет под собой практический смысл. Все демоны,
размещающие свои инициализационные скрипты в директории /etc/init.d, предоставляют
пользователю интерфейс управления своим состоянием. Именно такие программы принято
называть сервисами, так как взаимодействие с ними происходит через системную команду
/sbin/service или просто service (в зависимости от дистрибутива).
Для вывода списка всех запущенных сервисов и просмотра их статусов нужно использовать
команду service с опцией --status-all.
user@localhost:~$ service --status-all
[ + ] acpid
[ - ] alsa-utils
[ - ] anacron
[ - ] apparmor
[ + ] apport
[ + ] avahi-daemon
[ + ] binfmt-support
[ + ] bluetooth
[ - ] bootmisc.sh
[ - ] brltty
[ - ] cgroupfs-mount
[ - ] checkfs.sh
[ - ] checkroot-bootclean.sh
[ - ] checkroot.sh

90
29 Запуск и остановка сервиса в Linux

29.1 Системы запуска сервисов


Дистрибутивы Linux используют системы инициализации сервисов. В ближайшем рассмотрении
такая система представляет собой корневой процесс, который запускает все остальные процессы.
От эффективности запуска демонов зависит общая скорость загрузки операционной системы.
Дистрибутивы, по мере выхода новых версий, могут использовать различные системы запуска.
Однако большинство из них поддерживают унифицированный механизм старта, перезагрузки и
остановки сервисов.
Рассмотрим три самые популярные системы:
 Init-V — считается самой старой из всех. Разработана в 1983 году. Изначально
использовалась практически всеми дистрибутивами Linux. Init-V легла в основу разработки
многих других систем инициализации. Наряду с высокой стабильностью обладает рядом
существенных недостатков. Например, отсутствием параллельного запуска и остановки
сервисов, что сказывается на производительности. Исполняемый файл располагается в
/sbin/init.
 Upstart — разработана компанией Canonical специально для дистрибутива Ubuntu и замены
устаревшей Init-V. Отличается развитой событийной моделью.
 Systemd — системный демон, пришедший на замену Init-V. В настоящее время используется
практически всеми дистрибутивами Linux. Даже в последней версии Ubuntu заменил
Upstart. Systemd имеет множество инструментов взаимодействия с сервисами как на стадии
запуска или остановки, так и во время их выполнения. Эффективно распараллеливает
процессы инициализации демонов, что значительно ускоряет загрузку операционной
системы.
Ls -lУзнать, какая именно система управления сервисами стоит в вашей версии дистрибутива
можно с помощью команды, приведенной ниже. Она покажет символическую ссылку на
исполняемый файл.
user@localhost:~$ ls -l /sbin/init
lrwxrwxrwx 1 root root 20 окт 27 12:11 /sbin/init ->
/lib/systemd/systemd
Заметка: Все системы запуска сервисов имеют массу отличий, как в формировании
конфигурационных файлов, так и в работе с процессами. Эта статья не ставит перед собой целей
подробного изучения данных вопросов. Они будут рассмотрены в следующих уроках.

29.2 Запуск сервисов


Чтобы осуществить запуск нужного демона необходимо выполнить в командной строке одну из
приведенных ниже команд. Напротив каждой из них присутствует комментарий, поясняющий в
каких дистрибутивах или системах инициализации доступен данный функционал.
user@localhost:~$ service имя_сервиса start
#общий способ для всех дистрибутивов
user@localhost:~$ /etc/init.d/имя_сервиса start
#стандартный способ запуска для Init-V
user@localhost:~$ invoke-rc.d имя_сервиса start
#используется в Init-V (дистрибутив Debian)
user@localhost:~$ start имя_сервиса
#используется в Upstart (дистрибутив Ubuntu)
user@localhost:~$ systemctl start имя_сервиса.service

91
#применяется в Systemd (дистрибутив Fedora)

29.3 Остановка сервисов


Выполнение сервиса, демона, сетевой службы или сервера может быть остановлено
аналогичными командами. Отличие лишь в том, что параметр start заменяется на stop.
user@localhost:~$ service имя_сервиса stop
#общий способ для всех дистрибутивов
user@localhost:~$ /etc/init.d/имя_сервиса stop
#стандартный способ запуска для Init-V
user@localhost:~$ invoke-rc.d имя_сервиса stop
#используется в Init-V (дистрибутив Debian)
user@localhost:~$ stop имя_сервиса
#используется в Upstart (дистрибутив Ubuntu)
user@localhost:~$ systemctl stop имя_сервиса.service
#применяется в Systemd (дистрибутив Fedora)

29.4 Перезапуск сервисов


Отметим, что некоторые сервисы Linux позволяют осуществлять подгрузку новой конфигурации
без остановки процесса. Для этого используется параметр reload. В случае если вам необходимо
перезапустить демон полностью, необходимо использовать параметр restart.
user@localhost:~$ service имя_сервиса restart
#общий способ для всех дистрибутивов
user@localhost:~$ /etc/init.d/имя_сервиса restart
#стандартный способ запуска для Init-V
user@localhost:~$ invoke-rc.d имя_сервиса restart
#используется в Init-V (дистрибутив Debian)
user@localhost:~$ restart имя_сервиса
#используется в Upstart (дистрибутив Ubuntu)
user@localhost:~$ systemctl restart имя_сервиса.service
#применяется в Systemd (дистрибутив Fedora)

29.5 Автозапуск сервисов в Linux


Различия дистрибутивов
Выше мы дали краткую характеристику систем загрузки сервисов Linux. Они имеют ряд отличий,
как в наборе команд, так и в конфигурации сервисов. Подавляющее большинство современных
дистрибутивов используют систему инициализации systemd, которая является наиболее гибкой и
производительной.
Отметим, что в большинстве дистрибутивов автозагрузка демонов настраивается без участия
администратора. Как правило, это происходит во время установки соответствующего пакета.
Однако политика безопасности других систем может требовать ручной настройки автозапуска.
Заметка: Примеры данного урока наряду с командами systemd содержат аналогичные команды,
встречающиеся в старых версиях различных дистрибутивов.

29.6 Добавление сервиса в автозапуск


Процедура включения сервиса в автозагрузку Linux подразумевает, что нужная программа уже

92
установлена с помощью менеджера пакетов или скомпилирована. Общий вид вызова нужных
команд представлен в примере, приведенном ниже.
user@localhost:~$ systemctl enable имя_сервиса.service
#стандартный механизм systemd
user@localhost:~$ update.rc имя_сервиса defaults
#используется в Init-V Debian/Ubuntu
user@localhost:~$ chkconfig --add имя_сервиса
#особый способ Init-V для Read Hat

29.7 Удаление демона из автозагрузки


Прежде всего, отметим, что запущенный в настоящий момент сервис не может быть извлечен из
автозапуска. Предварительно необходимо выполнить процедуру остановки. Удаление сервиса из
автозагрузки Linux не затронет его данные и исполняемые файлы.
user@localhost:~$ systemctl disable имя_сервиса.service
#стандартный механизм systemd
user@localhost:~$ update.rc -f имя_сервиса remove
#используется в Init-V Debian/Ubuntu
user@localhost:~$ chkconfig --dell имя_сервиса
#особый способ Init-V для Read Hat

30 Планировщик задач в Linux

30.1 Область применения Cron


Зачастую возникает потребность в выполнении одной и той же задачи через определенные
промежутки времени. Автоматизировать этот процесс в Linux позволяет планировщик задач Cron.
Он представляет собой сервис, проверяющий каждую минуту списки программ и запускающий те
из них, расписание которых соответствует текущему времени.
Cron в большинстве дистрибутивов устанавливается по умолчанию. Однако для некоторых
серверных версий Linux может потребоваться установка из репозитория. Например, в Ubuntu это
делается с помощью команды «sudo apt-get install cron».

30.2 Специальные директории


У планировщика Cron имеется главный конфигурационный файл /etc/crontab. В нем уже заполнено
несколько задач, целью которых является автоматический запуск исполняемых файлов,
расположенных в ряде специальных директорий. Файлы crontab, создаваемые для отдельных
пользователей, находятся в каталоге /usr/spool/cron/crontabs/ или
/var/spool/cron/tabs/. Редактировать их вручную не рекомендуется, для этого используют
команду crontab -e. Файлы crontab, используемые для управления всей системой,
располагаются в директории /etc/cron.d/. Кроме того, в директориях /etc/cron.daily/,
/etc/cron.weekly/ и /etc/cron.monthly/ размещаются автоматически запускаемые программы
(ежедневно, еженедельно или ежемесячно).
Специальные директории Cron:
 /etc/cron.minutely — скрипты, запускаемые каждую минуту. Данная директория может
отсутствовать в ряде дистрибутивов.
 /etc/cron.hourly — запуск каждый час.

93
 /etc/cron.daily — запуск каждый день.
 /etc/cron.weekly — запуск каждую неделю.
 /etc/cron.monthly — запуск каждый месяц.
Основной файл конфигурации cron, /etc/crontab, выглядит примерно так:
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-
parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-
parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-
parts --report /etc/cron.monthly )
#
Вы можете самостоятельно добавить необходимый скрипт в одну из перечисленных папок. Таким
образом, они попадут под контроль планировщика задач Linux.
Заметка: Изменять конфигурационный файл /etc/crontab крайне не желательно. Если вам
необходимо настроить более гибкое выполнение задач, создайте собственный конфигурационный
файл для конкретного пользователя.

30.3 Пользовательская настройка Cron


Каждый пользователь системы имеет свой файл заданий crontab, в котором описано, в какое
время и какие программы запускать от имени этого пользователя. Для редактирования файла
crontab используется специальная одноимённая программа crontab, позволяющая не прерывать
процесс cron на время редактирования.
Вывести содержимое текущего файла расписания:
user@localhost:~$ crontab -l
Удаление текущего файла расписания:
user@localhost:~$ crontab -r
Для редактирования файла crontab вашего пользователя используется команда:
user@localhost:~$ crontab -e
Вы можете создать собственную конфигурацию планировщика задач Cron с помощью команды
«crontab -e». Она автоматически откроет временный файл, который можно будет
отредактировать и сохранить. Опция -e позволяет начать изменение этого файла в вашем
текстовом редакторе, установленным в системе по умолчанию.
Файл настроек Cron делится на строки. Каждая новая строка — это конфигурация отдельной
задачи. Каждая конфигурация состоит из ряда составляющих, которые в общем виде можно
записать как «минута час день месяц день_недели имя_пользователя команда».
Пояснения к настройкам задачи:
1. Минута — в какую минуту внутри часа должна выполняться задача. Число от 0 до 59.
2. Час — указание часа внутри дня. Число от 0 до 23.

94
3. День — указание дня внутри месяца. Число от 1 до 31.
4. Месяц — порядковый номер месяца. От 1 до 12.
5. День_недели — Указание дня недели. От 0 до 7. При этом число 0 и 7 соответствует
воскресенью.
6. Имя_пользователя — системное имя пользователя, от которого будет выполнена команда.
7. Команда — полная запись консольной команды со всеми опциями и параметрами.
Если вы не хотите указывать конкретное значение для минуты, часа или любого другого
временного отрезка, поставьте знак «*». Он будет соответствовать любому значению. После
сохранения настроек они будут добавлены в директорию
/var/spool/cron/crontabs/имя_пользователя.
Примеры настройки резервного копирования папки пользователя
12 */2 * * * user_name tar czf /home/user_name /backups #каждую 12 минуту четного часа
30 14 * * 7 user_name tar czf /home/user_name /backups #каждое воскресенье в 14:30
0 0 1 1 * user_name tar czf /home/user_name /backups #каждый новый год
Заметка: Обратите внимание. Путь до исполняемого файла в команде должен быть абсолютным,
т.е. начиная от корня файловой системы.

31 Получение сведений об обрудовании


Наиболее полную информацию о компьютерном оборудовании в Linux, можно получить используя
утилиту dmidecode, отображающую данные из структуры SMBIOS, включающую таблицы,
содержащие записи о каждом из устройств, обнаруженных в данный момент времени. Для
использования возможностей утилиты требуются права root

31.1 Утилита dmidecode - отображение содержимого таблиц DMI


компьютера.
Интерфейс DMI ( Desktop Management Interface ) - это интеpфейс упpавления настольными
компьютерными системами, представляющий собой набор программных и аппаратных средств
для сбора, хранения и отображения данных об оборудовании компьютера. Спецификация DMI
была разработана в 1996 г. и дорабатывалась по мере развития компьютерных систем. Поддержка
интерфейса DMI встроена в BIOS всех современных материнских плат, а также осуществляется
через интерфейс API в прикладных программных продуктах. Для взаимодействия с интерфейсом
DMI, в BIOS материнских плат была добавлена спецификация DMIBIOS, которая с 1999 года
получила название SMBIOS - System Management BIOS - системное управление BIOS.
В соответствии со спецификацией SMBIOS, информация DMI об оборудовании хранится в виде
базы данных ( DMI Pool Data ), точка входа в которую определяется в структуре SMBIOS. Начальная
запись содержит признак базы - строку из 5 байт _DMI_, контрольную сумму, адрес и размер.
Утилита dmidecode позволяет извлечь записи из базы данных DMI и отобразить их в требуемом
виде.
Общий синтаксис команды dmidecode:
$ dmidecode [OPTIONS]
Параметры командной строки:
 -d, --dev-mem FILE - задать устройство для чтения данных DMI ( по умолчанию - /dev/mem)
 -h, --help - отобразить справку.

95
 -q, --quiet - минимальная детализация отображаемой информации DMI
 -s, --string KEYWORD - отображать только данные DMI, соответствующие введенному
ключевому слову. Перечень допустимых ключевых слов можно получить введя dmidecode
-s
 -t, --type TYPE - отображать только данные указанных типов. Перечень типов можно
получить по команде dmidecode -t -u, --dump - не расшифровывать получаемые данные.
Отображаются только заголовки записей и шестнадцатеричные значения полей.
 --dump-bin FILE - запись дампа данных DMI в файл.
 --from-dump FILE - считывание и обработка данных из ранее сохраненного дампа данных
DMI.
 -V, --version - отобразить версию программы и завершиться.
При запуске dmidecode без параметров, отображается версия программы, общая информация
базы DMI, и расшифрованное содержимое отдельных записей.
Пример общей информации:
# dmidecode 2.12
SMBIOS 2.4 present.
364 structures occupying 17092 bytes.
Table at 0x000E0010.
Отображается версия программы, версия SMBIOS, количество записей и объем данных DMI, а
также начальный адрес структуры DMI (0x000E0010 ) .
Долее отображается расшифрованная информация отдельных записей :
Handle 0x0001, DMI type 38, 20 bytes
IPMI Device Information
...
Handle 0x0002, DMI type 1, 27 bytes
System Information
...
Handle 0x0003, DMI type 2, 16 bytes
Base Board Information
...
Handle 0x0004, DMI type 3, 22 bytes
Chassis Information
...

Handle 0x0005, DMI type 0, 24 bytes


BIOS Information
...
Информация каждой записи начинается с дескриптора Handle, типа записи DMI Type и ее размера
в байтах. Утилита извлекает данные записей, декодирует их и представляется в виде обычного
текста, позволяющего получить сведения о текущем оборудовании компьютера.
Нередко требуется получить не всю информацию, содержащуюся в таблицах DMI, а только ту, что
имеет отношение к конкретному устройству или классу устройств, для чего предусмотрена
возможность указания типа данных с использованием параметра -t. В качестве типа данных
может быть использовано или числовое значение дескриптора Handle, или специальное ключевое

96
слово.
Допустимые ключевые слова для типов данных, задаваемых параметром -t :
 bios - сведения о BIOS
 system - сведения о переключателях системной платы.
 baseboard - сведения о материнской плате.
 chassis - сведения о переключателях и датчиках шасси.
 processor - сведения о центральном процессоре ( о процессорах для многопроцессорных
систем ) .
 memory - сведения об оперативной памяти.
 cache - сведения о кэш-памяти.
 connector - сведения о разъемах контроллеров периферийных устройств.
 slot - сведения о разъемах PCI/PCI-Express
Ниже приведены примеры выполнения команды dmidecode для разных типов данных.
Для отображения данных DMI о процессорах
$ dmidecode -t processor
dmidecode 2.10
SMBIOS 2.5 present.
Handle 0x0038, DMI type 4, 40 bytes
Processor Information
...
Для отображения данных, относящиеся к типу "connector", т.е информацию о разъемах
периферийного оборудования.
$ dmidecode -t connector
Handle 0x0009, DMI type 8, 9 bytes
Port Connector Information
...
Handle 0x000A, DMI type 8, 9 bytes
Port Connector Information
...
При использовании числовых значений дескрипторов , тип данных DMI можно указывать в
соответствии с таблицей :

97
Type Description Type Description
0 BIOS Information 23 System Reset
1 System Information 24 Hardware Security
2 Baseboard (or Module) Information 25 System Power Controls
3 System Enclosure or Chassis 26 Voltage Probe
4 Processor Information 27 Cooling Device
5 Memory Controller Information (Obsolete) 28 Temperature Probe
6 Memory Module Information (Obsolete) 29 Electrical Current Probe
7 Cache Information 30 Out-of-Band Remote Access
8 Port Connector Information 31 Boot Integrity Services (BIS) Entry Point
9 System Slots 32 System Boot Information
10 On Board Devices Information 33 64-Bit Memory Error Information
11 OEM Strings 34 Management Device
12 System Configuration Options 35 Management Device Component
13 BIOS Language Information 36 Management Device Threshold Data
14 Group Associations 37 Memory Channel
15 System Event Log 38 IPMI Device Information
16 Physical Memory Array 39 System Power Supply
17 Memory Device 40 Additional Information
18 32-Bit Memory Error Information 41 Onboard Devices Extended Information
19 Memory Array Mapped Address 42 Management Controller Host Interface
20 Memory Device Mapped Address 126 Inactive
21 Built-in Pointing Device 127 End-of-Table
22 Portable Battery 128-255 Available for system- and OEM- specific information

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


отобразить содержимое записей DMI для процессора ( тип 4 ) и модулей памяти ( тип 6) можно
использовать следующую команду:
$ dmidecode -t 4,6
Совокупность выводимых утилитой данных позволяет определить параметры оборудования,
которые не отображаются в явном виде. Например, следующая информация о процессоре
Core Count: 6
Core Enabled: 6
Thread Count: 12
говорит о том, что включен режим Hyper-threading. Если бы он был выключен, то значение Thread
Count совпадало бы со значением Core Enabled

31.2 Утилита lshw


Утилита lshw ( Hardware Lister ) менее информативна, чем рассмотренная выше dmidecode, но
позволяет получить сведения об оборудовании компьютера в различных форматах, в т.ч. в XML и
HTML, а также имеет поддержку графического интерфейса пользователя ( GUI ). Утилита
использует данные из таблиц DMI, конфигурационных файлов, модулей ядра и драйверов.
Общий синтаксис команды lshw:
lshw [-format] [-options ...]
lshw –version
Примеры параметров команды:
 -version - отобразить информацию о версии программы.

98
 -format - формат выводимых данных.
 -html - вывести информацию об оборудовании компьютера в формате HTML
 -xml - вывести информацию об оборудовании компьютера в формате XML
 -short - отобразить список устройств в кратком формате, без описаний.
 -businfo - отобразить информацию о шинах .
Примеры использования:
lshw - отобразить полную информацию об оборудовании в текстовом формате.
lshw –xml -отобразить информацию в XML-формате.
lshw –html > hardware.html - вывести информацию об оборудовании в формате HTML в
файл hardware.html

31.3 Прочие команды для получения сведений об оборудовании


Некоторые сведения об оборудовании можно получить из файлов каталога /proc:
 cat /proc/devices - информация о типах устройств.
 cat /proc/diskstats - информация о дисковых устройствах.
 cat /proc/dma - информация о режиме работы контроллера прямого доступа к памяти.
 cat /proc/iomem - информация об адресах, используемых контроллерами ввода-
вывода.
 cat /proc/ioports - информация о портах ввода-вывода.
 cat /proc/meminfo - информация об оперативной памяти.
 cat /proc/cpuinfo - информация о процессорах.

Кроме того, существуют специальные команды для отображения информации об отдельных типах
устройств:
 lscpu - отобразить информацию о процессорах.
 lshal - отобразить информацию об оборудовании в виде дампа глобального списка
устройств ( Global Device List ).
 lsusb - отобразить информацию о USB-устройствах.
 lsscsi - отобразить информацию об устройствах SCSI.
 lspci - отобразить информацию об устройствах на шинах PCI / PCI - Express.
 lspcmcia - отобразить информацию об устройствах на шине PCMCIA.
 lsblk - отобразить информацию о блочных устройствах (гибких и жестких дисках,
разделах и точках монтирования).
Информация, получаемая с помощью вышеперечисленных команд, носит более общий характер,
по сравнению с той, что может быть получена с помощью утилиты dmidecode.

Список вопросов для закрепления материала


 Компоненты дистрибутива Linux.
 Свойства ядра Linux.
 Основные подсистемы ядра Linux.

99
 Интерфейс системных вызовов.
 Управление процессами.
 Управление памятью.
 Виртуальная файловая система.
 Сетевой стек.
 Драйверы устройств.
 Архитектурно-зависимый код.
 Менеджеры пакетов.
 Преимущества менеджеров пакетов и разнообразие их форматов.
 Работа с RPM-пакетами, основные положения и учет RPM-пакетов.
 Установка и удаление RPM-пакетов.
 Менеджер управления пакетами Yum.
 Преимущества Yum, главная конфигурация и настройка репозиториев.
 Работа с DEB-пакетами, основные положения и учет DEB-пакетов.
 Установка и удаление DEB-пакетов.
 Менеджер пакетов АРТ.
 Преимущества APT и основная конфигурация.
 Работа с терминалами Linux.
 Понятие командной оболочки, основные возможности Bash.
 Командные оболочки и пользователи.
 Выполнение команд с параметрами.
 Использование опций консольных команд.
 Помощь по командам Linux.
 Причины использования справки.
 Использование опции Help и справочных страниц Man.
 Основные горячие клавиши терминала в Linux.
 История команд, поиск и автодополнение.
 Просмотр файлов в терминале Linux.
 Команды cat, tail и Head в Linux.
 Пейджеры more и less.
 Текстовый редактор Nano.
 Команда locate в Linux.
 Потоки ввода-вывода в Linux.
 Перенаправление потоков ввода-вывода.
 Для чего нужны программные каналы и их применение.
 Работа с файлами и каталогами.
 Создание, копирование и удаление файлов в Linux.
 Поиск файлов в Linux.
 Права доступа файлов и папок в Linux.
 Специальные биты доступа в Linux.

100
 Создание и распаковка архивов в Linux.
 Просмотр содержимого архива без распаковки.
 Иерархия процессов, просмотр списка процессов и их статусы процессов.
 Сигналы и способы завершения процесса.
 Назначение приоритета новому процессу.
 Управление ранее запущенным процессом.
 Запуск процесса от имени другого пользователя.
 Что такое демоны и сервисы.
 Запуск и остановка сервиса в Linux.
 Перезапуск и автозапуск сервисов.
 Добавление и удаление сервиса в автозапуск.
 Планировщик задач в Linux.
 Область применения Cron.
 Пользовательская настройка Cron.

101