很多Linux用戶有如此一個慘痛經歷。當你和平常一樣登陸和輸入這可愛的startx時,你只是接收到錯誤信息。
Many of us gnu/linux users have had sUCh a terrible eXPerience. When you
很多linux用戶有如此一個慘痛經歷。當你
login and type the sweet startx as usual, you only receive scrolling lines
和平常一樣登陸和輸入這可愛的startx時,你只是接收到
of error messages. One copy of the error message is usually stored in
錯誤信息。錯誤通常存儲在
/var/log/XFree86.0.log. If you can Access the log file, you will notice
/var/log/XFree86.0.log。如果你讀取這個日志文件,你將會注意到
the last lines of the file may look like this:
文件的最後一行通常如這樣:
Could not init font path element unix/:7100, removing from list!
Fatal server error:
could not open default font 'fixed'
I have to admit that I was in panic when I saw this message in the first
我不得不承認我感到恐慌當我最初幾次看到這些信息。
several times. As an intermediate user of linux system, I was not so
作為一個中級的linux系統用戶,我感到用命令控制台撥號和用lynx沖浪不
comfortable using text console for modem dialup and surfing with lynx. So
舒服沖浪。所以
I had to spend a lot of time on another box and use Google to search for
我不得不花費很多時間在另一台電腦的使用Google在網上搜索幫助。
help on web. It was amazing that so many people like me have this exact
另人感到意外的是如此多人像我一樣擁有如此
terrible experience and those replies in web forums and mailing lists
恐怖的經歷和那些網上論壇和郵件列表的答復
generally offer more sympathy than real help. Using our common sense and
一般提供更多的同情心而不是真正的幫助。用我們一般的理解和
some research, most of us can figure out this failure has something to do
研究,我們大部分可以判斷這是X字體服務的失敗。
with X font server.
After having done a little more research, now I believe that this failure
做完進一步的研究之後,我現在相信這
may not be so serious as it looks. Please follow me by doing the steps
不像人們想象中的那麼嚴重。請跟著我做下面的這些步驟,
below, in most of the cases you will get your X windows starting up again.
在大部分的案例中你將可以重新進入X windows。
Note: The following examples run on my Red Hat box. But I believe they are
注意:這些例子在我的Red Hat系統上。但我相信他們
general enough to be used for other distributions.
通常足夠應用在其它發行版上。
1. Check if the X font server is running.
1、檢查X字體服務是否正在運行。
Some people like me tend to suspect it is caused by bugs in the X font
一些人像我一樣趨向於懷疑這是由X字體服務的bugs引起的,
server, but it turned out that X font server is quite robust. We can run
但它證明這X字體服務是良好的。我們可以運行
the xfs script under /etc/init.d to see if the font server is running.
這xfs格本文件夾在/etc/init.d去看是否字體服務正在運行。
[root@localhost /root]# /etc/init.d/xfs status
xfs (pid 1385) is running...
In some cases, the only reason for the failure is that the font server is
在一些案例,唯一失敗的原因是字體服務停止
dead. So, you need to restart font server like this:
所以,你需要重新啟動字體服務象這樣:
[root@localhost /root]# /etc/init.d/xfs start
Starting xfs: [ OK ]
Well, my learned lesson is don't take this '[OK]' for granted. You have to
好,我的學習課程不承認OK是真的。你必須
check the status again to see if it is running. If it does run, you can
再次檢查狀況去看看是否正在運行。如果它不運行,你可以嘗試
try startx to see if you can start X windows. If you still cannot start X
startx去看看是否可以開始X windows。當字體服務運行時,如果你仍然不可以運行X
server when the font server runs, it means you are having more serious
服務,它意味著你擁有更嚴重的錯誤。
trouble. You need to waste a little more time reading on the following
你需要花費更多的一點時間閱讀以下的步驟。
steps.
Note: In a weird case, my root partition was fully filled by two huge log
注意:在一個古怪的案例,我的根目錄是被兩個大於2GB的信息文件所占據滿的。
files occupying more than 2 GB. The font server dies when it cannot write
當它不可能寫進/tmp字體服務停止。
to /tmp. So the simple solution was finding the huge files and deleting
因此一些例子的解決辦法是尋找巨大文件的刪除掉他們。
them.
2. Check if the font 'fixed' is accessible.
檢查是否字體“fixed”可以理解的。
Now it is time to ensure that the font 'fixed' is accessible. First, we
現在是時侯確保字體“fixed”是受影響的。首先
can use command fslsfonts to see if font 'fixed' exists in the search
我們可以運行命令fslsfonts去看是否字體存在在所尋找的路徑:
path:
[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
This is the normal output when 'fixed' is available. Here, we can see that
當“fixed”是可用的,這是通常輸出的情況,我們可以看到
'fixed' is actually an alias for the font
“fixed”實際上是字體的別名。
'-Misc-Fixed-Medium-R-SemiCondensed--13-120-75-75-C-60-ISO8859-1'. If
there is no font 'fixed', we first need to gain knowledge of the search
如果不是字體“fixed”,我們首先需要獲得更多的信息在字體的所在路徑。
path for fonts. We can use command chkfontpath to look at those paths:
我們可以運用命令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
These are the font paths on my box. It shows that xfs looks into these
這些字體路徑在我的電腦上。它顯示當它被修復的時候xfs觀察這些路徑尋找一個特殊的字體。
paths seeking a specific font when it is required. There are two types of
有兩種類型的重要文件:
important files: fonts.dir in each of these paths, and fonts.alias in some
fonts.dir在每一個路徑中,和fonts.alias在一些路徑中。
of the paths. For example, let's go to /usr/X11R6/lib/X11/fonts/100dpi,
例如,讓我們進入/usr/X11R6/lib/X11/fonts/100dpi,
and open the files. The files look like this:
和打開文件。文件象這樣:
[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
...
The first line specifies the number of fonts under current directory.
這第一行詳細說明字體的數量在當前目錄。
Following lines map file names to font names.
以下幾行是字體文件的名字。
[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
...
This file maps font alias to font names. So it is clear that once font
這個文件顯示字體文件的別名與原名。因此清楚知道從前字體的“fixed”是需要的,
'fixed' is needed, the font server search fonts.alias in each font path
字體服務在比賽中尋找字體別名在每一字體路徑中。
for a match. If the match exists, the corresponding font file is specified
如果比賽是存在,那相應的字體文件是指定在fonts.dir。
in fonts.dir. If no match exists, which is a rare situation, the X server
如果比賽不存在,那是非常罕見的情形,字體服務不可以運行我們需要重建字體列表。
cannot start and we need to rebuild the font lists. The rebuilding process
這重建的過程
will generate new fonts.dir and fonts.alias files.
將會產生新的fonts.dir和fonts.alias文件。
3. Rebuild font list.
重建字體列表。
Font list can be rebuilt using the script file xfs under /etc/init.d.
運用格本文件xfs在/etc/init.d下,字體列表可以被重建
Following is an excerpt of the script:
以下是格本文件的摘錄:
...
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
}
...
For readers not familiar with shell programming, this excerpt means that
因為讀者不熟悉運行命令程序,這格本文件的意思是每次xfs格本在運行,
each time xfs script is run, it will check whether there is a fonts.dir
它將會檢查是否有fonts.dir在列表中的每一個字本路徑中。
file in each listed font path. If fonts.dir is missing in a path, font
當fonts.dir在路徑中消失,字體列表需要重建。
list needs to be rebuilt. If a fonts.dir does exist for each path, it will
如果fonts.dir不存在於每一路徑中,它將會
check if the status of any file in the font directory is changed after the
檢查是否所有文件在字體目錄是被改變在fonts.dir最後一次改變。
last change of fonts.dir. If this is true, the font list also needs to be
如果這是真實的,字體列表也需要被重建。
rebuilt.
For newbies not interested in learning shell programming, we play a small
作為網絡新手是對學習命令不感興趣的,我們玩一個小竅門在子程序buildfontlist()。
trick in the subroutine buildfontlist(). We can set "NEEDED=yes" in the
我們可以設置"NEEDED=yes" 在第一情況下強制重建字體列表。
first instance to force the rebuilding of font list.
4. Fonts really missing?
字體確實不見了?
If all steps above fail. My last suggestion is to check if the font file
如果以上所有的步驟都失敗了。我的最後一個意見書是檢查是否字體文件
is really removed by some processes. Then you need to reinstall the font.
真正地被一些程序刪去。然後你們需要重新設置字體.'
我們可以設置"NEEDED=yes" 在第一情況下強制重建字體列表。
first instance to force the rebuilding of font list.
4. Fonts really missing?
字體確實不見了?
If all steps above fail. My last suggestion is to check if the font file
如果以上所有的步驟都失敗了。我的最後一個意見書是檢查是否字體文件
is really removed by some processes. Then you need to reinstall the font.
真正地被一些程序刪去。然後你們需要重新設置字體.'
list needs to be rebuilt. If a fonts.dir does exist for each path, it will
如果fonts.dir不存在於每一路徑中,它將會
check if the status of any file in the font directory is changed after the
檢查是否所有文件在字體目錄是被改變在fonts.dir最後一次改變。
last change of fonts.dir. If this is true, the font list also needs to be
如果這是真實的,字體列表也需要被重建。
rebuilt.
For newbies not interested in learning shell programming, we play a small
作為網絡新手是對學習命令不感興趣的,我們玩一個小竅門在子程序buildfontlist()。
trick in the subroutine buildfontlist(). We can set "NEEDED=yes" in the
我們可以設置"NEEDED=yes" 在第一情況下強制重建字體列表。
first instance to force the rebuilding of font list.
4. Fonts really missing?
字體確實不見了?
If all steps above fail. My last suggestion is to check if the font file
如果以上所有的步驟都失敗了。我的最後一個意見書是檢查是否字體文件
is really removed by some processes. Then you need to reinstall the font.
真正地被一些程序刪去。然後你們需要重新設置字體.'