Ошибка, часто встречающаяся на запуске startx/xinit

Автор: Yufei Yuan
Перевод: Андрей Киселев

Многие из нас сталкивались с такой неприятностью, когда после подачи команды startx на экране появлялось множество строк с сообщениями об ошибках. Эти сообщения дублируются в системном журнале, обычно это /var/log/XFree86.0.log. Если вы заглянете в этот файл, то увидите нечто подобное:

    
  Could not init font path element unix/:7100, removing from list!
   
  Fatal server error: 
  could not open default font 'fixed' 



Не буду скрывать -- столкнувшись с таким сообщением впервые, я запаниковал. Я только начинаю осваивать Linux и не очень комфортно чувствую себя в текстовой консоли. Поэтому мне пришлось потратить довольно много времени, занимаясь поисками решения проблемы в Интернете. Это просто поразительно -- как много народу сталкивалось с аналогичной проблемой, но, отвечая на форумах или в рассылках, они скорее выражали свое сочувствие, чем оказывали реальную помощь. Однако, если слегка пошевелить своими извилинами, можно сообразить, что данная ошибка как-то связана с сервером шрифтов (X font server, xfs).

Теперь, уже получив некоторый опыт, я понял, что "не так страшен черт, как его малюют". Ниже я расскажу, что можно предпринять, чтобы восстановить работоспособность X Window System.

Примечание: Я экспериментировал с дистрибутивом Red Hat, но полагаю, что описываемые здесь шаги вполне применимы и в других дистрибутивах.

(В большинстве дистрибутивов это так, но особняком стоит SuSE Linux. Судя по конфигурационному файлу "иксов" он не используют сервер шрифтов, в /etc/X11/XF86Config указываются пути к каталогам, где расположены шрифты. Так что в случае с SuSE Linux необходимо просто убедится, что шрифты на месте. Прим.ред.)

1. Проверьте -- запущен ли X font server.

Многие догадываются, что проблема связана с X font server-ом, но не догадываются проверить -- запущен ли он. Для того, чтобы выполнить такую проверку, просто запустите сценарий xfs из каталога /etc/init.d:


  [root@localhost /root]# /etc/init.d/xfs status 
  xfs (pid 1385) is running... 


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


  [root@localhost /root]# /etc/init.d/xfs start 
  Starting xfs:                                              [  OK  ] 


(Если сервис xfs не был запущен, то есть вероятность того, что он отключен. Чтобы исправить положение воспользуйтесь утилитой chkconfig:

  [root@p4 root]# chkconfig --list xfs
  xfs             0:off   1:off   2:off    3:off    4:off    5:off    6:off
  
Если сервис отключен (off), включите его, чтобы при следующей загрузке системы он запускался автоматически:
  [root@p4 root]# chkconfig xfs on
  
После этого проверьте его статус ещё раз:
  [root@p4 root]# chkconfig --list xfs
  xfs             0:off   1:off   2:on    3:on    4:on    5:on    6:off
  
-- Прим.ред. )

Если сообщение "[ OK ]" не появилось на экране -- проверьте еще раз статус xfs, как это описано выше. Если сервер шрифтов запустился, то попробуйте запустить X Window командой startx. Если X Window по-прежнему не желает стартовать, даже при запущенном сервере шрифтов, значит вы столкнулись с более серьезной проблемой. Давайте посмотрим -- что еще можно предпринять.

Важно: Странным образом мой корневой раздел оказался забит почти полностью двумя огромными (более 2 Гигабайт) файлами системного журнала. В результате сервер шрифтов "падал" из-за того, что не мог ничего записать в каталог /tmp. Решение в данном случае очень простое -- постарайтесь освободить достаточно места на разделе, удалив все ненужные файлы.


2. Проверьте -- доступен ли шрифт 'fixed'.

Теперь самое время проверить доступность шрифта 'fixed'. Для начала -- дайте команду fslsfonts, чтобы проверить -- находится ли шрифт 'fixed' в пути поиска:


  [root@localhost alex]# fslsfonts -server unix/:7100 -ll -fn fixed
  DIR  MIN  MAX EXIST DFLT ASC DESC NAME
  -->    0  255  some    0  11    2 fixed
  FONTNAME_REGISTRY    
  FOUNDRY    Misc
  FAMILY_NAME    Fixed
  WEIGHT_NAME    Medium
  SLANT    R
  SETWIDTH_NAME    SemiCondensed
  ADD_STYLE_NAME    
  PIXEL_SIZE    13
  POINT_SIZE    120
  RESOLUTION_X    75
  RESOLUTION_Y    75
  SPACING    C
  AVERAGE_WIDTH    60
  CHARSET_REGISTRY    ISO8859
  CHARSET_ENCODING    1
  COPYRIGHT    Public domain font.  Share and enjoy.
  CAP_HEIGHT    9
  X_HEIGHT    6
  FONT    -Misc-Fixed-Medium-R-SemiCondensed--13-120-75-75-C-60-ISO8859-1
  WEIGHT    10
  RESOLUTION    103
  QUAD_WIDTH    6



Это обычный вывод команды fslsfonts, если она найдет шрифт 'fixed'. Здесь вы можете заметить, что 'fixed' -- это фактически псевдоним для шрифта '-Misc-Fixed-Medium-R-SemiCondensed--13-120-75-75-C-60-ISO8859-1'. Если шрифт 'fixed' не был найден, вам следует проверить пути поиска шрифтов. Для этого воспользуйтесь командой chkfontpath, которая должна вывести нечто подобное:


  [root@localhost alex]# /usr/sbin/chkfontpath
  Current directories in font path:
  1: /usr/X11R6/lib/X11/fonts/misc:unscaled
  2: /usr/X11R6/lib/X11/fonts/75dpi:unscaled
  3: /usr/X11R6/lib/X11/fonts/100dpi:unscaled
  4: /usr/X11R6/lib/X11/fonts/misc
  5: /usr/X11R6/lib/X11/fonts/Type1
  6: /usr/X11R6/lib/X11/fonts/Speedo
  7: /usr/X11R6/lib/X11/fonts/CID
  8: /usr/X11R6/lib/X11/fonts/75dpi
  9: /usr/X11R6/lib/X11/fonts/100dpi
  10: /usr/share/fonts/default/Type1
  11: /usr/share/fonts/default/TrueType
  12: /usr/share/fonts/ja/TrueType
  13: /usr/X11R6/lib/X11/fonts/latin2/100dpi:unscaled
  14: /usr/X11R6/lib/X11/fonts/latin2/100dpi
  15: /usr/share/fonts/ISO8859-7/misc:unscaled
  16: /usr/share/fonts/ISO8859-7/75dpi:unscaled
  17: /usr/share/fonts/ISO8859-7/100dpi:unscaled
  18: /usr/share/fonts/ISO8859-7/misc
  19: /usr/share/fonts/ISO8859-7/Type1
  20: /usr/share/fonts/ISO8859-7/75dpi
  21: /usr/share/fonts/ISO8859-7/100dpi
  22: /usr/share/fonts/ISO8859-9/misc:unscaled
  23: /usr/share/fonts/ISO8859-9/100dpi:unscaled
  24: /usr/share/fonts/ISO8859-9/misc
  25: /usr/share/fonts/ISO8859-9/100dpi
  26: /usr/share/fonts/KOI8-R/100dpi:unscaled
  27: /usr/share/fonts/KOI8-R/100dpi
  28: /usr/share/fonts/zh_CN/TrueType
  29: /usr/share/fonts/zh_TW/TrueType
  30: /usr/share/AbiSuite/fonts



Так выглядит список каталогов со шрифтами на моей машине. В этих каталогах xfs пытается найти необходимые ему шрифты. В каждом из этих каталогов есть два очень важных файла: fonts.dir и fonts.alias. Давайте зайдем в каталог /usr/X11R6/lib/X11/fonts/100dpi и посмотрим на содержимое этих файлов:


  [fonts.dir]


  775
  UTI___14.pcf.gz -adobe-utopia-regular-i-normal--19-140-100-100-p-104-iso10646-1
  UTBI__14.pcf.gz -adobe-utopia-bold-i-normal--19-140-100-100-p-109-iso10646-1
  UTI___12.pcf.gz -adobe-utopia-regular-i-normal--17-120-100-100-p-89-iso10646-1
  UTI___24.pcf.gz -adobe-utopia-regular-i-normal--33-240-100-100-p-179-iso10646-1
  courO08.pcf.gz -adobe-courier-medium-o-normal--11-80-100-100-m-60-iso10646-1
  UTBI__12.pcf.gz -adobe-utopia-bold-i-normal--17-120-100-100-p-93-iso10646-1
  ...



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


  [fonts.alias]

  lucidasans-bolditalic-8 -b&h-lucida-bold-i-normal-sans-11-80-100-100-p-69-iso8859-1
  lucidasans-bolditalic-10 -b&h-lucida-bold-i-normal-sans-14-100-100-100-p-90-iso8859-1
  lucidasans-bolditalic-12 -b&h-lucida-bold-i-normal-sans-17-120-100-100-p-108-iso8859-1
  lucidasans-bolditalic-14 -b&h-lucida-bold-i-normal-sans-20-140-100-100-p-127-iso8859-1
  lucidasans-bolditalic-18 -b&h-lucida-bold-i-normal-sans-25-180-100-100-p-159-iso8859-1
  lucidasans-bolditalic-24 -b&h-lucida-bold-i-normal-sans-34-240-100-100-p-215-iso8859-1
  ...



Этот файл устанавливает соответствия между именами шрифтов и их псевдонимами. Отсюда становится ясно, что когда xfs ищет шрифт 'fixed', он просматривает файлы fonts.alias в каждом из каталогов пути поиска. Если шрифт был найден, то с помощью файла fonts.dir определяется имя файла шрифта. Если шрифт найти не удается, что случается крайне редко, то X-сервер не может запуститься. Поэтому необходимо перестроить списки шрифтов, что подразумевает под собой перегенерацию файлов fonts.dir.


3. Пересоздайте список шрифтов.

Списки шрифтов можно пересоздать с помощью сценария xfs, который находится в каталоге /etc/init.d. Ниже приводится выдержка из этого сценария:


...
buildfontlist() {
  pushd . &> /dev/null
    for d in $(/usr/sbin/chkfontpath --list | cut -f 2 -d ':') ;do
      if [ -d "$d" ]; then
        cd $d
        # Check if we need to rerun mkfontdir
        NEEDED=no
        if ! [ -e fonts.dir ]; then
          NEEDED=yes
        elif [ "$(find . -type f -cnewer fonts.dir 2>/dev/null)" != "" ];then
          NEEDED=yes
        fi
        if [ "$NEEDED" = "yes" ]; then
        ...
}
...
start() {
  if [ -L /usr/X11R6/bin/X ]; then
    echo -n $"Starting $prog: "
    [ -x /usr/sbin/chkfontpath ] && buildfontlist
    rm -fr /tmp/.font-unix
    daemon xfs -droppriv -daemon
    ret=$?
    [ $ret -eq 0 ] && touch /var/lock/subsys/xfs
    echo
    return $ret
  fi
}       
...



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

Для тех, кто не интересуется программированием, подскажу один хитрый ход. В процедуре buildfontlist() первую строку, которая содержит "NEEDED=no", можно заменить строкой "NEEDED=yes", это заставит xfs выполнять перегенерацию списка шрифтов каждый раз на запуске.

(Или просто удалите файлы fonts.dir и fonts.alias в тех каталогах, где это необходимо, если вам требуется перегенерировать их единоразово. -- Прим.ред.)

4. Шрифт действительно отсутствует?

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

Yufei -- студент последнего курса Альбертского Университета. Он пользуется GNU/Linux как для работы так и для забавы. Он занимается разработкой алгоритмов сжатия изображений и видео в GNU/Linux для своего научно-исследовательского проекта. В его RH9 box@home установлен Conexant HSF winmodem, который позволяет свободно путешествовать по Интернету и прослушивать Интернет-радиостанции.



Copyright (C) 2003, Yufei Yuan. Copying license http://www.linuxgazette.com/copying.html
Published in Issue 93 of Linux Gazette, August 2003

Вернуться на главную страницу