Коротко о новом драйвере консоли 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'ах сводится как минимум к заданию
переменных:
- LANG
- MM_CHARSET
в пользовательских файлах: ~/.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.
Примечание: к сожалению, консольных фонтов пока, очень мало, не говоря уже
о хороших и красивых фонтах.
Некоторые фонты и клавиатурный маппинг от Александра Рыбалко, можно найти:
- https://people.freebsd.org/~ray/newcons/fonts/
- https://people.freebsd.org/~ray/newcons/newcons_kbd/
- https://people.freebsd.org/~emaste/newcons/
Пример конвертации 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
- разновидности Vi: vi, nvi, vim
- простые и популлярные: joe, cooledit, mcedit, nano
- mined
- yudit
- emacs/xemacs
Практика:
- используем syscons(4) для работы в консоли с KOI8-R, CP1251, CP866
- используем vt(4) для работы в консоли только с UTF-8
Вывод: наконец можно постепенно избавиться от разнообразия: CP866,CP1251,KOI8-R
и тд и тп и использовать одну универсальную кодировку UTF-8.
источники: