Stalsen stalsen@trinux.atanor.ru http://trinux.atanor.ru
Intro
В серии TrinuxOid на SecurityLab.ru я хотел бы рассказать более подробно о мини-дистрибутивах (вроде Trinux или RTK), их плюсы и минусы, а также способы их успешного применения и использования. Начнем с самого начала - поговорим о процессе загрузки Trinux версий 0.71 и 0.80rc2.
От самого начала...
Давайте посмотрим, как создается сам образ и что туда добавляют. Сердце самой системы - это ядро, в обычном виде оно занимает намного больше, чем емкость всей дискеты и естественно его предется всячески урезать, вот например зачем тринуксоиду поддержка звука (да и прочей мультимедии), скази, всякиз файловых систем и пр. Это ведь можно загрузить через модули, главное включить такую функцию в ядре. Кому очень интересно посмотреть его конфиги, пора идти на www.trinux.org (или на trinux.atanor.ru для РТК). У Мэтью (создателя трунукса) ядра получаются примерно на 590 Кб!
Далее сжатый виртуальный диск, не менее важная часть. Он содержит дерево каталогов, основных команд и библиотек, без которых невозможно нормально работать. При загрузке раздел Тринукса создается в виртуальной/временной памяти машины (RAM), так что данные невозможно сохранить и чтобы вы не делали, после каждого ребута их не будет... Если вам срочно нужно что-то записать (например логи сканирования), то можете подключить любой раздел жесткого диска и писать туда (только естественно надо знать, какая файловая система на партишине, если например NTFS - придется качать модуль, если MS-DOS/FAT - качать ничего не надо, вообще модули можно подключать во время загрузки системы, добавив их на дискету/ы и в скрипт/ы, либо во время работы системы, монитровав диск с модулем и написав insmod [modname].o).
Естественно все это само зупускаться не будет, нужен загрузщик, по дефолту используется syslinux (хотя вполне подошел бы lilo (linux loader)). Финальными штрихами является дополнение основными пакетами, необходимыми для работы, а также help-файлом и лицензией.
Качаем и устанавливаем образ
Во первых для создания дискеты вам надо загрузить floppy image с trinux.sourceforge.net. Сразу говорю для счастливых пользователей Windows - Drag'n'Drop тут не прокатит. Нужен специализированный софт для записи образа, например RaWrite (можно найти на trinux.atanor.ru). Для UNIX-совместимых ОС достаточно набрать:
# dd if=[floppy_image] of=/dev/fd0И хочу заметить - Rawrite часто пишет с ошибками, то CRC, то I/O Error и т.д. Лучше используйте dd. В состав Trinux 0.70 входят два инсталяционных скрипта для UNIX и Windows. Процесс этот, собственно говоря, не занимает много времени. Вы скопировали систему, но нужна ли она без пакетов, модулей и прочих дополнений? Вот например нужно залезть на диск с NTFS под Win2k, на входе пароль, что делать? Конечно, загружаете тринукс, встявляете модуль (insmod ntfs.o), монтируйте диск и вперед. Все пакеты и модули можно найти на www.trinux.org или на trinux.atanor.ru.
Что происходит во время загрузки? v0.71
Итак, вы загружаете Тринукс, сразу появляется надпись: SYSLINUX 1.48 1999-09-26 Copyright © 1994-1999 H. Peter Anvin. Указывает на то, что в данном случае загрузщиком является SYSLINUX v1.48. Немного о нем. Он создан специально для того, чтобы грузить Линукс из "стандартных" файловых систем ОС Windows (вроде MS-DOS/FAT fs.), но никак не ext2/ext3. Подобный выбор хоть и является немного странным, но большой роли не играет. Если вы хотите все грузить из "чисто линуховской файлухи", используйте lilo. Для установки лоадера достаточно набрать команду из ДОСА:"A:> syslinux a:" или из Линукса: "# syslinux /dev/fd0".После этого шага в корне загрузочной дискеты появится файл LDLINUX.SYS. По дефолту syslinux при "запуске" судорожно пытается найти ядро с именем LINUX (хотя в строке "boot:" можно быстренько написать имя нужного kernel'а, да и еще передать какие-нибудь параметры, например местонахождение сжатого виртуального диска, а то без него будет паника), конечно это можно изменить, используя конфиг файл, но об этом чуть позже. Далее следует краткая информация о Trinux, ее авторе и копирайтах (эта инфа берется из файла license boot-диска, который в свою очередь указан в конфиге загрузщика):
==========================================================
Trinux: A Linux Security Toolkit
http://trinux.sourceforge.net
(C) 2000 Open Security Solutions
=============================================================
Any original code in this distribution, as well as most of its
source base, is free software, which can be redistributed and/or modified
under the terms of the GNU General Public License as published by the Free
Software Foundation, either version 2 of the License, or
(at your option) any later version. This program is distributed in
the hope that it will be useful but WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
Trinux was originally released by Matthew Franz <mdfranz@io.com> in 1998,
but many other folks have helped out along the way. See the Trinux Project
Page on SourceForge <http://sourceforge.net/projects/trinux/> for
more information about the project or to join support mailing lists.
Links to most of the network security tools used by Trinux are available
at http://www.opensec.net or at
PacketStorm (http://packetstorm.securify.com). This version of Trinux
relies up BusyBox (http://busybox.lineo.com). Trinux is developed using
Slackware 7.x with the help of VMWare.
============================================
Хотя данные этого сообщения время от времени меняются с течением версий (но думаю лицензия не изменится никогда) и появлется до
боли знакомая строчка "boot:". Здесь вам предстоит выбрать image или просто ввести имя ядра (но, как я уже говорил, с дополнительными
параметрами) для загрузки. Конфиг загрузщика находится в syslinux.cfg (на дискете):
------- syslinux.cfg --------- display license # понятное дело, выводит файл license promtp 1 # эта штука указывает выводить boot: и ждать ввода определенное количество времени (указанное в timeout) default floppy # по дефолту будет грузиться label floppy timeout 30 # процесс ожидания в десятых секунды (следовательно 0.3 сек) label floppy # имя данного image для ввода после boot: kernel bzimage # указывает месторасположение ярда. append initrd=initrd.gz root=/dev/ram0 pkg=tflp # append - передача специальных параметров ядру. # initrd - указывает на путь к сжатому виртуальному диску. # root - точка монтирования файловой системы. # pkg - способ загрузки пакетов. # Дальше уже все идет по аналогии: label cdrom kernel bzimage append initrd=initrd.gz root=/dev/ram0 pkg=tcd label network kernel bzimage append initrd=initrd.gz root=/dev/ram0 pkg=tnet label fixed append initrd=initrd.gz root=/dev/ram0 pkg=tfixОт вас зависит, что вы введете в строке boot: (это довольно логично, верно :-)?). Далее видим строки: Loading initrd.gz... Здесь распаковывается вирутальный диск, если открыть архив и посмотреть на initrd каким-нибудь текстовым редактором, то можно увидеть отрывки многих файлов. Чтобы все правильно изменить, вам нужно монтировать распакованный initrd:
# gzip -d initrd.gz # mount -o loop initrd /[точка-монтирования]Теперь переходите в /[точку-монтирования] и модифицируйте все по своему усмотрению. После размонтируйте устройство и упакуйте initrd:
# umount /[точку-монтирования] # gzip initrdА теперь можете положить его на дискету или слепить с ним новый образ. Loading bzimage... # загружается ядро, как я уже говорил, его конфиг можно найти на trinux.sourceforge.net/kernel/.
Идем дальше! - Часть 1
После грузится linuxrc, который устанавливает некоторые переменный ENV (такие как PATH, TERM, PS1), экспортирует их, ставит права доступа на новоиспеченные файлы (umask 022, 022 = 0644 -> rw-r--r--) и монтирует файловую систему proc (mount -t proc proc /proc), создаются каталоги /etc/tux/config (вообще /etc/tux - это зеркало каталога /tux boot-диска) и /lib/modules. Потом линкуются следующие файлы:ln -sf /proc/self/fd/0 /dev/stdin ln -sf /proc/self/fd/2 /dev/stderr ln -sf /proc/self/fd/1 /dev/stdoutОпция [-sf] означает создать символические ссылки и убрать файлы назначения. Если в самом Тринуксе посмотреть на эти файлы, то все они линкуются с терминалом, на котором вы сидите (например tty1, tty2 etc.). Потом начининаются попытки найти девайсы для загрузки пакетов, такие как флоппи, UML, CD-ROM и если что-нибудь найдено, его адрес (например /dev/cdrom) записывается в переменную $BOOT и идет следующий код:
- echo "BOOT: $BOOT"
- echo "KERNEL: $KERNEL"
- if [ "$BOOT" = "/dev/fd0" ]
- then
- BOOTFS="vfat"
- elif [ "$UML" ]
- then
- BOOTFS="ext2"
- else
- BOOTFS="iso9660"
- PREFIX="trinux/"
- fi
- echo "BOOTFS: $BOOTFS"
1-2. Уведомляет пользователя о найденном загрузочном девайсе и ядре, например: BOOT: /dev/fd0, KERNEL: 2.4.5
3-5. Если переменная $BOOT равна /dev/fd0 (дискета), тогда выводит используемую файловую систему vfat: BOOTFS: vfat.
6-8. В другом случае (то есть $BOOT не равен /dev/fd0) если переменная $UML существует, выводит BOOTFS: ext2.
10-12. И если ничего не найдено, ставится iso9660 (CD-ROM) с префиксом trinux/ (это стандартная корневая папка расположения пакетом на HDD/CD-R/RW).
13. После всех этих проверок выводится в STDOUT (на монитор) определенная файловая система (например если доступен флопик - vfat, если что-то найдено на cdrom'е - то iso9660).
Следующим шагом является выполнение init скрипта (специально создан для ввода ваших команд в начале загрузки, его можно найти по адресу tux/init/first загрузочной дискеты) и постороение RAM-диска, при успешной конфигурации увидите что-то вроде:
RAM is > 48 MB Creating /usr Creating /usr/local Creating /home --------------------FILESYSTEM CONFIGURATION--------------------- Filesystem 1k-blocks Used Available Use% Mounted on /dev/ram0 6076 1567 4509 26% / /dev/null 16000 0 16000 0% /usr /dev/null 8000 0 8000 0% /usr/local /dev/null 2000 0 2000 0% /home
Идем еще дальше! - Часть 2
Пройдя все это создается несколько директорий и симлинков, вас уведомляют об этом: "Creating misc links and directories..." и происходит опрос разделов жесткого (жестких) дисков в FS minix, ext2 и vfat + устанавливаются базовые пакеты с boot-диска (pkg.tgz и basenet.tgz), конфигурируется и запускается syslog, а также выполняется скрипт tux/init/prenet (отвечающий за настройку сети) и вот вы видите знакомое сообщение "Do you have a package disk?", разберемся с ним:if [ "$PKGSRC" = "/dev/fd0" ] then echo -n "Do you have a package disk? " read response until [ "$response" != "y" ] do if mount -t vfat -r /dev/fd0 /floppy then cd /floppy if ls *.o > /dev/null 2> /dev/null then echo "Copying modules from package disk" cp *.o /lib/modules 2> /dev/null fi for i in *.tgz do cd /floppy pkgadd $i done fiЭтот простой код проверяет значение переменной $PKGSRC, и если она равна /dev/fd0 то выводится: "Do you have a package disk?" и слушается ввод юзера, если вы ввели "у", то происходит монтирование дискеты, а также поиск и соответственно установку пакетов и модулей. Потом запускается несколько скриптов (они специально созданы для вашего редактирования), а также некоторые демоны и выводится сообщение:
"Welcome to Trinux: A Linux Security Toolkit" "Type 'man' for a list of help topics. ALT-<Left/Right>" "allows you to view other virtual terminals. "Если вы вдруг решили пересмотреть загрузочные сообщения ядра, воспользуйтесь командой dmesg (попрошу заметить, ядра, а не linuxrc). Конечно расписать весь linuxrc здесь не удастся (это ведь более 1200 строк кода!).
Но время идет, появляются новые версии, а следовательно и новые возможности, но увы не новая документация (во всяком случае применительно к Trinux :-()! Итак, что изменилось в версии 0.80rc2? Загрузщик остался тот же (SYSLINUX), но вот конфиг файл немного изменен:
------- syslinux.cfg --------- display license # выводит файл license prompt 1 # эта штука указывает выводить boot: и ждать ввода определенное количество времени (указанное в timeout) default network # по дефолту будет грузиться label network timeout 30 # процесс ожидания в десятых секунды (следовательно 0.3 сек) label floppy kernel bzimage # месторасположение ядра append initrd=initrd.gz root=/dev/ram0 pkg=floppy # передает дополнительные параметры ядру - путь находжения сжатого виртуального диска, точка монтирования и способ загрузки. Здесь каждому названию label соответствует способ загрузки пакетов. Далее все по аналогии... label cdrom kernel bzimage append initrd=initrd.gz root=/dev/ram0 pkg=cdrom label network kernel bzimage append vga=4 initrd=initrd.gz root=/dev/ram0 pkg=network console=/dev/ttyS1 label fixed kernel bzimage append initrd=initrd.gz root=/dev/ram0 pkg=fixedДа и linuxrc немного другой, не считая мелких изменений (точнее усовершенствований, которых нет смылса тут обсуждать), а вот работу с созданием виртуальных дисков (точнее разделов) следует рассмотреть:
MEMORY=`grep MemTotal /proc/meminfo | cut -d':' -f2 | cut -d'k' -f1` # узнаем общий объем оперативной памяти. echo "RAM: $MEMORY MB" # уведомляем об этом тринуксоида, например RAM: 64 MB. echo -n "RAM is " # далее видим на мониторе RAM is, а дальше в зависимости от кода (и возможностей твоего компа):
- if [ $MEMORY -lt 16000 ]
- then
- echo "< 16MB, you may run into problems"
- USR="2048"
- HOMEP="128"
- elif [ $MEMORY -lt 24000 ]
- then
- echo "> 16MB"
- USR="4096"
- HOMEP="256"
- elif [ $MEMORY -lt 32000 ]
- then
- echo "> 24MB"
- USR="8192"
- HOMEP="512"
1-5. Если RAM меньше 16 мегов, то значение USR и HOMEP (HOME) равно 2048/128 соответственно.
6-10. Если RAM больше 16 мегов, то значение USR и HOMEP (HOME) равно 4096/256 соответственно.
11-15. Если RAM больше 24 мегов, то значение USR и HOMEP (HOME) равно 8192/512 соответственно.
Это довольно интересный подход, теперь вес "каталогов" определяется не наобум/по дефолту, а в зависимости от возможностей вашего компутера. Далее идет следующий код (естественно часть пропущена):
if [ "$USR" != "" ] then echo "Creating /usr" mkdir /usr 2> /dev/null mkfs.minix /dev/ram3 $USR 2> /dev/null > /dev/null mount -t minix /dev/ram3 /usr fi fiЕсли переменная USR чему-то равна, то на мониторе ты лицезрешь "Creating /usr" и создается /usr в виртуальном диске /dev/ram3 с файловой системой MINIX размером (при условии что USR равна 2048) 2048 блоков.
Разбираемся с Дискетой! v0.71
Итак, после успешной загрузки Тринукса вам следует примонтировать загрузочную дискету (вообще это можно сделать из любой распостраненной ОС):# mount /dev/fd0 /floopy; ls readme bzImage tux nichelp ramdisk syslinux.cfg version ldlinux.sys initrd.gz pkg.tgz licenseРазберемся с каждым из них:
- readme - нижеследующее описание, только на английском.
- initrd.gz - сжатый виртульный диск.
- license - окно копирайта при загрузке тринукса (под gnu gpl).
- version - версия ОС.
- ramdisk - определяет количество и "вес" виртуальных дисков (данные статичны).
- bzimage - ядро.
- ldlinux.sys - загрузщик (SYSLINUX в данном случае).
- syslinux.cfg - конфиг загрузщика.
- pkg.tgz - необходимые команды/пакеты (типа man, pkgadd и т.д.)
- basenet.tgz - минимальный набор сетевых утилит, а также несколько необходимых библиотек.
- nichelp - инфа о проверенных сетевых картах, стабильно работающих в Тринуксе и встроенных по дефолту.
- tux - каталог со скриптами.
#cd tux; ls
- OPTIONS - настройки. Содержит следующие файлы:
- dhcp - если подключаете тринукс к сети где автоматически выдаются ip'адреса, укажите "нуждающийся" интерфейс (по дефолту стоит eth0). Сразу хочу предупредить, если вам это не надо, стирайте все сразу, просто эта процедура занимает довольно продолжительное время. network - загрузка пакетов из сети (можно использовать специальный тринуксоидовский, а можно разместить свой в локалке).
- CONFIG - конфигурационные файлы системы. Содержит следующие файлы:
- dns - адрес dns сервака, если вы имеете к нему доступ.
- eth0 - IP и маска подсети интерфейса (устанавливается если dhcp молчит). gateway - адрес шлюза.
- INIT - скрипты, выполняющиеся во время загрузки. Содержит следующий файл: 1netcfg - настраивает сетевые параметры eq поднимает интерфейс обратной петли (lo), задает начальную таблицу маршрутизации, пытается (или не пытается) найти dhcp-серверы в сети (в зависимости от содержания файла dhcp).
Разбираемся с дискетой! v0.80rc2
В чем отличия этой версии? Во первых более грамотное расположение и функционирование скриптов в каталоге tux/. Немного о них: CONFIG - сетевые и системные параметры. Содержит следующие файлы:
- server - адрес сервака для скачивания пакетов, если есть возможность, то создайте свой в сети, а так можно пользоваться этими:
http://www.ibiblio.org/pub/Linux/distributions/trinux/latest/pkg/ http://www.io.com/~mdfranz/trinux/pkg/
- pkglist - список пакетов, которые надо установить (не будет же он вам все с сервака качать!).
- kpkglist - спец. пакеты для ядра.
- crontab - почитайте мэны к крону.
- mailmon - мэлбокс для посылки системных сообщений.
- emailsrc - исходный мылбокс.
- smtp - SMTP сервак.
- dns - адрес ДНС.
- eth0 - IP/Маска подсети.
- gateway - Ваш шлюз (если есть).
- hostname - Имя вашего хоста.
- home - Новшество в Тринуксе. Позволяет указать местонахождение вашего домашнего каталога в сети чтобы сохранять там данные посредством savehome и загружать посредством gethome. Но имхо удобнее писать в разделы жесткого диска, хотя если его нет... hosts - Аналог /etc/hosts, соответствие [IP-адрес имя_машины], это если в сети нет dns сервера или она просто слишком маленькая.
- INIT - директория содержит в себе несколько "чистых" (eq пустых) скриптов для вашей модификации, допустим надо вам чтобы при загрузке выполнялись определенные команды (pkgadd, insmod и пр.), аналог rc.local в Линуксе, только их намного больше, аж 5 штук для разных периодов загрузки (например до и после установки сетевых конфигов и тд.).
- PKG - содержит конфиги для пакетов.
- OPTIONS - настройки системы:
- dhcp - использования dhcp сервера, описано выше... Во вторых немного изменилось расположение файлов в корне дискеты. Теперь уже нет всяких basenet и pkg, а есть dhcpd.tgz - поддержка dhcp и dnslibs.tgz - необходимые библиотеки. Добавлен скрипт getpkg - загрузка пакета (пакетов) с сервака.