Вычислительная модель. Введение в системное программирование::Журнал СА 12.2009
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Наука и технологии
Подписка
Где купить
Авторам
Рекламодателям
Архив номеров
Контакты
   

  Опросы
  Статьи

Электронный документооборот  

5 способов повысить безопасность электронной подписи

Область применения технологий электронной подписи с каждым годом расширяется. Все больше задач

 Читать далее...

Рынок труда  

Системные администраторы по-прежнему востребованы и незаменимы

Системные администраторы, практически, есть везде. Порой их не видно и не слышно,

 Читать далее...

Учебные центры  

Карьерные мечты нужно воплощать! А мы поможем

Школа Bell Integrator открывает свои двери для всех, кто хочет освоить перспективную

 Читать далее...

Гость номера  

Дмитрий Галов: «Нельзя сказать, что люди становятся доверчивее, скорее эволюционирует ландшафт киберугроз»

Использование мобильных устройств растет. А вместе с ними быстро растет количество мобильных

 Читать далее...

Прошу слова  

Твердая рука в бархатной перчатке: принципы soft skills

Лауреат Нобелевской премии, специалист по рынку труда, профессор Лондонской школы экономики Кристофер

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 9956
Комментарии: 0
Потоковая обработка данных

 Читать далее...

19.03.2018г.
Просмотров: 8164
Комментарии: 0
Релевантный поиск с использованием Elasticsearch и Solr

 Читать далее...

19.03.2018г.
Просмотров: 8264
Комментарии: 0
Конкурентное программирование на SCALA

 Читать далее...

19.03.2018г.
Просмотров: 5233
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 5920
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

Друзья сайта  

 Вычислительная модель. Введение в системное программирование

Архив номеров / 2009 / Выпуск №12 (85) / Вычислительная модель. Введение в системное программирование

Рубрика: Программирование /  Разработка

 АЛЕКСЕЙ БАРАБАНОВ, системный администратор, аутсорсер и консультант по вопросам применения информационных технологий. Хобби – программирование

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

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

Часть 2

Итак, напомню, что в конце первой части [1] был определен список из семи типовых задач, решаемых системными администраторами. Поскольку в данной части будет построена общая вычислительная модель, характерная для всех видов операций системного администрирования, то в ходе рассуждений придется найти то общее, что определяет схожесть всех перечисленных в конце первой части задач системного администрирования. Нет лучшего способа сделать это, чем пойти в рассуждениях сразу с другой стороны и при этом совсем не учитывать возможное разбиение на функциональные подзадачи, а потом проверить, что получилось, сравнив, как это «ляжет» на список из первой части.

Программы – алгоритмы = данные

Снова напомню, что в первой части была введена такая характеристика информационного объекта, как «сложность». Ключевым свойством этого параметра является то, что штатное и даже нештатное прерывание работы информационных систем не меняет уровня их сложности! Получается, что сложность объекта сохраняется и в состоянии офлайн (off‑line). Та самая сложность, что формируется в результате труда системного администратора. Другими словами, следует принять офлайн за точку сингулярности и согласиться, что дальнейшее поведение системы зависит только от её свойств в состоянии офлайн, что и называется настройкой информационной системы. Будем считать, что рассматриваемые информационные системы состоят из информационных объектов или компонентов, имеющих архитектуру фон Неймана [2]. Иначе говоря, вся информация хранится в памяти таких систем. А какая память сохраняет свое значение в состоянии офлайн? Очевидно, все, что сделает системный администратор, так или иначе должно быть размещено и запомнено в энергонезависимой памяти. В общем, ничего удивительного, так как и программисты, и все остальные пользователи компьютеров в результате своего труда, как правило, просто меняют состояние секторов жесткого диска на сервере или своем персональном компьютере. Но теперь выходит, что весь процесс администрирования можно разбить на некоторую последовательность операций, которые сводятся к изменению состояния памяти. То есть ненастроенный компьютер отличается от того, который настроен, наполнением устройств памяти в состоянии офлайн. Количество этих отличий, конечно, и составляет именно ту работу, что нужно выполнить системному администратору, чтобы, как это было указано в первой части, подготовить компьютер к эксплуатации. Все вышесказанное также справедливо и в отношении любых информационных систем. Тут можно возразить, ведь согласно подобной логике программный расчет интеграла сводится к тривиальному изменению состояния ячейки, в которой хранится результат. Вся разница в том, что в случае задания на административную настройку указывается именно требуемое конечное состояние настроенной системы, и ничего рассчитывать, как правило, не нужно. То есть сисадмин всегда заранее знает, какие параметры готового информационного объекта должны получиться в итоге. Вот теперь настало время сравнить, как сочетается все вышесказанное со списком семи задач из первой части.

Для наглядности составим таблицу (см. таблицу 1), где в первой колонке перечислим задачи из [1], во второй укажем место офлайнового хранения данных, используемых или создаваемых в ходе выполнения каждой задачи, а в последней колонке представим формат задания для выполнения каждой задачи.

Таблица 1. Формы хранения и форматы задания

 

Типовые задачи

Форма хранения

Формат задания

1

Модификация файловой системы

Файлы и папки

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

2

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

Пакеты и база пакетного менеджера

Список URL пакетов или сами пакеты

3

Создание и удаление пользовательских учетных записей

База учетных записей

Список учетных записей с атрибутами

4

Создание и модификация конфигурационных файлов

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

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

5

Последовательное выполнение настроек согласно спецификации

Спецификация настроек

Установочные параметры

6

Откат к исходному состоянию настроек

Резервные копии

Имена файлов и папок для резервирования

7

Удаленное или автоматические выполнение всех перечисленных действий на нелокальной системе

База паролей и ключей доступа

Пароли, ключи, адреса и порты

Если внимательно рассмотреть полученную таблицу, то становится видно, что последняя колонка, «Формат задания», фактически описывает или в точности совпадает с предпоследней, «Формой хранения». Это именно тот результат, который и ожидался. Чтобы окончательно убедиться в этом, предлагаю выполнить в предпочитаемой поисковой системе Интернета запрос «руководство по настройке сервера» и убедиться, что внутри полученных по ссылкам текстов не содержится формул сложней тривиальных арифметических расчетов объема памяти или простых граничных прикидок «если меньше, то» и «если больше, то».

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

Рисунок 1. Разбиение процесса системного администрирования на субоперации

Рисунок 1. Разбиение процесса системного администрирования на субоперации

Симметричность и рефлексивность

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

Чтобы определиться с этим, рассмотрим две типичные административные задачи: первая – установка ECM Alfresco [3] и вторая – установка jabber-сервера Openfire [4]. Я даю ссылки на статьи в журнале «Системный администратор», но пытливым умам предлагаю расширить репрезентативную выборку и воспользоваться поиском в Сети для получения альтернативных установочных рекомендаций. Оба эти продукта требуют в своей работе СУБД. Выберем варианты установки с использованием СУБД MySQL. Допустим, что требуется установить и Alfresco, и Openfire. А вот теперь представим, как должны измениться рекомендации по установке [3] и [4], или найденные самостоятельно в Сети, если один из продуктов ставится после второго. В этом случае как минимум должен учитываться факт существования уже настроенного сервера MySQL. И в корректных инструкциях по установке так и пишется, что-то вроде «установить MySQL или использовать уже установленный». В статье [3] о том, откуда взялся установленный MySQL, не сказано ничего, а в [4] MySQL устанавливается заново, а потом без какой-нибудь настройки сразу к нему подключается Openfire. Для журнальных статей, цель которых дать общие представления о продуктах, подобная поверхностность допустима. Но создание программы автоматической установки по таким материалам невозможно. Строгий алгоритм установки должен учитывать все возможные коллизии и иные проблемы, которые могут возникнуть в процессе работы. Кроме очевидной зависимости от свойств исходного объекта (например, платформы, характеристик оборудования), законченные решения автоматизированного системного администрирования должны учитывать также и влияние на условия их работы других, ранее завершившихся, алгоритмических последовательностей. Что значит учитывать? В данном случае решения системного администрирования должны быть независимыми один от другого. Тогда порядок их применения станет не важен. Независимость выполнимости от порядка применения в математической логике называется симметричностью. Таким образом, все решения должны обладать свойством симметричности.

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

Теперь рассмотрим такое решение, как восстановление из резервной копии. Что произойдет, если это решение применить дважды? Сравните: что произойдет, если бэкап дважды сохранить? Очевидно, и в первом, и во втором случае можно считать, что результат будет идентичен или почти идентичен (напоминаю, речь идет о системных настройках). А если иначе, используется некий алгоритм автоматической установки. И вот он указывает на фатальную ошибку, требующую вмешательства оператора. Исправили. Дальше что делать? Исправлять теперь программу установки так, чтобы она стартовала с точки прерывания? Здесь ответ тоже очевиден – надо обеспечить корректную повторную исполнимость. И хотя на практике в текстовой документации нечасто можно встретить рекомендации, учитывающие возможность многократного исполнения (про типичные установочные скрипты молчу вовсе), для автоматизированных систем надо выдвинуть такое требование к алгоритмическому воплощению решений, чтобы получить в конце концов программы, пригодные к эффективному практическому применению. Свойство корректной повторной исполнимости называется рефлексивностью. Как было указано выше, в решениях резервного копирования это свойство достигается by design. Теперь примем, что рефлексивностью должны обладать все решения автоматического системного администрирования.

Есть интересный пример, демонстрирующий именно такое свойство решений автоматизированной установки и настройки, основанных на Cfengine [4]. В видеоролике показано, что фактически автоматизированное решение может заменить резервное копирование, так как оно или «устанавливает», или «восстанавливает» заданные спецификацией информационной системы параметры.

Требование симметричности и рефлексивности не абстрактно. Оно накладывает определенные ограничения на методы реализации. Например, утилита rpm обладает только свойством рефлексивности, но в силу того, что её результат всецело зависит от порядка вызова, или, говоря иначе, передавать ей названия или адреса пакетов следует в определенном порядке, то на rpm без особых ухищрений, скорее всего, не получится построить практические установочные скрипты, обладающие свойством симметричности. А вот более мощные пакетные менеджеры, например yum, за счет использования индексов репозиториев могут «на лету» разрешать пакетные зависимости, а значит, их можно применять к аргументам, следующим в произвольном порядке – недостающее будет добавлено, лишнее проигнорировано. Следовательно, в практическом программировании использование rpm придется свести к минимуму, заменяя его на более развитые пакетные менеджеры типа yum, smart, apt-get и прочие.

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

Программы – данные = алгоритмы

Приступим к проектированию алгоритма администрирования. Абстрагируемся от используемых данных, будем считать, что все они представлены в некотором «формате хранения», а параметры задаются в некотором «формате задания». Воспользуемся общепринятой нотацией – блок-схемами. Только в этих блок-схемах точка входа будет одна, а вот число выходов будет определяться числом состояний настраиваемой системы после выполнения такого алгоритма. И нумеровать элементы блок-схем будем по мере их упоминания в процессе разработки алгоритма, а не в порядке исполнения.

Положим в основу каждой процедуры некую алгоритмическую операцию, принимающую на входе согласно таблице 1 параметры в формате задания и изменяющую нужным образом соответствующую форму хранения. Пусть эта алгоритмическая операция пока останется в виде абстрактного «черного ящика» – делается нечто и получается то, что нужно. Изобразим это на блок-схеме 1 (см. рис. 2) в виде элемента 1. Но в предыдущем разделе было выдвинуто требование рефлексивности. Чтобы соблюсти это, в блок-схему добавим проверку, нужна ли эта операция вообще, может, требуемая настройка уже была произведена ранее – элемент 2. Таким образом построенный алгоритм можно применять к информационному объекту многократно без какого-либо побочного эффекта. Затем, после установки, произведем контрольную проверку – элемент 3. На самом деле ошибкой может завершиться даже блок 1, но если далее все равно будет проверяться, успешной ли была установка, можно игнорировать коды возврата от блока 1. И тем самым блок-схема становится независимой от реального кодового наполнение установочного элемента 1. Еще одним важным элементом в поступательном прохождении рассматриваемой блок-схемы будет 4 – сохранение исходного состояния модифицируемых данных. Этот элемент нужен для реализации ветки аварийного выхода из алгоритма, которая должна производиться через блок восстановления исходного состояния 5. Дополнительно на блок-схеме 1 изображены источники данных и направления их движения (пунктирные стрелки).

Рисунок 2. Блок-схема 1. Алгоритм процедуры

Рисунок 2. Блок-схема 1. Алгоритм процедуры

В итоге блок-схема процедуры будет иметь один вход и два выхода – успешный и аварийный, что соответствует семантике блока выбора, который обычно изображается в виде ромба, и именно так, в виде ромба (элемент 1, блок-схемы 2 (см. рис. 3), все процедуры будут инкапсулированы в блок-схему решения. Как уже было сказано, процедур может быть много или она может быть одна. Если их будет много, то все они выполняются строго упорядоченно, и каждая последующая должна вызываться после успешного срабатывания предыдущей, а первый же сбой, или аварийный выход, должен прерывать всю последовательность. Здесь снова вспомним о рефлексивности: процедуры могут как срабатывать, так и пропускать действие, если установка была ранее уже произведена или вообще являлась исходным состоянием информационного объекта. Так появляется необходимость регистрации факта срабатывания – элемент 6 в блок-схеме процедуры. Но и это не все. Аварийное завершение одной из процедур должно приводить к откату всех ранее произведенных изменений. Значит, элемент 5 должен быть вынесен из алгоритма процедуры на уровень всего решения – элемент 2 на блок-схеме 2. К сожалению, развернутое изображение этого элемента займет много места, потому ограничимся его описанием: этот элемент алгоритма должен будет восстанавливать не все упомянутые в алгоритме данные, а лишь те, что описаны в процедуре, завершившейся неудачей, и всех ранее пройденных. Здесь возможна проблема инструментального порядка. Доступны две стратегии. Первая – восстанавливать только сохраненные ранее данные, вторая – можно вынести в каждой процедуре элемент 4 выше элемента 2 и тем самым обеспечить формирование резервной копии для отката всех определяющих решение данных. Этот выбор нужно сделать на этапе кодирования.

Рисунок 3. Блок-схема 2. Алгоритм решения

Рисунок 3. Блок-схема 2. Алгоритм решения

Дальнейшее обсуждение будет касаться только алгоритма решения (блок-схема 2). Как было сказано выше, надо обеспечить симметричность и рефлексивность алгоритма. Первое будет обеспечиваться элементом 3, в котором проверяются все зависимости создаваемого алгоритма. А за второе станет отвечать последующая проверка срабатывания (элемент 4): если решение запущено повторно, то оно должно завершиться успешно на уже настроенной системе. Теперь снова обратимся к свойству симметричности. В списке зависимостей для некоторого решения могут быть не только определенные установочные параметры, но и процессы, настройки которых предполагается изменять в ходе выполнения алгоритма решения. Кроме того, целью решения может быть (и очень часто так и есть) настройка некоторого сервисного процесса или даже группы процессов. Так появляется элемент 5 и вся последующая цепь в блок-схеме 2. В этой части алгоритм на первый взгляд достаточно очевиден: элемент 6 должен обеспечивать восстановление всех исходных данных, а проверка 7 в случае неудачи будет детектировать неопределенное состояние системы. Главным является то, что здесь для проверки настраиваемые части информационной системы (или даже вся система в случае перезагрузки) проводятся через точку сингулярности – рестартуют!

Что в итоге?

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

Вывод второй. К процедурам можно относиться, как к предикатам на множестве значений состояний информационной системы, выраженным некоторой функцией с набором параметров в формате представления. Такие предикаты-процедуры производят отображение состояния системы на множество {успех, неудача}, или, как это принято записывать в математике, в инкрементном порядке – {0, 1}. Этот вывод напрямую следует из блок-схемы 1, которая изображает типовой алгоритм процедуры, завершающийся двумя выходами. А вот блок-схема 2, демонстрирующая алгоритм решения, может завершаться уже тремя путями – {успех, неудача, неопределенное состояние}. Иначе говоря, если процедуры можно представлять предикатами в классической двоичной логике, то решениям соответствуют предикаты в логике троичной. И здесь уже можно утверждать, что первоначальное и весьма условное разбиение структуры алгоритма администрирования на решения и процедуры имеет под собой серьезные основания, определяющиеся природой информационных систем, и потому должно сохраниться так или иначе и на этапе кодирования.

Третий вывод такой: можно предположить, что полученный алгоритм универсален в том, что позволяет описывать решение всех возможных задач администрирования информационных систем, построенных на компонентах архитектуры фон Неймана [2]. Описывать, да! Но можно ли при этом утверждать, что все такие описания будут верными? Не совсем, или не всегда. Однозначное предположение о верности таких алгоритмов можно сделать лишь на множестве состояний информационной системы и наборе входных параметров, которые приводят к получению ответов {успех, неудача}. Если же применение алгоритма переводит систему в неопределенное состояние, требующее каких-то дополнительных интерактивных действий оператора, что в контексте математической логики эквивалентно божественному вмешательству, то однозначно утверждать правильность алгоритма невозможно. Причина может содержаться как в природе системы, так и в неполноте учтенных факторов, что соответствует неверному или неполному набору параметров. Технически такая ошибка, как неполнота учтенных факторов, неизбежно приводит к нарушению требования симметричности алгоритмов администрирования. Таким образом, снова подтверждается важность свойства симметричности для правильных алгоритмов.

Уже ясно, что должно быть внутри программных систем, реализующих алгоритмы системного администрирования. И перед тем как конкретная реализация будет описана в следующей части, предлагаю самостоятельно проверить, какие вышеперечисленные элементы алгоритмического решения присутствуют в реальных, встречаемых на практике скриптах, а каких нет, и к чему это приводит. Тому, кто еще не имеет скриптов собственной разработки, рекомендую рассмотреть программу Геннадия Калашникова [6] или поискать другие скрипты комплексной установки систем в Сети. Полученные выводы сверим в следующей части.

  1. Барабанов А. Введение в системное программирование. Часть 1. Постановка задачи. //Системный администратор, №4, 2008 г. – С. 8-13.
  2. Архитектура фон Неймана. Статья Википедии – http://ru.wikipedia.org/wiki/Архитектура_фон_Неймана.
  3. Яремчук С. Обзор Open Source ECM-системы Alfresco. //Системный администратор, №3, 2009 г. – С. 37-43.
  4. Яремчук С. Строим Jabber-сервер с OpenFire. //Системный администратор, №5, 2007 г. – С. 44-48.
  5. Демонстрационный ролик восстановления резолвера DNS с помощью Cfengine – http://cfengine.com/pages/demos?view=Cfengine_DNS_Resolver.
  6. Новость с ссылкой на пакет автоматической установки Open-Xchange, Samba PDC и проч., разработанный Геннадием Калашниковым (04.01.2006) – http://www.opennet.ru/openforum/vsluhforumID3/13191.html.
  7. System Programming Introduction. Part 2. август 2007 – октябрь 2009.

Комментарии отсутствуют

Добавить комментарий

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

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-41
Fax: (499) 277-12-45
E-mail: sa@samag.ru