За последние несколько лет освоена значительная часть потенциальных возможностей Linux на платформе х86, но целое поле приложений всё еще остается неразработанным. Я имею в виду специализированные мини-дистрибутивы, а именно дистрибутивы, которые «живут» на CD, содержат только софт, нужный для запуска какого-то приложения, и автоматически запускают это приложение при загрузке. То есть они используют Linux, только чтобы обеспечить основу для запуска какого-либо приложения прямо с CD
Приведу конкретный пример. Предположим, что любимые аудио-, видеофайлы вы храните на CD в нескольких форматах типа DivX, XviD, MP3, Ogg Vorbis и др. Как правило, при попытке воспроизвести файлы на компьютере, отличном от вашего, может случиться следующее: на компьютере отсутствует жесткий диск; нет плеера, способного воспроизвести ваши файлы; нужный кодек не установлен; или всё это есть, но качество воспроизведения неудовлетворительное, несмотря на приличные аппаратные возможности компьютера.
Теперь представьте, что вместе с вашими файлами вы также записали на CD и мини-Linux-систему, которая способна загружаться непосредственно с CD и автоматически воспроизводить все файлы, находящиеся на нем. Такой компакт-диск был бы самодостаточным. Не нужно волноваться из-за отсутствия кодеков и вы будете уверены, что все ресурсы компьютера направлены только на воспроизведение. Фактически можно воспроизводить ваши файлы на компьютере без жесткого диска. И, конечно, как только захотите, вы сможете воспроизвести файлы с этого CD под вашей любимой операционной системой.
Такая философия не ограничена воспроизведением аудио и видео. Можно создать Linux мини-дистрибутив для любого приложения, включая игры, текстовые редакторы, мультимедиа-редакторы, программы сетевого вещания и т.д.
Позвольте мне показать главные преимущества таких мини-дистрибутивов:
— Не тратится место на жестком диске;
— Дистрибутив готов к использованию в любой момент;
— Запускается даже на бездисковой машине;
— Запускается даже там, где нет Linux, помогая его распространению.
Идея дистрибутивов «live-CD» не нова. Существует много хороших примеров как больших (DemoLinux, Knoppix), так и маленьких (LinuxBBC, Devil-Linux) дистрибутивов. Но я нашел очень мало примеров именно специализированных дистрибутивов (см. раздел «Ресурсы» в конце этой статьи).
В частности, несколько месяцев назад я искал в Сети мини-дистрибутив Linux, который мог бы загружаться и автоматически воспроизводить аудио/видео файлы с CD. Я был очень удивлен ничего не найдя. Единственной возможностью заполучить такой дистрибутив была его самостоятельная разработка, поэтому я начал работу над MoviX. Я не линукс-гуру и мои знания о воспроизведении медиафайлов близки к нулю, но прелесть открытого ПО в том, что вы можете собрать вместе программы, разработанные людьми, знающими больше вас и создающими что-то действительно новое и полезное. Я сложил воедино свои знания по работе с дистрибутивом Slackware (я любитель Slackware с 1994), MPlayer (мультимедийный проигрыватель), IsoLinux (удобный CD-загрузчик) и начал собирать свой дистрибутив.
Первоначально MoviX был представлен единственным мини-дистрибутивом, но после многочисленных откликов и запросов пользователей, проект разделился на три:
— eMoviX: мини-дистрибутив Linux (~7MB), предназначенный для записи на CD вместе с аудио-, видеофайлами, способный загружаться и автоматически воспроизводить все файлы с CD;
— MoviX: мини-дистрибутив Linux (~15MB), способный загружаться и запускать в консольном режиме интерфейс MPlayer;
— MoviX2: мини-дистрибутив Linux (~30MB), содержащий XFree86 4.2.0, способный загружаться и запускать gmplayer (GUI-интерфейс MPlayer).
Если вы используете MoviX или MoviX2, то после загрузки вы можете извлечь загрузочный CD и воспроизводить большинство типов аудио/видео CD/DVD. Короче говоря, если eMoviX делает ваш CD самодостаточным, MoviX и MoviX2 является некоей разновидностью мультимедийного «швейцарского ножа», способного превратить любой ПК в мощную мультимедийную станцию. И даже на P200MMX благодаря MPlayer можно добиться качественного воспроизведения.
Цель этой статьи — показать, что разработка специализированного мини-дистрибутива не является сложной задачей если соблюдать несколько правил. Нижеследующим описанием основных шагов, которые я прошел при сборке MoviX, я надеюсь поспособствовать появлению большего количества подобных дистрибутивов. Единственное требование — вы должны быть знакомы с процессом конфигурации и компиляции ядра и модулей.
Компиляция ядра
Во-первых, убедитесь, что ядро будет скомпилировано с поддержкой RAM-диска и loopback device.
Кроме того, лучше будет держать ядро вашей рабочей системы отдельно от ядра, используемого для нового дистрибутива. Поэтому скачайте последнюю стабильную версию ядра и распакуйте его в директорию, отличную от директории где находится ядро системы.
Установки конфигурации ядра по умолчанию близки к тому, что нам нужно. Тем не менее, находясь в директории с ядром нового дистрибутива, запустите make menuconfig и добавьте поддержку следующих модулей:
* Code maturity level options ---> Prompt for development and/or incomplete code/drivers
* Processor type and features ---> Processor family: [выберите Pentium-MMX]
* Block device ---> Loopback device support
* Block device ---> RAM disk support
* Block device ---> Initial RAM disk (initrd) support
* File systems ---> /dev file system support [выберите опцию "Automatically mount at boot"]
После этого запустите make bzImage для сборки ядра.
Создание файловой системы
Файл initrd (init Ram Disc) содержит корневую файловую систему дистрибутива. Наш первый initrd будет содержать только системные файлы, поэтому 5 Мб будет достаточно:
dd if=/dev/zero of=/dev/ram0 bs=1k count=5000
mke2fs -m0 /dev/ram0 5000
mount /dev/ram0 /distro
Вместо множества маленьких пакетов мы будем использовать стандарт де-факто для мини-дистрибутивов — пакет Busybox («швейцарский нож встраиваемой Linux»).
Инструкции по компиляции очень просты (пакет хорошо документирован), но, возможно, вы также захотите взглянуть на статью Брюса Перенса в «Embedded Linux Journal». Я предлагаю скомпилировать Busybox с поддержкой всех возможных команд, т.к. большинство из них нам понадобится. Не забудьте установить Busybox командой ./install.sh /distro, чтобы ссылки на все команды, поддерживаемые вашей копией Busybox, автоматически были созданы в /distro.
Библиотеки обычно подсоединяются динамически. Для экономии места можно скомпилировать Busybox «статически», но в дальнейшем мы собираемся добавлять в дистрибутив разнообразные пакеты, поэтому так или иначе надо оставить поддержку динамических библиотек. Для добавления библиотек, необходимых для работы какого-нибудь пакета, например Busybox, надо выполнить следующие действия:
— Получить список присоединяемых библиотек:
root# ldd busybox
libc.so.6 => /lib/libc.so.6 (0x40028000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
— Скопировать всё в /distro/lib/
Чтобы уменьшить размер библиотек, нужно удалить все отладочные (debug) файлы:
objcopy --strip-debug /lib/libc.so.6 /distro/lib/libc.so.6
В завершение нужно добавить несколько конфигурационных файлов: /distro/etc/inittab, /distro/etc/rc.d/rc.S, /distro/etc/fstab, /distro/etc/shells и /distro/etc/profile. Вот их примеры:
— /etc/inittab (пример):
# Boot-time system configuration/initialization script.
::sysinit:/etc/rc.d/rc.S
# Start a shell on the console
::respawn:-/bin/sh
# It is always good to have at least another console
vc/2::askfirst:-/bin/sh
# Reboot when ctrl-alt-del keys are pressed.
::ctrlaltdel:/sbin/reboot
# Stuff to do before halting or rebooting.
::shutdown:/sbin/swapoff -a >/dev/null 2>&1
::shutdown:/bin/umount -a -r >/dev/null 2>&1
— /etc/rc.d/rc.S (пример):
#!/bin/ash
/bin/mount -av -t nonfs
— /etc/fstab (пример):
none /proc proc defaults 0 0
— /etc/shell (пример):
/bin/sh
/bin/ash
/bin/bash
— /etc/profile (пример):
PATH="$PATH:/bin:/sbin:/usr/bin:/usr/sbin:"
LESS=-MM
TERM=linux
HOME=/root
PS1=`MoviX:\w\# `
PS2=`> `
ignoreeof=10
export PATH DISPLAY LESS TERM PS1 PS2 HOME ignoreeof
Также необходимо добавить несколько директорий: /distro/dev, /distro/mnt, distro/proc, /distro/root и /distro/tmp. Нет необходимости создавать устройства в /distro/dev, т.к. демон devfs автоматически создает их во время загрузки.
Наконец, создаем файл initrd:
umount /dev/ram0
dd if=/dev/ram0 of=initrd bs=1k count=5000
Чтобы проверить, всё ли в порядке, можно смонтировать initrd и посмотреть его содержимое:
mount initrd /distro -o loop
ls -lR /distro
После этого не забудьте размонтировать и сжать его gzip`ом.
Перед прожигом CD, будет хорошей идеей загрузиться с образом initrd для его тестирования. Создайте директорию /initrd в вашей системе, поместите туда bzImage и initrd.gz, переименуйте bzImage в vmlinuz и добавьте строки из Listing 1 в lilo.conf.
Listing 1. Добавляем строки в lilo.conf
# Linux bootable partition config begins
image = /initrd/vmlinuz
initrd = /initrd/initrd.gz
append = "root=/dev/ram0 init=/linuxrc rw load_ramdisk=1 prompt_ramdisk=0
ramdisk_size=5000"
label = Distro
read-only
# Linux bootable partition config ends
Запустите LILO, перезагрузитесь и выберите из списка «Distro» для загрузки вашего нового дистрибутива.
Создание CD
Для создания загрузочного CD, содержащего созданные нами ядро и файловую систему, нам нужен загрузочный образ. Наиболее удачным выбором является загрузочный образ IsoLinux, называемый isolinux.bin и являющийся частью пакета SysLinux.
Начнем с создания новой директории, например /cdrom. Затем создадим директорию /cdrom/isolinux/kernel; поместим файлы initrd.gz и isolinux.bin в /isolinux и ядро в isolinux/kernel. Наконец, отредактируйте isolinux.cfg в директории /isolinux (см. Listing 2):
Listing 2. Пример файла isolinux.cfg
default Distro
prompt 1
timeout 100
F1 f1.txt
F2 f2.txt
label Distro
kernel kernel/vmlinuz
append initrd=initrd.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
label hd
localboot 0x80
Пример файла f1.txt:
Welcome to my Distro!
Available boot labels:
Distro (default): boot from CD
hd: boot from HD
Пример файла f2.txt:
Credits:
Me (me@my.house)
Формат этого файла совпадает с форматом lilo.conf. Для детальной информации посетите сайт SysLinux.
Хорошей идеей является возможность вызова в процессе загрузки до 10 текстовых файлов (используя клавиши F1-F10). Это дает возможность пользователю получить доступ к документации о параметрах загрузки непосредственно во время неё. Для дистрибутива нашего типа это является полезной возможностью.
Другая приятная возможность — это способность во время загрузки показывать изображение вместо текста, например, логотип дистрибутива (поддерживается всего 16 цветов, тем не менее, попробуйте пакет BootScriptor).
Для сборки загрузочного образа CD, запустите mkisofs со следующими параметрами:
mkisofs -o /tmp/distro.iso -r -V "My distro" -v -no-emul-boot \
-boot-load-size 4 -boot-info-table -b isolinux/isolinux.bin \
-c isolinux/isolinux.boot /cdrom
Затем запишите образ на CD:
cdrecord dev=0,0 -v -eject /tmp/distro.iso
Теперь можно перезагрузить систему, чтобы убедиться, что CD действительно стал загрузочным.
Поиск оборудования
Полученный CD сам по себе уже является хорошим инструментом для проверки оборудования, и легко может быть превращен в хороший инструмент для восстановления системы. Просто загрузившись с него, вы можете определить производителя и модель практически любого оборудования ПК (кроме карт ISA), посмотрев в /proc/pci и /proc/cpuinfo. Посмотрев (при помощи dmesg) лог загрузки ядра, вы найдете информацию и о картах PnP ISA. Добавив в существующий набор пакеты типа e2fsck, вы получите все инструменты, необходимые для восстановления Linux-системы.
С другой стороны, в нашей системе пока нет поддержки сетевых, аудио-, SCSI-карт и т.д. Это не важно для rescue-CD, но совсем не подходит для нашего мини-дистрибутива.
Решением проблемы могло бы стать использование модулей ядра, но простая загрузка всех возможных модулей не выход. Нам нужен инструмент автоопределения оборудования. Для больших Linux-дистрибутивов уже разработаны инструменты автоопределения: kudzu (Red Hat), libdetect (Mandrake, теперь они тоже используют kudzu), discover (Progeny), но они слишком сложны для дистрибутива, который мы собираем.
К счастью, в нашем распоряжении есть базовые возможности процедуры автоопределения devfs. Автоматически создаваемые точки монтирования устройств можно эффективно использовать, чтобы определить, распозналось ли то или иное устройство ядром. Например, точка /dev/sound/dsp автоматически создается, только когда вы загрузили подходящий модуль для звуковой карты. Таким образом вы можете написать скрипт, который один за одним загружает аудиомодули и каждый раз проверяет, появилось ли аудиоустройство в списке или нет. Если оно появилось, можно загрузить драйвер и остановить цикл, в противном случае выгрузить модуль и продолжить перебор. См. Listing 3 — простой пример, написанный на Perl:
Listing 3. Загрузка модуля аудио-карты (на Perl)
opendir MODDIR, "/lib/modules/2.4.20/kernel/drivers/sound/";
while($mod = readdir MODDIR){
next if $mod =~ /^\.{1,2}$/;
$mod =~ s/\.o$//;
system "modprobe $mod > /dev/null 2>&1";
last if -e "/dev/sound/dsp";
system "rmmod $mod > /dev/null 2>&1";
}
closedir MODDIR;
Итак, процесс проходит по следующим этапам:
— перейти в директорию с ядром дистрибутива и активировать поддержку всех возможных модулей аудиокарт;
— скомпилировать все модули командой: make modules
— установите модули в вашу систему командой: make modules_install (чтобы избежать перезаписи истинной директории с модулями, переименуйте её перед установкой);
— перемонтируйте файл initrd.gz в /distro (не забудьте распаковать его перед монтированием);
— скопируйте вновь созданные директории /lib/modules/2.4.20 в /distro/lib/modules/; если оставшееся место меньше ~0.5 Мб, соберите новый initrd, как описывалось выше, и выделите больше места.
— добавьте скрипт для загрузки всех возможных модулей и добавьте строку вызова этого скрипта в rc.S.
Я не располагаю достаточным количеством данных, чтобы утверждать, что этот метод всегда работает, но пока я не получал негативных отзывов, так что могу сказать, что этот метод не безнадежен.
Повторяя описанную процедуру для каждого нужного вам типа драйвера, можно легко создать скрипт, способный автоопределять любое оборудование, поддерживаемое Linux на любом PC. В каждой версии MoviX можно найти работающие версии подобных скриптов.
Добавляем приложения
Как только все необходимые драйверы загружены, любое приложение, использующее только консольный режим, может быть легко добавлено в дистрибутив. eMoviX и MoviX основаны на этом принципе, т.к. MPlayer может воспроизводить аудио-, видеофайлы без X Window.
В большинстве случаев для добавления пакета в дистрибутив удобно воспользоваться механизмом autoconf/automake:
./configure --prefix=/usr/local/mplayer [further options]
make
make install
В нашем случае, чтобы переместить пакет в дистрибутив, достаточно действовать следующим образом:
— смонтировать inird в /distro;
— скопировать пакет в /distro: cp -a /usr/local/mplayer/ /distro/usr/local/;
— добавить в /distro/lib/ все библиотеки, нужные пакетам из /usr/local/mplayer/bin/;
— добавить путь /usr/local/mplayer/bin/ в переменную PATH:
PATH=$PATH:/usr/local/mplayer/bin/
— добавить в rc.S строку, создающую soft-ссылки в /distro/lib на все библиотеки
в /usr/local/mplayer/lib/ : ln -s /usr/local/mplayer/lib/* /distro/lib/
— размонтировать и сжать initrd.
Следуя данным указаниям для приложения mp3blaster, вы можете легко собрать мини-дистрибутив, способный загружаться и автоматически воспроизводить все MP3— или Ogg Vorbis-файлы (mp3blaster предоставляет консольный интерфейс). Это позволит пользователям воспроизводить свои любимые аудиофайлы на любом компьютере (конечно при условии, что аудиокарта поддерживается Linux), вне зависимости от того, какая операционная система установлена.
Работаем с X Window
Большому числу приложений для работы необходим X Window. К сожалению, пакет XFree слишком велик по размерам (~80 Мб), чтобы его можно было задействовать в нашем дистрибутиве.
Существует несколько проектов (например, DirectFB или smallX), целью которых является X Window уменьшенных размеров, но ни один из них не может соперничать с последними версиями XFree86 по поддерживаемому оборудованию. Если вы планируете использовать свой дистрибутив на большом количестве видеокарт, то, пожалуй, лучшим решением будет использование пакета XFree86. По возможности, удалите из пакета все ненужные компоненты. Более половины пакета XFree86 занято шрифтами. Т.к. в собираемом вами дистрибутиве скорее всего будет только несколько приложений, то идентифицировав действительно используемые шрифты, вы можете легко уменьшить размер пакета до 40 Мб, а удаление ненужных компонентов и библиотек может снизить размер пакета до 30 Мб.
И, конечно, вы должны создать работающий файл XF86Config, либо сгенерировать его используя команду -configure (по крайней мере, нужно задать разрешение экрана и количество отображаемых цветов), либо использовать один из шаблонов. При использовании шаблонов вам необходимо написать скрипт, способный распознавать видеокарту и устанавливать соответствующие ей параметры.
В обоих случаях хорошо иметь средство для определения наиболее важных параметров монитора, а именно: диапазон горизонтальной и вертикальной развертки. Хорошим инструментом для этого является программа ddcxinfo (являющаяся часть пакета kudzu), которая выводит нужные нам данные с помощью команд ddcxinfo -hsync и ddcxinfo -vsync. Если информация недоступна, то ddcxinfo возвращает 0-0.
Наконец, можно предположить, что вам не понадобится оконный менеджер, т.к. будет запускаться только одно приложение (это как раз случай MoviX2). Если все же он понадобится, используйте маленький менеджер, например Matchbox.
Заключение
Я надеюсь, эта статья способствует увеличению количества специализированных дистрибутивов. Их разработка не требует высокого уровня технических навыков, только хорошего знакомства с управлением Linux-системой. Кроме того, это эффективный способ значительно увеличить ваши знания о Linux и приложениях, которые вы включили в дистрибутив (в том числе благодаря отзывам пользователей).
Позвольте мне закончить благодарностью разработчикам, которые сделали свои проекты открытым—, в противном случае MoviX бы просто не существовал. Спасибо также всем людям, чьи отзывы значительно увеличили объем моих знаний о Linux и MPlayer.
Ресурсы
MoviX: movix.sf.net
Slackware: www.slackware.com
Busybox: www.busybox.net
uClibc: www.uclibc.org
MPlayer: www.mplayerhq.hu
SysLinux: syslinux.zytor.com
BootScriptor: www.bootscriptor.org
MP3Blaster: www.stack.nl/~brama/mp3blaster.html
DirectFB: www.directfb.org
SmallX: www.superant.com/smalllinux/tinyX01.html
MatchBox: handhelds.org/~mallum/matchbox
Автоопределение оборудования
Kudzu: rhlinux.redhat.com/kudzu/
Discover: hackers.progeny.com/discover
Detect: www.linux-mandrake.com/harddrake
Руководства
Документация по ядру: http://www.tldp.org/HOWTO/Kernel-HOWTO.html
Документация по загрузке: www.tldp.org/HOWTO/Bootdisk-HOWTO/index.html and
www.woalf.uklinux.net/WebWolf-HOWTO.txt
Статья Брюса Перенса о BusyBox: linuxjournal.com/article/4335
DevFS HOWTO: www.atnf.csiro.au/people/rgooch/linux/docs/devfs.html
Дистрибутивы Live CD
DemoLinux: www.demolinux.org
Knoppix: www.knoppix.org
Linux-BBC: www.lnx-bbc.org/index.html
Devil-Linux: www.devil-linux.org/
Специализированные CD-дистрибутивы
LinuxConsole: linuxconsole.free.fr
DirectPresenter: team.gcu-squad.org/~fab/DP
DyneBolic: lab.dyne.org/DyneBolic
Byzantine OS: byzgl.sf.net
Roberto de Leo получил степень (PhD) по физике в University of Cagliari и по математике в UMD. Он преподает в Alberti High School, где в 1994 году запустил первый в Италии школьный web-сервер под управлением компьютера с ОС Slackware. В свободное от исследований и преподавания время любит покопаться в своем Linux-компьютере.