Немного о том как устроена и управляется FREESCO.
Введение
Сразу оговорюсь, что речь идет о версиях 0.3.х, и текущей на данный момент являеться 0.3.4. Также подразумевается инсталляция на жесткий диск, иное оговаривается.
Этот документ НЕ является официальной документацией, а отражает мой личный взгляд на внутреннее устройство FREESCO, сформировавшийся в процесе разработки нескольких пакетов.
Предназначен всем кто желает более детально ознакомиться с работой FREESCO. На данном этапе он не охватывает все особенности, а только те, с которыми я столкнулся во время работы. Скорее всего здесь есть ошибки и смысловые, и уж точно орфографические :). Документ этот находится в работе, будет публиковаться по мере наполнения, одновременно с работой над ошибками. Замечания, дополнения, советы приветствуются....
Также, вы можете запросто внести вклад, описав работу какой-либо функциональной части FREESCO. В особенности интересует работа с туннелированием pptp и pppoe. А также части с которыми нет проблем :) но просто вы знакомы с их работой более глубоко чем простой фрискоид, "поставил и забыл". Вся система стремиться к этому, но проблемы всеже возникают.
FREESCO -- это дистрибутив Линукс основанный на Slackware, точнее на ZipSlack39 (небольшом дистрибутиве который готов к работе сразу после распаковки на любой FAT/FAT32 раздел). В оригинале ядро версии 2.0.37, но естественно было пересобрано и подогнано под нужды роутинга.
Сейчас версия ядра 2.0.39.
Хотя была попытка в версии 0.3.3 перейти на ядро 2.0.40, оно не прижилось из-за своей нестабильности :(
Учитывая тот факт, что Slackware являеться самым чистым ЛИНУКСОМ из всех популярных сборок линуксов :) а также, одним из самых старых дистрибутивов, можно смело утверждать что под FREESCO можно собрать любой линукс-софт который может собраться на ядрах 2.0.х :)
Проблемы могут возникнуть, как правило у многопоточных приложений... Хотя и с ними бороться можно :)
Описание основных возможностей вы можете найти или на официальном сайте http://www.freesco.org/?L=overview или здесь.
Благодаря тому что основной код и утилиты FREESCO упакованы в один файл, который являеться образом рам-диска,
система гарантированно рабочая на широком спектре поддерживаемого оборудования и будет ваполнять основные функции.
Вне этого файла находяться:
- ядро (для возможности замены /kernel)
- утилита конфигурирования (/setup)
- дерево папок для конфигурирования (/bin, /etc, /kbd, /drv, /pkg)
- файлы конфигурация (/etc)
- необязательно - драйвера дополнительных устройств(/drv) и раскладки клавиатуры(/kbd)
- дерево папок для дополнительных модулей (/pkg)
Наверх
Порядок загрузки системы и пакетов
Если FREESCO установлена не на ext2 то первоначальная загрузка системы происходит в DOS, с последующим запуском загрузчика loadlin с ядром и корневой файловой системой в качестве параметров. Подробно на этом этапе останавливаться пока не будем. Может кто опишет наиболее удачную конфигурацию загрузки в DOS вместе со scandisk и т.д.
После загрузки ядра и удачного монтирования корня файловой системы,
происходит запуск файла /etc/rc в котором происходит следующее:
Линковка файлов, так как многие файлы это просто ссылки на один скрипт или бинарный файл в в котором реализованы их функции, они просто узнают под каким именем были вызваны, ту функциональность и обеспечивают.
К примеру:
/bin/utils - реализует множество функций в /bin:
a:, backup, basename, clr, cp-rf, crontab, dir, dirname, edit, free, fromdos, grep, hostname, installpkg,
listpkg, ll, lsmod, minicom, netinfo, play, ps, removepkg, report, runchk, sysedit, sysinfo, todos, uname,
uptime, useradd, userdel, useredit, userlist, utils.
dropbear: dropbearkey и ssh
Вы запросто это увидите сами по совпадающему размеру многих файлов.
Создаются директории которые не являются критическими для загрузки,
но впоследствии важны для функционирования системы и сервисов (cron, dhcp и т.д.).
Следующий пункт это перелинковка директорий, это важно чтобы знать соответствие директорий на дискете и в работающей системе.
ln -s /mnt/bootdev/router /boot ln -s /boot/pkg /pkg ln -s /pkg/home /home ln -s /pkg/rc/rc_user /rc/ ln -s /pkg/bin /usr/bin ln -s /pkg/sbin /usr/sbin ln -s /pkg/addons /wwa/cgi/addons
Далее происходит установка безопасности доступа к Веб-панели управления путем линковки файла паролей '.htpasswd' в папку с выполняемыми скриптами...
ln /etc/.htpasswd /wwa/cgi/.htpasswd
После этого запускается 'syslog', и монтируется /mnt/bootdev.
Следующее относиться только к инсталляции на жестком диске.
Как раз в этот момент и используется параметр BOOTDEV который мы указывали при запуске loadlin...
Ошибка возникает как правило при неверном указании номера раздела соответствующего
физическому расположению записей в MBR (Master Boot Record).
Даже если у вас там всего один раздел, он не обязательно первый. В особенности, если диск не новый а был переразбит...
Поэтому если у вас играет противная музыка, попробуйте изменить либо номер раздела для загрузчика loadlin (параметр BOOTDEV),
либо перенесите запись на первое место (задача не тривиальная, не многие утилиты умеют такое, но выполнимая).
Я для этого использовал утилиту pedit из комплекта Partitision Magic 7.0.
При удачном монтировании создается файл "жизни" нашей системы /etc/live.cfg, в котором указываются текущие настройки нашей системы. Режим в котором стартовала система, версия сборки, загрузочный раздел, и время старта... В режимах динамического получения IP он тоже туда заноситься, правда немного позже. Последним этапом монтирования, является синхронизация файловой системы с записями о ней... Об этом чуть позже и подробнее я расскажу... Вот теперь, можно считать что система стартовала, все остальное уже будет касаться прикладных програм и дополнительного оборудования, конфигурируемого отдельно от запуска системы...
Происходит линковка и копировани файлов и директорий, которые необходимы для последующего функционирования системы и находятся на примонтированом загрузочном разделе.
cp-rf /boot/etc /etc
Вот в этот момент происходит первое чтение системной конфигурации и система начинает конфигурироваться в указанном режиме. Назначаются имя и домен нашего хоста, echo "$HOSTNAME.$DOMAIN" >/proc/sys/kernel/hostname
Подключается или создается своп если указан.
Запускается вторая консоль, производится запуск первого сетевого интерфейса, локальной петли.
ifconfig lo 127.0.0.1 route add -net 127.0.0.0
Сканируется дерево пакетов и линкуется в соответствующее рабочее дерево. После этого выполняется rc_main boot, то есть выполняются секции boot из всех пакетов нашей системы.
И происходит переход в указанный режим работы. Если это первая загрузка то выполняются показ лицензии и производится начальное конфигурирование системы с последующим обязательным вызовом setup и перезагрузкой. Если выбран режим mv2hd, производятся такие действия:...............
При необходимости подключаются дополнительные рам диски... и на них переносится загрузочный раздел... и основная библиотека libs.so.5. В случае неудачи также возможна нехорошая музыка и останов системы (halt).
На этом этапе выполнение файла /etc/rc завершается, и управление передается /rc/rc_boot.
При входе пользователя в систему /bin/sh выполняет также скрипт /etc/profile.
Наверх
Пакеты
- Инсталляционные скрипты пакетов
- rc_xxx: файлы управления
- packager: создание пакетов для FREESCO
Но сначала, о самих инсталяционных пакетах:
Пакет с дополнительным софтом для FREESCO представляет собой набор из двух, или более файлов.
Одним из которых является скриптом установки, а остальные это как правило упакованные архивы
в формате '*.tgz' с программами и данными.
В скрипте установки находятся все необходимые данные для верной установки пакета и возможно
дополнительных библиотек.
И при установке необходимо указывать именно его имя, а не имя архива.
А он вместе с менеджером установки сделает все остальное.
Более подробно процедура уcтановки описана в Интсталляция пакетов.
Инсталляционные скрипты пакетов
Инсталяционный скрипт представляет собой как правило программу командной оболочки. Состоит из двух частей: объявление и определение переменных используемых в программе, и оператора выбора case, в котором анализируется переданный параметр командной строки. Этот скрипт не вызывается вручную, он предназначен только для использования с менеджером пакетов pkg.
Cписок переменных используемых в работе менеджера установки: NAME=callback_0.1_nab Имя пакета FILES="callback_0.1_nab.tgz" Первый архив пакета EXFILE="" Дополнительные архивы пакета FREESCO="0.3.0 0.3.x" Необходимая версия FREESCO допустимо использование 'x' в качестве обозначения семейства версий. PACKED=213 Упакованный размер архивов пакета (проверяется наличие места в /tmp) UNPACKED=240 Распакованный размер всех файлов пакета (проверяется наличие места в /pkg) LIBS="" Необходимые в работе библиотеки (ищет в /lib) DEPEND="" Зависимости пакет с таким именем должен существовать (ищет в /pkg/db) И краткая информация о пакете... INFO="Callback dialout support with PAP/CHAP autentification (Microsoft CBCP)" При инсталляции скрипт будет вызван с такими параметрами: info Вызывается самой первой из них, как правило отображает информацию из строки INFO preinstall Вызывается после всех проверок: соответствия версий, свободного места, зависимостей, библиотек... Содержит как правило процедуры проверки дополнительных условий инсталляции, а также может производить дополнительную подготовку системы к уствновке пакета. postinstall Вызывается после разворачивания всех архивов. Зачастую эдесь производится вызов функций настройки, и возможно запуск пакета в работу... Если эта функция вернула отрицательный результат, будет вызван uninstall. uninstall Вызывается или при неудачной инсталляции, или при удалении пакета. Не обязательно реализованы все функции... некоторые могут отсутствовать.
rc_xxx: файлы управления
В общем случае скрипта управления пакетом может и не быть. Как правило это происходит если скрипт не является демоном, и не нуждается в командах запуска, останова, управления, или настройки. Таким образом к примеру в систему разворачиваются дополнительные утилиты, типа архиваторов, или документация (man).
Но большинство пакетов имеют в своем составе скрипт управления. Он состоит из нескольких секций оператора 'case':
boot выполняется один раз при загрузке системы, позволяет выполнить некоторые
операции на начальном этапе инициализации системы.
firewall выполняется каждый раз при поднятии файрвола, особенность в том что при старте файрвола
все правила удаляются и добавляются по новой путем обхода всех rc_xxx скриптов, как системных так и пакетных.
stop останов пакета как правило проверяется запущен ли пакет а потом производится соответствующее действие.
restart как правило - stop-start
start запуск сервиса, так же как и stop.
setup настройка пакета, это может быть вызов редактора с файлом конфигурации в качестве параметра,
или свой собственный конфигуратор пакета.
status выводит состояние пакета.
Так как правила firewall вызываются при старте системы, смене режима и НЕ вызываются при останове и запуске пакетов,
возможна ситуация, когда сервис остановлен а правило еще действует. Для полной остановки и отключения
всего функционала необходимо отключить пакет. Это можно сделать или из setup или остановив пакет и
перенеся скрипт управления в /pkg/disabled. После этого имеет смысл выполнить рестарт файрвола
'rc_masq restart' чтобы измененные правила вступили в силу.
Наверх
Как работает файрвол?
Фриска - больше чем просто маршрутизатор. Она призвана защитить вашу внутреннюю сеть от доступа извне. Также она имеет на борту свои сервисы, которые тоже как правило предназначены для внутреннего использования.
Файрвол (FireWall) механизм защиты, анализирущий трафик и управляющий доступом по определенным правилам. Хотя это и одно из главных предназначений, файрвол намного более гибок. Именно он выполняет функции маскарадинга (NAT), и перенаправления портов. Он также может вести и учет трафика, хотя это отдельная весьма большая тема :).
Так как большинство предоставляемых сервисов и услуг, есть услуги по обработке трафика, то практически вся мощь защиты состоит в автоматическом формировании правил доступа на основании различных параметров, определямых вами во время конфигурирования.
Пправила доступа к сервисам которые вы определяете как
y/n/s - доступ извне/ только из сети/ без доступа.
Доверительные отношения к сетям (trusting), которые подключены к фриске.
Списки доступа (ban-list), подключаемые модули файрвола, ну и задаваемыее вручную.
Все это определяет каков будет список правил файрвола.
Эти правила доступа формируються при выполнении команды rc_masq start. Выполняеться она при смене режима роутера, а так же при получении нового внешнего IP адреса. Происходит это как правило при дозвоне диалап до провайдера, или при сбое в VPN подключении, когда оно рестартует заново. В этом случае IP адрес может измениться и все правила переписываються.
Дабы не мучаться с удалением и изменением правил, модуль rc_masq устроен по другому. Он не реагирует на параметр stop. Только на start|restart|newip. Это происходит потому что файрвол в любом случае должен защищать вашу сеть. И еще потому что он не умеет удалять правила, он очищает все правила вообще и формирует их заново, проходя по всей конфигурации.
Кроме формирования правил на основе настроек в конфигурации, он может включить и ваши правила, только разместить их нужно в специально для этого отведенном месте. Если вы введете правила, просто из командной строки, то они будут действовать, только в текущем сеансе, до перезагрузки, или до звонка провайдеру. В общем только до следующего выполнения rc_masq.
В каждом системном скрипте, в каталоге /rc, а также в каталоге скриптов внешних пакетов /pkg/rc присутствует секция firewall). Вот именно в ней и располагаються различные правила для файрвола, которые управляют доступом к конкретному сервису или установленному пакету. Файл /rc/rc_user это системный скрипт который предназначен для внесения изменений в конфигурацию, не предусмотренных в системе. В нем как и в каждом скрипте есть все секции start, stop и т.д. И обязательно секция firewall). Вот именно в нее вы и должны внести правила для файрвола, которые сочтете нужными. Тогда они станут постоянными, и вам не прийдется пересоздавать их по новой.
Наверх Про сервер времени: не умеет переходить на летнее время самостоятельно, надо вручную добавить час к смещению...
Наверх
23554250