Коротко о новом драйвере консоли FreeBSD - VT (aka newcons).


Долгое время в OS FreeBSD использовался драйвер консоли "syscons".
Лучшее описание этого драйвера сделал Иван Паскаль:

после прочтения которого, у администраторов OS FreeBSD не возникает
вопросов по настройке locale и руссификации FreeBSD.

Однако во FreeBSD начиная с релиза 10.1, появился новый драйвер
консоли - vt (aka newcons).

Про данный драйвер, разработанный в FreeBSD Current (11) и перенесенный
в 10.1-RELEASE можно прочитать на FreeBSD Wiki:

Драйвер может работать как в текстовом, так и в графическом режиме VGA,
благодаря последнему и реализована поддержка UTF-8 в консоли.

Реализована интеграция с KMS видео драйверами для переключения между
Xorg и виртуальными терминалами.

Более подробную информацию по драйверу можно получить vt(4).
А информацию по настройке локализации в FreeBSD HandBook:

Основные моменты локализации FreeBSD (как и любой Unix-like OS):

1. Локализация консоли;
2. Локализация login shells и использование login class;
3. Локализация Xorg;
4. Локализация Applications (приложений).

Пункт 1. - Локализация консоли
необходим только в случае работы за локальной консолью.

Данный пункт локализации не требуется и не влияет на работу удаленных
text-mode эмуляторов терминалов, таких как putty или openssh.

Итак, начиная с релиза FreeBSD 10.1 в системе для Russian UTF-8, в консольном
драйвере vt(4) имеются:

- клавиатурные мапперы/переключатели:

# ls -la /usr/share/vt/keymaps/ | grep ru
-r--r--r--  1 root  wheel  16228 Nov 12 06:04 ru.kbd
-r--r--r--  1 root  wheel  16234 Nov 12 06:04 ru.shift.kbd
-r--r--r--  1 root  wheel  16232 Nov 12 06:04 ru.win.kbd
#

- фонты:

# ls -la /usr/share/vt/fonts/
-r--r--r--  1 root  wheel  8452 Nov 12 06:04 gallant.fnt
-r--r--r--  1 root  wheel  8742 Nov 12 06:04 vgarom-8x14.fnt
-r--r--r--  1 root  wheel  9864 Nov 12 06:04 vgarom-8x16.fnt
-r--r--r--  1 root  wheel  5384 Nov 12 06:04 vgarom-8x8.fnt
-r--r--r--  1 root  wheel  5400 Nov 12 06:04 vgarom-thin-8x16.fnt
-r--r--r--  1 root  wheel  2704 Nov 12 06:04 vgarom-thin-8x8.fnt

Прим.: фонт gallant.fnt - красивый но не поддерживает кириллические
символы.

Консольный драйвер vt(4) by default использует для работы режим VGA
с разрешением 640x480x16 (vt_vga).

Для использования UTF-8, необходимо произвести следующие действия:

- добавить в /boot/loader.conf строку:

kern.vty=vt
означает использование консольного драйвера vt вместо syscons

Если потребуется собрать собственное ядро, только с новым драйвером
консоли, необходимо в ядро добавить:

#-- закомментарить vga, sc и оставить только vt
#device        vga             # VGA video card driver                 
#device        sc                                                      
device         vt                                                              
device         vt_vga

ps. ядро GENERIC 10.1 уже собрано с поддержкой vt(4), man 4 vt.
Если в 11.0-RELEASE, консоль по умолчанию не загружается в графическом
режиме, такое возможно и при использовании FreeBSD в качестве гостевой
ОС, добавьте в /boot/loader.conf: hw.vga.textmode=0

- добавить в /etc/rc.conf

#-- Russians keymap, uncomment that you preffer
# CAPS switch to russian
keymap="ru"
# CAPS switch to russian, top keyboard raw as number
#keymap="ru.shift"
# CTRL+SHIFT switch to russian
#keymap="ru.win"

#-- font load
font8x16="vgarom-8x16"
прим: фонт vgarom используется системой по умолчанию, можно не задавать,
указан как пример задания фонта, когда появится выбор.

верхнее означает что на данный момент можно использовать, как это было и
ранее, три варианта клавиатурного маппинга, любой который Вам удобнее,
раскомментарьте один, который Вам предпочтительней (выше это keymap="ru"):

- keymap="ru" - переключение на русский клавишей CAPS Lock
- keymap="ru.shift" - переключение на русский клавишей CAPS Lock, но верхний
ряд на клавиатуре by default будет цифровой
- keymap="ru.win" - переключение на русский клавишами CTRL+SHIFT

выбор фонтов пока отсутствует, by default в наличии пока лишь следующие:

gallant.fnt             - красивый, но не поддерживает русские
vgarom-8x8.fnt          - матрица 8x8 с поддержкой русских символов
vgarom-8x14.fnt         - матрица 8x14 с поддержкой русских символов
vgarom-8x16.fnt         - матрица 8x16 с поддержкой русских символов
vgarom-thin-8x8.fnt
vgarom-thin-8x16.fnt

Консольные фонты Terminus, можно скачать:

загрузить вручную, например:

# vidcontrol -f ter-u32.fnt
или положить в /usr/share/vt/fonts/ и настроить /etc/rc.conf, например:
font8x16="ter-u8x16.fnt"

Прим.: фонты 16x32 нужны(удобны) для wide мониторов, для загрузки фонта
ter-u32.fnt (16x32), нужно изменить скрипт /etc/rc.d/syscons или
использовать /etc/rc.local и /etc/rc.conf.local для загрузки 16x32 фонтов.

Тип эмулируемого терминала для UTF-8 консоли: xterm
Начиная с 9.0, для syscons(4) драйвера и очень важно - для vt(4) драйвера,
в /etc/ttys необходимо использовать тип эмулируемого терминала xterm:

#
ttyv0   "/usr/libexec/getty Pc"         xterm   on  secure
# Virtual terminals
ttyv1   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv2   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv3   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv4   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv5   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv6   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv7   "/usr/libexec/getty Pc"         xterm   on  secure

Ранее, syscons(4), для KOI8-R тип эмулируемого терминала cons25r,
для KOI8-U - cons25u. Для CP437 (VGA default) - cons25, US-ASCII - cons25w.

При использовании KMS драйверов:

- i915kms
или
- radeonkms

в /boot/loader.conf добавить:

kern.vt.fb.default_mode="1024x768"
Для использования vt(4) драйвера в text-mode, /boot/loader.conf:
hw.vga.textmode=1

Если ядро собрано с поддержкой обоих драйверов: sc(4) и vt(4),
старый драйвер можно вернуть, задав в /boot/loader.conf:

kern.vty=sc

Пункт 2. Локализация login shells и использование login class.

Описан в FreeBSD HandBook и выполняется как обычно, локализация
login shell'ов и может быть использована совместно с настройкой login
class через описание его в /etc/login.conf

Локализация представляет из себя следующую конструкцию:

LanguageCode_CountryCode.Encoding
где:
LanguageCode_Country Code     Description
----------------------------------------------------
en_US                         English, United States
ru_RU                         Russian, Russia

команда покажет все присутствующие в системе locale:
# locale -a | more

Работа с charater set (charset) для языков, например:
- ISO8859-1, ISO8859-15, KOI8-R, CP1251, CP437 и тд и тп
описана в multibyte(3), а список charsets для языков можно найти
в IANA Registry

FreeBSD использует Xorg-compatible locale encodings.

1) использование login класса

- можно отредактировать /etc/login.conf и изменить настройки класса "russian"
или создать отдельный класс russianu

a) изменяем класс russian /etc/login.conf

russian|Russian Users Accounts:\
        :charset=KOI8-R:\
        :lang=ru_RU.KOI8-R:\
        :tc=default:
на
russian|Russian Users Accounts:\
        :charset=UTF-8:\
        :lang=ru_RU.UTF-8:\
        :tc=default:
или

b) создаем в дополнение к классу "russian", новый класс "russianu"

russianu|Russian Users Accounts UTF-8:\
        :charset=UTF-8:\
        :lang=ru_RU.UTF-8:\
        :tc=default:
По завершению перестраиваем хеш-базу:
# cap_mkdb /etc/login.conf

Все, осталось перевести пользователей которым нужен UTF-8 на новый класс
используя на выбор: passwd(1), pw(8), chpass(1), vipw(8)

2) настройка locale в shell/bash/csh/tcsh
для настройки локализации в шелах, необходимо соответствующим образом
настроить тот или иной shell, см. соответствующий man

Настройка локализации в login shell'ах сводится как минимум к заданию
переменных:


в пользовательских файлах: ~/.login_conf и/или пользовательских стартап
shell файлах: ~/.profile, ~/.bashrc, или ~/.cshrc.

sh/bash:

export LANG=ru_RU.UTF-8
export MM_CHARSET=UTF-8

Важно: в 10'ой ветке присутствует ошибка ввода UTF-8 в Bourne Shell, MFC из 11'ой ветки не было сделано:
Bug 196973 - sh(1) broken UTF-8 input

Примечание: в 11.x-RELEASE указанных выше проблем нет, в 10'ой ветке вместо /bin/sh можно установить bash.

csh/tsch:

setenv LANG ru_RU.UTF-8
setenv MM_CHARSET UTF-8
Или в системных стартап shell файлах: /etc/profile и /etc/csh.login

Прим: для bash необходимо создать в домашней директории файл .inputrc

set convert-meta Off
set input-meta On
set output-meta On

Перекодировка имен файлов и директорий.

- необходимо установить и использовать утилиту convmv, из пакетов или портов

# pkg install converters/convmv
# make -C /usr/ports/converters/convmv install clean
# man convmv

пример использования:

# convmv -f koi8-r -t utf-8 *
# convmv -f koi8-r -t utf-8 --notest *
# convmv -r -f koi8-r -t utf-8 --notest *

Примечание: при использовании утилиты convmv, возможны проблемы
с перекодированием отдельных символов.

Перекодировка содержимого файлов.

Можно воспользоваться утилитами iconv и recode:
- iconv (интегрирована в FreeBSD 10.x)
- /usr/ports/converters/libiconv в более ранних версиях

примеры использования:

- iconv

# man iconv

# iconv -c -f koi8-r -t utf-8 inputfile
# iconv -c -f koi8-r -t utf-8 inputfile > outputfile
# iconv -c -f koi8-r -t utf-8 < inputfile > outputfile
- recode
# make -C /usr/ports/converters/recode install clean
# man recode

# recode koi8-r..utf-8 inputfile
# recode koi8-r..utf-8 < inputfile > outputfile

Примечание: при использовании утилиты iconv, возможны проблемы
с перекодированием отдельных символов, утилита recode, работает
более адекватно.

Удаленный терминальный доступ.

Для удаленного терминального доступа из системы с UTF-8 локализацией
к системам с locale отличной от UTF-8, можно воспользоваться
утилитой luit:

пример использования luit (man luit):

# luit -encoding "KOI8-R" slogin username@host.domain
в качестве encoding использовать charset соответствующие удаленному
locale, в данном примере KOI8-R

Удаленный терминальный доступ из Windows в Unix-like OS с locale UTF-8:

- использование утилиты putty, настройка:

Putty -> Window -> Translation -> Remote character set: UTF-8

Пункт 3. Локализация Xorg

осталась неизменной, так как основная масса DE,WM и X-Apps в настоящее
время ориентирована на работу с UTF-8, больше не нужно использовать
shell-wrapper'ы или переопределять переменную LANG для их запуска.

фонты в Xorg:

- при использовании locale == ru_RU.UTF-8, необходимо использовать
фонты с поддержкой iso10646
- misc содержат fixed фонты iso10646, но by default не прописаны в
fonts.aliases, если есть привычка использования алиасов, придется прописать
их самостоятельно.
Например, как советует Markus Kuhn Unicode fonts and tools for X11.
- фонты misc с iso10646 и остальные фонты с iso10646, необходимо указывать
первыми в xorg.conf

например так:

        FontPath     "/usr/local/lib/X11/fonts/misc/"
        FontPath     "/usr/local/lib/X11/fonts/100dpi/"
        FontPath     "/usr/local/lib/X11/fonts/75dpi/"
        FontPath     "/usr/local/lib/X11/fonts/terminus-font/"
        FontPath     "/usr/local/lib/X11/fonts/bitstream-vera/"
        FontPath     "/usr/local/lib/X11/fonts/dejavu/"
        FontPath     "/usr/local/lib/X11/fonts/freefont/"
        FontPath     "/usr/local/lib/X11/fonts/unifont/"
        FontPath     "/usr/local/lib/X11/fonts/local/"
        FontPath     "/usr/local/lib/X11/fonts/webfonts/"
        FontPath     "/usr/local/lib/X11/fonts/urw/"
        FontPath     "/usr/local/lib/X11/fonts/cyrillic/"
        FontPath     "/usr/local/lib/X11/fonts/artwiz-ru/"
        FontPath     "/usr/local/lib/X11/fonts/freefont-ttf/"
        FontPath     "/usr/local/lib/X11/fonts/urwfonts-ttf/"
        FontPath     "/usr/local/lib/X11/fonts/TTF/"
        FontPath     "/usr/local/lib/X11/fonts/OTF/"
        FontPath     "/usr/local/lib/X11/fonts/Type1/"

Вы можете установить собственные предпочтения.

посмотреть установленные фонты:

# fc-list
# ls -laR /usr/local/etc/fonts/
- посмотреть фонты iso10646
# xlsfonts | grep iso10646
# xlsfonts | grep "-misc-fixed-medium" | grep iso10646 
# xlsfonts | grep "-misc-fixed-medium-r-semicondensed" | grep 10646

графические эмуляторы терминала с encoding, примеры с KOI8-R:

- mate-terminal, gnome-terminal:

# sh -c "export LANG=ru_RU.KOI8-R CHARSET=KOI8-R; gnome-terminal --geometry 80x35 --disable-factory"
# sh -c "export LANG=ru_RU.KOI8-R CHARSET=KOI8-R; mate-terminal --geometry 80x35 --disable-factory"
# sh -c "export LANG=ru_RU.KOI8-R CHARSET=KOI8-R; xfce4-terminal"
переменные среды LANG,CHARSET в соответствии с использованием locale, например
на удаленной стороне, или для локальной работы с файлами в KOI8-R

- xterm с encoding

# xterm -en [koi8-r|cp1251|...]

4. Локализация Applications (приложений).
зависит исключительно от написания applications в соответствии со
стандартом i18n и работой с базами termcap в случае xBSD или terminfo
в случае Linux или SYSV-based для эмулируемого терминала TERM.

Примечание: к сожалению, консольных фонтов пока, очень мало, не говоря уже
о хороших и красивых фонтах.
Некоторые фонты и клавиатурный маппинг от Александра Рыбалко, можно найти:

Пример конвертации bdf фонта в fnt используя vtfontcvt и его загрузку
используя vidcontrol, см: https://wiki.freebsd.org/Newcons

Минимум позволяющий работать в консоли с UTF-8:
- отображение - /usr/bin/less (использовать в качестве PAGER)
- редактирование - /usr/bin/vi , редактор Vi в 10.1 собран с поддержкой wide-char
- псевдографика в mc выглядит красиво, встроенный редактор поддерживает utf-8
- любимый многими, простой редактор /usr/bin/ee не поддерживает utf-8,
отображает криво, но позволяет набирать текст "вслепую".
- настройку chrasets и работу samba3x, samba4x - не проверял

Все верхнее проверено на реальном железе с FreeBSD 10.1 и в гостевой
FreeBSD 10.1 под VirtualBox, включая Xorg и несколько DE и WM.

Небольшой перечень популлярных редакторов с поддержкой UTF-8

Практика:
- используем syscons(4) для работы в консоли с KOI8-R, CP1251, CP866
- используем vt(4) для работы в консоли только с UTF-8

Вывод: наконец можно постепенно избавиться от разнообразия: CP866,CP1251,KOI8-R
и тд и тп и использовать одну универсальную кодировку UTF-8.

источники:


Copyleft lavr@unix1.jinr.ru Андрей Лаврентьев