Многие из нас сталкивались с такой неприятностью, когда после подачи команды 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, который позволяет свободно путешествовать по Интернету и прослушивать Интернет-радиостанции.