Костыле-Kit: Ubuntu Xenial, консоль и кириллица

Алексей Федорчук

Кириллизация консоли (или, если смотреть на вопросы ширше, настройка консольных экранных шрифтов вообще) — дежурная развлекуха перед выходом каждого очередного релиза Ubuntu со времён её systemd’изации. Правда, подозреваю, что и в других дистрибутивах, столь же затронутых прогрессом, ситуация аналогична, но о других сейчас речи не будет.

Не так давно, во время выхода релиза 15.10, казалось, что появилось окончательное решение консольного вопроса, описанное, например, здесь. Оно сводилось к замене в файле /lib/systemd/system/systemd-vconsole-setup.service строки:

ExecStart=/bin/true

на

ExecStart=/bin/setupcon

Однако из комментариев к указанной заметке почти сразу проявилось «Недолгое счастье Френсиса Маккомбера». Во-первых, файл systemd-vconsole-setup.service по заданному адресу мог отсутствовать как класс. Что, впрочем, могло решаться его созданием и вписыванием в него приведённой выше строки.

Но могло — и не решаться. В этом случае какое-то время помогало решение, найденное Eronex’ом: вписывание всё той же строки в файл /lib/systemd/system/console-setup.services. Однако, по сообщению Татьяны Ивановой aka Vita на форуме Matuntu, в тестовых сборках *buntu, предшествующих выходу второй бета-версии релиза 16.04, и этот метода перестал работать.

Занявшись тренировками по сборке своей Cintu на базе пре-релизных сборок Xenial’а, я не мог пройти мимо этого вопроса. Поскольку «десктопизацию» базовой системы (то есть установку Иксов и Cinnamon’а) начинал всегда с настройки комфортной среды в консольном режиме. И дело тут не только в его кириллизации: в конце концов, на время отладки системы можно дать команду

# export LANG=C.UTF-8

чтобы вывод консольных программ был хотя бы английско-читаемым. Но увы — не различаю я буковки консольного шрифта по умолчанию, да и сам шрифт, ИМХО, отменно скверен.

Даю установку, как говаривал некогда известный народный «целитель»: сразу после развёртывания базового Xenial’а с mini.iso с русским языком (подробнее здесь), выбранным на первом шаге инсталляции, буковки в консоли очень мелкие, и символы кириллицы (например, в выводе команды date) отображаются в виде квадратиков. Исправление этого осуществляется с помощью команды

# dpkg-reconfigure console-setup

и выполнения предписанных ею действий (даю подробности). После чего, как пел Тимур наш, Шаов,

Мир обретает образы и краски,
Глядеть в консолю можно без опаски.

Однако прыгать в половецкой пляске рано — после первой же перезагрузки системы консольный шрифт возвращается в исходное, то есть не русское и плохо читаемое, состояние. Единоразово это исправляется запуском команды

# setupcon -f

Но опять-таки — до ближайшего рестарта. Так что задача сводится к тому, чтобы обеспечить запуск указанной команды в ходе загрузки системы. Как — возможно несколько вариантов, о которых я скажу чуть позже. Потому что в итоге я вернулся к редактированию файла /lib/systemd/system/console-setup.services. В свежеустановленной системе он у меня содержал такую строку:

ExecStart=/usr/bin/loadkeys /etc/console-setup/cached.kmap.gz

Можно предполагать, что именно она и заставляла возвращаться к первоначально определённому шрифту. Так что я удалил её, заменив на

ExecStart=/bin/setupcon -f

Это обеспечило вывод настроенных через dpkg-reconfigure шрифтов на всех виртуальных терминалах. Хотя не уверен, что опция -f тут необходима, но проверять без неё мне уже было лениво.

Также у меня нет уверенности, что указанный способ будет работать и впредь, при последующих обновлениях пакета systemd (а именно они, как я догадываюсь, и создают нам все эти подлянки). Поэтому привожу несколько паллиативных костылей, которые я надыбал в ходе своих экспериментов.

Во-первых, если устанавливается чисто консольная базовая Ubuntu или она же с каким либо оконным менеджером, запускаемым через startx, можно отредактировать лучший костыль всех времён и народов — файл /etc/rc.local. По умолчанию он пуст, и в него достаточно вписать строку

setupсon -f

Однако при авторизации через дисплейный менеджер (MDM — точно, остальные — предположительно) этот способ не сработает. И тогда можно запускать setupcon -f из профильного файла login shell пользователя. То есть через ~/.profile или ~/.zshenv — для Bash или Zsh, соответственно. Правда, в этом случае умолчальный шрифт заменится только после авторизации пользователя — но, кажется, способа работать в консоли без неё ещё не придумали.

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

setupсon -f

можно вписать в /etc/profile или /etc/zsh/zshenv. Обращаю внимание, что во всех случаях редактировать нужно профильные файлы именно для login shell, а не для интерактивной оболочки (то есть не ~/.bashrc, /zshrc, /etc/bash.bashrc или /etc/zsh/zshrc). Иначе в терминальном окне, запущенном в Иксах, будет появляться раздражающее сообщение о том, что это не консоль.

В заключение скажу, что в ходе описанных экспериментов я постоянно вспоминал стих, приписываемый нашему великому поэту Владимир Владимировичу (Маяковскому):

Товарищ онанист, радуйся!
Машина дрочки налажена!
К твоим услугам любая дыра,
Любая замочная скважина!

Похоже, что создатели systemd обеспечили нам именно такую универсальную машину, к которой придётся обращаться при кириллизации консоли в каждом новом релизе. То есть для очередного решения задачи, казалось бы, решённой раз и навсегда лет 12 назад.

Костыле-Kit: Ubuntu Xenial, консоль и кириллица: 10 комментариев

  1. К сожалению, ни один из предложенных костылей мне не помог избавиться от квадратиков :(

  2. На Debian Jessie помогло добавление setupсon -f в /etc/profile

  3. >Похоже, что создатели systemd обеспечили нам именно такую универсальную машину…
    воистину мазохисты! Поттерингу бы накалякали благодарственное письмо что ли…

  4. Каюсь, поспешила с выводами о найденном решении. После перезагрузки системы квадратики в консоль вернулись.

  5. Vita, и я как раз только что завершил проверку того, что рассказывается в статье. Результат также отрицательный. Через часок размещу заметку в продолжение темы.

  6. После очередного обновления системы всё возвращается в прежнее состояние. Увы…

  7. Работает, спасибо. Но более грамотно, мне кажется, не редактировать напрямую /lib/systemd/system/console-setup.service, а сделать «как положено»:

    systemctl edit console-setup.service

    Это создаст файл override.conf в /etc/systemd/system/console-setup.service.d/

    По идее после этого апдейты пакетов не должны «сносить» изменения.

  8. dad, да, согласен, спасибо за подсказку
    Но это — если заработает. Как показывает практика, такое не всегда бывает.
    Так что правильней всего было бы — запихать в апстрим патченный пакет.
    Но это, увы, не от нас зависит…

Добавить комментарий