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

配置Openbox。

“less is more.”

Openbox有一个非常易用而且简洁的配置界面——文本文档。为了保证openbox按照用户的意愿正常工作,至少需要以下三个文件。

所有这些文件都必须放在~/.config/openbox目录中。以上链接都是经过实验之后的最终配置。其中一些与声音相关的配置我会在后面的文章中细说。还有一些工具比如剪贴板和输入法也会单独给出配置的例子。这里我觉得需要解释一下的是启动文件。

这个autostart.sh文件仅仅是一个shell script。openbox启动时会执行这个文件并启动其中的程序。但是这并不是X系统中自动启动应用程序的唯一方法。Freedesktop.org的标准xdg是其他桌面系统通用的自动启动方法。因为xdg可能会与autostart.sh冲突。用户必须选择其中一个方式来启动桌面系统程序。而我通常会选择将所有的自启动程序都用autostart.sh脚本来管理。因为这种方式更简洁。

问题是,禁用xdg中的程序需要一点小窍门:需要把全局配置文件拷贝到本地再修改。比如,禁止xdg启动pulse-audio就需要下面这几步。

$ cp /etc/xdg/autostart/pulseaudio.desktop ~/.config/autostart/
$ $ sed -i '$ a Hidden=true' ~/.config/autostart/pulseaudio.desktop

此外,两个重要的桌面部件也需要它们自己的配置文件。

这两个文件需要放在不同的位置,下载上面链接中的文件后,可以使用下面这个命令搞定。

$ cp ~/Downloads/tint2rc ~/.config/tint2/tint2rc
$ cp ~/Downloads/conkyrc ~/.conkyrc

此外,这里需要一个脚本辅助前文中提到的Compositor正常工作。

下载脚本,将它拷贝到/usr/local/bin里面去。

$ cp xcompmgr-crunchbang /usr/local/bin/xcompmgr-crunchbang

用startx命令启动桌面,测试一下现有配置。

上面提到的脚本中包含一些尚未来得及叙述的工具和服务,比如音频服务器,网络配置工具和快速运行工具等等。这些都会在以后的文章中详细描述。现在我们来谈谈如何把Openbox打扮起来。漂亮脸蛋是好软件的一个重要特性。因为funtoo.org最初的目标是建立一个可靠的面向服务器的操作系统。所以,对于界面的设计和美观考虑较少。所以,这里介绍打大多数软件包都是我从Crunchbang和Ubuntu借来重新打包而成。如果要使用这些软件,必须先在emerge中添加私用的overlay。步骤如下:

$ sudo mkdir -p /usr/local/portage/overlay
$ sudo chown $(whoami):portage /usr/local/portage/overlay
$ sudo chmod g+s /usr/local/portage/overlay ## setgid
$ git clone git://github.com/jcadam/picky-overlay.git overlay
$ cd ${HOME}
$ su -c 'echo "PORTDIR_OVERLAY=/usr/local/portage/overlay/" >> /etc/make.conf'
$ sudo emerge --sync
$ sudo emerge --update --newuse --deep world

安装gtk主题。

$ emerge -av x11-themes/crunchbang-artwork

这个包是我从Crunchbang的早期版本中移植过来并且经过长期测试的一个优秀的gtk+-2.0主题。主色调是灰色,与任何桌面系统搭配都不会特别突兀。当然,用户也可以根据个人喜好选择其他的gtk+主题。启用这个主题的方法非常简单。在Openbox桌面上点击右键(Preference)->(User Interface Settings)Widget标签中选择Crunchbang,即可。

安装和配置鼠标指针。

$ emerge -av vanilla-dmz-xcursors ## WHITE, for black version vanilla-dmz-aa-xcursors

安装字体和字体配置。

$ emerge -Nav =media-fonts/anonymous-pro-1.002 
=media-fonts/arphicfonts-0.2.20080216.1 
=media-fonts/baekmuk-fonts-2.2-r2 
=media-fonts/bitstream-cyberbit-2.0 
=media-fonts/cardo-1.04 
=media-fonts/corefonts-1-r6 
=media-fonts/croscorefonts-1.21.0 
=media-fonts/dejavu-2.33 
=media-fonts/dina-2.89 
=media-fonts/droid-113-r2 
=media-fonts/encodings-1.0.4 
=media-fonts/font-adobe-100dpi-1.0.3 
=media-fonts/font-adobe-75dpi-1.0.3 
=media-fonts/font-adobe-utopia-100dpi-1.0.4 
=media-fonts/font-adobe-utopia-75dpi-1.0.4 
=media-fonts/font-adobe-utopia-type1-1.0.4 
=media-fonts/font-alias-1.0.3 
=media-fonts/font-arabic-misc-1.0.3 
=media-fonts/font-bh-100dpi-1.0.3 
=media-fonts/font-bh-75dpi-1.0.3 
=media-fonts/font-bh-lucidatypewriter-100dpi-1.0.3 
=media-fonts/font-bh-lucidatypewriter-75dpi-1.0.3 
=media-fonts/font-bh-ttf-1.0.3 
=media-fonts/font-bh-type1-1.0.3 
=media-fonts/font-bitstream-100dpi-1.0.3 
=media-fonts/font-bitstream-75dpi-1.0.3 
=media-fonts/font-bitstream-speedo-1.0.2 
=media-fonts/font-bitstream-type1-1.0.3 
=media-fonts/font-cronyx-cyrillic-1.0.3 
=media-fonts/font-cursor-misc-1.0.3 
=media-fonts/font-daewoo-misc-1.0.3 
=media-fonts/font-dec-misc-1.0.3 
=media-fonts/font-ibm-type1-1.0.3 
=media-fonts/font-isas-misc-1.0.3 
=media-fonts/font-jis-misc-1.0.3 
=media-fonts/font-micro-misc-1.0.3 
=media-fonts/font-misc-cyrillic-1.0.3 
=media-fonts/font-misc-ethiopic-1.0.3 
=media-fonts/font-misc-meltho-1.0.3 
=media-fonts/font-misc-misc-1.1.2 
=media-fonts/font-mutt-misc-1.0.3 
=media-fonts/font-schumacher-misc-1.1.2 
=media-fonts/font-screen-cyrillic-1.0.4 
=media-fonts/font-sony-misc-1.0.3 
=media-fonts/font-sun-misc-1.0.3 
=media-fonts/font-util-1.3.0 
=media-fonts/font-winitzki-cyrillic-1.0.3 
=media-fonts/font-xfree86-type1-1.0.4 
=media-fonts/freefonts-0.10-r3 
=media-fonts/inconsolata-20090222 
=media-fonts/intlfonts-1.2.1 
=media-fonts/ipamonafont-1.0.8 
=media-fonts/ja-ipafonts-003.03 
=media-fonts/jisx0213-fonts-20040425-r2 
=media-fonts/kacst-fonts-2.0 
=media-fonts/kanjistrokeorders-2.016 
=media-fonts/kochi-substitute-20030809-r3 
=media-fonts/konfont-0.1 
=media-fonts/liberation-fonts-2.00.0-r1 
=media-fonts/libertine-ttf-5.1.3.20110615 
=media-fonts/lohit-fonts-2.4.2 
=media-fonts/mix-mplus-ipa-20120411_p2 
=media-fonts/monafont-2.90-r2 
=media-fonts/montecarlo-0 
=media-fonts/mplus-fonts-2.2.4 
=media-fonts/mplus-outline-fonts-0_pre052 
=media-fonts/profont-x11-2 
=media-fonts/sazanami-20040629 
=media-fonts/shinonome-0.9.11 
=media-fonts/takao-fonts-003.02.01 
=media-fonts/terminus-font-4.38 
=media-fonts/thaifonts-scalable-0.4.17 
=media-fonts/tibetan-machine-font-1.901 
=media-fonts/ttf-bitstream-vera-1.10-r3 
=media-fonts/ubuntu-font-family-0.80 
=media-fonts/urw-fonts-2.4.9 
=media-fonts/wqy-bitmapfont-0.9.9_p0 
=media-fonts/wqy-microhei-0.2.0_beta 
=media-fonts/wqy-unibit-1.1.0_p1 
=media-fonts/wqy-zenhei-0.9.45

不要对这个长长的列列表感到惊讶,因为后面有更长的列表!其实,因为兼容性和历史遗留问题字体支持在Linux系统中很久以来都并不是很完美。而上面这个列表是经过测试能够满足中文和日语用户日常需求的一个组合。仅仅安装这些字体还不过,这里还需要对各个字体进行配置之后才能正常使用。

$ emerge -av ubuntu-language-selector
$ eselect fontconfig enable 30-cjk-aliases.conf
$ eselect fontconfig enable 69-language-selector-zh-cn.conf

仅仅将上面两个配置文件设为有效并不能得到最好的字体显示效果。经过多次调试,一下这个列表是我认为比较设和中文用户的配置列表。列表中带星号的条目都应该被设置为有效。

Available fontconfig .conf files (* is enabled):
  [1]   10-autohint.conf *
  [2]   10-no-sub-pixel.conf
  [3]   10-sub-pixel-bgr.conf
  [4]   10-sub-pixel-rgb.conf *
  [5]   10-sub-pixel-vbgr.conf
  [6]   10-sub-pixel-vrgb.conf
  [7]   10-unhinted.conf
  [8]   11-lcdfilter-default.conf
  [9]   11-lcdfilter-legacy.conf
  [10]  11-lcdfilter-light.conf
  [11]  20-fix-globaladvance.conf *
  [12]  20-unhint-small-dejavu-sans-mono.conf
  [13]  20-unhint-small-dejavu-sans.conf
  [14]  20-unhint-small-dejavu-serif.conf
  [15]  20-unhint-small-vera.conf *
  [16]  25-ttf-arphic-ukai-render.conf
  [17]  25-ttf-arphic-uming-bitmaps.conf
  [18]  25-ttf-arphic-uming-render.conf
  [19]  25-unhint-nonlatin.conf
  [20]  30-cjk-aliases.conf *
  [21]  30-metric-aliases.conf *
  [22]  30-urw-aliases.conf *
  [23]  35-ttf-arphic-ukai-aliases.conf *
  [24]  35-ttf-arphic-uming-aliases.conf
  [25]  40-nonlatin.conf *
  [26]  41-ttf-arphic-ukai.conf *
  [27]  41-ttf-arphic-uming.conf
  [28]  42-luxi-mono.conf *
  [29]  43-wqy-zenhei-sharp.conf
  [30]  44-wqy-zenhei.conf *
  [31]  45-latin.conf *
  [32]  49-sansserif.conf *
  [33]  50-user.conf *
  [34]  51-local.conf *
  [35]  57-dejavu-sans-mono.conf
  [36]  57-dejavu-sans.conf *
  [37]  57-dejavu-serif.conf *
  [38]  59-google-droid-sans-mono.conf *
  [39]  59-google-droid-sans.conf
  [40]  59-google-droid-serif.conf
  [41]  60-latin.conf *
  [42]  60-liberation.conf *
  [43]  62-croscore-arimo.conf
  [44]  62-croscore-cousine.conf
  [45]  62-croscore-symbolneu.conf
  [46]  62-croscore-tinos.conf
  [47]  64-ttf-arphic-uming.conf
  [48]  64-ttf-thai-tlwg.conf
  [49]  65-fonts-persian.conf *
  [50]  65-khmer.conf *
  [51]  65-nonlatin.conf *
  [52]  66-ja-ipafonts.conf *
  [53]  66-lohit-assamese.conf *
  [54]  66-lohit-bengali.conf
  [55]  66-lohit-gujarati.conf
  [56]  66-lohit-hindi.conf
  [57]  66-lohit-kannada.conf
  [58]  66-lohit-kashmiri@devanagari.conf
  [59]  66-lohit-konkani.conf
  [60]  66-lohit-maithili.conf
  [61]  66-lohit-marathi.conf
  [62]  66-lohit-oriya.conf
  [63]  66-lohit-punjabi.conf
  [64]  66-lohit-sindhi@devanagari.conf
  [65]  66-lohit-tamil.conf
  [66]  66-lohit-telugu.conf
  [67]  66-takao-fonts.conf
  [68]  67-lohit-malayalam.conf *
  [69]  67-lohit-nepali.conf
  [70]  69-language-selector-ja-jp.conf *
  [71]  69-language-selector-ka-ge.conf
  [72]  69-language-selector-ko-kr.conf
  [73]  69-language-selector-zh-cn.conf *
  [74]  69-language-selector-zh-hk.conf
  [75]  69-language-selector-zh-mo.conf
  [76]  69-language-selector-zh-sg.conf
  [77]  69-language-selector-zh-tw.conf
  [78]  69-unifont.conf *
  [79]  70-no-bitmaps.conf
  [80]  70-yes-bitmaps.conf
  [81]  75-ttf-arphic-ukai-select.conf
  [82]  80-delicious.conf *
  [83]  85-wqy-bitmapsong.conf
  [84]  89-ttf-thai-tlwg-synthetic.conf
  [85]  90-synthetic.conf *
  [86]  90-ttf-arphic-ukai-embolden.conf
  [87]  90-ttf-arphic-uming-embolden.conf
  [88]  99-language-selector-zh.conf

现在系统的字体配置应该可以满足用户的日常使用需求了。可以安装浏览器访问一下中文和英文网站测试一下显示效果。

$ emerge -av firefox-bin
$ sudo ln -fs /usr/bin/firefox-bin /usr/local/bin/firefox

可以用右键菜单的(Web Browser)启动Firefox。

设置桌面背景。

右键菜单中选择(Preferences)->Choose Wallpaper启动nitrogen。为它指定包含桌面图片的文件加,然后选择设置桌面即可。

配置退出Openbox的方法。

前文中安装个的oblogout软件包可以满足大部分用户“退出”系统的需求。它可以画一个非常漂亮的logout界面,供用户选择突出方法。我们想做的就是把它弄得酷一点。给/etc/oblogout.conf做如下修改。

--- /etc/._cfg0000_oblogout.conf	2012-11-13 23:20:22.178125356 +0900
+++ /etc/oblogout.conf	2012-11-07 00:38:04.146159134 +0900
@@ -6,8 +6,8 @@
 [looks]
 opacity = 70
 bgcolor = black
-buttontheme = oxygen
-buttons = cancel, logout, restart, shutdown, suspend, hibernate, lock
+buttontheme = foom
+buttons = cancel, logout, restart, shutdown, hibernate, lock
 
 [shortcuts]
 cancel = Escape
@@ -26,4 +26,4 @@
 # safesuspend = safesuspend
 lock = xtrlock &
 # switchuser = gdm-control --switch-user
-logout = openbox --exit
+logout = /usr/local/bin/oblogout.sh

然后,制作一个Openbox退出时的杀手脚本。内容如下,放入/usr/local/bin/oblogout.sh,并给它可执行权限。

## kill all apps in a openbox session
killall -s 9 -u $(whoami) conky pulseaudio volumeicon 

## exit openbox
openbox --exit
$ sudo chmod a+x /usr/local/bin/oblogout.sh

右键菜单中选择(EXIT),然后选择logout退出Openbox回到终端。重新启动Openbox。基本上,可以开始享受这个全新的轻量级桌面了!

参考文档:

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

Here comes Openbox!

选择一个窗口管理器需要很多理由吗?不需要吗!?当你了解到相对与Gnome和KDE长达数小时上百个软件包的编译过程,Openbox简单明了的只需要十几分钟的编译时间时,也许你已经有了明确的答案。当你知道相对与庞大冗余的桌面环境拖跨你的老机器,而Openbox支持的现代桌面系统仅仅需要不到500M内存占用的常时运行状态时,也许这已经变的不是一个问题。

让自己的操作系统拥有一个简单的结构还有其他诸多好处。第一,个人的精力其实非常有限——尤其当你已经30岁并且托家带口的时候应该对此有明显感受,如果你跟我一样偏执的需要对计算机“掌握一切”的时候,简单的系统结构通常能够帮你省掉不少麻烦。第二,复杂的软件是一种浪费。我一直都怀疑“高大全”应该成为一款软件成功与否的衡量标准。事实上也很难有一款软件或者一个操作系统能够满足所有用户的需求,通常情况是用户仅仅需要一个庞大软件中的20%的功能。第三,过度复杂的软件通常会把“自己动手”的用户拒之门外,让你失去为自己写工具的冲动。这有时候对程序员来说是一种莫大的损失。

所以,在这个系列中我想做的只有一件事——利用Funtoo作为基础制造一个扩展性良好的简洁的桌面系统。

「Workers of all lands, Unite!」

安装窗口管理器和他的合作伙伴们。

$ emerge -av openbox obconf oblogout `: Openbox Components      ` 
             xcompmgr                `: X-Composer              ` 
             tint2                   `: Panel                   ` 
             conky                   `: System Monitor          ` 
             dmenu gmrun             `: Commandors              ` 
             gtk-engines-murrine     `: Gtk Engines for gtk-2   ` 
             gtk-engines-unico       `: Gtk Engines for gtk-3.0 ` 
             xscreensaver            `: Screen Locker           ` 
             x11-misc/nitrogen       `: Desktop Drawer          ` 
             media-gfx/gpicview      `: Picture Viewer          ` 
             geany                   `: Editor                  `

整个桌面系统哦需要很多部件。以上的命令中的注释已经说明了各个部件的作用。需要注意的是,tint2conky都需要graphics的compsiting支持,X系统本身不提供这种能力,需要额外的软件库帮助完成这个操作。Compositing的主要作用就是将各个应用程序图形要素组装起来然后将合成后的图形显示要求转发给X服务器。这有这样才能在实现一些阴影透明和动画效果。这个组合中,xcompmgr就是compositor。

这些组件编译完成后,在采用默认配置的情况下测试一下。

$ echo "exec openbox-session" >> ~/.xinitrc

如果一切顺利,你会看到openbox启动。在桌面的任何空白区域点鼠标右键,你可以看到一个应用程序列表——这是openbox为启动大多数常用程序提供的快捷方式。

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

这个系列的最初起源是一大堆牢骚。当我觉得自己拯救自己的时候,我问了自己这样的问题——如果Ubuntu是错的,那么什么样的桌面系统是对的?也许我尚未找到答案,但至少我觉得以下几点是一个优秀的Linux桌面系统必须具备的特性

  • 源代码是开源软件的灵魂,优秀的包管理系统是强健的骨骼;这个系统必须无缝的升级并且尽可能的贴近源码。
  • 桌面系统必须是轻量级的;它可以快速的启动和关闭。
  • 使用什么样的应用程序应该由用户选择,而这些应用程序之间可以通过统一接口调用。

第一个要求将我引向了Gentoo。Gentoo Linux是以源代码为基础的发行版。它最重要的特色就是portage/emerge包管理系统。每一个Gentoo软件包全部都会在初次安装时从软件的源代码编译生成。每当软件推出新版本的时候,portage/emerge可以帮助用户重新编译并且安装新版本。同时,portage/emerge还可以根据用户的需要,安装同一个软件的多个不同版本。因为不需要二进制和打包的中间过程,这种升级就真正做到了“无缝”。因为系统组建之间之间无非就是动态链接和静态链接创建的简单耦合。所以,它也消除了以二进制文件为基础的包管理系统所创建的不必要的强耦合关系。这使得用户升级和调试单独软件包是获得了充分的自由。这种自由还体现在一种叫做Overlay的机制上。Overlay就是“覆盖”的意思。Gentoo通过这种机制让用户可以创建自己的软件包,并且将这些软件包按照一定的规则排列成树状结构来覆盖/定制官方默认的编译选项和软件特性。当然,用户也可以给自己的Overlay中添加新软件。很多用户在使用Gentoo的同时会创建自己的Overlay。我也将自己的对软件包的选择固化成了一个Overlay,你可以在这里找到它。Funtoo Linux是在Gentoo项目的基础上发展起来的新项目,它区别于Gentoo的最大特色在于以git为核心的软件包更新机制(虽然现在Gentoo也支持以git为基础的同步和升级)。除此以外,Funtoo还提供了比Gentoo更优秀的用户辅助工具——比如boot-update,所以我选择了Funtoo作为基础来建造自己的桌面系统。

对于第二个问题,我的答案是Openbox。为什么不是Gnome或者KDE这样的Desktop environment?因为Gnome项目已经“误入歧途”,至少这是我通过观察得到的结论。而KDE却也不能称作“轻量级”。那么只有在众多的Window Manager(窗口管理器)中选择一款了。我最初尝试了Fluxbox,它非常优秀,可是对于cjk用户并不友好,因为我的Firefox的窗口标题连不能显示中文或者日语这些双字节文字。于是理所当然的,我选择了Openbox。Openbox的开发相对活跃,并且拥有广泛的用户基础。很多发行版都提供了Openbox软件,更有一款非常引人注目的Crunchbang发行版将Openbox作为桌面系统解决方案的基础。这也正是我学习的对象。

最后一点是最贴近用户的问题。每个人对软件的偏好不一样,所以,桌面系统中使用什么样的软件应该由用户自己来决定。一个Web开发者的桌面系统和一个Android开发者的桌面系统应当有很大的区别。比如,前者可能需要curl,bluefish,python/PHP编辑器和多个不同的浏览器——采用wine或者虚拟机安装的IE,不同版本的Firefox和Chrome——等等;而后者,则需要编译Android软件的必要的库和工具,可以运行虚拟机的Java环境,eclipse集成开发环境等等。核心工具集以外的软件,在大多数情况下只能被称作“冗余”而别无他用。当Ubuntu一股脑塞给我OpenOffice套件和Evolution的时候,往往我在安装结束后做的第一件事情就是卸载掉这些冗余。另一个问题是应用程序之间的接口。比如,Windows的COM组件,还有Mac OS的Apple Script,它们都提供了一个完全或者不完全的统一接口来解决应用程序之间通信和“宏操作”的问题。Linux桌面也同样必须拥有这样的机制,否则可能连copy/paste操作也是问题。DBus就是解决这个问题的不二之选。