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

При выполнении этой работы ставилась задача минимизации времени на обслуживание сети из большого количества 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, образ блочного устройства);
http://server/path/… — источник доступный по HTTP (используется httpfs);
ssh://server/path/… — источник доступный по SSH (исползуется sshfs);
ftp://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 компьютера.

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

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

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

ссылка на оригинал статьи http://habrahabr.ru/post/270337/

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *