# Fonts (Русский)

Related articles

- Настройка шрифтов
- Infinality (Русский)
- Шрифты окружения Java Runtime
- Шрифты Microsoft

Эта страница нуждается в сопроводителе

Статья не гарантирует актуальность информации. Помогите русскоязычному сообществу поддержкой подобных страниц. См. Команда переводчиков ArchWiki

Согласно Википедии:

  Шрифт (нем. Schrift ← schreiben — писать) — графический рисунок начертаний букв и знаков, составляющих единую стилистическую и композиционную систему, набор символов определенного размера и рисунка.

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

## Форматы шрифтов

Большинство современных компьютерных шрифтов могут быть в растровом или контурном формате данных.

Растровые шрифты
  Состоит из матрицы точек или пикселей, представляющих рисунок каждого символа во всех размерах.
Контурные или векторные шрифты
  Используются кривые Безье, инструкции отрисовки и математические формулы для описания каждого символа, что позволяет масштабировать символы в любой размер.

### Распространённые расширения

Эта статья или раздел нуждается в переводе

Примечания: пожалуйста, используйте первый аргумент шаблона для указания дополнительной информации. (обсуждение: Talk:Fonts (Русский)#)

- `bdf` и `bdf.gz` – растровый шрифт, сжатый в gzip (BDF — Bitmap Distribution Format)
- `pcf` и `pcf.gz` – растровый, переносимый скомпилированный шрифт, сжатый в gzip
- `psf`, `psfu`, `psf.gz` и `psfu.gz` – bitmaps, PC screen font, PC screen font Unicode and the gzipped versions (not compatible with X.Org)
- `pfa` and `pfb` – outline fonts, PostScript font ASCII and PostScript font binary. PostScript fonts carry built-in printer instructions.
- `ttf` – outline, TrueType font. Originally designed as a replacement for the PostScript fonts.
- `otf` – outline, OpenType font. TrueType with PostScript typographic instructions.

В большинстве случаев, технические различия между TrueType и OpenType можно проигнорировать, многие шрифты с расширением {{ic|ttf} обычно OpenType.

### Другие форматы

Эта статья или раздел нуждается в переводе

Примечания: пожалуйста, используйте первый аргумент шаблона для указания дополнительной информации. (обсуждение: Talk:Fonts (Русский)#)

The typesetting application, TeX, and its companion font software, Metafont, render characters using their own methods. Some of the file extensions used for fonts by these two programs are `*pk`, `*gf`, `mf` and `vf`.

FontForge, a font editing application, can store fonts in its native text-based format, `sfd`, spline font database.

The SVG format also has its own font description method.

## Установка

Существует множество методов установки шрифтов.

### Pacman

Шрифты и их коллекции можно установить из включенных репозиториев используя pacman. Увидеть список доступных шрифтов можно командой:

    $ pacman -Ss font

Или исключительно `ttf` шрифты:

    $ pacman -Ss ttf

### Создание пакета

Лучше всего предоставить pacman'у возможность управления установленными шрифтами, что можно сделать создав Arch пакет. Этим можно также поделиться с сообществом в AUR. Ниже приведён пример создания пакета. Чтобы узнать об этой процедуре больше, смотрите страницу PKGBUILD.

    pkgname=ttf-fontname
    pkgver=1.0
    pkgrel=1
    pkgdesc="custom fonts"
    arch=('any')
    depends=('fontconfig' 'xorg-font-utils')
    source=("http://someurl.org/$pkgname.tar.bz2")
    install=$pkgname.install

    package() {
      install -d "$pkgdir/usr/share/fonts/TTF"
      cp -dpr --no-preserve=ownership "$srcdir/$pkgname/"*.ttf "$pkgdir/usr/share/fonts/TTF/"
    }

Данный PKGBUILD предполагает что шрифты - TrueType. Установочный файл (`ttf-fontname.install`) тоже должен быть создан для обновления кеша шрифтов:

    post_install() {
      echo -n "Updating font cache... "
      fc-cache -fs >/dev/null
      mkfontscale /usr/share/fonts/TTF /usr/share/fonts/Type1
      mkfontdir /usr/share/fonts/TTF /usr/share/fonts/Type1
      echo "done"
    }

    post_upgrade() {
      post_install
    }

    post_remove() {
      post_install
    }

Для более удобного создания пакетов из ttf-fonts вы можете также использовать makefontpkgAUR из AUR.

### Установка вручную

Рекомендованный мотод добавления шрифтов, недоступных в репозиториях, в систему описан в разделе #Создание пакета. Это даёт возможность пакетному менеджеру pacman удалять или обновлять их позднее. Шрифты также могут быть установлены вручную.

Чтобы установить шрифты для всей системы (доступные для всех пользователей), переместите папку шрифтов в директорию `/usr/share/fonts/`. Чтобы установить шрифты только для одного пользователя, добавляйте их директорию `~/.local/share/fonts`.

For Xserver to load fonts directly (as opposed to the use of a font server) the directory for your newly added font must be added with a FontPath entry. This entry is located in the Files section of your Xorg configuration file (e.g. `/etc/X11/xorg.conf` or `/etc/xorg.conf`). See #Older applications[broken link: invalid section] for more detail.

После чего обновите кеш шрифтов fontconfig:

    $ fc-cache -vf

# Рекомендации по выбору шрифтов

В качестве основного шрифта рабочего окружения можно рекомендовать либо Droid Fonts, либо Bitstream Vera Fonts, либо Red Hats Liberation Fonts. Однако стоит заметить, что начертание некоторых букв шрифта Red Hats Liberation Fonts на данный момент оставляет желать лучшего, поэтому его, в отличие от Bitstream Vera Fonts, необходимо устанавливать вручную, а не из репозитория.

## Установка Droid Fonts

    # pacman -S ttf-droid

## Установка Bitstream Vera Fonts

    # pacman -S ttf-dejavu

## Установка Red Hats Liberation Fonts

    # mkdir /usr/share/fonts/TTFmisc
    # cd /usr/share/fonts/TTFmisc
    # wget -O ./liberation-fonts.tar.gz https://bugzilla.redhat.com/attachment.cgi?id=290976
    # tar -xf ./liberation-fonts.tar.gz
    # cp ./liberation-fonts/*.ttf ./
    # rm -R ./liberation-fonts/
    # rm -R liberation-fonts.tar.gz
    # mkfontscale
    # mkfontdir

## Установка шрифтов Microsoft®

Так как в пакете ttf-ms-fonts присутствуют некоторые шрифты, начертание которых на данный момент оставляет желать лучшего, можно воспользоваться альтернативным вариантом их установки, который заключается в выборочной инсталляции только необходимых шрифтов.

Необходимые шрифты Вы можете скачать на этой странице веб-сайта SourceForge.net

Не рекомендуется скачивать шрифт Arial, т.к. Red Hats Liberation Fonts, загруженный с сайта Red Hat Bugzilla, имеет схожее начертание и более чёткие линии.

После того, как Вы скачали все необходимые exe-файлы — из них нужно извлечь шрифты в соответствующую папку (напр., `/usr/share/fonts/TTFmisc/`):

    # cabextract -F *.TTF -d /usr/share/fonts/TTFmisc <имя-пакета>.exe
    # cd /usr/share/fonts/TTFmisc
    # mkfontscale
    # mkfontdir

# Шрифты с включенным LCD фильтром

## "LCD" пакеты

Установка:

Удалите оригинальные пакеты:

    # pacman -Rd libxft cairo

Установите патченные пакеты из AUR:

    $ yaourt -S fontconfig-lcd
    $ yaourt -S cairo-lcd
    # pacman -S libxft-lcd

Перезапустите Xorg (`Ctrl+Alt+Backspace`)

Удаление:

    # pacman -Rd libxft-lcd cairo-lcd fontconfig-lcd
    # pacman -S libxft cairo

## "LCD" пакеты c патчами Ubuntu

Установка:

Процесс установки этих пакетов несколько отличается от вышеописанных. Для быстрой и успешной инсталляции все действия должны производиться в такой последовательности:

    $ yaourt -S freetype2-ubuntu

При установке yaourt сообщит о конфликте, конфликтующие пакеты нужно будет удалить.

Аналогично устанавливаются остальные пакеты. Порядок установки пакетов должен быть таким:

     1. freetype2-ubuntu
     2. fontconfig-ubuntu
     3. cairo-ubuntu

# Конфигурация

## Общие понятия

Настройки, касающиеся отрисовки шрифтов в Xorg, находятся в:

- папке `/etc/fonts/`
- файле `/etc/X11/Xresources` (содержимое ниже)

Содержимое `/etc/fonts/`:

- папка conf.avail - содержит доступные файлы конфигураций
- папка conf.d - содержит символические ссылки на файлы конфигураций (из папки `/etc/fonts/conf.d/`), определяющие параметры шрифтов (отрисовка, замена одних шрифтов другими и т.д.)
- файл fonts.dtd
- файл fonts.conf

Например, для применения автохинтинга шрифтов Free Type необходимо создать в папке `/etc/fonts/conf.d/` символическую ссылку на файл `/etc/fonts/conf.avail/10-autohint.conf`:

    # ln -s /etc/fonts/conf.avail/10-autohint.conf /etc/fonts/conf.d/10-autohint.conf

Примечание: В настоящее время не все шрифты с автохинтингом выглядят приемлемо, поэтому рекомендуется его использовать либо для отрисовки шрифтов малого размера, либо не использовать вообще.

Как можно заметить, для файлов конфигурации применяется следующий формат именования:

`<xx>-<sometext>.conf`, где:

`<sometext>` - любой текст, описывающий параметры, находящиеся в этом файле (напр.: "hinting-full");

`<xx>` - двузначное число от 00 до 99, влияет на позицию файла при сортировке по имени, а, соответственно, и на его приоритет: чем больше число - тем выше приоритет.

Например: если в дирректории будут находится два файла с именами `11-hinting-slight.conf` (применение слабого сглаживания) и `10-hinting-medium.conf` (применение среднего сглаживания), то файл `11-hinting-slight.conf` "перекроет" файл `10-hinting-medium.conf` и при отрисовке шрифтов будет использоваться слабое сглаживание.

Примечание: В файле `/etc/fonts/conf.d/README` Вы можете более подробно узнать о префиксном нумеровании, применяемого для этих файлов.

## Рекомендации по настройке (для патчей *-ubuntu)

Здесь приведено содержимое конфигурационных файлов/каталогов, так или иначе влияющих на начертание шрифтов в системе.

Примечание: Если у Вас в системе всего один пользовательский аккаунт - настраивать шрифты рекомендуется посредством правки файла `~/.fonts.conf` (Fonts (Русский)#cat ~/.fonts.conf (альтернатива настройкам в /etc/fonts/...)), т.к. это:

- избавит Вас от повторной настройки при переустановке/смене дистрибутива
- удобно для быстрого отката изменений (достаточно сделать копию одного файла, а не нескольких)

Файл `/etc/X11/Xresources`:

    Xft.dpi: 96
    ! hintnone, hintslight, hintmedium, hintfull
    Xft.hintstyle: hintfull
    Xft.hinting: true
    ! lcdnone, lcddefault, lcdlight, lcdlegacy
    Xft.lcdfilter: lcddefault
    Xft.rgba: rgb

Эти настройки можно также задать персонально для пользователя в файле `~/.Xdefaults`. Подробнее об опциях Xft написано здесь.

Каталог `/etc/fonts/conf.d/` :

    lrwxrwxrwx 1 root root   31 Апр  9 10:48 10-antialias.conf -> ../conf.avail/10-antialias.conf
    lrwxrwxrwx 1 root root   42 Апр 17 13:18 10-hinting-full.conf -> /etc/fonts/conf.avail/10-hinting-full.conf
    lrwxrwxrwx 1 root root   29 Апр  9 10:48 10-hinting.conf -> ../conf.avail/10-hinting.conf
    lrwxrwxrwx 1 root root   43 Апр  8 18:17 10-sub-pixel-rgb.conf -> /etc/fonts/conf.avail/10-sub-pixel-rgb.conf
    lrwxrwxrwx 1 root root   51 Апр 17 13:14 11-lcd-filter-lcddefault.conf -> /etc/fonts/conf.avail/11-lcd-filter-lcddefault.conf
    ...
    lrwxrwxrwx 1 root root   41 Апр  9 10:49 45-latin.conf -> /etc/fonts/conf.avail/45-latin.conf-droid
    ...
    lrwxrwxrwx 1 root root   41 Апр  9 10:49 60-latin.conf -> /etc/fonts/conf.avail/60-latin.conf-droid
    ...
    lrwxrwxrwx 1 root root   34 Апр  8 18:18 99-misc.conf -> /etc/fonts/conf.avail/99-misc.conf

Файл `/etc/fonts/conf.d/10-antialias.conf` :

    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
      <match target="font">
        <edit name="antialias" mode="assign"><bool>true</bool></edit>
      </match>
    </fontconfig>

Файл `/etc/fonts/conf.d/10-hinting-full.conf` :

    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
      <match target="font">
        <edit name="hintstyle" mode="assign"><const>hintfull</const></edit>
      </match>
    </fontconfig>

Файл `/etc/fonts/conf.d/10-hinting.conf` :

    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
      <match target="font">
        <edit name="hinting" mode="assign"><bool>true</bool></edit>
      </match>
    </fontconfig>

Файл `/etc/fonts/conf.d/10-sub-pixel-rgb.conf` :

    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
      <match target="font">
        <edit name="rgba" mode="assign"><const>rgb</const></edit>
      </match>
    </fontconfig>

Файл `/etc/fonts/conf.d/11-lcd-filter-lcddefault.conf` :

    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
      <match target="font">
        <edit mode="assign" name="lcdfilter">
          <const>lcddefault</const>
        </edit>
      </match>
    </fontconfig>

Файл `/etc/fonts/conf.d/45-latin.conf-droid` :

    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>

    	<alias>
    		<family>Droid Serif</family>
    		<family>Bitstream Vera Serif</family>
    		<family>DejaVu Serif</family>
    		<family>Liberation Serif</family>
    		<family>Times New Roman</family>
    		<family>Times</family>
    		<family>Nimbus Roman No9 L</family>
    		<family>Luxi Serif</family>
    		<family>Thorndale AMT</family>
    		<family>Thorndale</family>
    		<default><family>serif</family></default>
    	</alias>
    	<alias>
    		<family>Droid Sans</family>
    		<family>Bitstream Vera Sans</family>
    		<family>DejaVu Sans</family>
    		<family>Liberation Sans</family>
    		<family>Arial</family>
    		<family>Helvetica</family>
    		<family>Verdana</family>
    		<family>Albany AMT</family>
    		<family>Albany</family>
    		<family>Nimbus Sans L</family>
    		<family>Luxi Sans</family>
    		<default><family>sans-serif</family></default>
    	</alias>
     	<alias>
    		<family>Droid Sans Mono</family>
    		<family>Bitstream Vera Sans Mono</family>
    		<family>DejaVu Sans Mono</family>
    		<family>Liberation Mono</family>
    		<family>Courier New</family>
    		<family>Courier</family>
    		<family>Andale Mono</family>
    		<family>Luxi Mono</family>
    		<family>Cumberland AMT</family>
    		<family>Cumberland</family>
    		<family>Nimbus Mono L</family>
    		<default><family>monospace</family></default>
    	</alias>
     	<alias>
    		<family>Impact</family>
    		<family>Copperplate Gothic Std</family>
    		<family>Cooper Std</family>
    		<family>Bauhaus Std</family>
    		<default><family>fantasy</family></default>
    	</alias>
    	<alias>
    		<family>ITC Zapf Chancery Std</family>
    		<family>Zapfino</family>
    		<family>Comic Sans MS</family>
    		<default><family>cursive</family></default>
    	</alias>
    </fontconfig>

Файл `/etc/fonts/conf.d/60-latin.conf` :

    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
    	<alias>
    		<family>serif</family>
    		<prefer>
    			<family>Droid Serif</family>
    			<family>DejaVu Serif</family>
    			<family>Bitstream Vera Serif</family>
    			<family>Times New Roman</family>
    			<family>Thorndale AMT</family>
    			<family>Luxi Serif</family>
    			<family>Nimbus Roman No9 L</family>
    			<family>Times</family>
    		</prefer>
    	</alias>
    	<alias>
    		<family>sans-serif</family>
    		<prefer>
    			<family>Droid Sans</family>
    			<family>DejaVu Sans</family>
    			<family>Bitstream Vera Sans</family>
    			<family>Verdana</family>
    			<family>Arial</family>
    			<family>Albany AMT</family>
    			<family>Luxi Sans</family>
    			<family>Nimbus Sans L</family>
    			<family>Helvetica</family>
    			<family>Lucida Sans Unicode</family>
    			<family>BPG Glaho International</family>
    			<family>Tahoma</family>
    		</prefer>
    	</alias>
    	<alias>
    		<family>monospace</family>
    		<prefer>
    			<family>Droid Sans Mono</family>
    			<family>DejaVu Sans Mono</family>
    			<family>Bitstream Vera Sans Mono</family>
    			<family>Andale Mono</family>
    			<family>Courier New</family>
    			<family>Cumberland AMT</family>
    			<family>Luxi Mono</family>
    			<family>Nimbus Mono L</family>
    			<family>Courier</family>
    		</prefer>
    	</alias>
     	<alias>
    		<family>fantasy</family>
    		<prefer>
    			<family>Impact</family>
    			<family>Copperplate Gothic Std</family>
    			<family>Cooper Std</family>
    			<family>Bauhaus Std</family>
    		</prefer>
    	</alias>
    	<alias>
    		<family>cursive</family>
    		<prefer>
    			<family>ITC Zapf Chancery Std</family>
    			<family>Zapfino</family>
    			<family>Comic Sans MS</family>
    		</prefer>
    	</alias>
    </fontconfig>

Файл `/etc/fonts/conf.d/99-misc.conf` :

    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
        <match target="font">
    	<edit name="rgba" mode="assign">
    	    <const>rgb</const>
    	</edit>
        </match>

        <match target="font">
    	<test name="size" compare="less_eq">
    	    <double>8</double>
    	</test>
    	<edit name="autohint" mode="assign">
    	    <bool>true</bool>
    	</edit>
        </match>

        <match target="font">
    	<test name="size" compare="more">
    	    <double>10</double>
    	</test>
    	<edit name="hintstyle" mode="assign">
    	    <const>hintslight</const>
    	</edit>
        </match>

        <match target="font">
    	<test name="family">
    	    <string>Tahoma</string>
    	</test>
    	<test name="size" compare="eq">
    	    <double>6</double>
    	</test>
    	<test name="weight" compare="more_eq">
    	    <const>medium</const>
    	</test>
    	<edit name="autohint" mode="assign">
    	    <bool>true</bool>
    	</edit>
        </match>
        <match target="pattern" name="family" >
            <test name="family" qual="any" >
                <string>Clean</string>
            </test>
            <edit mode="assign" name="family" >
                <string>sans-serif</string>
            </edit>
        </match>
        <match target="pattern" name="family" >
            <test name="family" qual="any" >
                <string>Fixed</string>
            </test>
            <edit mode="assign" name="family" >
                <string>monospace</string>
            </edit>
        </match>
        <match target="pattern" name="family" >
            <test name="family" qual="any" >
                <string>Nimbus Sans L</string>
            </test>
            <edit mode="assign" name="family" >
                <string>sans-serif</string>
            </edit>
        </match>
        <match target="pattern" name="family" >
            <test name="family" qual="any" >
                <string>Nimbus Roman No9 L</string>
            </test>
            <edit mode="assign" name="family" >
                <string>serif</string>
            </edit>
        </match>
        <match target="pattern" name="family" >
            <test name="family" qual="any" >
                <string>Nimbus Mono L</string>
            </test>
            <edit mode="assign" name="family" >
                <string>monospace</string>
            </edit>
        </match>
    </fontconfig>

Примечание: Рекомендации по настройке характерны для системы, в которой установлены следующие пакеты:

    cairo-ubuntu
        Cairo vector graphics library, with Ubuntu's LCD rendering patches
    fontconfig-ubuntu
        A library for configuring and customizing font access, with Ubuntu's LCD rendering patches
    freetype2-ubuntu
        TrueType font rendering library, with Ubuntu's LCD rendering patches
    libxft-ubuntu
        FreeType-based font drawing library for X, with Ubuntu's LCD rendering patches
    ttf-droid
        A font created by Ascender Corporation for use by the Open Handset Alliance platform, Android.

### cat `~/.fonts.conf` (альтернатива настройкам в `/etc/fonts/...`)

    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
        <match target="font">
            <edit name="antialias" mode="assign"><bool>true</bool></edit>
            <edit name="autohint" mode="assign"><bool>false</bool></edit>
            <edit name="hintstyle" mode="assign"><const>hintfull</const></edit>
            <edit name="hinting" mode="assign"><bool>true</bool></edit>
            <edit name="rgba" mode="assign"><const>rgb</const></edit>
    	<edit name="lcdfilter" mode="assign"><const>lcddefault</const></edit>
        </match>

        <match target="font">
    	<test name="size" compare="less_eq"><double>8</double></test>
            <edit name="autohint" mode="assign"><bool>true</bool></edit>
        </match>
        <match target="font">
    	<test name="size" compare="more_eq"><double>14</double></test>
    	<edit name="rgba" mode="assign"><const>none</const></edit>
        </match>

        <match target="font">
            <test name="family"><string>Tahoma</string></test>
            <test name="size" compare="eq"><double>6</double></test>
            <test name="weight" compare="more_eq"><const>medium</const></test>
            <edit name="autohint" mode="assign"><bool>true</bool></edit>
        </match>
        <match target="pattern" name="family" >
            <test name="family" qual="any" >
                <string>Clean</string>
            </test>
            <edit mode="assign" name="family" >
                <string>sans-serif</string>
            </edit>
        </match>
        <match target="pattern" name="family" >
            <test name="family" qual="any" >
                <string>Fixed</string>
            </test>
            <edit mode="assign" name="family" >
                <string>monospace</string>
            </edit>
        </match>
        <match target="pattern" name="family" >
            <test name="family" qual="any" >
                <string>Nimbus Sans L</string>
            </test>
            <edit mode="assign" name="family" >
                <string>sans-serif</string>
            </edit>
        </match>
        <match target="pattern" name="family" >
            <test name="family" qual="any" >
                <string>Nimbus Roman No9 L</string>
            </test>
            <edit mode="assign" name="family" >
                <string>serif</string>
            </edit>
        </match>
        <match target="pattern" name="family" >
            <test name="family" qual="any" >
                <string>Nimbus Mono L</string>
            </test>
            <edit mode="assign" name="family" >
                <string>monospace</string>
            </edit>
        </match>

        <alias>
            <family>Droid Serif</family>
            <default><family>serif</family></default>
        </alias>

        <alias>
            <family>Droid Sans</family>
            <default><family>sans-serif</family></default>
        </alias>

        <alias>
            <family>Liberation Mono</family>
            <default><family>monospace</family></default>
        </alias>

        <alias>
            <family>serif</family>
            <prefer><family>Droid Serif</family></prefer>
        </alias>
        <alias>
            <family>sans-serif</family>
            <prefer><family>Droid Sans</family></prefer>
        </alias>
        <alias>
            <family>monospace</family>
            <prefer><family>Liberation Mono</family></prefer>
        </alias>
    </fontconfig>

# Шрифт в консоли

## Теория

После запуска ядро Linux создаёт и поддерживает текстовую консоль.

Текст, выводимый в символьное устройство `/dev/console` , записывается в специальный буфер в памяти вместе с информацией о цвете.

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

При инициализации консоли в этот буфер записывается дефолтный шрифт, вкомпилированный в ядро (как правило, без кириллицы), а в дальнейшем шрифт в буфере может быть заменён с помощью утилиты `setfont`. Так как в этом буфере находится только содержимое файла со шрифтом, но не его название, ядро не знает, какой шрифт в него загружен, и в случае создания консоли заново, как это происходит при переключении из текстового режима во фрэймбуфер после старта соответствующего видеокарте drm-модуля, шрифт снова сбрасывается в дефолт.

В дополнение к "реальной" консоли, ядро поддерживает динамически расширяемый набор виртуальных консолей `/dev/tty1`, `tty2` и т.д., и корневую виртуальную консоль `/dev/tty0`

Хотя устройства для первых 59 виртуальных консолей создаются заранее, сами консоли при этом остаются в представлении ядра лишь номерами. Реально они появляются только после первой попытки вывода в них текста. На экран все виртуальные консоли выводятся путём подмены буферов в единственной "реальной" консоли, причём буфер шрифта при создании новой виртуальной консоли берётся тот, что был в "реальной" на момент создания.

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

## Практика

В пакете `systemd` за загрузку консольного шрифта отвечает программа `/usr/lib/systemd/systemd-vconsole-setup` , которая читает его имя из параметра `FONT=` в конфиге `/etc/vconsole.conf` . Суффикс/расширение (.psf.gz) файла со шрифтом в конфиге писать не обязательно.

Имеющиеся в системе консольные шрифты находятся в каталоге `/usr/share/kbd/consolefonts/` , проверить их можно, запустив команду `setfont` для каждого из них.

Если для вашей видеокарты при загрузке системы подключается drm-модуль, например i915 для intel, его старт приводит к появлению нового устройства фреймбуфера (или замене старого на новый) (`/dev/fb0` и т.д.), и повторной инициализации консоли со сбросом шрифта. Если это происходит уже после того, как `systemd-vconsole-setup` загрузила ваш шрифт, вам требуется либо загрузить его повторно, либо обеспечить старт drm-модуля заведомо раньше загрузки шрифта.

Второе проще всего сделать, добавив ваш drm-модуль в строку MODULES= конфига `/etc/mkinitcpio.conf` и перегенерировав образ initramfs. Для стационарной системы этого вполне достаточно.

Если вы используете initramfs с хуком `systemd`, либо вообще не используете initramfs, или ваша же система "переносная", то есть находится на съёмном диске или флешке, и запускается на разных машинах, предпочтительнее первый вариант. Для этого нужно создать правило UDEV, которое будет срабатывать на появление нового устройства `/dev/fb*`

- `/etc/udev/rules.d/96-fb-all-vcs-setup.rules`

    # Setup all vconsoles for a new framebuffer device
    KERNEL=="fb*", ACTION=="add", RUN+="/bin/sh /etc/udev/all-vcs-set.sh"

и скрипт, который оно будет запускать:

- `/etc/udev/all-vcs-set.sh`

    #!/bin/sh
    # We must load locale for $VCS util
    . /etc/locale.conf
    export LANG
    VCS=/usr/lib/systemd/systemd-vconsole-setup
    # Setup the "real" (current) console first
    $VCS
    # Setup all other active consoles
    for VC in /dev/vcs[0-9]*
    do $VCS /dev/tty${VC#/dev/vcs}
    done

Скрипт читает локаль, которая требуется для нормальной работы утилиты `systemd-vconsole-setup`, после чего выполняет её для "реальной" консоли, и для каждой из созданных на этот момент виртуальных, если такие есть. Для определения инициализированных виртуальных консолей здесь использованы устройства произвольного доступа к текстовым буферам соответствующих консолей `/dev/vcs*`, которые в отличии от `/dev/tty*` создаются только для уже имеющихся консолей.

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

- `/etc/udev/rules.d/96-fb-systemd.rules`

    # Register all framebuffer devices in systemd
    SUBSYSTEM=="graphics", TAG+="systemd", ENV{SYSTEMD_ALIAS}+="/sys/subsystem/graphics/%k"

и дополнить `systemd-vconsole-setup.service`, указав, что установка шрифтов должна ожидать первой инициализации фреймбуфера:

- `/etc/systemd/system/systemd-vconsole-setup.service.d/ordering.conf`

    [Unit]
    Requires=sys-subsystem-graphics-fb0.device
    After=sys-subsystem-graphics-fb0.device

Этот вариант несколько проще, но менее универсален:

- Он не будет работать в случаях повторной инициализации фреймбуфера, например, если при загрузке VESA-фреймбуфер сменяется на drm-фреймбуфер.
- Также он не сможет загрузить шрифт в дополнительные виртуальные консоли, если они появились до инициализации фреймбуфера.
- И наконец, он этот вариант заблокирует загрузку шрифта при отсутствии фреймбуфера.

Самый простой способ (пере)загрузки шрифта в консоли при инициализации фреймбуфера – прямой вызов утилиты systemd-vconsole-setup из правила UDEV:

- `/etc/udev/rules.d/96-fb-vconsole-setup.rules`

    # Setup vconsole for a new framebuffer device
    KERNEL=="fb*", ACTION=="add", IMPORT{file}="/etc/locale.conf", RUN+="/usr/lib/systemd/systemd-vconsole-setup"

В этом случае загрузка шрифта не блокируется при отсутствии фреймбуфера, и срабатывает автоматически даже при его повторной инициализации. Единственный недостаток – шрифт не будет загружен для дополнительных виртуальных консолей, если они инициализируются раньше фреймбуфера. Эту возможность учитывает и реализует только решение с шелл-скриптом (см. выше).

# Внешние ссылки

- Рендеринг шрифтов в X Window: как в ... и даже лучше
- Решение проблемы шрифта в консоли – archlinux.org.ru

Categories:

- Fonts (Русский)
- Graphics and desktop publishing (Русский)
- Eye candy (Русский)
- Русский

Hidden category:

- Pages with broken section links