Terminus в ядре
Октябрь 23, 2006 — kaktycПродолжаю разгребать свои завалы. Иногда натыкаюсь на полезные штуки. Чтобы они не лежали мёртвым грузом, буду делиться ими с общественностью :)
Когда загружается ядро, информация на экран выводится шрифтом, который “зашит” в ядро. Его возможно сменить только после загрузки с помощью утилиты setfont из пакета kbd. Но мне хочется, чтобы мой любимый шрифт был уже на начальном этапе загрузки ядра. Что же делать?
В конфиге ядра можно указать, какой именно шрифт необходимо использовать. Но стандартные, идущие в комплекте, мягко говоря, не очень. Поэтому мы их попросту заменим на что-нибудь более красивое.
Мой любимый консольный шрифт — Terminus. Его-то и будем “пихать” в ядро :) При создании я использовал размер 8×16.
Заглянув в /usr/src/linux/drivers/video/console, я узнал, что шрифты были сгенерированы с помощью программы cpi2fnt. Поиск в гугле сказал, что это древняя программулина была для AmigaOS. Таких раритетов у меня нет :), поэтому я стал искать обходные пути. Ещё немного погуглив, нашёл, что шрифт в формате psf можно сконвертировать в include-файл с помощью программы psf2inc из пакета psftools. Но для начала надо получить шрифт Terminus в формате psf. В дистрибутиве он поставляется в виде bdf-файлов. В комплекте также идёт утилита bdftopsf.pl.Теперь дело осталось за малым. В директории с распакованным дистрибутивом Terminus делаем
./bdftopsf.pl ter-u16n.bdf > ter-u16n.psf
Полученный файл опять преобразуем:
psf2inc --psf1 ter-u16n.psf ter-u16n.inc
В получившемся inc-файле много лишнего. Нам нужны только первые 255 глифов. Поэтому удаляем первые 3 строчки и всё, что идёт дальше 255 символа (ориентируясь по комментариям в файле, это легко сделать).
Теперь редактируем font_8x16.c: удаляем сведения о старом шрифте и вставляем содержимое подчищенного файла ter-u16n.inc.
Полученный результат можно скачать в готовом виде здесь.
Теперь осталось заменить старый файл новым и в конфигурации ядра указать вкомпилировать шрифт 8×16.
Device Drivers --->
Graphics support —>
Console display driver support —>
Framebuffer Console support
[*] VGA 8×16 font
Октябрь 23, 2006 at 01:53
Я так понимаю, после этого менять шрифт уже не надо будет? И с русскими буквами будет всё в порядке?
Надо будет попробовать…
Октябрь 23, 2006 at 01:59
Нет, менять всё равно придётся, т.к. здесь используются только первые 255 символов, т.е. русские буквы туда не входят.
Октябрь 24, 2006 at 01:18
А если из inc-файла ничего не выкидывать?
Октябрь 24, 2006 at 02:25
Хм, похоже я ошибся. Русские буквы можно использовать. Ведь первые 0-127 символов относятся к US-ASCII, а 128-255 можно использовать под национальный алфавит и другие спецсимволы. Проблема только в том, что здесь будет только какая-то одна кодировка. KOI8-R нам вполне подходит.
Попробуй так. Нужен будет шрифт terminus в кодировке KOI8-r ter-k16n.pcf.gz. Его надо сначала сконвертировать в bdf с помощью pcf2bdf, а затем сделать то же самое, что и ранее. Может быть получится :)
У меня юникодная локаль, так что для меня это бесполезно. Всё равно придётся подгружать нужный шрифт.
Октябрь 24, 2006 at 17:06
У меня вообще-то тоже юникодная локаль. Жаль =)
Октябрь 24, 2006 at 17:31
Вообще, данный трюк из разряда тех мелких ненужностей, без которых жить можно, но с ними как-то веселей :) Так что полноценной замены setfont это не делает, а всего-лишь дополняет его, делая внешний вид консоли более консистентным.