Препарируем живого пингвинаЮрий «bober» Раззоренов Хакер, номер #110, стр. 110-102-1 Тонкости пересборки дистрибутива DSL под свои нуждыДистрибутивов Linux сегодня развелось предостаточно. Новые сборки появляются если не каждый день, то раз в неделю. Не все из них подходят под решаемые задачи. Если после установки обычного дистра на диск его еще можно подогнать под себя, то с LiveCD задача гораздо сложнее. Но не все потеряно. Для примера разберем Damn Small Linux 4.1 на запчасти. О дистрибутивеДистрибутив DSL (www.damnsmalllinux.org) появился в 2002 году просто как эксперимент. Его создателю Джону Андревсу было интересно, сколько приложений можно уместить в 50 Мб. Со временем DSL стал популярен, в проект пришли разработчики, а сам он теперь неизменно находится в первом десятке рейтинга сайта Distrowatch.com. Построен он на базе ядра 2.4.31, минимальными требованиями для его работы являются процессор класса 486DX и наличие 16 Мб ОЗУ, что, согласись, совсем немного. Но на памяти лучше не экономить, так как DSL умеет работать, полностью загружаясь в ОЗУ и высвобождая тем самым привод. Кстати, если оперативки недостаточно, можно дополнительно задействовать swap-раздел, созданный при установке любого дистрибутива Linux, или организовать файл подкачки на разделе Windows. Предлагается и более тяжелая версия - DSL-N (Damn Small Linux Not!), в которой используется уже современное ядро ветки 2.6 и приложения с библиотеками GTK2+. Требования к оборудованию у него, естественно, выше: процессор с тактовой частотой 300 МГц и 64 Мб ОЗУ. Кроме состава приложений, он практически ничем не отличается от DSL. Дистрибутив может работать с привода, но предусмотрен вариант запуска ISO-образа, находящегося на жестком диске (Frugall install), без проблем запускаемого в виртуальных машинах. При необходимости его очень просто установить на жесткий диск или USB-флешку. А после установки дистрибутив довольно легко превратить в полноценный Debian. Настройки, сделанные во время работы в LiveCD, можно сохранить и затем восстановить при следующей загрузке. То есть дальнейшие маневры ограничены лишь фантазией пользователя. Несмотря на свой небольшой размер, DSL содержит почти полный набор приложений для рабочего стола: XMMS (MP3, CD и MPEG), запись дисков, клиент FTP, Firefox 1.0.6, Dillo и Netrik (переработанный Links), Sylpheed, Naim (AIM, ICQ, IRC), VNCviewer, Rdesktop, gPhone, SMBclient; для работы с текстами: текстовый процессор Ted, табличный редактор Siag, три редактора - Beaver, Vim и Nano с проверкой правописания на английском. Возможны: просмотр PDF (Xpdf) и файлов MS Word, работа с графическими файлами (Xpaint и xzgv). Два файловых менеджера: основной DFM и двухоконный emelFM. А еще в его состав включено четыре сервера: SSH, NFS, веб-сервер Monkey и FTP. А также десяток простых игр. Для настройки используются понятные графические приложения. Вызвать их можно, открыв DSL Control Panel и выбрав нужный пункт, либо индивидуально из меню DSL. Тюнингу поддаются: доступ в интернет (dialup и PPPoE), сетевые устройства (в том числе и WiFi), X-сервер, рабочий стол, принтер, а также серверы, входящие в состав дистрибутива. При загрузке по <F2> и <F3> доступны различные параметры загрузки, большинство из них сходны с Knoppix. Нас пока интересует «dsl lang=ru», но его применение ничего не дает - поддержки локализации, отличной от английской, в дистрибутиве нет. Хотя имеются клавиатурные раскладки. Что касается экранных шрифтов, то их придется загружать вручную. После загрузки тебя встретит рабочий стол в стиле Windows ранних версий. Степень использования процессора и сети показывают два апплета. На столе помещены ярлыки для доступа к основным каталогам. Все просто и понятно. Если что-то не получилось с загрузкой (например, не работает мышка или тебя не устраивает частота развертки, погаси X-сервер (<Ctrl-Alt-Backspace>) и запусти скрипт xsetup.sh. Стандартные возможности по изменениюПомимо приложений, входящих в базовый набор, DSL имеет и свой репозитарий MyDSL, а также средства управления им. Пакеты можно загружать, используя утилиту MyDSL Extension Tool (mydslPanel.lua), либо скачивать вручную, взяв нужный файл с distro.ibiblio.org/pub/linux/distributions/damnsmall/mydsl. Всего доступно 11 категорий приложений на все случаи жизни. Файлы, используемые в MyDSL, могут иметь четыре расширения. Так, tar.gz - это обычные архивы, распаковываемые в каталоги /opt, /home/ или /tmp; файлы с расширением dsl - это некий аналог пакета deb/rpm, который легко устанавливается и удаляется. Есть еще и системные unc и uci. Если включено резервирование данных, то при следующей загрузке установленные приложения будут работать как ни в чем не бывало. Кроме того, расширения можно устанавливать при загрузке. Для этого достаточно сохранить их в корень на CD-ROM или в раздел жесткого диска, а при загрузке указать на необходимость поиска расширений. Если это привод, используем команду dsl mydsl, если раздел диска - dsl mydsl=hda6. Начиная с версии 2.3 можно не просто сваливать расширения в кучу на диск, а использовать каталог mydsl. Если создать каталог optional, то расширения из этой папки автоматически устанавливаться не будут. Но в меню MyDSL появится новый пункт - Install Optional Extensions, при помощи которого можно установить все приложения из optional. Кроме того, в меню установки MyDSL есть пункт Load Local, позволяющий инсталлировать ранее скачанные расширения из любого места. Выбрав в DSL Control Panel пункт Backup и введя в появившемся окне название раздела, можно сохранить настройки. Как вариант - при выходе из системы через меню можно установить флажок Backup. Чтобы восстановить настройки, при загрузке системы добавляем к параметрам, передаваемым ядру, строку с номером раздела. Например: boot: dsl restore=hda6 После этого все настройки будут восстановлены. Чтобы сделать эту систему более гибкой и дать возможность пользователю самостоятельно указывать каталоги, которые необходимо резервировать, используется файл /home/dsl/.filetool.lst. Если требуется добавить в этот список файл или каталог, просто указываем полный путь к нему, без начального слеша. Учитывая, что резервируется и сам файл, опасаться, что при последующей загрузке DSL «забудет» важные данные, не следует. Если на пути, указанном в /.filetool.lst, попадаются файлы и каталоги, которые нужно исключить из этого списка, их следует занести в /home/dsl/.xfiletool.lst. Начинаем вскрытиеЗагружаемся с диска как обычно. При помощи fdisc или cfdisc создаем раздел, куда будут распаковываться файлы: # mke2fs /dev/hda3 И монтируем dev: # mount -o dev /dev/hda3 /mnt/hda3 Если оперативной памяти недостаточно, понадобится раздел подкачки: # mkswap /dev/hda6 # swapon /dev/hda6 На этом подготовительный этап можно считать завершенным. Вся файловая система дистрибутива сжата в файл /KNOPPIX/KNOPPIX, который занимает почти 50 Мб. При загрузке он автоматически распаковывается в каталог /KNOPPIX. Изменять там что-либо бессмысленно, так как при перезагрузке все изменения улетучатся вместе с многочасовыми трудами. Для правки необходимо скопировать его на жесткий диск: # cp -Rpv /KNOPPIX /mnt/hda3/ Вот теперь у нас есть два варианта дальнейших действий. Если необходимо просто изменить конфигурационные файлы и/или добавить недостающие пакеты (при помощи простого копирования), это можно сделать либо непосредственно из загруженного DSL, либо из любого предварительно установленного дистрибутива Linux. Если имеются deb-пакеты, традиционно используемые в Debian, или программы в исходниках, тогда лучшим решением будет смонтировать данный раздел в качестве корневого: # chroot /mnt/hda3/KNOPPIX С этого момента каталог /mnt/hda3/KNOPPIX является корневым. Все пути к необходимым файлам для простоты изложения буду приводить относительно корня. Монтируем файловую систему proc: # mount -t proc /proc proc Все, теперь здесь можно работать как в полноценном дистрибутиве. Доустановив из MyDSL компилятор и apt (пакет dsl-dpkg.dsl), можно ставить, удалять программы и, конечно же, править конфигурационные файлы. Битва за консольДля начала займемся консолью. При загрузке с помощью «dsl lang=ru» устанавливаем русскую раскладку клавиатуры, переключаемую по правому <Ctrl>. Однако при вводе букв на экран вылезают нечитаемые символы. В Debian для установки необходимого экранного шрифта и клавиатурной раскладки по традиции используется пакет console-tools. Чтобы каждый раз не вводить при загрузке язык, сразу установим нужную раскладку. Берем понравившуюся, например ru4.kmap.gz или ru_win.kmap.gz, и подменяем файл, используемый по умолчанию: # cp /usr/share/keymaps/i386/qwerty/ru4.kmap.gz /etc/console-tools/default.kmap.gz Остальные каталоги и файлы с раскладками можно смело удалять, чтобы место зря не занимали. Другой способ (и, кстати, не последний) - просто прописать путь к нужному файлу вместе с командой в конце скрипта /etc/init.d/keymap.sh. Для его перезапуска набирай /etc/init.d/keymap.sh restart. В каталоге /usr/share/consolefonts никаких шрифтов не обнаружилось. Так как фонты koi8-r в консоли смотрятся не ахти, будем использовать cp866. Но для того чтобы они читались на экране, в соседний каталог consoletrans положим файл карты соответствия. Я взял из Ubuntu файлы Cyr_a8x16.psf.gz и koi2alt.trans. Чтобы при загрузке шрифты устанавливались автоматически, правим файл /etc/console-tools/config: # nano /etc/console-tools/config SCREEN_FONT= Cyr_a8x16 SCREEN_FONT_MAP= koi2alt Загрузку шрифтов и карты соответствия можно вбить прямо в файл /etc/init.d/console-screen.sh, указав полный путь через аргументы команды consolechars: consolechars -f /usr/share/consolefonts/Cyr_a8x16.psf.gz -m /usr/share/consoletrans/koi2alt.trans Теперь принимаемся за локаль. Смотрим, что дает нам вывод: $ locale LANG=C Для начала в /etc/environment меняем имеющуюся там строку на «LANG="ru_RU.KOI8-R"». Перезапускаем, пробуем locale. Не помогло, лезем внутрь скриптов. Запускаем команду: # grep -R LANG /etc Таким образом узнаем, что необходимо заглянуть еще в парочку файлов. В /etc/bash_completion есть ссылка на /etc/bashrc, в котором производится попытка считать переменную LANG из /etc/sysconfig/i18n. Аналогичная ссылка и в /etc/profile. Вся беда в том, что эти файлы образуются на лету, а при работе со скопированными на жесткий диск файлами каталог sysconfig пуст. Смотрим дальше и находим скрипт /etc/init.d/knoppix-autoconfig. В нем обнаруживаются две интересные функции, обрабатывающие параметры, передаваемые ядру при загрузке getbootparam и checkbootparam. И чуть ниже - искомая строка «[ -n "$LANGUAGE" ] || LANGUAGE="en"», то есть если строка содержит значение (не нулевая), то локаль берется по ней, если же нет, то по умолчанию принимается английская локаль. Изменяем значение en на ru или, если не предвидится использование другой локали, эту строку комментируем, а с новой пишем просто «LANGUAGE="ru"» и чуть ниже правим «LANG="ru_RU.KOI8-R"» (чтобы система меньше думала). Через пару строк при помощи конструкции «case "$LANGUAGE" in», устанавливаются все необходимые переменные, которые затем заносятся в соответствующие файлы в каталоге /etc/sysconfig/*. Строка для ru выглядит так: ru) # Russian version COUNTRY="ru" KEYTABLE="ru" XKEYBOARD="ru" KDEKEYBOARD="ru" CHARSET="koi8-r" CONSOLEFONT="Cyr_a8x16" KDEKEYBOARDS="de,us,fr" TZ="Europe/Moscow" Значение KDEKEYBOARDS на дальнейшие установки никак не влияет, но я поменял его на «us,ru». По умолчанию (то есть *) case опять же устанавливает английскую локаль, для подстраховки дополнительно переносим все данные из сектора ru в *. Почти все файлы в каталоге /etc/sysconfig образуются на лету при загрузке системы, поэтому там ничего вручную создавать не нужно. В knoppix-autoconfig это выглядит так: echo "LANG=\"$LANG\"" > /etc/sysconfig/i18n echo "COUNTRY=\"$COUNTRY\"" >> /etc/sysconfig/i18n echo "LANGUAGE=\"$LANGUAGE\"" >> /etc/sysconfig/i18n echo "CHARSET=\"$CHARSET\"" >> /etc/sysconfig/i18n echo "XMODIFIERS=\"$XMODIFIERS\"" >> /etc/sysconfig/i18n При желании можно просто закомментировать все эти строки и вручную создать файл с необходимыми переменными. Чуть ниже значения переменных KEYTABLE, XKEYBOARD, KDEKEYBOARD и KDEKEYBOARDS таким же образом заносятся в /etc/sysconfig/keyboard. И все параметры, сгенерированные knoppix-autoconfig, записываются в /etc/sysconfig/knoppix. Еще ниже нашлась строка, загружающая консольный шрифт и раскладку по умолчанию, данные о последней берутся из только что созданного файла /etc/sysconfig/keyboard. [ -f /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard [ -n "$KEYTABLE" ] && loadkeys -q $KEYTABLE [ -n "$CONSOLEFONT" ] && consolechars -f $CONSOLEFONT С уверенностью могу сказать, что ничего там в действительности не загружается, без полного пути программа просто не знает, где все это искать. Сюда также можно вставить строку с consolechars, приведенную выше. Смотрится не очень элегантно, но зато работает. Как говорится, дешево и сердито. После всех этих манипуляций можно спокойно работать в консоли с кириллицей. Но прежде чем заняться доводкой X-Window, заглянем еще в один файл, не последний по значимости на этом празднике жизни, - /etc/profile. Здесь, конечно, есть чем поживиться. Кроме переменной PATH экспортируется LANG, взятая на этот раз из /etc/sysconfig/i18n. Причем строкой «[-n "$LANG"] || LANG="de_DE@euro"» зачем-то устанавливается немецкая локаль. Исправляем на нужную. Строкой ниже, если переменная $SYSFONTACM имеет нулевое значение, для всех терминалов экспортируется карта соответствия. Я просто убрал проверку и оставил только: if ls -l /proc/$$/fd/0 2>/dev/null | grep -- '-> /dev/tty[0-9]*$' >/dev/null 2>&1; then echo -n -e '\033(K' > /proc/$$/fd/0 fi И традиционно в этот файл можно добавить лекарство от дампов: ulimit -Sc 0 &>/dev/null В этом же файле при желании можно изменить вид приглашения в bash (переменная PS1) и прописать алиасы для сокращенного ввода команд. Все, с консолью закончили, переходим к X-Window. Боремся за ХНачнем со скрипта /usr/X11R6/bin/startx. Находим здесь следующую строку: XFILE=$HOME/.xserverc Далее в параметрах загрузки идет проверка наличия строк xsetup, fbdev. Если их нет, то запускается скрипт /usr/sbin/xsetup.sh с параметром default. И в конце строка инициализации: xinit $HOME/.xinitrc -- $HOME/.xserverrc По умолчанию после работы xsetup.sh в .xserverrc заносится строка: exec /usr/bin/X11/Xvesa -mouse "/dev/psaux",5 -screen 1024x768x32 -shadow -nolisten tcp -I &>/dev/null Параметр mouse может меняться только в зависимости от типа подключенной мышки. Цифра 5 означает, что мышь с колесиком. Все хорошо, ничего не трогаем. А в .xinitrc находим такие строки: KEYTABLE=“$(getknoppixparam.lua KEYTABLE)” И чуть ниже, если переменная KEYTABLE не равна us: xmodmap –e “clear Mod4” –e “add Mod5 = Mode_switch” & В X-Window восемь модификаторов: <Ctrl>, <Shift>, <Scroll Lock> и пять виртуальных <Mod1>-<Mod5>. Разъяснение я нашел, порывшись в документации к XKeyCaps (www.jwz.org/xkeycaps). Там в описании одной из клавиатур были такие строки: "Scroll Lock" key generates Mode_switch, and the Mod5 modifier "Alt" key generates XF86ModeLock and Mode_switch, and the Lock/Mod5 modifiers Параметр Mode_switch является одним из переключателей, обеспечивающих привязку скан-кода клавиши к ее назначению. В данном случае работа похожа на параметр ModeShift в xorg.conf, то есть, пока на клавишу нажимаешь, модификатор работает (русские буквы вводятся). Чтобы клавиша «залипала», в эту строку после Mode_switch нужно добавить еще и XF86ModeLock (работает, но, правда, не всегда). Но клавишу мы пока не нашли. Пробуем. Нажатие на <Scroll Lock> ни к чему не приводит, правый <Alt> срабатывает, но в окне вместо текста кракозябры. Ну главное - работает, со шрифтами разберемся потом. Да, есть еще один момент. Все правила, необходимые для описания загружаемой клавиатурной раскладки, находятся в каталоге /usr/X11R6/lib/X11/xkb/symbols/. В некоторых дистрибутивах могут и в другом месте, но тогда на него обязательно будет указывать символическая ссылка. В варианте по умолчанию используется блок basic, из-за которого новички ругают Linux чуть ли не в каждой конференции, ссылаясь на неправильную раскладку. В этом случае точка и запятая вводятся по <Shift-6(7)> соответственно и некоторые другие знаки тоже перепутаны. В xorg.conf секцию winkeys обычно подключают при помощи XkbVariant, в которой точка и запятая уже на своих местах. Недолго думая я просто перенес строки из winkeys на basic. Кстати, в knoppix-autoconfig присутствует строка, которая выполняется при загрузке DSL в интерактивном режиме и генерирует нормальный XF86Config-4: xf86cfg -textmode -xf86config /etc/X11/XF86Config-4 >/dev/console 2>&1 И последний этап - установка шрифтов. Команда xlsfonts показала отсутствие кириллических фонтов. Просмотр каталогов /etc/X11/fonts и /usr/X11R6/lib/X11/fonts это подтвердил. К сожалению, в MyDSL предлагается только небольшой набор (distro.ibiblio.org/pub/linux/distributions/damnsmall/mydsl/system/lfp_fixed_fonts.tar.gz), но можно взять шрифты из любого дистрибутива или с сайта www.nongnu.org/freefont. А чтобы не разбираться, куда что копировать, лучше собрать их, например, в /etc/X11/fonts, а /usr/X11R6/lib/X11/fonts сделать символической ссылкой на первый. Но в DSL нет утилит mkfontdir и mkfontscale (для TTF шрифтов), необходимых для создания файлов font.dir и font.scale. Если работаем в chroot, берем их из Ubuntu/Debian, собираем шрифты в один каталог, заходим внутрь и даем команды mkfontscale и mkfontdir. После перезагрузки Х-сервера в иксах можно будет работать с кириллицей. На этом основные настройки можно считать выполненными. Остальные действия зависят только от твоей фантазии, наличия свободного времени и желания копаться в недрах дистра. Так, можно настроить оконный менеджер по своему вкусу (тема, фоновый рисунок, пункты меню), добавить скины и плагины к XMMS, прописать необходимые параметры для настройки сети, чтобы потом не вбивать их вручную, создать нового пользователя и задать пароли. Я уже не говорю об установке любимых приложений. Пингвин в праздничной упаковкеВсе предыдущие действия, как ты помнишь, мы выполняли с файлами, расположенными на жестком диске. Теперь наша задача - загнать все это туда, откуда взяли, то есть на CD-ROM. Создаем каталог в разделе с файловой системой Linux и переносим туда все файлы с CD-ROM, за исключением файла с сжатым образом KNOPPIX/KNOPPIX. Думаю, после всех выполненных действий вполне справедливо изменить заставку, появляющуюся при загрузке системы :). Для загрузки используется isolinux (syslinux.zytor.com/iso.php). Заходим внутрь /boot/isolinux и обнаруживаем несколько файлов. Большинство из них текстовые, поэтому находящиеся внутри параметры можно править. В файле boot.msg содержится приветственное сообщение; на русское менять не советую - шрифты ведь все рано не будут к тому времени загружены, но себя любимого похвалить здесь можно. Чтобы изменить параметры, передаваемые ядру, необходимо покопаться в файле isolinux.cfg. Например, чтобы немного увеличить размер надписей при загрузке, я установил значение параметра VGA=788 (или normal), что соответствует разрешению 800х600, по умолчанию VGA=791. В файлах f2 и f3 содержится help. И, наконец, картинка, отображаемая при загрузке, спрятана в файле logo.16. Чтобы ее заменить, необходимо взять 16-цветный рисунок размером 640х400 в формате png. Далее выполняем следующие команды: # pngtopnm < logo.png > logo.pnm # ppmtolss16 < logo.pnm > logo.16 # cp logo.16 /mnt/temp/KNOPPIX/logo.16 Теперь, когда все готово, осталось сжать каталог, в который мы внесли все изменения, и положить его на свое законное место, которое пока пустует. Утилита create_compressed_fs есть в DSL и KNOPPIX: # mkisofs -R -U -hide-rr-moved -cache-inodes -no-bak \ -pad /mnt/hda3/KNOPPIX | nice -n -10 \ /usr/bin/create_compressed_fs - 65536 \ > /mnt/newdsl/KNOPPIX/KNOPPIX И создаем iso-образ: # cd /mnt/ # mkisofs -pad -l -r -J -v -V "My DSL" -no-emul-boot -boot-load-size 4 \ -boot-info-table -b temp/isolinux/isolinux.bin \ -c temp/isolinux/boot.cat -o myownlinux.iso newdsl В итоге мы получили настроенную по нашему вкусу локализованную систему, автоматически подстраивающуюся под любое оборудование. |