以Funtoo为基础的Linux桌面系统(4)

编译X服务器只需要这个命令

$ emerge xorg-x11

X服务器编译需要很久的时间,至少在我的老旧的Thinkpad X61上需要至少4小时。这个时候你可以选择傻傻得盯着屏幕上那些不知所云的但是疯狂滚动的字母发呆(第一次跟Gentoo亲密接触的时候我这么做过),或者找本看了半年也没看完的书消耗一下时间吧(我曾用这些时间终于读完了那本可以从二楼扔下来可以砸死人的Computer Graphics)。

「实践是检验真理的唯一标准」

X服务器编译好以后,需要测试一下。这个测试应该使用非常简单的配置才可以保证不会引入其他X服务器以外的问题。最好的选择就是twm,因为它一直以来就是标准的窗口管理器。安装xinit包可以同时安装xinit程序和twm窗口管理器。

$ USE="-minimal" emerge -1 xinit

安装结束后,运行命令

$ startx

如果一切顺利,你会看到一个非常简单朴素的钟表GUI和一个xterm窗口。Happy hacking!

X曾经是历史上最复杂的软件之一。它提供给应用程序开发的中间库Xlib也曾是让人叹为观止的最复杂API,因为人们给这个库写的说明性文档居然长达3卷,大概每卷一千多页!开源X服务器的开发历史又曲折又传奇,写出来的话精彩程度一定不输给一本武侠小说。这里我先借用几位大师的图片来展示一下X的大致结构。

X服务器和客户端的结构

这幅图来自这里。这幅图的原作者用它来展示如何在X中进行OpenGL等DRI操作。但是,这张图也同时说明了其他X应用的构成——几乎所有的X应用程序都必须通过Xlib与X服务器进行交互。X服务器会处理图形描绘请求并将处理的结果返回给客户端。窗口管理器就是最典型的X客户端。但是,对于X来说,所有的图形表示请求仅仅就是大大小小的矩形,它根本不知道这个矩形是一个刚刚输入的文字还是一个窗口。所以,要在这样的基础上构建一个现代的桌面系统,我们还需要在系统中安装很多软件,包括窗口管理器,桌面管理panel,系统监视dock,还有Widget框架(Qt或者gtk等)和X应用程序。这仅仅是万里长征走完了第一步。

打开GUI之后,试试键盘和鼠标/Trackpoint这些输入设备,看看它们有没有正常工作。也许你会发现很多问题。比如,键盘的布局并不是你想要的(默认的键盘布局是美国英语键盘),或者鼠标不能支持滚动操作。这些都可以通过配置X服务器解决。

# 键盘的配置:
# file:/etc/X11/xorg.conf.d/10-keyboard.conf 
Section "InputClass"
	Identifier	"Keyboard Defaults"
	MatchIsKeyboard	"yes"
	Option		"XkbLayout" "jp"
	Option		"XkbModel" "jp106"
	Option		"XkbOptions" "ctrl:nocaps"
EndSection

例子中,键盘布局是日语,键盘的特定模型是jp106键盘(最常见的日语键盘),并且在X中将CapsLock键作为Ctrl键使用。最常用的XkbOptions可以在这个文件/usr/share/X11/xkb/rules/xorg.lst中找到。

# 全宇宙无敌的trackpoint配置:
# file: /etc/X11/xorg.conf.d/20-trackpoint.conf 
Section "InputClass"
	Identifier	"Trackpoint Wheel Emulation"
	MatchProduct	"TPPS/2 IBM TrackPoint|DualPoint Stick|Synaptics Inc. Composite TouchPad / TrackPoint|ThinkPad USB Keyboard with TrackPoint|USB Trackpoint pointing device"
	MatchDevicePath	"/dev/input/event*"
	Option		"EmulateWheel"		"true"
	Option		"EmulateWheelButton"	"2"
	Option		"Emulate3Buttons"	"false"
	Option		"XAxisMapping"		"6 7"
	Option		"YAxisMapping"		"4 5"
EndSection

这个例子献给所有发现自己不能在firefox中使用trackpoint滚动屏幕的Thinkpad用户。

每次我安装完X才会运行全系统升级(因为即使最新版的Stage3也无法保证使用到最新的软件)。给你的电脑找一个安静的角落,保证足够的电源,并且运行下面的命令。然后最好睡一觉:)这样升级在我的Thinkpad上需要整整一夜!

$ emerge --update --newuse --deep --keep-going world

参考文献:

以Funtoo为基础的Linux桌面系统(3)

「見上げた坂の上にたなびく一筋の雲を見て、手が届くと信じてひたすら登っていく」
                                 司馬遼太郎

我向一位朋友介绍了Funtoo Linux。但是当他开始尝试Funtoo的时候,回给我的消息却充满了受挫感。很多用户,会在X系统安装配置这个地方卡壳。一个黑乎乎的屏幕让跟随GUI的发展一起长大的用户有点束手无策。当你面临如此“窘境”的时候,你会提出一大堆问题。比如,究竟如何通过命令行访问互联网。毕竟有了互联网,你就会可以google一切了。答案就是,

USE='-X' emerge elinks

elinks是一款非常优秀的浏览器,使用它来访问文档类型的网站甚至比GUI基础的浏览器有更好的体验。当你的X还不能启动的时候,可使用它来帮助你配置图形系统。Linux启动之后会提供给用户7个tty终端,用户可以使用Ctrl + Alt + 数字1-7在它们之间切换。你可以在tty1打开elinks查找资料,而同时在tty2使用bash操作计算机。

是否能够成功的安装X系统这个命题几乎是考察Linux操作系统管理能力的一道很好的考题。首先,这个过程迫使你必须弄清楚从应该程序(窗口管理模拟终端)到中间服务(驱动程序和图形库)再到系统内核之间的交互到底是如何进行的。第二,在没有图形界面的情况下使用编辑器(nano或者vim)来编辑X系统配置文件也是一个考验。第三,如何检查安装的正确与否同样是一道关卡,而这一关会为用户打开另一扇门——就是得到一个难得机会来一窥桌面系统基础组件的构成。

Funtoo网站的Wiki中提到安装X系统的起点是编辑/etc/make.confVIDEO_CARDS变量。图形用户配置的复杂性正是由于同Windows一起制造封闭软件的那些硬件厂商和软件厂商送给Linux用户的“礼物”。Funtoo沿用了Gentoo的方法用VIDEO_CARDS变量来区别不同的显卡,收下这份大礼。这样,在编译与图形,视频还包括一些声音软件的时候emerge系统才能正确的配置或者优化编译结果。比如,在编译xorg-drivers这个软件包的时候,系统会提示它使用了哪个VIDEO_CARDS变量。同样,INPUT_DEVICES也是为了相似的目的,用以区分不同的输入设备。这是一个关于这两个变量的例子。

/* file: /etc/make.conf */
...
INPUT_DEVICES="evdev keyboard mouse"
VIDEO_CARDS="nvidia"
...

需要注意的是,在使用VMWare等虚拟机安装Funtoo的时候,VIDEO_CARDS变量不一定就是你的硬件上的显卡芯片品牌。如何确定你使用的究竟是哪一款VIDEO_CARDS

$ emerge sys-apps/pciutils
$ /usr/sbin/lspci | grep -i "vga"
01:00.0 VGA compatible controller: NVIDIA Corporation GF108 [Quadro 600] (rev a1)

特别要提出注意的是,Funtoo系统提供两个截然不同的驱动程序——一个是开源驱动,另一个是Nvidia官方驱动——给Nvidia显卡用户选择,所以在安装nvidia-drivers这个包的时候必须注意避开开源驱动和NVIDA官方驱动的冲突。如果你使用的是sys-kernel/sysrescue-std-sources,并且使用了USE="binary"来编译这份内核代码,那么你得到的内核模块中就已经包含开源驱动了。如果需要安装官方驱动,那么必须屏蔽掉开源驱动,以避免冲突。其方法就是在modprobe的配置程序中将nouveau模块加入黑名单。这样,系统在启动的时候就不会加载开源驱动了。

blacklist nouveau

NVIDIA为了保护自己的知识产权,它们采用了一种相当特别的驱动程序结构来避开GPL协议的限制。NVIDA官方驱动实际上有两大部分组成,一部分在内核之中以内核模块的形式存在(nvidia)提供操作显卡的接口,而另一部分在用户空间提供了怎样操作显卡的策略。驱动程序包nvidia-drivers包含了这两个部分。

emerge nvidia-drivers

这份驱动提供安装结束后,你会得到信的openGL和openCL接口。虽然安装程序会自动帮你切换到使用这些新的接口,但是确认一下这两个接口也是很有趣的。

$ eselect opengl list
Available OpenGL implementations:
  [1]   nvidia *
  [2]   xorg-x11
$ eselect opencl list
Available OpenCL implementations:
  [1]   nvidia *

虽然,利用emerge可以得到版本非常新的nvidia驱动。但是官方建议目前最新版本是295.20。所以,你可以在/etc/portage/package.mask之中加入mask来限制更快更新的升级以保持系统的稳定性。

$ su -c 'echo ">media-video/nvidia-settings-295.20" >> /etc/portage/package.mask'

因为显卡又是系统图形和视频处理的关键部件,为了然其他软件更好得通过应用程序于显卡打交道,你还需要在/etc/make.conf文件中把其他一些编译选项设置成有效。比如,对于nvidia显卡,在/etc/make.conf之中加入vdpau选项可以将视频解码时的CPU workload降低40%左右(依据编码的情况有变化)。可以通过这个命令查找到每个USE变量的具体内容。

grep -R vdpau /usr/portage/profiles/use.*

参考文档:

以Funtoo为基础的Linux桌面系统(2)

构建自己的Linux桌面系统的第一步,就是根据Funtoo网站上提供的wiki页面,编译,安装和配置基础系统(base system)。这包括

如果你对类Unix系统的基本概念非常了解,这个过程看上去应该是水到渠成的。安装的细节虽然无需多言,Funtoo提供的指南已经十分详尽,但这里却有一些非常有趣的概念值得讨论。

第一,这个安装过程的全部魔法都在chroot命令上。我一直以为这个命令是类Unix操作系统设计的精华之一。为什么这么说呢?众所周知,Linux操作系统对它的跟文件系统有一个必要的假设。即,根文件系统是一棵树。而这个树的根就是“/”。像硬盘,SSD之类的块设备可以通过“挂载”(mount)的方式,将实体的存储设备挂载到这棵逻辑中存在的树的任意节点上。当系统在这棵树上创建新文件或者修改任何既有内容时,这种变更就会被反映到实际的存储设备上。树结构的妙处在于,任意一棵子树和拥有该子树的“大树”总是相似的。当你将准备好的硬盘分区挂载到这棵树上,并且chroot进入这个树的子树,你就的到了一个全新的“根文件系统”。但于此同时,系统运行的却是原来大树中预装的Linux内核,由此来帮助新文件系统的生成。这种方法在Windows系统中听起来有点像天方夜谭但是在Linux系统中,却是司空见惯。采用这种方法可也在多个不同的根文件系统之间无缝的切换,比如,你可以在一个64位系统的根文件系统的某一棵子树上创建一个32位系统子树。这对于很多系统测试和环境搭建都不无裨益。一个典型的例子就是debian系统采用chroot的方式帮助开发者创建一个便于创建软件包的标准环境,由此,.deb包才可以避免现有系统不同配置的影响而适用与各种不同配置的系统。

第二,这个安装过程实际上那个暗示了如何从无到有得建造一个操作系统。Linux操作系统的发端就是1990年Linux写给邮件列表的那封信。在已有系统软件——包括编译器,链接器的帮助下,生产内核代码才是可能的。用软件来制造软件。这是一个非常自然的过程。我记得有一句话叫“以机器制造机器标志这第二次工业革命的开始”。而以软件制造软件也是现在软件行业的一个重要标志。也只有当这种衍生和扩展的能力和半导体的几何级数式的蓬勃发展结合起来的时候,这种能力才创造了极大的社会财富。

第三,一些配置和编译的选择也值得讨论一下。

首当其冲的就是UEFI和GPT分区。区别与传统的BIOS和MBR分区,这两个技术都有一些进步。GPT几乎是必要的(desirable)。但是,如果你的系统主板是建立在UEFI之上的话,Linux系统可能会遇到一些问题。这并不是Linux的错,而是因为大多说UEFI固件都缺乏必要的测试问题百出,以至于根本无法保证系统兼容性。对于后面这一点我实在没有什么好的建议,大概能说的只有一条,选择UEFI主板的时候一定要先调查一下再做决定。

创建分区和创建文件系统的分离是让那些在Windows中模糊成一团的操作系统概念变得更加清晰了。对文件系统的选择又是另一个问题。一般来说根据用户的实际应用应该选择不同的文件系统,比如,一些文件在处理“小文件”的时候有明显优势,一些文件系统有灵活配置的特性等等。当然,ext4文件系统适用于大多数桌面应用。虽然这个指南中仅仅提供了传统的采用/dev/sd*方式记述的/etc/fstab,但实际上Funtoo也支持UUID作为标记/etc/fstab中使用。

对很多中文用户来说,键盘布局不是问题。因为,大多数在中国销售的计算机实际上是直接使用英语键盘布局的,所以/etc/conf.d/keymaps中采用默认值没有什么问题。我的情况比较特殊,因为日语键盘布局与英文键盘布局存在相当大的差异。我必须在上面提到的文件中制定键盘布局为jp106。如果你想在运行时改变系统的键盘布局,可以使用下面的命令。

setxkbmap xx   ## xx 是两个字母的国家代码,比如us

当编译安装好的内核和基础系统可以启动以后,我尝试继续跟随Funtoo的指南对基础系统升级并且安装了X Server和必要的系统软件。这样,一个极简洁的Linux操作系统诞生了。