Содержание
В 15.10 изменена система загрузки (sustemd) и описанное ниже средство не помогает. Смотрите раздел Решение для ubuntu 15.10 и более поздних.
Почему в консоли квадратики вместо русских букв?
Многие замечали, что из версии в версию в Ubuntu у некоторых слетают русские фонты в консоли (куда можно попасть нажав CTRL+ALT+F1 - F6, а CTRL+ALT+F7 возвращает в графическую среду). Озаботившись причинами почему это происходит я (Sly_tom_cat) облазил кучу мест в поисках решения. Залез и в initrd и смотрел в скрипты upstart и в UDEV… что ни правил - не помогает. Особо порадовал комментарий разработчиков в одном из скриптов Udev1). Cуть там примерно такова: «надо бы делать как-то так, но мы попробовали - у нас не вышло. Так что, делаем как получится, а если юзерам нужны нормальные фонты - пускай выполнят setupcon и все будет Ok»
Но все-таки нет такого решения, которого не найти в Интернете. Причем нашел я его даже по русски 2)
Как же правильно лечить больного?
Оказывается, всего навсего, нужно включить поддержку фреймбуфера на этапе инициализации ядра. Это в свою очередь разрешит выполнение нужных скриптов, которые загрузят фонты на самом раннем этапе инициализации ядра.
Для этого:
1. в любом текстовом редакторе с правами рута нужно в файл /etc/initramfs-tools/initramfs.conf добавить строчку FRAMEBUFFER=Y.
Это также можно сделать выполнив следующие команды:
sudo -i echo 'FRAMEBUFFER=Y' >> /etc/initramfs-tools/initramfs.conf exit
2. Обновить образ рамдиска периода инициализации ядра (initrd):
sudo update-initramfs -u
Поле этих манипуляций наконец начнут работать настройки сделанные командой3):
sudo dpkg-reconfigure console-setup
Кириллическими фонтами будет показываться все с самого начала - т.е. даже запрос на проверку дисков (возникающий в процессе инициализации ядра) будет выводится кириллицей, а не квадратами.
Возможно потребуется так же настроить и клавиатуру (раскладки, переключение раскладок и compose-key)4):
sudo dpkg-reconfigure keyboard-configuration
Кому интересно - "откуда ноги растут"...
Покопавшись глубже можно обнаружить следующее:
В initrd/scripts/init-top/ лежат скрипты выполняющиеся в самом начале процесса инициализации ядра. И там мы видим все, что могло бы потребоваться для поддержки «правильных» фонтов
scripts/init-top/console_setup scripts/init-top/keymap scripts/init-top/blacklist scripts/init-top/udev scripts/init-top/framebuffer scripts/init-top/ORDER scripts/init-top/plymouth scripts/init-top/all_generic_ide
Но, если заглянуть в файлы console_setup, keymap и framebuffer то в самом начале скрипта мы увидим такую строчку:
OPTION=FRAMEBUFFER
А покопавшись в скриптах инициализации можно понять, что OPTION обрабатывается так, что если значение переменной (что ей присвоено) не задано или не Y, то выполнение самого скрипта пропускается. Т.е. в нашем случае, если FRAMEBUFFER не равно Y, то ни один из скриптов, отвечающих за поддержку фонтов и раскладок клавиатуры, попросту не будут выполнятся в процессе инициализации ядра.
Но без FRAMEBUFFER не возможно загрузить шрифты с поддержкой национальных символов!
Примечательно то, что настройки раскладок клавиатуры все-таки будут применены в процессе загрузки ОС (уже после инициализации ядра). За это отвечает скрипт console-setup системы инициализации upstart, а вот консольные фонты скрипты upstart не настраивают.
Однако, это совсем не объясняет почему подобная проблема возникает не у всех. И как оказывается - она вылезает у любителей оптимизации системы, да еще и у пользователей серверной версии Ubuntu…
Что можно увидеть в любой инструкции по повышению скорости загрузки ОС?
Правильно - «уберите заставку при загрузке»: в файле /etc/default/grub в переменной GRUB_CMDLINE_LINUX_DEFAULT значение splash замените на nosplash или просто уберите) и выполните sudo update-grub. Ну, а пользователи серверной версии Ubuntu по умолчанию обделены таким «счастьем», как графическая заставка во время загрузки.
Так вот, оказывается, разработчики решили, что фреймбуфер нужен для рисования заставки и … и только для этого. Больше (оказывается) он никому, ни зачем, не нужен. Поэтому, если заставку рисуем - то фреймбуфер разрешаем (а то как же - без него же не нарисовать заставку), а если заставку не рисуем, то и фреймбуфер включать незачем, не включаем…. Нет, позже, после инициализации ядра, фреймбуфер все-таки где-то активируется, но поезд уже ушел - фонты на этапе иницализации ядра не загрузились…. «а кому надо - те пусть вызывают setupcon …»
Решение для ubuntu 15.10 и более поздних
В Ubuntu 15.10 имеется неисправленный баг с настройкой локали https://bugs.launchpad.net/ubuntu/+source/console-setup/+bug/1511975. Поэтому для настройки русского языка необходимо проделать следующее 1.
sudo dpkg-reconfigure console-setup
(настройки в файле /etc/default/console-setup)
/dev/tty[1-6] UTF-8 Combined - Latin; Slavic and non-Slavic cyrillic Let system select suitable font 8x16
2.
sudo dpkg-reconfigure keyboard-configuration
(настройки в файле /etc/default/keyboard)
Generic 105-key (Intl) (выберите вашу клавиатуру) Russian Russian (выберите вашу раскладку) Control+Shift (выберите шорткат для смены раскладки) No temporary switch The default for the keyboard layout No compose key
3.
sudo nano /lib/systemd/system/console-setup.service
Заменить последнюю строку
ExecStart=/usr/bin/loadkeys /etc/console-setup/cached.kmap.gz
на
ExecStart=/bin/setupcon
4.
sudo reboot
Вредные советы
Поиск в сети порой дает много костыльных советов на данную тему. Особенно часто встречаются два из них:
1. костыль из костылей: «Прописать setupcon в /etc/rc.local» - мало того что это костыль, да еще и не помогает иногда :(
2. совсем эпический по своей дебильности костыль - персональный пакет для русского языка в консоли - console-cyrillic !!! …вызывает полное недоумение идея - «под каждый язык на свете создавать персональный пакет для консоли», когда по дефолту в UTF8 кодировке и основных консольных шрифтах есть все, что нужно для поддержки практически любого языка (по крайней мере европейского).
Если вам попадаются такие советы, не поленитесь - объясните людям их глубокое заблуждение и отправьте на эту страницу.