BSD epic fail with wscons driver

Возможно, из всего сообщества пользователей OpenBSD мало кто пытался русифицировать текстовую консоль или хотя бы настроить шрифты в ней, так как продукт массам интересен по большей части как сервер с pf, за консолью которого работать никто не будет, поэтому прийдётся первым поднять эту тему.

Для начала, небольшой экскурс в историю: управление консолями как в OpenBSD, так и в NetBSD, осуществляется посредством трёх команд: wsconsctl, wsconscfg и wsfontload. Их функционал в частностях отличается, но в целом похож. По-видимому, драйвер wscons и сама эта система берёт начало ещё с незапамятных времён, чем и объясняется схожесть интерфейса вместе с убогостью инструментов. Последнюю можно пояснить таким примером: если шрифт уже загружен посредством wsfontload, то выгрузить его уже нельзя: There is no way to remove a loaded font (c) man wsfontload, поэтому при экспериментах нужно каждый раз перезагружаться. Впрочем, поведение NetBSD в данном контексте чуть лучше, чем у OpenBSD: для загрузки шрифта ему присваивается имя-метка, которая потом скармливается команде wsconsctl наподобие wsconsctl -f /dev/ttyE1 -dw font=fontname, а потому о выгрузке шрифта из памяти можно не беспокоиться - достаточно создать новую правильную метку и указать её всем консолям. OpenBSD же "абстрактно" загружает шрифт в память, и пытается его впоследствии использовать на всех вновь создаваемых консолях, так что если вы загрузили не тот 8x16-шрифт, то другой 8x16-шрифт уже мануально не указать консолям, иначе можно получить ошибку наподобие No space left on device. Можно отдельно отметить "удобство" интерфейса, из-за котрого нельзя напрямую указать шрифт для консоли, но нужно использовать промежуточный костыль wsfontload, но речь сейчас не об этом. Цитируя официальный FAQ, загрузка шрифта на консоль в OpenBSD производится командами:
wsfontload -h 8 -e ibm /usr/share/misc/pcvtfonts/vt220l.808
wsconscfg -dF 5
wsconscfg -t 80x50 5
В NetBSD то же самое достигается как
wsfontload -N myfont /usr/share/wscons/fonts/vt220l.808
wsconscfg -dF 5
wsconscfg -t 80x50 5
wsconsctl -f /dev/ttyE5 -dw font=myfont
Соответственно, при использовании стандартного разрешения 8x16 нужно команды подправить.

Теперь о том, что же мы имеем в случае, КОГДА xdm ЗАПУЩЕН на какой-либо консоли:

1) Случай NetBSD: смена консольных шрифтов всегда происходит успешно, однако, достаточно переключиться в иксы а потом вернуться в консоль, где менялись шрифты, как последние бьются: вместо букв весь дисплей заполнен мусором (иногда цветным и мигающим). Для излечения консоль убивается, потом вновь создаётся, на неё загружается какой-то третий шрифт, никогда не использовавшийся ранее в экспериментах, а после него загружается нужный. Если замести мусор под ковёр всё же не удаётся, цепочку смен шрифтов приходится удлиннять и загружать последовательно несколько разных шрифтов, где последний - нам нужный. Если хочется консоль сохранить не битой, то в иксы переключаться запрещено, между текстовыми консолями - можно. Подчёркиваю, что не обязательно использоваться шрифты koi8-r или ещё как-то дополнительно менять настройки русификации: достаточно взять умолчальную установку ОС и выполнить команды по смене дефолтных шрифтов на какие-либо другие, официально представленные в /usr/share/wscons/fonts/, например, на flori.816. Кстати, flori - очень красивый шрифт с полуготическими начертаниями, поэтому рекомендую: скачать можно с http://gnupg.cdpa.nsysu.edu.tw/NetBSD/NetBSD-current/src/share/wscons/fo... после чего применить команду uudecode flori.816.uue. Этот шрифт идёт в поставке к NetBSD и нигде более найти информацию о нём мне не удалось.

2) Случай OpenBSD: здесь всё намного хитрее. Первый сюрприз таков: не все шрифты, формально правильные по формату, удаётся загрузить. Например, по неизвестным причинам нельзя загрузить flori.816, хотя он прекрасно загружается в консоль того же Linux'а. Возможно, это "специфика" именно 8x16-шрифтов. Для загрузки русского шрифта с koi8-r нужно указать кодировку iso (с ibm оно работать не будет). В итоге русский шрифт загрузить удаётся, и после надлежащих остальных шагов по русификации всё работает как и должно. Если же из русифицированной консоли переключиться в консоль где запущены иксы, а потом обратно, то наблюдается следующая картина в зависимости от использованного разрешения для текстового экрана:
A) 8x8: не бьются ни русские, ни латинские символы.
B) 8x10: бьются и русские, и латинские символы.
C) 8x16: бьются только русские символы, но установить фонт с латинскими буквами, отчлиными от умолчальных, нельзя.

Стоит отдельное подчеркнуть, что дело не в русских шрифтах, и не в русификации, а вообще в произвольном изменении умолчальных шрифтов. Что же касается железа, битьё шрифтов в NetBSD я лично наблюдал на примерно 5ти абсолютно разных машинах (с материнкой VIA, на ASUS EEE PC 701, HP Pavilion с Nvidia GeForce, и др.) и на версиях начиная с NetBSD 3.0, вышедшей много лет назад, кончая последними текущими. Что касается OpenBSD, тестировался 4.5-release на HP Pavilion dv6700 (Nvidia Geforce) и ASUS EEE PC 901, диагностика (что и когда бьётся) совпала полностью. Ранее я связывал проблему исключительно с тонкой внутренней организацией NetBSD, но теперь видно, что суть её куда более глубокая. Когда ставишь "самую стабильную" ОС и В ПЕРВЫЙ ЖЕ ДЕНЬ её использования сталкиваешься с подобными вещами, легко воспроизводимыми любым, кто пытался хоть раз менять шрифты на десктопной (а значит, с иксами) системе, слова о тщательно проведённом аудите всего сорса и пресловутой чистоте коде теряют вес. Итак, всё ж таки, к сожалению, Джо? Как запрет устанавливать латинские шрифты, отличные от умолчальных для 8x16, вяжется с secure be default? Сделано "секъюрным", т.к. латинские символы не могут побиться, сделав консоль полностью нерабочей? А как же опоганивание видеопамяти, сопутствующее этому процессу?  Я сначала думал, что латиницу вообще нельзя менять, т.е. загружаются лишь "кириллические части" подгружаемых шрифтов, но тогда ожидалось бы, что биться должна исключительно кириллица, но так лишь в 8x16, а, значит, дело не в этом. Вопрос: какая же логика на самом деле описана в том сорсе драйвера wscons?! И что делать, send-pr, написать на undeadly, или "проголосовать ногами" поставив FreeBSD/Linux? Не радует что-то оно меня :-(

Гуглил на тему того, не первый ли я с такой проблемой. Оказалось, что нет: вопрос уже поднимался, в т.ч. в рассылках, но обычно оставался без ответа. В частности:
>>if [ -x /usr/sbin/wsconscfg -a -x /usr/sbin/wsfontload ]; then
>>/usr/sbin/wsfontload -h 16 /usr/share/misc/pcvtfonts/koi8-r-8x16
>>for i in 1 2 3 4 5 6 7 8 9 10 11; do
>>/usr/sbin/wsconscfg -d $i
>>/usr/sbin/wsconscfg -t 80x25bf -e vt100 $i
>>done
>>fi
>>Все отлично. Но после старта Хов в терминалах все выглядит так, как
>>будто в память с русскими символами просто мусор скопировали.

>ну это ничего не меняет - мне же нравится опен :)
>а то что мы тут иногда мазохизмом занимаемся, так это
>вдобавок интересней ;)

Взято c:
http://osdir.com/ml/os.openbsd.misc.ru/2007-03/msg00030.html
т.е. ещё 2 года назад была зафиксирована проблема, но воз и ныне там :(

Вот сижу и думаю: "мазохизмом" меня "заниматься" не впечатляет, 3х лет с NetBSD хватило.

Некоторое

Некоторое пояснение: wsfontload позволяет и в OpenBSD создавать метку через -N, но вот скормить её wsconsctl нельзя, т.к. он не знает параметр font, в отличие от NetBSD. Сам этот гнилой драйвер wscons OpenBSD утянула с NetBSD, видимо, не все фичи взяв, либо часть из фич его появилась в NetBSD много позже. В частности, в NetBSD wsconsctl позволяет также менять ещё массу параметров типа умолчального цвета шрифтов и фона в текстовых консолях, их же для сообщений ядра и т.д.

Опять какие-то странности :)

>> C) 8x16: бьются только русские символы, но установить фонт с латинскими буквами, >> отчлиными от умолчальных, нельзя.

>>Все отлично. Но после старта Хов в терминалах все выглядит так, как
>>будто в память с русскими символами просто мусор скопировали.

Не бьется ничего и все корректно переключается у меня. Никакого мусора после переключения с X-вого терминала тоже нет. И на десктопе и на ноуте. Стоят 4.3 и 4.4. От bash отказался уже пару лет как. Пользую ksh. Все сделано как тут http://www.obsd.ru/8/?q=node/1172 . В ~/.profile добавлено set +o emacs-usemeta. При запуске системы стартует xdm, из него - KDE. Иные фонты загружать не пробовал, но подозреваю, что дело как раз в кривизне тех шрифтов. wscons, насколько помню, использует еще Solaris.

Стандартный "it

Стандартный "it works for me" :-D
И всё-таки, попытайтесь загрузить flori (он 8x16) на какую либо консоль. Шрифт ковыряли люди со знанием дела, отклонений от стандарта не нашли (сравнивали с представленными шрифтами в базе), и более того, успешно загружали его в NetBSD и Linux, но установить его в OpenBSD не удалось ни у меня, ни у ещё одного чела. Битьё шрифтов совершенно независимо было воспроизведено и у меня и у него (устанавливали ОС независмо и на совершенно разное железо). Кроме того, битьё шрифтов в консоли в NetBSD ещё подтверждалось одним челом, независимо. OpenBSD тестировалась на двух конфигурациях железа, а NetBSD била шрифты на как минимум 4х разных конфигурациях, что точно помню.

Ещё по поводу смены шрифта 8x16: когда грузится кириллический шрифт, 8x16, символы, отвечающие за латиницу не меняются. Видимо, при 8x16 он никак не хочет их менять, но меняет лишь вторую половину шрифта, ответственную за "остальные символы" (т.е. шрифт частично загружается, частично - нет). Для меня это смотрится крайне странным.

Ещё пояснение: умолчальный шрифт не бьётся ни в OpenBSD, ни в NetBSD 5.0. Но достаточно его сменить на другой (кириллический, к примеру), как сразу вылазит весь эффект если юзаются иксы и переключение между иксами и консолью.

Под OpenBSD: ядро стандартное, шрифт загружается в четыре шага:
1) удаление консоли
2) загрузка шрифта в память
3) добавление консоли
4) загрузка нового шрифта в консоль.
После чего выполняется от рута xdm, после чего переключаемся в консоль с изменённым шрифотм снова. У меня воспроизводится стабильно, надёжно, всегда, и при широком варьировании последовательности вышеуказанных шагов. И да, кстати не только у меня. Здесь кто-то ставить хотел OpenBSD на EEE PC  - там почти наверняка должно воспроизводиться. Ну или у кого флэшка с системой есть, могут попробовать загрузить её на EEE.

PS: я когда-то очень давно использовал OpenBSD, версию то ли 3.0, что ли... и там точно была и кириллическая консоль, и иксы, и точно ничего не билось. То ли железо такое было, то ли дело в версиях.

Попробую

Попробую-отпишусь :)

А вообще man wsfontload | tail -n6

Однако, весь софт кривой. Только количество кривизны везде разное. :)

Ну да, я эти

Ну да, я эти маны уже раз 50 перечитал вдоль и поперёк. Что весь софт такой это итак понятно было, но вроде как считается что OpenBSD наименее бажная среди всех остальных, и я же не сужу здесь интерфйесы сами по себе, а просто формальное соответствие заявленному функционалу. К тому же, OpenBSDшники клялись что весь старый код аудировали основательно... 

Впрочем есть, вероятность, что мне дико "повезло" с железом, что на всех 4х машинах бьётся. Сейчас с большим трудом пытаюсь вспомнить, точно ли билось на 5ой машине... и вспомнить не могу, возможно что и не билось. Дела давно минувших дней, и доступа к тому железу теперь уже нет.

не бьет. опенок

не бьет. опенок запущен на буке samaung r460 в vmware 6. почти все специальные клавиши не соотвествуют... маны еще не читал, но уже предвижу что не сильно поможет. с инглишем слаб. буду рад помощи...

просьба

al1e, если не затруднит, проверьте, пожалуйста, удаётся ли загрузить шрифт flori816 на какую-либо консоль. После скачивания по вышеприведённой ссылке файла flori.816.uue, это достигается следующими командами:
1. uudecode flori.816.uue
2. wsfontload -e iso flori.816
3. wsconscfg -dF 5
4. wsconscfg 5
После этого надо подождать минуты 2 пока getty запустит там (на консоли Ctrl+Alt+F6) приглашение на ввод логина и пароля. Если шрифт остался тем же, каким и был, значит он не загрузился (либо только его латинские символы не загрузились). Если шрифт загрузится, его отличие от "обычного" вы сразу заметите (начертания сильно разные).

PS: я думал, что гуру Максим Бурмистров ещё выскажется, но вот в соседнем топике пишут, что он копает тёмный психодел и путешествует под кислотой, так что я уже засомневался, что он читает этот топик :-( // это как от слушающего психодел - другому, слушающему психодел :-)

Получены

Получены результаты тестов на ноутбуке FUJITSU SIEMENS Amilo M6450G Series. Итог: один раз шрифты побились (только 8x10 и 8x8), но воспроизводимости добиться не удалось. Подтверждена гипотеза о flori: при использовании нового шрифта 8x16 загружается лишь часть таблицы, отвечающая за "остальные символы", а английские символы не меняются (в случае flori меняется лишь псевдографика и спецсимволы, таким образом). В манах про запрет менять латинские символы в шрифтах 8x16 ничего нет, и как это понимать(?).

новые тесты на EEE PC

Цитата: FUJITSU SIEMENS Amilo M6450G Series

Получены результаты тестов на ASUS EEE PC 701, а также повторный тест на EEE 901. На 701ом воспроизвести пока никак не удалось. Видимо, это консистентно с результатами тестов на FUJITSU SIEMENS Amilo M6450G Series, так как и там и тут стоит одна и та же видеокарта. На 901 сначала не удалось получить битьё шрифтов, тогда сделали так: после старта xdm вскоре делается конвенциональный выход из дефолтного wm, что перезапускает xdm, а только потом возврат в консоль, что привело к битью шрифтов, но только уже другой пары из 3х тестируемых (кажется, 8x8 и 8x10), а не той, что описана выше. Очень напоминает ошибку типа race condition. Возможно, проблема в OpenBSD присутствует только при использовании достаточно новых видеокарт (но это лишь гипотеза).

EEE PC 901

Режим 80х50 - шрифт должен быть - 8х8 koi8-r-8x08
---//---- 80х40 - шрифт должен быть - 8х10 koi8-r-8x10
----//--- 80x25 - шрифт должен быть - 8х16 koi8-r-8x16
работают стабильно, см. man vga, но не юзабельно, "." на shift-7, страшные и т.п.
--- /ect/kbdtype ---
ru
--- /etc/wsconsctl.conf ---
keyboard.encoding=ru
--- /etc/rc.local режим 80х40 для консоли № 2 [Shift+Alt+F3] ---
wsfontload -e iso -h 10 -N koi8-r-8x10 -w 8 /usr/share/misc/pcvtfonts/koi8-r-8x10
wsconscfg -dF 2
wsconscfg -t 80x40 2
wsconsctl -w keyboard.map+="keycode 184=Mode_Lock"
# на 901 нет правого Ctrl, будет Alt
--- /home/USER/.profile ---
set +o emacs-usemeta
---
P.S. спасибо ресурсу, за то-что он есть
reboot :)

По поводу

По поводу обсуждаемой выше конфигурации NetBSD на dv6700: выпилил ядро из NetBSD 5.0.2-stable и запилил его в базовую старую систему от 5.0-current. Включил поддержку framebuffer, 1024x768, всё работает, ничего не бьётся, только fb слишком тормознутый. Если fb не ставить, то не помню уже, бьются ли шрифты... возможно, только если их руками менять на другие. Единственная проблема - никак не удаётся сменить дефолтные шрифты в fb, так что с русификацией текстовой консоли посос :(