В номере редактор английской версии


OpenBSD - храним конфигурацию как новенькую с помощью sysmerge



Pdf просмотр
страница2/7
Дата19.11.2016
Размер4.58 Mb.
Просмотров1952
Скачиваний0
1   2   3   4   5   6   7
OpenBSD - храним конфигурацию как новенькую с помощью sysmerge
www.bsdmag.org
11
mergemaster, способную только запускать diff над файлами, и показывать интерфейс взаимодействия пользователя sdiff, если файлы различались.
Сегодня, мы всё еще используем некоторые важные части от mergemaster, такие как механизмы сравнения diff и compare. А также задействовали некоторые идеи от таких утилит из NetBSD как etcupdate, или etc-update из Gentoo.
Настоящее
На момент написания этой статьи, sys- merge занимает ровно 714 строк (mergemaster была примерно в 2 раза больше). Обе утилиты используют примерно одни и те же функции, однако mergemaster допускает, что многие из них опциональны.
Мы же, в то время, предпочитаем, чтобы sysmerge был насколько можно более простым, без этого безумного количества параметров.
Программа sysmerge производит всю свою работу в каталоге WKRDIR, который по умолчанию указывает на /var/tmp/sysmerge.XXXXXXXXXX.
Все новые файлы устанавливаются сначала в TMPDIR/temproot, а архивные копии рабочих файлов помещаются в TMPDIR/temproot. Системные сообщения можно прочитать в лог-файле WRKDIR/
sysmerge.log.
Все параметры к утилите можно найти в ее документации, поэтому поговорим только о самых распространных вариантах ее использования.
Есть три способа запуска sysmerge: вообще без параметров (режим по умолчанию), в режиме пакетной обработки (-b), или же в полноценном режиме замены
(-d). Хотя пакетная обработка (batch) может быть скомбинирована с режимом полной замены (diff), как мы в дальнейшем убедимся, такой вариант не имеет большого смысла.
Сравнение производится между текущими, рабочими файлами, которые установлены в системе, и теми, что мы называем референсными (находящимся в сетах
(x)etcXX, или же в директории с исходными текстами
OpenBSD от нового релиза).
Итак, каждый из режимов будет запущен при наличии референсных файлов.
Ключ -s используется для указания пути к файлу etcXX.tgz, либо же к дереву исходных текстов
OpenBSD (обычно размещается в /usr/src).
Ключ -x используется для указания пути к файлу xetcXX.tgz.
Эти ключи необязательны: sysmerge по умолчанию будет использовать /usr/src (т.е. запустится как `sys- merge /usr/src`).
Далее запускаются проверки на целостность, чтобы убедиться, что владельцы и разрешения файлов на рабочие и/или обновленные файлы и ссылки совпадают с референсными.
В конце процедуры запускается утилита mtree — для проверки, что нет пропавших директорий и что на них выставлены нужные права.
Обратите внимание, что из-за специфики следующих файлов, они всегде будут исключены из процесса сравнения:
• /etc/*.db — файлы баз данных passwd и login.
conf создаются соответствующими утилитами
• /etc/mail/*.db — файл БД sendmail создается из плоского текстового файла с помощью makemap
• /etc/passwd — генерируется с помощью pwd_
mkdb из файла master.passwd
• /etc/motd – трогать этот файл нет смысла
• /etc/myname –
FQDN-имя машины, переписывать не надо
• /var/db/locate.database — файл БД для locate,
Листинг 1. Сравнение использования sysmerge и mergemaster
Usage: mergemaster [-scrvhpCP] [-a|[-iFU]] [--run-updates=always|never]
[-m /path] [-t /path] [-d] [-u N] [-w N] [-A arch] [-D /path]
usage: sysmerge [-bd] [-s [src | etcXX.tgz]] [-x xetcXX.tgz]

12/2011)
12
УГОЛОК РАЗРАБОТЧИКА
генерируется с помощью locate.updatedb
• /var/db/sysmerge/{etc,src,xetc}sum
– контрольные суммы, создаваемые sysmerge
• /var/games/tetris.scores
— переписывать рекорды не нужно ;-)
• /var/mail/root — письмо для root об окончании процесса установки
Некоторые файлы и/или директории могут быть добавлены в «игнорируемый» список. Добавляя строку в файл /etc/sysmerge.ignore мы тем самым говорим sysmerge пропустить его из процесса сравнения.
Может быть удобно при некоторых установках.
Хороший кандидат на пример — файл /etc/pf.conf.
Когда следующие файлы установлены и/или обновлены sysmerge, то вызывается их управляющая утилита, чтобы значения в плоских файлах и в этих базах совпадали:
• /dev/MAKEDEV — MAKEDEV(8)
• /etc/login.conf — cap_mkdb (только если /etc/
login.conf.db уже существует)
• /etc/mail/access, genericstable, mailertable, vir- tusertable — makemap(8)
• /etc/mail/aliases — newaliases
• /etc/master.passwd — pwd_mkdb
Запускаем в режиме по-умолчанию
Это тот режим, в котором большинство людей обычно и запускает программу. В нем sysmerge проводит массу работ, чтобы произвести обновление без лишнего дергания администратора.
• Файлы, с одинаковым CVS Id будут пропущены при сравнении (т.е. добавлены в «игнорируемый» список).
• Будет произведена специальная проверка конфигурационных файлов sendmail, потому что в них содержится дата и директория сборки. А это означает, что они всегда будут отличаться от текущих, установленных в данной системе.
Поэтому sysmerge включит их тоже в список пропуска, пока не доказано, что они реально и по существу отличаются.
• Пропавшие файлы и ссылки будут автоматически восстановлены.
• Существующие файлы, что отличаются от новых референсных, будут автоматически обновлены без дополнительных вопросов, если следующие критерии соблюдены: a) различаются только
CVS Id; b) текущий файл отличается от нового, но на самом деле один и тот же [*]; c) файл бинарный
• Отсутствующие пользователи и/или группы будут добавлены в систему.
[*] это может быть сделано с помощью контрольной суммы; текущие файлы хранят свои в файлах
/var/db/sysmerge/{etc,src,xetc}sum, а новые референсные файлы хранят в рабочей директории
WRKDIR; в оригинале идея была заимствована из mergemaster.
Если решение невозможно принять автоматически, то sysmerge предложит администратору интерфейс sdiff, где можно будет произвести замену вручную
(sdiff также может быть пропущен, чтобы позволить человеку лично «слепить» нужные файлы позднее — это верно для всех режимов работы).
Запускаем в пакетном режиме
В этом режиме sysmerge будет вести себя также, как и в стандартном, однако интерактивное взаимодействие
(т.е. sdiff) будет отключено. Администратор сможет произвести необходимые изменения в файлах позже, а найти их в директории TEMPROOT. Такой режим, в частности, удобен, когда нужно произвести массовые обновления на множестве машин в автоматическом режиме.
Запускаем в режиме полноценной замены
Будучи в этом режиме, sysmerge не производит никаких автоматических действий, а работает в полностью интерактивном варианте. Отсутствующие файлы не будут установлены без явного подтверждения со стороны администратора, а любой отличающийся файл должен быть согласован в интерактивном диалоге. Для большинства пользователей этот режим может и не пригодиться, но его наличие позволит приблизить систему, насколько это возможно, к состоянию, как будто её только что установили.
Использование
Подразумевается, что sysmerge будут запускать после каждого обновления системы; от релиза X.Y до релиза X.Z или от одного снэпшота системы до другого. Очень важно предоставить утилите соответствующий набор обновлений, в зависимости

OpenBSD - храним конфигурацию как новенькую с помощью sysmerge
www.bsdmag.org
13
от метода обновления:
обновление было сделано за счет компиляции из исходных текстов → запустите sysmerge с параметром
/usr/src обновление было осуществлено с использованием сетов (bsd.rd) → запускайте sysmerge с параметрами, затрагивающими наборы (x)etcXX
Другими словами, после обновления вашей системы от версии OpenBSD 4.9 до 5.0, вы должны перезагрузить машину, получить пакеты (x)etc50.tgz с любого зеркала и затем:
Листинг 2. Типичный вывод от команды
sysmerge
# sysmerge -s etc50.tgz -x xetc50.tgz
===> Populating temporary root under /var/tmp/sysmerge.
PLMRVMNTiT/temproot
===> Starting comparison
===> Updating /etc/changelist
===> Updating /etc/login.conf
===> Updating /etc/moduli
===> Updating /etc/netstart
===> Updating /etc/protocols
===> Updating /etc/rc
===> Updating /etc/rc.conf
===> Updating /etc/rc.d/amd
===> Updating /etc/rc.d/ftpd
===> Updating /etc/rc.d/identd
===> Updating /etc/rc.d/ldapd
===> Updating /etc/rc.d/mopd
===> Updating /etc/rc.d/ntpd
===> Updating /etc/rc.d/rarpd
===> Updating /etc/rc.d/rc.subr
===> Updating /etc/rc.d/smtpd
===> Updating /etc/rc.d/ypbind
===> Updating /etc/rc.d/ypldap
===> Updating /etc/rc.d/ypserv
===> Updating /etc/services
===> Updating /etc/ypldap.conf
===> Updating /etc/X11/app-defaults/XTerm
===> Updating /etc/X11/xdm/Xaccess
===> Updating /etc/X11/xdm/Xresources
===> Updating /etc/X11/xdm/Xsession
===> Updating /etc/X11/xdm/Xstartup
===> Updating /etc/X11/xdm/xdm-config
===> Comparison complete
===> Checking directory hierarchy permissions (running mtree(8))
===> Output log available at /var/tmp/sysmerge.PLMRVMN-
TiT/sysmerge.log
*** WARNING: some new/updated file(s) may require a reboot
$ sudo sysmerge -s /path/to/etc50.tgz -x /path/to/xetc50.tgz
Конечно, нужно будет произвести работу только над xetc50.tgz, если X пакеты уже установлены на машине.
Над этими референсными пакетами sysmerge может работать и по сети.
$ sudo sysmerge -s http://ftp.fr.openbsd.org/pub/OpenBSD/5.0/
i386/etc50.tgz
Пример обновления
Теперь давайте посмотрим на типичный пример обновления из реального мира, где мы запустим sysmerge после того, как обновили машину с релиза 5.0 до 5.0-current. Мы также будем работать с наборами etc50.tgz и xetc50.tgz, загруженными из директории snapshots с одного из зеркал OpenBSD.
Достаточно просто, т.к. никакого ручного слияния не потребовалось :-)
Иногда, как в этом примере, sysmerge будет вас предупреждать о том, что требуется перезагрузка.
Это может произойти из-за того, что /dev/MAKEDEV и/или /etc/login.conf были обновлены. Причина — после запуска MAKEDEV сбрасываются некоторые разрешения на некоторые TTY, которые могут привести к странному поведению работающей системы. Когда же модифицируется login.conf, то бывает проще перезапустить машину, чтобы лишний раз убедиться, что все процессы получили свои новые лимиты.
Теперь же давайте обратим внимание на лог- файл (достаточно удобно иметь его под рукой, когда sysmerge находится в пакетном режиме и когда консольный вывод по какой-то причине не доступен).
Вот кусочек примерного лог-файла, в котором записываются какие действия были сделаны утилитой sysmerge. Он также содержит название директории, где находятся резервные копии файлов. Не исключена ситуация, когда по ошибке переписали нужный файл
— вы найдете его рабочий оригинал именно здесь.
С этого момента, процедура обновления завершена и вы теперь обладатель совершенно новой и с сияющей конфигурацией системой.

12/2011 14
УГОЛОК РАЗРАБОТЧИКА
На будущее
Несмотря на то, что sysmerge полностью функциональна, ее развитие не остановлено. Есть в проекте некоторые улучшения, которые позволят еще немного снизить уровень интерактивности. Одно из таких направлений — это возможность задействаования
3-х уровневого измения файлов, используя старые конфигурации, новые и установленные текущие. Это позволило бы произвести автоматические обновления над локально измененными файлами. Но поднимает новые вопросы, т.к. мы хотим быть уверенными, что ни локальные изменения, ни текущее поведение соответствующих приложений от этого не изменится.
На текущий момент рабочего кода нет, а есть только мысли и голая концепция.
Другой идеей, которая была сначала частично реализована, а потом заблокирована, это интеграция sysmerge напрямую с установщиком OpenBSD.
Это позволило бы администратору изменить конфигурационные файлы сразу же после обновления, без ухода на лишнюю перезагрузку.
Такое улучшение было успешно протестировано, но в конце концов от него пришлось отказаться, т.к. на некоторых архитектурах были ошибки с отображением информации через последовательный порт. Надеюсь, эти ошибки будут вскоре проработаны и такая возможность с инсталлятором будет возвращена снова в строй.
В общем и целом, я очень ряд текущим состоянием дел с sysmerge — этим маленьким, однако очень удобным инструментом. Поэтому рассчитываю, что старые аксакалы, что привыкли использовать свои собственные скрипты по обновлению, в перспективе перейдут на работу именно с ним.
Об авторе
Antoine Jacoutot является разработчиком OpenBSD и живет в Париже, Франция. На его счету находится разработка более 300 пакетов, он также написал утилиту sysmerge, а еще был частью команды, написавшей подсистему OpenBSD rc.d. Сегодня он разработчик GNOME и также член GNOME
Foundation. Использует OpenBSD практически для всех своих дел.
Листинг 3. Содержимое лог-файла от
команды sysmerge
===> Automatically installed file(s)
/etc/changelist
/etc/login.conf
/etc/moduli
/etc/netstart
/etc/protocols
/etc/rc
/etc/rc.conf
/etc/rc.d/amd
/etc/rc.d/ftpd
/etc/rc.d/identd
/etc/rc.d/ldapd
/etc/rc.d/mopd
/etc/rc.d/ntpd
/etc/rc.d/rarpd
/etc/rc.d/rc.subr
/etc/rc.d/smtpd
/etc/rc.d/ypbind
/etc/rc.d/ypldap
/etc/rc.d/ypserv
/etc/services
/etc/ypldap.conf
/etc/X11/app-defaults/XTerm
/etc/X11/xdm/Xaccess
/etc/X11/xdm/Xresources
/etc/X11/xdm/Xsession
/etc/X11/xdm/Xstartup
/etc/X11/xdm/xdm-config
===> Backup of replaced file(s) can be found under
/var/tmp/sysmerge.PLMRVMNTiT/backups

<>
www.bsdmag.org
15

12/2011 16
HOW-TO
Подготавливаем свое
собственное ядро
FreeBSD
У компиляции собственного ядра операционной системы имеется ряд преимуществ и недостатков. Однако, новые пользователи могут столкнуться с таким вопросом — а как именно его собирать?
Вы узнаете…
• Зачем приходится собирать собственное ядро
• Как собирать ядро FreeBSD
• Как создавать конфигурационный файл в формате BSD
• Как производить настройку ядра FreeBSD
• Как добавить модуль ядра
• Краткие заметки по поводу загружаемых модулей FreeBSD
О чем вы должны знать…
• Базовые принципы работы операционной системы FreeBSD
Д
ля ответа на этот вопрос вы должны помнить
— сборка подразумевает не только ввод пары команд. В этой статье я объясню все нюансы, которые обычно возникают при сборке ядра FreeBSD.
Зачем конфигурировать ядро?
Когда система проинсталлирована, она использует стандартное ядро, которое собрано так, чтобы запускаться практически на любом оборудовании.
Такое ядро по умолчанию включает множество разных драйверов устройств, а также дополнительные пакеты.
Т.к. предполагается, что система будет работать на каком-то конкретном «железе», то идея выбросить из ядра ненужные модули и отключить ненужные вам функции кажется здравой.
Умение построить ядро, «заточенное» под аппаратное обеспечение — это хороший навык. Ваша конфигурация ядра может также быть источником точной информации об аппаратном обеспечении.
Хотя некоторые неиспользуемые функции и драйверы непосредственно могут и не влиять на производительность системы, но они, однако, могут потреблять оперативную память.
Современные ядра лучше оснащены возможностями управления чем предшественники, т.к. они уже могут выгружать из памяти системы нежелательные драйверы. Но опции, которые оформлены не в виде модулей, а скомпилированы непосредственно в ядре, всегда остаются неизменными и их невозможно отключить. Пересборка ядра ради повышения самой производительности обычно не дает те результаты, которые мы ожидаем. Но этот процесс является достаточно рекомендуемым, чтобы всё-таки его провести.
Другая причина, подталкивающая к пересборке — это добавление новых типов устройств (например, новых

Подготавливаем свое собственное ядро FreeBSD
www.bsdmag.org
17
драйверов). Код драйвера не может быть обособленно разработан и склеен с ядром как пластилин — он должен быть интегрирован со структурой данных ядра и системных таблиц. На некоторых системах такая процедура может потребовать определенных работ по ревизии текущей версии ядра, т.е. изменения конфигурационного файла для ядра и дальнейшая пересборка последнего с нуля. На других же системах может быть достаточным только запуск программы сборки самого модуля.
В системе может быть заложена возможность концепции подгружаемого модуля устройства, т.е. такая организация кода, когда модуль подгружается в системное пространство ядра во время его работы.
Аналог из человеческой области может выглядеть так — вы производите операцию на мозге оператора, когда последний, не прерывая своей деятельности, управляет каким-либо сложным станком.
Сама сборка ядра не сложна — трудности могут возникнуть, когда вы внесете некорректные параметры.
Собираем ядро FreeBSD
Хотя примеры, которые приводятся в этой статье относятся больше к FreeBSD, аналогичный процесс конфигурирования ядра NetBSD также похож. Проект же OpenBSD разместил свою аргументацию за и против пересборки ядра. Вместо приведения их здесь, я приведу адрес сайта OpenBSD — http://www.open- bsd.org/faq/faq5.html#Why
У BSD-ядер есть имя, которое будет использоваться во время процесса конфигурирования. В качестве имени может выступать любое слово или словосочение, но следует иметь ввиду, что имя должно носить осмысленный характер, говорящей о системе или системах, на которых данное ядро будет работать. Если предполагается использовать на какой-либо одной машине, то в качестве имени ядра удобно будет взять название хоста.
Чтобы построить ядро FreeBSD, вам, в первую очередь, нужно создать конфигурационный файл, в котором должны быть перечислены параметры нового ядра. Затем нужно будет запустить команду config, чтобы создать директорию для создаваемых объектов и модулей ядра. Название директории будет таким же, что и у названия конфигурационного файла, и там же будет храниться сам созданный файл ядра.
Файлы, необходимые для построения BSD-ядра, хранятся в директории /usr/src/sys, которая обычно представлавляет из себя символическую ссылку на директорию /sys. Далее по тексту, я буду использовать имя SYS в качестве обозначения этой директории и чтобы подчеркнуть то факт, что неважно, где именно она находится. Если вы не можете найти директорию для компиляции для вашей машины, то обратитесь к справке на сайте дистрибутива операционной системы.
Вот список файлов, выдаваемых по команде ls -F для директории SYS на FreeBSD-машине:
Директория i386 содержит модули, специфичные для этой архитектуры.
Другой важный каталог в структуре директории SYS
— это SYS/arch/conf, где хранятся конфигурационные файлы ядер; каждый файл предназначен для своего конкретного ядра. В этой статье я буду подразумевать, что вы используете архитектуру Intel 386, хотя
FreeBSD поддерживает и ряд других, таких как amd64, ia64, powerpc, sparc64. Команда config будет зачитывать содержимое конфигурационного файла из каталога SYS/arch/conf и создаст соответствующую директорию SYS/compile/KERNEL_NAME.
Например, для только что установленной системы, будет использоваться базовое ядро под названием
GENERIC. Для него же файл конфигурации будет называться SYS/i386/conf/GENERIC, а сам каталог сборки ядра, соответственно SYS/compile/GENERIC.
Остальные подкаталоги в SYS содержат различные
Листинг 1. Содержимое директории SYS
# ls -F
Makefile ddb/ libkern/ netnatm/ rpc/
amd64/ dev/ mips/ netncp/ security/
arm/ fs/ modules/ netsmb/ sparc64/
boot/ gdb/ net/ nfs/ sun4v/
bsm/ geom/ net80211/ nfsclient/ sys/
cam/ gnu/ netatalk/ nfsserver/ tools/
cddl/ i386/ netgraph/ nlm/ ufs/
compat/ ia64/ netinet/ opencrypto/ vm/
conf/ isa/ netinet6/ pc98/ x86/
contrib/ kern/ netipsec/ pci/ xdr/
crypto/ kgssapi/ netipx/ powerpc/ xen/

12/2011 18
HOW-TO
части ядра, из которых впоследствии будет собран единый бинарный файл. Конкретные названия файлов и директорий разнятся от одной BSD-системы к другой.
Рецепты от шефа при подготовке ядра
Следующий список отражает восемь необходимых шагов для создания ядра. Мы далее рассмотрим все из них в соответствующих разделах этой статьи.
Аудит системного оборудования
• Создание и редактирование файла конфигурации в SYS/i386/conf
• Запуск программы config из директории conf
• Запуск make depend в каталоге компиляции ядра
• Сборка ядра командой make
• Резервное копирование старого ядра и установка нового
• Тестирование и отладка нового ядра
• Документирование изменений
Аудит системного оборудования
Прежде, чем вы начнете проводить работы по конфигурированию, вам нужно выяснить, а для каких устройств нужны поддержка и драйверы? Начните с перечисления устройств, из которых составлена машина — составьте список, включая:
• Жесткие диски, CD/DVD-устройства и их контроллеры
• Сетевые карты
• Специализированное оборудование
• Клавиатура и мышь
Аудит системы может быть достаточно изматывающей задачей в мире персональных компьютеров. Зачастую, производители техники просто выдают вам товар и не говорят точно, что же находится внутри — например, такое описание как
«сетевая карта» не достаточно. Существует сотня
Листинг 2. Директория i386
# ls -F i386
Makefile compile/ ibcs2/ linux/ xbox/
acpica/ conf/ include/ pci/ xen/
bios/ i386/ isa/ svr4/
сетевых карт, которые, в свою очередь, продаются под десятком разных наименований. Очень часто, единственным способом выяснения деталей является личное открывание корпуса и визуальный осмотр изделия. Если вы знаете название драйвера устройства, то вы можете заглянуть в справку, т.е. в man-страницы. К сожалению, во FreeBSD содержится очень мало информации, какие точно устройства поддерживаются данным драйвером.
Также помните, что стандартное ядро системы системы тоже пишет об оборудовании при старте.
Его вывод может быть отличной подмогой при составлении списка необходимых драйверов, которые следует включить в образ ядра. Просмотреть эти сообщения ядра можно с помощью команды dmesg.
Для дополнительной справки воспользуйтесь также файлом SYS/i386/conf/LINT.
Создаем файл конфигурации в SYS/i386/conf
Раз вы уже знаете, для какого оборудования стоит включать поддержку, то стоит подготовить этот список в формате, который понимает команда config. Для этого вам нужно будет создать конфигурационный файл в директории SYS/i386/conf. Имя файла может быть любым, но с достаточно понятным названием.
Так, чтобы даже кто-либо сторонний смог бы ответить для чего каждое ядро предназначено.
Не создавайте файл с нуля. Вместо этого рекомендуется брать конфигурацию для GENERIC и удалять ненужные части. В случае, если вы застряли над каким-то параметром и не можете определить его назначение исходя из этой статьи, то обратитесь к документации команды config. Справочные man- страницы также могут быть хорошим источником информации и обычно приводят параметры ядра. Как раз то, что именно вам и нужно. Например, справка для драйвера de(4) начинается с параметра
SYNOPSIS
device de
Это именно та строка, которую вам нужно вставить в конфигурационный файл, чтобы этот модуль был скомпилирован (конечно, такой метод достаточно оригинален, т.к. вам нужно заранее знать название драйвера, прежде чем вы получите по нему справку; в любом случае вы можете вызвать справку и как man
-k).

Подготавливаем свое собственное ядро FreeBSD
www.bsdmag.org
19
Описание формата конфигурационного файла может потребовать нескольких страниц, поэтому чтобы не прерывать процесс построения ядра, рассмотрим их более детально через одну секцию.
Запускаем команду config
Вы должны перейти в каталог SYS/i386/conf перед запуском команды config, т.к. она ожидает найти конфигурационный файл в текущей директории.
Самые простые варианты этой команды в качестве единственного аргумента берут название конфигурационного файла.
Более модные поддерживают целый ряд дополнительных опций.
Чтобы создать компиляционный каталог для ядра, описанного файлом SYS/i386/conf/EXAMPLE, мы должны действовать следующим образом:
# cd SYS/i386/conf
# config EXAMPLE
Если команда config выдает ошибки, то вы должны вернуться и отредактировать конфигурацию. В противном случае, если об ошибках сообщено не было, то можете считать, что по крайней мере конфигурация синтаксически составлена правильно и можно переходить к следующему шагу.



Поделитесь с Вашими друзьями:
1   2   3   4   5   6   7


База данных защищена авторским правом ©nethash.ru 2019
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал