这本来不是一个什么困难的问题,并且在FreeBSD HandBook Chapter 5上已经有详细的解释了,但是总有人搞不清楚,网上还有很多误人子弟的文章胡乱地解释,我也不能总是回答同样的问题,于是我把这个问题详细地写清楚,这个wiki页面不是为了替代FreeBSD HandBook Chapter 5,只是为了明确一些概念,帮助新手理清头绪迅速配置好桌面环境。
严格的说X是一个标准,也就Unix系统上图形界面的基本模式,顺便说一句,最早实现图形界面的是在Unix上,不是在Windows上。这个标准指定了一个Server/Client的基本模型来实现图形界面功能,具体的细节不需要太过深入。通常情况下,谈到X时就是指的图形界面。X的设计体现了Unix的哲学,也就是模块化,各个模块之间遵守相同的标准,所以运行X需要很多组件,包括x-server、s-client、window manager、x display manager,下面我们分别介绍每一个组件的具体含义。
在一般的server/client模型中,server总是代表性能比较高,处理很多数据的那个机器,比如你登录一个ftp站点或者是某个网站的时候,server指的是对方的系统。但是在X的server/client模型中恰好相反,这里面server仅仅负责鼠标、键盘、显卡、显示器这些输入输出部件,而x-client却是负责处理数据的。到目前为止,我们在FreeBSD系统里面使用x-server是:xorg-server。除此之外还有其他的商业的x-server,但是目前在FreeBSD上以及Linux这些自由的开源系统上使用的x-server主要是由xorg提供的xorg-server。所以,如果你想在自己的FreeBSD运行X,那么x-server是必须的。这就是为什么在安装图形界面的时候一定要先安装xorg或者是xorg-minimal,这两个port都是meta port,就是说这个port本身是一个空的port,但是这个port有很多依赖关系,这样可以帮助使用者迅速地安装软件。
由于x-server负责鼠标、键盘、显卡、显示器这些输入输出部件,你必须在安装好以后,告诉x-server你当前系统使用的是什么样的鼠标、键盘、显卡、显示器。由于当前硬件厂商众多,所以不要指望x-server自动识别出所有需要的参数,通常你需要编辑一下/etc/X11/xorg.conf这个文件来提示它一下。现在你应该知道为什么论坛上总有人在买了USB鼠标以后相互讨论如何修改xorg.conf了。
X-server负责管理鼠标、键盘、显卡、显示器,而X-client则负责处理程序的运行。比如说,我桌面上有一个gvim的图标,我现在移动鼠标点击了一下gvim的图标,那么X-server会告诉X-client:“用户移动了鼠标到什么位置,然后单击了一下鼠标的左键”。X-client收到这个信息以后会对这个行为做出反应,经过一番思考,它发现,我这个行为是要打开一个叫gvim的程序,于是X-client会运行gvim,然后告诉X-server:“你在显示器上给用户画出一个像gvim的东西来”。然后,我就在我的屏幕上很高兴地看见了我可爱的gvim编辑器了,当然还有伟大的DejaVu Sans Mono等宽字体。
你通常会运行几个程序,比如我现在在运行gvim、epiphany、gnome-terminal,这些程序在屏幕上都放在什么位置呢?这些程序在屏幕上看起来是什么样子的呢?窗口上需要有最大化、最小化图标吗?这些都是由窗口管理器(Window Manager)来负责的。
窗口管理器有很多种,比如fvwm(定制能力很强)、metacity(gnome项目提供的,目前gnome desktop environment所使用的)。
这个概念最好理解了,简单的说就是你需要运行的图形界面的程序,比如gvim编辑器、epiphany网页浏览器,eog图片浏览器。
XDM的全称是X Display Manager,这个程序允许你以图形界面的方式来登录系统。常见的XDM有xdm(很土很难看)、gdm(由gnome项目提供)、kdm(由kde项目提供)。对于运行X来说,这个组件不是必须的,也就是说:
显然,前者比较方便。
如果上面的概念都理解了,那么理解桌面环境就很容易了。简单的说桌面环境是一个程序的集合,这个集合里面包括窗口管理器,X登录管理器,以及一下图形界面的应用程序,但是它不包括x-server。
举个例子:gnome是一个桌面环境,在这个桌面环境中包含了:一个窗口管理器 (metacity)、一个X登录管理器(gdm)以及其他的图形界面程序,比如epiphany网页浏览器、gnome-terminal、eog,等等。
操作系统:
显卡:
显示器:
显示器的水平以及垂直刷新频率可以在你所购买的显示器的生产厂家的官方网站上查到,每个显示器是不一样的,对于某些没有“超出控制”功能的老显示器,设置错误可能导致显示器烧毁!
鼠标键盘:
上文已经说明了xorg-server的作用,对于运行X来说,这个是必须的。
# cd /usr/ports/x11/xorg-minimal/ # make config-recursive # make fetch-recursive # make install clean
到目前为止,对于amd64构架的FreeBSD来说,还没有NVIDIA提供的驱动程序,所以只能使用由Xorg提供的nv开源驱动。
# /usr/ports/x11-drivers/xorg-drivers # make config # make install clean
当运行完make config命令以后,会出现对话框,这时要选择nv,你也可以直接到nv这个驱动的port目录下面去运行make install clean命令,如果你是其他的显卡,那么你应该根据自己的具体情况选择相应的驱动程序。
你可以通过编辑gnome2-lite的Makefile来定制安装的组件,比如我不喜欢totem播放器,我就删掉了Makefile中的这个依赖关系,关于Makefile的语法规则请参考FreeBSD Porter's Handbook。
# cd /usr/ports/x11/gnome2-lite/ # make config-recursive # make fetch-recursive # make install clean
我比较喜欢直接用图形界面登录系统,至少这样关机比较方便。
# cd /usr/ports/x11/gdm/ # make fetch-recursive # make config # make install clean
配置xorg-server就是创建并编辑xorg.conf这个文件,其详细语法可以man xorg.conf。对于7.0版本之前的Xorg来说运行x-server必须要有/etc/X11/xorg.conf;但是对新版本的Xorg来说,如果在/etc/X11/目录下面没有找到xorg.conf也可以运行;但是如果在/etc/X11/下面找到一个xorg.conf,并且这个配置文件里面包含错误的话,那么将无法运行x-server。
安装xorg以后,运行下述命令,将会在/root目录下生成一个xorg.conf.new文件,这个文件中包含了xorg对系统的检测结果,但是这个检测结果不一定完整的,因为硬件厂商实在是太多了,所以你可能需要提示它一些东西,比如你显示器的水平以及垂直刷新频率,最佳分辨率,通常情况下它都需要你提示一下,也就是需要你编辑一下xorg.conf。
# Xorg -configure
运行下述命令或者直接复制/root/xorg.conf.new到/etc/X11/xorg.conf然后运行startx命令。如果测试成功的话,那么你很幸运,因为Xorg自己识别出了你的硬件并配置了合适的参数,但是这些参数不一定是绝对正确的,所以你可能还需要编辑一下/etc/X11/xorg.conf这个文件;如果测试不成功,那么可能由于某些原因导致Xorg没有识别出你的硬件或者是没有配置合适的参数,这时你解决问题的方法就是手工编辑/etc/X11/xorg.conf。总结一下,不管测试是不是成功,你都应该去手工编辑一下/etc/X11/xorg.conf,不要指望Xorg能自己搞定一切,因为硬件厂商实在是太多了。
# Xorg -config xorg.conf.new
注意:
编辑的目的在于准确地描述自己系统的硬件信息,上面已经说过了,Xorg不一定能自己搞定一切,我在这里只介绍重要的内容,也就是显卡驱动问题、显示器刷新频率问题以及显示器分辨率问题。
1.显卡驱动问题:
Section "Device"
### Available Driver options are:-
### Values: <i>: integer, <f>: float, <bool>: "True"/"False",
### <string>: "String", <freq>: "<f> Hz/kHz/MHz"
### [arg]: arg optional
#Option "SWcursor" # [<bool>]
#Option "HWcursor" # [<bool>]
#Option "NoAccel" # [<bool>]
#Option "ShadowFB" # [<bool>]
#Option "UseFBDev" # [<bool>]
#Option "Rotate" # [<str>]
#Option "VideoKey" # <i>
#Option "FlatPanel" # [<bool>]
#Option "FPDither" # [<bool>]
#Option "CrtcNumber" # <i>
#Option "FPScale" # [<bool>]
#Option "FPTweak" # <i>
#Option "DualHead" # [<bool>]
Identifier "Card0"
Driver "nv"
VendorName "nVidia Corporation"
BoardName "GeForce 9500 GT"
BusID "PCI:1:0:0"
EndSection
上面的Driver “nv”这一行的意思是我指定系统使用开源的nv驱动作为我显卡的驱动程序,也就是说这个部份解决你的显卡驱动问题,如果你是其他类型的显卡你就需要安装其他的驱动程序并修改xorg.conf中Driver这个变量的相应内容。
2.显示器刷新频率问题:
Section "Monitor" Identifier "Monitor0" VendorName "Monitor Vendor" ModelName "Monitor Model" HorizSync 30-83 VertRefresh 56-76 Option "DPMS" EndSection
上面的HorizSync 30-83和VertRefresh 56-76这两行用于指定显示器的水平以及垂直刷新频率,配置好这两个参数以后显示器的刷新频率才会正常。
再次提醒:
显示器的水平以及垂直刷新频率可以在你所购买的显示器的生产厂家的官方网站上查到,每个显示器是不一样的,对于某些没有“超出控制”功能的老显示器,设置错误可能导致显示器烧毁!
3.显示器分辨率问题:
Section "Screen" Identifier "Screen0" Device "Card0" Monitor "Monitor0" DefaultDepth 24 SubSection "Display" Viewport 0 0 Depth 24 Modes "1440x900" EndSubSection EndSection
这一部分指定你所使用的分辨率。X系统分辨率是在xorg.conf中指定的,GNOME或者是KDE会读取这个数据,如果你需要修改你系统分辨率,那么你应该编辑xorg.conf文件中的相关内容,而不是点击你的桌面环境中某个菜单上的某个图标。
到此为止你的X-Server已经知道该如何的使用你的显卡和显示器了。
FreeBSD的默认安装配置中是不挂载虚拟文件系统proc的,并且FreeBSD基本系统的程序也并不倚赖这个虚拟文件系统,但是由于X的各个组件并不是单独为FreeBSD开发设计的,所有某些组件还要倚赖这个虚拟文件系统。如果不挂载这个虚拟文件系统,那么你在gdm和gnome里面没有办法直接关机,因为恰好是负责用户权限的那个程序依赖于proc文件系统,所以你必须挂载虚拟文件系统,挂载方法如下:
options PROCFS options PSEUDOFS
如果是你使用系统自带的内核的话,那么这两行已经包含在配置文件中了;如果你自己编译了内核,那么一定要添加这两行到你的配置文件中去,然后重新编译安装内核。
proc /proc procfs rw 0 0
添加下述内容到/etc/rc.conf中,告诉系统开机运行gnome的服务,其中包括gdm,按照FreeBSD GNOME中FAQ的介绍添加gnome_enable=“YES”即可,但是开机时系统提示我dbus没有设置好,这也许是FreeBSD的rc系统的某个bug,早些时候我在官方论坛讨论过这个问题,但是一直没有下文,从7.1到7.2一直都是这样。
dbus_enable="YES" gnome_enable="YES"
到此为止,xorg知道了自己要使用显卡和显示器参数,系统也知道了开机以后需要运行gdm了,可以说已经完成了X的配置工作,下面补充一个FreeBSD系统GNOME桌面环境下fcitx输入法的安装与配置方法。
本来是写X的,但是fcitx和X还是有点关系的,使用startx和使用gdm登录的fcitx的配置方法是不一样的,这里对使用gdm的配置方法做一下说明。
# cd /usr/ports/chinese/fcitx/ # make install clean
配置环境变量的方法并不唯一,在这里通过profile来实现,把下述内容下如.profile,
LC_CTYPE=zh_CN.UTF-8; export LC_CTYPE XMODIFIERS=@im=fcitx; export XMODIFIERS fcitx&
前面两行是配置fcitx运行时需要的环境变量,最后一行是告诉系统开机自动运行fcitx。按照上述配置完以后,fcitx会在进入gnome桌面环境以后自动运行,激活的命令是Ctrl+Space,如果你觉得fcitx默认的外观比较难看的话,你可以修改你home下面的.fcitx/config中的参数文件来调整fcitx的外观。
配置fcitx的关键是环境变量,使用gdm和使用startx对环境变量的处理是不一样的。使用其他的XDM时,主要注意的问题也是环境变量,就是说你所使用的XDM如何处理对待环境变量。在上面的配置中我使用UFT-8编码方案,其具体含义可参考locale环境变量的资料,此处不做详细介绍。
这个wiki页面并不是为了代替或者取代官方文档,它只是对官方文档的一个补充,如果内容上和官方文档有冲突,以官方文档为准。并且这个wiki页面中介绍的X是比较简单的情况,也就是X-Server和X-Client都运行在同一台电脑上,事实上可以分别在不同的机器上运行X-Server和X-Client,详细情况请参考相关资料。
最后,希望能对大家有所帮助,欢迎补充。
关于FreeBSD下和GNOME有关的问题都可以在这个FAQ上找到,比如有人反映自己的GNOME启动比较慢,那么就应该参考FAQ的问题20.