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

Оглавление

Глава 1. Загрузка операционной системы с MBR и GPT...........................................................3


1.1. Общая теория о разделах MBR. .......................................................................................3
1.2. Определение C/H/S. ...........................................................................................................5
1.3. Технологии используемые при организации логических разделов на диске. .............6
1.4. Процесс загрузки с MBR. ..................................................................................................6
1.5. GUID-таблица разделов (GPT). ........................................................................................7
Защитная MBR. ..........................................................................................................................8
Заголовок GPT. .........................................................................................................................10
Массив разделов.......................................................................................................................12
Глава 2. GRand Unified Bootloader (GRUB). .............................................................................14
2.1. Особенности GRUB2 ........................................................................................................15
Глава 3. Системный менеджер systemd. ....................................................................................18
3.1. Конфигурационные файлы юнитов. ...............................................................................22
3.2. Уровни загрузки/цели (.target) .........................................................................................31
3.3. Управление сервисами .....................................................................................................34
Глава 4. Структура файловой системы (FHS)...........................................................................36
4.1. Семь основных типов файлов. .........................................................................................39
4.2. Утилиты для работы с файлами. .....................................................................................41
4.3. Утилиты для получения информации об аппаратных ресурсах. .................................53
Глава 5. Дисковые файловые системы, поддерживаемые в RHEL/CentOS. ..........................55
5.1. XFS базовая файловая система для RHEL/CentOS 7. ....................................................56
Глава 6. Администрирование программных компонентов ОС Linux. ...................................60
6.1. Структура директории /etc. ..............................................................................................61
6.2. Конфигурационные файлы в директории /etc/sysconfig. ..............................................64
6.3. Назначение директорий /opt и /etc/opt. ...........................................................................68
6.4. Базовая настройка операционной системы Linux. .........................................................69
Глава 7. Конфигурирование интерфейсов с помощью NetworkManager. ..............................76
7.1. Использование NetworkManager в RHEL/CentOS 6. .....................................................77
7.2. Использование NetworkManager в RHEL/CentOS 7. .....................................................82
Глава 8. Редактор vi. ....................................................................................................................89
Глава 9. Утилиты для анализа файлов .......................................................................................95
Сравнение файлов и команда patch ........................................................................................95
Утилита grep (Global Regular Expression Print) .....................................................................96
Глава 10. Пользователи и группы. ............................................................................................ 99
10.1. Пользователи и группы в операционной системе. ..................................................... 99
10.2. Утилиты для работы с пользователями и группами ................................................. 104
Глава 11. Утилиты для конфигурирования и мониторинга сетевых интерфейсов. ........... 108
11.2. Утилиты для диагностики и мониторинга работы сети. .......................................... 117
Глава 12. Основы безопасности. ............................................................................................. 119
12.1. Использование утилит sudo и su управления для управления правами
пользователей ........................................................................................................................ 121
12.2. Pluggable Authentication Modules (PAM).................................................................... 128
12.3. Security-Enhanced Linux (SELinux). ............................................................................ 135
Глава 13. Протокол SSH ....................................................................................................... 143
13.1. Настройка удалённого доступа к консоли.................................................................. 144
13.2. Рекомендуемые параметры безопасности. ................................................................ 147
Глава 14. Процессы в операционной системе. ....................................................................... 149
Глава 15. Работа с пакетами приложений. ............................................................................. 156
Глава 16. Архивирование данных. .......................................................................................... 165
Глава 17. Менеджер логических томов LVM. ....................................................................... 167

2
Глава 1. Загрузка операционной системы с MBR и GPT.
1.1. Общая теория о разделах MBR.
Аббревиатура MBR расшифровывается как Главная загрузочная запись.
Этот стандарт был представлен в 1983 году вместе с DOS 2.0 для IBM PC. MBR
- это специальный загрузочный сектор, расположенный в начале диска. Этот
сектор содержит загрузчик для установленной операционной системы, а так
же информацию о логических разделах диска.
MBR работает с дисками объёмом до 2 Тб., но он может справиться и с
дисками большего размера. Кроме этого MBR поддерживает не более 4 основ-
ных разделов.
Жесткий диск можно представить как один длинный массив из секторов.
Один сектор это 512 байт, сектора нумеруются с нуля. Нулевой сектор еще
называют MBR (Master Boot Record). Раздел это несколько подряд идущих сек-
торов, раздел можно описать двумя числами: номером первого сектора (или
сдвигом в секторах относительно начала диска) и количеством секторов в раз-
деле. Разделы бывают либо основными (primary), либо логическими (logical).
Разделы также можно делить по типу на обычные и расширенные
(extended). Первый сектор раздела называется boot-сектором. Основных разде-
лов на диске может быть не больше четырех. Информация о каждом основном
разделе записывается в MBR, информация о логических разделах записыва-
ется в boot-секторах расширенных разделов. Аналогичное ограничение: рас-
ширенный раздел может нести информацию максимум о четырех логических
разделах. В обоих случаях эта информация всегда хранится в конце boot-сек-
тора, начиная с 446-го байта.
Для каждого раздела отводится блок по 16 байт. После четырех блоков
еще остается два байта -- подпись, она должна быть (55 AA). Внутри 16-байт-
ного блока первый байт отвечает флагу bootable у раздела, потом 3 байта --
CHS-адрес начала раздела, 5-й байт -- тип раздела, еще три байта -- CHS-адрес
конца раздела, следующие четыре байта -- сдвиг начала раздела, последние
четыре байта -- длина раздела. Для обычных и основных разделов сдвиг раз-
дела отсчитывается с того сектора, в котором и записана эта информация. Для
расширенных логических разделов отсчет идет от начала основного расширен-
ного раздела, "внутри" которого они находятся.
Таким образом, отсчет разделов идет от MBR (от сектора с номером 0)
для всех основных (primary) разделов, как для обычных, так и для расширен-
ного, и только для основных. Все обычные логические (not extended logical)
разделы задаются сдвигом относительно начала того расширенного раздела, в
котором они описаны. Все расширенные логические (extended logical) разделы
задаются сдвигом относительно начала основного расширенного раздела
(extended primary).
Внутри одного расширенного раздела может быть описание другого рас-
ширенного, что позволяет строить цепочки расширенных разделов произволь-
ной длины. Вы можете также попробовать сделать цикл, если хотите прове-
рить свою операционную систему на вшивость :grin:
Рассмотрим пример MBR жесткого диска:
3
0000000: 33 c0 8e d0 bc 00 7c fb 50 07 50 1f fc be 1b 7c
0000010: bf 1b 06 50 57 b9 e5 01 f3 a4 cb bd be 07 b1 04
0000020: 38 6e 00 7c 09 75 13 83 c5 10 e2 f4 cd 18 8b f5
0000030: 83 c6 10 49 74 19 38 2c 74 f6 a0 b5 07 b4 07 8b
0000040: f0 ac 3c 00 74 fc bb 07 00 b4 0e cd 10 eb f2 88
0000050: 4e 10 e8 46 00 73 2a fe 46 10 80 7e 04 0b 74 0b
0000060: 80 7e 04 0c 74 05 a0 b6 07 75 d2 80 46 02 06 83
0000070: 46 08 06 83 56 0a 00 e8 21 00 73 05 a0 b6 07 eb
0000080: bc 81 3e fe 7d 55 aa 74 0b 80 7e 10 00 74 c8 a0
0000090: b7 07 eb a9 8b fc 1e 57 8b f5 cb bf 05 00 8a 56
00000a0: 00 b4 08 cd 13 72 23 8a c1 24 3f 98 8a de 8a fc
00000b0: 43 f7 e3 8b d1 86 d6 b1 06 d2 ee 42 f7 e2 39 56
00000c0: 0a 77 23 72 05 39 46 08 73 1c b8 01 02 bb 00 7c
00000d0: 8b 4e 02 8b 56 00 cd 13 73 51 4f 74 4e 32 e4 8a
00000e0: 56 00 cd 13 eb e4 8a 56 00 60 bb aa 55 b4 41 cd
00000f0: 13 72 36 81 fb 55 aa 75 30 f6 c1 01 74 2b 61 60
0000100: 6a 00 6a 00 ff 76 0a ff 76 08 6a 00 68 00 7c 6a
0000110: 01 6a 10 b4 42 8b f4 cd 13 61 61 73 0e 4f 74 0b
0000120: 32 e4 8a 56 00 cd 13 eb d6 61 f9 c3 49 6e 76 61
0000130: 6c 69 64 20 70 61 72 74 69 74 69 6f 6e 20 74 61
0000140: 62 6c 65 00 45 72 72 6f 72 20 6c 6f 61 64 69 6e
0000150: 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74
0000160: 65 6d 00 4d 69 73 73 69 6e 67 20 6f 70 65 72 61
0000170: 74 69 6e 67 20 73 79 73 74 65 6d 00 00 00 00 00
0000180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00001a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00001b0: 00 00 00 00 00 2c 44 63 2e 69 2e 69 00 00 00 01
00001c0: 01 00 07 34 ff ff 3f 00 00 00 c1 25 8c 02 80 00
00001d0: c1 ff 83 34 ff ff 00 26 8c 02 00 13 46 01 00 00
00001e0: c1 ff 07 34 ff ff 00 39 d2 03 00 13 46 01 00 00
00001f0: c1 ff 0f 34 ff ff 00 4c 18 05 55 2b e4 01 55 aa
В нем указаны все четыре основных раздела, рассмотрим отдельно 16-
байтный блок первого раздела:
00001be: 00 01 01 00 07 34 ff ff 3f 00 00 00 c1 25 8c 02
Он не активный или, говоря иначе, не bootable (первый байт 00, а для
bootable должно быть 80), далее три байта в них записан CHS-адрес начала
раздела. Следующий байт -- тип раздела, 07 -- NTFS. Список типов можно
узнать с помощью fdisk/sfdisk. Типы 05, 0f и 85 соответствуют расширенным
разделам. Далее смещение начала раздела -- 0x0000003f, и длина --
0x028c25c1.
В приведенном MBR четвертый раздел --расширенный и он начинается
с сектора номер 0x05184c00=85478400, и в конце (55 AA) и таблица разделов:
00001be: 00 00 00 00 83 00 00 00 ef 67 e3 01 66 c3 00 00
00001ce: 00 00 00 00 05 00 00 00 01 00 00 00 01 00 00 00
00001de: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00001ee: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Здесь указаны два логических раздела: нормальный (тип 83 -- Linux) и
расширенный. Смещение первого считается относительно начала текущего
сектора, а смещение второго относительно начала основного расширенного
4
раздела. В этом случае это одно и то же, но это уже будет не так, если перейдем
в сектор, где начинается наш новый логический расширенный раздел.
Начинается он в секторе номер 85478400+1=85478401. В нем также по-
чти везде нули, выделим лишь таблицу разделов:
00001be: 00 00 00 00 0b 00 00 00 3e 00 00 00 c1 6a ae 01
00001ce: 00 00 00 00 05 00 00 00 00 6b ae 01 01 00 00 00
00001de: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00001ee: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Первый раздел типа FAT32, его сдвиг -- 0x0000003e=62, и считается он
относительно текущего сектора, то есть реально раздел начинается с сектора
номер 85478401+62=85478463. Второй раздел -- расширенный, его сдвиг --
0x01ae6b00=28207872, но его сдвиг считается от сектора 85478400, так как
этот раздел расширенный. То есть его первый сектор имеет номер
85478400+28207872=113686272, и именно с этотго сектора необходимо искать
таблицу разделов.
1.2. Определение C/H/S.
Под C/H/S следует понимать либо геометрию диска или адрес сектора.
В обоих случаях это тройка чисел.
Пусть (C,H,S) будет означать геометрию, а (c,h,s) -- адрес. В адресе зна-
чения c и h отсчитываются с нуля, а s с единицы. Общая формула перевода
такого адреса в номер сектора следующая: n = (H*c + h)*S + (s-1). Размер диска
в таком случае равен C*H*S секторов. Подобная адресация используется
BIOS'ом на самом низком уровне и была необходима раньше, когда винче-
стеру надо было конкретно указывать местоположение сектора на диске (но-
мер головки, номер дорожки, и номер сектора на дорожке). И значения C/H/S
соответствовали реальной "геометрии" диска. Например C=614, H=4, S=17. В
таком винчестере могло быть, например, два магнитных диска, а информация
могла храниться на двух сторонах, то есть всего было 4 головки. На каждой
стороне было 614 дорожек, а на каждой дорожке хранилось 17 секторов. Об-
щая емкость такого диска будет 614*4*17*512 байт = 21 377 024 байт (~20 Mb).
Современные винчестеры имеют большие объемы, и они куда более ин-
телектуальнее своих предшественников, однако, они должны поддерживать и
CHS-адресацию. Трансляция этого адреса в нормальный адрес происходит
уже внутри винчестера. Чтобы BIOS мог адресовать таким образом как можно
больше секторов, то часто делают значения H и S максимальными: H=255,
S=63. Максимум чего сможет добиться BIOS в этом случае, это 1023*255*63
секторов или чуть меньше 8 гигабайт.
В большинстве случаев операционным системам все равно, что указы-
вается в CHS-адресах начала и конца разделов, но это может быть иногда кри-
тично для загрузчика MBR.

5
1.3. Технологии используемые при организации логических разде-
лов на диске.
Выравнивание
Начало раздела должно начинаться на первом секторе в дорожке, то есть
в CHS-адресе s=1, Конец раздела должен заканчиваться на последнем секторе
дорожки (s=S). Более того часто стараются начало выранивать еще и по голов-
кам диска, то есть (h=0 или h=1, если сектор с h=0 занят MBR или началом
расширенного раздела), и конец также выравнивают по головкам (h=H-1). По-
чти всегда основные разделы, кроме первого, и расширенные разделы начина-
ются с h=0, а все нормальные логические и первый основной с h=1.
Обычные разделы не должны пересекаться между собой, каждый обыч-
ный логический раздел должен лежать целиком внутри расширенного раздела,
в котором он описан. Внутри таблицы разделов разделы должны перечис-
ляться в нормальном порядке.
Дерево логических разделов
Все логические разделы можно представить в виде дерева, где родитель
-- расширенный радел, в котором хранится информация о текущем разделе, а
сыновья есть только у расширенных разделов. Листья -- нормальные разделы.
Корень -- основной расширенный раздел. По "стандартам" расширенным мо-
жет быть только один основной раздел. Как правило в расширенном разделе
указывают из четырех возможных разделов не больше двух: один обычный и,
возможно, еще один расширенный (следующий в цепочке). То есть дерево
можно представить как одну длинную ветку, в каждом узле которой по одному
листу.
Нумерация разделов
В общем случае при рекурсивном обходе дерева логических разделов их
можно просто перенумеровать. Основные разделы нумеруют отдельно. Как
правило логические расширенные разделы не учитывают, и вообще доступ
пользователя к ним скрыт. В Windows также пропускают основной расширен-
ный раздел, а в Linux его учитывают. После этого в списке сначала идут ос-
новные разделы, а потом логические. В Linux логические разделы всегда начи-
наются с номера 5 независимо от количества основных. В Linux есть ограни-
чение на максимальный номер раздела, это 63 для /dev/hd* и всего 15 для
/dev/sd*, хотя при этом fdisk видит до 60 разделов, а sfdisk до 128. В Windows
подобное ограничение мне не известно, но оно не меньше 118 :D
1.4. Процесс загрузки с MBR.
Теперь рассмотрим процесс загрузки операционной системы. При вклю-
чении компьютера управление процессором получает BIOS, и если он
настроен на загрузку (boot) с винчестера, то он подгружает в оперативную па-
мять компьютера первый сектор диска (MBR) и передает управление ему.
Фактически MBR можно считать очень маленькой программкой. В MBR
может быть записан как "стандартный" загрузчик, так и загрузчики типа
LILO/GRUB.
Стандартный загрузчик находит в таблице основных разделов первый
раздел с флагом bootable, считывает его первый сектор (boot-сектор) и
6
передает управление коду, записанному в этом boot-секторе. Если вместо стан-
дартного загрузчика MBR стоит другой, то он игнорирует флаг bootable и не
передает управление другим boot-секторам, что в может приводит к сутуации
невозможности загрузки операционной системы.
Поэтому при использовании загрузчика Linux GBUB загрузчик опереци-
онной системы состоит из несколькоих частей, обычно двух, но ножет быть и
три. Перевая часть: stage1 (512 байт) и вторая часть stage2 (несколько десятков
килобайт). В случаен использования трех частей, промежучтная strage 1,5 рас-
полагается между strage 1 и strage 2 . Stage1 прописывается в boot-сектор, а
stage2 обычно копируют в /boot/grub. В stage1 прописан адрес сектора, в кото-
ром находятся первые 512 байт файла stage2, stage1 подгружает этот сектор в
память и передает управление ему. Он в свою очередь подгружает остальную
часть файла stage2 в память, для этого в конце первых 512 байт записан список
секторов, где лежит остальная часть. Такая сложная схема обусловлена ма-
леньким количеством свободного места для загрузчика внутри MBR/boot-сек-
тора.
После загрузки stage2 читает конфигурационный файл grub и продол-
жает процесс загрузки, загружая образ ядра просле этого передает процесс
управления загрузки менеджеру загрузки Linux.
Замечание. Так как stage1 GRUB'а использует прерывания BIOS'а для
чтения секторов, то могут возникнуть проблемы при попытке загрузить stage2,
если он лежит достаточно далеко от начала диска. GRUB поддерживает и CHS-
адресацию и LBA. В некоторых BIOS используется только 28-битная адреса-
ция в режиме LBA, в таком случае для stage1 будут доступны только первые
128Гб, или даже меньше, если загрузчик не поддерживает LBA. Это говорит о
том, что вторая часть, которая подгружается этим миниатюрным кодом,
должна находиться в начале диска.
1.5. GUID-таблица разделов (GPT).
Компания Intel® разработала GPT как часть спецификации интерфейса
EFI (Extensible Firmware Interface), который призван заменить собой BIOS.
Независимо от того, используется ли на вашем компьютере устаревшая си-
стема BIOS или новый интерфейс EFI, таблица разделов GPT позволяет устра-
нить множество ограничений, связанных с главной загрузочной записью:
• GPT работает исключительно с адресацией LBA, поэтому можно забыть
обо всех проблемах, связанных с адресацией CHS.
• Дисковые указатели имеют размер в 64 бита; это означает, что GPT мо-
жет работать с дисками емкостью вплоть до 512 x 264 байтов (8 зебиб-
айтов, или 8.6 миллиардов ТиБ) при размере сектора 512 байтов.
• Структуры данных GPT хранятся на диске в двух местах: в начале и в
конце диска. Это повышает шансы на успешное восстановление данных
после аппаратных сбоев или обнаружении сбойных секторов.
• Для критически важных структур данных вычисляются циклические
значения проверок избыточности, что повышает шансы на обнаружение
поврежденных данных.
• GPT хранит все разделы в единой таблице разделов (которая резервиру-
ется), поэтому нет необходимости использовать расширенные или
7
логические разделы. По умолчанию можно создать 128 разделов, но раз-
мер таблицы разделов можно изменять, если это поддерживается про-
граммным обеспечением для работы с разделами.
• MBR использует для идентификации раздела однобайтовый код с типом
раздела, однако GPT использует для этого 16-байтовый глобальный уни-
кальный идентификатор (GUID). Это снижает вероятность коллизий,
связанных с типом разделов.
• GPT позволяет использовать удобочитаемые имена разделов. Это поле
можно использовать для присвоения в Linux® имен разделам /home, /usr,
/var, а также другим разделам для их быстрой идентификации при работе
с программным обеспечением.
Логические структуры дисков в формате GPT приведены на рисунках
1.1 и 1.2.
Защитная MBR.
Первый сектор диска зарезервирован под защитную главную загрузоч-
ную запись protective MBR, которая является официальной структурой данных
MBR и указывает на один единственный раздел с типом 0xEE (EFI GPT). На
дисках емкостью менее 2 ТиБ этот раздел должен занимать весь диск; на дис-
ках большей емкости он должен иметь размер в 2 ТиБ. Основное назначение
защитной MBR - защитить GPT-диск от повреждений при работе с утилитами,
которые не умеют работать с GPT. Если такая утилита обратится к диску, то
увидит MBR-диск, на котором отсутствует свободное пространство. Некото-
рые дисковые утилиты умеют создавать гибридные MBR, которые помимо
раздела EFI GPT могут указывать на три или менее MBR-раздела. Гибридные
загрузочные записи позволяют инсталлировать на диске с GPT-разделами опе-
рационные системы, не умеющие работать с GPT (например, версии Windows,
выпущенные до Windows Vista®). Однако такая конфигурация является не-
стандартной и редко используется на практике.
Поскольку в GPT реализована защитная MBR, то компьютеры на базе
BIOS могут загружаться с GPT-диска с помощью загрузчика, хранящегося в
области кода защитной MBR, однако при этом и загрузчик, и операционная
система должны уметь работать с GPT (тем не менее, при загрузке с GPT-дис-
ков в некоторых не отлаженных до конца BIOS могут возникать проблемы,).
EFI применяет собственные методы загрузки, поэтому в системах на базе EFI
можно загружаться с GPT-дисков.
Основной проблемой GPT является проблема совместимости: таблица
разделов GPT должна поддерживаться всеми низкоуровневыми дисковыми
утилитами и операционными системами. Эта поддержка присутствует практи-
чески во всех операционных системах Linux, тем не менее, необходимо уде-
лять внимание этим деталям и использовать только те низкоуровневые диско-
вые утилиты, которые поддерживают работу с GPT.

8
Рис.1.1. Логическая структа диска GPT.

9
Рис.1.2. Логическая структа диска GPT.
Заголовок GPT.
Первой структурой данных GPT является её заголовок (GPT Header); он
размещается в первом секторе диска (LBA = 1). Длина заголовка в будущем
может увеличиться, однако он никогда не превысит размер одного физиче-
ского сектора диска. Для увеличения надёжности хранения данных и устойчи-
вости к сбоям предусмотрена резервная копия заголовка GPT, она хранится в
последнем секторе диска. Обе копии заголовка имеют ссылки друг на друга.
10
Сме-
Раз-
Обозначение ще- Описание
мер
ние
Сигнатура заголовка GPT (строка символов
Signature 00h 8
«EFI PART», 5452415020494645h)
Версия формата заголовка; к номеру версии
спецификации UEFI она отношения не
Revision 08h 4 имеет. Сейчас используется первая версия
заголовка, которой соответствует значение
00010000h
Размер заголовка GPT в байтах. Он должен
HeaderSize 0Ch 4 превосходить 92 и не должен превышать
размер сектора
Контрольная сумма заголовка GPT размером
HeaderSize байтов. При подсчёте контроль-
HeaderCRC32 10h 4
ной суммы начальное значение этого поля
принимается равным нулю
Зарезервированное поле; должно содержать
Reserved 14h 4
нуль
MyLBA 18h 8 LBA этой копии заголовка
AlternateLBA 20h 8 LBA другой копии заголовка
LBA первого блока, с которого могут начи-
FirstUsableLBA 28h 8
наться разделы этого диска
LBA последнего блока, после которого на
LastUsableLBA 30h 8
диске не может быть разделов
Уникальный идентификатор (GUID) этого
DiskGUID 38h 16
диска
PartitionEntryLBA 48h 8 LBA начала массива разделов диска
Количество записей в массиве разделов
NumberOfPartitionEntries 50h 4
диска
Размер каждой записи массива разделов;
SizeOfPartitionEntry 54h 4
должен быть кратен 8
Контрольная сумма масива разделов. Под-
счёт суммы начинается с начала блока, ад-
рес которого указан полем
PartitionEntryArrayCRC32 58h 4 PartitionEntryLBA, и охватывает
NumberOfPartitionEntries *
SizeOfPartitionEntry байт, то есть весь массив
разделов
Раз-
мер
Резервная область заголовка, должна содер-
Reserved 5Сh сек-
жать нули
тора -
5Сh

Поля FirstUsableLBA и LastUsableLBA определяют область диска, до-


ступную для размещения в ней разделов. За пределами этой области находятся

11
лишь структуры данных UEFI, предназначенные для управления разделами,
то есть MBR, заголовок GPT и массив разделов GPT.
Массив разделов.
Массив разделов начинается непосредственно за блоком заголовка GPT,
то есть со второго блока диска (LBA=2). Копия массива находится в конце
диска и вплотную примыкает к копии заголовка, то есть кончается предпо-
следним блоком диска.
Массив разделов состоит из записей одинакового формата, каждая из ко-
торых описывает один раздел диска. Первая запись начинается с начала пер-
вого сектора массива, последующие вплотную примыкают друг к другу. Раз-
мер записей может меняться, однако на одном диске все записи имеют одина-
ковую длину, указанную в заголовке GPT и кратную 8.
Сме-
Обозначение ще- Размер Описание
ние
GUID типа данного раздела. Определяет
PartitionTypeGUID 0h 16 файловую систему, используемую для хра-
нения данных в этом разделе
GUID раздела. Является уникальным иден-
UniquePartitionGUID 10h 16 тификатором раздела и создаётся каждый
раз, когда создаётся раздел
StartingLBA 20h 8 LBA первого блока данного раздела на диске
LBA последнего блока данного раздела на
EndingLBA 28h 8
диске
Attributes 30h 8 Атрибуты раздела
Строка в кодировке Unicode, содержащая
PartitionName 38h 72
имя данного раздела
размер
Неиспользуемая часть записи массива раз-
Reserved 80h записи -
делов
80h

GUID типов разделов.


Каждая файловая система получает свой GUID, однозначно её иденти-
фицирующий. Стандарт UEFI определяет следующие GUID типов разделов.
Значение GUID Описание
00000000-0000-0000-0000-000000000000 Неиспользуемая запись
C12A7328-F81F-11d2-BA4B-00A0C93EC93B Системный раздел UEFI
024DEE41-33E7-11d3-9D69-0008C781F39F Раздел, содержащий традиционную MBR

Разработчики ОС для своих файловых систем формируют собственные


коды GUID.
Атрибуты разделов.
Бит Описание

12
Признак необходимости раздела для функционирования машины. Установкой этого
бита владелец/создатель раздела указывает, что без него компьютер может ока-
заться неработоспособным. В частности, ОС может отказаться загружаться или
0 даже устанавливаться, если этого раздела нет. Удалять или модифицировать такой
раздел может только программное обеспечение, точно знающее его назначение и
функции, все остальные программы, встретив такой раздел в GPT, не должны ка-
ким-либо образом менять его
Когда этот бит установлен, BIOS не должна создавать для этого раздела устройство
1
EFI_BLOCK_IO_PROTOCOL. Подробно это описано в спецификации UEFI
2–
Зарезервировано для нужд UEFI; должны быть равны нулю
47
Используются для нужд разработчиков файловых систем. При изменении значений
48–
разрядов 0–47 значения этих разрядов должны сохраняться, они изменяются только
63
программным обеспечением соответствующей файловой системы

Поддержка на уровне загрузчика.


Поддержка GPT реализована не во всех загрузчиках и зависит от типа
микрокода компьютера. На компьютерах с BIOS таблица разделов GPT офи-
циально поддерживается только в загрузчике GRUB 2. Большинство совре-
менных дистрибутивов Linux используют Grand Unified Bootloader (GRUB) 2
в качестве загрузчика по умолчанию, тем не менее, некоторые дистрибутивы
продолжают использовать старую версию GRUB – GRUB Legacy. Офици-
ально загрузчик GRUB Legacy не поддерживает GPT, однако доступны его ис-
правленные версии, обладающие такой поддержкой. Еще более ранний загруз-
чик LILO не поддерживает GPT явно, но его методы дисковой адресации ос-
нованы на расположении секторов, поэтому на практике зачастую LILO рабо-
тает с GPT.
Поддержка больших файловых систем.
Если при переходе на использование GPT при работе с большим RAID-
массивом, то необходимо, какие максимальные размеры томов и файлов могут
поддерживать файловые системы.
Эти ограничения приведены в таблице 1, некоторые из этих значений
очень большие и для них могут использоваться суффиксы, 1 пепибайт (ПиБ)
равен 1024 ТиБ, 1 эксбибайт (ЭиБ) равен 1024 петабайтам и 1 зебибайт равен
1024 ПиБ.
Таблица. Максимальные размеры томов и файлов в различных
файловых системах
Максимальный размер Максимальный размер
Файловая система
тома файла
Вторая и третья расширенная файло-
16 ТиБ 2 ТиБ
вая система (ext2 и ext3)
Четвертая расширенная файловая
1 ЭиБ 16 ТиБ
система (ext4)
Файловая система ReiserFS 16 ТиБ 8 ТиБ
Журналируемая файловая система (JFS) 32 ПиБ 4 ПиБ
Файловая система XFS 16 ЭиБ 8 ЭиБ
Файловая система B-дерева (Btrfs) 16 ЭиБ 16 ЭиБ

13
Глава 2. GRand Unified Bootloader (GRUB).
GRUB – это загрузчик операционной системы Linux, который позволяет
пользователям загружать любую из установленных на компьютере операци-
онных систем.
GRUB умеет загружать такие операционные системы как Linux,
FreeBSD, Solaris и многие другие.
Загрузчик GRUB получил официальное признание от Red Hat и в данный
момент является загрузчиком по умолчанию в дистрибутивах Red Hat, Fedora.
Загрузчик GRUB является очень полезным для пользователя, у которого
на компьютере установлено несколько операционных систем, и существует
необходимость передачи им различных параметров.
GRUB читает свой конфигурационный файл в ходе начальной загрузки,
что избавляет пользователя от необходимости делать запись настроек в MBR
после каждого их изменения.
Также GRUB позволяет в интерактивном режиме во время загрузки из-
менить параметры загрузки).
Основными функциональные возможности GRUB:
• Загрузка большого количества операционных систем
• Возможность защиты загрузки паролем.
• Возможность изменять графический интерфейс пользователя.
Размещение GRUB при загрузке с диска MBR.

MBR
Stage 1 Stage 1,5
Stage 2
446 byte 32 256 byte
/boot/grub
boot.img core.img

Sector 0 Sector 1-62 /dev/{disk}


Размещение GRUB 2 при загрузке с диска GPT.
GPT предусматривает специальный раздел «BIOS boot partition» с
GUID=21686148-6449-6e6f-744e656564454649, и может быть создан в fdisk как
раздел типа 4, или в gdisk как раздел типа EF02.

PMBR
Stage 1
446 byte core.img /boot/grub
boot.img
Sector 0 Sector 1-2047 /dev/{disk}
При загрузке в режиме UEFI
Загрузочный раздел UEFI называется "EFI System Partition", он же ESP,
он же EFISYS. На каждом диске может быть не более одного такого раздела.

14
▪ В GPT он должен иметь тип EF00 (GUID=C12A7328-F81F-11D2-BA4B-
00A0C93EC93B), и может располагаться в любом месте диска под лю-
бым номером. При этом он должен быть отформатирован в одну из фай-
ловых систем FAT – FAT12, FAT16, FAT32.
▪ К загрузочному разделу в PMBR требования более жесткие: он должен
одновременно иметь тип EF, флаг "bootable", и быть первым.
Загрузочный образ.
Загружаемый файл должен быть оформлен как EFI-приложение, а зна-
чит иметь унаследованный от DOS и Windows бинарный формат MZ/PE
(Portable Executable) и соответствовать архитектуре UEFI.
Все реализации UEFI для платформы PC имеют архитектуру x86_64, а
значит и сборка загрузчика обязательно должна быть под эту архитектуру.
Сборка загрузчика под i386 может быть полезна только на некоторых специ-
фических машинах, в основном это старые компьютеры фирмы Apple.
Имя файла по-умолчанию.
UEFI архитектуры x86_64 автоматически находит на загрузочном раз-
деле и запускает файл \EFI\BOOT\BOOTX64.EFI, который может быть старто-
вым образом загрузчика.
2.1. Особенности GRUB2
Принципиальное отличие в управлении GRUB2 - конфигурационный
файл /boot/grub/grub.cfg не редактируется вручную, а создается автоматически
командой:
grub2-mkconfig
на основе файла настроек /etc/deafult/grub и скриптов, находящихся в
/etc/grub.d/.
Команда grub2-mkconfig, генерирует содержимое нового конфигурацион-
ного файла, не перезаписывая старый, а выводя это содержимое на стандарт-
ное устройство вывода, поэтому для изменения конфигурационного файла
применяется цепочка команд:
grub2-mkconfig > /boot/grub/grub.cfg
В зависимости от дистрибутива набор скриптов различен, но есть
скрипты, которые присутствуют в большинстве дистрибутивов:
загружает установки GRUB из /etc/default/grub, такие, как время ожи-
00_header дания выбора конфигурации, конфигурация загружаемая по умолча-
нию и другие.

10_linux загружает конфигурации меню для установленного дистрибутива.

20_memtest86+ загружает утилиту тестирования памяти.

сканирует жесткие диски на наличие других операционных систем и


30_os-prober
добавляет их в загрузочное меню.

40_custom предназначен для добавления пунктов меню загрузки вручную.

Нумерация скриптов осуществляется согласно очередности их исполне-


ния. Эти скрипты не должны редактироваться, за исключением скрипта
15
40_custom, который как раз и предназначен для создания собственных пунктов
меню загрузки.
Правильным способом настройки сгенерированных системой пунктов
меню загрузки является редактирование файла настроек /etc/deafult/grub.
Параметры /etc/default/grub
GRUB_DEFAULT устанавливает систему загружаемую по умолчанию.
Может быть равен номеру:
GRUB_DEFAULT=0
или точному названию:
GRUB_DEFAULT="Microsoft Windows XP Professional (on /dev/sda1)
GRUB_SAVEDEFAULT=true в паре с GRUB_DEFAULT=keep позволяют
сохранить выбор загружаемой системы, сделав ее системой по умолча-
нию.
GRUB_TIMEOUT - время в секундах, в течении которого GRUB ждет вы-
бора, прежде чем загрузить систему по умолчанию. Можно установить
равным 0, чтобы GRUB не показывал экран выбора ОС, или любое отри-
цательное значение для отключения таймера.
GRUB_HIDDEN_TIMEOUT указывает паузу в секундах перед отображе-
нием меню загрузки. Учитывается, только тогда, когда установлено не-
сколько ОС. Если параметр GRUB_HIDDEN_TIMEOUT_QUIET=true, то
во время ожидания таймер не отображается.
GRUB_DISTRIBUTOR - название текущего дистрибутива, используется
при формировании соответствующей записи в меню выбора ОС.
GRUB_CMDLINE_LINUX, GRUB_CMDLINE_LINUX_DEFAULT - спи-
сок параметров, передаваемых ядру Linux. Значения параметра
GRUB_CMDLINE_LINUX используются как для обычного режима за-
грузки, так и для режима восстановления (recovery). Значения параметра
GRUB_CMDLINE_LINUX_DEFAULT используются только обычным ре-
жимом. Аналогично используются параметры GRUB_CMDLINE_NET-
BSD, GRUB_CMDLINE_NETBSD_DEFAULT GRUB_CMDLINE_XEN,
GRUB_CMDLINE_XEN_DEFAULT для систем NetBSD и Xen.
GRUB_DISABLE_RECOVERY=true - пункт меню загрузки в режиме вос-
становления не создается.
GRUB_DISABLE_OS_PROBER=true - отключает поиск других установ-
ленных ОС и генерацию для них пунктов меню загрузки.
GRUB_GFXMODE=1280x768x32 - устанавливает разрешение экрана.
Третий параметр (цветность) можно опустить. Список доступных разре-
шений можно посмотреть командой vbeinfo в командной строке GRUB2.
GRUB_GFXPAYLOAD_LINUX=true - сохраняет разрешение экрана при
передаче управления ядру Linux.
GRUB_BACKGROUND=”/path/to/picture.jpeg” - устанавливает фоновое
изображение.
GRUB_THEME=”path/to/theme.file” - устанавливает тему оформления.
GRUB_DISABLE_LINUX_UUID - отключает использование специаль-
ной системы идентификаторов для определения корневой файловой си-
стемы.
16
GRUB2 использует нумерацию разделов с 1, а не с 0, как это было в
GRUB. Следовательно первый раздел первого устройства (/dev/sda1) это
(hd0,1), а не (hd0,0), как было раньше.
После внесенных изменений нужно сгенерировать новый файл grub.cfg:
grub2-mkconfig > /boot/grub/grub.cfg
Командная строка.
При загрузке может возникнуть необходимость в командной строке
GRUB. Для выхода в режим командной строки необходимо нажать c, для воз-
врата - esc. Командная строка поддерживает автодополнение по Tab.
Чтобы в процессе работы в командной строке получить доступ к файлу,
находящемуся не в корневой файловой системе (получить доступ к файлу,
находящемуся в корневой файловой системе можно как обычно /path/to/file),
необходимо знать наименование устройств и разделов.
Например:
(hd0,1)
означает первый жесткий диск (устройства нумеруются с 0) и на нем
первый раздел (разделы нумеруются с единицы), что соответствует /dev/sda1.
Если при наборе команды, например:
set root=(
нажать Tab, то GRUB сам предложит вам список возможных
устройств:
possible devices are:
hd0 fd0
Если нажать Tab при набранной команде:
set root=(hd0,
то вам будет предложен список разделов на первом жестком диске. Ну
и для набранной команды:
set root=(hd0,1)/
будет предложен список файлов на данном разделе.
И будет возможность выбрать необходимый файл для загрузки или ре-
дактирования параметров GRUB.

17
Глава 3. Системный менеджер systemd.
systemd - менеджер системы и служб для Linux, совместимый со скрип-
тами инициализации System V init (SysV) и LSB. systemd обеспечивает воз-
можности агрессивной параллелизации, использует сокеты и активацию D-
Bus для запускаемых служб, предлагает запуск демонов по необходимости, от-
слеживает процессы при помощи контрольных групп Linux, поддерживает
мгновенные снимки и восстановление состояния системы, монтирование и
точки монтирования, а также внедряет основанную на зависимостях логику
контроля процессов сложных транзакций.
По сравнению с System V init, systemd имеет следующие преимущества:
• Контроль состояния службы, с возможностью реакции на изменения состояния;
• Сокет-активные и шина-активные службы, дают возможность улучшить распарал-
леливание взаимозависимых служб;
• Переменная cgroups используется для отслеживания служебных процессов, вместо
идентификаторов процессов (PID). Это означает, что демоны не будут потеряны даже
после разветвления в другие процессы.
В апреле 2012 исходные коды менеджера устройств udev были объеди-
нены с systemd, и реализован единый механизм управления устройствами в
системе.
В CentOS 7 systemd заменяет Upstart как систему инициализации по
умолчанию, и выполняет следующие основные функции:
• Активация, основанная на сокетах. Во время загрузки systemd прослушивает со-
кеты для всех системных сервисов, поддерживает этот тип активации и передает сокеты
этим сервисам сразу после старта сервисов. Это позволяет systemd не только запускать
сервисы параллельно, но также дает возможность перезапускать сервисы без потери
любых отправленных им сообщений, пока сервисы были недоступны. Соответствую-
щий сокет остается доступным и все сообщения выстраиваются в очередь.
• Активация, основанная на D-Bus. Системные сервисы, использующие D–Bus для
межпроцессного взаимодействия, могут быть запущены по требованию, когда клиент-
ское приложение пытается связаться с ними.
• Активация, основанная на устройствах. Системные сервисы, поддерживающие
активацию, основанную на девайсах, могут быть запущены, когда определенный тип
оборудования подключается или становится доступным.
• Активация, основанная на путях. Системные сервисы могут поддерживать этот
вид активации, если изменяется состояние папки или директории.
• Спапшоты системных состояний. Система может сохранять состояние всех юни-
тов и восстанавливать предыдущее состояние системы.
• Управление точками монтирования и автомонтирования. systemd отслеживает и
управляет точками монтирования и автомонтирования.
• Агрессивная параллелизация. systemd запускает системные сервисы параллельно
из-за использования активации, основанной на сокетах. В комбинации с сервисами,
поддерживающими активацию по требованию, параллельная активация значительно
уменьшает время загрузки системы.
• Транзакционная логика активации юнитов. До активации и деактивации юнитов
systemd вычисляет их зависимости, создает временную транзакцию и проверяет це-
лостность этой транзакции. Если транзакция нецелостная, systemd автоматически пы-
тается исправить ее и удалить не требующиеся задания из нее до формирования сооб-
щения об ошибке.

18
• Обратная совместимость с инициализацией SysV. systemd полностью поддержи-
вает скрипты инициализации SysV, как описано в спецификации Linux Standard Base
(LSB), что упрощает переход на systemd.
systemd развивают Леннарт Поттеринг, Кей Сиверс и другие разработ-
чики, распространяется как FOSS под условиями лицензии GNU Lesser Gen-
eral Public License версии 2.1 или более поздней.
Сравнительная таблица систем инициализации SysV, Upstart и systemd.
SysVinit Upstart systemd
Управление через D-Bus нет да да
Запуск без использования bash/shell скриптов нет нет да
Включены сервисы ранней стадии загрузки, написанные на
нет нет да
языке C
Возможность упреждающего чтения данных с диска нет нет[1] да
Активация сервисов на основе сокетов нет нет[1] да
Активация сервисов на основе сокетов: совместимость с inetd нет нет[2] да
Активация на основе шины (Bus-based Activation) нет нет[3] да
Активация на основе аппаратуры компьютера нет нет[4] да
Конфигурирование зависимостей устройств, используя правила
нет нет да
udev
Активация по событиям файловой системы (inotify) нет нет да
Активация по времени нет нет да
Управление точками монтирования нет нет[5] да
Управление запуском fsck нет нет[5] да
Управление квотами нет нет да
Управление автомонтированием нет нет да
Управление SWAP нет нет да
Сохранение снимков состояния системы (snapshotting) нет нет да
Поддержка XDG_RUNTIME_DIR нет нет да
Опциональная остановка процессов пользователя после его вы-
нет нет да
хода из системы
Интеграция с Linux Control Groups (cgroups) нет нет да
Генерация событий аудита для запускаемых сервисов нет нет да
Интеграция с SELinux нет нет да
Интеграция с PAM нет нет да
Управление шифрованными разделами и дисками (LUKS) нет нет да
Поддержка обработки паролей к LUKS и SSL-сертификатам, с за-
просом пароля через такие агенты, как Plymouth, консоли, wall, нет нет да
tty терминалов и GNOME
Управление сетевым петлевым устройством (loopback) нет нет да
Управление binfmt_misc (поддержка неродных исполняемых
нет нет да
файлов)
Управление системной локалью нет нет да
Настройка параметров консоли и клавиатуры нет нет да
Инфраструктура для создания, удаления и чистки временных
нет нет да
файлов
19
Управление через /proc/sys sysctl нет нет да
Интеграция с plymouth (графическим запуском, используя KMS) нет нет да
Сохранение и восстановление random seed (состояния генера-
нет нет да
тора энтропии)
Поддержка статической загрузки модулей ядра нет нет да
Автоматическое управление консолью COM-порта нет нет да
Управление уникальным ID компьютера нет нет да
Управление динамическим именем хоста и метаданными ком-
нет нет да
пьютера
Контролируемая остановка сервисов нет нет да
Поддержка раннего логгирования через /dev/log нет нет да
Включает минимальный демон логгирования на основе kmsg
нет нет да
для встраиваемых систем
Перезаупуск сервисов в случае краха без потери соединения нет нет да
Бесшовное обновление сервисов нет нет да
Графический интерфейс пользователя (опциальнально) нет нет да
Встроена поддержка профилирования и расширенных инстру-
нет нет да
ментов
Поддержка сервисов типа "instantiated" нет да да
Интеграция с PolicyKit нет нет да
Есть встроенные утилиты для удалённого доступа и управле-
нет нет да
ния кластером
Может показать все процессы, принадлежащие сервису нет нет да
Может идентифицировать процессы сервиса нет нет да
Автоматически создаёт cgroups для сервисов для равномерного
нет нет да
распределения времени CPU
Аналогично для пользовательских процессов нет нет да
Совместимость с SysV да да да
Сервисы SysV контролируются как родные сервисы да нет да
Управление сервисами через /dev/initctl да нет да
Перезапуск сервисов с полной сериализацией (serialization) со-
да нет да
стояния
Поддержка интерактивного (управляемого) запуска системы нет[6] нет[6] да
Поддержка контейнеров (как расширенная замена chroot()) нет нет да
Загрузка, построенная на основе зависимостей нет[7] нет да
Отключение сервисов без редактирования файлов да нет да
Маскировка сервисов без редактирования файлов нет нет да
Надёжная остановка системы, используя только один процесс нет нет да
Встроенная поддержка перезапуска ядра на лету (kexec) нет нет да
Динамическая генерация сервисов нет нет да
Поддержка в других компонентах ОС да нет да
Файлы запуска сервисов, совместимые с различными дистрибу-
нет нет да
тивами
Отправка сигналов сервисам нет нет да

20
Надёжная остановка пользовательских сессий перед остановом
нет нет да
системы
Поддержка логгирования в utmp/wtmp да да да
Легкие для написания, расширения и обработки файлы управ-
ления сервисами, подходящие для манипулирования инстру- нет нет да
ментами управления предприятием

[1] Реализация упреждающего чтения в Upstart доступна в виде отдельного пакета ureadahead
и требует наложения патча на ядро
[2] Активация через сокеты в upstart является экспериментальной возможностью, а также не
поддерживает сериализацию, поэтому вообще не подходит для этого.
[3] Активация через шину для upstart доступна пока только в виде патча, который в основную
ветку разработки ещё не принят.
[4] реализация в upstart не является практичной.
[5] Данная возможность для upstart существует в виде отдельного пакета и работает только
для монтирования во время загрузки, плохо поддерживая зависимости.
[6] Некоторые дистрибутивы реализуют эту возможность с помощью shell скриптов.
[7] Скрипты инициализации LSB поддерживают это, в случае если они используются.

systemd оперирует файлами конфигурации - юнитами(unit), представля-


ющий собой текстовый файл, созданный по специальному формату. Каждый
юнит отвечает за отдельно взятую службу, точку монтирования, подключае-
мое устройство, файл подкачки, виртуальную машину и т.п. Существуют спе-
циальные типы юнитов, которые не несут функциональной нагрузки, но поз-
воляют задействовать дополнительные возможности systemd. К ним отно-
сятся юниты типа target, slice, automount и др.
systemd поддерживает следующие типы юнитов:
.service - в файле юнита содержится описание, как управлять службой или приложением.
Оно включает в себя информацию о запуске или остановке, условия автоматического за-
пуска, а также информацию о зависимостях для соответствующего программного обеспе-
чения;
.socket - юнит сокет-устройства описывает один из трех буферов (сетевой, IPC-сокет или
FIFO), который использует systemd для активации сокета. Они всегда имеют связанный
.service файл, который будет запущен при активности сокета, определяющий данный блок;
.device - юнит, описывает устройство, которое было определено для управления systemd с
помощью udev или файловой системы sysfs. Не все устройства имеют файлы .device. Неко-
торые скрипты, которым может потребоваться устройства .device, предназначены для мон-
тирования и доступа к устройствам;
.mount - этот юнит содержит блоки, определяющие точки монтирования в системе, кото-
рыми управляет systemd. Имя каждого блока определяется значением полного пути к точке
монтирования, при этом символ «/» заменяется на тире. Записи внутри /etc/fstab могут
иметь блоки, созданные автоматически;
.automount - юнит .automount настраивает точку монтирования, которая будет автоматиче-
ски установлена и будет определена после точки монтирования, на которую она ссылаются,
при этом необходимо, что был создан соответствующий юнит .mount для определения осо-
бенностей монтирования;
.swap - данный юнит, описывает SWAP (пространство подкачки) в системе, название этих
блоков должно отражать путь к устройству или файлу;
.target - данный юнит используется для обеспечения точек синхронизации для других
устройств при загрузке или изменения состояний. Они также могут использоваться для пе-
ревода системы в новое состояние;
.path - данный юнит, определяет путь, который может использоваться для активации на ос-
нове пути. По умолчанию, юнит будет запущен с тем же базовым именем. Это использует
inotify для отслеживания изменения путей;

21
.timer - данный юнит, определяет таймер, который будет управляться systemd (аналог cron)
для задержки или запланированной активации. При достижении таймера будет запускаться
соответствующий блок;
.snapshot - данный юнит, создается автоматически командой snapshot systemctl. Он позво-
ляет вам восстановить текущее состояние системы после внесения изменений. Снимки не
сохраняются во время сеансов и используются для отката временных состояний;
.slice - данный юнит связан с узлами группы управления Linux, что позволяет ограничить
ресурсы или назначить их для любых процессов, связанных с slice. Имя отражает его иерар-
хическую позицию внутри дерева групп. Юниты размещаются в определенных slice по
умолчанию в зависимости от их типа;
.scope - данный юнит создаются автоматически systemd из информации, которую получили
от его интерфейса шины. Они используются для управления наборами системных процес-
сов, созданных извне.
3.1. Конфигурационные файлы юнитов.
Всю необходимую документацию по структуре и формату конфигура-
ционных файлов systemd можно найти в документации на сайте проекта Fe-
dora (https://www.freedesktop.org/software/systemd/man/index.html).
Конфигурационные файлы юнитов, в зависимости их назначения и типа
размещаются в одной из директориев:
• /usr/lib/systemd/system/ – юниты из установленных пакетов RPM;
• /run/systemd/system/ — юниты, созданные в runtime, при этом данная дирек-
тория приоритетнее директории с юнитами установленными из пакетов;
• /etc/systemd/system/ — юниты, созданные и управляемые системным адми-
нистратором, при этом данная директория приоритетнее директории юнитов, создан-
ных в runtime.
Конфигурационный файл юнита представляет собой текстовый файл
формата INI, состоящих из разделов, в каждом из которых находятся управля-
ющие директивы применимые для данного типа юнитов:
[Название раздела]
<имя директивы> = <значение>
[Название раздела] – название секции директив используемых для данного
типа юнита, название секции пишется в квадратных скобках;
<имя директивы> - название директивы, которая используется для управ-
ления (типы переменных приведены в документации по systemd);
<значение> - значение, которое будет присвоено директиве (может быть
как текстовым, так и числовым).
Общие разделы в конфигурационных файлах юнитов.
Раздел [Unit], является общим для всех типов юнитов, и содержит об-
щую информацию о юните, правилах его инициализации, и взаимодействия с
другими юнитами в системе, с использованием следующих директив:
• Description= используется для описания имени и основных функций устройства. Он
возвращается различными инструментами systemd, поэтому полезно установить что-
то короткое, конкретное и информативное;
• Documentation= определяется местоположения документации по данному про-
граммному обеспечению. Это могут быть внутренние доступные справочные стра-
ницы, либо доступные в интернете (URL-адреса). Команда «status system your_service»
выведет эту информацию;
• Requires= данная директива используется для перечисления юниты, от которых за-
висит этот юнит (служба или устройство). Если текущий блок активирован,
22
перечисленные здесь юниты также должны успешно активироваться, иначе он потер-
пит неудачу. Эти блоки запускаются параллельно с текущим устройством по умолча-
нию;
• Wants= данная директива похожа на Requires=, но менее строгая. systemd бу-
дет пытаться запустить любые юниты, перечисленные здесь, когда это устройство
активировано. Если эти устройства не обнаружены или не запущены, текущий блок
будет продолжать функционировать. Это рекомендуемый способ настройки боль-
шинства зависимостей. Опять же, это подразумевает параллельную активацию, если
не изменено другими директивами;
• BindsTo= директива аналогична Requires =, с той разницей, что приводит к
остановке текущего устройства, когда соответствующий узел завершается.
• Before= юниты, перечисленные в этой директиве, не будут запущены до тех
пор, пока текущий блок не будет отмечен как запущенный, если они будут активи-
рованы одновременно;
• After= юниты, перечисленные в этой директиве, будут запущены до запуска
текущего устройства (юнита);
• Conflicts= Данный юнит можно использовать для отображения юнитов, кото-
рые нельзя запускать одновременно с текущим устройством. Запуск устройства с
этой связью приведет к остановке других устройств;
• Condition…= существует ряд директив, начинающихся с условия, которые
позволяют администратору протестировать определенные условия до запуска
устройства. Это можно использовать для предоставления файла универсального эле-
мента, который будет запускаться только в соответствующих системах. Если усло-
вие не выполнено, юнит — пропускается;
• Assert…= подобно директиве что выше (Condition…=), но установленные ди-
рективы проверяют различные аспекты рабочей среды, чтобы решить, следует ли
активировать устройство. Однако, в отличие от директив Condition…=, отрицатель-
ный результат вызывает сбой в этой директиве.
Раздел [Install], является общим для всех типов юнитов, и содержит
набор правил для запуска юнита. Основные директивы этой секции:
• WantedBy= данная директива, является наиболее распространенным способом
определения того, как устройство должно быть включено. Эта директива позволяет
вам указать зависимость (аналогично директиве Wants = в разделе [Unit]). Разница в
том, что эта директива включена в вспомогательную единицу, позволяющую первич-
ному блоку оставаться относительно чистым. Когда устройство с этой директивой
определено, то будет создана в системе папка в /etc/systemd/, названная в честь ука-
занного устройства, но с добавлением «.wants» в самом конце. В этом случае будет
создана символическая ссылка на текущий блок, создающий зависимость. Например,
если текущий блок имеет WantedBy = multi-user.target, каталог с именем multi-
user.target.wants будет создан в/etc/systemd/system (если он еще не доступен) и симво-
лическая ссылка на текущий блок будут размещены внутри. Отключение этого устрой-
ства удаляет связь и удаляет зависимость;
• RequiredBy= эта директива очень похожа на директиву WantedBy =, но вместо этого
указывает требуемую зависимость, которая приведет к сбою активации, если не будет
выполнена. Когда включено, юнит с этой директивой создаст каталог, заканчиваю-
щийся на .requires;
• Alias= данная директива позволяет включить устройство под другим именем. Среди
других применений это позволяет доступным нескольким провайдерам функции,
чтобы соответствующие подразделения могли искать любого провайдера с общим
псевдонимом;
• Also= данная директива позволяет включать или отключать блоки в качестве набора.
Здесь можно указать поддерживающие устройства, которые всегда должны быть до-
ступны, когда это устройство активно. Они будут управляться как группа для задач
установки;
23
• DefaultInstance= для template units (более поздних), которые могут создавать экзем-
пляры блоков с непредсказуемыми именами, это может использоваться как резервное
значение для имени, если соответствующее имя не предоставляется.
Директивы Description= и WantedBy= часто используются в конфигураци-
онных файлах юнитов, при этом следует учитывать, что при не явном указании
директивы Type= используется значение по умолчанию.
Для остальных типов юнитов в конфигурационных файлах после раз-
дела [Unit] размещается раздел с именем типа юнита и с набором управляю-
щих директив ему соответствующий. При этом раздел [Install] может отсут-
ствовать.
Формат конфигурационного файла юнита .service
Файл юнита .service (<имя сервиса>.service) и состоит из трёх разделов:
[Unit], [Service], и [Install]. Раздел [Service], содержит информацию, о конфигура-
ции данного сервиса, с использования следующих директив:
- Type= определяет, каким образом systemd будет осуществлять контролировать про-
цесса запуска сервиса, и может принимать одно из следующих значений:
• simple: (по умолчанию) systemd предполагает, что служба будет запущена незамед-
лительно. Процесс при этом не должен разветвляться. Не рекомендуется использовать
этот тип, если другие службы зависят от очередности при запуске данной службы.
Исключение - активация сокета;
• forking: systemd предполагает, что служба запускается однократно и процесс раз-
ветвляется с завершением родительского процесса. Рекомендуется использовать дан-
ный тип для запуска классических демонов за исключением тех случаев, когда, из-
вестно, что нет необходимости в таком поведении для заданного процесса. При этом
необходимо с помощью директивы определить PIDFile= основного процесса, чтобы
systemd могла отслеживать его;
• oneshot: полезен для скриптов, которые выполняют одно задание и завершаются.
Этот тип указывает, что процесс будет недолговечным и система должна ждать завер-
шения процесса, прежде чем продолжить работу с другими устройствами. Возможно
понадобиться также установить параметр RemainAfterExit=yes, чтобы systemd по-
прежнему считала процесс активным, даже после его завершения;
• dbus: сервис считается находящимся в состоянии готовности, когда определенное
BusName появляется в системной шине DBus. Это означает, что устройство будет ис-
пользовать имя от D-Bus шины. Когда это произойдет, systemd продолжит обработку
следующего блока;
• notify: идентичен параметру Type=simple, но с той оговоркой, что демон пошлет
systemd сигнал о своей готовности. Это указывает на то, что служба отправит уведом-
ление, когда закончит запуск. Процесс systemd будет ждать, пока это произойдет,
прежде чем переходить к другим устройствам;
• idle: Это означает, что служба не будет запущена до тех пор, пока не будут отправ-
лены все задания.
- RemainAfterExit= эта директива обычно используется с типом onehot. Это означает,
что сервис следует считать активным даже после выхода из процесса;
- PIDFile= если тип службы отмечен как «forking», эта директива используется для
установки пути файла, который должен содержать идентификационный номер про-
цесса основного «ребенка», который должен контролироваться;
- BusName= эта директива определяет имя шины D-Bus, которое служба попытается
получить при использовании типа службы «dbus»;
- NotifyAccess= указывает на доступ к сокету, который должен использовать для про-
слушивания уведомлений при выборе «notify». Она может быть «none», «main» или
«all». По умолчанию «none» игнорирует все сообщения о состоянии. «main» вариант

24
будет прослушивать сообщения из основного процесса, а опция «all» приведет к обра-
ботке всех членов контрольной группы службы;
- ExecStart= определяет необходимость указать полный путь и аргументы команды,
которая должна быть выполнена для запуска процесса. Это может быть указано только
один раз (кроме сервисов «onehot»). Если для пути к команде предшествует символ «-
» тире, будут приняты ненулевые статусы выхода без маркировки активации устрой-
ства как сбой;
- ExecStartPre= определяет необходимость указать полный путь и аргументы ко-
манды, которые должны быть выполнены до запуска основного процесса. Это можно
использовать несколько раз;
- ExecStartPost= имеет аналогичные свойства, что и ExecStartPre = за исключением
того, что данная директива указывает команды, которые будут запускаться после за-
пуска основного процесса;
- ExecReload= является необязательной и указывает команду, которая необходима
для перезагрузки конфигурации службы, если она доступна;
- ExecStop= определяет команду, необходимую для остановки службы. Если это не
указано, процесс будет немедленно уничтожен, когда служба будет остановлена;
- ExecStopPost= можно использовать для определения команд для выполнения после
остановке команды;
- RestartSec= используется если включен автоматический перезапуск службы, и
необходимо определить время ожидания перед попыткой перезапуска службы;
- Restart= определяет условия при которых systemd будет пытаться автоматически
перезапустить службу. Она может быть установлена как значения «always», «on-suc-
cess», «on-failure», «on-abnormal», «on-abort» или «on-watchdog». Это приведет к пере-
запуску в соответствии с тем, как служба была остановлена;
- TimeoutSec= устанавливает время, в течение которого система будет ждать оста-
новки службы, прежде чем пометить ее как неудачную или убитую принудительно.
Можно установить отдельные таймауты с помощью TimeoutStartSec = и
TimeoutStopSec =;
- User= используется если необходимо проводить инициализацию юнита service от
конкретной учетной записи пользователя;
- Group= определяет группу пользователи которых могут осуществлять инициализа-
цию юнита service.
Примеры конфигурационных файлов юнитов .service.

25
Экземпляры сервисов @.service
Большинство сервисов запускается в единственном экземпляре, однако
существуют и сервисы, которые необходимо запустить в нескольких экзем-
плярах. Для того, чтобы не создавать отдельный service-файл для каждого эк-
земпляра сервиса, в systemd была реализована поддержка шаблонов сервисов.
Шаблон многоэкземплярного сервиса содержит символ @ в имени service-
файла. Перед этим символом в имени service-файла указывается имя многоэк-
земплярного сервиса.
Когда возникает необходимость создать дополнительный экземпляр
сервиса на основе шаблона, в каталоге /etc/systemd/system/*.wants создаётся
символическая ссылка на шаблон. Имя символической ссылки совпадает с
именем шаблона, но после символа @ добавляется идентификатор экземпляра
сервиса.

Формат конфигурационного файла юнита .socket


Файл юнита .socket (<имя сокета>.socket) и состоит из трёх разделов:
[Unit], [Socket], и [Install]. Каждый блок socket-а должен иметь соответствующий
сервисный модуль, который будет активирован, когда сокет получает актив-
ность. По умолчанию имя сокета будет пытаться запустить службу с тем же
именем после получения соединения. Когда служба инициализируется, сокет
будет передан ему, что позволит ему начать обработку любых буферизован-
ных запросов. В разделе [Socket] могут использоваться следующие директивы:

26
• ListenStream= определяет адрес для сокета stream, который поддерживает последо-
вательную, надежную связь. Службы, использующие TCP, должны использовать этот
тип сокета;
• ListenDatagram= определяет адрес для сокет datagram, который поддерживает быст-
рые, ненадежные пакеты связи. Службы, использующие UDP, должны устанавливать
этот тип сокета;
• ListenSequentialPacket= определяет адрес для последовательной, надежной связи с
максимальными дейтаграммами, которые сохраняют границы сообщений. Это чаще
всего встречается для Unix сокетов;
• ListenFIFO= определяет буфер FIFO вместо сокета;
• Accept= определяет, будет ли запущен дополнительный экземпляр службы для каж-
дого соединения. Если установлено значение false (по умолчанию), один экземпляр
будет обрабатывать все соединения;
• SocketUser= позволяет с помощью Unix-сокета установить его владельца. Если не
указать, то будет пользователь root;
• SocketGroup= позволяет с помощью Unix-сокета установить владельца группы. Это
будет root группа, если не указано ни то, ни другое. Если установлен только SocketUser
=, systemd попытается найти подходящую группу;
• SocketMode= определяет разрешения для созданного объекта для сокетов Unix или
буферов FIFO;
• Service= определяет, если имя службы не совпадает с именем .socket, эта служба
может быть указана с помощью этой директивы.
Пример конфигурационного файла юнита .socket

Формат конфигурационного файла юнита .mount.


Файл юнита .mount (<имя юнита>.mount) состоит из двух разделов:
[Unit], и [Mount]. Модули монтирования позволяют управлять точкой
монтирования изнутри systemd. Mount юниты часто переводятся
непосредственно из файла /etc/fstab во время процесса загрузки. При этом имя
юнита (<имя юнита>) определяется значением полного пути к точке
монтирования, с заменой символ «/» на тире. Записи внутри /etc/fstab могут
иметь блоки, созданные автоматически. В разделе [Mount] используются
следующие директивы:
• What= определяет абсолютный путь к ресурсу, который необходимо смонтировать.
• Where= определяет абсолютный путь к точке монтирования, на которую должен
быть установлен ресурс. Это должно быть таким же, как имя файла устройства, за ис-
ключением использования стандартной записи файловой системы.
• Type= определяет тип файловой системы для монтирования.
• Options= определяет любые параметры монтирования, которые необходимо приме-
нить. Это список, разделенный запятыми.
• SloppyOptions= принимает логическое значение (0 или 1), которое определяет про-
изойдет ли сбой монтирования, если есть параметр непризнанного монтирования.
• DirectoryMode= определяет необходимость создания родительских каталогов для
точки монтирования, это определяет режим разрешений этих папок.
• TimeoutSec= определяет время, в течение которого система будет ждать, пока опе-
рация монтирования не будет отмечена как сбой.
27
Пример конфигурационного файла юнита .mount

Формат конфигурационного файла юнита .automount


Файл юнита .automount (<имя юнита>.automount) состоит из двух
разделов: [Unit], и [Automount]. Этот модуль позволяет автоматически
устанавливать подключенный модуль .mount при загрузке. При этом имя
юнита (<имя юнита>) определяется значением полного пути к точке
монтирования, с заменой символ «/» на тире. Записи внутри /etc/fstab могут
иметь блоки, созданные автоматически. В разделе [Automount] используются
следующие директивы:
• Where= определяет абсолютный путь automount в файловой системе. Это будет со-
ответствовать имени файла, за исключением того, что вместо перевода используется
условное обозначение пути.
• DirectoryMode= определяет, если необходимо создать automount или любые роди-
тельские каталоги, это определит настройки разрешений для этих компонентов пути.
Пример конфигурационного файла юнита .automount.

Формат конфигурационного файла юнита .swap.


Файл юнита .swap (<имя файла>.swap) состоит из двух разделов: [Unit],
и [Swap]. Swap модули используются для настройки подкачки (свопинга) в си-
стеме. Юниты должны быть названы по названию файла или устройства под-
качки, используя тот же перенос файловой системы. В разделе [Swap] исполь-
зуются следующие директивы:
• What= определяет абсолютный путь к местоположению подкачки (будь то файл или
устройство).
• Priority= определяет приоритет для настройки подкачки, и принимает значение рав-
ное целому числу.
28
• Options= определяет любые параметры, которые обычно задаются в файле /etc/fstab,
могут быть установлены с помощью этой директивы. Используется список, разделен-
ный запятыми.
• TimeoutSec= задает время, в течение которого, система ожидает активацию своп-а,
прежде чем отмечать операцию как зафайленую.
Пример конфигурационного файла юнита .swap

Формат конфигурационного файла юнита .path


Файл юнита .path (<имя файла>.path) состоит из трех разделов: [Unit],
[Path], и [Install]. Блок path, определяет путь файловой системы, который
systmed может отслеживать изменения. Должен существовать другой блок, ко-
торый будет активирован, когда определенная активность будет обнаружена в
местоположении пути. Активность пути определяется тем, что он не влияет на
события. В разделе [Path] используются следующие директивы:
• PathExists= используется для проверки того, существует ли этот путь. Если путь су-
ществует, активируется соответствующий блок.
• PathExistsGlob= аналогична предыдущей, но поддерживает глобальные выражения
для определения существования пути.
• PathChanged= используют для отслеживания изменений местоположение пути.
Связанный блок активируется, если обнаружено изменение (проверяется когда файл
закрыт).
• PathModified= аналогична предыдущей, но активируется при записи файлов, а
также когда файл закрыт.
• DirectoryNotEmpty= позволяет systemd активировать связанный блок, когда ката-
лог больше не пустой.
• Unit= определяет что устройство активируется, когда условия пути, указанные
выше, выполняются. Если это будет опущено, systemd будет искать файл .service, ко-
торый имеет то же имя базового юнита, что и этот блок.
• MakeDirectory= определяет, будет ли systemd создавать структуру каталогов перед
просмотром.
• DirectoryMode=: Если вышеуказанная директива включена, то данная опция уста-
новит режим разрешения любых компонентов пути, которые должны быть созданы.
Пример конфигурационного файла юнита .path

Формат конфигурационного файла юнита .timer


Файл юнита .timer (<имя файла>.timer) состоит из трех разделов: [Unit],
[Timer], и [Install]. Юнит Timer, используются для планирования работы задач

29
в определенное время или после определенной задержки. Этот тип устройства
заменяет или дополняет некоторые функции cron-а и демонов. Должен быть
предоставлен соответствующий блок, который будет активирован, когда тай-
мер будет достигнут. В разделе [Timer] используются следующие директивы:
• OnActiveSec= позволяет активировать соответствующий блок относительно актива-
ции модуля .timer.
• OnBootSec= задает время, когда будет активироваться соответствующее устройство
после загрузки системы.
• OnStartupSec= аналогична указанному выше таймеру, но задает, когда будет акти-
вироваться systemd процесс после загрузки системы.
• OnUnitActiveSec= устанавливает таймер в зависимости от того, когда последний ак-
тивировался.
• OnUnitInactiveSec= устанавливает таймер в отношении того когда unit был неактив-
ный.
• OnCalendar= позволяет активировать соответствующий блок путем определения
абсолютного (вместо относительно).
• AccuracySec= данный юнит используется для установки уровня точности с тайме-
ром, который должен быть приклеен. По умолчанию, связанный с ним блок будет ак-
тивирован в течение одной минуты.
• Unit= используется для указания того, что необходимо активировать когда таймер
истечет. Если не установлены, systemd будет искать блок с именем .service.
• Persistent= если это установлено, systemd запустит триггер соответствующего
блока.
• WakeSystem= позволяет «будить систему» из режима ожидания, если таймер будет
достигнут.
Пример конфигурационного файла юнита .timer

Формат конфигурационного файла юнита .slice


Файл юнита .slice (<имя файла>.slice) является файлом в формате INI и
состоит из множества разделов, один из которых Slice (имена разделов берутся
в квадратные скобки). Директивы раздела Slice, не имеет .slice специфической
конфигурации. Вместо этого он может содержать некоторые директивы управ-
ления ресурсами, которые перечислялись выше.
Пример конфигурационного файла юнита .slice

30
3.2. Уровни загрузки/цели (.target)
systemd использует понятие целей (.target), сходное по сути с уровнями
загрузки, но работающее немного иначе. Каждая цель имеет название, описы-
вающее её предназначение. Некоторые цели объединяют в себе запуск всех
служб какой-то одной цели и нескольких дополнительных сервисов. Для за-
мены уровней загрузки Sys V init были созданы специальные "цели", переклю-
чаться между которыми можно используя команду telinit RUNLEVEL. Стан-
дартные уровни загрузки 0, 1, 3, 5, и 6 полностью эквиваленты соответствую-
щим целям systemd.
Файлы целей systemd .target предназначены для группировки вместе
других юнитов systemd через цепочку зависимостей. Например, юнит graph-
ical.target, использующийся для старта графической сессии, запускает систем-
ные сервисы GNOME Display Manager (gdm.service) и Accounts Service
(accounts–daemon.service) и активирует multi–user.target. В свою очередь multi–
user.target запускает другие системные сервисы, такие как Network Manager
(NetworkManager.service) или D-Bus (dbus.service) и активирует другие целе-
вые юниты basic.target.
Формат конфигурационного файла .target состоит из раздела [Unit], а при
необходимости и [Install], в которых описываются правила группировки юни-
тов и определяется цепочка из запуска.
Примеры конфигурационных файлов .target

31
В CentOS 7 присутствуют предопределенные цели, похожие на стан-
дартный набор уровней запуска. По соображениям совместимости они также
имеют алиасы на эти цели, которые напрямую отображаются в уровнях за-
пуска Sys V init:
poweroff.target (runlevel0.target) – завершение работы и отключение системы
rescue.target (runlevel1.target) – настройка оболочки восстановления
multi–user.target (runlevel2.tar- – настройка неграфической многопользовательской системы
get,
runlevel3.target, runlevel4.target)
graphical.target (runlevel5.target) – настройка графической многопользовательской системы
reboot.target (runlevel6.target) – выключение и перезагрузка системы

Команды для управления .target


Команды runlevel и telinit по-прежнему доступны, но оставлены в системе
по соображениям совместимости. Рекомендуется использовать systemctl для
изменения или настройки системных целей.
Для определения, целевого юнита используемого по умолчанию, ис-
пользуется команда: systemctl get–default.
Для просмотра всех загруженных целевых юнитов используется ко-
манда: systemctl list-units --type target.
Для просмотра всех целевых юнитов используется команда:
systemctl list-units --type target --all.
Для изменения цели по умолчанию используется команда:
systemctl set-default name.target.
Для изменения текущей цели: systemctl isolate name.target. Данная команда
запустит целевой юнит и все его зависимости и немедленно остановит все
остальные.
Сокет-активация .service
Сокет-активация - это техника запуска сервисов по факту обращения к
соответствующему сокету, подобная той, что реализуется в демонах inetd и

32
xinetd. systemd поддерживает три схемы запуска сервисов, использующие со-
кет-активацию:
1. Схема, ориентированная на параллельный запуск сервисов и упро-
щение зависимостей между ними. Например, syslog и dbus могут запус-
каться параллельно с сервисами, использующими их. systemd создаёт
файл сокета и запускает одновременно и сервисы, обслуживающие файл
сокета, и сервисы, пользующиеся им. Если сервис-потребитель запустится
раньше сервиса-поставщика, то запрос попадёт в сокет-файл и будет ожи-
дать обработки до того момента, когда запустится сервис-поставщик.
2. Схема, ориентированная на активацию по запросу одиночных
редко используемых сервисов. Примером такого сервиса может быть де-
мон печати CUPS. systemd создаёт сокет-файл, который прослушивает са-
мостоятельно. При поступлении запроса в сокет-файл, systemd запустит
CUPS и передаст сокет-файл ему.
3. Схема, ориентированная на активацию по запросу многоэкзем-
плярных сервисов, в которых каждое соединение или запрос обрабатыва-
ются отдельным процессом. Например, сервер ssh. systemd создаёт сокет-
файл и прослушивает его самостоятельно, а при поступлении запроса за-
пускает экземпляр сервиса и передаёт ему сокет-файл соединения, остав-
ляя за собой сокет, ожидающий соединений.
Сокет-активация контейнеров
Схема cокет-активация контейнеров происходит следующим образом:
• процесс systemd, работающий на хост-системе, ожидает подключений к
сокету;
• При поступлении запроса на подключение, запускается контейнер, а со-
кет передаётся на обслуживание процессу systemd, работающему внутри
контейнера;
• Тот, в свою очередь, действует по схеме, сокет-активация .service, запус-
кая необходимый сервис с помощью сокет-активации.
Запуск getty на консолях.
В systemd имеется два шаблона service-файлов для терминалов:
• getty@.service - шаблон для запуска виртуальных терминалов, в пере-
менной TERM используется значение linux;
• serial-getty@.service - шаблон для запуска терминалов на последова-
тельных портах. в переменной TERM используется значение vt102. В этом
шаблоне, в отличие от предыдущего, отсутствуют настройки для очистки
буфера прокрутки, поскольку он попросту отсутствует.
Главное отличие systemd от SysV init заключается в том, что терминалы
запускаются по запросу, а не при загрузке системы. Имеется только два ис-
ключения: консоль tty1 запускается автоматически, в графическом режиме на
ней запускается дисплейный менеджер, а в текстовом - getty, консоль tty6 тоже
запускается автоматически и на ней всегда запускается getty, чтобы всегда
имелась хотя-бы одна текстовая консоль для решения различных проблем.
Настройки по умолчанию можно изменить в файле /etc/systemd/logind.conf:
• NAutoVTs - количество терминалов, запускаемых автоматически (по умолчанию -
6);
33
• ReserveVT - номер зарезервированной виртуальной консоли (по умолчанию - 6).
Если необходимо настроить последовательную консоль в качестве си-
стемной, нужно добавить к строке загрузки ядра дополнительную опцию:
console=ttyS0.
Для автоматической настройки других последовательных консолей
systemd использует программу systemd-getty-generator, которая обнаружи-
вает доступные последовательные консоли и запускает на каждой из них по
экземпляру сервиса serial-getty@.service. Это, в том числе, могут быть кон-
соли, предоставляемые системами виртуализации.
3.3. Управление сервисами
В CentOS 7 скрипты инициализации System V init были заменены сер-
висными юнитами.
По способу использования сервисные юниты .service напоминают
скрипты инициализации. Для просмотра, старта, остановки, перезагрузки,
включения или выключения системных сервисов используется команда
systemctl. Команды service и chkconfig по-прежнему включены в систему, но
только по соображениям совместимости.
При использовании systemctl указывать расширение файла не обяза-
тельно.
Ниже представлены основные команды systemctl:
systemctl start name.service – запуск сервиса.
systemctl stop name.service – остановка сервиса
systemctl restart name.service – перезапуск сервиса
systemctl try-restart name.service – перезапуск сервиса только, если он запущен
systemctl reload name.service – перезагрузка конфигурации сервиса
systemctl status name.service – проверка, запущен ли сервис с детальным выводом состояния сер-
виса
systemctl is-active name.service – проверка, запущен ли сервис с простым ответом: active или inactive
systemctl list-units --type service -- – отображение статуса всех сервисов
all
systemctl enable name.service – активирует сервис (позволяет стартовать во время запуска системы)
systemctl disable name.service – деактивирует сервис
systemctl reenable name.service – деактивирует сервис и сразу активирует его
systemctl is–enabled name.service – проверяет, активирован ли сервис
systemctl list-unit-files --type service – отображает все сервисы и проверяет, какие из них активированы
systemctl mask name.service – заменяет файл сервиса симлинком на /dev/null, делая юнит недо-
ступным для systemd
systemctl unmask name.service – возвращает файл сервиса, делая юнит доступным для systemd

Выключение и перезагрузка системы


В CentOS 7 systemctl заменяет значительное количество команд управле-
ния питанием. Прежние команды сохранены для совместимости, но рекомен-
дуется использовать systemctl:
systemctl halt – останавливает систему
systemctl poweroff – выключает систему
systemctl reboot – перезагружает систему

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


Список запущенны юнитов:
# systemctl
Юниты, запуск которых завершился неудачей:

34
# systemctl --failed
Список доступных юнитов:
# systemctl list-unit-files
Запуск юнита:
# systemctl start <unit-name>
Остановка юнита:
# systemctl stop <unit-name>
Перезагрузка юинта:
# systemctl restart <unit-name>
Перезагрузка настроек юнита:
# systemctl reload <unit-name>
Просмотреть статус юнита:
# systemctl status <unit-name>
Проверить разрешен ли запуск юнита при старте системы:
# systemctl is-enabled <unit-name>
Разрешить запуск юнита при старте системы:
# systemctl enable <unit-name>
Запретить запуск юнита при старте системы
# systemctl disable <unit-name>
Перезагрузка systemd с поиском измененных или новых юнитов:
# systemctl daemon-reload
Управление питанием
Перезагрузить компьютер:
# systemctl reboot
Выключить компьютер:
# systemctl poweroff
Спящий режим:
# systemctl suspend
Ждущий режим:
# systemctl hibernate
Гибридный сон (suspend-to-both)
# systemctl hybrid-sleep
Журнал (ведение, чтение логов)
Для регулирования размера файла логов, нужно отредактировать
/etc/systemd/journald.conf
SystemMaxUse=100M
По умолчанию размер файла логов ограничен в 10% от размера файло-
вой системы где он расположен (/var/log/journal)
Чтение всех логов:
# journalctl
Логи с момента запуска системы:
# journalctl -b
Если был крах системы, можно ввести параметр -1 и посмотреть логи с
предыдущего запуска системы (-2 с двух предыдущих и.т.д):
35
# journalctl -b -1
Вывод последней записи:
# journalctl -f
Все сообщение конкретной утилиты, например systemd:
# journalctl /usr/lib/systemd/systemd
Все сообщения конкретного процесса:
# journalctl _PID=1
Все сообщения конкретного юнита:
# journalctl -u netcfg
Глава 4. Структура файловой системы (FHS)
Общая структура файловой системы.
Файловая система Linux/UNIX физически представляет собой про-
странство раздела диска разбитое на блоки фиксированного размера, кратные
размеру сектора — 1024, 2048, 4096 или 8120 байт. Размер блока указывается
при создании файловой системы.
Управлением обмена данными между ядром/приложениями и соб-
ственно байтами на диске занимается 2 базовых технологии, называемые вир-
туальная файловая система (VFS) и драйверы файловых систем.
Виртуальная файловая система - это часть ядра linux, которая явля-
ется неким абстрактным слоем между ядром и конкретной реализацией фай-
ловой системы (ext2, fat32...). Данная технология позволяет ядру и приложе-
ниям взаимодействовать с файловой системой не учитывая подробностей ра-
боты конкретной файловой системы и управлять файловыми операциями с по-
мощью типовых команд - прозрачно. Часто, VFS называют виртуальный ком-
мутатор файловых систем. Виртуальная файловая система так же осуществ-
ляет стыковку блочных устройств с имеющимися файловыми системами. Спи-
сок поддерживаемых ядром Linux файловых систем можно увидеть в
файле /proc/filesystems.
Структура каталогов и базовые понятия.
FHS (англ. Filesystem Hierarchy Standard, «стандарт иерархии файловой си-
стемы») — стандарт, унифицирующий местонахождение файлов и каталогов
с общим назначением в файловой системе UNIX.
Официальная документация FHS:
http://refspecs.linuxfoundation.org/fhs.shtml
«Этот стандарт необходим для того, чтобы:
• программное обеспечение легко находило нужные файлы и каталоги, и
• пользователи легко находили установленные в системе файлы и ката-
логи.
• Мы достигаем этих целей тем, что формулируем основополагающие
принципы,
• в соответствии с которыми формируется каждая составная часть файло-
вой
• системы, указываем минимально необходимый список файлов и подка-
талогов,
36
• перечисляем исключения из основных принципов, и перечисляем осо-
бые
• случаи, возникающие в силу исторических причин.
Настоящий стандарт используется для того, чтобы:
• независимые поставщики программного обеспечения могли создавать
• приложения, совместимые со стандартом FHS, и работать с FHS-совме-
стимыми
• дистрибутивами, создатели операционных систем разрабатывали си-
стемы,
• совместимые с FHS, и пользователи понимали и поддерживали FHS-
• совместимость систем» - из документации по стандарту FHS.
Текущая версия стандарта — 3.0, анонсирована 3 июня 2015 года.
Предыдущая версия стандарта – 2.3, анонсирована 28 января 2004.
Основное описание структуры файловой системы согласно стандарту
FHS:
Директория Описание
/ Корневая директория, содержащая всю файловую иерархию.
Основные системные утилиты, необходимые как в однопользовательском ре-
/bin/
жиме, так и при обычной работе всем пользователям (например: cat, ls, cp).
Загрузочные файлы (в том числе файлы загрузчика, ядро и т.д.). Часто выносится
/boot/
на отдельный раздел.
Основные файлы устройств системы (например физические устройства sata вин-
/dev/ честеры /dev/sda, видео камеры или TV-тюнеры /dev/video или псевдоустрой-
ства, например «чёрные дыры» /dev/null, /dev/zero ).
Общесистемные конфигурационные файлы, лежат в корне директории и файлы
/etc/
конфигурации установленных программ (имя происходит от et cetera).
/etc/X11/ Файлы конфигурации X Window System версии 11.

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


/home/ жат персональные настройки и данные пользователя. Часто размещается на от-
дельном разделе.
/lib/ Основные библиотеки, необходимые для работы программ из /bin/ и /sbin/.
Точки монтирования для сменных носителей, таких как CD-ROM, DVD-ROM, flash
/media/
дисков.
/opt/ Дополнительное программное обеспечение.
Виртуальная файловая система, представляющая состояние ядра операционной
/proc/
системы и запущенных процессов в виде каталогов файлов.
/root/ Домашняя директория пользователя root.
Основные системные программы для администрирования и настройки системы,
/sbin/
например, init, iptables, ifconfig.
/srv/ Данные, специфичные для окружения системы.
/tmp/ Временные файлы (см. также /var/tmp).
Вторичная иерархия для данных пользователя; содержит большинство пользова-
тельских приложений и утилит, используемых в многопользовательском режиме.
/usr/
Может быть смонтирована по сети только для чтения и быть общей для несколь-
ких машин.
Дополнительные программы для всех пользователей, не являющиеся необходи-
/usr/bin/
мыми в однопользовательском режиме.
/usr/include/ Стандартные заголовочные файлы.
/usr/lib/ Библиотеки для программ, находящихся в /usr/bin/ и /usr/sbin/.
Дополнительные системные программы (такие как демоны различных сетевых
/usr/sbin/
сервисов).

37
/usr/share/ Архитектурно-независимые общие данные.
/usr/src/ Исходные коды (например, здесь располагаются исходные коды ядра).
Третичная иерархия для данных, специфичных для данного хоста. Обычно содер-
/usr/local/ жит такие поддиректории, как bin/, lib/, share/. Она пригодится, когда /usr/ ис-
пользуется по сети.
Изменяемые файлы, такие как файлы регистрации (log-файлы), временные поч-
/var/
товые файлы, файлы спулеров.
Данные кэша приложений. Сюда скачиваются пакеты перед их установкой в си-
/var/cache/
стему, здесь же они какое-то время и хранятся
Информация о состоянии. Постоянные данные, изменяемые программами в про-
/var/lib/
цессе работы (например, базы данных, метаданные пакетного менеджера и др.).
/var/lock/ Lock-файлы, указывающие на занятость некоторого ресурса.
/var/log/ Различные файлы регистрации (log-файлы).
/var/mail/ Почтовые ящики пользователей.
/var/run/ Информация о запущенных программах (в основном, о демонах).
Задачи, ожидающие обработки (например, очереди печати, непрочитанные или
/var/spool/
неотправленные письма).
/var/tmp/ Временные файлы, которые должны быть сохранены между перезагрузками.
Директория веб-сервера Apache, всё что находится внутри транслируется им в ин-
/var/www/
тернет (конфигурация по-умолчанию)

Главной особенностю FHS в Red Hat Enterprise Linux 7 (CentOS 7.x) яв-
ляется, то, что структура файловой системы была реструктуризирована.
В Red Hat Enterprise Linux 7 была ведена вводит новую структуру фай-
ловой системы. Директории /bin, /sbin, /lib и /lib64 сейчас находятся в /usr.
Отличительной особенностью FHS, является то, что у одного объекта
файловой системы (файла) может быть несколько путей, т.е, несколько фай-
лов в структуре каталогов Linux/UNIX могут быть физически одним файлом
на диске. Или другими словами, 1 физический файл на диске может иметь не-
сколько имен (путей).
Это достигается тем, что в файловой системе каждый файл идентифици-
руется уникальным номером, называемым Inode (Инод = Индексный де-
скриптор).
В файловой структуре Linux имеется один корневой раздел - / (он
же root, корень). Все разделы жёсткого диска (если их несколько) представ-
ляют собой структуру подкаталогов, "примонтированых" к определённым ди-
ректориям.
Операция монтирования служит для того, чтобы сделать доступной
файловую систему, расположенную на каком-либо блочном устройстве.
Суть операции монтирования заключается в том, что ядро ассоции-
рует некоторый каталог (называемый точкой монтирования) с блочным
устройством и драйвером файловой системы.
Для этого оно передаёт ссылку на блочное устройство драйверу файло-
вой системы, и в случае, если драйвер успешно проидентифицировал эту фай-
ловую систему, ядро заносит в специальную таблицу монтирования информа-
цию о том, что все файлы и каталоги, чей полный путь начинается с указанной
точки монтирования, обслуживаются соответствующим драйвером файловой
системы и расположены на указанном блочном устройстве.
Посмотреть таблицу примонтированных файловых систем можно через
файл /proc/mounts.
38
Посмотреть сколько файл имеет ссылок и inod файла можно командой:
# ls -li
197 lrwxrwxrwx 1 mc-sim root 7 Mar 30 2008 etc -> tmp/etc
в приведенном примере первый столбец (значения 197) есть inod, а тре-
тий столбец (значения 1) есть количество ссылок на файл (читаем: путей
файла).
Inod, как уже говорилось, уникален в пределах определённой файловой
системы и содержит следующую информацию:
• о владельце объекта FS
• последнем времени доступа
• размере объекта FS
• указании файл это или каталог
• права доступа
При перемещении файла утилитой mv в пределах одной файловой си-
стемы, Inod файла остается неизменным (меняется только поле, описывающее
имя путь файла), при перемещении файла в другую файловую систему сначала
создаётся новый inod, а затем удаляется исходный.
В Linux существует 2 вида ссылок:
• Жёсткая ссылка (она же Хардлинк, Hard-Link) - это собственно и
есть один их путей файла (который указывается в команде ls –li;
• Символьная (она же Симлинк от англ. Symbolic link, символиче-
ская ссылка) - это файл UNIX, содержащий в себе лишь текстовую
строку - путь к оригинальному файлу, на который собственно ссыла-
ется.
Файл в Linux существует пока на inod, есть хоть одно указание (1
путь/имя), как только из системы удаляется последнее указание на inod, блоки,
занимаемые файлом с данным inod "переходят" в свободный список (список
блоков, доступных для выделения на диске). То есть блоки становятся свобод-
ным местом на диске.
В FS UNIX есть такое понятие как суперблок. Суперблок содержит в
себе следующую информацию о файловой системе:
• общее число блоков и индексных дескрипторов в файловой системе;
• число свободных блоков и индексных дескрипторов в файловой системе;
• размер блока файловой системы;
• количество блоков и индексных дескрипторов в группе;
• размер индексного дескриптора;
• идентификатор файловой системы.
Суперблок размещается в первых 1024 байтах раздела, от его целостно-
сти зависит работоспособность FS. ОС создаёт несколько копий суперблока
для восстановления в случае повреждения оригинального и размещает их (ко-
пии) различных областях жёсткого диска.
4.1. Семь основных типов файлов.
Для того, чтобы идентифицировать и классифицировать все семь типов
файлов, имеющихся в Linux, вам нужно знать всего одну команду:
$ ls -ld
39
Краткое описание всех семи различных типов файлов в Linux и их иден-
тификаторы для команды ls:
- обычный файл
d: директория
c: файл символьного устройства
b: файл блочного устройства
s: файл локального сокета
p: именованный канал
l: символическая ссылка
Обычный файл
Обычный файл - это самый распространенный тип файлов в системе. Он
объединяет самые различные виды файлов, такие как текст, изображения, би-
нарные файлы, библиотеки и т.д. Обычный файл вы можете создать с помо-
щью команды:
$ touch linuxcareer.com
$ ls -ld linuxcareer.com
-rw-rw-r-- 1 lubos lubos 0 Jan 10 12:52 linuxcareer.com
Первый символ в выводе команды ls, в данном случае "-", представляет
собой код идентификации для обычного файла. Для удаления обычного файла
используется команда:
$ rm linuxcareer.com
Директория
Директория - это второй самый распространенный тип файлов в Linux.
Директории могут быть созданы с помощью команды mkdir:
$ mkdir FileTypes
$ ls -ld FileTypes/
drwxrwxr-x 2 lubos lubos 4096 Jan 10 13:14 FileTypes/
Как уже говорилось ранее, директории идентифицируются по символу
"d" в выводе команды ls. Для удаления директорий используется команда rmdir.
$ rmdir FileTypes
Если вы попытаетесь с помощью команды rmdir удалить директорию, в
которой есть файлы, то получите сообщение об ошибке:
rmdir: failed to remove 'FileTypes/': Directory not empty
В этом случае необходимо использовать команду:
$ rm -r FileTypes/
Символьное устройство
Файлы символьных и блочных устройств позволяют пользователям и
программам обмениваться данными с периферийными устройствами, напри-
мер:
$ ls -ld /dev/vmmon
crw------- 1 root root 10, 165 Jan 4 10:13 /dev/vmmon
В данном случае символьное устройство - это модуль vmware.
40
Блочное устройство
Блочные устройства похожи на символьные. Это главным образом такие
устройства как жесткие диски, память и т.д.
$ ls -ld /dev/sda
brw-rw---- 1 root disk 8, 0 Jan 4 10:12 /dev/sda

Сокеты локального домена


Сокеты локального домена используются для обмена данными между
процессами. В основном они используются такими службами, как X windows,
syslog и т.д.
$ ls -ld /dev/log
srw-rw-rw- 1 root root 0 Jan 4 10:13 /dev/log
Сокеты могут быть созданы с помощью системного вызова socket, а уда-
лены с помощью системной функции unlink или команд rm.
Именованные каналы
Как и локальные сокеты, именованные каналы позволяют осуществ-
лять обмен данными между локальными процессами. Они могут быть со-
зданы с помощью команды mknod, а удалены с помощью команды rm.
Символические ссылки
С посощью символических ссылок администратор может присвоить од-
ному файлу или директории несколько идентичностей. Символическая ссылка
является указателем на оригинальный файл. Существует два типа символиче-
ских ссылок:
- жесткие ссылки;
- мягкие ссылки.
Различие между твердыми и мягкими ссылками в том, что мягкие
ссылки ссылаются на имя файла, в то время как жесткие ссылки прямо ссыла-
ются на оригинальный файл. Кроме того, жесткие ссылки не работают с фай-
лами, расположенными на других разделах или файловых системах.
Для создания мягкой символической ссылки используется команда:
$ echo file1 > file1
$ ln -s file1 file2
$ cat file2
file1
$ ls -ld file2
lrwxrwxrwx 1 lubos lubos 5 Jan 10 14:42 file2 -> file1
Для удаления символической ссылки мы можем использовать команды
unlink или rm.
4.2. Утилиты для работы с файлами.
Команда ls.
Общий синтаксис команды ls:
$ ls опции /путь/к/папке
41
Опции команды указывают как именно и в каком виде нужно выводить
информацию на экран, а путь, это та папка, которую нужно отобразить. Рас-
смотрим основные опции утилиты:
-a — отображать все файлы, включая скрытые, это те, перед именем ко-
торых стоит точка;
-A — не отображать ссылку на текущую папку и корневую папку . и ..;
--author — выводить создателя файла в режиме подробного списка;
-b — выводить Escape последовательности вместо непечатаемых симво-
лов;
--block-size — выводить размер каталога или файла в определенной еди-
нице измерения, например, мегабайтах, гигабайтах или килобайтах;
-B — не выводить резервные копии, их имена начинаются с ~;
-c — сортировать файлы по времени модификации или создания, сна-
чала будут выведены новые файлы;
-C — выводить колонками;
--color — включить цветной режим вывода, автоматически активирована
во многих дистрибутивах;
-d — выводить только директории, без их содержимого, полезно при ре-
курсивном выводе;
-D — использовать режим вывода, совместимый с Emacs;
-f — не сортировать;
-F — показывать тип объекта, к каждому объекту будет добавлен один
из специализированных символов */=>@|;
--full-time — показывать подробную информацию, плюс вся информа-
ция о времени в формате ISO;
-g — показывать подробную информацию, но кроме владельца файла;
--group-directories-first — сначала отображать директории, а уже потом
файлы;
-G — не выводить имена групп;
-h — выводить размеры директориев в удобном для чтения формате;
-H — открывать символические ссылки при рекурсивном использовании;
--hide — не отображать файлы, которые начинаются с указанного сим-
вола;
-i — отображать номер индекса inode, в которой хранится этот файл;
-l — выводить подробный список, в котором будет отображаться владе-
лец, группа, дата создания, размер и другие параметры;
-L — для символических ссылок отображать информацию о файле, на
который они ссылаются;
-m — разделять элементы списка запятой;
-n — выводить UID и GID вместо имени и группы пользователя;
-N — выводить имена как есть, не обрабатывать контролирующие по-
следовательности;
42
-Q — брать имена папок и файлов в кавычки;
-r — обратный порядок сортировки;
-R — рекурсивно отображать содержимое поддиректорий;
-s — выводить размер файла в блоках;
-S — сортировать по размеру, сначала большие;
-t — сортировать по времени последней модификации;
-u — сортировать по времени последнего доступа;
-U — не сортировать;
-X — сортировать по алфавиту;
-Z — отображать информацию о расширениях SELinux;
-1 — отображать один файл на одну строку.
Примеры использования.
Просмотр содержимое текущей папки:
$ls
Просмотр содержимое корневой папки:
$ls /
Просмотр содержимого директории в виде списка с максимальным ко-
личеством информации:
$ls –l
Просмотр содержимого директории в виде списка с максимальным ко-
личеством информации, включая авторов файлов:
$ls -l --author
Просмотр содержимого директории в виде списка в удобном для чтения
формате:
$ls –lh
Просмотр содержимого директории с отображением всех файлов:
$ls –a
Просмотр содержимого директории с отображением всех файлов и сор-
тировкой по размеру файлов и с обратным выводом (от большего к меньшему:
$ls –aS
Просмотр содержимого директории с отображением всех файлов и сор-
тировкой по размеру файлов и с прямым выводом (от меньшего к большему):
$ls –aSr
Команда cd.
Команда cd это встроенная команда Bash и изменяющая текущую дирек-
торию только для оболочки, в которой выполняется, основной синтаксис ко-
манды:
$ cd опции папка_назначения
Опций всего две, это -P и -L. Они влияют на то, как будут обрабаты-
ваться символы возврата в предыдущую директорию и символические ссылки:

43
-P — позволяет следовать по символическим ссылкам перед тем, как бу-
дут обработаны все переходы «..»;
-L — переходит по символическим ссылкам только после того, как были
обработаны «..»;
-e — если папку, в которую нужно перейти не удалось найти — выдает
ошибку.
Дальше нужно указать директорию, в которую следует перейти. Если
этого не сделать, а вызвать cd без параметров, то рабочей папкой будет выбран
ваш домашний каталог.
Команда pwd.
pwd — команда в Unix / Linux для вывода текущего каталога
pwd является аббревиатурой от Print Working Directory — показать ди-
ректорию, где находится пользователь. «pwd» команда считается одна из са-
мых часто используемых команд наряду с ls, и командой cd.
Команда может быть использована для следующих целей:
• Узнать полный путь к текущему каталогу
• Сохранить полный путь текущего каталога в переменной shell
• Проверить абсолютный путь
• Проверить физический путь т.е. исключить символические ссылки
• Текущий каталог
Команда touch.
touch - touch изменяет время последнего доступа и/или время последней
модификации каждого заданного файла.
Эти временные штампы устанавливаются в текущее время; или, если за-
дана опция -r, то эти штампы устанавливаются в те же, что имеет файл ref_file;
или, если задана опция -t, то эти штампы устанавливаются на заданное время.
Оба штампа изменяются, если не задана ни одна из опций -a и -m или если
заданы они обе.
Если задана только опция -a или только -m, то изменяться будет, соот-
ветственно, только время последнего доступа или время последней модифи-
кации. Если заданный файл еще не существует, то он создается (как пустой
файл с правами доступа 0666, с учетом umask), если не задана опция -c. Ос-
новные опции:
ОПЦИИ GNU
-a, --time=atime, --time=access, --time=use изменять только время послед-
него доступа.
-c, --no-create не создавать файлы, которые не существуют.
-d, --date=время использовать время вместо текущего времени. Оно мо-
жет содержать имена месяцев, часовые пояса, `am' и `pm', и т.~д.
-f Игнорируется; для совместимости с BSD версией touch(1).
-m, --time=mtime, --time=modify изменять только время последней мо-
дификации.
-r file, --reference=файл использовать время указанного файла вместо те-
кущего времени.
44
-t decimtime здесь decimtime имеет формат ММДДччмм[[ВВ]ГГ][.сс]
Использовать аргумент (месяц, день, часы, минуты, необязательный век, год,
секунды) вместо текущего времени. Заметим, что этот формат нарушает спе-
цификацию POSIX.
--help
Выдать подсказку на стандартный вывод и успешно завершиться.
--version
Выдать информацию о версии на стандартный вывод и успешно за-
вершиться.
Команда touch foo создаст файл foo, если он не существует, и изменит
время последней модификации на текущее. Это очень часто используется для
управления действиями программы make.
Команды chown и chgrp
Эти команды служат для смены владельца файла и группы файла. Вы-
полнять смену владельца может только суперпользователь, смену группы мо-
жет выполнить сам владелец файла или суперпользователь. Для того, чтобы
иметь право сменить группу, владелец должен дополнительно быть членом
той группы, которой он хочет дать права на данный файл. Формат этих двух
команд аналогичен:
[root]# chown vasja имя-файла
[root]# chgrp usersgrp имя-файла
Команда mkdir
Команда mkdir позволяет создать подкаталог в текущем каталоге. В ка-
честве аргумента этой команде надо дать имя создаваемого каталога. Во вновь
созданном каталоге автоматически создаются две записи: . (ссылка на этот са-
мый каталог) и .. (ссылка на родительский каталог). Чтобы создать подкаталог,
вы должны иметь в текущем каталоге право записи. Можно создать подката-
лог не в текущем, а в каком-то другом каталоге, но тогда необходимо указать
путь к создаваемому каталогу:
[user]$ mkdir /home/kos/book/glava5/part1
Команда mkdir может использоваться со следующими опциями:
• -m mode — задает режим доступа для нового каталога (например, -m
755);
• -p — создавать указанные промежуточные каталоги (если они не суще-
ствуют).
Команда cat
Команда cat часто используется для создания файлов (хотя можно вос-
пользоваться и командой touch). По команде cat на стандартный вывод (т. е.
на экран) выводится содержимое указанного файла (или нескольких файлов,
если их имена последовательно задать в качестве аргументов команды). Если
вывод команды cat перенаправить в файл, то можно получить копию какого-
то файла:
[user]$ cat file1 > file2

45
Собственно, первоначальное предназначение команды cat как раз и
предполагало перенаправление вывода, так как эта команда создана для кон-
катенации, т. е. объединения нескольких файлов в один:
[user]$ cat file1 file2 ... fileN > new-file
Именно возможности перенаправления ввода и вывода этой команды и
используются для создания новых файлов. Для этого на вход команды cat
направляют данные со стандартного ввода (т. е. с клавиатуры), а вывод ко-
манды — в новый файл:
[user]$ cat > newfile
После того, как вы напечатаете все, что хотите, нажмите комбинацию
клавиш <Ctrl>+<D> или <Ctrl>+<C>, и все, что вы ввели, будет записано в
newfile. Конечно, таким образом создаются, в основном, короткие текстовые
файлы.
Команда cp
Хотя для копирования файлов иногда пользуются командой cat, но в
Linux существует для этого специальная команда cp. Ее можно применять в
одной из двух форм:
[user]$ cp [options] source destination
[user]$ cp [options] source_directory new_directory
В первом случае файл или каталог source копируется, соответственно, в
файл или каталог destination, а во втором случае файлы, содержащиеся в ката-
логе source_directory копируются в каталог new_directory. Для копирования
надо иметь права на чтение файлов, которые копируются, и права на запись в
каталог, в который производится копирование.
Если в качестве целевого указывается существующий файл, то его со-
держимое будет затерто, поэтому при копировании надо соблюдать осторож-
ность. Впрочем, можно использовать команду cp с опцией -i, тогда перед пе-
резаписью существующего файла будет запрашиваться подтверждение (очень
рекомендую вам всегда использовать эту опцию!).
У команды cp имеется еще несколько полезных опций
Опция Значение
-p Сохраняет время модификации файла и максимально возможные полномо-
чия. Без этой опции для нового файла задаются полномочия, соответствую-
щие полномочиям запустившего команду пользователя
-R или Если source — каталог, то копируется как он, так и все входящие в него под-
-r каталоги, т. е. сохраняется исходная форма дерева каталогов
-d Если задать эту опцию, то символические ссылки будут оставаться ссылками
(а иначе вместо ссылки копируется файл, на который дается ссылка)
-f Перезаписывать файлы при копировании (если такие уже есть) без до-
полнительных предупреждений

46
Команда mv
Если вам необходимо не скопировать, а переместить файл из одного ка-
талога в другой, вы можете воспользоваться командой mv. Синтаксис этой ко-
манды аналогичен синтаксису команды cp. Более того, она сначала копирует
файл (или каталог), а только потом удаляет исходный файл (каталог). И опции
у нее такие же, как у cp.
Команда mv может использоваться не только для перемещения, но и для
переименования файлов и каталогов (т. е. перемещения их внутри одного ка-
талога). Для этого надо просто задать в качестве аргументов старое и новое
имя файла:
[user]$ mv oldname newname
Но учтите, что команда mv не позволяет переименовать сразу несколько
файлов (используя шаблон имени), так что команда mv *.xxx *.yyy не будет
работать.
При использовании команды mv, также как и при использовании cp, не
забывайте применять опцию -i для того, чтобы получить предупреждение, ко-
гда файл будет перезаписываться.
Команды rm и rmdir
Для удаления ненужных файлов и каталогов в Linux служат команды rm
(удаляет файлы) и rmdir (удаляет пустой каталог) . Для того, чтобы восполь-
зовался этими командами, вы должны иметь право записи в каталоге, в кото-
ром расположены удаляемые файлы или каталоги. При этом полномочия на
изменение самих файлов не обязательны. Если хотите перед удалением файла
получить дополнительный запрос на подтверждение операции, используйте
опцию -i.
Если вы попытаетесь использовать команду rm (без всяких опций) для
удаления каталога, то будет выдано сообщение, что это каталог, и удаления
не произойдет. Для удаления каталога надо удалить в нем все файлы, после
чего удалить сам каталог с помощью команды rmdir. Однако можно удалить
и непустой каталог со всеми входящими в него подкаталогами и файлами,
если использовать команду rm с опцией -r.
Если вы дадите команду rm *, то удалите все файлы в текущем каталоге.
Подкаталоги при этом не удалятся. Для удаления как файлов, так и подката-
логов текущего каталога надо тоже воспользоваться опцией -r. Однако всегда
помните, что в Linux нет команды восстановления файлов после их удаления
(даже если вы спохватились сразу же после ошибочного удаления файла или
каталога)!
Так что дважды подумайте до удаления чего-либо и не пренебрегайте
опцией -i.
Команды more и less
Команда cat позволяет вывести на стандартный вывод (на экран) содер-
жимое любого файла, однако она используется для этих целей очень редко,
разве что для вывода очень небольших по объему файлов. Дело в том, что
содержимое большого файла мгновенно проскакивает на экране, и
47
пользователь видит только последние строки файла. Поэтому cat использу-
ется в основном по ее прямому назначению — для конкатенации файлов, а
для просмотра содержимого файлов (конечно, текстовых) используются ко-
манды more и less (или текстовые редакторы).
Команда-фильтр more выводит содержимое файла на экран отдельными
страницами, размером как раз в целый экран. Для того, чтобы увидеть следу-
ющую страницу, надо нажать на клавишу пробела. Нажатие на клавишу
<Enter> приводит к смещению на одну строку. Кроме клавиш пробела и <Enter>
в режиме паузы еще некоторые клавиши действуют как управляющие (напри-
мер, клавиша <B> возвращает вас на один экран назад), но мы здесь не будем
приводить полного их перечня, как и перечня опций команды. Вам для начала
надо еще только запомнить, что выйти из режима просмотра можно с помо-
щью клавиши <Q>, так как если вы этого не знаете, то вам придется долго и
нудно нажимать пробел, пока вы не доберетесь до конца длинного файла. Обо
всех опциях команды more вы можете прочитать в интерактивном руковод-
стве man или info.
Утилита less, разработанная в рамках проекта GNU, содержит все функ-
ции и команды управления выводом, имеющиеся в программе more, и некото-
рые дополнительные, например, позволяет использовать клавиши управления
курсором (<Стрелка вверх>, <Стрелка вниз>, <PgUp>, <PgDown>) для пере-
мещения по тексту. Вспомните, мы уже говорили об этом, когда рассматри-
вали интерактивную подсказку man.
Команды more и less позволяют производить поиск подстроки в про-
сматриваемом файле, причем команда less позволяет производить поиск как в
прямом, так и в обратном направлении. Для организации поиска строки сим-
волов string надо набрать в командной строке программы в нижней части
экрана (там, где двоеточие) /string. Если искомая строка будет найдена, будет
отображен соответствующий кусок текста, причем найденная строка будет
находиться в самом верху экрана.
Команда find и символы шаблонов для имен файлов
Еще одной часто используемой командой для работы с файлами в Linux
является команда поиска нужного файла find. Команда find может искать
файлы по имени, размеру, дате создания или модификации и некоторым дру-
гим критериям.
Общий синтаксис команды find имеет следующий вид:
find [список_каталогов] критерий_поиска
Параметр "список_каталогов" определяет, где искать нужный файл.
Проще всего задать в качестве начального каталога поиска корневой каталог
/, однако, в таком случае поиск может затянуться очень надолго, так как будет
просматриваться вся структура каталогов, включая смонтированные файло-
вые системы (в том числе сетевые, если таковые есть). Можно сократить
объем поиска, если задать вместо одного корневого каталога список из не-
скольких каталогов (естественно, тех, в которых может находиться искомый
файл):
$ find /usr/share/doc /usr/doc /usr/locale/doc -name instr.txt
48
Началом "критерия_поиска", определяющего, что именно должна ис-
кать программа find, считается первый аргумент, начинающийся на "-", "(",
")"', "," или "!". Все аргументы, предшествующие "критерию_поиска", тракту-
ются как имена каталогов, в которых надо производить поиск. Если не указано
ни одного пути, поиск производится только в текущем каталоге и его подка-
талогах.
Чаще всего поиск проводится по именам файлов, как это показано в
предыдущем примере, т. е. "критерий_поиска" задается как "-name
имя_файла". Вместо опции -name можно использовать опцию -path, тогда ко-
манда будет искать совпадения в полном имени файла, с указанием пути.
Например, команда
[user]$ find . -path './sr*sc'
найдет в текущем каталоге подкаталог './src/misc'. Вместо полного
имени файла или каталога в этом примере использован так называемый "шаб-
лон имени". Поскольку шаблоны имен файлов могут использоваться не
только с командой find, но и со многими другими командами (включая уже
рассмотренные команды chmod, chown, chgrp, cp, rm, cat, mv), то правилам
составления шаблонов стоит уделить некоторое внимание.
Чаще всего шаблоны имен файлов строятся с помощью специальных
символов "*" и "?". Значок "*" используется для замены произвольной строки
символов. В Linux
• "*" — соответствует всем файлам, за исключением скрытых;
• ".*" — соответствует всем скрытым файлам (но также текущему ката-
логу "." и каталогу уровнем выше "..": не забывайте об этом!);
• "*.*" — соответствует только тем файлам и каталогам, которые имеют
"." в середине имени, или оканчиваются на точку;
• "p*r" — соответствует и "peter" и "piper";
• "*c*" — соответствует и "picked" и "peck".
Значок ? заменяет один произвольный символ, поэтому index?.htm бу-
дет соответствовать именам index0.htm, index5.htm и indexa.htm.
Кроме "*" и "?" в Linux при задании шаблонов имен можно использовать
квадратные скобки [], в которых дается либо список возможных символов,
либо интервал, в который должны попадать возможные символы. Например,
[abc]* соответствует всем именам файлов, начинающимся с a, b, c; *[I-N1-3]
соответствует файлам, имена которых оканчиваются на I, J, K, L, M, N, 1, 2, 3.
А теперь вернемся к команде find и расскажем подробнее о том, какие
критерии поиска возможны. Несколько примеров простых критериев поиска
перечислены в таблице
Опция Значение
-name шаблон Ищет файлы, имена которых соответствуют шаблону
-group имя Ищет файлы, принадлежащие указанной группе
-size число[c] Ищет файлы, размером в число 512-байтных блоков. Если после числа
стоит символ c, значит размер указан в байтах (символах)

49
-mtime число Ищет файлы, которые в последний раз изменялись указанное число
дней назад
-newer образец Ищет файлы, которые изменялись после изменения файла, указанного
в образце
-type Ищет файлы указанного типа. Тип задается одним из символов b
тип_файла (блок-ориентированные устройства), c (байт-ориентированные
устройства), d (файл каталога), f (обычный файл), p (именованный ка-
нал) либо l (символическая ссылка)
Другие простые критерии вы можете узнать, если просмотрите man-
страницу о команде find. Здесь же надо только сказать, что из простых крите-
риев можно строить более сложные с помощью логических операций and, or
или операции отрицания, знаком которой служит восклицательный знак.
Например, если вы хотите найти все файлы, имена которых оканчиваются
на .txt и .doc, то критерий можно записать как (-name *.txt -or -name *.doc).
Можно комбинировать таким образом любое число критериев (и не только
простых!). Если операция не указана явно, то подразумевается -and, т. е. вме-
сто (-name *.txt -and -name *.doc) можно записать просто (-name *.txt -name
*.doc). Если применяется только одна операция -and или !, то скобки обычно
можно опустить, а с операцией -or и в сложных выражениях скобки необхо-
димы. Перед скобкой нужно поставить обратную косую черту, а после
скобки — пробел. Например, если вы хотите найти каталог по его имени, то
можно сделать это командой
$ find /usr -name doc -type d
или (с соблюдением правил построения сложных критериев)
$ find /usr \( -name doc -and -type d \)
В следующем примере мы ищем файлы по такому критерию: либо имя
файла оканчивается на *.tmp, либо размер файла больше 100 Кбайт.
$ find /home/kos \( \( -name *.tmp \) -or \( -size +200 \) \)
В последнем примере стоит обратить внимание на то, что перед значе-
нием размера стоит знак "+". Такой знак можно использовать с любым число-
вым параметром в критериях поиска команды find. Он означает, что нужно
искать файлы, у которых значение параметра больше заданного. Соответ-
ственно, знак "-" означает, что надо искать файлы, у которых значение пара-
метра меньше заданного. Если знаки + или — отсутствует, ищутся файлы, у
которых значение параметра равно заданному.
Чтобы закончить рассмотрение команды find, надо сказать еще о том,
что после критерия поиска в этой команде можно сразу же задать операцию,
которая будет применяться ко всем файлам, найденным по указанному крите-
рию. Простейшим примером использования такой возможности является ука-
зание команды –print.
$ find /home/kos -name *.tmp -print
по которой выдается на экран список имен всех найденных файлов с
указанием полного пути к файлу. Эта операция применяется по умолчанию,
50
т. е. когда никаких операций вообще не указано (как это было во всех приве-
денных выше примерах). Другим примером операции, применяемой ко всем
найденным файлам, может служить операция -exec cmd {} \;, где cmd — про-
извольная команда оболочки shell. То есть в этом случае ко всем найденным
файлам (их именами заменяются поочередно фигурные скобки) применяется
команда cmd. За cmd {} в этом случае должна следовать точка с запятой, экра-
нированная обратной косой чертой.
Например, если вы хотите удалить в текущем каталоге все файлы, к ко-
торым пользователи не обращались в течение 30 дней, дайте команду:
# find . -type f -atime +30 -exec rm {} \;
Вместо -exec можно поставить -ok, тогда перед выполнением указанной
команды cmd применительно к каждому файлу будет запрашиваться подтвер-
ждение.
В общем, команда find является очень мощным, полезным и чрезвы-
чайно адаптируемым инструментом поиска в файловой системе. Все ее воз-
можности здесь не перечислены, изучайте соответствующую man-страницу.
И будьте очень осторожны с применением таких возможностей команды, как
вызов других команд, применяемых ко всем найденным файлам. Помните, что
изменения часто необратимы!
Команда split — разбиваем файл на несколько частей
Иногда бывает необходимо разбить один большой файл на несколько
файлов меньшего объема. Для примера рассмотрим ситуацию, когда вы хо-
тите перенести на свой домашний компьютер файл song.mp3 формата "MP3",
размером в 4,894,425 байт. Возможности перекачать этот файл по сети у вас
нет, и единственно возможный способ переноса — воспользоваться диске-
тами. Но, поскольку на одну дискету файл не помещается, требуется разбить
его на несколько маленьких файлов, а потом "собрать" снова. Для решения
этой задачи можно воспользоваться командой split.
Команда split копирует файл, разбивая его на отдельные файлы задан-
ной длины. В качестве аргументов ей надо указать имя исходного файла и
префикс имен выходных файлов. Имена выходных файлов будут составляться
из этого префикса и двух дополнительных букв `aa', `ab', `ac' и т. д. (без про-
белов и точек между префиксом и буквами). Если префикс имен файлов не
задан, то по умолчанию используется ‘x’, так что выходные файлы будут
называться `xaa', `xab' и т. д..
Кроме аргументов можно задать опцию -b, определяющую размер вы-
ходных файлов в байтах. Вслед за –b должно стоять число, а за ним — буква
k (показывающая, что размер выходного файла указан в килобайтах) или m
(значит размер задан в мегабайтах). Если опция не задана, то по умолчанию
размер выходных файлов принимается равным 1 Мбайту. Таким образом,
чтобы перенести на дискетах файл song.mp3 надо вначале дать команду
$split -b1400k song.mp3 song.
скопировать полученные файлы song.aa, song.ab, song.ac, song.ad,
song.ae на отдельные дискеты, перенести их на домашний компьютер,

51
скопировать в какой-нибудь каталог и восстановить исходный файл с помо-
щью команды
$cat song.* > song.mp3
после чего можно удалить временные файлы song.xx.
Сравнение файлов и команда patch
Вы не замечали, что задача сравнения содержимого двух различных
файлов возникает при работе с компьютером удивительно часто? Конечно,
ведь так легко скопировать файл, а потом забываешь, какая же из версий новее
или качественнее (по одному автору ведомым критериям). Так что инстру-
менты для сравнения файлов просто необходимы и Linux такие инструменты
предоставляет.
Простейший из них — команда cmp. Эта команда просто сравнивает со-
держимое двух файлов по-байтно:
$ cmp file1 file2
Если файлы полностью совпадают, она молча заканчивает свою работу
(происходит возврат к командной строке без каких-либо дополнительных со-
общений), а если файлы различаются, выдаются номер строки и номер байта
в строке, где имеет место первое различие.
Конечно, информации, выдаваемой командой cmp, маловато для того,
чтобы принять, например, решение о том, какой из двух файлов нам более
ценен. Поэтому стоит воспользоваться командой diff для получения полного
отчета о том, каковы же различия в интересующих нас файлах. Для получения
отчета достаточно указать команде, какие именно файлы сравнивать:
$diff paper.old paper.new
Отчет о выявленных различиях будет выдан на стандартный выход.
Естественно, его лучше перенаправить в файл:
$diff paper.old paper.new >paper.diff
Для оценки версий одного и того же файла более удобна может ока-
заться команда sdiff, которая выдает результат сравнения в виде двух столб-
цов, разделенных пробелами. Если строки с одинаковыми номерами в файлах
различаются, то в выводе команды sdiff они разделены вертикальной чертой |.
Если строка имеется только в первом файле, она отмечена знаком <. Соответ-
ственно, строка, встречающаяся только во втором файле, помечена знаком >.
Существует также команда diff3, которая позволяет сравнить сразу 3
файла.
Но все же наиболее часто используется традиционная для UNIX-систем
команда diff. Эта ее востребованность объясняется тем, что создаваемый ею
отчет о различиях двух файлов может быть использован командой patch. Чаще
всего эти возможности используются при распространении обновлений про-
граммного обеспечения. Предположим, что некоторое программное приложе-
ние было разослано пользователям в виде файла program.c, содержащего ис-
ходный код программы на языке Си. После этого разработчик внес в про-
грамму некоторые исправления и сохранил текст в виде файла program.c.new.
52
Требуется довести исправленный текст программы до пользователей. Оче-
видно, что пользователям достаточно сообщить только исправления, т. е. от-
чет об изменениях, создаваемый по команде
$diff program.c program.c.new > program.c.diff
Естественно, объем файла program.c.diff существенно меньше объема
файла program.c.new, так что можно было бы получить существенную эконо-
мию на передаче файлов, если отправлять пользователям только файл
program.c.diff (ведь объемы современных программных приложений состав-
ляют десятки мегабайт). Однако пользователи должны иметь возможность
внести эти исправления в имеющуюся у них версию программы. Эту задачу
позволяет решить команда patch. Имея файлы program.c и program.c.diff, поль-
зователь может дать команду
$ patch program.c program.c.diff > program.c.new
в результате выполнения которой он получит файл program.c.new.
4.3. Утилиты для получения информации об аппаратных ресурсах.
Утилита lshw.
Для получения информации об аппаратном обеспечении можно вос-
пользоваться утилитой lshw для консоли, или lshw-gui для графической обо-
лочки.
Если её нет в составе дистрибутива, то можно установить командой:
[root@test2 student]# yum install lshw lshw-gui
По умолчанию утилита создаёт список аппаратного обеспечения и вы-
даёт его на экран консоли. Этот список может быть достаточно большим, по-
этому рекомендуется перенаправить вывод в файл:
[root@test2 student]#lshw > /home/student/hw.txt
При необходимости информацию можно получить в более короткой
форме используя ключ –short:
[root@test2 student]# lshw –short > /home/student/hw-short.txt
Так же информацию можно получить в виде файла html или xml, для
этого используются ключи –html – xml, и перенаправить вывод в соответству-
ющий файл.
Утилита lspci.
Входит в состав пакета pciutils, и позволяет получить информацию об
устройствах, подключённых к шине PCI, если его нет в составе дистрибутива,
то можно установить:
[root@test2 student]# yum install pciutils
lspci - очень удобна, когда необходимо провести анализ устройств под-
ключённых к шине pci/pci-express.
Утилита lstopo.
Входит в состав пакета hwloc-libs, и позволяет получить информацию
об топологии аппаратной части, в виде графического рисунка или дерева то-
пологии в консоли, по умолчанию ее нет в составе дистрибутивов и устанав-
ливается отдельно:
53
[root@test2 student]# yum install hwloc*
Утилита lsusb и lsusb.py.
Входят в состав пакета usbutils, и позволяют получить информацию об
устройствах, подключённых к шине usb, при этом утилита lsusb.py выдаёт ин-
формацию о физических характеристиках устройства. По умолчанию входят в
состав большинства дистрибутивов, или устанавливаются отдельно:
[root@test2 student]# yum install usbutils*
Утилита lsblk.
Входит в состав пакета util-linux, и позволяет получить информацию о
топологии блочных устройства, по умолчанию она входит в состав большин-
ства дистрибутивов или устанавливается отдельно:
[root@test2 student]# yum install util-linux
Утилита lsscsi.
Входит в состав пакета lsscsi, и позволяет получить информацию о под-
ключённых устройствах на шинах SCSI/SATA/PATA, по умолчанию она вхо-
дит в состав большинства дистрибутивов или устанавливается отдельно:
[root@test2 student]# yum install lsscsi
Утилита lspcmcia.
Аналогична утилите lspci, позволяет получить информацию от устрой-
ствах, подключённых к шине pcmcia.
Утилита lscpu.
Выдаёт информацию обобщённую информацию об установленном
блоке CPU.
Приведём пример использования утилиты lspci:
[root@test2 rules.d]# lspci
00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01)
00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 01)
00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 08)
00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
00:07.7 System peripheral: VMware Virtual Machine Communication Interface (rev 10)
00:0f.0 VGA compatible controller: VMware SVGA II Adapter
00:10.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual
Ultra320 SCSI (rev 01)
00:11.0 PCI bridge: VMware PCI bridge (rev 02)
00:15.0 PCI bridge: VMware PCI Express Root Port (rev 01)
00:15.1 PCI bridge: VMware PCI Express Root Port (rev 01)

54
Глава 5. Дисковые файловые системы, поддерживаемые в
RHEL/CentOS.
• Ext4 - журналируемая файловая система, используемая в ОС сна ядре
Linux. Основана на файловой системе Ext3, но отличается тем, что в ней
представлен механизм записи файлов в непрерывные участки блоков
(екстенты), уменьшающий фрагментацию и повышающий производи-
тельность. В Debian 8, эта файловая система используется по умолчанию
при автоматическом разбиении диска инсталлятором.
• Ext3 - журналируемая файловая система, используемая в ОС на ядре
Linux. Является файловой системой по умолчанию во многих дистрибу-
тивах. Основана на Ext2, но отличается тем, что в ней есть журналиро-
вание, то есть в ней предусмотрена запись некоторых данных, позволя-
ющих восстановить файловую систему при сбоях в работе компьютера.
• Ext2 - файловая система, используемая в операционных системах на
ядре Linux. Достаточно быстра для того, чтобы служить эталоном в те-
стах производительности файловых систем. Она не является журнали-
руемой файловой системой и это её главный недостаток.
• BTRFS - Достаточно новая универсальная ФС, используемая в операци-
онных системах на ядре Linux. Ее особенностями являются: индексное
хранение структур данных (в В-деревьях), возможность создания снеп-
шотов, и многие другие интересные вещи.
• XFS - высокопроизводительная журналируемая файловая система. Рас-
пределение дискового пространства - екстентами, хранение каталогов в
B-деревьях. Автоматическая аллокация и высвобождение I-node. Де-
фрагментируется «на лету». Невозможно уменьшить размер существу-
ющей файловой системы. При сбое питания во время записи возможна
потеря данных, так как XFS, по умолчанию, достаточно активно исполь-
зует буферы в памяти.
• Fat16 - файловая система, сейчас широко используемая в картах памяти
фотоаппаратов и других устройств.
• Fat32 - файловая система, основанная на Fat16. Создана что бы преодо-
леть ограничения на размер тома в Fat16.
• NTFS - файловая система для семейства операционных систем Microsoft
Windows. Поддержка в осуществляется специальным драйвером.
• HFS - файловая система, разработанная Apple Inc. для использования на
компьютерах, работающих под управлением операционной системы
Mac OS.
• HSF+ - файловая система, разработанная Apple Inc. для замены HFS. Яв-
ляется улучшенной версией HFS, с поддержкой файлов большого раз-
мера и использует кодировку Unicode для имён файлов и папок.
• JFS - журналируемая файловая система. В отличие от Ext3, в которую
добавили поддержку журналирования, JFS изначально была журналиру-
емой. На момент выхода в свет JFS была самой производительной из су-
ществовавших файловых систем. На текущий момент сохраняет за со-
бой одно из лидирующих мест по этому показателю.

55
• SWAP - раздел жёсткого диска, предназначенный для виртуальной па-
мяти (файла подкачки).
• ReiserFS - журналируемая файловая система, разработанная специально
для Linux. Обычно под словом ReiserFS понимают третью версию (по-
следняя — 3.6.21), а четвёртую называют Reiser4. В настоящий момент
разработка Reiser3 прекращена.
• Reiser4 - журналируемая файловая система ReiserFS (4-я версия), разра-
ботанная специально для Linux. Одна из самых быстрых файловых си-
стем для Linux (с включённым плагином-архиватором - самая быстрая).
• UFS - файловая система, созданная для операционных систем семейства
BSD. Linux поддерживает UFS на уровне чтения, но не имеет полной
поддержки для записи UFS. Родной Linux ext2 создан по подобию UFS.
• ZFS (Zettabyte File System) — файловая система, изначально созданная
в Sun Microsystems для операционной системы Solaris. Эта файловая си-
стема поддерживает большие объёмы данных, объединяет концепции
файловой системы и менеджера логических дисков (томов) и физиче-
ских носителей, новаторскую структуру данных на дисках, легковесные
файловые системы (англ. lightweight filesystems), а также простое управ-
ление томами хранения данных. ZFS является проектом с открытым ис-
ходным кодом и лицензируется под CDDL (Common Development and
Distribution License). ZFS — 128-битная файловая система, что позволяет
ей хранить в 18,4 × 1018 раз больше данных, чем все известные 64-бит-
ные системы.
5.1. XFS базовая файловая система для RHEL/CentOS 7.
Архитектурные особенности.
− состоит из секций данных (содержит метаданные и может содержать
журнал), журнала и секции для работы в реальном времени
− секция данных делится на равные группы блоков (allocation groups),
количество которых определяет уровень параллелизма при выделе-
нии места; каждая группа содержит суперблок, управление свобод-
ным пространством группы, таблицу inode (создаются по потребно-
сти), данные
− размер блока в Linux - 4 КБ
− выделение места происходит экстентами (до 8 GiB)
− ранее не подходила для хранения большого количества мелких фай-
лов (почтовый сервер) - медленно работает с метаданными; посте-
пенно улучшается
− открытые в момент неожиданного выключения компьютера файлы
будут заполнены нулями (исправлено)
− мгновенное создание и расширение файловой системы при нулевых
накладных расходах (у ext4 - 1.5%, т.е. 269GB для 16ТБ) и примерно
сравнимых с ext4 накладных расходах при хранении файлов (на 0.07%
меньше для набора в 10TB из 10 миллионов файлов
− 64-битные номера inode для файловой системы размером 2ТиБ и бо-
лее
56
Файлы в /proc
Статистика и переменные управления:
• /proc/fs/xfs/stat - статистика
• /proc/sys/fs/xfs - управление
• age_buffer_centisecs - 1500, возраст метаданных для сброса на
диск
• error_level (?)
• filestream_centisecs - 3000
• inherit_noatime
• inherit_nodefrag
• inherit_nodump
• inherit_nosymlinks
• inherit_sync
• irix_sgid_inherit
• irix_symlink_mode - позволяет устанавливать права доступа сим-
вольных ссылок (отключено)
• panic_mask (?)
• rotorstep - 1, сколько файлов размещать в группе перед перехо-
дом к следующей
• restrict_chown - запрещает передавать права на файл другим
пользователям
• speculative_prealloc_lifetime
• stats_clear
• xfsbufd_centisecs - 100, интервал сборки мусора в буферах мета-
данных
• xfssyncd_centisecs - 3000, интервал сброса метаданных
Создание (mkfs.xfs)
Ключи утилиты mkfs.xfs:
-L метка-файловой-системы # до 12 символов
-d su=размер-страйпа-RAID,sw=число-страйпов-RAID # можно указы-
вать единицы объёма: k, m, g
-d agcount=число-групп-блоков
-d agsize=размер-группы-блоков # от 16 MiB до 1 TiB; можно указывать
единицы объёма: k, m, g
-d unwritten=1 # помечать незаписанные экстенты, увеличивает безопас-
ность (не даёт пользователям читать захваченные, но ещё не записанные части
файлов), уменьшает фрагментацию?, замедляет работу; "unknown option -d
unwritten=0"
-i attr=2 # версия политики размещения расширенных атрибутов (по
умолчанию)
-i maxpct=процентов # максимальная доля, которую inode могут зани-
мать на диске, по умолчанию - от 1% до 25% в зависимости от размера файло-
вой системы
-i size=байт # размер фиксированной части inode, от 256 (по умолчанию)
до 2048
-i align=1 # выравнивать блоки inode (по умолчанию)
-l internal=1 # журнал внутри
57
-l logdev=устройство-для-журнала # вынос журнала на отдельное
устройство экономит до 10 IOPS
-l size=байт # размер журнала (от 512 до 64K блоков, по умолчанию - 128
MiB)
-l su=размер-страйпа-RAID # можно указывать единицы объёма: k, m, g
-l lazy-count=1 # не обновлять счётчики суперблока при каждом измене-
нии метаданных, ускоряет (по умолчанию)
-m crc=1 # контрольные суммы метаданных, в RHEL 7.1
-s размер-сектора
-f # затирать обнаруженную на блочном устройстве файловую систему
-N # вывести параметры, но не создавать файловую систему
-K # не использовать TRIM во время создания файловой системы
Параметры монтирования
Опции монтирования:
• allocsize=байт # при увеличении файла место захватывается
указанными кусками, лишнее потом освобождается; от 4KiB до
1TiB; по умолчанию - 64KiB
• attr2 # ускоренная обработка атрибутов (по умолчанию)
• barrier # использовать барьерную синхронизацию при записи
метаданных (не нужно при наличии батарейки RAID контрол-
лера или внешнего хранилища)
• biosize=16 # размер блока в буферизованных запросах
ввода/вывода в виде двоичного логарифма
• grpid|bsdgroups # gid для создаваемого файла берётся от gid ка-
талога
• nogrpid|sysvgroups # gid для создаваемого файла берётся от про-
цесса (по умолчанию), если каталог не имеет бита setgid
• delaylog # ускоряет создание и удаление файлов в десятки раз
(в F15 или RHEL6.2 по умолчанию) - но всё равно ext4 быстрее;
опция nodelaylog не поддерживается с RHEL 6.5
• dmapi # задействовать интерфейс DMAPI (Data Management
API) для mtpt
• filestreams # использовать алгоритм выделения свободного ме-
сто, адаптированный для работы с несколькими параллель-
ными потоками; значительно ускоряет как запись, так и чтение;
может быть применён к отдельному каталогу с помощью атри-
бута filestreams
• ihashsize=число # размер хеш-таблицы для inode в памяти
• ikeep # опустевший кластер inode не удаляется (по умолчнию)
• noikeep # после освобождения всех inode в кластере отдавать
весь кластер в пул свободного места (noikeep)
• inode64 # 64-битные номера inode (NFS под CentOS4 и Solaris 8
монтируется нормально, но некоторые 32-битные программы
не умеют работать с файлами с большими inode); по умолча-
нию используются 32-битные inode, что приводит к их
58
размещению только в первых 2ТБ диска, что вызывает сообще-
ние о нехватке места при его формальном изобилии (у меня
"кончилось место" при наличии свободных 20 ТБ)
• largeio # изображает устройство с большими секторами (swidth
или allocsize)
• nolargeio # изображает устройство с маленькими секторами
• logbufs=число-буферов-журнала # от 2 до 8; по умолчанию - 2
для файловой системы с размером блока 4 KiB; больше буфе-
ров - быстрее запись
• logbsize=размер-буфера-журнала # 16384 или 32768 (по умол-
чанию) или 65536 или 131072 или 262144
• logdev=устройство-для-журнала
• noalign
• noatime
• nodiratime
• norecovery # не проигрывать журнал при монтировании
• nouuid # не обращать внимания на дубли UUID
• osyncisdsync # записывать файлы, открытые в режиме O_SYNC,
как в режиме O_DSYNC; ускоряет работу; в новых версиях
установлен по умолчанию, не отключаем
• osyncisosync # записывать файлы, открытые в режиме O_SYNC,
как в режиме O_SYNC
• uquota/usrquota/uqnoenforce/quota/gquota/grpquota/gqnoen-
force/pquota/prjquota/pqnoenforce
• sunit=размер-страйпа-RAID-в-секторах
• swidth=ширина-страйпа-RAID-в-секторах # размер-страйпа X
число-дисков-данных
• swalloc # округлять выделяемое место по swidth
Утилиты
xfs_info (скрипт для xfs_db).
xfs_admin (скрипт для xfs_db) позволяет изменить метку и UUID размон-
тированной фаловой системы.
xfs_check (скрипт для xfs_db) - проверка файловой системы, требуется
размонтирование, требует 16 ГБ памяти (реально использовались 10 ГБ) для
файловой системы в 7 TB (67%, 500 файлов); требует и реально использует 42
ГБ памяти для файловой системы в 20TB, быстр.

xfs_logprint - вывод и разбор журнала.


xfs_metadump (скрипт для xfs_db) - вывод метаданных в файл.
Определить уровень фрагментации файлов:
xfs_db -c frag -r блочное-устройство
(размонтирование не требуется, но иногда случается "Segmentation fault";
показывает долю "лишних" экстентов).
Определить уровень фрагментации свободного пространства:

59
xfs_db -c freesp -r блочное-устройство (размонтирование не требуется).
Утилита дефрагментирования файла или файловой системы xfs_fsr (в ка-
честве параметра можно указать файл или блочное устройство; по умолчанию
- все файлы на всех файловых системах); не требует размонтирования.
По очереди копирует все фрагментированные файлы в непрерывный ку-
сок свободной области (если есть), затем меняет ссылку на файл. Отображён-
ные в память (map) файлы не обрабатываются. Команда chattr утилиты xfs_io
позволяет пометить файлы, которые не надо дефрагментировать (атрибут f).
На каждом проходе обрабатывается 10% самых фрагментированных файлов
(или просто самых больших?). Информация о следующем к обработке файле
хранится в /var/tmp/.fsrlast_xfs, т.е. может продолжать прерванную работу.
Лучше запускать почаще, т.к. дефрагментировать сильно "загаженную" фай-
ловую систему утилита неспособна - свободное место фрагментируется в пыль,
после чего становится невозможно дефрагментировать большие файлы. Оп-
ции:
-v
-t секунд (7200; максимальное время работы)
Утилита восстановления структуры файловой системы xfs_repair (после
аварийного отключения компьютера требуется смонировать и размонтировать
файловую систему перед вызовом xfs_repair; 1 ГБ ОП и 12 секунд на 7.5 ТБ и
500 файлов, быстра); ключи:
-L (обнулить журнал)
-n (только проверка)
-t секунд (интервал между отчётами)
-v
Утилиты xfsdump и xfsrestore могут помочь извлечь данные из файловой
системы, которой не помогла xfs_repair (требуется монтирование).
Утилита xfs_growfs позволяет увеличить размер файловой системы без
размонтирования (уменьшение размера файловой системы невозможно).
Прочее: xfs_bmap, xfs_freeze, xfs_io, xfs_mdrestore, xfs_mkfile,
xfs_ncheck, xfs_quota.
Пример для работы в классе.
Создать логический том
#pvcreate /dev/sdb
#vgcreate test10 /dev/sdb
#lvcreate --name test101 100%FREE /dev/test10
создать файловую систему
#mkfs.xfs -f -L test100 -d su=64k,sw=2 -i attr=2 -l su=64k,lazy-count=1
/dev/test10/test101

Глава 6. Администрирование программных компонентов ОС Linux.


Согласно спецификации FHS (англ. Filesystem Hierarchy Standard, «стандарт
иерархии файловой системы») в директории /etc располагаются общесистемные
конфигурационные файлы (лежат в корне директории), и файлы конфигурации
60
установленных программ (располагаются в корне директории или в отдельных ди-
ректориях). Название директории /etc происходит от латинского сочетания «et
cetera» («и другие», «и тому подобное», «и так далее»). В корне директории /etc
должны находиться только конфигурационные файлы программного обеспечения,
так же разрешается размещение символических ссылок, а все файлы, сохраняемые в
ней по возможности должны группироваться в поддиректории с названием, ассоци-
ированным с названием программ. Размещение исполняемых бинарных файлов в ди-
ректории /etc запрещено. Для дополнительного программного обеспечения, устанав-
ливаемого в директорию /opt, конфигурационные файлы располагаются в директо-
рии /etc/opt.
6.1. Структура директории /etc.
Согласно FHS, когда системное приложение инсталлируется в системе, то все
его конфигурационный файлы размещаются в директории /etc (либо в корне дирек-
тории или в поддиректории), однако, для пользовательских приложений конфигу-
рационные файлы могут находиться в директории /usr/etc. Месторасположение фай-
лов зависит от типа приложения и его взаимодействия с операционной системой (ис-
пользование в качестве сервиса или службы).
Наполнение директории /etc файлами определяется типом дистрибутива
Linux и набором системных приложений установленных в системе. Опционально в
большинстве дистрибутивов присутствуют следующие директории и файлы:
Директория Описание
X11 Конфигурации для X Window system (optional)
sgml Конфигурации для SGML (optional)
xml Конфигурации для XML (optional)
Файлы и символические ссылки:
Файл Описание
csh.login Обще системный файл инициализации для авторизации C shell (optional)
exports Конфигурационный файл для NFS ACL (optional)
Файл статической информации о файловой системе, содержит точки монтирования
fstab
файловых систем (optional)
ftpusers Конфигурационный файл сервиса FTP (optional)
gateways Файл списка gateways для роутера (optional)
gettydefs Конфигурация скорости н настроек пользовательского терминала getty (optional)
group Файл списка групп пользователей (optional)
Файл конфигурации, который определяет порядок разрешения
host.conf
символического имени хоста в IP-адресе (resolver) (optional)
hosts Файл конфигурации сопоставления имени хоста и IP-адреса (optional)
hosts.allow Файл конфигурации доступа к хосту по TCP (кому доступ разрешён) (optional)
hosts.deny Файл конфигурации доступа к хосту по TCP (кому доступ запрещён) (optional)
hosts.equiv Список надёжных хостов для протоколов rlogin, rsh, rcp (optional)
hosts.lpd Список надёжных хостов для протокола печати lpd (optional)
inetd.conf Конфигурационный файл для процесса inetd (optional)
inittab Конфигурационный файл для процесса init (optional)
issue Файл содержит сообщение, выдаваемое системой до приглашения "login:". (optional)
ld.so.conf Файл содержит список каталогов для поиска разделяемых библиотек (optional)
Файл содержит сообщение, выдаваемое системой после входа пользователя в систему
motd
(optional)
Файл содержит динамическую информацию о смонтированных файловых системах
mtab
(optional)

61
Файл Описание
mtools.conf Конфигурационный файл для утилиты mtools (optional)
networks Файл содержит статическую информацию о сетевых именах (optional)
Файл содержит информацию обо всех пользователях системы, в том числе и псевдо-
passwd пользователях, которые необходимы для правильного функционирования сервисов
(optional)
printcap Файл содержит базу совместимых принтеров для lpd (optional)
profile Файл конфигурации авторизации для оболочки sh (optional)
protocols Файл содержит список IP-протоколов (optional)
resolv.conf Файл конфигурации Resolver’а (optional)
rpc Файл содержит RPC-список протоколов (optional)
securetty Файл управление доступом к консоли для root (optional)
services Файл содержит имена портов для сетевых сервисов (optional)
shells Файл содержит пути login shells (optional)
syslog.conf Файл конфигурации для сервиса syslogd (optional)
Рассмотрим содержимое директории /etc для дистрибутивов CentOS/RHEL
версии 6:
[root@test3 etc]# ls -F
abrt/ idmapd.conf printcap
acpi/ init/ profile
adjtime init.d@ profile.d/
aliases inittab protocols
aliases.db inputrc pulse/
alsa/ ipa/ purple/
alternatives/ iproute2/ quotagrpadmins
anacrontab issue quotatab
anthy-conf issue.net rc@
apt/ java/ rc0.d@
asound.conf jvm/ rc1.d@
at.deny jvm-commmon/ rc2.d@
audisp/ kde/ rc3.d@
audit/ kdump-adv-conf/ rc4.d@
autofs.conf kdump.conf rc5.d@
autofs_ldap_auth.conf krb5.conf rc6.d@
auto.master latrace.conf rc.d/
auto.misc latrace.d/ rc.local@
auto.net* ld.so.cache rc.sysinit@
auto.smb* ld.so.conf rdma/
avahi/ ld.so.conf.d/ readahead.conf
bash_completion.d/ libaudit.conf redhat-lsb/
bashrc libreport/ redhat-release@
blkid/ libuser.conf request-key.conf
bluetooth/ localtime request-key.d/
bonobo-activation/ login.defs resolv.conf
cas.conf logrotate.conf rpc
centos-release logrotate.d/ rpm/
certmonger/ lsb-release rsyslog.conf
chkconfig.d/ lsb-release.d/ rsyslog.d/
ConsoleKit/ ltrace.conf rwtab
cron.d/ lvm/ rwtab.d/
cron.daily/ magic samba/
cron.deny mailcap sane.d/
cron.hourly/ mail.rc sasl2/
cron.monthly/ makedev.d/ scl/
crontab man.config securetty
cron.weekly/ maven/ security/
crypttab mc/ selinux/
csh.cshrc mime.types services
csh.login mke2fs.conf sestatus.conf
cups/ modprobe.d/ setuptool.d/
62
dbus-1/ motd sgml/
default/ mtab shadow
depmod.d/ mtools.conf shadow-
dhcp/ my.cnf shells
DIR_COLORS named/ skel/
DIR_COLORS.256color named.conf smart/
DIR_COLORS.lightbgcolor named.iscdlv.key smartd.conf
dnsmasq.conf named.rfc1912.zones sos.conf
dnsmasq.d/ named.root.key sound/
dracut.conf nanorc ssh/
dracut.conf.d/ netconfig ssl/
drirc NetworkManager/ sssd/
enscript.cfg networks statetab
environment nfsmount.conf statetab.d/
ethers nsswitch.conf subversion/
event.d/ ntp/ sudo.conf
exports ntp.conf sudoers
favicon.png@ obex-data-server/ sudoers.d/
festival/ oddjob/ sudo-ldap.conf
filesystems oddjobd.conf sysconfig/
fonts/ oddjobd.conf.d/ sysctl.conf
foomatic/ openldap/ system-release@
fprintd.conf opt/ system-release-cpe
fstab PackageKit/ terminfo/
gai.conf pam.d/ tpvmlp.conf
gconf/ pango/ Trolltech.conf
gcrypt/ passwd udev/
gdm/ passwd- updatedb.conf
ghostscript/ pbm2ppa.conf vimrc
gnome-vfs-2.0/ pcmcia/ virc
gnupg/ pinforc vmware-tools/
group pkcs11/ vsftpd/
group- pki/ warnquota.conf
grub.conf@ plymouth/ wgetrc
gshadow pm/ wpa_supplicant/
gshadow- pm-utils-hd-apm-restore.conf X11/
gssapi_mech.conf pnm2ppa.conf xdg/
gtk-2.0/ polkit-1/ xinetd.d/
hal/ popt.d/ xml/
host.conf portreserve/ yp.conf
hosts postfix/ yum/
hosts.allow ppp/ yum.conf
hosts.deny prelink.cache yum.repos.d/
hp/ prelink.conf
httpd/ prelink.conf.d/

Рассмотрим некоторые конфигурационные файлы и директории:


• anacrontab — конфигурационный файл для планировщика заданий anacron.
В этом файле задаются периодичность выполнения команд (ежедневно, ежене-
дельно, ежемесячно) и директории, в которых содержатся скрипты.
• /cron.d — конфигурация демона планировщика заданий cron;
• /cron.daily — ежедневно выполняемые операции cron и anacron;
• /cron.hourly — ежечасно выполняемые операции cron и anacron;
• /cron.monthly — ежемесячно выполняемые операции cron и anacron;
• /cron.weekly — еженедельно выполняемые операции cron и anacron;
• /default — конфигурационные файлы, используемые утилитой shadow при
создании новой учётной записи пользователя в системе;
• /kde — файлы конфигурации графической оболочки KDE и её приложений;
• exports — конфигурационный файл файловой системы NFS, управление ре-
сурсами и доступом к ним;
63
• /rc.d — директория содержит скрипты процесса init используемые при ини-
циализации системы, а корне директории /etc находятся файлы символических
ссылок на директории соответствующего уровня выполнения:
o rc -> rc.d/rc - файл для запуска и останова сервисов при переходе на указан-
ный уровень выполнения;
o rc0.d->rc.d/rc0.d - ссылка на директорию со скриптами для нулевого уровня;
o rc1.d->rc.d/rc1.d - ссылка на директорию со скриптами для первого уровня;
o rc2.d->rc.d/rc2.d - ссылка на директорию со скриптами для второго уровня;
o rc3.d->rc.d/rc3.d - ссылка на директорию со скриптами для третьего уровня;
o rc4.d->rc.d/rc4.d - ссылка на директорию со скриптами для четвёртого уровня;
o rc5.d -> rc.d/rc5.d - ссылка на директорию со скриптами для пятого уровня;
o rc6.d -> rc.d/rc6.d - ссылка на директорию со скриптами для шестого уровня;
• init.d -> rc.d/init.d – ссылка на директорию со скриптами для загружаемых
при старте операционной системы сервисов;
• inittab — конфигурационный файл для процесса init, в нем описывается, как
процесс init должен настроить операционную систему для соответствующего
уровня исполнения;
• issue — конфигурационный файл содержит сообщение, выдаваемое системой
до приглашения "login:";
• at.deny — файл содержит список пользователей, которым запрещена ко-
манда at;
• bashrc — конфигурационный файл оболочки CLI bash;
• fstab — файл содержит таблицу монтирования для VFS и FS, в которой опре-
делены монтируемые устройства, соответствующие им точки монтирования,
тип файловой системы и параметры монтирования;
• mtab — файл содержит динамическую информацию о смонтированных фай-
ловых системах;
• motd — файл содержит сообщение, выдаваемое системой после входа поль-
зователя в систему;
• networks — файл содержит статическую информацию о сетевых именах;
• centos-release – файл содержит информацию о наименовании дистрибутива
Linux и его версии. Файлы system-release -> centos-release и redhat-release ->
centos-release имеют символические ссылки на него.
• passwd — файл содержит информацию обо всех пользователях системы,
включая виртуальных (псевдопользователях).
• shadow — файл паролей, по структуре напоминающий passwd. Содержит
полный список пользователей системы.
• yum.conf – файл конфигурации менеджера программного обеспечения yum.
• localtime – неисполняемый бинарный файл конфигурации текущего часо-
вого пояса.

6.2. Конфигурационные файлы в директории /etc/sysconfig.


Директория /etc/sysconfig содержит различные конфигурационные
файлы и конфигурационные скрипты, необходимые операционной системе
для корректной настройки работы с оборудованием компьютерной системы, а
так же управления сервисами, связанными с ним. Насыщенность директории
64
файлами зависит от дистрибутива операционной системы Linux, и для Cen-
tOS/RHEL 6.7 примерно будет таким:
[root@test3 sysconfig]# ls -F
atd htcacheclean named rngd
auditd httpd netconsole rsyslog
authconfig i18n network samba
autofs init networking/ sandbox
cbq/ ip6tables network-scripts/ saslauthd
clock ip6tables-config nfs selinux@
console/ ip6tables.old nspluginwrapper smartmontools
cpuspeed iptables ntpd sshd
crond iptables-config ntpdate sysstat
dhcpd iptables.old prelink sysstat.ioconf
dhcpd6 irqbalance quota_nld system-config-firewall
dhcrelay kdump raid-check system-config-firewall.old
dhcrelay6 kernel readahead system-config-users
firstboot keyboard readonly-root udev
grub modules/ rhn/ wpa_supplicant
Рассмотрим конфигурационные файлы и директории:
• atd – конфигурационный файл демона управления заданиями atd;
• auditd – конфигурационный файл демона auditd, прикладного компо-
нента системы аудита Linux. Запись протокола аудита осуществляется на
диск. Для просмотра протоколов предназначены команды
ausearch и aureport.
• authconfig – конфигурационный файл демона authconfig управления
аутентификацией пользователей в системе, для графического режима
authconfig-gtk (system-config-authentication), для тестового – authconfig-
tui.
• autofs – конфигурационный файл демона automount сервиса autofs
предназначенный для управления точками подключения файловых си-
стем, подключая их только по мере обращения. Сервис autofs анализи-
рует главный файл соответствий /etc/auto.master для определения точек
подключения. Затем запускается процесс автоматического подключения
каждой точки с указанными параметрами.
• cbq/ - директория конфигурационный файлов утилиты cbq (так называ-
емого трафик-шейпера). Принцип действия — искусственно ограничи-
вает полосу пропускания сетевого устройства с заданной шириной канала;
• clock – конфигурационный файл настроек системных (аппаратных) часов
(временная зона, формат хранения времени, переход на летнее/зимнее
время и т. п.);
• console/ – директория конфигурационных файлов консоли;
• cpuspeed – конфигурационный файл демон cpuspeed, который позволяет
изменять скорость работы центрального процессора с целью снижения
энергопотребления;
• crond – конфигурационный файл демона cron, управляющего автомати-
ческим запуском задач по расписанию;

65
• dhcpd – файл конфигурации демона dhcp сервера для протокола IPv4
(параметры запуска для CLI);
• dhcpd6 – файл конфигурации демона dhcp сервера для протокола IPv6
(параметры запуска для CLI);
• dhcrelay – файл конфигурации демона dhcrelay, агента ретрансляции
протокола DHCP для IPv4;
• dhcrelay6 – файл конфигурации демона dhcrelay, агента ретрансляции
протокола DHCP для IPv6;
• firstboot – файл конфигурации утилиты firstboot, управления первона-
чальной настройки дистрибутива RHEL/CentOS;
• grub – файл конфигурации менеджера загрузок grub;
• htcacheclean – файл конфигурации демона htcacheclean, используется
для очистки кэша на диске;
• httpd – конфигурационный файл управляющего демона сервера apache, как
правило, используется для управления модулями apache, включая мультипро-
цессорные модули (MPM). Например, Apache MPM-ITK, это MPM к apache,
который, позволяет запуск каждого виртуального хоста под отдель-
ными uid и gid;
• i18n – конфигурационный файл локализации системы (настройки языка ввода
и отображения в консоли). Название расшифровывается как internationalization
(между i и n восемнадцать букв);
• init – конфигурационный файл демона init, управляющего загрузкой операци-
онной системы;
• ip6tables – файл конфигурации firewall пакета netfilter для протокола IPv6,
известного как сервис ip6tables;
• ip6tables-config – файл конфигурации демона iptables для протокола IPv6.
• ip6tables.old – файл конфигурации firewall хранящий предыдущую версию
конфигурации. Как правило, создаётся, при внесении изменении в правила
ip6tables, используется для возврата к предыдущим настройкам в случае сбоев
в работе;
• iptables – файл конфигурации firewall пакета netfilter для протокола Ipv4, из-
вестного как сервис iptables;
• iptables-config – файл конфигурации демона iptables для протокола Ipv4.
• iptables.old – файл конфигурации firewall хранящий предыдущую версию
конфигурации. Как правило, создаётся, при внесении изменении в правила
ip6tables, используется для возврата к предыдущим настройкам в случае сбоев
в работе;
• irqbalance – конфигурационный файл демона irqbalance, используется в Linux,
для управления распределением аппаратных прерываний между процессорами
и ядрами системы (как правило, используется в multi-процессорных архитекту-
рах);
• kdump – конфигурационный файл демона kdump, управляющего сбором дам-
пов ядра системы в случае сбоя;
• kernel – конфигурационный файл ядра системы, используется для управления
пакетами ядра системы (включая обновление);
• keyboard – конфигурационный файл настроек работы с клавиатурой;
• modules/ – директория содержит скрипты или конфигурационные файлы мо-
дулей ядра;
66
• named – конфигурационный файл демона named, управляющего демона DNS
BIND;
• netconsole – конфигурационный файл модуля ядра netconsole, он позволяет
экспортировать консоль на другую машину по сети, что полезно для отладки
ситуации зависания Linux без вывода диагностики в лог и на экран (сообщения
ядра dmesg).
• network – общий конфигурационный файл сетевого окружения системы, как
правило, содержит запись имени хоста и другие параметры сетевого окружения;
• networking/ – в этой директории находятся конфигурационные файлы
устройств и профилей сетевого окружения;
• network-scripts/ – в этой директории находятся конфигурационные файлы и
управляющие скрипты для сетевых интерфейсов;
• nfs – конфигурационный файл сетевой файловой системы – NFS;
• nspluginwrapper – конфигурационный файл плагина flash для браузера www,
например firefox;
• ntpd – конфигурационный файл демона ntpd сервера NTP;
• ntpdate – конфигурационный файл демона ntpdate клиента NTP;
• prelink – конфигурационный файл демона prelink, управляющая связями биб-
лиотек и исполняемыми файлами, для ускорения их загрузки и запуска;
• quota_nld – конфигурационный файл демона quota, управляющего дисковыми
квотами;
• raid-check – скрипт проверки raid-массива для утилиты raid-check;
• readahead – конфигурационный файл демона readahead, осуществляющего
упреждающее чтение одной или нескольких страниц файла в кэш страниц;
• readonly-root – файл конфигурации монтирования файловой системы в ре-
жиме read-only;
• rhn/ – в данной директории находятся конфигурационные файлы для дистри-
бутива RHEL/CentOS, в частности текстовые файлы для работы с репозитори-
ями;
• rngd – конфигурационный файл демона rngd, предоставляющий интерфейс к
аппаратному генератору случайных чисел;
• rsyslog – файл конфигурации демона rsyslog, управляющего сбором ло-
гов в системе;
• samba – файл конфигурации samba, пакета программ поддержки подключе-
ний к сетевым ресурсам различных операционных систем по прото-
колу SMB/CIFS;
• sandbox – настройка параметров запуска cmd через sandbox (песочницу) SEL-
inux, реализуется политика безопасного запуска командного процессора (более
подробно на: sandbox.sourceforge.net);
• saslauthd – конфигурационный файл демона saslauthd, реализующий под-
держку технологии аутентификации SASL (Simple Authentication and Security
Layer), которая определяет общий метод добавления поддержки аутентифика-
ции к протоколам, ориентированным на соединение (POP3, IMAP4, SMTP, FTP,
telnet, ACAP, LDAPv3);
• selinux@ – символическая ссылка на файл конфигурации SELinux
/etc/selinux/config;
• smartmontools – конфигурационный файл демона smartd, управляющего мо-
ниторингом состояния жёстких дисков по технологии SMART;

67
• sshd – конфигурационный файл демона sshd, осуществляющего поддержку
протокола SSH (Secure Shell);
• sysstat – конфигурационный файл утилит входящей в пакет программ sysstat
(iostat, isag, mpstat, pidstat, sa1, sa2, sadc, sadf и sar) используемый для монито-
ринга и сбора статистики работы системы;
• sysstat.ioconf – конфигурационный файл утилиты iostat, которая собирает
статистику использования процессора и потоков ввода/вывода устройств и раз-
делов;
• system-config-firewall – конфигурационный файл утилиты system-config-fire-
wall;
• system-config-firewall.old – конфигурационный файл утилиты system-config-
firewall;
• system-config-users – конфигурационный файл утилиты system-config-users;
• udev – конфигурационный файл демона udevd, менеджера VFS udev;
• wpa_supplicant – конфигурационный файл утилиты wpa_supplicant, ко-
торая является реализацией компонента IEEE 802.1X/WPA Supplicant. Он реа-
лизует согласование ключей шифрования с аутентификатором WPA (WPA
Authenticator), аутентификацию EAP с сервером аутентификации
(Authentication Server), а также управляет роумингом и выполняет сопряжение
адаптера с беспроводной сетью. Используется для настройки беспроводного
подключения.
Как видно из описания конфигурационных файлов в директории
/etc/sysconfig, большинство из них относиться непосредственно к демо-
нам сервисов, работающим в операционной системе, при этом их пользо-
вательские конфигурации находятся в самой директории /etc. Следует от-
метить, что в большинстве дистрибутивов операционной системы Linux,
размещение конфигурационных файлов в директории /etc, обуславлива-
ется разработчиком конкретного дистрибутива и типом программного
обеспечения устанавливаемого в систему.

6.3. Назначение директорий /opt и /etc/opt.


Директория /opt предусмотрена стандартом FHS, но реально использу-
ется не во всех дистрибутивах Linux, а в BSD-системах и вовсе отсутствует.
Тем не менее, все больше программ пишется в расчёте на установку по умол-
чанию именно в него.
Исторически каталог /opt предназначался в Linux для коммерческих
приложений и программ не вполне свободного характера (имеющих ограни-
ченную лицензию или ограниченный функционал). В настоящее время его
назначение размещение больших самодостаточных программных пакетов, та-
ких, как библиотека Qt, OpenOffice и других программных продуктов, при
этом привязка к конкретному пользователю может и не осуществляться.
Отдельно стоит отметить, что в зависимости от типа дистрибутива Linux,
в директорию /opt, возможно установка системного программного обеспече-
ния, например, графических оболочек KDE, GNOME и др.

68
Программный продукт, который устанавливается в каталог /opt, должен
хранить свои не изменяемые файлы в каталоге /opt/<package_name>, где
<package_name> — имя устанавливаемого пакета.
Структура поддерева каталогов в каталоге /opt/<package_name>: /bin; /doc;
/lib; /man и т. д. Исполняемые модули нужно размещать в директории /bin, а если
пакет включает в себя документацию, ее следует сохранить в каталоге /doc. При
наличии страниц справочной системы надо разместить их в
/opt/<package_name>/man и использовать подструктуру каталогов, как в
/usr/share/man. Специфичные для конкретного пакета библиотеки размещают в
/opt<package_name>/lib и т. д. Файлы пакета, которые могут изменяться, должны
быть установлены в каталоге /var/opt, а файлы конфигурации должны находиться в
директории — в /etc/opt.
Однако разработчик программного обеспечения в праве, менять структуру ди-
ректориев и создавать свою собственную не придерживаясь стандарта FHS.
Рассмотрим, пример на базе программного пакета Apache OpenOffice в ди-
ректорию /opt:
[root@test3 opt]# ls -a1F
../
openoffice4/
rh/
[root@test3 opt]# cd openoffice4
[root@test3 openoffice4]# ls -a1F
./
../
help/
presets/
program/
README
README.html
readmes/
share/
Как видно из листинга программный пакет был установлен в директо-
рию /opt/openoffice4/, однако, разработчик создал собственную структуру ди-
ректориев для него.

6.4. Базовая настройка операционной системы Linux.


К первоначальной базовой настройке операционной системы относится:
настройка часового пояса и системных часов;
настройка локализации консоли;
настройка раскладки клавиатуры и переключения языка ввода, если это необ-
ходимо.
6.4.1. Настройка часового пояса и системного времени.
Первым шагом базовой настройке операционной системы является правиль-
ная настройка часового пояса и системных часов. Что бы все сервисы могли работать
корректно, а синхронизация работы процессов происходило без сбоев необходимо
всегда иметь правильно настроенное системное время. Время понятие относитель-
ное, но для операционной системы оно имеет первостепенное значение. Настройку

69
часового пояса и системных часов в дистрибутивах RHEL/CentOS можно выполнить,
используя графическую оболочку или из командной строки терминала.
Для настройки в графическом режиме используется утилита system-config-
date:

Настройка в командной строке терминала, основные файлы:


/etc/localtime - неисполняемый бинарный файл текущего часового пояса;
/etc/sysconfig/clock – конфигурационный файл системных (аппаратных) часов.
Файл настройки системных часов /etc/sysconfig/clock, основные параметры и
переменные:
UTC=<value>, где <value> может принимать следующие значения:
true или yes — системные часы устанавливаются по Universal Time;
false или no — системные часы устанавливаются по локальному времени
(local time);
ARC=<value>, где <value> принимает значение:
false или no — использовать нормальную эпоху UNIX (формат совместимы с
UNIX). Для Red Hat Enterprise Linux другие значения этой переменной не поддержи-
ваются;
SRM=<value>, where <value> принимает значение:
false или no — использовать нормальную эпоху UNIX (формат совместимы с
UNIX). Для Red Hat Enterprise Linux другие значения этой переменной не поддержи-
ваются.
ZONE=<filename> — неисполняемый бинарный файл временной зоны, база
файлов временных зон находится в директории /usr/share/zoneinfo, текущий файл
для заданной зоны с именем «localtime» находится в директории /etc. Для записи
названия зоны используется текстовая переменная вида:
ZONE="America/New York", где America – название директории с времен-
ными зонами для выбранного континента или страны, New York – название фала
ассоциируемого с названием города в этой директории.
Для ранних релизов Red Hat Enterprise Linux (4 и ниже) использовалась еще
одна переменная:
CLOCKMODE=<value>, where <value> is one of the following:

70
GMT — тип часов устанавливался в формате Universal Time (Greenwich Mean
Time);
ARC — тип часов устанавливался как the ARC console's 42-year time offset is
in effect (for Alpha-based systems only).
Для дистрибутива RHEL/CentOS 6.7, в файле /etc/sysconfig/clock, факти-
чески содержится только одна строка переменная устанавливающая тип теку-
щей временной зоны:
# The time zone of the system is defined by the contents of /etc/localtime.
# This file is only for evaluation by system-config-date, do not rely on its
# contents elsewhere.
ZONE="Europe/Minsk"
Переменная UTC используется только в редких случаях, когда необхо-
димо синхронизировать часы по аппаратным часа компьютера (например, в
случае если это сервер точного времени).
При установке ОС RHEL/CentOS неисполняемый бинарный файл теку-
щей временной зоны (часового пояса) создаётся как копия файла из необходи-
мой поддиректории /usr/share/zoneinfo:
[root@test3 zoneinfo]# ls -F
Africa/ Chile/ GB Indian/ MST PRC
UTC
America/ CST6CDT GB-Eire Iran MST7MDT PST8PDT
WET
Antarctica/ Cuba GMT iso3166.tab Navajo right/
W-SU
Arctic/ EET GMT0 Israel NZ ROC
zone.tab
Asia/ Egypt GMT-0 Jamaica NZ-CHAT ROK
Zulu
Atlantic/ Eire GMT+0 Japan Pacific/ Singapore
Australia/ EST Greenwich Kwajalein Poland Turkey
Brazil/ EST5EDT Hongkong Libya Portugal UCT
Canada/ Etc/ HST MET posix/ Universal
CET Europe/ Iceland Mexico/ posixrules US/
При этом в случае если необходимо произвести его замену, скопировать файл
придётся заново в ручном режиме. Такой подход является не самым правильным,
поэтому рекомендуется создать символическую ссылку на нужный файл, что бы в
случае необходимого обновления в директории /etc находился правильный файл, для
этого достаточно выполнить следующую команду:
[root@test3 tzdata]#ln -sf --suffix=.bak /usr/share/zoneinfo/Europe/Minsk
/etc/localtime
Итогом ее выполнения будет:
[root@test3 tzdata]#ls -Al /etc | grep localtime
lrwxrwxrwx. 1 root root 32 Окт 23 13:48 localtime -> /usr/share/zoneinfo/Eu-
rope/Minsk
-rw-r--r--. 1 root root 1342 Июн 19 04:50 localtime.bak
Таким образом, будет создана резервная копия файла текущего часового пояса
localtime.bak, и будет создан файл localtime как символическая ссылка на необходи-
мый файл в директории базы данных часовых поясов.

71
После этого, в случае обновление системы или базы часовых поясов, и изме-
нении этого файла, он автоматически будет использоваться в системе, и ручное ко-
пирование производить не надо.
Команды управления настройкой аппаратных и системных часов:
Устанавливаем значение аппаратных часов равное системному времени:
# hwclock --systohc
Устанавливаем значение системных часов равное аппаратным часам:
# hwclock --hctosys
Устанавливаем время равное заданному:
# hwclock --set --date "25 Oct 2015 09:50"
Более подробно протокол NTP и его настройки будут рассмотрены в че-
тырнадцатом разделе этого методического пособия.
6.4.2. Настройка таблицы кодировки консоли и раскладки клавиа-
туры.
Настройка таблицы кодировок консоли и файловой системы в Linux.
Полное описание переменных используемых при настройке локали:
https://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Locale-
Categories.html
Использование утилиты locale. Получить текущие настройки:
[root@test3 Загрузки]# locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
Получение списка доступных кодировок:
[root@test3 Загрузки]# locale -a |more
aa_DJ
aa_DJ.iso88591
aa_DJ.utf8
aa_ER
aa_ER@saaho
aa_ER.utf8
aa_ER.utf8@saaho
aa_ET
aa_ET.utf8
af_ZA
af_ZA.iso88591
af_ZA.utf8
72
am_ET
ar_BH.iso88596
ar_BH.utf8
Просмотр списка кодировок с поддержкой русского языка:
[root@test3 Загрузки]# locale -a |grep ru
ru_RU
ru_RU.iso88595
ru_RU.koi8r
ru_RU.utf8
russian
ru_UA
ru_UA.koi8u
ru_UA.utf8
Для компиляции нужной кодировки используется утилита localedef, а в каче-
стве параметров используются следующие опции:
-f {charmapfile}, --charmap={charmapfile}. Определяет файл, в котором содер-
жится таблица преобразований символов, используемая файлом ввода (используется
совместно с ключом –i). Если файл находится в директории по умолчанию для таб-
лиц преобразований символов, то можно не указывать его полное имя. Директорию
по умолчанию можно посмотреть командой localedef --help.
-i {inputfile}, --inputfile={inputfile}. Указывает на файл определений локали
для компиляции. Если {inputfile} не является абсолютным, то localedef будет искать
файлы определения локали в каталоге, определенном переменной окруже-
ния I18NPATH и в директории по умолчанию. Директорию по умолчанию можно
посмотреть командой localedef --help.
-c, --force. Записывает данные в файл вывода, даже если выдавались преду-
преждения о некорректном файле ввода.
-v, --verbose. Выдавать дополнительные предупреждения об ошибках, игно-
рируемые в простом режиме.
--quiet. Подавлять все сообщения и предупреждения, выдавать сообщения
только о серьезных ошибках.
--posix. Работать строго в формате POSIX. Автоматически включает пара-
метр –verbose. Этот параметр в данный момент не имеет других эффектов. Совме-
стимость с Posix предполагает наличие переменной окруже-
ния POSIXLY_CORRECT.
-u {codeset}, --code-set-name={codeset}. Данный параметр воспринимается,
но игнорируется.
-h, --help. Выдать справку об использовании и выйти. Также выдает каталог,
используемый по умолчанию localedef.
-V, --version. Выдает номер версии, лицензию, и предупреждение об ответ-
ственности для localedef.
Утилита localedef использует следующие директории по умолчанию:
character maps : /usr/share/i18n/charmaps
repertoire maps: /usr/share/i18n/repertoiremaps
locale path : /usr/lib/locale и /usr/share/i18n
Компиляция кодировки UTF8 с поддержкой русского языка:
#localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
#export LC_ALL="ru_RU.UTF-8" или #export LANG=ru_RU.UTF-8
После экспорта кодировки необходимо отредактировать конфигураци-
онный файл /etc/sysconfig/i18n, который должен содержать следующие строки:
73
LANG="ru_RU.UTF-8"
SYSFONT="latarcyrheb-sun16"
Если необходимо установить кодировку cp1251:
#localedef -c -i ru_RU -f CP1251 ru_RU.CP1251
#export LC_ALL="ru_RU.CP1251" или #export LANG=ru_RU.CP1251
После экспорта кодировки необходимо отредактировать конфигураци-
онный файл /etc/sysconfig/i18n, который должен содержать следующие строки:
LANG="ru_RU.CP1251"
SYSFONT="latarcyrheb-sun16"
Первый вариант настройки раскладки клавиатуры для консоли необхо-
димо выбрать нужный файл с расширением .map в директории
/lib/kbd/keymaps и внести изменения в файл /etc/sysconfig/ keyboard:
KEYTABLE="/lib/kbd/keymaps/{name}.map", где {name}.map - файл рас-
кладки клавиатуры;
Второй вариант настройки раскладки клавиатуры для консоли для этого
необходимо отредактировать файл /etc/sysconfig/keyboard внеся в него следу-
ющие изменения:
KEYTABLE="ru"
MODEL="pc105+inet"
LAYOUT="us,ru"
KEYBOARDTYPE="pc"
Загружаемые раскладки лежат в /lib/kbd/keymaps в одной из директо-
рии в зависимости от платформы и типа клавиатуры.
Для настройки скорости повтора нажатия и времени задержки необхо-
димо добавить в файл следующую строку в файл /etc/rc.d/rc.sysinitt:
/sbin/kbdrate -s –r 16 –d 500 — где –r 16 — число символов, а –d 500 — задержка
в миллисекундах.
Так же для изменения языка в системе и раскладки клавиатуры можно
использовать следующие утилиты:
Чтобы изменить язык в системе:
# system-config-language
Что бы изменить раскладку клавиатуры:
# system-config-keyboard
Если этих утилит нет в системе, то их можно установить:
# yum install system-config-language
# yum install system-config-keyboard
Если необходимо вернуть кодировку UTF8 c поддержкой английского
языка по умолчанию в консоль:
# localedef -i en_US -f UTF-8 en_US.UTF-8
# export LC_ALL="en_US.UTF-8"
Далее редактируем файл /etc/sysconfig/i18n:
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
Для проверки правильности выполненных действий можно воспользо-
ваться утилитами: system-config-language и system-config-keyboard.

74
Немаловажное замечание, часто в файлах раскладки клавиатуры (файлы
с расширением .map) комбинация клавиш для переключения раскладки может
быть не задана или ее необходимо изменить. Для этого необходимо внести из-
менения в файл раскладки клавиатуры {name}.map ({name} имя нужного
файла), изменив или добавив секцию AltGr_Lock (для переключения
Shift+Ctrl):
shift keycode 29 = AltGr_Lock
altgr shift keycode 29 = AltGr_Lock
control keycode 42 = AltGr_Lock
altgr control keycode 42 = AltGr_Lock
control keycode 54 = AltGr_Lock
altgr control keycode 54 = AltGr_Lock
shift keycode 97 = AltGr_Lock
altgr shift keycode 97 = AltGr_Lock
Необходимые пояснения:
Если в строке фигурирует «control» (т.е. строка отвечает за комбинацию
Ctrl+Shift именно в таком порядке), то просто меняете «control» на «alt».
Если в строке фигурирует «shift» (т.е. строка отвечает за комбинацию
Shift+Ctrl именно в таком порядке), то измените код клавиши:
29 (left-control) на 56 (left-alt) и 97 (right-control) на 100 (right-alt).
Когда изменяете код клавиши, перемещайте исправленные строки туда, где распо-
ложены записи для нового значения кода.
После внесения изменений в файл {name}.map, необходимо отредакти-
ровать файл /etc/sysconfig/keyboard добавив в него строку с именем нужно
файла:
KEYTABLE="{path}/{name}.map", где {name}.map - имя файла раскладки
клавиатуры, {path} – директория, где он находиться.
Еще одно замечание отредактированный файл раскладки клавиатуры
лучше скопировать в директорию /etc/sysconfig/console/ и в качестве пути к
нему указывать эту директорию, так же при внесении изменений рекомендо-
вано делать поясняющие комментарии.

75
Глава 7. Конфигурирование интерфейсов с помощью NetworkMan-
ager.
NetworkManager - это программный пакет средств для администрирова-
ния и конфигурирования сетевых интерфейсов, облегчающий определение и
конфигурацию средств для автоматического подключения к сети. Функционал
NetworkManager полезен как для беспроводных, так и проводных сетей. Для
подключения к беспроводным сетям, NetworkManager отдаёт предпочтение
ранее известным сетям и обеспечивает переключение на наиболее стабильную
сеть, но при их наличии, отдаёт предпочтение проводным сетям. Также под-
держиваются подключения с использованием модема, и некоторые типы VPN.
NetworkManager был разработан Red Hat, и в настоящее время содержится
проектом GNOME.
В мае 2017 года был представлен новый стабильный релиз
NetworkManager версии 1.8. Вместе с новой версией был выпущен апплет ре-
ализующий индикатор для панели GNOME, при этом, однако, плагины для
поддержки VPN, OpenConnect, PPTP, OpenVPN и OpenSWAN развиваются в
рамках собственных циклов разработки.
Ключевые изменения в новом релизе NetworkManager версии 1.8:
Изменена логика восстановления состояния после перезапуска фонового
процесса NetworkManager. Перед остановкой NetworkManager теперь сохра-
няет в файл текущее состояние сетевых настроек и восстанавливает его после
перезапуска. Указанный подход позволяет избавиться от неопределённости с
восстановлением настроек во время перезапуска - просто восстановить опре-
делённые в файлах конфигурации настройки недостаточно, так как в этом слу-
чае потеряются ручные изменения. Восстановление на основе слепка актив-
ных сетевых подключений позволяет сохранить состояние в неизменном виде;
Улучшены средства мониторинга сетевой доступности. Для определе-
ния проброса на страницы аутентификации (captive portal) при подключении к
беспроводной сети, NetworkManager периодически проверяет доступность
предопределённой внешней web-страницы. Ранее подобная проверка выпол-
нялась, используя оптимальный маршрут по умолчанию. В новом выпуске
проверка повторятся для всех сетевых подключений, для которых выставлен
маршрут по умолчанию. В случае, если выявлено нерабочее подключение или
проброс на captive portal, но существует другое рабочее соединение, метрика
в таблице маршрутизации будет изменена для направления трафика по умол-
чанию через данное рабочее соединение. Кроме того, для отправки провероч-
ных запросов теперь вместо libsoup применяется библиотека libcurl, что поз-
волило сократить число зависимостей;
Расширены возможности интерфейса командной строки nmcli: вывод
адаптирован для упрощения автоматизированного разбора в скриптах, расши-
рены средства обработки ошибок;
Добавлена возможность настройки атрибутов для статических маршру-
тов;
Реализована защищённая обработка PIN-кодов для токенов PKCS#11;
Обеспечено корректное выставление MTU для соединений через GSM и
CDMA;
76
Из зависимостей удалена библиотека libgudev;
Расширены средства для управления обновлением имени хоста;
В файл конфигурации NetworkManager.conf добавлена опция "driver:"
для выборки сетевых устройств по имени драйвера;
Добавлена поддержка создания и управления dummy-интерфейсами;
Для teaming-устройств, создаваемых для распараллеливания трафика че-
рез несколько ethernet-адаптеров, обеспечена возможность явного определе-
ния MAC-адреса в настройках;
Обеспечена возможность изменения настроек агрегированных сетевых
интерфейсов (bonding) на лету, без перезапуска соединения;
Реализована возможность добавления в профили соединений пользова-
тельских данных в формате ключ/значение;
Возможность настройки таймаута аутентификации 802.1x для ускорения
отката на другие соединения;
Улучшена поддержка виртуальных сетевых устройств (SR-IOV).
В зависимости от версии дистрибутива RHEL/CentOS может использо-
ваться различные версии пакета NetworkManager. Однако, в RHEL/CentOS 7
пакет NetworkManager интегрирован с системным менеджером управления за-
грузки системы systemd, и по умолчанию является основным пакетом для
управления сетевым окружением.
7.1. Использование NetworkManager в RHEL/CentOS 6.
В состав дистрибутива RHEL/CentOS версии 6 по умолчанию входит па-
кет программ NetworkManager версии 0.8.1, включающий в себя необходимый
набор инструментов для управления сетевыми интерфейсами, как с помощью
графической оболочки, так и командной строки, используя пакет nmcli. В со-
став данного пакета входят следующие утилиты nm-tool, nmcli, nm-online,
nm-connection-editor и nm-applet.
Краткое руководство по данному пакету можно получить на официаль-
ном портале RadHat:
https://access.redhat.com/documentation/en-US/Red_Hat_Enter-
prise_Linux/6/html/Deployment_Guide/ch-NetworkManager.html
Утилита nm-tool используется для получения различных сведений об,
устройствах и беспроводных сетях управляемых с помощью NetwokManager.
NAME
nm-tool - utility to report NetworkManager state and devices.
Утилита nmcli позволяет использовать Network Manager в окружении
консоли.
NAME
nmcli - command-line tool for controlling NetworkManager

SYNOPSIS
nmcli [ OPTIONS ] OBJECT { COMMAND | help }

OBJECT := { nm | con | dev }

OPTIONS := {
-t[erse]
-p[retty]
77
-m[mode] tabular | multiline
-f[ields] <field1,field2,...> | all | common
-e[scape] yes | no
-v[ersion]
-h[elp]
}
DESCRIPTION
nmcli is a command-line tool for controlling NetworkManager and getting
its status. It is not meant as a replacement of nm-applet or other
Где:
OPTIONS: может принимать значения -t (вывод информации в сжатом
виде) или -p (вывод информации с форматированием).
OBJECT: может принимать значения nm (статус NetworkManager), con
(соединения NetworkManager) или dev (устройства под управлением Network-
Manager).
COMMAND: действие над OBJECT, в зависимости от типа объекта для
него предусмотрен свой набор команд более подробно можно узнать исполь-
зуя ключ help.
Утилита nm-online позволяет узнать статус подключения к сети, данная
утилита запрашивает состояние у NetworkManager и возвращает и по заверше-
нию возвращает статус (0, 1 или 2).
NAME
nm-online - ask NetworkManager whether the network is connected
SYNOPSIS
nm-online [ OPTIONS ]
DESCRIPTION
nm-online is a utility to find out whether we are online. It is done by
asking NetworkManager about its status. When run, nm-online waits until
NetworkManager reports an active connection, or specified timeout
expires. On exit, the returned status code should be checked (see the
return codes bellow).
С помощью утилиты nm-connection-editor осуществляется управление
сетевыми подключениями в NetworkManager (запускает графическое прило-
жение при запуске без опций).
NAME
nm-connection-editor - network connection editor for NetworkManager
SYNOPSIS
nm-connection-editor [ OPTIONS ]
DESCRIPTION
nm-connection-editor is a GTK-based application to add, remove, and
modify network connections stored by NetworkManager. NetworkManager
must be running for any network connections to be added, removed, or
modified.
78
С помощью утилиты nm-applet осуществляется управление и монито-
ринг работы графического приложения NetworkManager.
NAME
nm-applet - network monitor and control GUI applet
SYNOPSIS
nm-applet [ OPTIONS ]
DESCRIPTION
nm-applet is a GTK-based GUI applet to monitor network status and
devices and to start and stop network connections managed by Network-
Manager. nm-applet is normally started at login by the desktop session
manager and does not need to be run manually. nm-applet conforms to
the XDG System Tray specification and requires that the desktop envi-
ronment provide a System Tray implementation in which the applet will
be embedded.
Примеры использования графической оболочки NetworkManager в среде
RHEL/CentOS6.

79
80
Для создания и управления каналами VPN для NetworkManager исполь-
зуются различные плагины, более подробно об этом можно узнать на этой
странице:
https://wiki.gnome.org/Projects/NetworkManager/VPN
81
7.2. Использование NetworkManager в RHEL/CentOS 7.
В последней версии дистрибутива RHEL/CentOS 7 версия дистрибутива
7.4 (CentOS 1708) после обновления есть возможность использовать пакет Net-
wokManager версии 1.8 (ключевые изменения в этом пакете приведены выше).
Основным демоном является NetworkManageer.
# NetworkManager --help
Использование:
NetworkManager [ПАРАМЕТР…]

NetworkManager отслеживает все сетевые соединения и автоматически выбирает для исполь-


зования наиболее подходящее соединение. А также позволяет пользователю задать беспроводные
точки доступа, с которыми будут ассоциированы сетевые карты.

Параметры справки:
-h, --help Показать параметры справки

Параметры приложения:
-V, --version Показать версию NetworkManager и выйти
-n, --no-daemon Не использовать в качестве службы
--log-level=INFO Log level: one of [TRACE,DEBUG,INFO,WARN,ERR,OFF,KEEP]
--log-domains=PLATFORM,RFKILL,WIFI Log domains separated by ',': any combination of [DEAULT, PLA-
FORM,RFKILL,ETHER,WIFI,BT,MB,DHCP4,DHCP6,DHCP,PPP,WIFI_SCAN,IP4,IP6,IP,AUTOIP4,DNS,VPN,SHAR-
ING,SUPPLICANT,AGENTS,SETTINGS,SUSPEND,CORE,DEVICE,OLPC,INFINIBAND,FIRE-
WALL,ADSL,BOND,VLAN,BRIDGE,DBUS_PROPS,TEAM,CONCHECK,DCB,DISPATCH,AUDIT,SYS-
TEMD,VPN_PLUGIN,PROXY,ALL]
--g-fatal-warnings Сделать все предупреждения критическими
-p, --pid-file=/var/run/NetworkManager/NetworkManager.pid Укажите расположение PID файла
--run-from-build-dir Run from build directory
--print-config Показать настройки NetworkManager и выйти
--config=/etc/NetworkManager/NetworkManager.conf Расположение файла конфигурации
--config-dir=/etc/NetworkManager/conf.d Путь к каталогу конфигурации
--system-config-dir=/usr/lib/NetworkManager/conf.d Расположение каталога с системными
настройками
--intern-config=/var/lib/NetworkManager/NetworkManager-intern.conf Расположение внутреннего
файла конфигурации
--state-file=/var/lib/NetworkManager/NetworkManager.state Расположение файла состояния
--plugins=ifcfg-rh,ibft Список модулей (через запятую)
--configure-and-quit Выйти после исходной настройки
-d, --debug Не работать в режиме службы и не входить в stderr

В состав данной версии пакета кроме графической оболочки так же вхо-


дят утилиты для работы в консольном окружении:
nm-connection-editor – графическая утилита управления сетевым окру-
жением с помощью пакета NetworkManager;
nm-online – позволяет узнать статус подключения к сети;
nmcli – консольная утилита для управления сетевым окружением;
nmtui, nmtui-connect, nmtui-edit, nmtui-hostname – утилиты для кон-
фигурирования параметров сетевого окружения с помощью пакета Network-
Manager с использованием текстового интерфейса пользователя .
Утилита nmcli используется для управления сетевым окружением с по-
мощью пакета NetworkManager из консоли (данная утилита аналогична рас-
смотренной выше). В версии пакета 1.8 функционал данной утилиты был рас-
ширен новыми опциями.
# nmcli --help
Usage: nmcli [OPTIONS] OBJECT { COMMAND | help }

82
OPTIONS
-t[erse] terse output
-p[retty] pretty output
-m[ode] tabular|multiline output mode
-c[olors] auto|yes|no whether to use colors in output
-f[ields] <field1,field2,...>|all|common specify fields to output
-g[et-values] <field1,field2,...>|all|common shortcut for -m tabular -t -f
-e[scape] yes|no escape columns separators in values
-a[sk] ask for missing parameters
-s[how-secrets] allow displaying passwords
-w[ait] <seconds> set timeout waiting for finishing operations
-v[ersion] show program version
-h[elp] print this help

OBJECT
g[eneral] NetworkManager's general status and operations
n[etworking] overall networking control
r[adio] NetworkManager radio switches
c[onnection] NetworkManager's connections
d[evice] devices managed by NetworkManager
a[gent] NetworkManager secret agent or polkit agent
m[onitor] monitor NetworkManager changes
Примеры использования утилиты.
#nmcli -p n
========
Сеть
========
СЕТЬ
---------------------
включен
#nmcli -p c
=====================================
Профили соединений NetworkManager
=====================================
ИМЯ UUID ТИП УСТРОЙСТВО
-----------------------------------------------------------------------------------------------------------------------------------------------
enp0s3 826e51fd-a965-4321-bf7f-f358f8d3b869 802-3-ethernet enp0s3
virbr0 37a248cf-4642-4572-ac94-21d0895c0c72 bridge virbr0
Проводное соединение 1 c44766e9-1aa1-3084-b141-7d712f98e75a 802-3-ethernet enp0s8

#nmcli -v
утилита nmcli, версия 1.8.0-11.el7_4

Утилиты nmtui, nmtui-connect, nmtui-edit, nmtui-hostname исрользу-


ются для утравления сетевым окружением с помощью пакета NetworkManager
с использованием текстового пользовательского интерфейса в консоле. При-
меры использования данных утилит.
Утилита nmtui-hostname, используется для изменения имени узла.

83
Утилита nmtui-connect используется для управления текущими сете-
выми соединениями.

Утилита nmtui-edit, используется для изменения параметров сетевых


адаптеров доступных в системе, так же позволяет создавать новые соединения
и управлять ими.

84
Утилита nmtui, объединияет все три утилиты nmtui-connect, nmtui-edit,
nmtui-hostname в единый пользовательский интерфейс.

Примеры использования графической оболочки NetworkManager в среде


RHEL/CentOS7.

85
86
87
88
Глава 8. Редактор vi.
Работа с редактором vi
Текстовым редактором (text editor) называют программу, которая пред-
назначена для редактирования (составления и изменения) файлов, содержа-
щих только текст, например: письмо, программа на языке C, системный кон-
фигурационный файл. При том, что имеется много различных редакторов для
системы Linux, единственный, чьё присутствие будет гарантировано в любой
системе UNIX или Linux — это vi (visual editor). Редактор vi не является самым
простым в использовании, и его интерфейс не очень понятен сам по себе. Од-
нако ввиду своей распространённости, а отчасти и потому, что владение им в
некоторых ситуациях необходимо, ему посвящается внимание в этой книге.
Выбор текстового редактора обычно является вопросом индивидуаль-
ного вкуса. Многие пользователи предпочитают пышный, мощный и наделён-
ный подсказками редактор emacs. Этот редактор имеет больше функций, чем
любая другая программа в мире UNIX. К примеру, в редакторе emacs имеется
собственный встроенный диалект языка программирования LISP. Кроме того,
у этого редактора имеется множество расширений (одно из них═ — программа
искусственного интеллекта типа программы Eliza). Однако, поскольку сам ре-
дактор и файлы, которые его поддерживают, сравнительно велики, этот редак-
тор может не быть установлен на некоторых системах. Напротив, редактор vi
является небольшим и мощным, однако использовать его сложнее. Тем не ме-
нее, при знакомстве с редактором vi он в действительности оказывается очень
простым.
В этом разделе даётся лишь введение вvi мы будем обсуждать не все его
функции, а лишь нужные для того, чтобы начать работать в нем. Дополнитель-
ную информацию можно получить из экранной документации к команде vi.
Основные понятия
В любой момент при работе в редакторе vi вы находитесь в одном из
трёх режимов редактора: командный режим (command mode), режим ввода
(insert mode) и режим последней строки (last line mode).
При запуске редактора vi вы оказываетесь в командном режиме. В этом
режиме можно давать команды для редактирования файлов или перейти в дру-
гой режим. Например, вводя x в командном режиме мы удаляем символ, на
который указывает курсор. Клавиши-стрелки перемещают курсор по редакти-
руемому файлу. Как правило, команды, используемые в командном режиме,
состоят из одного или двух символов.
Основной ввод и редактирование текста осуществляется в режиме ввода.
При использовании редактора vi основное время, скорее всего, будет прово-
диться именно в этом режиме. Переход в режим ввода из командного режима
осуществляется командой i (от слова insert). Находясь в режиме ввода, можно
вводить текст в то место, куда указывает курсор. Выход из режима ввода в
командный режим осуществляется клавишей Esc.
Режим последней строки— это специальный режим, в котором редак-
тору даются сложные команды. При вводе этих команд они отображаются в
последней строке экрана (отсюда пошло название режима). Например, если
ввести в командном режиме команду:, то осуществится переход в режим
89
последней строки, и можно будет вводить такие команды, как wq (записать
файл и покинуть редактор vi) или q! (выйти из редактора vi без сохранения
изменений). В режиме последней строки обычно вводятся команды, название
которых состоит из нескольких символов. В этом режиме в последнюю строку
вводится команда, после чего нажимается клавиша Enter, и команда исполня-
ется.
Запуск редактора vi.
Наилучшим способом уяснить для себя все концепции редактора vi бу-
дет запустить его и отредактировать в нем некоторый файл. В приводимых
ниже «экранчиках» будет показано всего несколько строк текста, как будто
текстовый экран имеет по высоте всего 6 строк вместо 24. Синтаксис редак-
тора vi таков:
vi filename
где filename — имя файла, который надо редактировать.
Запустим редактор vi и создадим новый файл по имени test командой
/home/larry# vi test
На экране будет примерно следующая картинка:
_
~
~
~
~
~
"test" [New file]
Колонка символов ~ обозначает пустые строки, иначе говоря, указывает,
что мы находимся в конце файла. Символ _ обозначает курсор.
Ввод текста
Редактор vi сейчас находится в командном режиме. Нажмём клавишу i,
и редактор перейдёт в режим ввода текста. Теперь вводим, например, следую-
щий текст:
Now is the time for all good men to come to the meeting.
~
~
~
~
~
Введите любое количество строк, после каждой нажимая клавишу Enter.
Исправлять опечатки можно с помощью клавиши Backspace. Для выхода из
режима ввода и возвращения в командный режим нажмём клавишу Esc.
В командном режиме для движения по файлу можно использовать кла-
виши-стрелки. Если в файле всего одна строка, то при попытке нажать кла-
вишу со стрелкой вверх либо вниз редактор, возможно, будет подавать звуко-
вой сигнал.
Помимо команды i, есть ещё несколько способов вставить текст. Так,
команда a начинает вставлять текст после текущего положения курсора, а не
прямо в текущую. Например, приведём с помощью клавиш-стрелок курсор к
пробелу, разделяющему слова good и men:
90
Now is the time for all good men to come to the meeting.
~
~
~
~
~
Нажмём теперь клавишу a (редактор перейдёт в режим ввода) и введём
wo, после чего нажмём клавишу Esc и вернёмся в командный режим. На экране
будет следующее:
Now is the time for all good women to come to the meeting.
~
~
~
~
~
Для того, чтобы начать вводить текст со следующей строки, используем
команду o. Нажмём эту клавишу и введём одну-две строки текста:
Now is the time for all good women to come to the meeting.
Afterwards, we'll go out for pizza and beer.
~
~
~
~
Удаление текста
В командном режиме нажатие клавиши x удаляет символ, на который
указывает курсор. Если нажать клавишу x пять раз, то на экране останется:
Now is the time for all good women to come to the meeting.
Afterwards, we'll go out for pizza and
~
~
~
~
Теперь нажмём клавишу a и введём некоторый текст, после чего опять
нажмём клавишу Esc:
Now is the time for all good women to come to the meeting.
Afterwards, we'll go out for pizza and Diet Coke.
~
~
~
~
Можно удалять целые строки командой dd (т. е. нажав клавишу d два
раза подряд). Если курсор стоит на второй строке, и вы введёте команду dd, на
экране останется следующее:
Now is the time for all good women to come to the meeting.
~
~
~
~
~

91
Для того, чтобы удалить слово, на которое показывает курсор, можно
использовать команду dw. Подведите курсор к слову good и введите dw. Ре-
зультат будет следующим:
Now is the time for all women to come to the meeting.
~
~
~
~
~
Изменение текста
Отдельные части текста можно заменять на другие; для этого использу-
ется команда R. Подведите курсор к первому символу в слове meeting,
нажмите клавишу R и введите слово session.
Now is the time for all women to come to the session.
~
~
~
~
Действие команды R напоминает действие команд i и a, однако при ко-
манде R новый текст не вставляется, а стирает старый.
Команда r заменяет один символ, а именно тот, на который указывает
курсор. Например, подведём курсор к началу слова Now, введём команду r и
за ней букву C. На экране возникнет следующее:
Cow is the time for all women to come to the session.
~
~
~
~
С помощью команды ~ можно поменять регистр буквы, на которую ука-
зывает курсор (с верхнего на нижний и наоборот). Например, если подвести
курсор к букве o в слове Cow и нажимать клавишу ~, то в конце концов воз-
никнет:
COW IS THE TIME FOR ALL WOMEN TO COME TO THE SESSION.
Команды для движения курсора
Вы уже знаете, что передвигаться по экрану (и по документу) можно с
помощью клавиш-стрелок. В дополнение можно для движения курсора ис-
пользовать клавиши h, j, k и l. Они будут сдвигать курсор соответственно
влево, вниз, вверх и вправо. Этими командами можно воспользоваться, если
(по какой-нибудь причине) клавиши-стрелки действуют неправильно. Ко-
манда w перемещает курсор на начало следующего слова; команда b переме-
щает курсор на начало предыдущего слова.
Команда 0 (клавиша ноль) перемещает курсор на начало текущей строки,
а команда $ перемещает курсор в её конец.
При редактировании больших файлов вам, возможно, захочется «пере-
листывать» целые экраны вперёд (т. е. вниз) и назад (вверх); для этого исполь-
зуются команды соответственно Ctrl-F и Ctrl-B.
Для того, чтобы переместить курсор в конец файла, используется ко-
манда G. Можно также поместить курсор на строку с данным номером;
92
например, команда 10G поместит курсор на строку с номером 10. Для того,
чтобы переместить курсор в начало файла, можно использовать команду 1G.
Команды движения курсора можно совмещать с другими командами,
например, с командами удаления текста. Например, команда d$ удалит все,
что находится между текущим положением курсора и концом строки; команда
dG удалит все, что находится между текущим положением курсора и концом
файла и т. д.
Сохранение изменений и выход из редактора vi
Для выхода из редактора vi без сохранения изменений, сделанных в
файле, используется команда:q!. Когда вводится команда :, курсор переходит
на последнюю строку экрана, и таким образом редактор оказывается в режиме
последней строки:
COW IS THE TIME FOR ALL WOMEN TO COME TO THE SESSION.
~
~
~
:_
В этом режиме возможно вводить некоторые расширенные команды.
Одна из них — команда q!, которой завершается работа с редактором vi без
сохранения сделанных изменений. Команда: wq сначала сохраняет файл со
сделанными изменениями, а затем выходит из редактора vi. Команда ZZ (вы-
данная в командном режиме, т. е. без введения команды:) эквивалентна ко-
манде: wq. Если файл со времени последней модификации не изменялся, то
время создания файла также не будет изменено. Напомним, что в режиме по-
следней строки введение команды завершается клавишей Enter.
Чтобы сохранить файл, но не выходить из редактора vi, используется ко-
манда:w.
Переключение между файлами
Для того, чтобы приступить к редактированию другого файла, исполь-
зуется команда :e. Например, чтобы прекратить редактирование файла test и
вместо этого начать редактирование файла foo, надо ввести команду
COW IS THE TIME FOR ALL WOMEN TO COME TO THE SESSION.
~
~
~
:e foo_
Если команда: e будет введена без предварительного сохранения файла
на диск, будет выдано сообщение об ошибке:
No write since last change (":edit!" overrides)
Это сообщение означает, что после последней модификации не было со-
хранения файла, и редактор vi отказывается приступить к редактированию
другого файла. Сейчас можно либо сохранить сделанные изменения командой:
w и затем вводить команду: e, либо использовать команду
COW IS THE TIME FOR ALL WOMEN TO COME TO THE SESSION.
~
~
~

93
:e! foo_
Символ ! в последней команде сообщает редактору, что вы действи-
тельно хотите приступить к редактированию другого файла, не сохраняя из-
менения в прежнем.
Вставка содержимого других файлов
Включить в текущий файл содержимое другого файла можно коман-
дой :r. Например, команда
:r foo.txt
вставит содержимое файла foo.txt в текст начиная с текущего положения
курсора.
Запуск команд оболочки
Из редактора vi можно выполнять команды оболочки. Команда: r! рабо-
тает аналогично команде: r, но вместо содержимого другого файла она встав-
ляет в редактируемый файл выдачу некоторой команды. Например, введя ко-
манду
:r! ls -F
мы получим следующее:
COW IS THE TIME FOR ALL WOMEN TO COME TO THE SESSION.
letters/
misc/
papers/
Можно также «временно выйти» из редактора, запустить команду и за-
тем вернуться обратно. Например, если будет введена команда
:! ls -F
то команда ls -F будет исполнена, её результат будет выдан на экран, но
выдача вставлена в файл не будет. Если используется команда
:shell
то редактор vi запускает сеанс (instance) командной оболочки, прерывая
редактирование на время исполнения команд. Для выхода из оболочки и воз-
вращения к редактированию надо ввести команду exit.
Помощь в работе с редактором vi
Как и в случае с любой программой в системе Linux в первую очередь
следует обратиться к экранной документации к программе vi. Следует знать
также, что редактор vi является пользовательским интерфейсом редактора ex,
который выполняет многие из команд режима последней строки редактора vi.
Поэтому, в дополнение к сказанному выше, можно также читать экранную до-
кументацию к редактору ex. Обычно (кроме режимов восстановления после
системных сбоев) вам доступна более современная и улучшенная версия vi —
vim, который имеет аналогичный vi интерфейс, поддерживает все команды vi
и кроме того — массу дополнительных возможностей. Подробное руковод-
ство по vim можно получить, запустив этот редактор и отдав команду: help.

94
Глава 9. Утилиты для анализа файлов
Сравнение файлов и команда patch
Вы не замечали, что задача сравнения содержимого двух различных
файлов возникает при работе с компьютером удивительно часто? Конечно,
ведь так легко скопировать файл, а потом забываешь, какая же из версий новее
или качественнее (по одному автору ведомым критериям). Так что инстру-
менты для сравнения файлов просто необходимы и Linux такие инструменты
предоставляет.
Простейший из них — команда cmp. Эта команда просто сравнивает со-
держимое двух файлов по-байтно:
$ cmp file1 file2
Если файлы полностью совпадают, она молча заканчивает свою работу
(происходит возврат к командной строке без каких-либо дополнительных со-
общений), а если файлы различаются, выдаются номер строки и номер байта
в строке, где имеет место первое различие.
Конечно, информации, выдаваемой командой cmp, маловато для того,
чтобы принять, например, решение о том, какой из двух файлов нам более
ценен. Поэтому стоит воспользоваться командой diff для получения полного
отчета о том, каковы же различия в интересующих нас файлах. Для получения
отчета достаточно указать команде, какие именно файлы сравнивать:
$diff paper.old paper.new
Отчет о выявленных различиях будет выдан на стандартный выход.
Естественно, его лучше перенаправить в файл:
$diff paper.old paper.new >paper.diff
Для оценки версий одного и того же файла более удобна может ока-
заться команда sdiff, которая выдает результат сравнения в виде двух столб-
цов, разделенных пробелами. Если строки с одинаковыми номерами в файлах
различаются, то в выводе команды sdiff они разделены вертикальной чертой |.
Если строка имеется только в первом файле, она отмечена знаком <. Соответ-
ственно, строка, встречающаяся только во втором файле, помечена знаком >.
Существует также команда diff3, которая позволяет сравнить сразу 3
файла.
Но все же наиболее часто используется традиционная для UNIX-систем
команда diff. Эта ее востребованность объясняется тем, что создаваемый ею
отчет о различиях двух файлов может быть использован командой patch. Чаще
всего эти возможности используются при распространении обновлений про-
граммного обеспечения. Предположим, что некоторое программное приложе-
ние было разослано пользователям в виде файла program.c, содержащего ис-
ходный код программы на языке Си. После этого разработчик внес в про-
грамму некоторые исправления и сохранил текст в виде файла program.c.new.
Требуется довести исправленный текст программы до пользователей. Оче-
видно, что пользователям достаточно сообщить только исправления, т. е. от-
чет об изменениях, создаваемый по команде
$diff program.c program.c.new > program.c.diff
95
Естественно, объем файла program.c.diff существенно меньше объема
файла program.c.new, так что можно было бы получить существенную эконо-
мию на передаче файлов, если отправлять пользователям только файл
program.c.diff (ведь объемы современных программных приложений состав-
ляют десятки мегабайт). Однако пользователи должны иметь возможность
внести эти исправления в имеющуюся у них версию программы. Эту задачу
позволяет решить команда patch. Имея файлы program.c и program.c.diff, поль-
зователь может дать команду
$ patch program.c program.c.diff > program.c.new
в результате выполнения которой он получит файл program.c.new.
Утилита grep (Global Regular Expression Print)
Grep или Global Regular Expression Print — основная программа поиска
в Unix-подобных системах, которая может искать любой тип строки в любом
файле или списке файлов или даже выводить любую команду.
В качестве шаблона поиска он использует обычные регулярные выраже-
ния, кроме обычных строк. В Basic Regular Expressions (BRE) метасимволы
вроде: ‘{‘, ‘}’, ‘(‘, ‘)’, ‘|’, ‘+’, ‘?’ теряют свой смысл и считаются нормальными
символами строки и должны быть выделены специальным образом, если их
следует рассматривать как специальные символы.
Кроме того, grep использует алгоритм Boyer-Moore для быстрого поиска
любой строки или регулярного выражения.
/usr/bin/grep [ -bchilnsvw ] ограниченное_регулярное_выражение
[ имя_файла ... ]
/usr/xpg4/bin/grep [ -E | -F ] [ -c | -l | -q ] [ -bhinsvwx ]
-e список_образцов ... [ -f файл_образцов ] ...
[ имя_файла ... ]
/usr/xpg4/bin/grep [ -E | -F ] [ -c | -l | -q ] [ -bhinsvwx ]
[ -e список_образцов ... ] -f файл_образцов ...
[ имя_файла ... ]
/usr/xpg4/bin/grep [ -E | -F ] [ -c | -l | -q ] [ -bhinsvwx ]
образец [ имя_файла ... ]
Утлита grep выполняет поиск образца в текстовых файлах и выдает все
строки, содержащие этот образец. Она использует компактный недетермини-
рованный алгоритм сопоставления.
Будьте внимательны при использовании в списке_образцов символов $,
*, [, ^, |, (, ) и \, поскольку они являются метасимволами командного интерпре-
татора. Лучше брать весь список_образцов в одиночные кавычки '... '.
Если имя_файла не указано, grep предполагает поиск в стандартном
входном потоке. Обычно каждая найденная строка копируется в стандартный
выходной поток. Если поиск осуществлялся в нескольких файлах, перед каж-
дой найденной строкой выдается имя файла.
/usr/bin/grep
Утилита /usr/bin/grep использует для задания образцов ограниченные ре-
гулярные выражения, описанные на странице справочного руководства
regexp(5).
/usr/xpg4/bin/grep

96
Опции -E и -F влияют на способ интерпретации списка_образцов про-
граммой /usr/xpg4/bin/grep. Если указана опция -E, программа
/usr/xpg4/bin/grep интерпретирует образцы в списке как полные регулярные
выражения (см. описание опции -E). Если же указана опция -F, grep интерпре-
тирует список_образцов как фиксированные строки. Если ни одна из этих оп-
ций не указана, grep интерпретирует элементы списка_образцов как простые
регулярные выражения, описанные на странице справочного руководства
regex(5).
Следующие опции поддерживаются обеими программами, /usr/bin/grep
и /usr/xpg4/bin/grep:
-b Предваряет каждую строку номером блока, в котором она была найдена.
Это может пригодиться при поиске блоков по контексту (блоки нумеруются с 0).
-c Выдает только количество строк, содержащих образец.
-h Предотвращает выдачу имени файла, содержащего сопоставившуюся
строку, перед собственно строкой. Используется при поиске по нескольким файлам.
-i Игнорирует регистр символов при сравнениях.
-l Выдает только имена файлов, содержащих сопоставившиеся строки, по
одному в строке. Если образец найден в нескольких строках файла, имя файла не по-
вторяется.
-n Выдает перед каждой строкой ее номер в файле (строки нумеруются с 1).
-s Подавляет выдачу сообщений о не существующих или недоступных для
чтения файлах.
-v Выдает все строки, за исключением содержащих образец.
-w Ищет выражение как слово, как если бы оно было окружено метасимво-
лами \< и \>.
/usr/xpg4/bin/grep
Следующие опции поддерживаются только утилитой /usr/xpg4/bin/grep:
-e список_образцов Задает один или несколько образцов для поиска. Об-
разцы в списке_образцов должны разделяться символами новой строки. Пустой обра-
зец можно задать, введя два символа новой строки подряд. Если одновременно с этой
опцией не указана опция -E или -F, каждый образец будет рассматриваться как про-
стое регулярное выражение. Утилита grep воспринимает несколько опций -e и -f. При
поиске строк, соответствующих образцу, используются все заданные образцы, но по-
рядок сопоставления не определен.
-E Сопоставлять с польными регулярными выражениями. Рассматривать
каждый заданный образец как полное регулярное выражение. Если любое из полных
регулярных выражений-образцов сопоставляется с входной строкой, строка счита-
ется соответствующей. Пустое полное регулярное выражение соответствует любой
строке. Каждый образец будет интерпретироваться как полное регулярное выраже-
ние в соответствии с описанием на странице справочного руководства regex(5), за ис-
ключением метасимволов \( и \), причем:
- Полное регулярное выражение, за которым идет +, соответствует од-
ному или более вхождениям полного регулярного выражения.
- Полное регулярное выражение, за которым идет ?, соответствует 0 или
одному вхождению полного регулярного выражения.
- Полным регулярным выражениям, разделенным символами | или сим-
волами новой строки, соответствуют строки, сопоставляющиеся с лю-
бым из указанных выражений.
- Полные регулярные выражения можно брать в круглые скобки () для
группировки.
Максимальный приоритет имеют операторы [], затем *?+, конкатенация, и,
наконец, оператор | и символ новой строки.
97
-f файл_образцов Читает один или несколько образцов из файла с указанным
полным именем файл_образцов. Образцы в файле_образцов завершаются символом
новой строки. Пустой образец можно задать с помощью пустой строки в файле_образ-
цов. Если только вместе с этой опцией не указана опция -E или -F, каждый образец
счиается простым регулярным выражением.
-F Задает сопоставление с фиксированными строками. Каждый образец
ищется как строка, а не как регулярное выражение. Если входная строка содержит
любой из образцов в качестве подряд идущих байтов, такая строка считается соответ-
ствующей образцу. Пустая строка-образец соответствует любой строке. Подробнее см.
на странице fgrep(1).
-q Немногословный режим. В стандартный выходной поток не выдается
ничего, кроме сопоставившихся строк. Если одна из входных строк соответствует об-
разцу, возвращается статус выхода 0.
-x Считает сопоставившимися только строки, все символы которых ис-
пользованы при сопоставлении с фиксированной строкой или регулярным выраже-
нием.
Поддерживаются следующие операнды:
имя_файла Имя файла, в котором должен выполняться поиск по
образцу. Если файлы не указаны, поиск ведется в стандартном входном потоке.
/usr/bin/grep
образец Задает образец для поиска во входных строках.
/usr/xpg4/bin/grep
образец Задает один или несколько образцов для поиска во входных
строках. Этот операнд используется так же, как если бы он был задан в виде -
eсписок_образцов.
Опция -epattern_list имеет тот же эффект, что и операнд список_образцов,
но позволяет начинать список_образцов с дефиса. Она также пригодится в слу-
чаях, когда удобнее задавать несколько образцов в виде отдельных аргументов.
Можно задавать несколько опций -e и -f. При этом утилита grep исполь-
зует все заданные образцы при сопоставлении с входными строками. (Учтите,
что порядок проверки не задается. Если реализация находит среди образцов
пустую строку, она может искать сначала именно ее, тем самым, сопоставле-
ние будет найдено для каждой строки, а остальные образцы, по сути, - про-
игнорированы.)
Опция -q дает средства простого определения, находится ли образец
(или строка) в группе файлов. При поиске в нескольких файлах она обеспечи-
вает более высокую производительность (поскольку позволяет завершить ра-
боту, как только будет найдено первое соответствие) и не требует дополни-
тельных усилий пользователя при формировании набора файлов-аргументов
(поскольку grep вернет нулевой статус выхода при обнаружении соответствия
даже если при работе с предыдущими операндами-файлами произошла
ошибка доступа или чтения.)

ПРИМЕРЫ
Пример 1: Поиск всех вхождений слова
Чтобы найти все вхождения слова "Posix" (независимо от регистра) в
файле text.mm и выдать номера соответствующих строк:
grep -i -n posix text.mm

98
Пример 2: Поиск пустых строк
Чтобы найти все пустые строки в стандартном входном потоке:
grep ^$
или
grep -v .
Пример 3: Поиск строк, содержащих фиксированные подстроки
Обе следующих команды выдают все строки, содержащие подстроки abc,
def или и ту, и другую:
grep -E 'abc def'
grep -F 'abc def'
Пример 4: Поиск строк, соответствующих образцу
Обе следующих команды выдают все строки abc или def:
grep -E '^abc$ ^def$'
grep -F -x 'abc def'
Команда egrep
Egrep или grep -E — это другая версия grep или Extended grep. Эта версия
grep эффективна и быстра, когда дело доходит до поиска шаблона регулярных
выражений, поскольку она обрабатывает метасимволы как есть и не заменяет
их как строки. Egrep использует ERE или Extended Extended Expression.
В случае egrep, даже если вы не избегаете метасимволы, команда будет
относиться к ним как к специальным символам и заменять их своим особым
значением вместо того, чтобы рассматривать их как часть строки.
$ egrep -C 0 '(f|g)ile' check_file
$ egrep -C 0 '\(f\|g\)ile' check_file
Команда fgrep
Fgrep или Fixed grep или grep -F — это еще одна версия grep, которая
необходима, когда дело доходит до поиска всей строки вместо регулярного
выражения, поскольку оно не распознает ни регулярные выражения, ни мета-
символы. Для поиска любой строки напрямую выбирайте эту версия grep.
Fgrep ищет полную строку и не распознает специальные символы как
часть регулярного выражения, несмотря на то экранированы символы или нет.
$ fgrep -C 0 '(f|g)ile' check_file
$ fgrep -C 0 '\(f\|g\)ile' check_file

Глава 10. Пользователи и группы.


10.1. Пользователи и группы в операционной системе.
Учётные записи
Linux — система многопользовательская, а потому пользователь — ключевое
понятие для организации всей системы доступа в Linux. Когда пользователь реги-
стрируется в системе (проходит процедуру авторизации, например, вводя системное
имя и пароль), он идентифицируется с учётной записью, в которой система хранит
99
информацию о каждом пользователе: его системное имя и некоторые другие сведе-
ния, необходимые для работы с ним. Именно с учётными записями, а не с самими
пользователями, и работает система. Ниже приведён список этих сведений.
Системное имя (user name)
Это то имя, которое вводит пользователь в ответ на приглашение login:. Оно
может содержать только латинские буквы и знак “_”. Это имя используется также в
качестве имени учётной записи.
Идентификатор пользователя (UID)
Linux связывает системное имя c идентификатором пользователя в си-
стеме — UID (User ID). UID — это положительное целое число, по которому си-
стема и отслеживает пользователей1. Обычно это число выбирается автоматически
при регистрации учётной записи, однако оно не может быть совершенно произволь-
ным. В Linux есть некоторые соглашения относительно того, каким типам пользова-
телей могут быть выданы идентификаторы из того или иного диапазона. В частно-
сти, UID от “0” до “100” зарезервированы для псевдопользователей.
Идентификатор группы (GID)
Кроме идентификационного номера пользователя с учётной записью свя-
зан идентификатор группы. Группы пользователей применяются для организа-
ции доступа нескольких пользователей к некоторым ресурсам. У группы, так же, как
и у пользователя, есть имя и идентификационный номер — GID (Group ID). В Linux
каждый пользователь должен принадлежать как минимум к одной группе — группе
по умолчанию. При создании учётной записи пользователя обычно создаётся и
группа, имя которой совпадает с системным именем, именно эта группа будет ис-
пользоваться как группа по умолчанию для этого пользователя. Пользователь может
входить более чем в одну группу, но в учётной записи указывается только номер
группы по умолчанию. Группы позволяют регулировать доступ нескольких пользо-
вателей к различным ресурсам.
Полное имя (full name)
Помимо системного имени в учётной записи содержится и полное имя (имя
и фамилия) использующего данную учётную запись человека. Конечно, пользова-
тель может указать что угодно в качестве своего имени и фамилии. Полное имя необ-
ходимо не столько системе, сколько людям — чтобы иметь возможность определить,
кому принадлежит учётная запись.
Домашний каталог (home directory)
Файлы всех пользователей в Linux хранятся раздельно, у каждого пользова-
теля есть собственный домашний каталог, в котором он может хранить свои дан-
ные. Доступ других пользователей к домашнему каталогу пользователя может быть
ограничен. Информация о домашнем каталоге обязательно должна присутствовать
в учётной записи, потому что именно с него начинает работу пользователь, зареги-
стрировавшийся в системе.
Начальная оболочка (login shell)
Важнейший способ взаимодействовать с системой Linux — командная
строка, которая позволяет пользователю вести «диалог» с системой: передавать ей
команды и получать её ответы. Для этой цели служит специальная программа — ко-
мандная оболочка (или интерпретатор командной строки), по-английски — shell.
Начальная оболочка (login shell) запускается при входе пользователя в систему в тек-
стовом режиме (например, на виртуальной консоли). Поскольку в Linux доступно
несколько разных командных оболочек, в учётной записи указано, какую из
100
командных оболочек нужно запустить для данного пользователя. Если специально
не указывать начальную оболочку при создании учётной записи, она будет назна-
чена по умолчанию, вероятнее всего это будет bash.
Все перечисленные данные об учётных записях хранятся в файле /etc/passwd.
Сведения о конкретной учётной записи пользователя можно получить с помощью
утилиты getent
Назначение прав пользователю.
Существует три пути управления доступом к файлу или каталогу. Каждый
файл должен иметь владельца (owner), группового владельца (group owner), а также
может потребоваться доступ для всех остальных пользователей (everyone). Эти
названия обычно приводятся как пользователь/группа/остальные (user/group/others)
или коротко ugo.
Реализация управления доступом к файлам и каталогам в Unix позволяет или
запрещает доступ по трем флагам: флаг чтения (Read), флаг записи (Write), флаг вы-
полнения (eXecute). Они представляются следующим образом:
flag user group other

# rwx rwx rwx


Флаг (flag) может быть одним из следующих типов:
Флаг Описание

- Отсутствие флага

l - лат. «л» Символическая ссылка (symbolic link)

d Директория (directory)

b Блочное устройство (block device)

c Символьное устройство (character device)

p Канал, устройство fifo (fifo device)

s Unix сокет (unix domain socket)


Для назначения прав используются три группы флагов, первая определяет
права для владельца, вторая - права для основной группы пользователя, третья - для
всех остальных пользователей в системе.
Для файлов: r - право на чтение из файла; w - разрешает запись в файл (в част-
ности перезапись или изменение); x - позволяет исполнить файл.
Для каталогов, флаги r w x имеют несколько отличный смысл: r - позволяет
читать только имена файлов в каталоге; x - позволяет иметь доступ к самим файлам
и их атрибутам (но не именам); w имеет смысл только в сочетании с x, и позволяет
(в дополнение к x) манипулировать с файлами в каталоге (создавать, удалять и пере-
именовывать).
Таблица прав:
OCT BIN Mask Права на файл Права на каталог

0 000 - - - отсутствие прав отсутствие прав


101
1 001 - - x права на выполнение доступ к файлам и их атрибутам

2 010 - w - права на запись отсутствие прав

3 011 - w x права на запись и выполнение все, кроме доступа к именам файлов

4 100 r - - права на чтение только чтение имен файлов

чтение имен файлов и доступ файлам и их


5 101 r - x права на чтение и выполнение
атрибутам

6 110 r w - права на чтение и запись только чтение имен файлов

7 111 r w x полные права все права


Что касается процессов, то с ними связано не два идентификатора, а 4-е: ре-
альный и эффективный пользовательский (UID), а также реальный и эффективный
групповой (GID). Реальные номера применяются для учета использования систем-
ных ресурсов, а эффективные для определения прав доступа к процессам. Как пра-
вило, реальные и эффективные идентификаторы совпадают. Владелец процесса мо-
жет посылать ему сигналы, а также изменять приоритет.
Процесс не может явно изменить ни одного из своих четырех идентификато-
ров, но есть ситуации, когда происходит косвенная установка новых эффективных
идентификаторов процесса. Дело в том, что существуют два специальных
бита: SUID (Set User ID - бит смены идентификатора пользователя) и SGID (Set
Group ID - бит смены идентификатора группы). Когда пользователь или процесс за-
пускает исполняемый файл с установленным одним из этих битов, файлу временно
назначаются права его (файла) владельца или группы (в зависимости от того, какой
бит задан). Таким образом, пользователь может даже запускать файлы от имени су-
перпользователя.
Значения для установки битов:
▪ Восьмеричные значения для SUID и SGID - 4000 и 2000.
▪ Символьные: u+s и g+s.
Значения для снятия битов:
▪ Восьмеричные значения для SUID и SGID – 0+{права}
▪ Символьные: u-s и g-s
Использование бита sticky для директориев:
Установка:
▪ Восьмеричное значение stiky-бита: 1000
▪ Символьное: +t
Снятие:
▪ Символьное: -t
Основные конфигурационные файлы.
Изменять параметры пользователей и групп можно не только при по-
мощи специальных утилит, но и вручную. Все настройки хранятся в текстовых
файлах. Описание каждого из них приведено ниже.
/etc/passwd

102
В файле /etc/passwd хранится вся информация о пользователях кроме па-
роля. Одна строка из этого файла соответствует описанию одного пользова-
теля. Примерное содержание строки таково:
vasyapupkin:x:1000:1000:Vasya Pupkin:/home/vpupkin:/bin/bash
Строка состоит из нескольких полей, каждое из которых отделено от
другого двоеточием. Значение каждого поля приведено в таблице.
№ Поле Описание
1 vasyapupkin Имя пользователя для входа в систему.
2 x Необязательный зашифрованный пароль.
3 1000 Числовой идентификатор пользователя (UID).
4 1000 Числовой идентификатор группы (GID).
5 Vasya Pupkin Поле комментария
6 /home/vpupkin Домашний каталог пользователя.
7 /bin/bash Оболочка пользователя.
Второе и последнее поля необязательные и могут не иметь значения.
/etc/group
В /etc/group, как очевидно из названия хранится информация о группах.
Она записана в аналогичном /etc/passwd виде:
vasyapupkin:x:1000:vasyapupkin,petya
№ Поле Описание
1 vasyapupkin Название группы
2 x Необязательный зашифрованный пароль.
3 1000 Числовой идентификатор группы (GID).
4 vasyapupkin,petya Список пользователей, находящихся в группе.
В этом файле второе и четвертое поля могут быть пустыми.
/etc/shadow
Файл /etc/shadow хранит в себе пароли, по этому права, установленные
на этот файл, не дают считать его простому пользователю. Пример одной из
записей из этого файла:
vasyapupkin:$6$Yvp9VO2s$VfI0t.o754QB3HcvVbz5hlOafmO.LaHXwfavJHniHNzq/b
CI3AEo562hhiWLoBSqxLy7RJJNm3fwz.sdhEhHL0:15803:0:99999:7:::
Здесь:
№ Поле Описание
1 vasyapupkin Имя пользователя для входа в систему.
2
$6$Yvp9VO2s$VfI0t.o754QB3HcvVbz5hlOafmO.LaHXwfavJHniHNzq/bCI3AEo562h
hiWLoBSqxLy7RJJNm3fwz.sdhEhHL0 Необязательный зашифрованный пароль.
3 15803 Дата последней смены пароля.
4 0 Минимальный срок действия пароля.
5 99999 Максимальный срок действия пароля.
6 7 Период предупреждения о пароле.
7 Период неактивности пароля.
9 Дата истечения срока действия учётной записи.
Вывод списка групп:
cat /etc/group
cat /etc/group | sed s/:.*//

103
Вывод списка пользователей:
cat /etc/passwd | sed s/:.*//
getent passwd
Изменение группы
Сменить название группы, ее GID или пароль можно при помощи
groupmod. Пример:
sudo groupmod -n newtestgroup testgroup #Имя группы изменено с
testgroup на newtestgroup
Опции groupmod:
Ключ Описание
-g Установить другой GID.
-n Новое имя группы.
-p Изменить пароль группы.
10.2. Утилиты для работы с пользователями и группами
Получение информации о пользователях:
w – вывод информации (имя пользователя, рабочий терминал, время
входа в систему, информацию о потребленных ресурсах CPU и имя запущен-
ной программы) о всех вошедших в систему пользователях.
who – вывод информации (имя пользователя, рабочий терминал, время
входа в систему) о всех вошедших в систему пользователях.
who am i или whoami или id – вывод вашего имени пользователя.
users – вывод имен пользователей, работающих в системе.
id имя_пользователя – вывод о идентификаторах пользователя: его uid,
имя_пользователя, gid и имя первичной группы и список групп в которых со-
стоит пользователь
groups имя_пользователя – вывод списка групп в которых состоит
пользователь.
useradd – команда для создания учетной записи.
useradd [options] LOGIN
Основные ключи команды:
-d, Указание домашней директории пользователя
-g, Имя или GID-номер группы (/etc/group)в которой будет находиться пользо-
ватель
-G, список дополнительных групп для учетной записи
-m, создание домашней директории
-p, пароль
-s, shell оболочка, используемая по умолчанию
-u, UID-номер создаваемого пользователя

104
Создание пользователя new_usr1 в группе users с вновь созданным до-
машним каталогом /home/new_usr1 и с паролем pass
# useradd -d /home/new_usr1 -g users -m -p pass new_usr1
Создание пользователя new_usr2 в группе с ID - 1000 с вновь создан-
ным домашним каталогом /home/new_usr2 . ID пользователя 666 и пароль
pass.
# useradd -d /home/new_usr2 -g 1000 -m -p pass -u 666 new_usr2
usermod – команда редактирования учетной записи
Параметры команды usermod:
-a, --appendГРУППА
Добавить пользователя в дополнительную группу.
-c, --commentКОММЕНТАРИЙ
Новое значение поля комментария в файле пользовательских па-
ролей. Обычно его изменяют с помощью программы chfn(1).
-d, --homeДОМАШНИЙ_КАТАЛОГ
Новый домашний каталог пользователя. Если указан параметр -m,
то содержимое текущего домашнего каталога будет перемещено в но-
вый домашний каталог, который будет создан, если он ещё не суще-
ствует.
-e, --expiredateДАТА_УСТАРЕВАНИЯ
Дата, когда учётная запись пользователя будет заблокирована.
Дата задаётся в формате ГГГГ-ММ-ДД.
-f, --inactiveДНЕЙ
Число дней, которые должны пройти после устаревания пароля,
чтобы учётная запись заблокировалась навсегда. Если указано значение
0, то учётная запись блокируется сразу после устаревания пароля, а при
значении -1 данная возможность не используется. По умолчанию ис-
пользуется значение -1.
-g, --gidГРУППА
Имя или числовой идентификатор новой начальной группы поль-
зователя. Группа с таким именем должна существовать. Идентификатор
группы должен указывать на уже существующую группу. По умолча-
нию идентификатор группы установлен в 1.
-G, --groupsГРУППА1[,ГРУППА2,...[,ГРУППАN]]]
Список дополнительных групп, в которых числится пользователь.
Перечисление групп осуществляется через запятую, без промежуточных
пробелов. На указанные группы действуют те же ограничения, что и для
группы указанной в параметре -g. Если пользователь член группы, кото-
рой в указанном списке нет, то пользователь удаляется из этой группы.
Такое поведение можно изменить с помощью параметра -a, при указа-
нии которого к уже имеющемуся списку групп пользователя добавля-
ется список указанных дополнительных групп.
-l, --loginНОВОЕ_ИМЯ
Имя пользователя будет изменено с emphasis remap="I">ИМЯ
-L, --lock
105
Заблокировать пароль пользователя. Это делается помещением
символа '!' в начало шифрованного пароля, чтобы приводит к блоки-
ровке пароля. Не используйте этот параметр вместе с -p или -U.
-o, --non-unique
При использовании с параметром -u, этот параметр позволяет ука-
зывать не уникальный числовой идентификатор пользователя.
-p, --passwordПАРОЛЬ
Шифрованное значение пароля, которое возвращает функ-
ция crypt(3).
-s, --shellОБОЛОЧКА
Имя новой регистрационной оболочки пользователя. Если задать
пустое значение, то будет использована регистрационная оболочка по
умолчанию.
-u, --uidUID
Числовое значение идентификатора пользователя (ID). Значение
должно быть уникальным, если не задан параметр -o. Значение должно
быть неотрицательным. Значения от 0 до 999 обычно зарезервированы
для системных учётных записей. Для всех файлов, которыми владеет
пользователь и которые расположены в его домашнем каталоге иденти-
фикатор владельца файла будет изменён автоматически. Для файлов,
расположенных вне домашнего каталога идентификатор нужно изме-
нять вручную.
-U, --unlock
Разблокировать пароль пользователя. Это выполняется удалением
символа '!' из начала шифрованного пароля. Не используйте этот пара-
метр вместе с -p или -L.
Перемещение в новый домашний каталог, новый пароль и новое имя
для учетной записи
# usermod -d /home/usr0 -m -p pass2 -l new_usr000 new_usr1
userdel – команда удаления учетной записи
userdel [options] LOGIN
-f, принудительное удаления файлов
-r, удаление домашнего и каталога почты.
Пример удаления учетной записи:
# userdel -r new_usr000
Перемещение каталога пользователя:
cd /old_dir; tar –cf-. | (cd /new_dir; tar –xpf-)
Управление группами
Создание группы
Программа groupadd создаёт новую группу согласно указанным значе-
ниям командной строки и системным значениям по умолчанию. Пример ис-
пользования:
106
sudo groupadd testgroup
Основные ключи:
Ключ Описание
-f, --force this option causes the command to simply exit with success status if the
specified group already exists. When used with -g, and the specified GID already exists, an-
other (unique) GID is chosen (i.e. -g is turned off).
-g, --gidGID числовое значение идентификатора группы. Значение должно быть
уникальным, если не задан параметр -o. Значение должно быть не отрицательным. По
умолчанию, берётся значение больше 999 и больше идентификатора любой другой
группы. Значения от 0 и до 999 обычно зарезервированы под системные группы.
-h, --help показать краткую справку и закончить работу.
-K, --keyКЛЮЧ=ЗНАЧЕНИЕ изменить значения по умолчанию (GID_MIN,
GID_MAX и другие), которые хранятся в файле /etc/login.defs. Можно указать не-
сколько параметров -K.
Пример: -K GID_MIN=100 -K GID_MAX=499
Замечание: запись вида -K GID_MIN=10,GID_MAX=499 пока не работает.
-o, --non-unique this option permits to add a group with a non-unique GID.
-p, --passwordПАРОЛЬ
-r создать системную группу.
Изменение группы
Сменить название группы, ее GID или пароль можно при помощи
groupmod. Пример:
sudo groupmod -n newtestgroup testgroup #Имя группы изменено с testgroup на
newtestgroup
Опции groupmod:
Ключ Описание
-g Установить другой GID.
-n Новое имя группы.
-p Изменить пароль группы.
Удаление группы
Удаление группы:
sudo groupdel testgroup
groupdel не имеет никаких дополнительных параметров.
Управление политикой паролей учетных записей.
Утилита chage.
Chage может установить количество дней между сменой паролей. Ко-
манда может выполняться только от root, за исключением опции -l, которой
доступна для обычного пользователя.

chage [-m mindays] [-M maxdays] [-d lastday] [-I inactive] [-E expiredate] [-W warndays]
user

107
Пара-
Описание
метр
Определяет минимальный срок (в днях), по истечении которого пользователь дол-
-m
жен менять пароль. Если это значение равно 0, срок действия пароля не будет исте-
days
кать.
Определяет максимальный срок (в днях), в течение которого будет действовать па-
-M роль. Если количество дней, заданное этим параметром, и количество дней, задан-
days ное параметром -d, в сумме определяют день в прошлом, пользователь должен сме-
нить пароль, чтобы использовать эту учётную запись.
-d
Определяет дату смены пароля (число дней, прошедших после 1 января 1970 г.).
days
Определяет, через сколько дней после истечения срока действия пароля учётная
-I days запись будет заблокирована. Если значение равно 0, учётная запись не будет бло-
кироваться.
Определяет дату блокирования учётной записи, в формате ГГГГ-ММ-ДД. Вместо та-
-E
кого формата даты можно также указать число дней, прошедших после 1 января
date
1970 г.
-W Определяет, за сколько дней до истечения срока действия пароля будет предупре-
days ждаться пользователь.

Политика паролей для пользователя:


sudo chage -l <имя пользователя>
Пользователь должен изменять свой пароль каждые 90 дней:
sudo chage -M 90 <имя пользователя>
Немедленная смена пароля:
sudo chage -d 0 <имя пользователя>
Ограничение доступа пользователя в систему по времени, например, только в
течение 1 недели:
sudo chage -E "2018-03-28" <имя пользователя>
Для удаления ограничений:
sudo chage -m 0 -M 99999 -I -1 -E -1 <имя пользователя>

Глава 11. Утилиты для конфигурирования и мониторинга сетевых


интерфейсов.
11.1. Утилиты для конфигурирования и управления сетевыми ин-
терфейсами.
Утилита Ifconfig.
Утилита ifconfig используется для настройки и управления сетевыми ин-
терфейсами.
Общий синтаксис утилиты ifconfig:
108
ifconfig [-L] [-m] interface [create] [address_family] [address [dest_address]]
[parameters]
ifconfig interface destroy
ifconfig -a [-L] [-d] [-m] [-u] [address_family]
ifconfig -l [-d] [-u] [address_family]
ifconfig [-L] [-d] [-m] [-u] [-C]
Команда ifconfig используется для настройки сетевых интерфейсов. Ко-
манда должна использоваться при загрузке системы для настройки адресов
каждого сетевого интерфейса, а также может использоваться после загрузки
для изменения параметров сетевых интерфейсов. Если команда введена без ар-
гументов, ifconfig выдает информацию о состоянии активных интерфейсов.
Если в качестве аргумента указан какой-либо интерфейс, то выдается инфор-
мация только о состоянии этого интерфейса; если указан один аргумент -a, вы-
дается информация о состоянии всех интерфесов, даже отключенных.
Опции:
интерфейс – имя интерфейса (например, rl0 в BSD или eth0 в Linux).
– вызывает активизацию интерфейса. Задается неявно при присвоении ад-
up
реса интерфейсу.
down – вызывает остановку работы драйвера для интерфейса.
[-]arp – включает или отключает использование протокола ARP для интерфейса.
– включает или отключает неразборчивый режим (promiscuous mode) ра-
[-]promisc боты интерфейса. В этом режиме все проходящие по сети пакеты будут
приниматься интерфейсом.
– включает или отключает режим all-multicast. В этом режиме все многоад-
[-]allmulti
ресные (multicast) пакеты в сети будут приниматься интерфейсом.
metric N – устанавливает метрику интерфейса.
– устанавливает максимальный размер пакета (Maximum Transfer Unit -
mtu N
MTU) для интерфейса.
адрес – IP-адрес, присваиваемый интерфейсу.
– устанавливает маску сети IP для этого интерфейса. По умолчанию ис-
netmask адрес пользуется обычная маска сети класса A, B или C (что определяется по IP-
адресу интерфейса), но можно усановить любое значение.
add адрес/длина_пре-
– добавляет адрес IPv6 для интерфейса.
фикса
del адрес/длина_пре-
– удаляет адрес IPv6 для интерфейса.
фикса
– устанавливает аппаратное прерывание, используемое устройством. Не
irq адрес
для всех устройств можно динамически менять значение IRQ.
– устанавливает физический порт или тип носителя, используемый
устройством. Не для всех устройств можно менять этот параметр, и для
разных устройств могут поддерживаться различные значения. Типичные
значения типа - 10base2 (коаксиальный кабель Ethernet), 10baseT (витая
media тип
пара Ethernet 10 Мбит/сек), AUI (внешний передатчик) и т.д. Специальный
тип носителя auto можно использовать, чтобы потребовать от драйвера
автоматически обпределять тип носителя. Не все драйверы могут это де-
лать.
– если указан аргумент адрес, задает соответствующий протоколу широ-
[-]broadcast [адрес] ковещательный адрес для интерфейса. В противном случае устанавливает
(или сбрасывает) флаг IFF_BROADCAST для интерфейса.

Примеры использования утилиты ifconfig.


Получение списка всех активных интерфейсов:

109
#ifconfig
Получение статистики по заданному интерфейсу, например, eth1:
# ifconfig eth1
Отображение всех интерфейсов, включая отключенные:
# ifconfig -a
Выключение интерфейса:
# ifconfig eth1 down
Запуск интерфейса:
# ifconfig eth1 up
Назначение интерфейсу IP адреса, например, 192.168.2.2 на eth1:
# ifconfig eth1 192.168.2.2
Изменение сетевой маски на интерфейсе eth1:
# ifconfig eth1 netmask 255.255.255.0
Изменим шикоровещательный адрес для интерфейса eth1:
# ifconfig eth1 broadcast 192.168.2.255
Назначение IP адреса, маски и широковещательного адреса одной ко-
мандой.
# ifconfig eth1 192.168.2.2 netmask 255.255.255.0 broadcast 192.168.2.255
Изменение значения MTU. Для изменения Maximum transmission unit
(MTU) на значение XX:
# ifconfig eth1 mtu XX
Promiscuous mode. По умолчанию когда сетевая карта получает пакет,
она проверяет адрес получателя. В случае если этот адрес отличен от назна-
ченных ей адресов, пакет отбрасывается. В promiscuous mode, карта не отбра-
сывает данные пакеты. Вместо этого она принимает все пакеты, приходящие
через интрефейс. Для установки данного режима требуются привелегии супер-
пользователя. Большинство сетевых мониторов и анализаторов используют
данный режим для захвата пакетов и анализа сетевого трафика.
Переключение режима работы интерфейса eht1 в promiscuous mode:
# ifconfig eth1 promisc
Выключение режима promiscuous mode:
# ifconfig eth0 -promisc
Утилита ip.
Утилита ip включает в себя весь не обходимый набор средств для кон-
фигурирования, мониторинга и управления работой сетевого окружения опе-
рационной системы и входит в состав пакета iproute2.
iproute2 — это набор утилит для управления сетевыми устройствами в
Linux. iproute2 пришел на смену классическому но устаревшему набору net-
tools (ifconfig, netstat, route и.т.д) в UNIX. Общий синтаксис команды ip:
ip [Опции] Объект [ Команда [Аргументы команды] ]
где Опции - опциональные параметры, который влияют на общую ра-
боту утилиты или вывод результатов.
110
В настоящее время доступны следующие опции:
-V, -Version - выводит номер версии программы ip
-s, -stats, -statistic - выводит статистическую информацию.
-f, - family - указывается перед идентификатором протокола, таким как
inet (IPv4), inet6(IPv6) или link. Служит для выбора указания протокола, если
протокол не указан, то по умолчанию протокол выбирается из параметров ко-
манд.
-4 - аналог параметра -family inet
-6 - аналог параметра -family inet6
-0 - аналог параметра -family link
-o, -oneline - каждая запись будет выводиться на новой строке.
-r - выводить на экран символические имена хостов.
Список Объектов и Команд приведен в таблице:
address add | del | show | flush IP- или IPv6-адрес устройства
addrlabel add | del | list | flush Конфигурирование меток
link set | show Конфигурирование сетевых устройств
show Конфигурирование адресов групповой
maddr
add | del рассылки
monitor all | LISTofOBJECTS Мониторинг состояния устройств
iip mroute show Кэш групповой маршрутизации
add | del | change | replace |
neighbour Кэш ARP или NDISC
show | flush
get | list / flush
route Управление маршрутизацией
add | del | change | append | replace | monitor
rule list | add | del | flush Правила маршрутизации
tunnel add | change | del | show Туннелирование через протокол IP
Примеры использования утилиты ip:
# ip addr add 192.168.50.254/24 dev eth0 #Назначение IP адреса
# ip addr add 192.168.51.254/24 dev eth0 label eth0:1 #Назначение виртуального IP ад-
реса
# ip link show # Список сетевых интерфейсов
# ip link set eth0 up # Включить сетевой интерфейс
# ip link set eth0 down #Выключение сетевого интерфейса
# ip addr show # Список всех IP адресов
# ip neigh show # Аналог команды arp –a
# ip route list # Таблица маршрутизации
# ip route add 192.168.20.0/24 via 192.168.16.254 #добавление статического марш-
рута

Утилита ethtool.
ethtool – Утилита для управления конфигурацией сетевых адаптеров
типа Ethernet, а так же для получения различной информации о ней. СИН-
ТАКСИС
ethtool ethX
ethtool -h
ethtool -a ethX
ethtool -A ethX [autoneg on|off] [rx on|off] [tx on|off]
ethtool -c ethX
111
ethtool -C ethX [adaptive-rx on|off] [adaptive-tx on|off] [rx-usecs N] [rx-
frames N] [rx-usecs-irq N] [rx-frames-irq N] [tx-usecs N] [tx-frames N] [tx-usecs-
irq N] [tx-frames-irqN] [stats-block-usecs N] [pkt-rate-low N] [rx-usecs-low N] [rx-
frames-low N] [tx-usecs-low N] [tx-frames-low N] [pkt-rate-high N] [rx-usecs-
high N] [rx-frames-high N] [tx-usecs-high N] [tx-frames-high N] [sample-
interval N]
ethtool -g ethX
ethtool -G ethX [rx N] [rx-mini N] [rx-jumbo N] [tx N]
ethtool -i ethX
ethtool -d ethX
ethtool -e ethX [raw on|off] [offset N] [length N]
ethtool -k ethX
ethtool -K ethX [rx on|off] [tx on|off] [sg on|off]
ethtool -p ethX [N]
ethtool -r ethX
ethtool -S ethX
ethtool -t ethX [offline|online]
ethtool -s ethX [speed 10|100|1000] [duplex half|full] [port tp|aui|bnc|mii]
[autoneg on|off] [phyad N] [xcvr internal|external] [wol p|u|m|b|a|g|s|d...]
[sopass xx:yy:zz:aa:bb:cc] [msglvl N]
ОПИСАНИЕ
ethtool используется для чтения, отображения настроек сетевого
устройства и их настройки.
ethX является названием того сетевого устройства, которое настраи-
вают или, для которого определяют характеристики. Обычно X=0,1,2..
ПАРАМЕТРЫ
При использовании большинства параметров для ethtool должно быть
задано то название устройства, по отношению к которому предпринимаются
действия. Для визуальной идентификации устройства используйте параметр -
p (см.ниже). Например, следующая команда отображает текущие настройки
сетевой карты eth0:
# ethtool eth0
Settings for eth0 (Установки для eth0):
Supported ports: [ TP MII ]
(Поддерживаемые порты)
Supported link modes: 10baseT/Half 10baseT/Full
(Поддерживаемые режимы связи, тип носителя)
100baseT/Half 100baseT/Full
Supports auto-negotiation: Yes
(Поддержка авто-согласования: Да)
Advertised link modes: 10baseT/Half 10baseT/Full
(Оповещаемые режимы связи, тип носителя)
100baseT/Half 100baseT/Full

112
Advertised auto-negotiation: Yes
(Оповещение авто-согласования: Да)
Speed: 100Mb/s
(Текущая скорость приёма/передачи: 100 Mбит/с)
Duplex: Full
(Режим двухстороннего обмена: Полный)
Port: Twisted Pair
(Подключение: Витая пара)
PHYAD: 1
Transceiver: internal
(Приёмо-передатчик: Внутренний)
Auto-negotiation: on
(Режим авто-согласования: Вкл.)
Supports Wake-on: puag
(Поддержка режимов "пробуждение": puag)
Wake-on: g
(Текущий режим "пробуждение": g)
Link detected: yes
(Обнаружение соединения: да)
--------------
-h выводит краткую справку о команде и примерах параметров.
-a запрашивает и отображает настройки параметров ожидания для ука-
занного сетевого устройства. Например:
# ethtool -a eth0
Pause parameters for eth0:
(Параметры ожидания для eth0)
Autonegotiate: off
(Авто-согласование: выкл.)
RX: off
TX: off
-A позволяет изменить параметры ожидания для указанного сетевого
устройства.
autoneg on|off - Включает (on) или отключает (off) режим авто-согла-
сования (аutonegotiation), если он является доступным. Режим авто-согласо-
вания предполагает, что сетевое устройство само определяет присутствует ли
двусторонний обмен и сколько мегабит он составляет. Например:
# ethtool -A eth0 autoneg on
# ethtool -a eth0
Pause parameters for eth0:
Autonegotiate: on
(Авто-согласование: вкл.)
RX: on
TX: on

113
rx on|off - Включает (on) или отключает (off) режим ожидания RX,
если он является доступным.
tx on|off - Включает (on) или отключает (off) режим ожидания TX,
если он является доступным.
-c - запрашивает и отображает настройки объединённых параметров
для указанного сетевого устройства.
-C - позволяет изменить настройки объединённых параметров для ука-
занного сетевого устройства.
-g - запрашивает и отображает настройки параметров rx/tx для указан-
ного сетевого устройства. Например:
# ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums (Максимально возможные):
RX: 1024
RX Mini: 0
RX Jumbo: 0
TX: 1024
Current hardware settings (Текущие аппаратные установки):
RX: 64
RX Mini: 0
RX Jumbo: 0
TX: 64
-G - позволяет изменить настройки rx/tx ring параметров для указан-
ного сетевого устройства.
rx N - позволяет изменить число ring подключений N для Rx ring.
Например:
# ethtool -G eth0 rx 1024
rx-mini N - позволяет изменить число ring подключений N для Rx Mini
ring.
rx-jumbo N- позволяет изменить число ring подключений N для Rx
Jumbo ring.
tx N - позволяет изменить число ring подключений N для Tx ring.
-i - отображает ассоциированный с указанным сетевым устройством
драйвер и его версию. Например:
# ethtool -i eth0
driver: e100
version: 2.3.38-k1
firmware-version: N/A
bus-info: 02:08.0
-d - получает и отображает дамп состояния регистров для указанного
сетевого устройства.
-e - получает и отображает дамп EEPROM (микросхема памяти) для
указанного сетевого устройства (если EEPROM есть в данном сетевом
устройстве). Если возможен низкоуровневый доступ (raw on), тогда выво-
дятся низкоуровневые данные EEPROM. Указание длины (length) и
114
смещения (offset) в параметрах позволяют получать дампы с определённой
порцией данных EEPROM. По умолчанию отображается полный дамп вхож-
дений EEPROM. Например:
# ethtool -e eth0 raw off offset 30 length 10
Offset Value
-------- -----
30 0x00
31 0x00
32 0x00
33 0x00
34 0x00
35 0x00
36 0x00
37 0x00
38 0x00
39 0x00
-k - запрашивает и отображает информацию по контрольным суммам
для указанного сетевого устройства.
-K - позволяет изменить параметры контроля сумм для указанного се-
тевого устройства.
rx on|off - Настраивает контроль сумм для RX, если эта функция под-
держивается сетевым устройством.
tx on|off - Настраивает контроль сумм для TX, если эта функция под-
держивается сетевым устройством.
sg on|off - Настраивает режим "произвольной упаковки" (scatter-gather),
если он поддерживается сетевым устройством.
-p - позволяет инициировать (пометить) данное сетевое устройство та-
ким образом, чтобы вы смогли наиболее легко, визуально отличить его от та-
ких же других, рядом работающих устройств. Обычно этот параметр вклю-
чает постоянное мигание одного или нескольких световых LED-индикаторов
заданного сетевого устройства. После определения устройства, прервать ра-
боту команды # ethtool -p ethX можно нажав <Ctrl+c>.
N - Задаёт для параметра p длительность (в секундах) выполнения ми-
гания. Например, для 30 секунд:
# ethtool -p eth0 30
-r - перезапуск режима авто-согласования, если он доступен.
-S - запрашивает и отображает для указанного сетевого устройства
NIC- и драйвер-специфичную статистику.
-t - с помощью соответствующего сетевому устройству драйвера, вы-
полняет его само-тестирование. Возможные следующие режимы тестирова-
ния:
offline|online - , которые определяют тип теста: offline (по умолчанию)
означает выполнять полный комплекс тестов и в случае необходимости в те-
чении тестирования прерывать текущие операции адаптера. online означает
выполнять сокращенные тесты не прерывая текущие операции адаптера.
115
-s - параметр позволяет изменить некоторые или все установки для
указанного сетевого устройства. Все следующие параметры применяются в
том случае, если параметр-s был указан.
speed 10|100|1000 - Устанавливает скорость обмена данными в
Мбит/сек. Возможные значения скорости, поддерживаемые данным сетевым
устройством можно определить, вызвавethtool ethX.
duplex half|full - Устанавливает полу- или полный режим двусторон-
ней передачи данных.
port tp|aui|bnc|mii - Указывает порт для устройства.
autoneg on|off - Настраивает режим авто-согласования, если он под-
держивается данным устройством. Обычно этот режим включен, но в случае
возникновения проблем с некоторыми устройствами, вы можете его отклю-
чить.
Таким образом, решить проблему перенастройки режима работы сетевого
устройства, например, сразу во время загрузки операционной системы
можно, создав исполняемый файл-скрипт
/etc/rc.d/rc.local,
содержащий, к примеру, такие настройки:
#!/bin/sh
/usr/sbin/ethtool -s eth0 speed 10 duplex full autoneg off
----------
phyad N - PHY адрес.
xcvr internal|external - Позволяет задать тип приёмо-передатчика. В
настоящее время могут быть указаны только внутренний (internal) и внешний
(external) тип. В будущем, с появлением новых типов, они также будут здесь
добавлены.
wol p|u|m|b|a|g|s|d...
Устанавливает различные параметры "Пробуждения" (Wake-on-LAN)
устройства. Не все устройства поддерживают эту возможность. Аргументом
для этого параметра является строка символов, задающая активизируемые
функции "Пробуждения":
p - при физической активности
u - при получении unicast сообщения
m - при получении multicast сообщения
b - при получении broadcast сообщения
a - при получении ARP запроса
g - при получении MagicPacket(tm)
s - Активировать SecureOn(tm) пароль для MagicPacket(tm)
d - Отключить все функции "Пробуждения". Этот параметр очищает
все предыдущие настройки "Пробуждения".
sopass xx:yy:zz:aa:bb:cc
Устанавливает SecureOn(tm) пароль. Аргумент для этого параметра
должен состоять из 6 байт в формате ethernet MAC (xx:yy:zz:aa:bb:cc).

116
msglvl N - Установка уровня информативности сообщений драйвера.
Может быть задан различный уровень для каждого драйвера.
11.2. Утилиты для диагностики и мониторинга работы сети.
Команда ping.
Команда используется для посылки пакетов ICMP ECHO_REQUEST се-
тевым хостам.
Команда ping имеет следующий синтаксис:
ping [-AaDdfnoQqRrv] [-c число_пакетов] [-i секунд] [-l preload] [-M mask
| time]
[-m ttl] [-P policy] [-p pattern] [-S src_addr] [-s packetsize]
[-t timeout] [-z tos] host
ping [-AaDdfLnoQqRrv] [-c число_пакетов] [-I iface] [-i секунд] [-l preload]
[-M mask | time] [-m ttl] [-P policy] [-p pattern] [-S src_addr]
[-s packetsize] [-T ttl] [-t timeout] [-z tos] mcast-group
Команда ping использует датаграмму ECHO_REQUEST протокола
ICMP, чтобы вызвать ответ ICMP ECHO_RESPONSE указанного хоста или се-
тевого шлюза. Если хост отвечает, ping выдает сообщение, что хост включен
(хост is alive), в стандартный выходной поток.
Для проверки наличия хоста в сети достаточно ввести команду ping с
аргументом - именем или адресом хоста:
#ping yandex.ru
Для отправки определенного числа пакетов необходимо указать опцию
-c число_пакетов. Для установки интервала между отправкой пакетов исполь-
зуется опция -i секунд.
Утилита traceroute.
Команда traceroute служит для отладки сетевых соединений посред-
ством построения маршрута следования пакетов к хосту назначения. Для этой
команды также работает параметр -n, при использовании которого IP-адреса
не будут заменяться символьными именами хостов.
Пример следования пакетов до хоста ya.ru:
# traceroute ya.ru
Утилита netstat.
Команда используется для показа состояния сети.
Команда netstat имеет следующий синтаксис:
netstat [-AaLnSW] [-f protocol_family | -p protocol] [-M core] [-N system]
Команда netstat показывает содержимое различных структур данных,
связанных с сетью, в различных форматах в зависимости от указанных опций.
Первая форма команды показывает список активных сокетов (sockets) для
каждого протокола. Вторая форма выбирает одну из нескольких других сете-
вых структур данных. Третья форма показывает динамическую статистику
пересылки пакетов по сконфигурированным сетевым интерфейсам; аргумент
интервал задает, сколько секунд собирается информация между последова-
тельными показами.
-p имя_протокола Ограничить показ статистики или адресов управляю-
щих блоков только протоколом с указанным именем_протокола, например, tcp.
117
Опции:
– показывать состояние всех сокетов; обычно сокеты, используемые сервер-
-a
ными процессами, не показываются.
– показывать адреса любых управляющих блоков протокола, связанных с со-
-A
кетами; используется для отладки.
– показывать состояние автоматически сконфигурированных (auto-
-i configured) интерфейсов. Интерфейсы, статически сконфигурированные в си-
стеме, но не найденные во время загрузки, не показываются.
– показывать сетевые адреса как числа. netstat обычно показывает адреса
-n
как символы. Эту опцию можно использовать с любым форматом показа.
– показать таблицы маршрутизации. При использовании с опцией -s, показы-
-r
вает статистику маршрутизации.
– показать статистическую информацию по протоколам. При использовании
-s
с опцией -r, показывает статистику маршрутизации.
– ограничить показ статистики или адресов управляющих блоков только ука-
занным семейством_адресов, в качестве которого можно указывать:
-f семейство_адресов inet Для семейства адресов AF_INET
unix Для семейства адресов AF_UNIX
– выделить информацию об указанном интерфейсе в отдельный столбец; по
умолчанию (для третьей формы команды) используется интерфейс с
-I интерфейс наибольшим объемом переданной информации с момента последней переза-
грузки системы. В качестве интерфейса можно указывать любой из интерфей-
сов, перечисленных в файле конфигурации системы, например, emd1 или lo0.
– Ограничить показ статистики или адресов управляющих блоков только
-p имя_протокола
протоколом с указанным именем_протокола, например, tcp.

Утилита host.
Команда host служит для получения доменной информации о хосте: IP-
адрес, MX-записи и другой информации, связанной с данным символьным
именем. Имя хоста указывается в качестве аргумента команды.
Пример работы команды:
#host yandex.ru
Вторым аргументом можно указать DNS-сервер, который будет исполь-
зоваться при получении этой информации:
#host yandex.ru ns1.aiya.ru
Утилита tcpdump.
Утилита tcpdump используется для мониторинга сети на канальном и
более высоких уровнях. Программа «слушает» на одним или нескольких сете-
вых интерфейсах и выводит дамп пакетов, проходящих через этот интерфейс.
Параметр -i задаёт имя сетевого интерфейса, на котором запускается
прослушивание. При просмотре захватываемых данных удобно использовать
ключ -l, который буферезует вывод построчно. Для этой команды также рабо-
тает параметр -n, при использовании которого IP-адреса не будут заменяться
символьными именами хостов. Пример работы команды:
#tcpdump -i eth0 -l -n
Для вывода расширенной информации о пакетах используются ключи -
v или -vv.
# tcpdump -i eth1 -l -n -vv
Для проверки удалённого порта, например, 80 используется паарметр
port:

118
# tcpdump -i eth1 -l -n -vv dst port 80
Утилита nmap.
Утилита nmap – сетевой сканер, с помощью которого можно определить
уязвимость удалённых хостов. Основное назначение этой программы – опре-
деление состояние портов удалённого хоста (закрыты они, открыты или забло-
кированны). Также программа может на основании собственной базы знаний
определить по поведению удалённого хоста, какая операционная система за-
пущена на нём.
Утилита iftop.
iftop — выводит информацию об активных сетевых соединениях, ско-
рость сетевой закачки/отдачи, мониторит трафик онлайн, разделяет трафик по
протоколам, интерфейсам и хостам. iftop аналогичен top по части использова-
ния сети.
Утилита jnettop.
jnettop визуализирует сетевой трафик аналогично iftop, осуществляет
мониторинг сетевой активности. Утилита для мониторинга трафика в реаль-
ном времени.
Утилита iptraf .
iptraf — утилита наблюдения за сетевыми интерфейсами, осуществляет
мониторинг трафик по всем TCP соединениям, приводит статистику по за-
грузке сетевых интерфейсов, по протоколам, по портам, по размерам пакетов.
Утилита bmon.
bmon — утилита для мониторинга нескольких сетевых интерфейсов в
режиме реального времени, поддерживает разные методы ввода/вывода и
фильтры, показывает загруженность сетевого интерфейса в виде графика, сум-
марная загрузка сетевого интерфейса выводится в виде таблицы.
Утилита bandwidthd.
bandwidthd — утилита для контроля трафика конечных пользователей,
строит сводные таблицы (html) и графики по каждому пользователю по IP и
по подсети с разбивкой по дням, неделям и месяцам.

Глава 12. Основы безопасности.


Общие рекомендации до безопасности системы.
Блокирование доступа с помощью фаервола
Одна из наиболее простых мер защиты сервера, которую стоит принять
всем пользователям – активация и настройка фаервола. Фаерволы выступают
в качестве барьера между общим сетевым трафиком и отдельным сервреом.
Они отслеживают входящий и исходящий трафик и решают, нужно ли пропу-
стить ту или иную информацию.
Это делается путем проверки трафика набором правил, установленных
пользователем. Как правило, для работы сервисов сервер использует только
несколько конкретных сетевых портов. Остальные порты не используются,

119
потому они должны быть надежно защищены фаерволом, который будет от-
казывать в доступе всем данным, поступающим на эти порты.
Это позволяет отбросить все неизвестные данные и даже установить
условия использования сервисов в некоторых случаях. Разумные правила фа-
ервола обеспечивают хорошую основу для защиты сервера.
Безопасное удаленное подключение к системе с помощью SSH
Для управления сервером, к которому нет локального доступа, нужно
будет использовать удаленное подключение. Стандартный и достаточно без-
опасный способ сделать это в системе Linux – использовать протокол SSH, что
значит «Secure Shell» (безопасная оболочка).
SSH позволяет выполнить сквозное шифрование, передать незашифро-
ванный трафик по защищенному соединению, использовать X-forwarding (гра-
фический интерфейс пользователя по сетевому соединению), и многое другое.
В принципе, если нет возможности установить локальное подключение или
использовать внеполосное управление, SSH становится главным способом
взаимодействия администратора с машиной.
Следите за обновлениями программного обеспечения и регулярно
обновляйте его.
Программные уязвимости постоянно обнаруживаются почти во всем ПО,
которое часто используется. Дистрибутива обычно делают хорошую работу в
соответствии с последними патчами безопасности и толкая эти обновления в
их хранилищах. Мейнтейнеры дистрибутивов проделывают серьезную работу,
работая с последними патчами безопасности и помещая эти обновления в со-
ответствующие репозитории.
Тем не менее, наличие в репозитории доступного обновления ПО не при-
несет серверу никакой пользы, если оно не будет скачано и установлено.
Будьте внимательны при загрузке программного обеспечения по не-
официальным каналам
Большинство пользователей стараются работать только с программным
обеспечением, доступным из официальных репозиториев их дистрибутивов, и
многие дистрибутивы прдлагают подписанные пакеты. Такому ПО можно до-
верять, сфокусироваться нужно на программном обеспечении, полученном из
неофициальных репозиториев.
В целом, пакетам дистрибутива или программному обеспечению, до-
ступным на официальном сайте проекта, можно доверять, но имейте в виду,
что если вы не проводите контрольную проверку каждой части программного
обеспечения самостоятельно, появляется определенная доля риска. Чаще
всего такой уровень риска считается приемлемым.
Ведите разумную политику безопасности пользователя
Существует ряд действий, которые можно выполнить, чтобы лучше за-
щитить систему при администрировании пользователей.
К примеру, можно отключить вход как root. Поскольку root-пользова-
тель существует только в POSIX-подобных системах, он является целью мно-
гих злоумышленников. Нужно отключить вход в систему как root после
настройки доступа sudo, также можно использовать команду su.
120
12.1. Использование утилит sudo и su управления для управления
правами пользователей
Утилита sudo (substitute user and do, подменить пользователя и выпол-
нить) позволяет строго определенным пользователям выполнять указанные
программы с административными привилегиями без ввода пароля суперполь-
зователя root. Если быть точнее, то команда sudo позволяет выполнять про-
граммы от имени любого пользователя, но, если идентификатор или имя этого
пользователя не указаны, то предполагается выполнение от имени суперполь-
зователя root.
Таким образом, использование sudo позволяет выполнять привилегиро-
ванные команды обычным пользователям без необходимости ввода пароля су-
перпользователя root . Список пользователей и перечень их прав по отноше-
нию к ресурсам системы может быть настроен оптимальным образом для обес-
печения комфортной и безопасной работы. Например, команда sudo в Ubuntu
Linux, используется в режиме, позволяющем выполнять любые задачи адми-
нистрирования системы без интерактивного входа под учетной записью root.
Настройки sudo довольно несложные, и, тем не менее, позволяют реали-
зовать гибкую систему распределения полномочий отдельных пользователей
в многопользовательской среде.
Командная строка sudo может быть использована в следующих форма-
тах:
sudo -h | -K | -k | -V
sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user]
[command]
sudo [-AbEHknPS] [-C num] [-g group] [-h host] [-p prompt] [-u user]
[VAR=value] [-i|-s] []
sudo -e [-AknS] [-C num] [-g group] [-h host] [-p prompt] [-u user] file
...
Параметры командной строки:
-A, --askpass - использовать вспомогательную программу для ввода пароля
-b, --background - выполнить команду в фоновом режиме
-C, --close-from=num - закрыть все дескрипторы файлов >= num
-E, --preserve-env - сохранить пользовательское окружение при выполнении ко-
манды
-e, --edit - редактировать файлы вместо выполнения команды
-g, --group=group - выполнить команду от имени или ID указанной группы
-H, --set-home - установить для переменной HOME домашний каталог указанного
пользователя
-h, --help - показать справку и выйти
-h, --host=host - выполнить команду на узле (если поддерживается модулем)
-i, --login - запустить оболочку входа в систему от имени указанного пользователя;
-K, --remove-timestamp - полностью удалить файл timestamp
-k, --reset-timestamp - объявить недействительным файл timestamp
-l, --list - показать список прав пользователя или проверить заданную команду; в
длинном формате используется дважды
-n, --non-interactive - автономный режим без вывода запросов пользователю
-P, --preserve-groups - сохранить вектор группы вместо установки целевой группы
-p, --prompt=prompt - использовать указанный запрос пароля
-S, --stdin - читать пароль из стандартного ввода
121
-s, --shell - запустить оболочку от имени указанного пользователя;
-U, --other-user=user - в режиме списка показывать права пользователя
-u, --user=user - выполнить команду (или редактировать файл) от имени или ID ука-
занного пользователя
-V, --version - показать сведения о версии и выйти
-v, --validate - обновить временную метку пользователя без выполнения команды -
прекратить обработку аргументов командной строки
Примеры использования команды sudo:
#sudo –l - отобразить список команд, доступных для выполнения теку-
щему пользователю. Кроме списка команд отображаются параметры среды,
которые будут применяться при их выполнении.
В данном формате вместо краткого синтаксиса для списка разрешенных
команд в виде (ALL : ALL) ALL отображается подробное описание прав поль-
зователя.
#sudo lshw -C network - отобразить информацию о сетевом оборудовании
с правами суперпользователя root
#sudo –l –U user1 - посмотреть список команд, доступных для выполнения
пользователю user1.
Для выполнения данной команды пользователь должен быть root или
иметь право на выполнение команды sudo -l, что обеспечивается настройками
утилиты sudo в файле /etc/sudoers
#sudo ipmitool sensor - выполнить команду ipmitool sensor с правами root.
#sudo su - выполнить команду su, т.е. создать сеанс суперпользователя
root
#sudo -i - запустить командную оболочку с правами суперпользователя
root. Для выполнения данной команды пользователь должен иметь право на
выполнение программы оболочки в среде sudo, например - /bin/bash
#sudo ls /usr/local/protected - получить список файлов каталога, доступ-
ного только root
#sudo -u user2 ls ~ - получить список файлов домашнего каталога пользо-
вателя user2
#sudo -u www vi ~www/htdocs/index.html - редактировать файл
~www/htdocs/index.html от имени пользователя www
#sudo -g adm view /var/log/syslog - просмотреть файл системного журнала,
доступного только суперпользователю root и членам группы adm
#sudo -u user1 -g users2 vi /home/users2/textfile.txt - редактировать текстовый
файл как пользователь user1, с принадлежностью к первичной группе users2
#sudo -E /usr/bin/firefox - запустить браузер firefox от имени суперпользо-
вателя root, сохранив параметры среды текущего пользователя. Возможность
выполнения команд с сохранением среды пользователя должна быть разре-
шена параметром SETENV в настройках файла конфигурации sudo
Файл конфигурации /etc/sudoers
Настройки sudo определяется содержимым файла /etc/sudoers. По-
скольку ошибочные данные в данном файле могут привести к серьезным про-
блемам доступа к ресурсам системы, рекомендуется выполнять его изменение
с помощью специального редактора sudoedit (в некоторых дистрибутивах -

122
visudo), который поддерживает функции проверки синтаксиса и значительно
снижает риск создания неработоспособной конфигурации sudo.
Содержимое файла /etc/sudoers определяет имена пользователей и групп,
перечень выполняемых программ, необходимость введения паролей, и неко-
торые другие настройки, связанные с формированием переменных окружения
при смене пользователя. Кроме данного файла, настройки sudo могут опреде-
ляться содержимым файлов из каталога /etc/sudoers.d, что позволяет структу-
рировать систему предоставления прав на использование sudo в виде набора
файлов с осмысленными именами, что полезно при большом количестве поль-
зователей и сложной системе разграничения прав. Имена файлов конфигура-
ций в каталоге /etc/sudoers.d могут быть любыми, но их содержимое должно
полностью соответствовать формату файла /etc/sudoers.
Синтаксис настроек в файле /etc/sudoers позволяет использовать специ-
альные псевдонимы (Alias-ы), с помощью которых значительно упрощается
как настройка, так и восприятие конфигурационной информации sudo.
В файле конфигурации /etc/sudoers возможно использование четырех
разновидностей псевдонимов:
User_Alias - списки пользователей, для которых настраивается политика использова-
ния sudo.
Runas_Alias - списки пользователей, от имени которых может быть задано выполне-
ние команд через sudo.
Host_Alias - списки узлов, с которых выполняется подключение к системе.
Cmnd_Alias - списки команд, использующиеся в настройках, выполняемых директи-
вами файла /etc/sudoers
Примеры:
Host_Alias ADMCOMPS = localhost, server, admin - определяет псевдоним AD-
MCOMPS, который определяет группу компьютеров с именами localhost,
server, admin.
Host_Alias MAILSERVERS = 192.168.0.100, smtp2 - определяет группу из двух
компьютеров с указанными IP и именем. Возможно использование адресов
подсетей.
User_Alias ADMINS = jsmith, admusr - определяет группу ADMINS, в которую
входят пользователи с именами jsmith иadmusr.
Аналогичным образом можно создать псевдонимы для различных набо-
ров команд, доступных для выполнения в sudo:
# Группа команд, для работы в сети, псевдоним Networking
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient,
/usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig,
/sbin/mii-tool
# Группа команд для управления установкой и удалением программ,
псевдоним SOFTWARE
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
# Группа команд для управления системными службами, псевдоним
SERVICES
Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
Аналогичным образом можно создать псевдонимы для групп команд,
выполнение которых делегируется одиночным или объединенных псевдони-
мами пользователей.
123
Основная часть настроек в файле /etc/sudoers задает правила, определя-
ющие, какие пользователи, каких компьютеров, какие команды могут выпол-
нять. Формат записей:
user MACHINE=COMMANDS
user - имена или псевдонимы пользователей.
MACHINE - имена или псевдонимы компьютеров
COMMANDS - секция команд, включающая имена или псевдонимы команд
и дополнительные параметры.
Обычно, в файле /etc/sudoers присутствует директива, разрешающая вы-
полнение пользователю root любых команд при любом подключении к си-
стеме:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
Аналогичным образом можно разрешить выполнение через sudo всех ко-
манд для пользователя, например, с именем user
user ALL=(ALL) ALL
При данной настройке, у пользователя будет запрашиваться пароль (его
личный, а не пароль суперпользователя root ). При необходимости, можно
настроить секцию команд таким образом, чтобы пароль не запрашивался, с ис-
пользованием параметра NOPASSWD:
user ALL=(ALL) NOPASSWD: /usr/bin/su, /usr/bin/drakxconf - пароль будет за-
прашиваться при выполнении пользователем user через sudo всех команд,
кроме su и drakxconf
Использование псевдонимов позволяет уменьшить необходимое число
записей для определения прав пользователей, которые могут подключаться к
системе с разных компьютеров и входить в разные группы:
ADMINS localhost=(ALL) NOPASSWD:ALL - разрешить группе пользователей,
определенной псевдонимом “ADMINS” выполнять любые команды при под-
ключении через петлевой интерфейс “localhost” без ввода пароля.
ADMINS ALL= NETWORKING, SOFTWARE - разрешить группе пользователей,
объединенных псевдонимом “ADMINS” выполнять группы команд, объеди-
ненные псевдонимами “NETWORKING” и “SOFTWARE”.
Для существующих в системе групп пользователей можно также разре-
шать выполнение отдельных команд или групп команд:
%users localhost=/sbin/shutdown -h now - разрешить локальным пользовате-
лям выключение компьютера.
%operators ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom - разре-
шить членам группы “operators” монтирование и размонтирование указанных
устройств.
%powerusers ALL=NETWORKING, NOPASSWD: /usr/bin/su - разрешить членам
группы “powerusers” выполнять команды группы “NETWORKING” с вводом
пароля и команду “su” без пароля.
Довольно часто возникает необходимость исключения разрешения на
выполнение отдельных команд из списка, объединенных псевдонимом. В этом
случае, перед именем команды или псевдонима ставится восклицательный
знак – !

124
ADMINS ALL= ALL, !NETWORKING - разрешить группе пользователей, объ-
единенных псевдонимом “ADMINS” выполнение всех команд, кроме команд,
объединенных псевдонимом “NETWORKING”.
В следующем примере, используется конфигурация команд, разрешаю-
щая выполнение через sudo для всех пользователей группы “ADMINS”, всех
команд, кроме команд смены оболочки:
ADMINS ALL= ALL, !/bin/bash, !/usr/bin/su
Кроме настроек доступа, в файле /etc/sudoers присутствуют директивы
Defaults, определяющие некоторые настройки путей исполняемых файлов и
создание переменных окружения при выполнении команд:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
По умолчанию, если интервал выполнения команд с использованием
sudo, не превышает 5 минут, то повторный ввод пароля не требуется. Однако,
это значение можно изменить, добавив значение timestamp_timeout в минутах:
Defaults timestamp_timeout=1
В данном случае, если команда sudo будет выполняться не позже, чем
через 1 минуту после ввода пароля для предыдущей команды, то повторно па-
роль запрашиваться не будет. Если значение “timestamp_timeout” сделать рав-
ным нулю, то пароль будет запрашиваться при каждом запуске sudo, если сде-
лать отрицательным (-1), - то повторный ввод пароля не будет запрашиваться
никогда.
Для исключения возможности выполнения sudo-команд при подключе-
нии через ssh без авторизации, по умолчанию, должна использоваться команда
“ssh –t “:
# Disable "ssh hostname sudo ", because it will show the password in clear.
# You have to run "ssh -t hostname sudo ".
#
Defaults requiretty
Для определения дополнительного каталога с файлами конфигурации
пользователей sudo используется директива:
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
Команда su.
Команда su (изменить пользователя - substitute user) позволяет изменить
"владельца" текущего сеанса (сессии) без необходимости завершать сеанс и
открывать новый.
команду можно применять для замены текущего пользователя на любого
другого, однако чаще всего она используется для получения рядовым пользо-
вателем прав суперпользователя (root). Последнее открывает доступ к любым
командам и ко всем частям системы. По этой причине su часто расшифровы-
вают (не совсем верно) как "супер юзер". Иногда ее также интерпретируют как
switch user - "переключить" пользователя.

125
Возможности команды su.
Самый простой и удобный способ изменить владельца текущей сессии
на другого (в том числе суперпользователя) - применить команду su.
Применение команды su гораздо безопасней, чем вход в систему с пра-
вами root. Это одинаково относится и к администратору многопользователь-
ской системы, так и к пользователю домашней однопользовательской ОС. Воз-
можностей для случайного или злонамеренного повреждения гораздо меньше,
если администратор входит в систему под аккаунтом рядового пользователя
(имеющего по умолчанию очень ограниченные системные привилегии) и вы-
полняет под этим аккаунтом задачи, не требующие прав суперпользователя.
Для решения же задач, требующих таковых прав (скажем, исправление си-
стемных файлов или управление пользователями), администратор уже приме-
няет команду su.
Особенно опасно работать как суперпользователь в Интернете. Вредо-
носные программы с удаленных компьютеров могут легко получить доступ к
важным системным файлам или командам.
На многопользовательских системах, не только работа под аккаунтом
суперпользователя, но и применение команды su должно быть сведено к необ-
ходимому минимуму, и применяться с осторожностью. Эта осторожность
означает:
1. Посторонние (не доверенные) лица не должны видеть никаких паро-
лей, вводимых после команды su.
2. Не оставлять без присмотра машины с открытым сеансом su.
3. По окончании работы в сеансе su немедленно закрывать его.
При работе с командой su в режиме настоящей консоли, исходная поль-
зовательская сессия не может, естественно, использоваться на той же машине
(так как сеанс su занимает весь экран монитора). Однако в режиме терминала,
например окна терминала в графическом режиме, сеанс su распространяется
только на команды, запущенные в этом окне, а все остальные окна, включая
другие окна терминалов, продолжают действовать под первоначальным поль-
зовательским аккаунтом.
Чтобы не набирать команду su много раз, с последующим вводом пароля,
удобно открыть один раз окно терминала с сеансом su, и не закрывать его до
конца работы, выполняя в нем все задачи, требующие администраторских
прав. Правда, это возможно только в случае, когда никто посторонний не
имеет физического доступа к данной машине.
Синтаксис.
Команда su, введенная без опций и аргумента, запросит у вас пароль су-
перпользователя, и, если вы введете правильный пароль, то получите права
root.
$su
Password:
[root@antony ~]#
Символ $ в приглашении командной строки изменился на #, что напоми-
нает о полученных привилегиях суперпользователя.
Того же эффекта можно было достичь при помощи команды
$ su root
126
Но это лишняя работа, ведь по умолчанию, когда аргумент не введен,
команда su считает, что это root.
Несмотря на получение прав root, вы остаетесь в своей пользовательской
домашней директории, о чем говорит команда:
# pwd
То есть вы остались тем же пользователем, только наделенным правами
суперпользователя. Поэтому не удивляйтесь, что некоторые директории и ко-
манды по-прежнему будут для вас закрыты (эти директории и команды опре-
деляются политикой безопасности вашего дистрибутива).
Дело в том, что вы сохранили не только свою домашнюю директорию,
но и свои переменные окружения (environmental variables), которые вовсе не
совпадают с таковыми суперпользователя (или других пользователей).
Важнейшей из переменных окружения является Путь - PATH. Когда вы
печатаете в командной строке какую-либо команду, командная оболочка
(шелл) начинает искать имя этой команды в директориях, перечисленных в
ваших Путях, и ищет, пока не найдет (если не находит, то выводит сообщение:
"команда не найдена").
Чтобы узнать свои Пути, следует применить команду:
$ echo $PATH
Через двоеточия перечислены директории, в которых шелл будет вести
поиск команд.
Команда su дает возможность стать полноценным суперпользователем,
не только получив его права, но и перейдя в его домашнюю директорию. Для
этого необходимо после команды su оставить пробел, а затем ввести символ
черты (-):
[student@test ~]$ su -
Password:
[root@test ~]#
Это позволяет одновременно получить права root и сменить рабочую ди-
ректорию на его, для проверки можно выполнить команду pwd:
[root@test ~]# pwd
/root
и убедимся, что под знаком тильды (~) на этот раз скрывается домашняя
директория суперпользователя - /root.
Вместе с домашней директорией суперпользователя, вы получаете и его
переменные окружения, в том числе и Пути.
Команда su и рядовые пользователи.
Введя после su аргумент логин другого пользователя, можно получить
права этого пользователя при условии знания его пароля:
[student@test ~]$ su user1
Опции команды su.
У команды мало опций, самой употребительной из которых является -c.
Опция -c
Эта опция позволяет сразу под нужным аккаунтом запустить нужное
приложение. Например, просмотреть директорию /boot:
[student@test ~]$ su -c 'ls /bin'

127
При использовании опции -c, как только команда, запущенная с ее по-
мощью, будет закрыта, или закончит свое действие, командная оболочка снова
вернется в первобытное состояние, то есть к первоначальному логину.
К недостаткам опции -c можно отнести неработающее автозавершение
при помощи клавиши TAB во время набора команд.
Опция -s, --shell (оболочка)
Позволяет для нужного пользователя запустить нужную командную
оболочку.
Опция -l, --login
То же самое, что уже знакомая черта после пробела. Позволяет перейти
в домашнюю директорию нужного пользователя.
Опция --help
Получение справочной информации.
Выход из команды su.
Выйти из su, то есть вернуться к первоначальному пользователю, можно
различными способами:
закрыть окно терминала, и открыть новое;
набрать в командной строке exit и нажать ENTER;
нажать клавиши CTRL+d.
выполнить команду su user1 или su – user1, в зависимости от ситуации,
для возвращения в первоначальный логин.
Если команда su применялась в виде su -, то можно в командной строке
ввести слово logout и нажать ENTER.
Во всех этих способах, при переходе от суперпользователя к первона-
чальному пользователю, никаких паролей не требуется.

12.2. Pluggable Authentication Modules (PAM).


PAM – это набор API для аутентификации пользователей. До появления
PAM такие приложения, как login (а также rlogin, telnet, rsh), искали имя поль-
зователя в файле /etc/passwd, сравнивали оба значения и выполняли аутенти-
фикацию пользователя по введённому им имени. Все приложения использо-
вали эти общие службы, хотя детали реализации и полномочия для их
настройки различались.
Затем разработчики приложений попытались создавать собственные
процессы. Для этого понадобилось разделить модули приложения и безопас-
ности (общий модуль безопасности мог использоваться всеми приложениями
и настраиваться как необходимо).
Механизм PAM объединяет множество низкоуровневых схем аутенти-
фикации в API высокого уровня, позволяющий создавать приложения, исполь-
зующие аутентификацию независимо от применяемой схемы аутентификации.

128
Принципиальным свойством PAM является динамическая настройка аутенти-
фикации при помощи файла /etc/pam.d или /etc/pam.conf.
PAM можно настроить так, чтобы запретить отдельным программам
аутентифицировать пользователей и уведомлять, когда они пытаются выпол-
нить аутентификацию. PAM-программы используют модули PAM (модули
аутентификации), которые для использования подключаются к приложениям
во время работы.
На рисунке 1 показаны основные этапы работы модуля PAM.

Рисунок 1. Библиотека PAM обрабатывает файл pam.d и загружает


соответствующие модули
Операционные системы, поддерживающие PAM
PAM был разработан Sun Microsystems в 1995 году и поддерживается
следующими версиями операционных систем (и более новыми):
RedHat 5.0
SUSE 6.2
Debian 2.2
Mandrake 5.2
Caldera 1.3
TurboLinux 3.6
Также PAM поддерживается новыми версиями Solaris™, AIX®, HP-UX
и Mac OS® X. Позже PAM был стандартизирован в рамках процесса стандар-
тизации X/Open UNIX® (в составе архитектуры службы X/Open single sign-on
(XSSO)).
Реализации PAM
Хотя строгая классификация отсутствует, можно сказать, что суще-
ствует три реализации PAM:
Linux-PAM: охватывает все типы PAM, обсуждаемые в этой статье. Ос-
новная архитектура PAM на любой платформе Linux подобна версии Linux-
PAM.
OpenPAM - другая реализация PAM, разработанная Дагом-Эрлингом
Сморгравом (Dag-Erling Smorgrav) в NAI Labs, в рамках программы исследо-
ваний DARPA-CHATS. Поскольку это реализация с открытым кодом, она в
основном используется во FreeBSD, NetBSD и приложениях (а также в Mac OS
X).
Java™ PAM или JPam: PAM – это фактически стандартные модули
аутентификации с поддержкой Linux и UNIX. JPam выступает в качестве мо-
ста между кодом Java и обычными PAM. При помощи JPam приложения на
Java могут использовать модули PAM и связанные с ними средства (такие
как auth, account, passwd, session, и т. п.).
Несмотря на существование различных реализаций PAM их основная
функциональность остается одинаковой.
Из чего состоят модули PAM?
129
Установка PAM состоит из нескольких шагов.
Модули PAM классифицируются по типу модуля. Каждый модуль дол-
жен выполнять функции хотя бы одного из четырех типов:
Модуль аутентификации используется для аутентификации пользова-
телей или создания и удаления учетных данных.
Модуль управления учетными записями выполняет действия, связан-
ные с доступом, истечением учётных данных или записей, правилами и огра-
ничениями для паролей и т. д.
Модуль управления сеансами используется для создания и заверше-
ния сеансов.
Модуль управления паролями выполняет действия, связанные с изме-
нением и обновлением пароля.
PAM обеспечивает различные функциональные возможности, такие как:
аутентификация с однократной регистрацией, управление доступом и другие.
Их реализация обеспечивается различными модулями:
pam_access обеспечивает управление входом в систему в виде протоко-
лируемой службы при помощи имени пользователя и домена в зависимости от
правил, указанных заранее в файле /etc/security/access.conf.
pam_cracklib проверяет пароли на соответствие правилам для паролей.
pam_env sets/unsets устанавливает и сбрасывает переменные среды из
файла /etc/security/pam_env_conf.
pam_debug выполняет отладку PAM.
pam_deny блокирует модули PAM.
pam_echo выводит сообщения.
pam_exec выполняет внешнюю команду.
pam_ftp модуль для анонимного доступа.
pam_localuser проверяет наличие имени пользователя в файле
/etc/passwd.
pam_unix выполняет обычную аутентификацию на основе пароля из
файла /etc/passwd.
Существует множество других модулей
(pam_userdb, pam_warn, pam_xauth), перехватывающих набор возвращаемых
значений. Подробную информацию об этих модулях можно найти в Руковод-
стве по администрированию PAM в разделе.
Настройка PAM
Настройки PAM в основном сосредоточены в
файле /etc/pam.d или /etc/pam.conf (для старых версий).
Структура файла конфигурации
Для каждой службы, использующей PAM, в каталоге создаётся соответ-
ствующий файл, содержащий правила и инструкции о том, какая информация
об аутентификации или учётной записи должна быть предоставлена для этой
службы. Обычно каждая строка содержит одно правило.
Поля файла конфигурации PAM содержат следующую информацию:
Service_name указывает название службы или приложения. По умолча-
нию – OTHER.
Module_type указывает тип модуля (auth/account/session/passwd) для со-
ответствующей службы, указанной в поле Service_name.
130
Control_flag указывает дополнительное свойство для модуля. Оно мо-
жет принимать следующие значения: requisite (необходимый), required (требу-
емый), sufficient (достаточный) и optional (необязательный).
Module_path указывает путь к объекту библиотеки, использующемуся
в модуле. По умолчанию он имеет значение /lib/security.
Module_options/module_args (дополнительные поля) указывает пара-
метры или аргументы, которые могут быть переданы модулям службы.
Модули вызываются в том порядке, в котором они указаны в файле кон-
фигурации, в зависимости от значения поля Control_flag (Управляющий
флаг) для каждого модуля. Поле Control_flag принимает следующие значения:
required (требуемый): все требуемые модули в стеке должны вернуть
положительный ответ. Если один или несколько требуемых модулей вернут
отрицательный ответ, все требуемые модули будут выполнены, но запрос бу-
дет отвергнут.
sufficient (достаточный): если модуль помечен как достаточный и перед
ним ни один из необходимых или достаточных модулей не возвратил отрица-
тельного ответа, то все оставшиеся модули в стеке игнорируются, и возвраща-
ется положительный ответ.
optional (дополнительный): если в стеке нет требуемых модулей и ни
один из достаточных модулей не возвратил положительного ответа, то хотя бы
один из дополнительных модулей приложения или службы должен вернуть
положительный ответ.
Примеры конфигурационных файлов PAM
В таблице 1 приведены сведения о конфигурационных файлах PAM для
различных операционных систем:
Таблица 1. Конфигурационные файлы PAM
Операционная си- Расположен Тип Control_flag Модуль
стема в ...

Red Hat /etc/pam.d auth required /lib/security/pam_unix.so

Red Hat /etc/pam.d account sufficient /lib/security/pam_unix.so

Red Hat /etc/pam.d session required /lib/security/pam_limit.so

AIX /etc/pam.conf auth required /usr/lib/security/pam_aix

AIX /etc/pam.conf account required /usr/lib/security/pam_aix

AIX /etc/pam.conf password required /usr/lib/security/pam_aix

zSUSE 64-bit | 32-bit /etc/pam.conf auth required /lib64/security/pam_unix.so /lib/secu-


rity/pam_unix.so

zSUSE 64-bit | 32-bit /etc/pam.conf account required /lib64/security/pam_unix.so /lib/secu-


rity/pam_unix.so

zSUSE 64-bit | 32-bit /etc/pam.conf session required /lib64/security/pam_unix.so /lib/secu-


rity/pam_unix.so

Solaris /etc/pam.conf auth required /usr/lib/security/pam_unix.so.1

Solaris /etc/pam.conf account required /usr/lib/security/pam_unix.so.1

Solaris /etc/pam.conf password required /usr/lib/security/pam_unix.so.1

131
Операционная си- Расположен Тип Control_flag Модуль
стема в ...

HP-UX /etc/pam.conf auth required libpam_unix.so.1

HP-UX /etc/pam.conf account required libpam_unix.so.1

HP-UX /etc/pam.conf password required libpam_unix.so.1

Файл политик PAM «other»


Файл конфигурации политик PAM /etc/pam.d используется для указания
модулей аутентификации по умолчанию, то есть для тех приложений, о кото-
рых в файле конфигурации ничего не сказано явным образом. Он, вероятно,
является самым простым и надежным файлом конфигурации PAM по умолча-
нию. Внутри этого файла мы можем увидеть что-то подобное:
/etc/pam.d/other File
auth required pam_warn.so
auth required pam_deny.so
account required pam_warn.so
account required pam_deny.so
password required pam_warn.so
password required pam_deny.so
session required pam_warn.so
session required pam_deny.so
Этот файл устроен очень просто. Для всех типов модулей указано оди-
наковое значение Control_flag – required. Вызывается два модуля:
Вначале вызывается pam_warn.so для записи информации о текущей по-
пытке аутентификации.
Затем вызывается pam_deny.so, который просто возвращает отказ и за-
прещает все типы подключения или аутентификации.
Таким образом, все службы, использующие PAM, должны быть явно
настроены для разрешения аутентификации, иначе попытки будут отвергнуты.

10 шагов для создания простого PAM-приложения входа в систему


Эти 10 шагов помогут вам создать собственное PAM-приложение и по-
могут понять, как работает сеанс PAM:
Включите заголовочные файлы, необходимые для использования PAM
(например, pam_appl.h, pam_misc.h).
В функции main инициализируйте библиотеку PAM libpam.so (которая
загружает модули, указанные в файле конфигурации для приложения) при по-
мощи уникального идентификатора.
Попытайтесь выполнить аутентификацию для всех модулей и рассмот-
рите сценарии отказов.
Проверьте учётные данные пользователей и параметры учётных записей.
Откройте новый сеанс PAM.
Создайте среду для пользователя при помощи учётных данных.
По завершении работы пользователя закройте пользовательскую среду.
Закройте сеанс PAM.
Выйдите из библиотеки libpam.so с соответствующим идентификатором.
Выход.
132
Пример PAM файла для сервиса vsftpd.
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers
onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
Для большинства сервисов файл конфигурации для PAM создается ав-
томатически при его установке в систему, однако, при необходимости файл
может быть создан в ручную, либо и неиспользоваться PAM авторизация.

Настройка сложности и повторного использования пароля


В файле /etc/pam.d/system-auth можно настроить сложность и повтор-
ное использование пароля. Сложность пароля определяется сложностью ком-
бинации символов, использованных в пароле. Параметры повторного исполь-
зования пароля запрещают определенное количество паролей пользователя,
которые были использованы ранее. При установке сложности пароля можно
указать количество цифр, символов, заглавных и строчных букв, которое дол-
жен содержать пароль.
Если стандарты сложности пароля не выполнены, такой пароль не будет
принят системой.
• ucredit=-X – обязательное количество заглавных букв в пароле;
• lcredit=-X – обязательное количество строчных букв в пароле;
• dcredit=-X – количество цифр, которое должен содержать пароль;
• ocredit=-X – количество символов (*,-,!, и т.д.) в пароле.
Примечание: замените Х требуемым числом. Например:
password requisite pam_cracklib.so try_first_pass retry=3 type= ucredit=-2
lcredit=-2 dcredit=-2 ocredit=-2
• remember=X – параметр повторного использования паролей, где Х – ко-
личество ранее использованных паролей, которые нужно запретить.
Например:
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
remember=5
Пример конфигураций файла /etc/pam.d/system-auth:
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
133
account sufficient pam_succeed_if.so uid < 500 quiet
account required pam_permit.so
password requisite pam_cracklib.so try_first_pass retry=3 type= dcredit=-2 ucredit=-
2 lcredit=-2 ocredit=-2
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remem-
ber=5
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so

Ограничение количества неправильных попыток ввода пароля


Количество неправильных попыток ввода пароля устанавливается в
файле /etc/pam.d/password-auth.
Этот параметр задает количество неправильных попыток ввода пароля,
которое может совершить пользователь, прежде чем он будет заблокирован.
Позже системный администратор может разблокировать учетную запись.
Чтобы настроить количество неудачных попыток входа, добавьте две новые
строки в файл /etc/pam.d/password-auth.
Параметр deny=X задает разрешенное количество неудачных попыток,
прежде чем пользователь будет заблокирован (замените Х нужным числом).
auth required pam_tally2.so deny=3
account required pam_tally2.so
Пример конфигурации файла etc/pam.d/system-auth:
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth required pam_tally2.so deny=3
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so
account required pam_unix.so
account required pam_tally2.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 500 quiet
account required pam_permit.so
password requisite pam_cracklib.so try_first_pass retry=3 type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so

134
12.3. Security-Enhanced Linux (SELinux).
Security-Enhanced Linux (SELinux) — это система принудительного
контроля доступа, реализованная на уровне ядра. Впервые эта система появи-
лась в четвертой версии CentOS, а в 5 и 6 версии реализация была существенно
дополнена и улучшена. Эти улучшения позволили SELinux стать универсаль-
ной системой, способной эффективно решать массу актуальных задач. Стоит
помнить, что классическая система прав Unix применяется первой, и управле-
ние перейдет к SELinux только в том случае, если эта первичная проверка бу-
дет успешно пройдена.
Основные термины, использующиеся в SELinux:
Домен — список действий, которые может выполнять процесс. Обычно
в качестве домена определяется минимально-возможный набор действий, при
помощи которых процесс способен функционировать. Таким образом, если
процесс дискредитирован, злоумышленнику не удастся нанести большого
вреда.
Роль — список доменов, которые могут быть применены. Если какого-
то домена нет в списке доменов какой-то роли, то действия из этого домена не
могут быть применены.
Тип — набор действий, которые допустимы по отношения к объекту.

Тип отличается от домена тем, что он может применяться к пайпам, ка-


талогам и файлам, в то время как домен применяется к процессам.
Контекст безопасности — все атрибуты SELinux — роли, типы и до-
мены.
SELinux следует модели минимально необходимых привилегий для каж-
дого сервиса, пользователя и программы намного более строго. По умолчанию
установлен «запретительный режим», когда каждый элемент системы имеет
только те права, которые жизненно необходимы ему для функционирования.
Если же пользователь, программа или сервис пытаются изменить файл или по-
лучить доступ к ресурсу, который явно не необходим для решения их, то им
будет просто отказано в доступе, а такая попытка будет зарегистрирована в
журнале.
SELinux реализована на уровне ядра, так что прикладные приложения
могут совсем ничего не знать о версии этой системы принудительного кон-
троля доступа, особенностях её работы и т.д. В случае грамотной настройки,
SELinux никак не повлияет на функционирование сторонних программ и
135
сервисов. Хотя, если приложение способно перехватывать сообщения об
ошибках этой системы контроля доступа, удобство пользования таки прило-
жением существенно возрастает. Ведь в случае попытки доступа к защищен-
ному ресурсу или файлу, SELinux передает в основное приложение ошибку из
семейства «access denied». Но лишь немногие приложения используют полу-
чаемые от SELinux коды возврата системных вызовов.
Вот несколько примеров использования SELinux, которые позволяют
увидеть, каким образом можно увеличить степень безопасности всей системы:
• Создание и настройка списка программ, которые могут читать ssh-
ключи.
• Предотвращение несанкционированного доступа к данным через mail-
клиент.
• Настройка браузера таким образом, чтобы он мог читать в домашней
папки пользователя только необходимые для функционирования файлы
и папки.
Режимы работы SELinux.
SELinux имеет три основных режим работы, при этом по умолчанию
установлен режим Enforcing. Это довольно жесткий режим, и в случае необхо-
димости он может быть изменен на более удобный для конечного пользова-
теля.
Enforcing: Режим по-умолчанию. При выборе этого режима все дей-
ствия, которые каким-то образом нарушают текущую политику безопасности,
будут блокироваться, а попытка нарушения будет зафиксирована в журнале.
Permissive: В случае использования этого режима, информация о всех
действиях, которые нарушают текущую политику безопасности, будут зафик-
сированы в журнале, но сами действия не будут заблокированы.
Disabled: Полное отключение системы принудительного контроля до-
ступа.
Вы можете посмотреть текущий режим и другие настройки SELinux (а в
случае необходимости и изменить его) при помощи специального GUI-инстру-
мента, доступного в меню «Администрирование» (system-config-selinux). Если
же вы привыкли работать в консоли, то можете посмотреть текущий статус
командой sestatus.
Описание режимов работы SELinux.
SELinux по-умолчанию работает в режиме Enforcing, когда любые дей-
ствия, кроме разрешенных, автоматически блокируются, каждая программа,
пользователь или сервис обладают только теми привилегиями, которые необ-
ходимы им для функционирования, но не более того.
Это довольно жесткая политика, которая обладает как плюсами —
наибольший уровень информационной безопасности, так и минусами — кон-
фигурирование системы в таком режиме сопряжено с большими трудозатра-
тами системных администраторов, к тому же, велик риск того, что пользова-
тели столкнутся с ограничением доступа, если захотят использовать систему
хоть сколько-нибудь нетривиальным образом. Такой подход допустим в
Enterprise-секторе, но неприемлем на компьютерах конечных пользователей.

136
Многие администраторы просто отключают SELinux на рабочих станциях,
чтобы не сталкиваться с подобными проблемами.

Для того, чтобы избежать этого, для ключевых приложений и сервисов,


таких как, например, httpd, named, dhcpd, mysqld, определены заранее сконфи-
гурированные целевые политики, которые не позволят получить злоумышлен-
нику доступ к важным данным. Те же приложения, для которых политика не
определена, выполняются в домене unconfined_t и не защищаются SELinux.
Таким образом, правильно выбранные целевые политики позволяют добиться
приемлемого уровня безопасности, не создав при этом для пользователя лиш-
них проблем.
Контроль доступа в SELinux.
SELinux предоставляет следующие модели управления доступом:
Type Enforcement (TE): основной механизм контроля доступа, используемый в целе-
вых политиках. Позволяет детально, на самом низком уровне управлять разрешениями. Са-
мый гибкий, но и самый трудоемкий для системного администратора механизм.
Role-Based Access Control (RBAC): в этой модели права доступа реализуются в каче-
стве ролей. Ролью называется разрешения на выполнение определенных действий одним
или несколькими элементами системы над другими частями системы. По-сути, RBAC яв-
ляется дальнейшим развитием TE.
Multi-Level Security (MLS): многоуровневая модель безопасности, в которой всем
объектам системы присваивается определенный уровень доступа. Разрешение или запрет
доступа определяется только соотношением этих уровней.
Понятие контекста SELinux.
Процессы и файлы маркируются метками - контекстом SELinux, кото-
рый содержит информацию: пользователь SELinux, роль, тип и уровень (оп-
ционально). Когда SELinux включен, вся эта информация используется для
принятия решения о предоставлении доступа. В SELinux предоставляет соче-
тание ролевого управления доступом (Role-Based Access Control (RBAC), Type
Enforcement® (TE), и опционально многоуровневой модели безопасности,
Multi-Level Security (MLS).
В следующем примере показывается контект SELinux. Контекст
SELinux используется для процессов, пользователей Linux и файлов в опера-
ционной системе Linux, запущенной с SELinux. Используя команду ls -Z
можно увидеть контекст SELinux для файлов и директорий:
$ ls -Z file1
-rwxrw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1

137
В контексте SELinux используется следующий синтаксис SELinux
user:role:type:level:
Пользователь SELinux.
Пользователь SELinux - это сущность определённая в политике, кото-
рая отвечает за определённый набор ролей и за определённый набор MLS
уровней. Каждый пользователь Linux сопоставлен пользователю SELinux по-
средством политики SELinux. Это позволяет пользователям Linux наследовать
ограничения установленные на пользователей SELinux. Сопоставленные сущ-
ности пользователей SELinux используются в контексте SELinux для процес-
сов в сессии, в порядке определения для каких ролей и уровней они приме-
нимы. Для того, чтобы посмотреть сопоставление между пользователями
SELinux и Linux используется команда semanage login -l:
# /usr/sbin/semanage login -l
Login Name SELinux User MLS/MCS Range
__default__ unconfined_u s0-s0:c0.c1023
root unconfined_u s0-s0:c0.c1023
system_u system_u s0-s0:c0.c1023
Роль.
Роль - это часть модели безопасности Ролевого управления доступом
Role-Based Access Control (RBAC). Роль - это атрибут RBAC. Пользователи
SELinux, авторитетны для ролей, а роль авторитетна для доменов. Определён-
ная роль определяет какие домены могут быть доступны для пользователей с
этой ролью. Роль служит промежуточным звеном между доменами и пользо-
вателями SELinux. Роль, которой обладает пользователь, определяет в какие
домены может попасть пользователь - фактически, этот механизм управляет
доступностью объектов. Таким образом, уменьшается риск, связанный с уяз-
вимостью повышения привелегий в системе.
Тип.
Тип - это атрибут Type Enforcement. Тип определяет домен для процес-
сов и тип для файлов. Правила политики SELinux определяют как типы взаи-
модействуют друг с другом, является ли тип доменом, получающим доступ к
типу, или доменом, получающим доступ к другому домену. Доступ разреша-
ется, только если существует определенное правило политики SELinux позво-
ляющих данное действие.
Уровень.
Уровень - это атрибут многоуровневого управления доступом MLS и
MCS. Пространство MLS - это пара уровней, записанных в виде lowlevel-high-
level, если уровни в данной паре отличаются или, если не отличаются, то low-
level. То есть (s0-s0 то же самое, что и s0). Если дополнительно определены
категории, то уровень записывается как sensitivity:category-set. Если категории
не определены, то запись выглядит как sensitivity.
Управление SELinux.
system-config-selinux - графический интерфейс для управления настрой-
ками политик SELinux, который при наличии GUI можно сделать с помощью
команды:
#yum install policycoreutils-gui

138
Устранение проблем SELinux.
Рано или поздно происходит ситуация, когда вы сталкиваетесь с ситуацией, когда
SELinux запрещает вам доступ к чему-то. Есть несколько основных причин отказа доступа:
Неправильно маркированный файл.
Процесс работает в неправильном контексте
Ошибка в политике. Процесс требует доступ к файлу, который не был учтен при
создании политики.
Попытка вторжения.
Первые три причины отказа доступа разрешаются достаточно легко, в то время как
во время попытки вторжения звучит сигнал тревоги и пользователю посылается соответ-
ствующее уведомление.
Для того, чтобы разобраться с любой проблемой, достаточно просмотреть журнал
SELinux. По умолчанию он записывается процессом auditd в файл /var/log/audit/audit.log.
Если этот процесс не запущен, то SELinux ведет журнал в файле /var/log/messages, в этом
случае все сообщения системы контроля доступа маркируются ключом AVC, что позволяет
быстро отфильтровать нужные строки, например. при помощи команды grep.
В последние версии дистрибутивов (начиная с CentOS 5), включена утилита с гра-
фическим интерфейсом пользователя, которая позволяет отображать журнал SELinux в
удобном и понятном для пользователя виде. Вызвать её можно из консоли, набрав sealert -
b. Утилита входит в состав пакета setroubleshoot.
Основной конфигурационный файл SELinux.
Файл /etc/selinux/config - это основной главный конфигурационный файл SEL-
inux. Он определяет режим SELinux и используемую политику SELinux:
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
SELINUX=enforcing
Опция SELINUX устанавливает режим, в котором запущен SELinux.
SELinux запускается в трех режимах: enforcing, permissive, и disabled. Когда
используется режим enforcing, политика SELinux включена принудительно и
SELinux запрещает доступ, основываясь на правилах политики SELinux. Со-
общения о запретах доступа журналируются. Когда используется режим per-
missive, политика SELinux в разрешитиельном режиме. SELinux не отказывает
в доступе, но отказы журналируются как действия, которые были бы заблоки-
рованы, если SELinux запустить в режиме enforcing. Когда используется ре-
жим disabled, SELinux отключен (модуль SELinux не загружается с ядром
Linux), и используются только DAC правила контроля доступа.
SELINUXTYPE=targeted
Опция SELINUXTYPE устанавливает политику используемую SELinux.
Политика targeted используется по умолчанию. Эта опция изменяется только
в том случае, если необходимо использовать политику MLS. Для того, чтобы
использовать политику MLS, установите пакет selinux-policy-mls; установите
опцию SELINUXTYPE=mls в файле /etc/selinux/config; и перезагрузите опера-
ционную систему.
139
Изменение меток контекста безопасности файлов.
Команда «chcon» позволяет изменяет контекст SELinux для файлов или каталогов
точно таким же образом, как команды «chown» и «chmod» позволяют менять владельца
файла или права доступа к нему в рамках стандартной системы контроля доступа.
Восстановление контекста безопасности SELinux.
Команда «restorecon» позволяет изменить контекст безопасности на тот,
который был присвоен по-умолчанию.
Директория хранения контекста.
По умолчанию контексты для файлов находятся в файле
/etc/selinux/targeted/contexts/files/file_contexts.
Краткое описание основных пакетов SELinux:
policycoreutils: предоставляет утилиты, такие как semanage, restorecon,
audit2allow, semodule, load_policy и setsebool, для работы и управления SELinux.
policycoreutils-gui: предоставляет system-config-selinux, графический ин-
струмент для управления SELinux.
selinux-policy: предоставляет SELinux Refence Policy (Базовую Политику
SELinux). SELinux Reference Policy это полная политика SELinux, которая используется
как основа для других политик, таких как целевая SELinux targeted. За более подроб-
ной информацией можно обратиться к SELinux Reference Policy Tresys Technology. Па-
кет selinux-policy-devel предоставляет средства разработки, такие как
/usr/share/selinux/devel/policygentool и /usr/share/selinux/devel/policyhelp, а
также примеры политик. Этот пакет входит в состав пакета selinux-policy.
selinux-policy-policy: предоставляет политики SELinux. Для политики целевая
(targeted), установите selinux-policy-targeted. Для MLS установите selinux-policy-mls. В
Fedora 8, политика strict включена в политику targeted, позволяя ограниченным и не-
ограниченным пользователям, сосуществовать в пределах одной системы.
setroubleshoot-server: расшифровывает сообщения о запретах, вызванных
при запретах доступа SELinux, в детальные описания, которые можно просмотреть ко-
мандой sealert (предоставляемой в этом же пакете).
setools, setools-gui, и setools-console: эти пакеты от Tresys Technology SETools
distribution, предоставляют набор инструментов и библиотек для анализа и про-
смотра политик, мониторинга журнала аудита и отчетности, а также управления кон-
текстами файлов [8]. Пакет setools - это мета-пакет инструментария SETools. Пакет
setools-gui предоставляет набор инструментов apol, seaudit и sediffx. Пакет setools-
console предоставляет утилиты командной строки: seaudit-report, sechecker, sediff,
seinfo, sesearch, findcon, replcon, и indexcon. Дополнительная информация по данным
утилитам доступна по ссылке: Tresys Technology SETools.
libselinux-utils: предоставляет инструменты avcstat, getenforce, getsebool,
matchpathcon, selinuxconlist, selinuxdefcon, selinuxenabled, setenforce, togglesebool. Па-
кет устанавливается поумолчанию.
mcstrans: транслирует (переводит) значения уровней, такие как s0-s0:c0.c1023,
в доступную и легковоспринимаю форму, как SystemLow-SystemHigh. Этот пакет не
установлен по умолчанию.
Типы файлов.
Типы file_t и default_t.
Для файловых систем, поддерживающих расширенные атрибуты, при
запрос на доступ к файлу, у которого нет метки с контекстом SELinux, такой
файл трактуется, таким образом, как если ему назначен контекст SELinux по
умолчанию. В большинстве политик, такой контекст по умолчанию исполь-
зует тип file_t. Это должно быть единственным способом использования та-
кого типа, таким образом файлы без контекста могут быть определены для
140
политики и стать недоступными для ограниченных (confined) доменов. Тип
file_t не должен существовать на корректно маркированных файловых систе-
мах, потому что все файлы в операционных системах с включенным SELinux
должны иметь контекст SELinux и тип file_t никогда не должен использо-
ваться в конфигурации контекстов файлов.
Тип default_t используется для файлов, которые не принадлежат ни к
одному шаблону конфигурации контекста, таким образом, файлы могут быть
отделены от файлов, у которых нет контекста, и быть недоступными для огра-
ниченных доменов, если вы создаете новый каталог на уровне корня, такой как
/mydirectory/, то этот каталог будет помечен типом default_t. Если к этому
каталогу необходим доступ службам, измените файловый контекст для этого
каталога.
Логированние работы SELinux.
В RHEL/CentOS пакеты dbus, setroubleshoot-server и audit уста-
навливаются по умолчанию, если они не были исключены из списка ин-
сталляции при установке.
Сообщения о запретах доступа SELinux, по умолчанию записыва-
ются в /var/log/audit/audit.log.
Сообщения о запретах отправляются в различные расположения
файлов, в зависимости от того, какие демоны запущены:
Демон Расположение журналов
auditd on /var/log/audit/audit.log
auditd off; /var/log/messages
rsyslogd on
rsyslogd and /var/log/audit/audit.log. Сообщения о запретах в свободно-читаемой и
auditd on доступной форме направляются в /var/log/messages

Автоматический запуск демонов для аудита и логирования.


Для конфигурирования автоматического запуска демо-
нов auditd, rsyslogd, и setroubleshootd при загрузке системы, необходимо вы-
полнить следующие команды от пользователя root:
chkconfig --levels 2345 auditd on
chkconfig --levels 2345 rsyslog on
Для проверки работы служб аудита и логирования используется утилита ser-
vice или systemctl (CentOS 7):
service auditd status или systemctl status auditd
service rsyslog status или systemctl status rsyslog
Для запуска служб аудита и логирования так же используется утилита service
или systemctl (CentOS 7)::
service auditd start или systemctl start auditd
service rsyslog start или systemctl start rsyslog
Работа с утилитой semanage, формирование справочника по SELinux.
#Получение различной информации о политиках SELinux
#Получение информации об учетных записях (login) пользователей в SELinux:
semanage login -l
#Получение информации о пользователях SELinux:
semanage user –l
141
#Получение информации о портах SELinux
semanage port -l
#Получение информации об интерфейсах SELinux:
semanage interface –l
#Получение информации о модулях SELinux с указанием версии:
semanage module –l
#Получение информации о нодах SELinux:
semanage node -l
#Получение информации о контексте SELinux:
semanage fcontext -l
#Получение информации о переменных (переключателях) SELinux:
semanage boolean -l
#Получение информации о разрешенных типах SELinux:
semanage permissive -l
Управление переменными (переключателями):
# getsebool <name boolean>
# setsebool <name boolean> on|off
Пример:
# getsebool ftp_home_dir
ftp_home_dir --> off
# setsebool ftp_home_dir on
# getsebool ftp_home_dir
ftp_home_dir --> on
Рекомендуемые переменные для сервисов.
Apache HTTP Server
To allow access to NFS file systems (files labeled with the nfs_t type):
/usr/sbin/setsebool -P httpd_use_nfs on
To allow access to Samba file systems (files labeled with the cifs_t type):
/usr/sbin/setsebool -P httpd_use_cifs on
Samba
To export NFS file systems:
/usr/sbin/setsebool -P samba_share_nfs on
FTP (vsftpd)
To allow access to NFS file systems:
/usr/sbin/setsebool -P allow_ftpd_use_nfs on
To allow access to Samba file systems:
/usr/sbin/setsebool -P allow_ftpd_use_cifs on
Other Services
For a list of NFS related Booleans for other services:
/usr/sbin/semanage boolean -l | grep nfs
For a list of Samba related Booleans for other services:
/usr/sbin/semanage boolean -l | grep cifs

142
Глава 13. Протокол SSH
SSH (от англ. secure shell -- безопасная оболочка) это набор программ,
которые позволяют регистрироваться на компьютере по сети, удаленно выпол-
нять на нем команды, а также копировать и перемещать файлы между компь-
ютерами. SSH организует защищенное безопасное соединение поверх небез-
опасных каналов связи.
SSH предоставляет замены традиционным r-командам удаленного доступа с
тем отличием, что они обладают повышенной безопасностью. Они выполняются по-
верх защищенных зашифрованных соединений, которые не позволяет прослушивать
или подменять трафик. Кроме того, SSH может обеспечивать безопасное соединение
для передачи любого другого трафика: например, почтовых сообщений или файлов.
Основные функции SSH
Протокол SSH возник, как попытка обезопасить открытые незащищен-
ные соединения. Впоследствии его функции были значительно расширены.
Наиболее важными из них являются:
Безопасные команды доступа к хосту. SSH дает возможность выпол-
нять безопасные команды доступа к хосту, такие как ssh (удаленная оболочка),
slogin (удаленный вход в систему), scp (удаленное копирование);
X11 Forwarding. SSH предоставляет встроенный механизм для выполне-
ния удаленных клиентов X Window.
Port forwarding. SSH может выполнять переадресацию портов, переда-
вая трафик c одного порта одной машины на другой порт другой машины. При
этом передаваемый трафик шифруется;
Обеспечение безопасности SSH
Безопасность протокола достигается использованием нескольких реше-
ний, которые сводят к минимуму риск использования соединения:
Шифрование соединение, которое может выполняться одним из методов,
выбранных в процессе переговоров. Шифрованное соединение не позволяет
просто перехватить и использовать трафик. Выбор алгоритма шифрования де-
лает систему более гибкой, позволяя не использовать алгоритмы, в которых
обнаружены слабые места или которые не может поддерживать одна из сторон;
Аутентификация сервера выполняется при любом соединении. Это не
позволяет выполнить подмену сервера или подмену трафика;
Аутентификация клиента может выполняться одним из нескольких до-
ступных способов. Это с одной стороны может повысить надежность аутенти-
фикации, с другой -- делает систему более гибкой и упрощает ее использова-
ние;
Проверка целостности пакетов позволяет отследить любые незаконные
изменения в трафике соединения. При обнаружении таких изменений, соеди-
нение немедленно разрывается;
Временные параметры аутентификации не позволяют воспользоваться
данными соединения в том, случае, если спустя некоторое время после пере-
хвата оно все-таки было расшифровано. Устаревание обычно происходит че-
рез час;

143
Создание и установка асимметричных ключей SSH
Аутентификация с использованием открытых ключей проходит следую-
щим образом. Хост, на котором выполняется удаленная регистрация предла-
гает пользователю аутентифицировать себя. Для этого он пересылает сообще-
ние, зашифрованное известным ему открытым ключом пользователя. Если
пользователь расшифрует сообщение, значит он знает секретный ключ, следо-
вательно, является тем за кого себя выдает.
Секретные ключи хранятся в файлах identity, id_dsa и id_rsa в локальном
каталоге ~/.ssh (разные файлы для разных алгоритмов шифрования). Откры-
тые ключи должны быть в файлах authorized_keys и authorized_keys2 в ката-
логе ~/.ssh на удаленном компьютере, на котором производится регистрация.
В качестве домашнего рассматривается каталог пользователя, под именем ко-
торого выполняется регистрация. Файл authorized_keys используется для хра-
нения открытых ключей для SSH1, а в authorized_keys2 — для SSH2.
ssh дает возможность использования одного из трех различных алгорит-
мов асимметричного шифрования RSA или DSA.
Типы ключей
rsa1 -- Тип ключа RSA1, используемый в SSH версии 1
rsa -- Тип ключа RSA, используемый в SSH версии 2
dsa -- Тип ключа DSA, используемый в SSH версии 2

Для создания, преобразования и управления ключами аутентификации ис-


пользуется утилита ssh-keygen. Синтаксис программы:
ssh-keygen опции
Программа генерирует пару открытый ключ - секретный ключ. При этом
она спрашивает, в какие файлы нужно записать ключи. По умолчанию секрет-
ный ключ записывается в ~/.ssh/identity (или ~/.ssh/id_rsa, ~/.ssh/id_dsa), а от-
крытый в ~/.ssh/identity.pub.
Сгенерированный секретный ключ защищается при помощи парольной
фразы (passphrase), которую нужно обязательно знать, для того чтобы восполь-
зоваться ключом. Секретная фраза вводится в момент генерирования ключей.
Она может быть затем изменена, без повторного копирования ключей.
13.1. Настройка удалённого доступа к консоли.
При установке SSH-сервер автоматически прописывается в автозагрузку.
Проверить это можно командой для RHEL/CentOS 6:
#chkconfig --list ssh
Для RHEL/CentOS 7:
#systemctl status sshd
Основной файл конфигурации SSH-сервера — файл /etc/ssh/sshd_config,
доступный для чтения или редактирования только для пользователей с пра-
вами суперпользовател. После каждого изменения этого файла необходимо
перезапустить ssh-сервер для применения таких изменений.

Пример файла конфигурации деймона sshd.


sshd_confing

144
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options change a
# default value.
Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
# Disable legacy (protocol version 1) support in the server for new
# installations. In future the default will change to require explicit
# activation of protocol 1
Protocol 2
# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h
#ServerKeyBits 1024
# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
#LogLevel INFO
# Authentication:
#LoginGraceTime 2m
#PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
MaxSessions 10
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
AuthorizedKeysCommand none
AuthorizedKeysCommandRunAs nobody

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#RhostsRSAAuthentication no
# similar for protocol version 2
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# RhostsRSAAuthentication and HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!


#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication yes

# Change to no to disable s/key passwords


#ChallengeResponseAuthentication yes
145
ChallengeResponseAuthentication no

# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
#KerberosUseKuserok yes

# GSSAPI options
#GSSAPIAuthentication no
GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes
GSSAPICleanupCredentials yes
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no

# Set this to 'yes' to enable PAM authentication, account processing,


# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
#UsePAM no
UsePAM yes

# Accept locale-related environment variables


AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS

#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
#X11Forwarding no
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PrintMotd yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#UsePrivilegeSeparation yes
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#ShowPatchLevel no
#UseDNS yes
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
146
# no default banner path
#Banner none

# override default of no subsystems


Subsystem sftp /usr/libexec/openssh/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# ForceCommand cvs server

13.2. Рекомендуемые параметры безопасности.


Сам по себе, неправильно настроенный SSH-сервер — огромная уязвимость в
безопасности системы, т. к. у возможного злоумышленника есть возможность полу-
чить практически неограниченный доступ к системе. Помимо этого, у sshd есть
много дополнительных полезных опций, которые желательно включить для повы-
шения удобства работы и безопасности3).
Port, ListenAddress и AddressFamily
Эти три параметра определяют, на каких портах и адресах ваш сервер будет
ждать входящие соединения. Во-первых, имеет смысл по возможности ограничить
семейство обрабатываемых адресов реально используемыми, т. е. если вы использу-
ете только IPv4 — отключите IРv6, и наоборот. Сделать это можно при помощи па-
раметра AddressFamily, например (для разрешения IPv4 и запрета IPv6):
AddressFamily inet
Во-вторых, желательно сменить стандартный порт (22) на котором слушает
sshd. Это связано с тем, что многочисленные сетевые сканеры постоянно пытаются
соединиться с 22-м портом и как минимум получить доступ путем перебора логи-
нов/паролей из своей базы. Даже если у вас и отключена парольная аутентификация
— эти попытки сильно засоряют журналы и (в большом количестве) могут нега-
тивно повлиять на скорость работы ssh сервера. Если же вы по какой либо причине
не желаете изменить стандартный порт вы можете использовать как различные
внешние утилиты для борьбы брутфорсерами, например fail2ban, так и встроенные,
такие как MaxStartups.
Задать порт можно как абсолютным значением для всех интерфейсов при по-
мощи директивы Port, так и конкретным значением для каждого интерфейса, при
помощи директивы ListenAddress. Например:
Port 2002
или
ListenAddress 192.168.0.1:2003
ListenAddress 192.168.1.1:2004
Запрещение удаленного доступа для суперпользователя
По умолчанию root-доступ запрещен по паролю (по ключу - можно) -
опция PermitRootLogin установлена в without-password4). Но, при условии, что
по умолчанию в Ubuntu пользователь, добавленный при установке системы
имеет возможность решать все административные задачи через sudo, созда-
вать возможность root доступа к системе через ssh - выглядит неразумно (даже
при аутентификации по ключу). Рекомендуется совсем отключить эту опцию,
или применять ее только в режиме forced-commands-only. Отключить root-
доступ можно так:
PermitRootLogin no

147
Парольная аутентификация
Разрешенная по умолчанию парольная аутентификация является прак-
тически самым примитивным способом авторизации в sshd. С одной стороны
это упрощает конфигурацию и подключение новых пользователей (пользова-
телю достаточно знать свой системный логин/пароль), с другой стороны па-
роль всегда можно подобрать, а пользователи часто пренебрегают созданием
сложных и длинных паролей. Специальные боты постоянно сканируют до-
ступные из интернета ssh сервера и пытаются авторизоваться на них путем пе-
ребора логинов/паролей из своей базы. Настоятельно не рекомендуется ис-
пользовать парольную аутентификацию. Отключить ее можно так:
PasswordAuthentication no
Если по каким либо причинам вам все таки хочется использовать па-
рольную аутентификацию — позаботьтесь о том, чтобы никто не мог автори-
зоваться с пустым паролем. Для этого задайте директиву PermitEmptyPass-
words:
PermitEmptyPasswords no
Протоколы SSH1 и SSH2
Как уже было сказано, sshd может работать с протоколами SSH1 и SSH2.
При этом использование небезопасного SSH1 крайне не рекомендуется. Заста-
вить sshd работать только с протоколом SSH2 можно так:
Protocol 2
Аутентификация на основе SSH2 RSA-ключей
Наиболее предпочтительным способом авторизации является аутенти-
фикация на основе SSH2 RSA-ключей. При таком способе пользователь гене-
рирует на своей стороне пару ключей, из которой один ключ является секрет-
ным, а другой публичным. Публичный ключ копируется на сервер и служит
для проверки идентичности пользователя. Более подробно про создание пары
ключей и способы размещения их на сервере см. в описании SSH-клиента.
Включить аутентификацию по публичному ключу можно так:
PubkeyAuthentication yes
Сервер должен знать, где ему следует искать публичный ключ пользователя.
Для этого применяется специальный файл authorized_keys. Синтаксис его может
быть следующим:
# Коментарии записываются только с новой строки
# общий вид записей в файле authorized_keys
# [опции] тип_ключа(ssh-rsa или ssh-dss) очень_длинная_строка_непонят-
ная_простому_человеку [логин@хост]
ssh-rsa AAAAB3Nza...LiPk== user@example.net
from="*.sales.example.net,!pc.sales.example.net" ssh-rsa AAAAB2...19Q==
john@example.net
command="dump /home",no-pty,no-port-forwarding ssh-dss AAAAC3...51R==
example.net
permitopen="192.0.2.1:80",permitopen="192.0.2.2:25" ssh-dss AAAAB5...21S==
tunnel="0",command="sh /etc/netstart tun0" ssh-rsa AAAA...== jane@example.net
Можно указать как один общий файл с ключами, так и по файлу на каж-
дого пользователя. Последний способ является более удобным и безопасным,
т. к. можно во-первых указывать разные комбинации ключей для каждого
пользователя5), а во-вторых ограничить доступ к публичному ключу
148
пользователя. Задать файл с ключами можно при помощи директивы Author-
izedKeysFile:
AuthorizedKeysFile %h/.ssh/my_keys
для схемы пользователь — файл
или
AuthorizedKeysFile /etc/ssh/authorized_keys
для схемы с общим файлом. По умолчанию SSH-клиент ищет ключи в файле
~/.ssh/authorized_keys .
Еще про безопасность
20 советов по безопасному использованию сервера OpenSSH FIXME
Дополнительные настройки
Пользователи и группы.
Если у вас на сервере «живет» много пользователей, а доступ через ssh вы
хотите разрешить только нескольким из них - вы можете использовать директивы
DenyUsers, AllowUsers, DenyGroups, и AllowGroups. Более подробно про эти дирек-
тивы см. комментарии в примере sshd_config.
Опции определения состояния соединения
По умолчанию из способов определения состояния соединения включен
только способ проверки TCP соединения — TCPKeepAlive, однако, sshd умеет опре-
делять состояния соединения и более удобными и безопасными способами. Подроб-
нее см. соответствующий раздел в примере sshd_config.
Производительность. MaxStartups
FIXME
Перенаправление портов
FIXME
Перенаправление X11
На сервере в файле /etc/ssh/sshd_config выставить параметр (по умолчанию
включено):
ForwardX11 yes
На клиенте в файле /etc/ssh/ssh_config выставить параметры (по умолчанию
выключено):
ForwardAgent yes
ForwardX11 yes
Запускать на клиенте можно так ssh yurauname@serverip firefox . Или сначала
заходим ssh yurauname@serverip потом запускаем, например sudo synaptic .
SFTP
В sshd по умолчанию встроен SFTP-сервер. Протокол SFTP (SSH File
Transfer Protocol) - SSH-протокол для передачи файлов. Он предназначен для
копирования и выполнения других операций с файлами поверх надёжного и
безопасного соединения. Как правило, в качестве базового протокола, обеспе-
чивающего соединение, и используется протокол SSH2. Для того чтобы вклю-
чить поддержку SFTP добавьте в sshd_config строку
Subsystem sftp /usr/lib/openssh/sftp-server
По умолчанию поддержка SFTP включена.

Глава 14. Процессы в операционной системе.


Процесс - это программа, выполняющаяся в оперативной памяти компь-
ютера. Реально, все гораздо сложней.

149
В многозадачной системе может быть запущено множество программ.
Каждая программа может запустить множество процессов (читай: подпро-
грамм). При этом в единственный момент на машине, выполняется только 1
процесс. То есть в единственный момент времени аппаратные ресурсы (про-
цессорное время, память, порт ввода/вывода) может использоваться только
единственным процессом.
Очередью, в которой процессу выделяется определенный аппаратный
ресурс, управляет планировщик. При этом, во время прерывания одного про-
цесса и запуска (возобновления) другого процесса, состояние процесса (вы-
полняемые действия, на каком этапе процесс приостановлен) запоминается и
записывается в область памяти. Планировщик в Linux - это часть ядра, отвеча-
ющая за указанную функциональность. В задачи планировщика так же входит
отслеживание и выделение запускаемым процессам определенного приори-
тета, чтобы процессы "не мешали" друг-другу работать, а так же распределе-
ние пространства памяти, чтобы пространство памяти одного процесса не пе-
ресекалось с пространством другого.
Все новые процессы порождаются клонированием какого-то уже имею-
щегося процесса, с помощью вызова системных функций clone(2) и fork(2)
(отforking - порождение). У нового (порожденного или дочернего) процесса
тоже окружение, что и у родителя, отличается только номер ID процесса (т.н.
PID).
Из вышесказанного может последовать логичный вопрос: если новый
процесс - всегда копия существующего, то каким образом в системе берется
самый первый из процессов?
Первый процесс в системе запускается при инициализации ядра. Данный
процесс называется - systemd и имеет PID=1. Это прородитель всех процессов
в системе.
Каждый запущенный процесс в любой момент времени находится в од-
ном из следующих состояний (которое называют еще статусом процесса):
• Активен (R=Running) – процесс находится в очереди на выполне-
ние, то есть либо выполняется в данный момент, либо ожидает вы-
деления ему очередного кванта времени центрального процессора.
• «Спит» (S=Sleeping) – процесс находится в состоянии прерывае-
мого ожидания, то есть ожидает какого-то события, сигнала или
освобождения нужного ресурса.
• Находится в состоянии непрерываемого ожидания (D=Direct) –
процесс ожидает определенного («прямого») сигнала от аппарат-
ной части и не реагирует на другие сигналы;
• Приостановлен (T) – процесс находится в режиме трассировки
(обычно такое состояние возникает при отладке программ).
• «Зомби» (Z=Zombie) – это процесс, выполнение которого завер-
шилось, но относящиеся к нему структуры ядра по каким-то при-
чинам не освобождены.
Одной из причин их появления в системе может быть следующая ситуа-
ция. Обычно освобождение структур ядра, относящихся к процессу,

150
выполняет процесс-родитель после получения от потомка сигнала о заверше-
нии. Но бывают случаи, когда родительский процесс завершается раньше до-
чернего.
Процессы, не имеющие родителя, называются "сиротами". "Сироты" ав-
томатически усыновляются процессом systemd, который и принимает сигналы
об их завершении. Если процесс-родитель или systemd по каким-то причинам
не может принять сигнал о завершении дочернего процесса, то процесс-пото-
мок превращается в "зомби" и получает статус Z.
Процессы-зомби не занимают процессорного времени (т. е. их выполне-
ние прекращается), но соответствующие им структуры ядра не освобождаются.
В некотором смысле это «мертвые» процессы. Уничтожение таких процессов
— одна из обязанностей системного администратора.
Так же, говоря о процессах в, можно выделить особый вид процессов -
демоны. Данный вид процессов работает в фоне (подобно службам в Windows),
без терминала и выполняет задачи для других процессов. Данный вид процес-
сов на серверных системах является основным.
Т.к. в большинстве случаев, демоны простаивают и ожидают поступле-
ния каких-либо данных, соответственно, нужны относительно редко, так что
держать их в памяти постоянно загруженными и расходовать на это ресурсы
системы нерационально. Для организации работы демонов придуман демон
inetdили его более защищенная модификация xinetd (eXtended InterNET
Daemon или расширенный Интернет демон). В функции inetd (Xinetd) можно
выделить:
• установить ограничение на количество запускаемых серверов (служб,
демонов)
• наблюдение за соединениями на определенных портах и обработка вхо-
дящих запросов
• ограничение доступа к сервисам на основе ACL (списков контроля до-
ступа)
Все процессы в системе, обмениваются между собой какой-либо инфор-
мацией. В ОС существует несколько видов можпроцессного обмена, а точнее
сказать средств межпроцессного взаимодействия (Interprocess Communication
- IPC), которые можно разбить на несколько уровней:
локальный (привязаны к процессору и возможны только в пределах ком-
пьютера);
-- каналы
• pipe (они же конвейеры, так же неименованные каналы), о них я
много рассказывал в прошлом посте, примером можно привести:
команда1 | команда2.По сути, pipe использует stdin, stdout и stderr.
• Именованные каналы (FIFO: First In First Out). Данный вид канала
создаётся с помощью mknod или mkfifo, и два различных процесса
могут обратиться к нему по имени.
Пример работы с fifo:
в первом терминале (создаем именованный канал в виде файла pipe и из
канала направляем данные с помощью конвейера в архиватор):
[root@proxy 1]# mkfifo pipe
[root@proxy 1]# ls -l

151
total 0
prw-r--r-- 1 root root 0 Nov 9 19:41 pipe
[root@proxy 1]# gzip -9 -c < pipe > out
во втором терминале (отправляем в именованный канал данные):
[root@proxy 1]# cat /path/to/file > pipe
в результате это приведет к сжатию передаваемых данных gzip-ом
-- сигналы
с терминала, нажатием специальных клавиш или комбинаций (например,
нажатие Ctrl-C генерирует SIGINT, а Ctrl-Z SIGTSTP);
ядром системы:
• при возникновении аппаратных исключений (недопустимых инструк-
ций, нарушениях при обращении в память, системных сбоях и т. п.);
• ошибочных системных вызовах;
• для информирования о событиях ввода-вывода;
• одним процессом другому (или самому себе), с помощью системного вы-
зова kill(), в том числе:
• из шелла, утилитой /bin/kill.
сигнал — это асинхронное уведомление процесса о каком-либо событии.
Когда сигнал послан процессу, операционная система прерывает выполнение
процесса. Если процесс установил собственный обработчик сигнала, операци-
онная система запускает этот обработчик, передав ему информацию о сигнале.
Если процесс не установил обработчик, то выполняется обработчик по умол-
чанию.
Все сигналы начинаются на «SIG…» и имеют числовые соответствия,
определяемые в заголовочном файле signal.h. Числовые значения сигналов мо-
гут меняться от системы к системе, хотя основная их часть имеет в разных
системах одни и те же значения. Утилита kill позволяет задавать сигнал как
числом, так и символьным обозначением.
Сигналы можно послать следующими способами:
-- разделяемая память
Разделяемую память применяют для того, чтобы увеличить скорость
прохождения данных между процессами. В обычной ситуации обмен инфор-
мацией между процессами проходит через ядро. Техника разделяемой памяти
позволяет осуществить обмен информацией не через ядро, а используя неко-
торую часть виртуального адресного пространства, куда помещаются и откуда
считываются данные.
После создания разделяемого сегмента памяти любой из пользователь-
ских процессов может подсоединить его к своему собственному виртуальному
пространству и работать с ним, как с обычным сегментом памяти.
-- очереди сообщений
В общих чертах обмен сообщениями выглядит примерно так: один про-
цесс помещает сообщение в очередь посредством неких системных вызовов, а
любой другой процесс может прочитать его оттуда, при условии, что и про-
цесс-источник сообщения и процесс-приемник сообщения используют один и
тот же ключ для получения доступа к очереди.
удаленный;
-- удаленные вызовы процедур (Remote Procedure Calls - RPC)
152
RPC — разновидность технологий, которая позволяет компьютерным
программам вызывать функции или процедуры в другом адресном простран-
стве (как правило, на удалённых компьютерах). Обычно, реализация RPC тех-
нологии включает в себя два компонента: сетевой протокол (чаще TCP и UDP,
реже HTTP) для обмена в режиме клиент-сервер и язык сериализации объектов
(или структур, для необъектных RPC).
-- сокеты Unix
Сокеты UNIX бывают 2х типов: локальные и сетевые. При использова-
нии локального сокета, ему присваивается UNIX-адрес и просто будет создан
специальный файл (файл сокета) по заданному пути, через который смогут со-
общаться любые локальные процессы путём простого чтения/записи из
него.Сокеты представляют собой виртуальный объект, который существует,
пока на него ссылается хотя бы один из процессов. При использовании сете-
вого сокета, создается абстрактный объект привязанный к слушающему порту
операционной системы и сетевому интерфейсу, ему присваивается INET-ад-
рес, который имеет адрес интерфейса и слушающего порта.
Управление процессами
Получение информации о процессе
Перед тем как управлять процессами, нужно научиться получать о про-
цессах необходимую информацию. В Linux существует псевдофайловая систе-
маprocfs, которая в большинстве дистрибутивов монтируется в общую ФС в
каталог /proc. У данной файловой системы нет физического места размещения,
нет блочного устройства, такое как жесткий диск. Вся информация, хранимая
в данном каталоге находится в оперативной памяти компьютера, контролиру-
ется ядром ОС и она не предназначена для хранения файлов пользователя. О
структуре данного каталога я написал в статье о файловой системе Linux. В
этой файловой системе дано достаточно много информации, чтобы узнать о
процессах и о системе в целом.
Но пользоваться данным каталогом очень не удобно, чтобы узнать о ка-
ком-либо процессе информацию, придется просмотреть кучу файлов и катало-
гов. Чтобы избавиться от ненужного труда, можно использовать существую-
щие утилиты ps и top для просмотра информации о процессах.
Чтобы получить список всех процессов, достаточно ввести команду:
# ps aux
Прокомментируем некоторые интересные моменты. Можно заметить,
что некоторые процессы указаны в квадратных скобках [ ] – это процессы, ко-
торые входят непосредственно в состав ядра и выполняют важные системные
задачи, например, такие как управление буферным кэшем [pdflush] и органи-
зацией свопинга [kswapd]. С ними лучше не экспериментировать – ничего хо-
рошего из этого не выйдет :). Остальная часть процессов относится к пользо-
вательским.
Какую информацию можно получить по каждому процессу (коммента-
рии к некоторым полям):
• PID, PPID – идентификатор процесса и его родителя.
• %CPU – доля процессорного времени, выделенная процессу.
• %MEM – процент используемой оперативной памяти.
153
• VSZ – виртуальный размер процесса.
• TTY – управляющий терминал.
• STAT– статус процесса:
• R – выполняется;
• S – спит;
• Z – зомби;
• < – Повышенный приоритет;
• + – Находится в интерактивном режиме.
• START – время запуска.
• TIME – время исполнения на процессоре.
Команда ps делает моментальный снимок процессов в текущий момент.
В отличии от нее, команда top - динамически выводит состояние процессов и
их активность в реальном режиме времени.
Пример вывода команды top:
14:32:49 up 35 days, 6:01, 4 users, load average: 0.65, 0.51, 0.49
Tasks: 432 total, 1 running, 431 sleeping, 0 stopped, 0 zombie
CPU0 : 1.6%us, 3.6%sy, 0.0%ni, 85.3%id, 9.2%wa, 0.0%hi, 0.3%si, 0.0%st
CPU1 : 0.9%us, 1.9%sy, 0.0%ni, 96.9%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
Mem: 1033596K total, 1016644K used, 16952K free, 82928K buffers
Swap: 2096376K total, 12632K used, 2083744K free, 478220K cached

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


2788 root 15 -5 0 0 0 S 2.0 0.0 404:43.97 md3_raid1
7961 root 20 0 5964 2528 1684 R 2.0 0.2 0:00.14 top
6629 root 20 0 8612 2884 2096 S 0.7 0.3 0:00.96 dovecot-auth
57 root 15 -5 0 0 0 S 0.3 0.0 4:36.10 kblockd/0
8703 ulogd 20 0 17700 4216 656 S 0.3 0.4 87:23.98 ulogd
11336 ldap 20 0 394M 15M 8292 S 0.3 1.5 5:29.28 slapd
25757 ldap 20 0 394M 15M 8292 S 0.3 1.5 5:11.71 slapd
10991 root 20 0 2188 1004 588 S 0.3 0.1 4:23.33 dovecot
1 root 20 0 1712 516 464 S 0.0 0.0 0:46.17 init
2 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT -5 0 0 0 S 0.0 0.0 0:05.92 migration/0
.....
2960 root 16 -4 1980 520 392 S 0.0 0.1 0:10.04 udevd
2993 dovecot 20 0 4412 1800 1476 S 0.0 0.2 0:00.00 pop3-login
2994 dovecot 20 0 4412 1800 1476 S 0.0 0.2 0:00.02 pop3-login
В верхней части вывода отображается астрономическое время, время,
прошедшее с момента запуска системы, число пользователей в системе, число
запущенных процессов и число процессов, находящихся в разных состояниях,
данные об использовании ЦПУ, памяти и свопа. А далее идет таблица, харак-
теризующая отдельные процессы. Число строк, отображаемых в этой таблице,
определяется размером окна: сколько строк помещается, столько и выводится.
Содержимое окна обновляется каждые 5 секунд. Список процессов мо-
жет быть отсортирован по используемому времени ЦПУ (по умолчанию), по
использованию памяти, по PID, по времени исполнения. Переключать режимы
отображения можно с помощью следующих клавиатурных команд:
• <Shift>+<N> — сортировка по PID;
• <Shift>+<A> — сортировать процессы по возрасту;
• <Shift>+<P> — сортировать процессы по использованию ЦПУ;
• <Shift>+<M> — сортировать процессы по использованию памяти;
• <Shift>+<T> — сортировка по времени выполнения.

154
С помощью команды <K> можно завершить некоторый процесс (его PID
будет запрошен), а с помощью команды <R> можно переопределить значение
nice для некоторого процесса.
Полезную информацию, так же, позволяет получить программа lsof, ко-
торая выдает список всех файлов, используемых сейчас процессами, включая
каталоги, занятые потому, что какой-либо процесс использует их в качестве
текущего или корневого; разделяемые библиотеки, загруженные в память; и т.
д.
Управление процессами в Linux
Каждому процессу при запуске устанавливается определенный приори-
тет, который имеет значение от -20 до +20, где +20 - самый низкий. Приоритет
нового процесса равен приоритету процесса-родителя. Для изменения приори-
тета запускаемой программы существует утилита nice. Пример ее использова-
ния:
[root@proxy 1]# nice [- adnice] command [args]
где adnice — значение (от –20 до +19), добавляемое к значению nice про-
цесса-родителя. Отрицательные значения может устанавливать только супер-
пользователь. Если опция adnice не задана, то по умолчанию для процесса-по-
томка устанавливается значение nice, увеличенное на 10 по сравнению со зна-
чением nice родительского процесса.
Команда renice служит для изменения значения nice для уже выполняю-
щихся процессов. Суперпользователь может изменить приоритет любого про-
цесса в системе. Другие пользователи могут изменять значение приоритета
только для тех процессов, для которых данный пользователь является владель-
цем. При этом обычный пользователь может только уменьшить значение при-
оритета. Поэтому процессы с низким приоритетом не могут породить "высо-
коприоритетных детей".
Как я уже писал, одним из средств управления процессами являются сиг-
налы. Некоторые сигналы можно сгенерировать с помощью определенных
комбинаций клавиш, но такие комбинации существуют не для всех сигналов.
Зато имеется команда kill, которая позволяет послать заданному процессу
(указав его PID) любой сигнал:
[root@proxy 1]# kill [-SIG] PID [PID..]
где SIG — это номер сигнала или наименование сигнала, причем если
указание сигнала опущено, то посылается сигнал 15 (SIGTERM — программ-
ное завершение процесса). Часто используется сигнал 9 (KILL), с помощью
которого суперпользователь может завершить любой процесс. Но сигнал этот
очень "грубый", если можно так выразиться, потому что он просто «убивает»
процесс, не давая ему времени на корректное сохранение всех обработанных
данных. Поэтому в большинстве случаев рекомендуется использовать сигналы
TERM или QUIT, которые завершают процесс более "мягко". Если процессу
необходимо как-то по-особенному реагировать на сигнал, он может зареги-
стрировать обработчик, а если обработчика нет, за него отреагирует система.
Два сигнала – 9 ( KILL ) и 19 ( STOP ) – всегда обрабатывает система.
Первый из них нужен для того, чтобы убить процесс наверняка (отсюда и
155
название). Сигнал STOP приостанавливает процесс: в таком состояниипроцесс
не удаляется из таблицы процессов, но и не выполняется до тех пор, пока не
получит сигнал 18 ( CONT) – после чего продолжит работу. В Linux сигнал
STOP можно передать активному процессу с помощью управляющего сим-
вола " ^Z ".
Обычные пользователи могут посылать сигналы только тем процессам,
для которых они являются владельцами. Если в команде kill воспользоваться
идентификатором процесса (PID), равным -1, то указанный в команде сигнал
будет послан всем принадлежащим данному пользователю процессам. Супер-
пользователь root может посылать сигналы любым процессам. Когда супер-
пользователь посылает сигнал идентификатору -1, он рассылается всем про-
цессам, за исключением системных. Если этим сигналом будет SIGKILL, то у
простых пользователей будут потеряны все открытые ими, но не сохраненные
файлы данных.
При обычном запуске процесс работает на переднем плане. то есть про-
цесс "привязывается" к терминалу, с которого он запущен, воспринимая ввод
с этого терминала и осуществляя на него вывод. Но можно запустить процесс
в фоновом режиме, когда он не связан с терминалом, для чего в конце команд-
ной строки запуска программы добавляют символ &.
В оболочке bash имеются две встроенные команды, которые служат для
перевода процессов на передний план или возврата их в фоновый режим. Ко-
манда fg переводит указанный в аргументе процесс на передний план, а ко-
манда bg — переводит процесс в фоновый режим. Одной командой bg можно
перевести в фоновый режим сразу несколько процессов, а вот возвращать их
на передний план необходимо по одному. Аргументами команд fg и bg могут
являться только номера заданий, запущенных из текущего экземпляра shell.
Возможные значения заданий можно увидеть, выполнив команду jobs.
При завершении сессии оболочка посылает всем порожденным ею про-
цессам сигнал "отбой", по которому порожденные ею процессы могут завер-
шиться, что не всегда желательно. Если вы хотите запустить в фоновом ре-
жиме программу, которая должна выполняться и после вашего выхода из обо-
лочки, то ее нужно запускать с помощью утилиты nohup:
[root@proxy 1]# nohup команда &
Запущенный таким образом процесс будет игнорировать посылаемые
ему сигналы (не игнорируются только сигналы SIGHUP и SIGQUIT).

Глава 15. Работа с пакетами приложений.


Yellowdog Updater, Modified (YUM) — открытый консольный мене-
джер RPM-пакетов. Позволяет облегчить каскадное обновление Linux систем
с отслеживанием взаимосвязей RPM-пакетов. Распространяется под лицен-
зией GNU.
Первоначально был разработан программистом Seth Vidal и группой во-
лонтёров. Для работы с YUM используется интерфейс командной строки,

156
однако существуют надстройки, предоставляющие графический интерфейс
для функциональности YUM.
Системные администраторы могут автоматизировать обновление ПО
используя ряд инструментов, таких как yum-updatesd, yum-updateonboot, yum-
cron, PackageKit.
YUM представляет собой оболочку для RPM, обеспечивающую работу
с репозиториями. Был создан для решения следующих задач:
• поиск пакетов в репозиториях
• установка пакетов из репозиториев
• установка пакетов из .rpm-файлов, с удовлетворением зависимо-
стей с помощью репозиториев
• обновление системы
• удаление ненужных пакетов
• даунгрейд пакетов
RPM (рекурсивный акроним RPM Package Manager — RPM — менеджер
пакетов; ранее раскрывался как Red Hat Package Manager — менеджер пакетов
Red Hat) обозначает две сущности: формат пакетов программного обеспечения
и программа, созданная для управления этими пакетами. Программа позволяет
устанавливать, удалять и обновлять программное обеспечение. RPM является
основным форматом пакетов в LSB.
Изначально разработанный компанией Red Hat для Red Hat Linux, RPM
стал использоваться во многих дистрибутивах Linux и был портирован на дру-
гие операционные системы: Novell NetWare (с версии 6.5 SP3), IBM AIX (с
версии 5) и прочие.
Для хранения файлов в формате RPM используется архивный контейнер
cpio, с использованием сжатия утилитой gzip. В более поздних версиях может
быть использован архиватор star и сжатие с помощью bzip2, LZMA или XZ.
Начиная с версии RPM 5.0 возможно использование архиватора XAR.
База данных RPM ведётся в каталоге /var/lib/rpm. Она состоит из одиноч-
ной базы данных (Packages), в которой хранится вся информация о пакетах, и
множества маленьких баз (__db.001, __db.002 и т. д.), которые служат для ин-
дексации и содержат в себе сведения о том, какие файлы менялись и создава-
лись при установке и удалении пакетов.
Если база данных несколько испортится (что может произойти, если
процесс установки или удаления был «убит» или закончилось место на раз-
деле), то её можно восстановить, введя команду rpm --rebuilddb.
Если база была уничтожена — рекомендуется достать копию из заранее
сделанного бэкапа или восстановить при помощи rpm -ivh --justdb по списку
пакетов, заранее полученному командой rpm -qa | sort. Возможны полуэври-
стические методы восстановления базы по списку файлов в пакетах репозито-
рия, из которого была установлена система, но лучше до этого не доводить.
Каждый пакет RPM имеет название, которое состоит из нескольких ча-
стей:
• Название программы
• Версия программы

157
• Номер релиза (количество раз пересборки программы одной и той
же версии). Также часто используется для обозначения дистрибу-
тива, под который собран этот пакет, например, mdv (Mandriva
Linux) или fc4 (Fedora Core 4).
• Архитектура, под которую собран пакет (i386, ppc и т. д.)
Собранный пакет обычно имеет такой формат названия:
<название>-<версия>-<релиз>.<архитектура>.rpm
Преимущества RPM над другими средствами управления и установкой
программного обеспечения:
• Лёгкость удаления и обновления программ
• Популярность: очень многие программы собираются именно в
RPM, поэтому нет необходимости собирать программу из исход-
ных кодов
• «Неинтерактивная установка»: легко автоматизировать процесс
установки/обновления/удаления
• Проверка целостности пакетов с помощью контрольных сумм и
GPG-подписей
• DeltaRPM, аналог патча, позволяющий обновить установленное
программное обеспечение с минимальной затратой трафика
• Возможность аккумуляции опыта сборщиков в spec-файле
• Относительная компактность spec-файлов за счёт использования
макросов
Основные недостатки:
• Макропакеты между дистрибутивами могут существенно разли-
чаться
• Раздробленность и несовместимость различных версий. Так, су-
ществуют проекты по разработке RPM 4 (rpm.org), RPM5
(rpm5.org), а также большое количество патчей на RPM в дистри-
бутивах. В частности, это приводит к:
• несовместимости spec-файлов между дистрибутивами (spec-файл
ALT Linux чаще всего невозможно собрать на Red Hat или SuSE
без значительных исправлений);
• несовместимости названий пакетных зависимостей при попытке
установить пакет от другого дистрибутива (например, зависимо-
сти в RPM сборки Connectiva создаются по другим правилам,
нежели в Mandriva).
Репозитории YUM – это хранилища программного обеспечения Linux
(упаковочные файлы RPM). Упаковочный файл RPM – это файл менеджера
пакетов Red Hat (Red Hat Package Manager), который позволяет быстро и легко
установить программное обеспечение на Red Hat/CentOS Linux. Репозитории
YUM содержат ряд упаковочных файлов RPM и позволяют загрузить и уста-
новить новое ПО на виртуальный выделенный сервер. Репозитории YUM мо-
гут содержать упаковочные файлы RPM локально (на локальном диске) или
удаленно (FTP, HTTP или HTTPS). Конфигурационные файлы YUM содержат

158
информацию, необходимую для поиска и успешной установки программного
обеспечения на сервер.
Наиболее популярные репозитории CentOS YUM:
• CentOS Official Repository
• EPEL
• RPMforge
• ElRepo
Преимущества установки ПО из репозиториев YUM:
• Простота управления программным обеспечением: очень просто
установить, обновить и удалить пакеты;
• Разрешение проблемы зависимостей ПО: зависимости программ
решаются автоматически;
• YUM является официальным менеджером пакетов Red Hat/CentOS.
Иногда необходимое программное обеспечение не доступно из
официального репозитория CentOS по умолчанию. В подобной си-
туации можно использовать дополнительные (неофициальные)
репозитории YUM, перечисленные выше. Иногда дополнительные
репозитории содержат более новые версии пакетов ПО, чем офи-
циальные репозитории CentOS.
Конфигурационный файл репозитория YUM
Новое программное обеспечение на Red Hat/CentOS Linux можно уста-
новить через консоль при помощи команды «yum install packagename». После
запуска данная команда сначала проверяет, существует ли конфигурационные
файлы YUM-репозитория в каталоге /etc/yum.repos.d/. Команда читает конфи-
гурационный файл каждого репозитория YUM, чтобы получить информацию,
необходимую для загрузки и установки нового программного обеспечения, а
также решает зависимости ПО и устанавливает необходимые упаковочные
файлы RPM.
Конфигурационный файл репозитория YUM должен:
• находиться в каталоге /etc/yum.repos.d/
• иметь расширение .repo, чтобы YUM мог распознать его
Доступные параметры конфигурационного файла YUM:
• Repository ID – уникальный идентификатор репозитория, состо-
щий из одного слова (пример: [examplerepo])
• Name – удобочитаемое для человека имя репозитория (пример:
name=Example Repository)
• Baseurl – URL каталога repodata. Можно использовать file://path
если репозиторий размещен локально, или же ftp://link, http://link,
https://link если он размещен удаленно — аутентификация HTTP
доступна по http://user:password@www.repo1.com/repo1 (пример:
baseurl=http://mirror.cisp.com/CentOS/6/os/i386/)
• Enabled – активация репозитория при выполнении обновления и
установки ПО (пример: enabled=1)

159
• Gpgcheck – активация/деактивация проверки сигнатуры GPG (при-
мер: gpgcheck=1)
• Gpgkey — URL ключа GPG (пример:
gpgkey=http://mirror.cisp.com/CentOS/6/os/i386/RPM-GPG-KEY-
CentOS-6)
• Exclude – список исключаемых пакетов(пример:
exclude=httpd,mod_ssl)
• Includepkgs – список включемых пакетов (пример: include=kernel)
Обязательные параметры конфигурационного файла YUM:
• Repository ID
• Name
• Baseurl
• Enabled
Создание конфигурационного файла YUM-репозитория
При помощи наиболее предпочтительного текстового редактора со-
здайте в каталоге /etc/yum.repos.d/ новый конфигурационный файл репозито-
рия YUM с расширением .repo. Чтобы создать новый файл при помощи редак-
тора «vi», запустите через консоль следующую команду:
vi /etc/yum.repos.d/example.repo
Внесение параметров репозитория YUM
Задайте параметры YUM-репозитория в только что созданном конфигу-
рационном файле репозитория YUM и сохраните изменения.
Пример конфигурационного файла YUM-репозитория
/etc/yum.repos.d/example.repo
[examplerepo]
name=Example Repository
baseurl=http://mirror.cisp.com/CentOS/6/os/i386/
enabled=1
gpgcheck=1
gpgkey=http://mirror.cisp.com/CentOS/6/os/i386/RPM-GPG-KEY-CentOS-6
YUM-репозиторий CentOS DVD ISO
YUM-репозиторий CentOS DVD ISO содержит огромное количество
программ (упаковочных файлов RPM), которые можно установить при по-
мощи мастера установки Red Hat / CentOS. Можно также использовать упако-
вочные файлы RPM из CentOS DVD ISO для создания YUM-репозитория Cen-
tOS DVD ISO. Таким образом, при помощи команды «yum install packagename»
на CentOS DVD ISO можно установить любое доступное ПО через консоль
даже после завершения работы мастера установки Red Hat/CentOS.
Файлы CentOS DVD ISO можно загрузить с http://mirror.centos.org/.
Нужно загрузить или передать файлы CentOS DVD ISO на VPS:
• Передача: если файлы CentOS DVD ISO уже загружены на другую
машину, следует передать их с этой машины на VPS через FTP или

160
SSH. Это можно сделать при помощи WinSCP (свободный SFTP-
клиент и FTP) и подобных ей программ.
• Загрузка: CentOS DVD ISO можно загрузить прямо на сервер,
набрав в консоли команду «wget» (пожалуйста, замените HTTP-
ссылку)
Монтирование CentOS DVD ISO
Чтобы просмотреть данные CentOS DVD ISO, нужно сначала установить
файлы в наиболее удобной точке системы. Обычно CD-ROM, USB-устройства
или файлы ISO устанавливаются в каталоге /mnt (если его можно свободно
использовать). Чтобы установить CentOS DVD ISO, запустите через консоль
следующую команду (пожалуйста, замените /path/to/iso и /mnt соответствую-
щими значениями)
mount -o loop /path/to/iso /mnt
Создание конфигурационного файла YUM-репозитория
Чтобы начать использовать созданный пользовательский репозиторий
YUM, нужно создать конфигурационный файл YUM-репозитория с расшире-
нием .repo, который нужно разместить в каталоге /etc/yum.repos.d/. Указания
по созданию конфигурационного файла YUM-репозитория приведены в пер-
вой главе данного руководства.
Пример конфигурационного файла YUM-репозитория CentOS DVD ISO
/etc/yum.repos.d/centosdvdiso.repo
[centosdvdiso]
name=CentOS DVD ISO
baseurl=file:///mnt
enabled=1
gpgcheck=1
gpgkey=file:///mnt/RPM-GPG-KEY-CentOS-6
Пользовательский репозиторий YUM
Иногда нужно создать пользовательский YUM-репозиторий (это удобно,
если VPS не имеет подключения к интернету). Пользовательский репозиторий
YUM можно создать из желаемого количества упаковочных файлов RPM.
Пользовательский репозиторий YUM содержит только те RPM-файлы, кото-
рые пользователь хочет включить в него.
Установка createrepo

Для создания пользовательского YUM-репозитория понадобится уста-


новить на сервер дополнительное программное обеспечение под названием
«createrepo». Данное ПО можно установить, запустив следующую команду че-
рез консоль:
yum install createrepo
Создание каталога репозитория
Нужно создать новый каталог, в котором будет содержать пользователь-
ский репозиторий YUM и все необходимые упаковочные файлы RPM. То
161
можно сделать через консоль при помощи следующей команды (замените имя
different /repository1 именем каталога на свое усмотрение):
mkdir /repository1
Помещение файлов RPM в каталог репозитория
Если файлов RPM на VPS еще нет, нужно передать их через FTP или
SSH; для этого используйте такое ПО как WinSCP (свободный SFTP-клиент и
FTP) и т.п. Можно также загрузить упаковочные файлы RPM прямо на VPS с
помощью команды «wget», запущенной через консоль(необходимо подключе-
ние к интернету).
Если файлы RPM уже есть на сервере, нужно скопировать и переместить
их в созданный в шаге 2 каталог. Можно переместить RPM-файлы при помощи
запущенной через консоль команды (замените /path/to/rpm и /repository1 соот-
ветствующими значениями):
mv /path/to/rpm /repository1
Файлы RPM можно скопировать через консоль с помощью следующей
команды (замените /path/to/rpm и /repository1 соответствующими значениями):
cp /path/to/rpm /repository1
Запуск createrepo
Команда createrepo просматривает каталог пользовательского репозито-
рия YUM (см. шаг 2) и создает в нем новый каталог repodata. Каталог repodata
содержит метаданные о созданном репозитории. Каждый раз, когда в пользо-
вательский репозиторий YUM вносятся дополнительные RPM-файлы, нужно
пересоздавать метаданные репозитория при помощи команды createrepo. Но-
вые метаданные репозитория можно создать, запустив команду через консоль
(замените /repository1 соответствующим значением):
createrepo /repository1
Создание конфигурационного файла YUM-репозитория
Чтобы начать использовать созданный пользовательский YUM-
репозиторий, нужно создать соответствующий конфигурационный файл с рас-
ширением .repo и поместить его в каталог /etc/yum.repos.d/.
Пример конфигурационного файла пользовательского YUM-
репозитория:

/etc/yum.repos.d/custom.repo
[customrepo]
name=Custom Repository
baseurl=file:///repository1/
enabled=1
gpgcheck=0
Работа с RPM пакетами
# rpm -e [ package ]
162
Удалить пакет package
# rpm -qa | grep httpd
Вывести список установленных в системе пакетов и отобрать, содержащие в
своем имени httpd
# rpm -qa
Вывести список всех установленных в системе пакетов
# rpm -qi [ package ]
Вывести информацию о пакете package
# rpm -ivh [package.rpm]
Установить пакет с выводом сообщений и прогресс-бара
# rpm -U [package.rpm]
Обновить пакет без изменений конфигурационных файлов, в случае отсут-
ствия пакета, он будет установлен
# rpm -ivh --nodeeps [package.rpm]
Установить пакет с выводом сообщений и прогресс-бара без контроля зависи-
мостей
# rpm -F [package.rpm]
Обновить пакет только если он установлен
# rpm -q [package] --whatprovides
Список предоставляемой функциональности
# rpm -q [package] --changelog
Вывести историю ревизий пакета
# rpm -q [package] --scripts
Отобразит скрипты, запускаемые при установке/удалении пакета
# rpm -qf /etc/httpd/conf/httpd.conf
Проверить какому пакету принадлежит указанный файл. Указывать следует
полный путь и имя файла
# rpm -qg "System Environment/Daemons"
Отобразить пакеты входящие в группу пакетов ( fedora, redhat )
# rpm -qc [package]
Вывести список конфигурационных файлов, входящих в пакет
# rpm -ql [package]
Вывести список файлов, входящих в пакет
# rpm -q [package] --whatrequires
Вывести список пакетов, необходимых для установки конкретного пакета по
зависимостям
# rpm -qp [package.rpm] -l
Отображает список файлов, входящих в пакет, но ещё не установленных в си-
стему
# rpm -Va

163
Проверить содержимое всех пакеты установленные в систему. Выполняйте с
осторожностью!
# rpm -ivh /usr/src/redhat/RPMS/`arch`/[package.rpm]
Установить пакет, собранный из исходных кодов
# rpm -Vp [package.rpm]
Проверить пакет, который ещё не установлен в систему
# rpm2cpio [package.rpm] | cpio --extract --make-directories *bin*
Извлечь из пакета файлы содержащие в своём имени bin
# rpm --import /media/cdrom/RPM-GPG-KEY
Импортировать публичный ключ цифровой подписи
# rpm --checksig [package.rpm]
Проверит подпись пакета
# rpm -qa gpg-pubkey
Проверить целостность установленного содержимого пакета
# rpm -V [package]
Проверить размер, полномочия, тип, владельца, группу, MD5-сумму и дату по-
следнего изменения пакета
# rpmbuild --rebuild [package.src.rpm]
Собрать пакет из исходных кодов
Средство управления пакетами - YUM
# yum list
Вывести листинг пакетов, установленных в системе
# yum clean headers
Удалить все заголовки файлов, которые система использует для разрешения
зависимостей
# yum clean [package]
Очистить rpm-кэш, удалив закачанные пакеты
# yum search [package]
Найти пакет в репозитории
# yum clean all
Очистить rpm-кэш, удалив закачанные пакеты и заголовки
# yum -y install [ package ]
Скачать и установить пакет
# yum update [package]
обновить пакет
# yum -y update
Обновить все пакеты, установленные в систему
# yum localinstall [ package.rpm ]
Попытаться установить пакет RPM и все зависимые от него пакеты, используя
ваши репозитории
164
# yum remove [package]
Удалить пакет
Установка пакета из исходных кодов:
1. Установить пакет разработчика для CentOs:
yum groupinstall "Development Tools"
2. Скачать архив пакета
3. Создать директорию для пакета и распаковать его туда.
4. Перейти в директорию с распакованным пакетом и выполнить ./configure
5. Утилита работает долго, в случае если необходимо выполнить подготовку
конфигурации к установке или выдаёт ошибку отсутствия файлов для конфи-
гурации.
6. Выполнить команду make и получить инструкцию по установке данного па-
кета.
7. Выполнить команду make с ключом получаем полученным на шаге 6.
8. После завершения произвести необходимые изменения в файлы конфигура-
ции и можно приступать к использованию пакета.

Глава 16. Архивирование данных.


Сжатие и архивация файлов с помощью Gzip, Zip и Tar.
Сжатие с помощью Gzip и Zip
Сжатые файлы занимают меньше места на диске и загружаются из сети
быстрее, чем большие, несжатые файлы. В Linux файлы можно сжать, исполь-
зуя свободно распространяемые утилиты сжатия Gzip или Zip.
Файлы сжатые этими утилитами по умолчанию, получают расширение .gz.
Команда Gzip создаёт сжатый файл с расширением .gz;
Gunzip извлекает сжатые файлы и удаляет файл .gz.
Чтобы сжать файл, используйте команду:
gzip {filename}.{ext}
Файл будет сжат и сохранён под именем {filename}.{ext}.gz.
Чтобы распаковать сжатый файл введите команду:
gunzip {filename}.{ext}.gz
Файл {filename}.{ext}.gz при этом удаляется и заменяется фай-
лом {filename}.{ext}.
Для обмена сжатыми файлами с пользователям не использующих Linux,
лучше использовать zip, чтобы избежать проблем совместимости. Red Hat
Linux может легко открыть zip или gzip файлы, но не Linux операционные
системы могут не справиться с файлами gzip.
Чтобы сжать файл с помощью zip, введите:
165
zip -r filename.zip files
В этом примере filename.zip определяет имя создаваемого файла, а files опре-
деляет какие файлы, будут включены в архив.
Чтобы извлечь содержимое файла zip, введите:
unzip filename.zip
При создании архива с помощью zip или gzip в создаваемый архив
можно добавлять несколько файлов (перечислив их через пробел) или цели-
ком содержимое директорией:
gzip filename.gz file1 file2 file3 /home/user/
В приведённом выше примере с помощью команды gzip в архив будут добав-
лены файлы file1, file2, file3 и содержимое каталога /home/user, и архив будет
сохранен под именем filename.gz.
Архивация с помощью Tar
Tar так же позволяет сохранять несколько файлов или содержимое ка-
талога или каталогов в одном файле. Это хороший способ создавать резервные
копии и архивы. Обычно файлы, созданные tar, имеют расширение .tar.
Чтобы создать архивный файл с помощью утилиты tar, введите:
tar -cvf filename.tar files/directories
В этом примере filename.tar определяет имя создаваемого файла,
а files/directories определяет какие файлы или каталоги вы хотите включить в
новый архив.
Для включаемых файлов или директориев можно использовать абсолют-
ные или относительные пути, разделив имена файлов или каталогов пробе-
лами.
Например, создадим архивный файл arx.tar используя абсолютные пути:
tar -cvf arx.tar /home/student /home/user1/work
В этом примере, утилита tar при создании архива arx.tar поместит все файлы
каталога /home/student и подкаталога /home/user1/work в файл архива arx.tar в
текущем рабочем каталоге.
Например, следующая команда:
tar -cvf arx1.tar file1.txt file2.txt file3.txt
поместит файлы: file1.txt, file2.txt и file3.txt в файл архива arx1.tar.
Для просмотра содержимого файла .tar используйте команду:
tar -tvf foo.tar
Чтобы извлечь содержимое файла .tar, используйте команду:
tar -xvf foo.tar
Эта команда не удаляет файл .tar, а извлекает содержимое .tar в текущий
рабочий каталог.
166
Команда tar автоматически не выполняет сжатия файлов. Для этого использу-
ются утилиты gzip или bzip2 с ключами -z и -j соответственно, например, для
создания архива с использованием сжатия утилиты gzip:
tar -czvf {filenames}.tar
Сжатые файлы обычно имеют расширение .tgz и сжимаются при помощи gzip.
Чтобы развернуть сжатый файл tar введите:
tar -xzvf foo.tgz

Глава 17. Менеджер логических томов LVM.


Основные понятия LVM.
Менеджер логических томов LVM (Logical Volume Manager) – это
способ распределения дискового пространства на каком либо носители по ло-
гическим томам,
главной особенностью является возможность изменения размера логического
тома в отличии от обычного раздела, тоесть прослойка между устройством
хранения и fc.
Физический том (physical volume) – устройство представляющееся
системе как один диск (жесткий диск или его раздел).
Группа томов (volume group) – набор физических томов в один объ-
ект.
Логический том (logical volume) – аналогичен разделу на не LVM си-
стемах, представляется как блочное устройство и может иметь файловую си-
стему.
LVM обычно используют там где нужна возможность динамического
изменения размера разделов на лету, например lvm применителен для vps
контейнеров, ведь у нас бывает необходимость увеличить или уменьшить
размер диска какой либо vps-ки (vps в iso принципиально не используем из за
скорости fc).
Физический том (physical volume)
В основе логического тома лежит блочное устройство — раздел или це-
лый диск. Устройство инициализируется как физический том. В начале тома
размещается специальная метка.
Метка LVM по умолчанию размещается во втором 512-байтном секторе.
По желанию ее можно разместить в любом из первых четырех секторов, что
позволяет томам использовать эти сектора параллельно с другими пользовате-
лями.
Метка определяет порядок устройств, так как очередность их обнаруже-
ния в процессе загрузки может меняться. Она не изменяется между перезагруз-
ками в пределах кластера.
Метка идентифицирует устройство как физический том, содержит слу-
чайный уникальный идентификатор (UUID), размер устройства (в байтах) и
расположение метаданных LVM на устройстве.
167
Метаданные LVM содержат настройки групп томов в системе. По умол-
чанию в секции метаданных каждого физического тома в группе хранится ко-
пия метаданных. Метаданные не занимают много места и хранятся в формате
ASCII.
В настоящее время LVM позволяет сохранить 1-2 копии метаданных в
каждом физическом томе. По умолчанию сохраняется одна копия. Задав число
копий один раз, его нельзя будет изменить. Первая копия хранится в начале
устройства — вскоре после метки. Вторая копия (если она существует) распо-
лагается в конце устройства. Если область в начале диска была случайно пе-
резаписана, вторая копия поможет восстановить метаданные.
Группа томов (volume group)
Физические тома объединяются в группы, что позволяет создать единое
дисковое пространство, из которого будет выделяться место для логических
томов.
В пределах группы пространство разделяется на блоки фиксирован-
ного размера — экстенты. Размер экстента является минимальным размером,
который может быть выделен тому. На уровне физических томов используется
понятие физических экстентов.
Логическому тому будут выделяться логические экстенты, размер кото-
рых равен размеру физических экстентов. То есть размер экстентов всегда
один и тот же для всех логических томов в группе. Группа томов определяет
соответствие логических экстентов физическим.
Логический том (logical group)
Группа состоит из логических томов. Существует три типа логических
томов: линейные, с чередованием и зеркальные.
Линейный том
Линейный том объединяет несколько физических томов. Например, при
наличии двух дисков размером 60 гигабайт можно создать логический том раз-
мером 120 гигабайт.
При создании линейного тома ему выделяется непрерывный диапазон
физических экстентов. Например, логические экстенты с 1 до 99 могут при-
надлежать одному физическому тому, а логические экстенты с 100 до 198 —
второму. С точки зрения приложения существует только одно устройство раз-
мером 198 экстентов.
Том с чередованием
При записи данных в логический том файловая система размещает их в
физических томах в его основе. Чередование позволяет повысить производи-
тельность при выполнении большого объема последовательных операций
ввода-вывода.
При чередовании данные последовательно распределяются между зара-
нее определенным числом физических томов, поэтому операции ввода и вы-
вода могут выполняться параллельно. В некоторых случаях производитель-
ность даже может сравниться с линейной организацией.

168
Зеркальный том
Зеркало содержит устройства с идентичными копиями данных. При за-
писи данных на одно устройство их копия также записывается на другое, что
облегчает восстановление в случае выхода из строя одного из устройств. В
случае сбоя одной составляющей зеркала логический том будет преобразован
в линейный и продолжит работу.
При создании зеркала LVM записывает копию данных в отдельный фи-
зический том. LVM позволяет создать несколько зеркал для логических томов.
LVM подразделяет зеркалируемое устройство на секции, размер кото-
рых обычно составляет 512 КБ и ведет журнал синхронизации секций с зерка-
лами. Журнал может храниться на диске (в таком случае он будет сохраняться
между перезагрузками) или временно находиться в памяти.

Снимки
LVM позволяет создавать снимки — виртуальные образы устройств в
любой момент, не прибегая к остановке служб. Если исходное устройство
было изменено после создания снимка, будет создана копия измененных дан-
ных, чтобы впоследствии можно было воссоздать состояние устройства.
Когда же используются снимки?
Если необходимо создать резервную копию логического тома, не оста-
навливая систему, данные в которой постоянно обновляются.
Для проверки целостности файловой системы исходного тома можно
выполнить fsck в файловой системе снимка.
Так как снимок доступен для чтения и записи, в его рамках можно те-
стировать приложения. При этом действительные данные остаются нетрону-
тыми.
В окружении виртуализации снимки виртуальных систем могут созда-
ваться для их последующей модификации и создания на их основе других гос-
тей.
Команды LVM.
vgcreate создания группы томов.
vgchange – a y активация группы томов.
vgchange –a n деактивация группы томов.
vgremove удаление группы томом.
vgextend добавление физических томов в группу томов.
vgreduce удаления физических томов.
vgdisplay информацию по группе.
vgexport разрегистрировать группу томов в системе.
vgmerge объединить группы томов.
vgrename переименовать группу томов.
vgs информация о группах томов.
vgscan поиск групп томов.
vgsplit переместить физический том в новую группу томов.
vgck проверить целостность группы томов.
lvdisplay информацию по созданным логическим томам.
lvcreate -LTTTG –nXXX создание логического тома XXX размером TTT.
lvchange изменить атрибуты логического тома.
lvremove удаление логических томов.
lvrename переименовать логический том.
lvextend -LXXG увеличение логических томов.
resize2fs увеличить размер файловой системы.
169
lvreduce -L-XXG уменьшение логических томов.
lvresize изменить размер логического тома.
lvscan список логических томов во всех группах томов.
lvs информация о логическом томе.
lvmdiskscan устройства которые могут быть использованы как физический том.
lvmsadc данные об активности использования LVM.
lvmsar отчёт об активности использования LVM.
pvcreate создание в начале диска дескриптор группы томов.
pvdisplay информацию по физическим томам.
pvmove передвигаю содержимое с 1 диска на 2
pvremove удалить метку LVM с физического тома.
pvresize изменить размер физического тома.
pvchange атрибуты физического тома.
pvdata информация о физическом томе.
pvs информация о физическом томе.
pvscan список всех физических томов.

Пример создания кэшируемого логического тома средствами lvm


Условие: в системе есть два медленных диска dev/sdb /dev/sdc и один быст-
рый диск /dev/sdd. Необходимо собрать логический том из двух медленных
дисков и добавить быстрый диск в качестве cache для созданного логического
тома.
Добавляем диски в lvm:
[root@test dev]# pvcreate /dev/sdb /dev/sdc /dev/sdd
Physical volume "/dev/sdb" successfully created
Physical volume "/dev/sdc" successfully created
Physical volume "/dev/sdd" successfully created
[root@test dev]#
Создаем volume group из двух медленных дисков:
[root@test dev]# vgcreate data_store /dev/sdb /dev/sdc
Volume group "data_store" successfully created
!Замечание, у вас уже может быть собранный логический том из медленных дисков,
поэтому первый шаг можно пропустить и просто добавить быстрый диск уже в имею-
щуюся volume group.
Добавляем в volume group быстрый диск:
[root@test dev]# vgextend data_store /dev/sdd
Volume group "data_store" successfully extended
[root@test dev]#
Проверим результат выполнения команды расширения volume group:
[root@test dev]# vgs
VG #PV #LV #SN Attr VSize VFree
data_store 3 0 0 wz--n- 59,99g 59,99g
Создадим раздел размером 30GB на двух медленных дисках, используя volume group.
[root@test dev]# lvcreate -n data -L 30GB /dev/data_store /dev/sdb /dev/sdc
Logical volume "data" created.
[root@test dev]#
170
Для использования возможности кэширования, необходимо создать два логических
раздела один будет использоваться для кэширования, второй для хранения метадан-
ных. Создаем логический раздел для кэширования данных:
[root@test dev]# lvcreate -n cache0 -L 10GB /dev/data_store /dev/sdd
Logical volume "cache0" created.
Создаем логический раздел для хранения метаданных. Важное замечание минималь-
ный размер для хранения метаданных 8MB.
[root@test dev]# lvcreate -n meta -L 16MB /dev/data_store /dev/sdd
Logical volume "meta" created.
Проверим результат создания логических томов на выбранной volume group.
Важное замечание тома для кэширования, должны находится в одной volume
group с логическим томом, для которого создаётся кэширование.
[root@test dev]# lvs -a
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
cache0 data_store -wi-a----- 10,00g
data data_store -wi-a----- 30,00g
meta data_store -wi-a----- 16,00m
[root@test dev]#
Для более удобного представления лучше воспользоваться командой lsblk:
[root@test dev]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 32,8M 0 rom
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 300M 0 part /boot
├─sda2 8:2 0 17,8G 0 part /
└─sda3 8:3 0 2G 0 part [SWAP]
sdb 8:16 0 20G 0 disk
└─data_store-data (dm-0) 253:0 0 30G 0 lvm
sdd 8:48 0 20G 0 disk
├─data_store-cache0 (dm-1) 253:1 0 10G 0 lvm
└─data_store-meta (dm-2) 253:2 0 16M 0 lvm
sdc 8:32 0 20G 0 disk
└─data_store-data (dm-0) 253:0 0 30G 0 lvm
[root@test dev]#
Создадим кэшируемый пул для нашего логического тома. Очень важное замечание!
При выборе томов для создания кэшевого пула Первым всегда указывается логический
том созданный для метаданных! Для кэшевого пула будет использоваться команда
lvconvert:
[root@test dev]# lvconvert --type cache-pool --poolmetadata /dev/data_store/meta
/dev/data_store/cache0
WARNING: Converting logical volume data_store/cache0 and data_store/meta to pool's data and metadata
volumes.
THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)

171
Do you really want to convert data_store/cache0 and data_store/meta? [y/n]: y
Converted data_store/cache0 to cache pool.
[root@test dev]#
Проверим результат выполнения конвертации с помощью команды lvs c клю-
чом –a:
[root@test dev]# lvs -a
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
cache0 data_store Cwi---C--- 10,00g
[cache0_cdata] data_store Cwi------- 10,00g
[cache0_cmeta] data_store ewi------- 16,00m
data data_store -wi-a----- 30,00g
[lvol0_pmspare] data_store ewi------- 16,00m
[root@test dev]#
Добавим созданный кэшевый пул в качестве кэша для нашего диского массива на
медленных дисках. Для этого будем использовать команду lvconvert. Важное замеча-
ние первым всегда указывается логический том созданных как кэшевый пул!
[root@test dev]# lvconvert --type cache --cachepool /dev/data_store/cache0
/dev/data_store/data
Logical volume data_store/data is now cached.
[root@test dev]#
Проверим результат выполнения конвертации:
[root@test dev]# lvs -a
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync
Convert
[cache0] data_store Cwi---C--- 10,00g 0,00 8,06 0,00
[cache0_cdata] data_store Cwi-ao---- 10,00g
[cache0_cmeta] data_store ewi-ao---- 16,00m
data data_store Cwi-a-C--- 30,00g [cache0] [data_corig] 0,00 8,06 0,00
[data_corig] data_store owi-aoC--- 30,00g
[lvol0_pmspare] data_store ewi------- 16,00m
[root@test dev]#
Для более удобного представления результатов работы по созданию кэшируемого
диска лучше использовать команду lsblk:
[root@test dev]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 32,8M 0 rom
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 300M 0 part /boot
├─sda2 8:2 0 17,8G 0 part /
└─sda3 8:3 0 2G 0 part [SWAP]

172
sdb 8:16 0 20G 0 disk
└─data_store-data_corig (dm-3) 253:3 0 30G 0 lvm
└─data_store-data (dm-0) 253:0 0 30G 0 lvm
sdd 8:48 0 20G 0 disk
├─data_store-cache0_cdata (dm-1) 253:1 0 10G 0 lvm
│ └─data_store-data (dm-0) 253:0 0 30G 0 lvm
└─data_store-cache0_cmeta (dm-2) 253:2 0 16M 0 lvm
└─data_store-data (dm-0) 253:0 0 30G 0 lvm
sdc 8:32 0 20G 0 disk
└─data_store-data_corig (dm-3) 253:3 0 30G 0 lvm
└─data_store-data (dm-0) 253:0 0 30G 0 lvm

Приложение A. Примеры работы с iptables.

Отобразить список правил с номерами строк.


#iptables -n -L -v --line-numbers
Отобразить INPUT или OUTPUT цепочки правил.
#iptables -L INPUT -n -v
#iptables -L OUTPUT -n -v --line-numbers
Примеры работы с ключами:
#iptables -F
#iptables -X
#iptables -t nat -F
#iptables -t nat -X
#iptables -t mangle -F
#iptables -t mangle -X
#iptables -P INPUT ACCEPT
#iptables -P OUTPUT ACCEPT
#iptables -P FORWARD ACCEPT
Где:
-F: Удалить (flush) все правила.
-X: Удалить цепочку.
-t table_name: Выбрать таблицу (nat или mangle) и удалить все правила.
-P: Выбрать действия по умолчанию (такие, как DROP, REJECT, или ACCEPT).
Удалить правила файрвола.
Чтобы отобразить номер строки с существующими правилами:
#iptables -L INPUT -n --line-numbers
#iptables -L OUTPUT -n --line-numbers
#iptables -L OUTPUT -n --line-numbers | less
#iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1
Получим список IP адресов. Удаление строки с указанным номером,
например, 3:
173
# iptables -D INPUT 3
Или найдем IP адрес источника (202.54.1.1) и удалим из правила:
#iptables -D INPUT -s 202.54.1.1 -j DROP
Чтобы добавить одно или несколько правил в цепочку, для начала
отобразим список с использованием номеров строк:
#iptables -L INPUT -n --line-numbers
Чтобы вставить правило между 1 и 2 строкой:
#iptables -I INPUT 2 -s 202.54.1.2 -j DROP
Проверим, обновилось ли правило:
# iptables -L INPUT -n --line-numbers
Восстанавление правил.
Через iptables-restore
# iptables-restore < /etc/iptables.rules
Устанавливаем политики по умолчанию.
Чтобы отбрасывать весь трафик:
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -P FORWARD DROP
# iptables -L -v -n
Блокировать только входящие соединения.
Чтобы сбрасывать все не инициированные вами входящие пакеты,
но разрешить исходящий трафик:
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -L -v -n
Сбрасывать адреса изолированных сетей в публичной сети.
# iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Список IP адресов для изолированных сетей:
10.0.0.0/8 -j (A)
172.16.0.0/12 (B)
192.168.0.0/16 (C)
224.0.0.0/4 (MULTICAST D)
240.0.0.0/5 (E)
127.0.0.0/8 (LOOPBACK)
Блокировка определенного IP адреса.
Чтобы заблокировать IP-адрес, например, 1.2.3.4:
# iptables -A INPUT -s 1.2.3.4 -j DROP
# iptables -A INPUT -s 192.168.0.0/24 -j DROP
Заблокировать входящие запросы порта.

174
Чтобы заблокировать все входящие запросы порта 80:
# iptables -A INPUT -p tcp --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP
Чтобы заблокировать запрос порта 80 с адреса 1.2.3.4:
# iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP
Блокировка доятупа в подсеть 192.168.220.0/24 по протоколу TCP:
# iptables -A OUTPUT -p tcp -d 192.168.220.0/24 -j DROP
Запись событий в журнал и сброс.
Чтобы записать в журнал движение пакетов перед сбросом:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Записать событие и сбросить (с ограничением на количество запи-
сей).
Чтобы не переполнить раздел раздутым журналом, ограничим ко-
личество записей с помощью -m. К примеру, чтобы записывать каждые
5 минут максимум 7 строк:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --
log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Отбрасывать или разрешить трафик с определенных MAC адре-
сов.
# iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP
## *разрешить только для TCP port # 8080 с mac адреса 00:0F:EA:91:04:07 * ##
# iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source
00:0F:EA:91:04:07 -j ACCEPT
Разрешить или запретить ICMP Ping запросы.
Чтобы запретить:
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
Разрешить для определенных сетей / хостов:
# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT
Разрешить только часть ICMP запросов:
### ** предполагается, что политики по умолчанию для входящих установ-
лены в DROP ** ###
# iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
## ** разрешим отвечать на запрос ** ##
# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
Открыть диапазон портов.
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT
Открыть диапазон адресов.
175
## разрешить подключение к порту 80 (Apache) если адрес в диапазоне от
192.168.1.100 до 192.168.1.200 ##
# iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range
192.168.1.100-192.168.1.200 -j ACCEPT
## пример для nat ##
# iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25
Закрыть или открыть стандартные порты.
Заменить ACCEPT на DROP, чтобы заблокировать порт.
## ssh tcp port 22 ##
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j AC-
CEPT
## cups (printing service) udp/tcp port 631 для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT
## time sync via NTP для локальной сети (udp port 123) ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j AC-
CEPT
## tcp port 25 (smtp) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT
# dns server ports ##
iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
## http/https www server port ##
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT
## tcp port 110 (pop3) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT
## tcp port 143 (imap) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT
## Samba file server для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j AC-
CEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j AC-
CEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j AC-
CEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j AC-
CEPT
## proxy server для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j AC-
CEPT
## mysql server для локальной сети ##
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

176
Ограничить количество параллельных соединений к серверу для
одного адреса. Для ограничений используется connlimit модуль. Чтобы
разрешить только 3 ssh соединения на одного клиента:
# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j RE-
JECT
Установить количество запросов HTTP до 20:
# iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-
mask 24 -j DROP

Приложение B. Примеры работы с firewalld.


firewalld - это обновленная оболочка управления netfilter, заменившая
привычный интерфейс iptables, в линейке продуктов RHEL/CentOS 7.

Запуск и остановка firewalld


Проверка статуса firewalld:
#systemctl status firewalld
Получение статуса используя утилиту firewall-cmd:
#firewall-cmd --state
Остановка firewalld:
#systemctl stop firewalld
Выключение автоматического запуска firewalld:

177
# systemctl disable firewalld
Запуск firewalld:
#systemctl start firewalld
Включение автоматического запуска firewalld:
#systemctl enable firewalld
Управление правилами firewalld.
Общий синтаксис для работы с правилами:
#firewall-cmd [опции] [зона] <правило>
* порядок следования параметров не важен.
где:
[опции] — дополнительные параметры для создаваемого правила, например -
-permanent — постоянное правило, то есть будет действовать после перезагрузки.
Данная опция является не обязательной.
[зона] — по умолчанию, правила создаются для зоны public. Для работы с кон-
кретной зоной ее необходимо указать, например, --zone=dmz. Данный параметр явля-
ется не обязательным.
<правило> — правило. Параметр обязательный.
Чтобы правила применялись, необходимо осуществлять перезапуск fire-
walld:
#firewall-cmd --reload
Работа с портами в firewalld.
Открыть порт 80:
#firewall-cmd --permanent --add-port=80/tcp
* где ключ --permanent — добавить постоянное правило (будет действовать по-
сле перезагрузки).
Добавить правило для определенной зоны:
#firewall-cmd --permanent --zone=external --add-port=80/tcp
Добавить диапазон портов:
#firewall-cmd --permanent --add-port=6500-6700/udp
Добавление сервиса.
Использование служб, вместо портов, повышает удобство управления
правилами за счет объединения нескольких портов в одну службу.
Посмотреть список доступных служб:
#firewall-cmd --get-services
Разрешить порт, например, для сервиса ntp:
#firewall-cmd --permanent --add-service=ntp
Создать собственную службу:
#firewall-cmd --permanent --new-service=name-service
* где name-service — произвольное имя создаваемой службы.
Добавить порт, например TCP 2200 к службе:
#firewall-cmd --permanent --service=name-service --add-
port=2200/tcp
178
Задать описание сервиса:
#firewall-cmd --permanent --service=name-service --set-short="Service
With This Name"
#firewall-cmd --permanent --service=name-service --set-descrip-
tion="Long Description For Service With This Name"

Создать правила, для созданной службы, например:


#firewall-cmd --permanent --add-service=name-service Rich-Rule
rich-rule позволяет создавать правила с условиями.
Например, разрешаем службу http с условием, что запросы будут с опре-
деленных IP-адресов (подсети 192.168.0):
#firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source
address="192.168.0.0/24" service name="http" accept'
Удаление правил.
Удаление правил, аналогично созданию, только вместо параметра --add
используется --remove, например --remove-port (удалит порт) или --remove-
service (службу).
Удалим правило для открытия 80-о порта:
#firewall-cmd --permanent --remove-port=80/tcp
Зоны firewalld.
В firewalld широко используется понятие зоны. Получить список всех
допустимых зон по-умолчанию:
# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
Назначение зон:
• drop - все входящие пакеты отбрасываются (drop) без
ответа. Разрешены только исходящие соединения.
• block - входящие соединения отклоняются (rejected) с
ответом icmp-host-prohibited (или icmp6-adm-prohibited). Разре-
шены только инициированные системой соединения.
• public - зона по-умолчанию. Зона для работы в обще-
ственных сетях, без доверия этим сетям и разрешены только опре-
деленные входящие соединения.
• external - зона для внешнего интерфейса роутера (т.н.
маскарадинг). Разрешены только определенные входящие соедине-
ния.
• dmz - зона DMZ, разрешены только определенные входя-
щие соединения.
• work - зона для рабочей сети, взаимодействие без взаим-
ного доверия окружению, но с более мягкими ограничениями. Раз-
решены только определенные входящие соединения.
• home - домашняя зона, с доверием окружению, но разре-
шены только определенные входящие соединения
179
• internal - внутренняя зона. Мы доверяем окружению, но
разрешены только определенные входящие соединения
• trusted - разрешено все.
Список всех активных зон:
#firewall-cmd --get-active-zones
Определить принадлежность заданного интерфейса зоне:
#firewall-cmd --get-zone-of-interface=<имя интерфейса>
Определить принадлежность интерфейсов зоне:
#firewall-cmd --zone=public --list-interfaces

Пример: добавить новый порт для сервиса, например, 2234.


Разрешить доступ к серверу сервису на порту 2234/tcp, вместо, например
1223/tcp.
Получить информацию о разрешенных соединениях:
#firewall-cmd --permanent --list-all
Отключение поддержки ipv6-client в определенной зоне:
#firewall-cmd --permanent --zone=public --remove-service=dhcpv6-cli-
ent
Разрешить на постоянной основе соединение на порт 2234/tcp:
# firewall-cmd --permanent --zone=public --add-port=2234/tcp
Перезапуск firewalld:
# firewall-cmd --reload
Выполнить проверку:
#firewall-cmd --zone=public --list-ports=2234/tcp
Важное замечание. Изменяя порт для сервиса, необходимо вмести изме-
нения в политики SELinux, для необходимо выполнить:
# semanage port -a -t <имя сервиса>_port_t -p tcp 2234
Маскарадинг (masquerade).
Проверить статус:
#firewall-cmd --zone=external --query-masquerade
Включить маскарадинг:
#firewall-cmd --zone=external --add-masquerade
Замечание. Masquerade может быть использован для любой другой зоны,
например, public и перенаправить входящие на 22 порт на другой хост:
#firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toaddr=192.168.1.23
Перенаправить входящие на 22 порт на другой хост с изменением порта
назначения (с 22 на 192.168.1.23:2055):
#firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:to-
port=2055:toaddr=192.168.1.23

180
Пример настройки NAT (шлюза).
Включить маскарадинг:
#firewall-cmd --permanent --zone=dmz --add-masquerade
* без указания зон, будет включен для public и external.
Для примера будем два ethernet интерфейса — en3s0 (внутренний) и
en8s0 (внешний). Для настройки nat выполним следующие команды:

#firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0


-o en8s0 -j MASQUERADE
* правило включает маскарадинг на внешнем интерфейсе en8s0. Где опция --
direct требуется перед всеми пользовательскими правилами (--passthrough, --add-
chain, --remove-chain, --query-chain, --get-chains, --add-rule, --remove-rule, --query-rule, --
get-rules); nat — таблица, в которую стоит добавить правило; POSTROUTING 0 — це-
почка в таблице nat; опция MASQUERADE указывает сетевому экрану менять внутрен-
ний IP-адрес на внешний.
#firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i
en3s0 -o en8s0 -j ACCEPT
* добавляет в таблицу filter (цепочку FORWARD) правило, позволяющее хожде-
ние трафика с ens32 на ens33.
#firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i
ens33 -o ens32 -m state --state RELATED,ESTABLISHED -j ACCEPT
* добавляет правило в таблицу filter (цепочку FORWARD), позволяющее хожде-
ние трафика с ens33 на ens32 для пакетов, открывающих новый сеанс, который связан
с уже открытым другим сеансом (RELATED) и пакетов, которые уже являются частью
существующего сеанса (ESTABLISHED).
#systemctl restart firewalld
* для того, чтобы сервер CentOS заработал в качестве шлюза, также необходимо
настроить ядро.
Для просмотра созданных данным способом правил используется ко-
манда:
#firewall-cmd --direct --get-all-rules
Запретить или разрешить трафик между интерфейсами.
Для примера будем использовать два внутренних сетевых интерфейса
en3s0 и en8s0.
Запретить трафик между интерфейсами. Применяется в случаях, когда
на сервере включен FORWARD, но необходимо блокировать трафик между
определенными сегментами сети:
#firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i
en3s0 -o en8s0 -j DROP
#firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i
en3s0 -o en8s0 -j DROP
Разрешить трафик между интерфейсами. Применяется в случаях, когда
интерфейсы находятся в зонах, где по умолчанию, трафик блокируется:
#firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i
en3s0 -o en8s0 -j ACCEPT
181
#firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i
en3s0 -o en8s0 -j ACCEPT
Разрешить трафик в одном направлении. Применяется, если необходимо
сделать так, чтобы, например, только сеть en3s0 видела сеть en8s0:
#firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i
en3s0 -o en8s0 -j ACCEPT
Разные полезные команды:
Включить режим блокировки всех исходящих и входящих пакетов:
#firewall-cmd --panic-on
Выключить режим блокировки всех исходящих и входящих пакетов:
#firewall-cmd --panic-off
Узнать, включен ли режим блокировки всех исходящих и входящих па-
кетов:
#firewall-cmd --query-panic
Перезагрузить правила firewalld без потери текущих соединений:
#firewall-cmd --reload
Перезагрузить правила firewalld и сбросить текущие соединения (реко-
мендуется только в случае проблем):
#firewall-cmd --complete-reload
Добавить к зоне сетевой интерфейс:
#firewall-cmd --zone=public --add-interface=<имя интерфейса>
Добавить к зоне сетевой интерфейс (сохранится после перезагрузки
firewall):
#firewall-cmd --zone=public --permanent --add-interface=<имя интер-
фейса>
Разрешить порт, например, 8080:
#firewall-cmd --permanent --add-port=8080/tcp
Разрешить диапазон портов:
#firewall-cmd --zone=public --add-port=5059-5061/udp

182

Вам также может понравиться