nixp.ru v3.0

23 мая 2017,
вторник,
11:50:39 MSK

DevOps с компанией «Флант»
Аватар пользователя fly4life
fly4life написал 30 декабря 2003 года в 00:54 (464 просмотра) Ведет себя как мужчина; открыл 182 темы в форуме, оставил 5340 комментариев на сайте.

Скомпилил ядро с поддержкой frame buffer’а. Выставил расширение для консоли 1024х768 и всё бы ничего, но есть один неприятный косяк =(.

Русские буквы нормально отображаются только в первой консоли (той, в которую выкидывает после загрузки и которая tty1). Во всех остальных вместо русских букв отображаются квадратики. Можно ли это исправить и если да, то как?

anonymous

a echo -ne «\033(K» не пробовал? может просто управляющий код надо запихать в консоль…..

Anarchist
fly4life
Скомпилил ядро с поддержкой frame buffer’а. Выставил расширение для консоли 1024х768 и всё бы ничего, но есть один неприятный косяк =(.

Русские буквы нормально отображаются только в первой консоли (той, в которую выкидывает после загрузки и которая tty1). Во всех остальных вместо русских букв отображаются квадратики. Можно ли это исправить и если да, то как?

А с предыдущей версией ядра все нормально было?

Какое ядро собирал?

По симптомам очень напоминает ситуацию когда скрипт локализации был запущен только для первой виртуальной консоли.

Подробности — в соответствующем HOWTO, сам я читал его давно, подробностей уже не помню.

fly4life

2sarutobi:

> a echo -ne «\033(K» не пробовал? может просто управляющий

> код надо запихать в консоль…..

Нет, это я сделал в первую очередь — не помогает =(.

2Anarchist:

> А с предыдущей версией ядра все нормально было?

> Какое ядро собирал?

С предыдущими версиями (2.4.20, 2.4.22, 2.5.69) было тоже самое, но тогда мне это не мешало и я не сильно обращал на это внимания. В данный момент ядро 2.6.0.

Что за скрипт локализации?

Anarchist
fly4life
Что за скрипт локализации?

Имелась в виду последовательность команд задающая состояние терминала.

Запускается только один раз для терминала по умолчанию (tty1), а надо циклом:

for i in 1 2 3 4 5 6

do

выставляем состояние tty$

done

fly4life

Во, подсказали хаутушку:

http://www.mgul.ac.ru/~t-alex/Linux/Cyrillic-HOWTO/Cyrillic-HOWTO-russian-3.html

Вбил в консоли, где нет русского, следующую команду:

setfont /lib/kbd/consolefonts/Cyr_a8x16.psfu.gz

И проблема разрешилась =).

Anarchist
fly4life
Во, подсказали хаутушку:

http://www.mgul.ac.ru/~t-alex/Linux/Cyrillic-HOWTO/Cyrillic-HOWTO-russian-3.html

Вбил в консоли, где нет русского, следующую команду:

setfont /lib/kbd/consolefonts/Cyr_a8x16.psfu.gz

И проблема разрешилась =).

Дык о чем и говорил…

Только проблема пока не разрешилась:

ищешь где у тебя в системе при загрузке выставляются шрифты и прописываешь выставление шрифтов для всех консолей.

fly4life

Нда… И вправду всё гораздо сложнее, чем я понадеялся… Пытался я найти скрипт, в котором инициализируются шрифты, но беглый осмотр загрузочных скриптов мне не дал ответа =(. Может кто подскажет?

П.С. ASPLinux 9

ing

файл в котром шрифт выставляется /etc/sysconfig/i18n

а в /etc/rc.d ищи кто вызывает его

fly4life

Про /etc/sysconfig/i18n всё известно и понятно. Я знаю, что команда setsysfont включает в консоли системный шрифт, который задан в переменной SYSFONT файла /etc/sysconfig/i18n (получается аналог команды setfont /lib/kbd/consolefonts/Cyr_a8×16.psfu.gz, о которой писал выше). Но в каком скрипте это всё вызывается я не нашёл =(. Сам i18n нигде не вызывается (опять же, по крайней мере, я не нашёл).

Правда, подумывал как более изощренным (и в лоб) способом решить проблему свою. Т.е. написать скрипт, который бы присваивал консолям tty$i системные шрифты и запихать этот скрипт отдельным скриптом в автозагрузку, либо вообще приписать в конец rc.local. Но как связать эти самые tty-ки и команду setsysfont я хз =(.

ing

хмм у меня такойже зверушка с ядром правда поменьше но не о том хочу сказать

вот примеры с моих скриптов

#

/etc/rc.d/init.d/functions

#

[ -z "${CONSOLETYPE:-}" ] && CONSOLETYPE=«`/sbin/consoletype`»

if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" ] ; then

. /etc/sysconfig/i18n

if [ "$CONSOLETYPE" != "pty" ]; then

case «${LANG:-}» in

ja_JP*|ko_KR*|zh_CN*|zh_TW*)

export LC_MESSAGES=en_US

;;

*)

export LANG

;;

esac

else

export LANG

fi

fi

#

/etc/rc.d/rc.sysinit

#

if [ "`/sbin/consoletype`" = "vt" -a -x /sbin/setsysfont ]; then

echo -n «Setting default font ($SYSFONT): »

/sbin/setsysfont

if [ $? -eq 0 ]; then

success

else

failure

fi

echo ; echo

fi

ing

вроди ничего не напутал ))

fly4life

Я также нашёл, что /sbin/setsysfont также вызывается в /etc/rc.d/init.d/keytable (скрипт, который выпоняется при старте сервиса keytable). Но, ни в привидённом тобой, ни в привидённом мной сриптах я не знаю как связать setsysfont и консоли tty$i (где i in 2 3 4 5 6) =(. Может подскажешь?

Впринципе, есть ещё одно какое-никакое решение. Если добавить в конец файла /etc/bashrc (просто у меня у всех пользователей в качестве рабочей оболочки стои тbash) строку /bin/setfont /lib/kbd/consolefonts/Cyr_a8×16.psfu.gz, то при логоне каждого пользователя будет загружать нужный мне системный шрифт. Зато при загрузке иксовых консолей идёт ругань (putfont: PIO_FONT: Invalid argument), что тоже не очень приятно =((.

Вобщем, не одно, так другое…

ing

хмммм

хочу такуюж феньку как у тебя :-)

кинь на мыло скрипты rc.sysinit, setsysfont и functions

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

ксли оная есть (к примеру назовем ее dest_exec и возможно она должна находится в /sbin или /usr/sbin), то можно сваять чтото вроди:

if [ -x /sbin/dest_exec -o -x /usr/sbin/dest_exec ]: then

for i in 1 2 3 4 5 6

do

dest_exec --console /dev/tty($i) --exec /sbin/setsysfont (или /bin/setfont /lib/kbd/consolefonts/Cyr_a8×16.psfu.gz, но думаю первое лучше)

done

fi

но сам я тоже чето не улавливаю связки сего творения с выше изложенными фрагментами /etc/rc.d/init.d/functions и /etc/rc.d/rc.sysinit.

у меня то все без циклов работает

Anarchist
ing
у меня то все без циклов работает

Или ты их просто не встретил?..

Genie

fly4life,

а почему бы не помедитировать над выводом `grep -e font < /etc/inittab`?

[root@host ~]# grep -e font < /etc/inittab

# Fix fonts for framebuffer.

fb:2345:once:/etc/rc.d/scripts/framebuffer_setfont

[root@host ~]#

:)

fly4life
Genie
fly4life,

а почему бы не помедитировать над выводом `grep -e font < /etc/inittab`?

[root@host ~]# grep -e font < /etc/inittab

# Fix fonts for framebuffer.

fb:2345:once:/etc/rc.d/scripts/framebuffer_setfont

[root@host ~]#

:)

гм.. у меня ничего такого в inittab нету…

Genie

Так пусть будет! :)

#!/bin/sh

#

# /etc/rc.d/scripts/framebuffer — run once at boot time from inittab.

. /etc/init.d/functions

# Parse framebuffer config.

SourceIfNotEmpty /etc/sysconfig/framebuffer && [ "$ENABLE" != no ] || exit 0

sleep 1

# fbset program

FBSET=/usr/sbin/fbset

# Setup videomode if defined

if [ -n "$MODE" -a -x "$FBSET" ]; then

«$FBSET» -a «$MODE» >>/dev/tty12 2>&1

fi

# Update system font

if [ -n "$MODULE" -o -f /proc/progress ] || [ -n "$MODE" -a -x "$FBSET" ]; then

for i in $TTYS; do

/sbin/setsysfont --tty=/dev/tty$i >>/dev/tty12 2>&1

done

fi

[root@host ~]# rpm -q -f /etc/rc.d/scripts/framebuffer_setfont

initscripts-5.49-ipl50mdk

[root@host ~]#

ing

1.

«# Update system font

if [ -n "$MODULE" -o -f /proc/progress ] || [ -n "$MODE" -a -x "$FBSET" ]; then

for i in $TTYS; do

/sbin/setsysfont --tty=/dev/tty$i >>/dev/tty12 2>&1

done

fi

»

странно, но я не нашел в /sbin/setsysfont ни одного $* или $@ ($1 и тд.) или case’а, с помощью котрого можно былоб передать значение описонного арнумента --tty. к тому же переменная $TTYS у меня не нашлась в скриптах и призагрузке она пуста (у меня). а версия initscripts замечу на два порядка выше. так что если и пригодна. то не всем. идея мне нравится но ….

2.

«Или ты их просто не встретил?.. »

нашел нечто. что копирует пустые строки на каждую консоль. но фенечки не уловил. прошу объяснить цель этой процедуры

/etc/rc.d/rc.sysinit

last=0

for i in `LC_ALL=C grep '^[0-9]*.*respawn:/sbin/mingetty' /etc/inittab | sed ’s/^.* tty\([0-9][0-9]*\).*/\1/g’`; do

> /dev/tty$i

last=$i

done

if [ $last -gt 0 ]; then

> /dev/tty$((last+1))

> /dev/tty$((last+2))

fi

ing

Genie извиняюсь :-)

у меня не поставлены утилиты для рабоиты с фб

но мой /sbin/setsysfont действительно не принимает параметров из вне.

fly4life

вот еще дурь нашел

/sbin/setsysfont

echo -en «\\033(K» > /dev/console

polachok

«Скомпилил ядро с поддержкой frame buffer’а. Выставил расширение для консоли 1024х768 и всё бы ничего, но есть один неприятный косяк =(»

У меня 2.6.0. вообще с ним не компилится:(

fly4life

Итак, праздники с запоем затянулись, но я уже пояти в форме =). Собрал мозги из киселя в нечто более мозгоподобное. Вышел, так сказать, из штопора и… добрался-таки до фреймбуфера =)

2 Genie: скрипт твой, к сожаелнию, мне не помог =(. Как и у ing’а, setsysfont мой не принимет никаких параметров (в частности, '--tty=’).

2 ing:

> ксли оная есть (к примеру назовем ее dest_exec и возможно

> она должна находится в /sbin или /usr/sbin), то можно сваять

> чтото вроди:

подобного я что-то не нашёл =(.

> echo -en «\\033(K» > /dev/console

вот это тоже не работает (точнее, может как-то и работает, но мою проблему не решило ;)).

Думаю и ищу дальше =)

ing

взял у товарища сидюк. а то мой сдох, добрался до пакетов дистра

вроди нашел такую софтинку

зовется open

ing

да, точно open

вот может такая последовательность поможет

for i in 1 2 3 4 5 6

do

open -c $i — setfont /lib/kbd/consolefonts/Cyr_a8×16.psfu.gz

done

а может стоит так

for i in 1 2 3 4 5 6

do

open -c $i — setsysfont

done

ing

или даже так

for i in `LC_ALL=C grep '^[0-9]*.*respawn:/sbin/mingetty' /etc/inittab | sed ’s/^.* tty\([0-9][0-9]*\).*/\1/g’`; do

open -c $i — setsysfont

done

и на мой взглял запуск сетсисфонта более оптимален, достаточно менять в i18n фонт а также в сетсисфонте выполняется \\033(K

:-)

fly4life

К сожаленю, open тоже не спас… Системный шрифт прописался только для той консоли, в которой я запускал этот скрипт.

П.С. и всё-таки. Кто мне объяснит такую штуку. Почему, если не использовать фреймбуфер (т.е. в загрузчике никаких параметров не передавать для установки расширения консоли), а использовать стндартную 80х25 консоль, то русские шрифты во всех консолях отображаются правильно?

Genie
fly4life
П.С. и всё-таки. Кто мне объяснит такую штуку. Почему, если не использовать фреймбуфер (т.е. в загрузчике никаких параметров не передавать для установки расширения консоли), а использовать стндартную 80х25 консоль, то русские шрифты во всех консолях отображаются правильно?

Это следует из логики работы видоеплат. В текстовом режиме знакогенератор подгружается в память и его хватает только на 512 символов максимум (при этом мы, в общем то, жертвуем бит мерцания/повышенной яркости на вторую страницу из 256 символов). Один раз при переключении в текстовой режим таблицу установили, и пользуемся.

Фреймбуфер — по сути — графический режим отображения текста, поэтому шрифт приходится хранить в памяти драйвера консоли, и видимо, было решено дать возможность для разных консолей устанавливать разные шрифты — в одной русский, а во второй, скажем, — японский, в третьей — китайский, а в четвертой — арабский. Мало ли чего кому взбредёт в голову.

Наиболее простое решение проблемы, видимо в том, чтобы вкомпилировать в драйвер фреймбуфера нужный русский шрифт (выбирается в опциях фреймбуфера при компиляции ядра). Хотя тут, как говорится, бабушка надвое сказала….

PS: емнис, в RU.LINUX тема с шрифтами на 2-6 консоли при фреймбуфере не раз осуждалась… И последний раз — вроде бы как раз в RH9 и ядре 2.6.0. Точно не помню….

fly4life
Genie
Это следует из логики работы видоеплат. В текстовом режиме знакогенератор подгружается в память и его хватает только на 512 символов максимум (при этом мы, в общем то, жертвуем бит мерцания/повышенной яркости на вторую страницу из 256 символов). Один раз при переключении в текстовой режим таблицу установили, и пользуемся.

Фреймбуфер — по сути — графический режим отображения текста, поэтому шрифт приходится хранить в памяти драйвера консоли, и видимо, было решено дать возможность для разных консолей устанавливать разные шрифты — в одной русский, а во второй, скажем, — японский, в третьей — китайский, а в четвертой — арабский. Мало ли чего кому взбредёт в голову.

Спасибо =)

Genie
Наиболее простое решение проблемы, видимо в том, чтобы вкомпилировать в драйвер фреймбуфера нужный русский шрифт (выбирается в опциях фреймбуфера при компиляции ядра). Хотя тут, как говорится, бабушка надвое сказала….

Такого для фркймбуфера в опциях ядра нету.

Genie
PS: емнис, в RU.LINUX тема с шрифтами на 2-6 консоли при фреймбуфере не раз осуждалась… И последний раз — вроде бы как раз в RH9 и ядре 2.6.0. Точно не помню….

Если ты про тот, на который есть ссылка на главной странице, то там я ничего подобного не нашёл =(.

Genie
fly4life
Спасибо =)

Да не за что :)

fly4life
Такого для фркймбуфера в опциях ядра нету.

Ааааасссьь???!!! Как это «нету»??!

А это что (для 2.6.*):

$ make menuconfig

Далее «Device Drivers» — «Graphics support» — «Console display driver support»

[ * ]   Select compiled-in fonts
[   ]     VGA 8x8 font
[   ]     VGA 8x16 font


???!!

Конечно, при этом придётся малость поковыряться в исходниках, заменить шрифт кириллическим, и вообще это через Ж… Зато надежно :)

fly4life
Если ты про тот, на который есть ссылка на главной странице, то там я ничего подобного не нашёл =(.

Мммм.. Это не RU.LINUX FAQ, а именно сама RU.LINUX.

<font size=«-2»>Я ж не зря в обсуждении о ЧаВО уточнения наводил, за что от Dmitry V. Ivanov по шее малость схлопотал — ЧаВО далеко неактуально. :-(</font>

<font size=«-2»>Точнее оно актуально до такой степени, пока кто-нибудь не ужаснётся и не решится-таки исправить хотя бы один вопрос-ответ. Не говоря уже о глобальном и значимом пересмотре оного ЧаВО. Майнтайнер лишь собирает и рассылает, ничего более, насколько мне известно не_входит в обязанности. По возможности — желательно, но необязательно.</font>

fly4life
Genie
Ааааасссьь???!!! Как это «нету»??!

А это что (для 2.6.*):

$ make menuconfig

Далее «Device Drivers» — «Graphics support» — «Console display driver support»

[ * ]   Select compiled-in fonts
[   ]     VGA 8x8 font
[   ]     VGA 8x16 font

???!!

Конечно, при этом придётся малость поковыряться в исходниках, заменить шрифт кириллическим, и вообще это через Ж… Зато надежно :)

=))) Ааа, вот ты о чём.

Но, ведь русского нету же. Правкой исходников можно что угодно туда вставить, например, поддержку индикатора кругового обзора ПОРИ П2, но ведь, не говорят, что эта поддержка есть ;) Ну да ладно…

Серёг, может и можно сделать то, что ты говоришь (т.е. вкорячить в ядро поддержку русского для фрейм буфера), но я даже представления не имею как это сделать! Я не настолько гуру ;)

Genie

Мдааа.. тяжело ж в деревне без нагана… :))))

Файлики — тут:

linux-2.6.{0,1,2}/drivers/video/console/

с именами

font_8x{8,16}.c

А вообще, вперёд-ка читать группу fido7.ru.linux на news://news.fido7.ru/

fly4life
Genie
Мдааа.. тяжело ж в деревне без нагана… :))))

Файлики — тут:

linux-2.6.{0,1,2}/drivers/video/console/

с именами

font_8x{8,16}.c

Гыг. Где файлики хранятся-то я знаю. Но что с ними делать — эт я хз. Ну не знаю и усё =). Хотя я бы предположил, что в них нужно записать хекс-коды для русских букв. Ну, дык, они там уже есть ;). Так что же с этими файлами нужно всё-таки сделать, чтобы мой фреймбуфер перестал выделываться?!

Genie

Там нужно прописывать.. ну да, хекс-коды, но так, чтобы они описывали начертание русских буковок.

Приглядись к тем 1-ками и 0-кам получше. с расстояния побольше. Увидишь буквы.

Вот так и недо записать.

В инете просто обязано валяться уже готоое.

Но — я ж уже сказал — это путь через Ж… лучше так не делай, раз не уверен.

Иди искать в fido7.ru.linux У меня траф, к сожалению, либо хороший, но дорогой, либо дешевый, но… почти никакой.. и найти я в группе fido7.ru.linux точнее не смогу. :(

Genie

Тэкс. Нашлось более-менее правильное решение для кириллизации фреймбуферных консолей.

consolechars -f [то что в ~/.i18n прописано как SYSFONT]

Включить проверку на tty-ность (а не pty-ность) консоли и запускать.

fly4life
Genie
Тэкс. Нашлось более-менее правильное решение для кириллизации фреймбуферных консолей.

consolechars -f [то что в ~/.i18n прописано как SYSFONT]

Включить проверку на tty-ность (а не pty-ность) консоли и запускать.

Осталось установить утилиту consolechars ;).

Спасибо, попробую.