HOWTO fbsplash

Ссылка на оригинал: http://ru.gentoo-wiki.com/HOWTO_fbsplash

С версии: 1.2


Введение

Во первых я хочу выразить благодарность gentoo-разработчику Spock за разработку gensplash (fbsplash and splashutils) и vesafb-tng. Как альтернативу этому how-to, вы можете попробовать Spock's Gensplash-in-5-easy-steps How-to.

Что такое gensplash?

Gensplash - это проект основаный Spock`ом, цель которого — создание набора инструментов, способных "обогатить" процесс загрузки Gentoo (отображение сообщений, анимации, полос состояния, и т. д.).

Что такое fbsplash (framebuffer splash)?

Fbsplash - это часть gensplash проекта. Согласно документации по fbsplash, "framebuffer splash - это особенность ядра которая разрешает отображать фоновые изображения на выбранных консолях и переключать первую консоль в так называемый безмолвный режим (silent mode),в то время когда система загружается/перезагружается/выключается. Доступ до устройства fbsplash осуществляется путем обращения к /dev/fbsplash. Для работы с fbsplash, требуется устройсво поддерживающее framebuffer.

Что такое устройство frame buffer?

Устройство frame buffer обеспечивает уровень абстракции устройствам вывода графики, что обеспечивает буфер кадров некоторых видеоустройств и интерфейс доступа к ним для программного обеспечения, т. е. программе не обязательно знать о существовании низкоуровневых системных вызовов, регистров и т. д. Доступ к устройству осуществляется через определенные файлы, обычно расположенные в ветке /dev дерева каталогов, в частности /dev/fb*.

Существует множество различных frame buffer устройств.

  1. Некоторые из них, стандартные поддерживают большинство современных видеокарт:

  2. Другие специфичные, будут работать только с определенными моделями:

Предполагается, что Fbsplash будет работать на любом из frame buffer устройств (и вообще на любой видеокарте способной на 8/15/16/24/32 битную цветовую гамму и directcolor/pseudocolor режимы).

Установка fbsplash и splashutils

В дальнейшем как пример используется vesafb-tng frame buffer устройство. Также подразумевается что вы используете Gentoo дистрибутив.

Code: Emerging splashutils & themes

# emerge -va splashutils splash-themes-gentoo splash-themes-livecd

Установка заплат ядра

Во первых убедитесь что fbsplash и vesafb-tng заплаты установлены в вашем ядре. Начиная с версии 2.6.10 ( а может и раньше ) всё это входит в gentoo-sources. Если у вас нет этих заплат вы можете взять их с Spock's homepage

Конфигурация ядра

Во первых нужно включить поддержку vesafb-tng frame buffer в вашем ядре (вы можете пропустить этот шаг если у вас уже настроен framebuffer драйвер отличный от vesa-tng, например i810fb):

Device Drivers ---> Graphics support--->:
 <*> Support for frame buffer devices
 <*>   VESA VGA graphics support
       VESA driver type (vesafb-tng)
 (1280x1024@60) VESA default mode

Еще вам нужна поддержка fbsplash в вашем ядре.

Device Drivers > Graphics support > Console display driver support:
 <*> Framebuffer Console support
 <*> Support for the framebuffer splash

Если вы хотите загружать initramfs изображение динамически во время загрузки ( смотрите "Загрузка initramfs изображений динамически во время загрузки" раздел этого howto), вы можете включить еще одну специальную опцию. Если вы ещё не знаете что хотите делать, включите её все равно ( это не повредит :)

Device Drivers > Block devices:
 <*> RAM disk support
 (4096) Default RAM disk size (kbytes) (NEW)
 [*]   Initial RAM disk (initrd) support

Initial RAM disk (initrd) support теперь (в ядре 2.6.22) находится в General setup.

Компиляция ядра (Вручную)

# cd /usr/src/linux

Вы должны убедится что не осталось файлов после предыдущей компиляции в каталоге вашего ядра:

# make mrproper

Теперь настраиваем ядро.

# make menuconfig

После того как вы настроили ваше ядро, откомпилируйте (Важно: этот шаг нужно сделать до установки splashutils). "make" скомпилирует одновременно и образ ядра('make bzImage') и модули ('make modules').

# make

Конфигурация / компиляция ядра (Для пользователей genkernel)

Необходимо запустить genkernel со следующими ключами:

# genkernel --gensplash=livecd-2006.0 --gensplash-res=1280x1024 --menuconfig all

где ключи означают следующее:

--gensplash=livecd-2006.0 - использовать тему livecd-2006.0 (из пакета splash-themes-livecd),

--gensplash-res=1280x1024 - при загрузке необходимо использовать разрешение 1280x1024,

--menuconfig - необходимо запустить ncurses конфигуратор ядра,

all - компилировать ядро, модули и initrd образ.

Установка splashutils

Теперь настало время для установки splashutils. Splashutils это ПО используемое для загрузки изображений (а также перекодировки jpg, png).

# emerge splashutils

Конечно, /usr/src/linux должна ссылаться на исходники с установленными заплатами..

Конфигурация / компиляция ядра (ручная работа)

Теперь ваше ядро и система подготовлены для того чтобы показать splash screen. Для завершения компиляции и установки вашего нового ядра осталось сделать следующее.

Если /boot расположен на отдельном разделе подмонтируйте его.

  1. mount /boot

Затем инсталируйте модули и образ ядра.

  1. make modules_install

  2. make install

Создание образа initramfs

Приведенных выше инструкций (а также второй части следующего howto, Configuring your bootloader) достаточно, чтобы получить splash screen после того как ядро будет загруженно. Однако если вы хотите чтобы сексапильная девка с пингвином на маечке появлялась раньше (сразу после инициализации - vesafb-tng), вам понадобится initramfs.

Что такое initramfs?

(Цитата Spock'а): "Initramfs (initial ramfs) это кусок кода который распаковывает сжатый cpio образ во время загрузки ядра.

Чтобы использовать initramfs его надо сначала создать.Образ initramfs должен содержать:

  1. картинки,которые будут использоваться как фон;

  2. необходимы файлы конфигурации;

  3. утилиту помощника (splash_helper).

Изображения и конфигурационные файлы вместе образуют тему gensplash.

Существует два пути для использования initramfs image:

  1. компиляция initramfs image непосредственно в ядро;

  2. загрузка initramfs image динамически во время загрузки системы (с использованием 'initial ram disk' - initrd).

Вы можете сами выбирать вариант,который вам по душе. .

Компиляция образа initramfs непосредственно в ядро

Сначала удалите старый образ initramfs:

# rm /usr/src/linux/usr/initramfs_data.cpio.gz

Теперь создайте новый образ initramfs, содержащий изображения, конфгурационные файлы и userspace helper. Проще всего будет сделать это при помощи splash_geninitramfs (идущим в составе splashutils). Его использование похоже на утилиту 'splash' из пакета bootsplash.

# splash_geninitramfs -v -g /usr/src/linux/usr/initramfs_data.cpio.gz -r 1024x768 emergence

При компиляции образа initramfs непосредственно в ядро, вам придется пересобрать ядро (этого недостатка лишен способ с использованием initrd):

# cd /usr/src/linux
# touch usr/initramfs_data.cpio.gz
# make bzImage
# mount /boot
# make install

Загрузка образа initramfs динамически

Этот вариант практически идентичен сборке образа initramfs вместе с ядром. Различие заключается в том, что вместо создания образа внутри ядра (и последующей сборке его коммандой 'make' и копированием в точку монтирования /boot при помощи 'make install'), вы создадите образ initramfs как отдельный (initrd) файл и вам не придется пересобирать ядро. Однако, придется добавить строчку в конфигурационный файл загрузчика (по которой он найдет initrd файл). Этим мы и займемся в этой части howto

Сначала при помощи splash_geninitramfs создадим initrd файл (который содержит изображения, конфиги и userspace helper):

# mount /boot
# cd /etc/splash
# splash_geninitramfs -v -g /boot/fbsplash-emergence-1024x768  -r 1024x768 emergence

Как видно файл будет создан в точке монтирования(или каталоге) /boot.

К сожалению, по словам Spock'а,"вы не сможете дописать новую initramfs информацию к initrd образу". Это означает, что данной возможностью не смогут воспользоваться пользователи genkernel ядер, т. к. genkernel создает собственный образ initrd для процесса загурзки.

solshark [solshark_at_rambler_dot_ru]: genkernel 3.3.6 позволяет сделать так:

  1. genkernel --gensplash=DangerGirl initrd

Так что теперь и для пользователей genkernel есть возможность воспользоваться данной фишкой.


Если вы не меняете ядро, то просто поменяйте строку описания initrd в grub.conf с:

root=/dev/ram0 real_root=/dev/$ROOT
initrd (hd0,0)/boot/initrd

на:

root=/dev/$ROOT
initrd (hd0,0)/boot/fbsplash-emergence-1024x768

Создание собственных тем для gensplash

Стандартная тема 'emergence' и её конфигурационные файлы находятся в /etc/splash/emergence.

Если хотите создать новую (например с названием 'newtheme'), вам следует:

1. создать для неё каталог в /etc/splash:

# mkdir /etc/splash/newtheme

2. создать каталог 'images' в /etc/splash/newtheme:

# mkdir /etc/splash/newtheme/images

и скоприовать туда картинки (в форматах png/jpg) которые будут использованы в теме.

3. создать необходимые конфигурационные файлы. Они должны иметь расширение *.cfg и находиться в каталоге темы (/etc/splash/newtheme). Образцы конфигруационных файлов можно посмотреть в теме ('emergence'):

# ls -l /etc/splash/emergence/
images/
1024x768.cfg
1280x1024.cfg
800x600.cfg

Очень важно убедиться в том в опциях 'jpeg=' и 'silentjpeg=' (в *.cfg файлах) прописаны корректные ссылки на файлы с изображениями (в каталоге/etc/splash/newtheme/images). Если вы не используете jpeg для создания темы, замените опции на 'pic=' и 'silentpic='.

Для более близкого знакомства с форматом тем fbsplash, изучите документацию пакета splashutils:

# less /usr/doc/splashutils-version/theme_format.gz

Перевод тем bootsplash в темы gensplash

Так же Spock сделал удобную утилиту bootsplash2fbsplash (этот скрипт идет в комплекте со splashutils) ,который сделает легким преобразование тем bootsplash формат gensplash.

Например если у вас есть тема 'gentoo-highquality' ,расположенная в /etc/bootsplash ,вам нужно только скомандовать(от рута):

# bootsplash2fbsplash gentoo-highquality

и утилита сделает gensplash-совместимую тему в каталоге /etc/splash (/etc/splash/gentoo-highquality) со всеми необходимыми файлами.

Использование собственных тем gensplash

Для создания нового образа из темы которую вы только что сделали(пусть ее имя 'newtheme',а разрешение 1280x1024), вам необходимо использовать splash_geninitramfs.

Если вы решили вкомпилировать образ в ядро(первый вариант):

# splash_geninitramfs -v -g /usr/src/linux/usr/initramfs_data.cpio.gz -r 1280x1024 newtheme
# cd /usr/src/linux
# touch usr/initramfs_data.cpio.gz
# make bzImage
# mount /boot
# make install

Если вы используете initrd (второй вариант):

# mount /boot
# splash_geninitramfs -v -g /boot/fbsplash-newtheme-1280x1024 -r 1280x1024 newtheme

Вот что означают опции splash_geninitramfs:

-v  splash_geninitramfs выводит дополнительную информацию
-g указывает splash_geninitramfs создать образ initramfs
 (/usr/src/linux/usr/initramfs_data.cpio.gz
 или /boot/fbsplash-newtheme-1280x1024)
-r говорит splash_geninitramfs использовать разрешение 1280x1024
-'newtheme'указывает splash_geninitramfs искать .cfg файлы
 в каталоге /etc/splash/newtheme

Для просмотра описания всех опций splash_geninitramfs' введите:

# splash_geninitramfs --help

Последний пункт в этой части how-to,полезный совет из документации splashutils':

Если вы хотите сохранить немного памяти и не планируете использовать 
все доступные разрешения вы можете скопировать .cfg файлы
и фоновые картинки только для того разрешения,которое вы используете.

А теперь пришло время настроить ваш загрузчик.

Настройка загрузчика

Параметры ядра

Вот опции,которые необходимо добавить в конфигурационный файлы grub(lilo):

1. Необходимо указание устройства frame buffer.Вот как это может выглядеть например для драйвера vesafb-tng:

video=vesafb:ywrap,mtrr,1024x768-16@85

Вышеприведенный пример указывает на то,что мы хотим использовать разрешение 1024x768, 16 бит цвет и частоту обновления 85Hz. Если вы используете vesafb-tng, вам также необходимо удалить опцию 'vga=' из файла конфигурации вашего загрузчика(эта опция используеться только 'обычными' vesafb frame buffer устройствами):

# НЕ СТАВЬТЕ опцию 'vga=' для vesafb-tng (если она стоит,то удалите ее):
vga=791
vga=0x517

2. fbsplash'у необходимы свои параметры:

splash=verbose,theme:emergence

Сначала fbsplash выбирает режим (в примере используется режим 'verbose' ). Вот цитата из документации по fbsplash "fbsplash может работать в двух режимах: verbose и silent. Первый режим подразумевает простую консоль с фоновым рисунком. Режим silent был впервые реализован в bootsplash. Когда этот режим включен, консоль переключается в графический режим. При этом, текст не печатается. Все что будет отображатся в этом режиме зависит от программ, запущенных в пользовательском пространстве. Таким образом, может быть реализован, например, индикатор прогресса загрузки.

Вторая часть парметра fbsplash позволяет указать какую тему нужно использовать (в примере используется стандартная тема 'emergence').

Для работы fbsplash необходимо указать оба параметра: режим и тему.

3. Если вы решили использовать initrd (посмотрите предыдущую главу - Загрузка образа initramfs), вам необходимы дополнительные опции в конфигурации загрузчика:

initrd /boot/fbsplash-emergence-1024x768     # Grub
initrd = /boot/fbsplash-emergence-1024x768   # Lilo

В приведенном примере подразумевается?что имя рамдиска fbsplash-emergence-1024x768 (и он размещен в каталоге или разделе /boot).

Следующие примеры для обоих загрузчиков grub и lilo. Используется тема 'newtheme', разрешение 1280x1024, 32 бит цвети частота обновления 70Hz. Указан режим fbsplash 'silent' и используется initrd файл.

Пример конфигурации Grub

title  Gentoo
root (hd0,0)
kernel (hd0,0)/kernel-2.6.8-gentoo-r1 root=/dev/hda3 video=vesafb:ywrap,mtrr,1280x1024-32@70 splash=silent,theme:newtheme
initrd (hd0,0)/fbsplash-newtheme-1280x1024

Замените (hd0,0) своим загрузочным разделом (или,если /boot не на отдельном разделе,используйте корневой раздел добавив '/boot' к путям образа ядра и initrd)

Пользователи genkernel должны использовать что-то типа этого(все в одной строке):

kernel (hd0,0)/kernel-2.6.8-gentoo-r1 init=/linuxrc root=/dev/hda3 video=vesafb:ywrap,mtrr,1280x1024-32@70 splash=silent,theme:newtheme

Пример конфигурации Lilo

image=/boot/kernel-2.6.8-gentoo-r1
label = "Gentoo"
root = /dev/hda3
append="video=vesa:ywrap,mtrr,1280x1024-32@70 splash=silent,theme:newtheme" 
read-only
initrd = /boot/fbsplash-newtheme-1280x1024

Не забудьте запустить lilo после изменения lilo.conf:

# mount /boot
# lilo -v

После ребута и вы получите графическую загрузку.

Добавление фона на все консоли

Если вы хотите чтобы на всех консолях был сплеш (картинка из режима 'verbose'),а не только на первой,то отредактируйте /etc/conf.d/splash установив нужные опции и и добавьте splash в ваш стандартный уровень запуска:

 # rc-update add splash default

Если вы используете bootsplash, удалите его из уровня запуска:

 # rc-update del bootsplash

Gensplash для других дистрибутивов

(Jakub) Я думаю этот раздел должен состоять из трех частей:

Вступление: Gensplash работает на других дистрибутивах.

  1. Что нужно сделать по-другому (в сравнении с этим руководством) - к примеру из-за отсутствия emerge. Это касается всех дистрибутивов не подобных Gentoo.

  2. Какие дополнительные действия нужно предпринять - например модификация загрузочных скриптов. Тоже для не Gentoo дистрибутивов.

  3. Другая специфика не охваченная предыдущими двумя разделами.

Различия

  1. Наложение патчей на ядро - необходимо. Мы не используем gentoo-dev-sources (хотя все возможно)

  2. Конфигурация/сборка ядра - из-за невозможности использования genkerel.

  3. Установка splashutils - нет package.keywords, нет emerge. Ручками:). Добавить ссылки. Предложение перейти на Gentoo было бы своевременно.

  4. Добавление splash screen на все терминалы(и удаление bootpslash) - скорее всего зависит от дистрибутива. Способ для Gentoo скорее всего работать не будет (очевидно).

Дополнительные шаги

Модификация загрузочных скриптов потребуется для работы индикатора прогресса. Два варианта:

Тут должно быть название пункта 3

Вариант для Debian упоминался Spock'ом на forums.gentoo.org.

Решение проблем

Если /usr на отдельном разделе

Если у вас splashutils версии 0.9-pre08 и новее и каталог /usr монтируется с другого раздела, gensplash должен работать "из коробки" (без напильника). Однако, если у вас более древняя версия splashutils и, по каким-либо причинам, нет возможности ее обновить следуйте нижеописанным инструкциям.

Программы и библиотеки, которые нужны splash_util'у чтобы запустить fbset и отобразить вашу сплешку расположены в /usr/bin и /usr/lib. И если эти каталоги находятся на других разделах (например при использовании RAID или LVM2 архитектуры), они могут быть недоступны (не примонтированы)в момент, когда они нужны splash_utils и вы не сможете увидеть свою замечательную сплешку.

Как решить ? Скопируйте их в место где они доступны как описано в (спасибо aslocum и форумам Gentoo) Gensplash-How-to with progressbar!!!!! треде:

# cp /usr/bin/fbset /sbin
# cp /usr/lib/libjpeg.so.62 /lib
# cp /usr/lib/libpng.so.3 /lib

поправьте /sbin/splash (например при помощи nano, набрав nano -w /sbin/splash) и приведите строку 31 к виду:

res=`/sbin/fbset | grep "^mode" | sed -r 's/mode "([0-9]+x[0-9]+).*/\1/'`

Где надо только прописать /sbin/ перед fbset. Сохраните результат и выйдите из редактора, и ваша сплешка должна появиться.

Установка фона во время загрузки

Вы наверное заметили,что фоновое изображение загружается с небольшой задержкой,даже если вы используете образ initramfs .До этого момента используется разрешение 640x480 и черно-белая цветовая гамма.

Такое положение дел нормально. Единственным выходом (чтобы получил фон как можно раньше) будет использование драйвера vesafb вместо vesafb-tng. Вот ответ Spock'а по этому поводу: "Образ initramfs используется,чтобы подключить корневую ФС ,и до того как инициализируется кадровый буфер,так что не волнуйтесь по этому поводу.Как вы заметили, компъютер загружается в текстовом режиме,а не в графическом. Графический режим устанавливается после инициализации подсистемы кадрового буфера. Но до этого момента должна произойти инициализация других вещей,а это требует времени.Вот почему в течение секунды-двух вы видите сообщения ядра. Вы наверно скажете,что с vesafb у вас такого не было. И будете правы. Но vesafb исключение,а не правило (его инициализация происходит во время загрузки ядра) . Все остальные кадровые драйверы(vesafb-tng, rivafb, radeonfb)инициализируются с подсистемой fbdev".

Ссылки

Из форумов Gentoo:

Оффлайновая документация: