Pull to refresh

MagOS в промышленном применении

Reading time 50 min
Views 22K
При выполнении этой работы ставилась задача минимизации времени на обслуживание сети из большого количества Linux машин.

1. Базовое описание основных принципов
1.1. Применение MagOS.
1.2. Технологии.
1.3. Выбор базового дистрибутива.
2. Структура сети.
2.1. Magos-server.
3. Настройка загрузчика.
3.1. Строки загрузчика.
3.2. Опции которые были использованы.
3.3. Опции, которые могут быть использованы.
3.4. Особенности сетевой загрузки.
4. Порядок инициализации системы.
4.1. Структура конфигурационного файла basecfg.ini по умолчанию.
4.2. Структура системной директории.
4.3. Реализация.
5. Сервер MagOS.
5.1. Общие сведения.
5.2. Настройки сети.
5.3. Настройка служб.
5.4. Репозиторий программ.
5.5. Дополнительные данные сервера
5.6. Мониторинг.
6. Пользовательские модули.
6.1. Общие принципы создания пользовательских модулей.
6.2. Сколько модулей делать.
6.3. Модули специального назначения.
6.4. Ограничения для модулей.
6.5. Инструкция по созданию модулей.
6.6. Модуль обновления системы.
6.7. Модуль установки офисных программ.
6.8. Модуль с утилитами и серверами.
6.9. Модуль системных настроек.
7. Скрипты.
7.1. Дополнения к magos-patches.
7.2. Скрипт установки ОС.
7.3. Скрипты включения в AD.
7.4. Управление системой (/root/bin).
7.5. Дополнительные скрипты, исправляющие работу программ magos и операционной системы.
8. Инструкция для техников.

Базовое описание основных принципов


Применение MagOS

MagOS — это специфичная сборка дистрибутива, выбираемого из обширного списка. В качестве основы для построения сборки могут выступать Live дистрибутивы Magea, Mandriva, Rosa, Ubuntu, Debian, Fedora, AltLinux и т.д. Специфичными элементами MagOS выступает модифицированное ядро (для поддержки AUFS), специальным образом созданный initrd (используется UIRD) и дополнительный набор скриптов, предназначенных для управления MagOS.

MagOS позволяет создать на основе Live сборок различных дистрибутивов (сборок, предназначенных для загрузки с CD, DVD диска) полноценную операционную систему. Специфика использования MagOS дает целый набор дополнительных преимуществ такого подхода:

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

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

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

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

К нереализованным возможностям MagOS следует отнести отсутствие возможности хранения пользовательских данных на защищенной распределенной файловой системе. Реализация такой распределенной файловой системы позволит обеспечить полную реентерабильность пользователей.

Некоторую вводную информацию о MagOS можно получить из статьи: MagOS Linux (сентябрьский выпуск).
Технологии

Модификация ядра Linux, входящего в MagOS заключается во включении патча с файловой системой AUFS. AUFS позволяет подключать в файловую систему при помощи интерфейса loopback внешние файловые системы, собирая результирующую файловую систему, как слоеный пирог. Промежуточные слои такой результирующей файловой системы подключаются, чаще всего, в режиме RO (read only), а самый верхний слой, как правило, подключается в режиме RW (read-write) и проецируется на дисковую файловую систему, которая может размещаться как в оперативной памяти, на физическом диске, в образе диска, так и сохраняться при операции отключения в специальном модуле, подключаемом при помощи файловой системы SquashFS.

Файловая система SquashFS позволяет выполнять сжатие при помощи блочного алгоритма, сохраняя все атрибуты файловой системы. В MagOS она используется для создания подгружаемых модулей с образами слоев файловой системы AUFS. Блочный алгоритм сжатия позволяет не распаковывать файлы модулей целиком при необходимости извлечения из них данных.

В MagOS образ диска initrd, используемый для загрузки ОС Linux в большинстве дистрибутивов, использован для организации работы системы. Там располагаются скрипты, создающие «слоеную» файловую систему дистрибутива, обрабатывающие конфигурационные файлы и т.п.

Необходимые для настройки системы данные передаются через параметры ядра операционной системы, прописываемые в загрузчике grub4dos/grub2/syslinux, и при помощи специального конфигурационного файла MagOS.ini. Где и какие параметры передаются описывается в документации. Параметры, связанные с общей настройкой операционной системы передаются при помощи параметров ядра. Они организованы в систему параметров Unified Init Ram Disk (uird).

Описание параметров приведено на сайте проекта: UIRD. Использован дистрибутив Magos multi.

В промышленном применении нельзя обойтись без сервера, содержащего дистрибутив и поддерживающего протоколы HTTP (для удаленной загрузки), TFTP (сервер удаленной загрузки по PXE), SSH (для управления файлами) и RSYNC (для установки и обновления ОС на компьютерах пользователей). Сервер может быть реализован на любом дистрибутиве, включая MagOS. В моем случае был использован виртуальный контейнер на основе дистрибутива CentOS 6.

Для управления системой в состав MagOS были добавлены необходимые опции и скрипты, которые их обрабатывают.

Выбор базового дистрибутива

Выбор дистрибутива, на основе которого строится сеть, всегда сложная и неоднозначная задача. Выбирая тот или иной дистрибутив приходится учитывать множество факторов, в том числе множество местных проблем. У нас такими факторами были следующие: весьма непроизводительные компьютеры пользователей, они, хоть и приобретены были совсем недавно, но на составе компьютеров сэкономили, поэтому в типовой машинке, за которой сидит пользователь всего 2 Гигабайта ОЗУ и двухъядерный Celeron с не очень большой тактовой частотой. Такая типовая конфигурация компьютера пользователя накладывает ограничения на выбор менеджера рабочего стола, в частности использовать KDE уже не представляется возможным без потери возможности комфортной работы пользователя.

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

Исследуя возможности адаптации внешнего вида рабочего стола к внешнему виду старой доброй XP, мы решили остановиться на Cinnamon. Несмотря на то, что разработка еще не вышла на релиз, в стандартной конфигурации этот рабочий стол работает вполне устойчиво и достаточно легко адаптируется к внешнему виду XP установкой соответствующей темы. Дополнительным фактором, влияющим на выбор ОС, послужило «пожелание» Госструктур видеть на рабочих местах компьютеры с отечественной операционной системой. Стало быть весь выбор, в нашем случае, свелся к выбору между ОС Rosa и ОС Alt Linux.

Несмотря на значительный опыт работы с ОС Rosa, сравнение дистрибутивов AltLinux и Rosa оказалось не в пользу Rosa. В первую очередь из-за отсутствия Cinnamon в составе LiveDVD, во вторых из-за снижения качества дистрибутива в последнее время.

Таким образом, в качестве основы для создания сборки была выбрана разработка AltLinux — одна из сборок стартового набора P7, содержащая рабочий стол Cinnamon. Положительной стороной такого выбора является минимальный состав набора, что позволяет расширять его по своему усмотрению.

Структура сети


Magos-server

В сети предприятия имеется сервер виртуализации, на котором и был развернут Magos-server. Сервер выполняет несколько функций.

Во первых он служит сервером удаленной загрузки. Удаленная загрузка реализована при помощи TFTP и позволяет загружать MagOS в той же самой конфигурации, которая используется для работы на рабочих станциях. При помощи такой загрузки можно протестировать оборудование, выполнить установку операционной системы на рабочую станцию и выполнить множество других задач. Кроме того, при помощи сервера удаленной загрузки загружаются образы Clonezilla и Memtest.

Удаленная загрузка рабочей станции под управлением MagOS осуществляется по протоколу HTTP, для чего на сервер установлен Lighttpd, DocumentRoot которого указывает на репозиторий MagOS.

Установка дистрибутива на рабочую станцию и обновление рабочих станций выполняется по протоколу RSYNC. Поэтому на сервер установлен rsyncd.

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

Этот компьютер укомплектован 4Gb памяти, поскольку возникли проблемы с созданием модулей при меньшем объеме памяти.

Интеграция в сеть

Развернута AD на основе Windows 2008 SP2 и все компьютеры сети включаются в AD. Не исключение и компьютеры под управлением ОС Linux.

Настройка загрузчика


Строки загрузчика

title AltLinux i586 cinamon save
#find --set-root --ignore-floppies --ignore-cd /MagOS/MagOS.sgn
kernel  /AltLinux/kernel/i586/vmlinuz uird.ro=*.xzm,*/live uird.from=/AltLinux/iso/altlinux-p7-cinnamon-latest-i586.iso;/AltLinux/modules/i586/ uird.load=* root=uird rw findswap vga=788 quiet plymouth.enable=0 uird.home=/dev/sda3/AltLinux-Data/homes/ uird.changes=/dev/sda3/AltLinux-Data/changes/ users
initrd /AltLinux/kernel/i586/uird.soft.cpio.xz /AltLinux/kernel/i586/uird.magos.cpio.xz

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

Ввиду множественности параметров ядра, для выделения параметров MagOS введен префикс параметров ‘uird’ (Unified Init Ram Disk).

uird.ro=*.xzm,*/live 

uird.ro — Параметр MagOS. Задает фильтр для модулей, которые монтируются в режиме RO. В качестве таковых выступают собственно модули MagOS и сам LiveDVD AltLinux.

uird.from=/AltLinux/iso/altlinux-p7-cinnamon-latest-i586.iso;/AltLinux/modules/i586/ 

uird.from — Параметр MagOS. Список источников, на которых лежат модули для системы. Это указание пути для загрузки модулей и самого дистрибутива.

uird.load=* 

uird.load — Параметр MagOS. Фильтр для модулей, которые необходимо подключить на этапе загрузки.

root=uird 

root – Параметр ядра. Указание корневой файловой системы.

rw

rw — включение режима read/write.

findswap

findswap — Параметр MagOS. Заставляет систему автоматически подключать Swap. Если в системе находится Linux раздел Swap, то подключается он. Иначе ищется файл подкачки Windows.

vga=788

vga — Параметр ядра. Включение режима работы графики.

quiet

quiet — Параметр ядра, указывает необходимость формирования журнала dmesg.

plymouth.enable=0

plymouth.enable — Параметр ядра. Управляет графическим экраном и выводом журнала во время загрузки операционной системы.

uird.home=/dev/sda3/AltLinux-Data/homes/ 

uird.home — Параметр MagOS. Задает источник, на котором хранятся домашние директории пользователей. Ввиду ошибки в существующей версии MagOS требуется задание полного пути, включая указание устройства.

uird.changes=/dev/sda3/AltLinux-Data/changes/ 

uird.changes — Параметр MagOS. Задает источник, на котором будут храниться персистентные изменения корневой файловой системы.

users

users — Параметр ядра.

Опции, которые могут быть использованы

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

  *.RWM.ENC - RW слой криптованый
  *.ROM.ENC - RO слой криптованый

uird.copy2ram[+]= — фильтр для модулей, которые копируются в ОЗУ. Может быть применено для ускорения работы при наличии значительного объема оперативной памяти.
uird.copy2cache[+]= — фильтр для модулей, которые копируются в КЭШ.
uird.cache[+]= — источники, в которые стоит синхронизировать модули.

Имеется возможность использовать КЭШ вместо синхронизации файлов MagOS с сервером при выключении компьютера. К недостаткам метода следует отнести то, что обмен с сервером выполняется по протоколу HTTP, что само по себе значительно снижает быстродействие. Вторым недостатком является то, что возникает сложность при разделении объектов обновления — файла MagOS.ini, раздела boot и раздела собственно ОС. Нужно обратить внимание, что уровень кэша layer-cache и соответствующий параметр uird.cache, служащий для синхронизации удаленных репозиториев в локальные или частные (INTRANET) репозитории, а также для обновления системы, должны задаваться нижеприведенным образом:

uird.cache=/MagOS/cache;/MagOS-Data/cache;/MagOS-Data/netlive

Здесь для каждого источника задается собственный каталог.

uird.netfsopt[+]= — дополнительные опции монтирования сетевых ФС: sshfs, nfs, curlftpfs, cifs.

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

uird.noload[+]= — фильтр для модулей, которые необходимо пропустить во время загрузки
Можно выполнять выборочное отключение некоторых модулей для отдельных компьютеров или сетей.
uird.homes[+]= — источники, на которых хранятся домашние директории пользователей (объединяются AUFS).

По сути здесь вводится уровень домашних директорий пользователя layer-homes и соответствующий параметр: uird.homes:

uird.homes=/MagOS-Data/homes;/MagOS-Data/home.img;nfs://magos.sibsau.ru/homes/n/e/myuser

Все директории пользователя из различных источников каскадно-объединяются посредством AUFS и монтируются в /home. Более приоритетным является самый первый источник, затем, в порядке перечисления, уменьшается приоритет. В случае, если источник задан параметром uird.home=, то происходит монтирование источника в /home. Таким образом имеется возможность множественного подключения домашней папки с наложением разных файловых систем. Может использоваться при сетевом размещении домашних папок пользователей.

Типы источников:
/path/dir — директория на любом доступном носителе;
/dev/[..]/path/dir — директория на заданном носителе;
file-dvd.iso, file.img — образ диска (ISO, образ блочного устройства);
server/path… — источник доступный по HTTP (используется httpfs);
ssh://server/path/… — источник доступный по SSH (исползуется sshfs);
server/path… — источник доступный по FTP (используется curlftpfs);
nfs://server/path/… — источник доступный по NFS;
cifs://server/path/… — источник доступный по CIFS;
uird.machines= — источник, где хранятся машинно-зависимые персистентные изменения.

Имеется возможность использовать машинозависимые ресурсы для changes, что необходимо для обеспечения реентерабильности пользователей.

Особенности сетевой загрузки

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

kernel images/vmlinuz uird.ro=*.xzm,*/live uird.from=http://magos-server.mydomain.local/magos/AltLinux/iso/alt linux-p7-cinnamon-latest-i586.iso;http://magos-server.mydomain.local/magos/AltLinux/modules/i586/ uird.load=* root=uird rw findswap vga=788 quiet plymouth.enable=0 users

Это те же самые параметры, однако следует обратить внимание на указание параметра uird.from:

uird.from=http://magos-server.mydomain.local/magos/AltLinux/iso/altlinux-p7-cinnamon-latest-i586.iso;http://magos-server.mydomain.local/magos/AltLinux/modules/i586/

Здесь указывается полный http url сервера, с которого выполняется загрузка ОС. Базовый уровень layer-base и соответствующий параметр uird.from могут задаваться в следующем виде:

uird.from=/MagOS;/MagOS-Data;MagOS.iso;http://magos.sibsau.ru/repository/netlive/2014.64/MagOS

Порядок инициализации системы


  • Осуществляется поиск конфигурационного файла по пути, указанному в параметре uird.basecfg.
  • Устанавливаются параметры из конфигурационного файла, которые еще не установлены в параметрах ядра.
  • Происходит монтирование источников base-уровня в порядке, указанном в параметре uird.from.
  • Происходит монтирование источников cache-уровня в порядке, указанном в параметре uird.cache.
  • Происходит монтирование источников homes-уровня в порядке, указанном в параметре uird.homes.
  • Происходит подключение в самый верхний уровень AUFS источника персистентных изменений, указанного в параметре uird.changes.
  • Осуществляется синхронизация base-уровня в cache-уровень с учетом параметра uird.copy2cache, а также соответствия подуровней. Если подуровней cache-уровня меньше, чем base-уровня, то оставшиеся подуровни синхронизируются в RAM.

        ├── layer-base       ==>      ├── layer-cache
        │   ├── 0            -->      │   ├── 0
        │   ├── 1            -->      │   ├── 1
        │   ├── ...          -->      │   └── ...
        │   └── ...          -->      │   RAM

  • Осуществляется синхронизация base,cache-уровней в RAM с учетом параметра uird.copy2ram.
  • Осуществляется поиск модулей в RAM, cache-уровне, base-уровне и подключение их на верхний уровень AUFS или копирование в корень (с учетом фильтров, указанных в параметрах uird.load,uird.noload,uird.ro,uird.rw,uird.cp).
  • Осуществляется каскадное объединение источников homes-уровня и подключение их в /home/.
  • Выполняются скрипты rc.preinit.

Структура конфигурационного файла basecfg.ini по умолчанию

uird.config=MagOS.ini
uird.ramsize=70%
uird.ro=*.xzm;*.rom;*.rom.enc;*.pfs;*.sfs
uird.rw=*.rwm;*.rwm.enc
uird.cp=*.xzm.cp,*/rootcopy
uird.load=/base/,/modules/,rootcopy
uird.noload=
uird.from=/MagOS;/MagOS-Data
uird.changes=/MagOS-Data/changes
uird.cache=/MagOS-Data/cache
uird.machines=/MagOS-Data/machines
uird.home=/MagOS-Data/homes

Если параметр uird.basecfg не задан, то используется /uird_configs/basecfg.ini внутри initrd.

Структура системной директории

 /memory/
  ├── bundles                   - точка монтирования модулей
  │   ├── 00-kernel.xzm
  │   ├── 01-firmware.xzm
  │   ├── 10-core.xzm
  │   ├── 80-eepm-1.5.2.xzm
  │   └── ...                   - и т.д.
  ├── changes                   - точка монтирования для хранения изменений 
  │   ├── etc
  │   ├── home
  │   ├── memory
  │   ├── run
  │   ├── var
  │   └── ...                   - и т.д.
  ├── data                      - точка монтирования источников
  │   ├── cache                     - кэш уровня
  │   ├── homes                     - homes уровня
  │   ├── machines                  - (зарезервировано)
  │   └── from                      - базового уровня
  ├── layer-base                - точка монтирования базового уровня
  │   ├── 0                         - ресурс первого источника
  │   ├── 1                         - ресурс второго источника (в порядке перечисления в uird.from=)
  │   └── ...                       - и т.д.
  ├── layer-cache               - точка монтирования кэш уровня
  │   ├── 0                         - ресурс первого источника
  │   ├── 1                         - ресурс второго источника (в порядке перечисления в uird.cache=)
  │   └── ...                       - и т.д.
  ├── layer-homes               - точка монтирования homes уровня
  │   ├── 0                         - ресурс первого источника
  │   ├── 1                         - ресурс второго источника (в порядке перечисления в uird.homes=)
  │   └── ...                       - и т.д.
  ├── cmdline                   - системный файл для хранения дополнительных параметров командной строки
  └── MagOS.ini.gz              - системный файл для хранения конфигурационного файла

Реализация

В основе реализации лежит набор скриптов инициализации dracut (модули base, busybox ) и скрипты uird (livekitlib+uird-init):

  • cmdline-hook: parse-root-uird.sh (проверяет параметр root=uird);
  • mount-hook: mount-uird.sh (выполняет скрипт uird-init);
  • livekitlib — содержит библиотеку функций системы инициализации;
  • uird-init — последовательно выполняет набор функций из livekitlib и осуществляет каскадно-блочное монтирование модулей системы в единый корень AUFS в директорию указанную в переменной dracut $NEWROOT.

Сервер MagOS


Общие сведения

В нашем случае magos-server развернут в качестве контейнера openvz. Реализация не имеет принципиального значения.

  • Он служит сервером удаленной загрузки. Удаленная загрузка реализована при помощи TFTP/PXE и позволяет загружать MagOS в той же самой конфигурации, которая используется для работы на рабочих станциях. При помощи такой загрузки можно протестировать оборудование, выполнить установку операционной системы на рабочую станцию и выполнить множество других задач.
  • Удаленная загрузка рабочей станции под управлением MagOS осуществляется по протоколу HTTP, для чего на сервер установлен Lighttpd, documentroot которого указывает на репозиторий MagOS.
  • Установка дистрибутива на рабочую станцию и обновление рабочих станций выполняется по протоколу rsync. Поэтому на сервер установлен rsyncd.
  • Управление сервером осуществляется по протоколу ssh. По этому же протоколу на сервере обновляются изменения модулей программ, подготавливаемые на тестовом компьютере.

Реализация сервера

Операционная система Centos v6. Для виртуального контейнера выделены следующие ресурсы: CPU — 2, RAM — 512Mb, swap — 1Gb, размер виртуального диска 40Gb.

Настройки сети

Настройка в ifcfg-eth0
DEVICE=eth0
IPADDR=192.168.1.xxx
NETMASK=255.255.255.0
NETWORK=192.168.1.0
GATEWAY=192.168.1.1
DNS1=192.168.1.xxx
BROADCAST=192.168.1.255
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static


Сетевые службы (netstat -tunlp)
# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address    Foreign Address State  PID/Program name  
tcp    0      0     0.0.0.0:873      0.0.0.0:*       LISTEN      494/xinetd        
tcp    0      0     192.168.1.xxx:80 0.0.0.0:*       LISTEN      551/lighttpd      
tcp    0      0     0.0.0.0:22       0.0.0.0:*       LISTEN      484/sshd          
udp    0      0     0.0.0.0:69       0.0.0.0:*                   494/xinetd 


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

Lighthttpd

Запуск:
chkconfig --list lighttpd
lighttpd        0:off   1:off   2:on    3:on    4:off   5:on    6:off


Конфигурационный файл lighttpd.conf
var.log_root    = "/var/log/lighttpd"
var.server_root = "/var/www"
var.state_dir   = "/var/run"
var.home_dir    = "/var/lib/lighttpd"
var.conf_dir    = "/etc/lighttpd"
var.vhosts_dir  = server_root + "/vhosts"
var.cache_dir   = "/var/cache/lighttpd"
var.socket_dir  = home_dir + "/sockets"
include "modules.conf"
server.port = 80
server.use-ipv6 = "disable"
server.bind = "192.168.1.xxx"
server.username  = "lighttpd"
server.groupname = "lighttpd"
server.document-root = server_root + "/"
server.pid-file = state_dir + "/lighttpd.pid"
server.errorlog             = log_root + "/error.log"
include "conf.d/access_log.conf"
include "conf.d/debug.conf"
server.event-handler = "linux-sysepoll"
server.network-backend = "linux-sendfile"
server.stat-cache-engine = "simple"
server.max-connections = 1024
index-file.names += (
  "index.xhtml", "index.html", "index.htm", "default.htm", "index.php"
)
url.access-deny             = ( "~", ".inc" )
$HTTP["url"] =~ "\.pdf$" {
  server.range-requests = "disable"
}
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi", ".scgi" )
include "conf.d/mime.conf"
include "conf.d/dirlisting.conf"
server.follow-symlink = "enable"
server.upload-dirs = ( "/var/tmp" )


Конфигурационный файл vhosts.d/magos.conf
$HTTP["host"] == "magos-server.mydomain.local" {
  var.server_name = "magos-server.mydomain.local"
  server.name = server_name
  include "conf.d/trigger_b4_dl.conf"
  server.document-root = vhosts_dir + "/magos/"
  accesslog.filename          = log_root + "/" + server_name "/access.log"
}


Конфигурационный файл conf.d/dirlisting.conf
dir-listing.activate      = "enable"
dir-listing.hide-dotfiles = "disable"
dir-listing.exclude       = ( "~$" )
dir-listing.encoding = "UTF-8"
dir-listing.hide-header-file = "disable"
dir-listing.show-header = "disable"
dir-listing.hide-readme-file = "disable"
dir-listing.show-readme = "disable"


Tftpd

Запуск (/etc/xinetd.d/tftp:)
service tftp {
      socket_type             = dgram
      protocol                = udp
      wait                    = yes
      user                    = root
      server                  = /usr/sbin/in.tftpd
      server_args             = -s /var/lib/tftpboot
      disable                 = no
      per_source              = 11
      cps                     = 100 2
      flags                   = IPv4
} 


Конфигурационный файл /var/lib/tftpboot/pxelinux.cfg/default
default menu.c32
prompt 0
timeout 300
ONTIMEOUT local

MENU TITLE PXE Menu

# Первый пункт меню – загрузка с HD
LABEL Boot from hard disk
localboot 0x80

LABEL AltLinux-net
        MENU LABEL AltLinux-net
        kernel images/vmlinuz uird.ro=*.xzm,*/live uird.from=http://magos-server.mydomain.local/magos/AltLinux
x/iso/altlinux-p7-cinnamon-latest-i586.iso;http://magos-server.mydomain.local/magos/AltLinux/modules/i586/ ui
rd.load=* root=uird rw findswap vga=788 quiet plymouth.enable=0 users
        append initrd=images/uird.magos.cpio.xz
LABEL AltLinux-net testing
        MENU LABEL AltLinux-net testing
        kernel images/vmlinuz uird.ro=*.xzm,*/live uird.from=http://magos-server.mydomain.local/testing/AltLinux
/iso/altlinux-p7-cinnamon-latest-i586.iso;http://magos-server.mydomain.local/testing/AltLinux/modules/i586
/ uird.load=* root=uird rw findswap vga=788 quiet plymouth.enable=0 users
        append initrd=images/uird.magos.cpio.xz


Репозиторий состоит из двух частей: рабочего, имеющего название magos и тестового, имеющего название testing. Рабочий репозиторий предназначен для установки и обновления программного обеспечения рабочих станций пользователей. Предварительное тестирование устанавливаемого ПО выполняется на репозитории testing. Меню загрузки позволяет загружать операционную систему как из рабочего репозитория так и из тестового.

Rsync

Запуск (/etc/xinetd.d/rsync):
service rsync
{
        disable = no
        flags           = IPv4
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure  += USERID
}


Конфигурационный файл /etc/rsyncd.conf
use chroot = yes
max connections = 100
syslog facility = local5
pid file = /var/run/rsyncd.pid
[magos]
path = /var/www/magos
comment = whole MagOS boot
[testing]
path = /var/www/testing
comment = whole MagOS boot


sshd

Запуск:
# chkconfig –list sshd
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off


Конфигурационный файл /etc/ssh/sshd_config
Protocol 2
SyslogFacility AUTHPRIV
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding no
Subsystem       sftp    /usr/libexec/openssh/sftp-server


Репозиторий программ

В структуре репозитория программ показаны только существенные файлы и каталоги.

magos

├──AltLinux
│  ├──iso
│  │  └──altlinux-p7-cinnamon-latest-i586.iso
│  ├──kernel
│  │  └──i586
│  │     ├──uird.magos.cpio.xz
│  │     ├──uird.soft.cpio.xz
│  │     └──vmlinuz
│  └──modules
│     └──i586
│        ├──00-kernel.xzm
│        ├──01-firmware.xzm
│        ├──03-1-nvidia-current.xzm
│        ├──03-2-nvidia304.xzm
│        ├──03-9-fglrx.xzm
│        ├──80-eepm-1.5.2.xzm
│        ├──80-uird.soft.xzm
│        ├──90-magos-patches.xzm
│        ├──99-squashfs-tools.32.xzm
│        ├──99-u10-update.xzm
│        ├──99-u40-office4.xzm
│        ├──99-u50-utils.xzm
│        ├──99-u99-default.xzm
│        ├──MagOS.ini
│        └──update.txt
├──AltLinux-Data
│  ├──cache
│  ├──changes
│  ├──homes
│  ├──machines
│  ├──MagOS-Data.sgn
│  ├──modules
│  ├──optional
│  └──rootcopy
└──boot
   ├──grub4dos
   │  ├──install.lin
   │  ├──install.win
   │  └──local
   │     └──menu.lst
   ├──syslinux
   └──tools

testing

├──AltLinux
│  ├──iso
│  │  └──altlinux-p7-cinnamon-latest-i586.iso
│  ├──kernel
│  │  └──i586
│  │     ├──uird.magos.cpio.xz
│  │     ├──uird.soft.cpio.xz
│  │     └──vmlinuz
│  └──modules
│     └──i586
│        ├──00-kernel.xzm
│        ├──01-firmware.xzm
│        ├──03-1-nvidia-current.xzm
│        ├──03-2-nvidia304.xzm
│        ├──03-9-fglrx.xzm
│        ├──80-eepm-1.5.2.xzm
│        ├──80-uird.soft.xzm
│        ├──90-magos-patches.xzm
│        ├──99-squashfs-tools.32.xzm
│        ├──99-u10-update.xzm
│        ├──99-u40-office4.xzm
│        ├──99-u50-utils.xzm
│        ├──99-u99-default.xzm
│        ├──MagOS.ini
│        └──update.txt
├──AltLinux-Data
│  ├──cache
│  ├──changes
│  ├──homes
│  ├──machines
│  ├──MagOS-Data.sgn
│  ├──modules
│  ├──optional
│  └──rootcopy
├──boot
│  ├──grub4dos
│  │  ├──install.lin
│  │  ├──install.win
│  │  └──local
│  │     └──menu.lst
│  ├──syslinux
│  └──tools
└──update.tar.gz

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

# groupadd magos
# groupadd testing

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

# cd /var/www
# find magos -type f -exec chmod 664 {} +
# find magos -type d -exec chmod 775 {} +
# find testing -type f -exec chmod 664 {} +
# find testing -type d -exec chmod 775 {} +

Установить группы владельцев репозиториев:

# chown -R :magos magos
# chown -R :testing testing

Установить SGID на каталоги репозиториев:

# chmod g+s magos
# chmod g+s testing

Дополнительные данные сервера

yum.repos.d
CentOS-Base.repo
CentOS-Debuginfo.repo
CentOS-fasttrack.repo
CentOS-Media.repo
CentOS-Vault.repo
epel.repo
epel-testing.repo
vz.repo

Скрипты управления

Скрипты создавались для текущего использования и не претендуют на «коробочность» использования, поэтому при их применении прошу быть внимательными!

Мониторинг

Скрипт update-txt.sh, выполняемый ежедневно по расписанию записывает в каталог modules файл update.txt, содержащий текущую дату. После синхронизации данных на пользовательский компьютер он позволяет легко проверить когда компьютер последний раз обновлялся. Это необходимый момент для отслеживания компьютеров, которые не перегружаются в течение длительного срока (пользователь не выключает компьютер).

Скрипт /etc/cron.daily/update-txt.sh
#!/bin/sh
echo "magos $(date)" > /var/www/magos/AltLinux/modules/i586/update.txt
echo "testing $(date)" > /var/www/testing/AltLinux/modules/i586/update.txt


Обновление

Скрипты testig2magos_kern.sh, testig2magos_mod.sh и testig2magos_all.sh предназначены для обновления рабочего репозитория из репозитория testing и выполняются только в ручном режиме.

testig2magos_kern.sh — обновляет только системные модули и каталог kernel.
testig2magos_mod.sh — выполняет обновление только пользовательских модулей.
testig2magos_all.sh — выполняет полное обновление включая папки kernel, iso и modules.

Ни один из скриптов не выполняет обновление файла MagOS.ini!

Изменения в этот файл вносятся только вручную.

Скрипт /root/bin/testig2magos_kern.sh
#!/bin/bash

# обновить ядро и системные модули MagOS в рупозитории magos
# из репозитория testing

MAGOS="/var/www/magos"
TESTING="/var/www/testing"
MAGOSGROUP="magos"

echo "!!! UPDATE KERNEL AND MAGOS MODULES TO magos REPOSITORY FROM testing REPOSITORY"
echo "                                       ====="
echo
echo "Pres Rnter to continue, or Ctrl+C to abort..."
read junk
clear

cp -ruv $TESTING/AltLinux/kernel/i586/*.xzm $MAGOS/AltLinux/kernel/i586/
cp -ruv $TESTING/AltLinux/modules/i586/[0-9]?-*.xzm $MAGOS/AltLinux/modules/i586/
find $MAGOS -type f -exec chmod 664 {} +
find $MAGOS -type d -exec chmod 775 {} +
chown -R :$MAGOSGROUP $MAGOS/*
echo "UPDATE KERNEL AND MAGOS MODULES FROM magos REPOSITORY IT IS EXECUTED"


Скрипт /root/bin/testig2magos_mod.sh
#!/bin/bash

# обновить пользовательские модули MagOS в рупозитории magos
# из репозитория testing

MAGOS="/var/www/magos"
TESTING="/var/www/testing"
MAGOSGROUP="magos"

echo "!!! UPDATE MODULES TO magos REPOSITORY FROM testing REPOSITORY"
echo "                      ====="
echo
echo "Pres Rnter to continue, or Ctrl+C to abort..."
read junk
clear
cp -ruv $TESTING/AltLinux/modules/i586/[0-9]??-*.xzm $MAGOS/AltLinux/modules/i586/
find $MAGOS -type f -exec chmod 664 {} +
find $MAGOS -type d -exec chmod 775 {} +
chown -R :$MAGOSGROUP $MAGOS/*
echo "UPDATE MODULES FROM magos REPOSITORY IT IS EXECUTED"


Скрипт /root/bin/testig2magos_all.sh
#!/bin/bash

# обновить целиком весь репозиторий magos
# из репозитория testing, включая каталог с исходным дистрибутивом iso

MAGOS="/var/www/magos"
TESTING="/var/www/testing"
MAGOSGROUP="magos"

echo "!!! UPDATE ALL MAGOS REPOSITORY magos FROM testing REPOSITORY"
echo "                                ====="
echo
echo "Pres Rnter to continue, or Ctrl+C to abort..."
read junk
clear

cp -ruv $TESTING/AltLinux/iso/ $MAGOS/AltLinux/iso/
cp -ruv $TESTING/AltLinux/kernel/i586/*.xzm $MAGOS/AltLinux/kernel/i586/
cp -ruv $TESTING/AltLinux/modules/i586/*.xzm $MAGOS/AltLinux/modules/i586/
find $MAGOS -type f -exec chmod 664 {} +
find $MAGOS -type d -exec chmod 775 {} +
chown -R :$MAGOSGROUP $MAGOS/*
echo "UPDATE magos REPOSITORY IT IS EXECUTED"


Пользовательские модули


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

Что нужно знать

При создании модулей в MagOS приходится учитывать одну важную особенность, связанную с созданием пользователей и групп. При создании модуля в нем сохраняются измененные файлы passwd, group, shadow и т.д. Но, для того, чтобы следующий создаваемый модуль их «видел» скриптом epm2xzm, нужно, чтобы название модуля соответствовало шаблону «NN-». Если названия модулей не будут соответствовать этому шаблону, то каждый последующий создаваемый модуль так же, как и первый, будут создаваться на основе только базовых модулей MagOS. Больнее всего это ударит по файлам аутентификации: программы создающие системных пользователей и устанавливаемые в разные модули получают одинаковые UID и GID, а файлы типа passwd, созданные в разных модулях переписываются последующими слоями. В результате установленные в нижележащих модулях программы оказываются неработоспособными.

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

Скрипты создающие модули написаны так, что в качестве имени модуля используют собственное название. Скрипт, названный 99-u30-example.sh будет создавать модуль с названием 99-u30-example.xzm.

Сколько модулей делать

Порядок подключения базовых модулей не имеет значения, поскольку в них нет никаких перекрывающихся файлов и каталогов. Но имеет значение порядок подключения пользовательских модулей. Если в пользовательских модулях имеются исправления файлов базовых модулей, а в случае с адаптацией MagOS для дистрибутива AltLinux такая ситуация наблюдается, то они должны располагаться в верхних слоях aufs и подключаться после системных. Модули подключаются в систему, будучи отсортированными по названию, поэтому название модуля имеет важное значение. Поскольку название последнего системного модуля начинается с символов «99-», рекомендуется использовать названия пользовательских модулей, начинающееся с символов «99?-» таким образом, чтобы при сортировке каталога по названию они оказывались после системных модулей.

Модули специального назначения

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

  • в этот модуль нельзя ставить программы.
  • в этом модуле не должно быть файлов, ответственных за назначение прав (passwd, group и т.п.)

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

Ограничения для модулей

На количество модулей нет никаких ограничений (по умолчанию может быть до 127), но желательно соблюдать некоторый компромисс на разделение программ по модулям. Во первых, при пересборке нижележащего модуля нам требуется отключать все модули, которые должны грузиться позже. А после пересборки такого модуля рекомендуется выполнить пересборку и всех последующих модулей, даже если программы в них не обновлялись и не изменялись. Это связано с зависимостями программ по библиотекам. Таким образом нужно стремиться к тому, чтобы количество пользовательских модулей не было большим.

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

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

Инструкция по созданию модулей

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

  1. Загрузить средства обновления /root/bin/loadupdate.sh.
  2. Отключить обновление системы при перегрузке ОС: в файлах /etc/sysconfig/MagOS и /mnt/livemedia/MagOS.ini установить переменную AUTOUPDATE=No.
  3. Переименовать обновляемый модуль и все последующие, добавив расширение .bak (другие расширения не допускаются).
  4. Выполнить сборку модуля. По запросу выполнить сохранение модуля на сервере magos-server.
  5. Перегрузить компьютер, для того, чтобы изменения корректно вступили в силу.
  6. Повторить операции 3-5 для всех последующих модулей.

Методика установки новых программ

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

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

Модуль обновления системы

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

Скрипт 99-u10-update.sh
#!/bin/sh

. conf/devel.conf
NAME=`echo $0 | sed 's/\.\///'| sed 's/\..*//'`
. lib/mv.sh $NAME
epm2xzm $NAME upgrade $NAME.xzm

rm -rf $NAME
mkdir $NAME
xzm2dir $NAME.xzm $NAME
. lib/delhlam.sh $NAME

dir2xzm $NAME $NAME.xzm
. lib/update.sh $NAME


Модуль установки офисных программ

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

Скрипт 99-u10-office4.sh
#!/bin/sh

. conf/devel.conf
NAME=`echo $0 | sed 's/\.\///'| sed 's/\..*//'`
. lib/mv.sh $NAME

epm2xzm $NAME -i 'java-1.7.0-openjdk LibreOffice4-langpack-ru LibreOffice4-integrated file-roller LibreOffice4 LibreOffice4-gnome
foomatic-db lsof foo2zjs foo2zjs-apps foo2zjs-fwdownloader mozilla-plugin-adobe-flash
mozilla-plugin-mozplugger mozilla-plugin-totem totem-plugins fonts-ttf-ms'

rm -rf $NAME
mkdir $NAME
xzm2dir $NAME.xzm $NAME
rm -rf $NAME/etc/urpmi $NAME/etc/.java

. lib/delhlam.sh $NAME

dir2xzm $NAME $NAME.xzm

. lib/update.sh $NAME


Модуль с утилитами и серверами

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

Кроме собственно установки программ выполняется настройка некоторых элементов операционной системы и установленных программ прямо в установочном скрипте.

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

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

Скрипт 99-u20-utils.sh
#!/bin/sh

. conf/devel.conf
NAME=`echo $0 | sed 's/\.\///'| sed 's/\..*//'`
. lib/mv.sh $NAME

epm2xzm $NAME -i 'samba samba-winbind alterator-auth cups-windows samba-client ntpdate ntp-utils
zabbix-agent zabbix-agent-sudo perl-FusionInventory-Agent perl-FusionInventory-Agent-scripts 
perl-Task-FusionInventory perl-Pod-Text-Ansi alterator-fbi alterator-net-iptables italc2-client 
installer-feature-init-italc rsync tcpdump nmap netcat telnet sane sane-server xsane xsane-gimp2 
sane-frontends yagf cuneiform cuneiform-data fonts-otf-gdouros-akkadian aspell-ru-lebedev 
aspell-ru-rk iperf whois rdesktop xfreerdp remmina-plugins sshpass pssh'

rm -rf $NAME
mkdir $NAME
xzm2dir $NAME.xzm $NAME
cp /usr/share/zoneinfo/Asia/Krasnoyarsk $NAME/etc/localtime
cp /etc/nsswitch.conf $NAME/etc/nsswitch.conf
sed -i s/'^hosts:      files mdns4_minimal \[NOTFOUND=return\]*'/'hosts:      files dns mdns4_minimal \[NOTFOUND=return\]  myhostname fallback'/ $NAME/etc/nsswitch.conf
sed -i s/'^# PidFile=\/var'/'PidFile=\/var'/ $NAME/etc/zabbix/zabbix_agentd.conf
sed -i s/'^# EnableRemoteCommands=0'/'EnableRemoteCommands=1'/ $NAME/etc/zabbix/zabbix_agentd.conf
sed -i s/'^LogFileSize='/'# LogFileSize='/ $NAME/etc/zabbix/zabbix_agentd.conf
sed -i s/'127.0.0.1'/'192.168.0.XXX'/ $NAME/etc/zabbix/zabbix_agentd.conf
sed -i s/'^# LogRemoteCommands=0'/'LogRemoteCommands=1'/ $NAME/etc/zabbix/zabbix_agentd.conf
sed -i s/'^Hostname='/'# Hostname='/ $NAME/etc/zabbix/zabbix_agentd.conf
sed -i s/'^# Timeout=3'/'Timeout=30'/ $NAME/etc/zabbix/zabbix_agentd.conf
mkdir $NAME/etc/fusioninventory
echo "server = http://glpi.kompany.local/glpi/plugins/fusioninventory/" > $NAME/etc/fusioninventory/agent.cfg
echo "delaytime = 3600" >> $NAME/etc/fusioninventory/agent.cfg
echo "timeout = 180" >> $NAME/etc/fusioninventory/agent.cfg
echo "logger = File" >> $NAME/etc/fusioninventory/agent.cfg
echo "logfile = /var/log/fusioninventory.log" >> $NAME/etc/fusioninventory/agent.cfg
echo "logfacility = LOG_USER" >> $NAME/etc/fusioninventory/agent.cfg
echo "debug = 3" >> $NAME/etc/fusioninventory/agent.cfg
mkdir $NAME/etc/cron.daily
echo "#!/bin/sh" > $NAME/etc/cron.daily/fusioninventory-agent
echo "" >> $NAME/etc/cron.daily/fusioninventory-agent
echo "/usr/bin/fusioninventory-agent --conf-file=/etc/fusioninventory/agent.cfg" >> $NAME/etc/cron.daily/fusioninventory-agent
chmod +x $NAME/etc/cron.daily/fusioninventory-agent

. lib/delhlam.sh $NAME

dir2xzm $NAME $NAME.xzm
. lib/update.sh $NAME


В нашем случае, в данном конфигурационном файле выполняется настройка timezone, поскольку ее значения отличаются от значений дистрибутива по умолчанию, а стандартная настройка указанных параметров MagOS, в нашем случае не срабатывает правильно (cp /usr/share/zoneinfo/Asia/Krasnoyarsk $NAME/etc/localtime).

Выполняется исправление какой-то странной ошибки в настройках дистрибутива AltLinux, при которой не резолвятся имена компьютеров локальной сети, если имя домена локальной сети оканчивается на local (cp /etc/nsswitch.conf $NAME/etc/nsswitch.conf sed -i s/'^hosts: files mdns4_minimal \[NOTFOUND=return\]*'/'hosts: files dns mdns4_minimal \[NOTFOUND=return\] myhostname fallback'/ $NAME/etc/nsswitch.conf).

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

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

Модуль системных настроек

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

Скрипт 99-u99-default.sh
#!/bin/sh

. conf/devel.conf
NAME=`echo $0 | sed 's/\.\///'| sed 's/\..*//'`
. lib/mv.sh $NAME

dir2xzm $NAME $NAME.xzm
. lib/update.sh $NAME

В каталоге etc/ модуля находятся следующие каталоги и конфигурационные файлы:

sudoers
-r--------  1 root root   730 Aug 20 15:42 ./sudoers


Внесена строка разрешения выполнения операций sudo администратору без пароля (необходимо для выполнения параллельных операций по протоколу ssh).

X11
./X11:
total 8
drwxr-xr-x 2 root root 4096 Aug 21 12:42 xinit
drwxr-xr-x 2 root root 4096 Aug 21 12:42 xorg.conf.d


Выполнена преднастройка переключателя локали клавиатуры:

etc/X11/xinit/Xkbmap
option grp:alt_shift_toggle -variant , -layout us,ru -model pc104


Выполнена настройка клавиатуры:

etc/X11/xorg.conf.d/00-keyboard.conf
# Read and parsed by systemd-localed. It's probably wise not to edit this file
# manually too freely.
Section "InputClass"
        Identifier "system-keyboard"
        MatchIsKeyboard "on"
        Option "XkbLayout" "us,ru"
EndSection


./apt
total 8
drwxr-xr-x 2 root root 4096 Jun  9 09:45 sources.list.d
drwxr-xr-x 2 root root 4096 Jun  9 09:42 vendors.list.d


Добавлен репозиторий autoimports для установки программы fusioninventory-agent.

etc/apt/sources.list.d/autoimports-p7.list
rpm [cronbuild] ftp://ftp.altlinux.ru/pub/distributions/ALTLinux/autoimports/Sisyphus/ noarch autoimports
/etc/apt/vendors.list.d/autoimports-p7.list 
simple-key "cronbuild" {
        Fingerprint "DE73F3444C163CCD751AC483B584C633278EB305";
        Name "Cronbuild Service <cronbuild@altlinux.org>";
}
simple-key "cronport" {
        Fingerprint "F3DBF34AB0CC0CE638DF7D509F61FBE7E2C322D8";
        Name "Cronport Service <cronport@altlinux.org>";
}


./italc
total 4
drwxr-xr-x 3 root root 4096 Jul 17 18:19 keys


Установлены ключи программы italc.

./lightdm
total 12
-rw-r--r-- 1 root root  909 Jun  8 13:03 lightdm-gtk-greeter.conf
-rw-r--r-- 1 root root 4536 Jun  8 13:18 lightdm.conf


Отключен режим autologin и выполнены дополнительные настройки.

etc/lightdm/lightdm-gtk-greeter.conf
[greeter]
logo=/usr/share/design/current/icons/large/altlinux.png
background=/usr/share/design/current/backgrounds/default.png
icon-theme-name=gnome
show-language-selector=false
show-indicators=a11y;power


etc/lightdm/lightdm.conf
[LightDM]
minimum-vt=7
user-authority-in-system-dir=true
log-directory=/var/log/lightdm
run-directory=/var/run/lightdm
cache-directory=/var/cache/lightdm
xsessions-directory=/etc/lightdm/sessions

[SeatDefaults]
xserver-command=/usr/bin/X
greeter-hide-users=true
session-wrapper=/etc/X11/Xsession

[XDMCPServer]

[VNCServer]

./net
total 8
drwxr-xr-x 3 root root 4096 Jul 16 12:35 ifaces
-rw-r--r-- 1 root root 1987 Jul 16 12:44 sysctl.conf


Выполнена предварительная настройка сетевого интерфейса и фаервола.

./pam.d
total 4
-rw-r----- 1 root root 237 Aug 24 11:28 reboot


etc/pam.d/reboot
auth     required       pam_nologin.so
auth     sufficient     pam_rootok.so
auth     sufficient     pam_console.so
#auth     required      pam_deny.so
auth     required       pam_permit.so
account  required       pam_permit.so
password required       pam_deny.so


./skel
total 16
drwxr-xr-x 8 root root 4096 Jun  8 16:17 Документы
drwxr-xr-x 2 root root 4096 Jun  8 16:17 Загрузки
drwxr-xr-x 2 root root 4096 Jun  8 16:17 Общедоступные
drwxr-xr-x 2 root root 4096 Jun  8 16:17 Рабочий стол


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

./sysconfig:
total 8 -rw-r–r– 1 root root 75 Jun 8 13:11 i18n


etc/sysconfig/i18n
SYSFONT=UniCyr_8x16
LANG=ru_RU.utf8


./systemd
total 8
drwxr-xr-x 5 root root 4096 Aug 20 18:52 system
drwxr-xr-x 2 root root 4096 Aug 20 18:51 user


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

./xdg
total 4
drwxr-xr-x 2 root root 4096 Jul 17 17:59 iTALC Solutions


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

/etc/xdg/iTALC Solutions/iTALC.conf
[Authentication]
KeyAuthenticationEnabled=1
LogonAuthenticationEnabled=0
LogonGroups="italc-admins,italc-supporters,italc-teachers,italc-students"
PermissionRequiredWithKeyAuthentication=0
PermissionRequiredWithLogonAuthentication=0
PrivateKeyBaseDir=$GLOBALAPPDATA/keys/private
PublicKeyBaseDir=$GLOBALAPPDATA/keys/public
SameUserConfirmationDisabled=0

[DemoServer]
Backend=0
Multithreaded=1

[Logging]
LimittedLogFileSize=0
LogFileDirectory=$TEMP
LogFileSizeLimit=-1
LogLevel=4
LogToStdErr=1
LogToWindowsEventLog=0

[Network]
CoreServerPort=11100
DemoServerPort=11400
FirewallExceptionEnabled=1
HttpServerEnabled=0
HttpServerPort=5800

[Paths]
GlobalConfiguration=$APPDATA/GlobalConfig.xml
PersonalConfiguration=$APPDATA/PersonalConfig.xml
SnapshotDirectory=$APPDATA/Snapshots

[Service]
Arguments=
Autostart=1
HideTrayIcon=0
LockWithDesktopSwitching=1

[VNC]
CaptureLayeredWindows=1
LowAccuracy=1
PollFullScreen=1


Скрипты


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

Дополнения к magos-patches

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

Стартовые скрипты

Скрипт /usr/lib/magos/rc.halt/05-update.sh предназначен для автоматического обновления операционной системы при выключении или перегрузке компьютера. Для работы скрипта в конфигурационный файл MagOS.ini добавлено три параметра:

/usr/lib/magos/rc.halt/05-update.sh
# Выключатель автоматического обновления при выключении: Yes, No
AUTOUPDATE=Yes
# Обновление указанных каталогов при выключении: boot -
UPDATE=AltLinux,boot
# Адрес сервера с которого выполняется обновление по rsync
SRCUPDATE=192.168.1.XXX/magos


Здесь: параметр AUTOUPDATE указывает, нужно или нет проводить обновление при выключении питания. UPDATE — перечисление каталогов, для которых должно проводиться обновление.

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

Исходный код скрипта:

/usr/lib/magos/rc.halt/05-update.sh
#!/bin/bash
# Initial script for MagOS-Linux Live operating system
# This script are launching before starting init from linux-live script.
# Current dir always must be set to root (/)
# All system path must be relative, except initrd dirs

export PATH=.:/:/usr/sbin:/usr/bin:/sbin:/bin

ENABLED=yes

. /mnt/live/liblinuxlive
[ -f /etc/sysconfig/MagOS ] && . /etc/sysconfig/MagOS
#. etc/sysconfig/MagOS

[ "$ENABLED" != "yes" ] && exit 0
[ "$AUTOUPDATE" != "Yes" or "$AUTOUPDATE" != "yes" ] && exit 0
[ -z "$UPDATE" -a -z "$SRCUPDATE" ] && exit 0
[ -z "$(grep changes /memory/cmdline)" ]  && exit 0
[ -n "$(grep 'from=http:' /memory/cmdline)" ]  && exit 0

if ! [ -z "$UPDATE" ] ;then
    for dirs in $(echo $UPDATE | tr ',;' ' ') ;do
        rsync -azr --delete --exclude=MagOS.ini rsync://$SRCUPDATE/$dirs/ /mnt/livemedia/$dirs/
    done
fi


Выполнено исправление существующего скрипта /usr/lib/magos/rc.preinit.d/21-ntp, выполняющего настройку NTP сервера. По всей видимости эта часть является зависимой именно от дистрибутива AltLinux, поэтому возможно его исправление в дальнейшем.

/usr/lib/magos/rc.preinit.d/21-ntp
#!/bin/bash
# Initial script for MagOS-Linux Live operating system
# This script are launching before starting init from linux-live script.
# Current dir always must be set to root (/)
# All system path must be relative, except initrd dirs

export PATH=.:/:/usr/sbin:/usr/bin:/sbin:/bin

ENABLED=yes
[ "$ENABLED" != "yes" ] && exit 0

DEBUGMODE=no
. /liblinuxlive  2>/dev/null || . /mnt/live/liblinuxlive
. /livekitlib  2>/dev/null
debug_mode "$0" "$@"

. etc/sysconfig/MagOS

if  ! [ -z "$NTPSERVERS" ] ;then
    sed -i s/'^server'/'#server'/ etc/ntp.conf
    sed -i s/'^server'/'#server'/ etc/ntpd.conf
    for a in $(echo $NTPSERVERS | tr ',;' ' ') ;do
        sed -i '/^driftfile/ s/^/server '"$a"\\n/ etc/ntp.conf
        grep -q "restrict $a" etc/ntp.conf || echo "restrict $a noquerry notrap" >> etc/ntp.conf
        sed -i s/'^#listen on 127.0.0.1'/'listen on 127.0.0.1'/ etc/ntpd.conf
        echo "server $a" >> etc/ntpd.conf
    done
fi


Скрипт установки ОС

Установка ОС при помощи специального скрипта позволяет достичь единообразия при всех инсталляциях, устранить ошибки техников, выполняющих эту работу и многократно ускорить этот процесс.

Скрипт /usr/share/magos/install/magosinstall.sh является специализированным. Выполняет создание и форматирование разделов жесткого диска. Выполняет копирование разделов репозитория с сервера magos-server на локальные диски компьютера и установку загрузчика ОС.

/usr/share/magos/install/magosinstall.sh
#!/bin/bash
#
#Usage:
# $1 - source catalog: magos testing
# Default is magos

SRC="magos"
. /etc/sysconfig/MagOS

SRCINI=$(echo $SRCUPDATE | cut -d "/" -f 2)
if ! [ -z "$SRCINI" ];then
    SRC=$SRCINI
fi
if ! [ -z "$1" ] ;then
    SRC=$1
fi
echo "-------------------------------------------------------"
echo "INSTALL MagOS Altlinux FROM HARD DISK from $SRC !!!"
echo "                                           ========="
echo
echo "Press Enter to continue, or Ctrl+C to abort..."
read junk
clear
swapoff -a
echo "======================================================="
echo "Create parition table."
parted -s /dev/sda mklabel msdos
parted -s /dev/sda mkpart primary ext3 1 30000
parted -s /dev/sda mkpart primary linux-swap 30000 36000
parted -s /dev/sda mkpart primary ext3 36000 100%
parted -s /dev/sda toggle 1 boot
echo "-------------------------------------------------------"
echo "======================================================="
echo "Make file systems on /dev/sda1."
mkfs.ext3 -L system /dev/sda1
echo "Make file systems on /dev/sda2."
mkswap /dev/sda2
echo "Make file systems on /dev/sda3."
mkfs.ext3 -L data /dev/sda3
echo "-------------------------------------------------------"
echo "======================================================="
mkdir /media/system && mount /dev/sda1 /media/system
mkdir /media/data && mount /dev/sda3 /media/data
echo "Syncing instalation data."

for dirs in $(echo $UPDATE | tr ',;' ' ') ;do
    srv=$(echo $SRCUPDATE | cut -d '/' -f 1)
    if [ "$dirs" != "boot" ] ;then
            mkdir /media/system/$dirs
            rsync -azr --delete rsync://$srv/$SRC/$dirs/ /media/system/$dirs/
            mkdir /media/data/$dirs-Data
            rsync -azr --delete rsync://$srv/$SRC/$dirs-Data/ /media/data/$dirs-Data/
        else
            mkdir /media/system/$dirs
            rsync -azr --delete rsync://$srv/$SRC/$dirs/ /media/system/$dirs/
        fi
    done

rm -rf /media/system/lost+found /media/data/lost+found
cd /media/system/boot/
bash ./Install_MagOS.bat
$(sync)
umount /dev/sda1 && rmdir /media/system
umount /dev/sda3 && rmdir /media/data
echo "-------------------------------------------------------"
echo "Instalation is OK."
echo "please reboot computer."


Из текста скрипта Вы видите, что на основной раздел, в который устанавливается ОС, выделено 30Gb, на swap – 6 Gb, а остальное отведено под раздел с данными, включая Changes и Home. Пока не используются переменные, позволяющие выносить эти параметры в конфигурационный файл или, хотя бы, в начало файла.

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

Скрипты включения в AD

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

После установки операционной системы компьютер имеет hostname=MagOS. При массовой установке компьютеров это критично, тем более, если компьютер включается в AD. Поэтому скрипты решают сразу две задачи: переименование компьютера и включение его в AD.

Небольшое замечание: имя компьютера не определяется в файле MagOS.ini, а заносится при помощи этих скриптов сразу в файл /etc/sysconfig/magos. Все прочие скрипты MagOS, запускаемые при старте операционной системы используют имя компьютера из файла /etc/sysconfig/magos.

/usr/share/magos/ad_join/ad_join.pl
#!/usr/bin/perl -w
# MagOS-linux.ru
# Author M.Fiskov

use strict;
#use Glib qw/TRUE FALSE/;
#use Gtk3 '-init';
my $hostname='';
my $username='';
my $password='';
my $domain='mydomain';
my $realm='mydomain.local';

for (my $i=0;$i<=$#ARGV;$i++){
    $_=$ARGV[$i];
    (/^--help$/) && do {&usage(); exit 0};
    (/^--hostname=/) && do { ($hostname=$ARGV[$i])=~s/^--hostname=//; };
    (/^-h$/) && do {$hostname=$ARGV[$i+1];$i++;};
    (/^--password=/) && do { ($password=$ARGV[$i]) =~s/^--password=//; };
    (/^-p$/) && do {$password=$ARGV[$i+1];$i++;};
    (/^--username=/) && do { ($username=$ARGV[$i]) =~s/^--username=//; };
    (/^-u$/) && do {$username=$ARGV[$i+1];$i++;};
}
if (open (F1,"</etc/altlinux-release") ) {
    close F1;
    &addname($hostname) && system("system-auth write ad $realm $hostname $domain $username $password")  && system("systemctl restart nm
b") && system("systemctl restart winbind") && system("systemctl restart smb");
    &wins();
    &winbind();
}else{
    &addname($hostname) && system("net join -U \"".$username.'%'.$password."\"") && system("systemctl restart nmb") && system("systemct
l restart winbind") && system("systemctl restart smb");
    &wins();
    &winbind();
};
#system("/sbin/reboot");
exit;

sub usage(){

print "Join this computer from MagOS to Active Directory Service (ADS)
-h or --hostname=       Computer name
-u or --username=       ADS administrator user name
-p or --password=       ADS administrator password
--help                  This usage
"
}

sub wins(){
    my @wins=split("\"",`/usr/bin/wbinfo -P`);
    system ("sed -i '/wins server = /d' /etc/samba/smb.conf");
    my $wsed=sprintf("sed -i \'/\\[global\\]/ s/\$/\\nwins server = ".$wins[1]."\'/ /etc/samba/smb.conf");
    system ($wsed);
    my $wgroup=sprintf("net groupmap add ntgroup=\"администраторы домена\" unixgroup=wheel rid=512 type=d");
    system ($wgroup);
    $wgroup=sprintf("net groupmap add ntgroup=\"пользователи домена\" unixgroup=wheel rid=513 type=d");
    system ($wgroup);
    $wgroup=sprintf("net groupmap add ntgroup=\"гости домена\" unixgroup=wheel rid=514 type=d");
    system ($wgroup);
}

sub addname (){
    my ($hostname)=@_;
    system ("sed -i '/netbios name =/d' /etc/samba/smb.conf");
    my $ssed=sprintf("sed -i \'/\\[global\\]/ s/\$/\\n   netbios name = ".$hostname."\'/ /etc/samba/smb.conf");
    system ($ssed);
    system ("sed -i '/HOSTNAME/d' /etc/sysconfig/MagOS");
    $ssed=sprintf("echo \"HOSTNAME=$hostname\" >>/etc/sysconfig/MagOS");
    system ($ssed);
    system("hostnamectl set-hostname $hostname");
    return 1;
}

sub winbind(){
    system ("sed -i s/'server string ='/';server string ='/ /etc/samba/smb.conf");
    system ("sed -i '/idmap backend = /d' /etc/samba/smb.conf");
    my $wsed=sprintf("sed -i \'/\\[global\\]/ s/\$/\\nidmap config $domain : backend = ad\'/ /etc/samba/smb.conf");
    system ($wsed);
    system ("sed -i '/winbind cache time /d' /etc/samba/smb.conf");
    $wsed=sprintf("sed -i \'/\\[global\\]/ s/\$/\\nwinbind cache time = 1440\'/ /etc/samba/smb.conf");
    system ($wsed);
}


Следует обратить внимание, что имя домена и realm указаны напрямую в скрипте в переменных $domain и $realm. Возможно, это не самое правильное решение…

/usr/share/magos/ad_join/ad_join_x.pl
#!/usr/bin/perl -w
# MagOS-linux.ru
# Author M.Zaripov
# No testing

use strict;
use Glib qw/TRUE FALSE/;
use Gtk3 '-init';

#standard window creation, placement, and signal connecting
my $window = Gtk3::Window->new('toplevel');
$window->signal_connect('delete_event' => sub { Gtk3->main_quit; });
$window->set_border_width(5);
$window->set_position('center_always');

#this vbox will geturn the bulk of the gui
my $vbox = &ret_vbox();

#add and show the vbox
$window->add($vbox);
$window->show();

#our main event-loop
Gtk3->main();

sub ret_vbox {
  my $vbox = Gtk3::VBox->new(FALSE,5);
  $vbox->pack_start ("Gtk3::Label"->new (" Please input password to join into domain "), 0, 0, 0);

  # create table with 2 entries
  my $table1 = Gtk3::Table->new (5, 2, FALSE);

  my $t1l0 = Gtk3::Label->new_with_mnemonic("Domain: ");
  $t1l0->set_alignment (0, 0);
  $table1->attach_defaults ($t1l0, 0, 1, 0, 1);
  my $t1e0 = Gtk3::Entry->new();
  $table1->attach_defaults ($t1e0, 1, 2, 0, 1);

  my $t1l0 = Gtk3::Label->new_with_mnemonic("workgroup: ");
  $t1l0->set_alignment (0, 0);
  $table1->attach_defaults ($t1l0, 0, 1, 1, 2);
  my $t1e1 = Gtk3::Entry->new();
  $table1->attach_defaults ($t1e0, 1, 2, 1, 2);

  my $t1l0 = Gtk3::Label->new_with_mnemonic("computer name: ");
  $t1l0->set_alignment (0, 0);
  $table1->attach_defaults ($t1l0, 0, 1, 2, 3);
  my $t1e2 = Gtk3::Entry->new();
  $table1->attach_defaults ($t1e0, 1, 2, 2, 3);

  my $t1l1 = Gtk3::Label->new_with_mnemonic("Domain Admin User Name: ");
  $t1l1->set_alignment (0, 0);
  $table1->attach_defaults ($t1l1, 0, 1, 3, 4);
  my $t1e3 = Gtk3::Entry->new();
  $table1->attach_defaults ($t1e1, 1, 2, 3, 4);
  my $t1l2 = Gtk3::Label->new_with_mnemonic("Domain Admin Password: ");
  $t1l2->set_alignment (0, 0);
  $table1->attach_defaults ($t1l2, 0, 1, 4, 5);
  my $t1e4 = Gtk3::Entry->new();
  $t1e2->set_visibility (FALSE);
  $table1->attach_defaults ($t1e2, 1, 2, 4, 5);
  $vbox->pack_start($table1, 0, 0 ,0);

  #$vbox->pack_end(Gtk3::HSeparator->new(),0, 0 ,0);
  # create table with 2 buttons
  my $table2 = Gtk3::Table->new (1, 2, FALSE);
  my $t2b1 = Gtk3::Button->new ('Join');
  $table2->attach_defaults ($t2b1, 0, 1, 0, 1);
  my $t2b2 = Gtk3::Button->new ('Cancel');
  $table2->attach_defaults ($t2b2, 1, 2, 0, 1);
  $t2b2->signal_connect (clicked => sub { Gtk3->main_quit; });
if (open (F1,"</etc/altlinux-release") ) {
close F1;
  $t2b1->signal_connect (clicked => sub { &addname($t1e2->get_text())
  || system("system-auth write ad ".$t1e0->get_text().'%'.$t1e0->get_text()." ".#domain
  $t1e2->get_text().'%'.$t1e2->get_text()." ".# hostname
  $t1e1->get_text().'%'.$t1e1->get_text()." ".# workgroup
  $t1e3->get_text().'%'.$t1e3->get_text()." ".# username
  $t1e4->get_text().'%'.$t1e4->get_text()."\"") # password
  || system("systemctl restart nmb")
  || system("systemctl restart winbind")
  || system("systemctl restart smb")
  || exit (1); });
}else{
  $t2b1->signal_connect (clicked => sub { &addname($t1e2->get_text()) #hostname
  || system("net join -U \"".
  $t1e3->get_text().'%'. # username
  $t1e4->get_text()."\"")  # password
  || system("systemctl restart nmb")
  || system("systemctl restart winbind")
  || system("systemctl restart smb")
  || exit (1); });
}
  $vbox->pack_start($table2, 0, 0 ,0);

  $vbox->show_all();

  return $vbox;
}

sub addname (){
my ($hostname)=@_;
system ("sed -i '/netbios name =/d' /etc/samba/smb.conf");
my $ssed=sprintf("sed -i \'/\\[global\\]/ s/\$/\\n   netbios name = ".$hostname."\'/ /etc/samba/smb.conf");
system ($ssed);
system ("sed -i '/HOSTNAME/d' /etc/sysconfig/MagOS");
$ssed=sprintf("echo \"HOSTNAME=$hostname\" >>/etc/sysconfig/MagOS");
system ($ssed);
system("hostnamectl set-hostname $hostname");
return 1;
}


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

Исправление проблем AD

У нас после подключения компьютера к ADS обнаружилась такая проблема: после загрузки компьютера winbind достаточно долго выполняет заполнение кэшей с информацией об AD, включая списки пользователей и группы. При этом он может зависнуть и по своему внутреннему расписанию перезапуститься, но на это может уходить много времени — до получаса. Проблема может быть связана с организацией внутренней структуры AD, а может и быть общей для всех реализаций. Известно только, что в достаточно пустой базе AD проблем не возникает. Однако у нас такая проблема была и для ее решения был изобретен приведенный ниже «костыль».

Опытным путем было выявлено, что решить проблему помогает перезапуск winbind после обнаружения им домена AD. Поэтому приведенная ниже программа запускается в качестве службы через systemd, мониторит обнаружение winbind домена, после чего выполняет рестарт winbind и завершает работу. Задержка составления списка пользователей, в этом случае, составляет 1 — 2 минуты. Если пользователь не очень быстро вводит свое имя и пароль, то он, практически, не замечает существования этой проблемы.

На этот же скрипт возложена еще одна функция — обновление системных файлов домашних папок пользователей AD, поскольку существующие в magos-patches скрипты обновляют домашнюю папку только одного пользователя, указанного в MagOS.ini — администратора системы, а обновление папок виртуальных пользователей не предусмотрено вообще. Скрипт выполняет копирование отсутствующих в домашних папках доменных пользователей скрытых системных файлов и каталогов из папки /etc/skel и назначение им прав хозяина папки. Таким образом, для обновления настроек в домашних папках пользователей нужно удалить соответствующие файлы и перегрузить службу скриптом winbind-restart. Необходимым условием корректности работы является отсутствие регистрации пользователей в системе в указанный момент.

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

/usr/sbin/winbind-restart
#!/bin/bash

export PATH=.:/:/usr/sbin:/usr/bin:/sbin:/bin

while [ "$(wbinfo --online-status | grep -i mydomain | cut -d ":" -f 2)" != " online" ]
do
    $(sleep 1)
done
$(systemctl restart winbind)

. etc/sysconfig/MagOS

# update home folders from domain users
if [ "$UPDATEHOME" = "yes" ] ;then
    DOMAIN=$(wbinfo --own-domain)
    if [ -d home/$DOMAIN ] ;then
        for LISTUSER in $(ls -1 home/$DOMAIN/); do
            $(cp -rHun etc/skel/.[a-zA-Z0-9]* home/$DOMAIN/$LISTUSER/)
            $(chown -R $LISTUSER:пользователи\ домена home/$DOMAIN/$LISTUSER/)
        done
    fi
fi


/etc/systemd/user/winbindrestart.service
[Unit]
Description=Samba Winbind Daemon restart from mydomain
After=winbind.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/winbind-restart

[Install]
WantedBy=multi-user.target


Управление системой (/root/bin)

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

Скрипт принудительного обновления операционной системы /root/bin/updatemagos.sh. После выполнения операции следует автоматическая перегрузка операционной системы.

/root/bin/updatemagos.sh
#!/bin/bash

echo "Update MagOS from Hard Disk to this computer!!!"
echo
echo "Press Enter to continue, or Ctrl+C to abort..."
read junk
clear

export PATH=.:/:/usr/sbin:/usr/bin:/sbin:/bin

SRC=192.168.1.XXX/magos
DEFAULT="AltLinux,boot"

. /mnt/live/liblinuxlive
[ -f /etc/sysconfig/MagOS ] && . /etc/sysconfig/MagOS

[ -z "$UPDATE" -a -z "$SRCUPDATE" ] && UPDATE=$(echo "$DEFAULT") && SRCUPDATE="$SRC"

if  ! [ -z "$UPDATE" ] ;then
    for dirs in $(echo $UPDATE | tr ',;' ' ') ;do
        rsync -azr --delete rsync://$SRCUPDATE/$dirs/ /mnt/livemedia/$dirs/
    done
fi

reboot


/root/bin/updateini.sh
#!/bin/bash

# This script getting file MagOS.ini from magos server to this computer

SRCI="magos-server/magos"
SRC="magos"
srv="magos-server"
. /etc/sysconfig/MagOS
export PATH=.:/:/usr/sbin:/usr/bin:/sbin:/bin

echo "Update MagOS.ini from Hard Disk!!!"

[ -z "$SRCUPDATE" ] && SRCUPDATE="$SRCI"

SRCINI=$(echo $SRCUPDATE | cut -d "/" -f 2)

[ -n "$SRCUPDATE" ] && srv=$(echo $SRCUPDATE | cut -d '/' -f 1)
if ! [ -z "$SRCINI" ];then
    SRC=$SRCINI
fi
if ! [ -z "$1" ] ;then
    SRC=$1
fi

rsync -az  rsync://$srv/$SRC/AltLinux/modules/i586/MagOS.ini  /mnt/livemedia/AltLinux/modules/i586/MagOS.ini


/root/bin/mnt.sh — достаточно простой вспомогательный скрипт подключения диска с данными пользователей и сохранениями операционной системы.

/root/bin/mnt.sh
#!/bin/sh

# mount data disk from /srv

mount /dev/sda3 /srv
#groupadd -g 501 magos
#groupadd -g 502 testing


Скрипты loadupdate и saveupdate предназначены для загрузки на тестовую машину скриптов генерации модулей и оригиналов модулей с сервера MagOS и последующей их выгрузки на сервер после внесения в них каких либо изменений.

/root/bin/saveupdate.sh
#!/bin/bash
#
# This script save update folder from this computer to magos server
# Fiskov M.M.

export PATH=.:/:/usr/sbin:/usr/bin:/sbin:/bin

ENABLED=yes
[ "$ENABLED" != "yes" ] && exit 0

. /usr/lib/magos/scripts/liblinuxlive
. /etc/sysconfig/MagOS
. /mnt/livemedia/update/conf/devel.conf

PWD=$(echo $(pwd))

cd /mnt/livemedia/update
mkdir /root/tmp/update
cp -r /mnt/livemedia/update/{*.sh,lib,conf} /root/tmp/update/
for files in $(echo $(ls 9*.sh| cut -d '.' -f 1)) ;do
    cp /mnt/livemedia/$DISTNAME/modules/$ARCH/$files.xzm /root/tmp/update/
done
cd /root/tmp
tar -czf /mnt/livemedia/update.tar.gz ./update
cd /mnt/livemedia/
scp /mnt/livemedia/update.tar.gz $USER@$SERVER:/var/www/$DISTTYPE/
rm -rf /root/tmp/update
cd $PWD


/root/bin/loadupdate.sh
#!/bin/bash
#
# This script load update folder from magos server to this computer
#

export PATH=.:/:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/magos/scripts

ENABLED=yes
[ "$ENABLED" != "yes" ] && exit 0
PWD=$(echo $(pwd))
. /etc/sysconfig/MagOS

rsync -az rsync://$SRCUPDATE/update.tar.gz /mnt/livemedia/update.tar.gz
cd /mnt/livemedia/
tar -xzf update.tar.gz
cd /mnt/livemedia/update
for files in $(echo $(ls 9*.sh| cut -d '.' -f 1)) ;do
    mkdir $files
    xzm2dir $files.xzm $files
done

cd $PWD


Скрипты обслуживания ОС

В процессе обслуживания операционной системы возникают задачи массового обслуживания компьютеров, например выполнения команд на всех компьютерах сразу. Один из вариантов решения такой задачи — параллельный доступ на компьютеры по протоколу ssh и запуск там соответствующей команды. Скрипт hostalt-create.sh не является универсальным, он предназначен для составления списка компьютеров, на которых установлен MagOS на основе сборки AltLinux. Для обнаружения компьютеров они должны иметь наименование, заканчивающееся на «-a». Список компьютеров является сохраняемым, что позволяет его постепенно расширять.

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

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

/root/bin/hostalt-create.sh
#!/bin/sh

# create list from hostalt file from programm pssh

$(nmap 192.168.1.0/24 -p T:8080 2>&1 | grep "mydomain" | grep '\-a' | cut -d " " -f 5 >> /tmp/hostalt1)
$(sort -u /tmp/hostalt1 > hostalt)


/root/bin/parallelssh.sh
#!/bin/sh

# parallelssh.sh sudo /root/bin/updateini.sh <password>

echo "parallelssh.sh <\"command\"> <password>"
echo "parallelssh.sh sudo \"/root/bin/updateini.sh\" <password>"
echo

[ -z "$2" ] && exit

sshpass -p $2 pssh -x "-o StrictHostKeyChecking=no" -h hostalt -l altlinux -A -i $1 2>&1 > /tmp/ssherr.txt
cat /tmp/ssherr.txt


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

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

Скрипты и конфигурационный файл располагаются в корневом каталоге диска, но могут помещаться в любое удобное место. Обязательное условие — файловая система, на которой они располагаются должна поддерживать Unix ACL, т. е. должна быть Posix совместимой.

Конфигурационный файл системы сборки модулей /update/conf/devel.conf.

DISTTYPE="testing"
DISTNAME="AltLinux"
ARCH="i586"

UPDETESRV=yes
SERVER=192.168.0.3
USER=altlinux

Здесь:

DISTTYPE — указывает на каталог репозитория magos-server.
DISTNAME — Название каталога дистрибутива.
ARCH — Архитектура системы.
Все три указанных выше параметра определяют путь в котором должна находиться папка с модулями на сервере и в компьютере.
UPDETESRV — выполнять или нет автоматическое обновление репозитория сервера. SERVER — адрес или URL сервера magos-server.
USER — имя пользователя magos-server, имеющего права на запись в репозиторий. В домашней папке этого пользователя должны быть созданы симлинки на соответствующие папки репозиториев.

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

/update/99-u50-example.sh
#!/bin/sh

. conf/devel.conf
NAME=`echo $0 | sed 's/\.\///'| sed 's/\..*//'`
. lib/mv.sh $NAME

epm2xzm $NAME -i 'ntpdata samba'

rm -rf $NAME
mkdir $NAME
xzm2dir $NAME.xzm $NAME

#-------------------------------------------
# Конфигурирование установленных пакетов
cp /usr/share/zoneinfo/Asia/Krasnoyarsk $NAME/etc/localtime
cp /etc/nsswitch.conf $NAME/etc/nsswitch.conf
sed -i s/'^hosts:      files mdns4_minimal \[NOTFOUND=return\]*'/'hosts:      files dns mdns4_minimal \[NOTFOUND=return\]  myhostname f
#--------------------------------------------

. lib/delhlam.sh $NAME
dir2xzm $NAME $NAME.xzm
. lib/update.sh $NAME


Скрипт, вызываемый из собственно скрипта создания модуля, выполняющий очистку мусора, оставшегося после сборки модуля командой epm2xzm.

/update/lib/delhlam.sh
#!/bin/sh

NAME=$1

rm -rf $NAME/etc/urpmi $NAME/var/cach/ldconfig $NAME/var/cach/ldconfig/ $NAME/var/cache/ldconfig/ $NAME/var/lib/apt $NAME/var/log/rpmpk
gs
rm -f $NAME/etc/ld.so.cache $NAME/etc/resolv.conf
rm -f $NAME/etc/xinetd.conf $NAME/etc/group- $NAME/etc/gshadow- $NAME/etc/passwd-


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

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

/update/lib/mv.sh
#!/bin/sh

NAME=$1
. conf/devel.conf

if [ $NAME != "99-u99-default" ] ;then
    $(sh /usr/lib/magos/scripts/deactivate $NAME.xzm)
fi
if [ -f /mnt/livemedia/$DISTNAME/modules/$ARCH/$NAME.xzm.bak ] && [ -f /mnt/livemedia/$DISTNAME/modules/$ARCH/$NAME.xzm ] ;then
    $(mv -nf /mnt/livemedia/$DISTNAME/modules/$ARCH/$NAME.xzm $NAME.xzm.old)
fi


Скрипт переносит модуль в каталог modules и копирует его в сетевой репозиторий. Устанавливает права доступа и выполняет переподключение модуля.

/update/lib/update.sh
#!/bin/bash

NAME=$1
. conf/devel.conf

if [ ! -f /mnt/livemedia/$DISTNAME/modules/$ARCH/$NAME.xzm.bak ] ;then
    $(mv /mnt/livemedia/$DISTNAME/modules/$ARCH/$NAME.xzm /mnt/livemedia/$DISTNAME/modules/$ARCH/$NAME.xzm.bak)
fi

$(mv $NAME.xzm /mnt/livemedia/$DISTNAME/modules/$ARCH/$NAME.xzm)
$(chmod 664 /mnt/livemedia/$DISTNAME/modules/$ARCH/$NAME.xzm)
$(chown :root /mnt/livemedia/$DISTNAME/modules/$ARCH/$NAME.xzm)

if [ $NAME != "99-u99-default" ] ;then
    $(sh /usr/lib/magos/scripts/activate $NAME.xzm)
else
    $(sh /usr/lib/magos/scripts/deactivate $NAME.xzm)
    $(sh /usr/lib/magos/scripts/activate $NAME.xzm)
fi

[ "$UPDETESRV" != "yes" ] && exit 0
$(scp /mnt/livemedia/$DISTNAME/modules/$ARCH/$NAME.xzm $USER@$SERVER:~/$DISTTYPE/$DISTNAME/modules/$ARCH/)


Дополнительные скрипты, исправляющие работу программ magos и операционной системы

В MagOS не совсем верно реализован механизм подключения папок /tmp и /var/tmp в файловую систему tmpfs. Имеется Unit systemd для подключения /tmp в файловую систему tmpfs, однако он не включен. Для его включения выполнено размещение символической ссылки в каталоге /etc/systemd/system/local-fs.target.wants:

tmp.mount -> /lib/systemd/system/tmp.mount
var-tmp.mount -> ../var-tmp.mount

Unit var-tmp.mount просто не реализован. MagOS же при включении опции VARTMPFS делает символьную ссылку /var/tmp → /tmp. Для сервера печати CUPS это не допустимо, поэтому соответствующий unit приходится реализовывать самостоятельно.

/etc/systemd/system/var-tmp.mount
[Unit]
Description=Temporary Directory
Documentation=man:hier(7)
Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target

[Mount]
What=tmpfs
Where=/var/tmp
Type=tmpfs
Options=mode=1777,strictatime


Unit для подключения каталога /var/tmp в файловую систему tmpfs.

/etc/systemd/system/ntp-units.d/ntpd.service
[Unit]
Description=Network Time Service
After=syslog.target network.target

[Service]
EnvironmentFile=/etc/sysconfig/ntpd
ExecStart=/usr/sbin/ntpd -d $NTPD_ARGS

[Install]
WantedBy=multi-user.target


Инструкция для техников


Установка Alt Linux в режиме MagOS:

  • Выбрать в bios загрузку из сети.
  • Загрузить AltLinux.
  • Зарегистрироваться пользователем «altlinux» используя пароль по умолчанию.
  • Если требуется сохранение данных пользователей, то подключиться к сети и сохранить данные в сеть. Все данные на жестком диске будут уничтожены!
  • Открыть консоль.
  • Получить права администратора:

$ su -
Password:

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

  • Выполнить команду:

# /usr/share/magos/install/magosinstall.sh

  • Для установки системы придется трижды нажать клавишу «Enter». Имеется возможность отказаться от установки на первом этапе, нажав ^C.
  • Перегрузить компьютер. Если перегрузки не происходит, то выполнить аппаратный сброс.
  • Зайти в среду пользователя под пользователем altlinux.
  • Открыть консоль.
  • Получить права администратора, как было описано выше.
  • Ввести компьютер в домен при помощи команды:

# /usr/share/magos/ad_join/ad_join.pl -h <hostname> -u <username> -p <password>

Где:

hostname — Имя компьютера. Одновременно производится переименование компьютера.
username — Имя администратора домена mydomain.local.
password — Пароль администратора домена mydomain.local.

При правильном выполнении команды будет написано:

Joined 'Имя компьютера' to dns domain 'mydomain.local'

На прочие сообщения можно не обращать внимание.

  • Проверить подключение компьютера к домену:

    # wbinfo -u
    

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

    В результате выполнения команды будут выведен список всех пользователей домена.
  • Перегрузить компьютер.
  • Зарегистрироваться на компьютере при помощи учетной записи пользователя домена.
  • Подключить сетевые ресурсы, для этого открыть файловый браузер, в нем открыть сетевой ресурс, например «новый_диск» на боковой вкладке. Ввести пароль пользователя.
    Выбрать переключатель «Запомнить навсегда». В противном случае пользователю придется вводить пароль после каждого нового входа на компьютер.
  • Восстановить данные пользователя на компьютере.
  • Отключить сетевую загрузку в bios компьютера.

Вынос ярлыков на рабочий стол

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

Авторы: Горошкин Антон Николаевич, Фисков Михаил Михайлович.
Tags:
Hubs:
+15
Comments 9
Comments Comments 9

Articles