以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就是解决这个问题的不二之选。

打造嵌入式软件开发团队(3) 使用minicom做串口连接

minicom的初始配置

起动minicom

在终端中敲minicom,然后回车……(画外音:老兄,这个地球人都知道吧)。

$ minicom

如果你非常unlucky,发行版的默认安装中居然没有包含这个简单易用的串口连接工具,那么,找apt-get帮忙吧。

$ apt-cache search minicom
$ sudo apt-get install minicom

这里需要注意的问题是,如果你的locale设置的是中文,那么minicom打开后,那些边边角角条条框框会不能对齐,这基本山是因为程序本身不能计算双字节字符在屏幕上的正确宽度造成的,如果你英文好一些,并且不愿忍受破坏视觉的痛苦,推荐使用下面的命令启动minicom。

$ LC_ALL=C minicom

为了以后方便一些,就直接把这个命令写入$HOME/bin/里面,并且将这个路径添加进入PATH变量最前面的位置用以替换默认的minicom启动程序。

$ echo "#!/bin/sh LC_ALL=C minicom" > $HOME/bin/minicom
$ chmod +x $HOME/bin/minicom

如果minicom是第一次启动,打开之后就会遇到提示,可能有两种情况

  1. minicom说普通用户不能打开设备文件/dev/modem之类,如果你确信你需要使用这个设备进行通信,那么请用root用户或者sudo命令将这个设备文件更改访问属性;
  2. minicom说找不到默认的配置文件

恩,我们要说的就是如何给他配置起来,接着看吧。

打开配置菜单

第一次启动minicom可以使用root身份打开,并且加入-s选项,这是为了方便配置。

$ LC_ALL=C sudo minicom -s

这时回打开一个对话菜单,它长的有点像下面这个样子。

            +-----[configuration]------+                                  
            | Filenames and paths      |                                  
            | File transfer protocols  |                                  
            | Serial port setup        |                                  
            | Modem and dialing        |                                  
            | Screen and keyboard      |                                  
            | Save setup as dfl        |                                  
            | Save setup as..          |                                  
            | Exit                     |                                  
            +--------------------------+                                  

用上下键选择Serial port setup,选择进入。

    +-----------------------------------------------------------------------+
    | A -    Serial Device      : /dev/ttyS0                                |
    | B - Lockfile Location     : /var/lock                                 |
    | C -   Callin Program      :                                           |
    | D -  Callout Program      :                                           |
    | E -    Bps/Par/Bits       : 115200 8N1                                |
    | F - Hardware Flow Control : No                                        |
    | G - Software Flow Control : No                                        |
    |                                                                       |
    |    Change which setting?                                              |
    +-----------------------------------------------------------------------+

将串口的各个配置值设置成你需要的样子。按每个选项前面的字母键进入配置选单。其中,Serial Device需要指定成你实际使用的串口设备的设备文件;Lockfile Location使用默认就可以了,这个文件使用来锁定设备的,以保证不会设备被另外一个程序同时使用;Callin/out Program略去,嵌入式软件开发的时候大多不需要这个,这选项大概是留给调制解调器用的,我也不晓得;Bps/Par/Bits用来配置你的串口的通讯速度,这里我的设备选择了115200 8N1的选项,跟据你的设备选择相应的值;Hardware/Software Flow Control是RS232协议的一部分,用以控制两个设备之间消息传递的流控制——这个玩意儿一两句讲不清楚,有兴趣的话看RS232 flow control and handshaking——这个例子里选择NO。
不同的RS232连接线或者开发版的特殊设计都会导致你需要的配置与例子所说的不同,所以,还是查看一下硬件的连接方式手册再进行配置比较好。

配置完成后,在配置菜单中选择Save setup as dfl,这样就可以将配置结果保存成默认设置。

测试

如果你的开发板中已经烧入了相应的固件支持串口通信的话(一般都会有),这个时候可以给开发版加电测试一下通信状况了。如果配置没有出错,那么就应该有相应的内容表示。
值得一提的是折行控制。如果不进行选择的话,minicom提供的终端是不会折行的,也就是说你输入终端的内容在表示的时候会被短截,为了让自己看得清楚一些,可以用CTRL+A W来进行切换。

退出

在minicom的画面中按CTRL+A,接着按X键。或者CTRL+A Q。两者的区别是X会重置modem,而Q不会重置,并且Q选项需要用户确认。

此后就无须多言了,串口连接只是提供一种连接方式,连接以后根据开发板给公给你的界面,该干嘛干嘛就好了。


参考URL:
http://www.interface.co.jp/cpu/sh240_howto/howto06.asp
http://tldp.org/HOWTO/Serial-HOWTO.html

打造嵌入式软件开发团队(2) tftp服务器

上回书说到嵌入式开发环境的根文件系统如何通过NFS挂载,接下来说一下内核如何通过tftp服务器调试和加载。

Bootloader

通过tftp加载内核的前提是,开发使用的bootloader支持tftp功能。这样的bootloader有很多,在MIPS结构(MIPS4K,BRCM,龙芯等处理器)上,可以尝试使用U-Boot或者CFE。其中U-Boot适用于多种平台,包括ARM,PowerPC,MIPS等多中体系结构,而CFE是Broadcom公司开发的一个开放源代码BL,被广泛应用于MIPS结构。

安装和配置TFTP服务器

在Debian base的Ubuntu系统上安装tftp的方法非常简单。首先,你可以尝试用apt-cache命令查看一下发行版上都提供了哪些tftp相关的软件可以使用。


$ apt-cache search tftp
...
tftp-hpa - HPA's tftp client
tftpd-hpa - HPA's tftp server
atftp - advanced TFTP client
atftpd - advanced TFTP server
...
tftp - Trivial file transfer protocol client
tftpd - Trivial file transfer protocol server

atftp和tftp-hpa都是比较特殊的版本,所以,为了简便起见,这个介绍中只安装通用的tftp和tftpd。你可以使用下面的命令安装TFTP。


$ sudo apt-get install tftpd tftp

确认inetd.conf中是否正确安装了tftpd。


grep tftp /etc/inetd.conf

准备TFTP服务器使用的目录,可以在这个目录中放入需要共享的文件,比如编译好的内核image文件。


$ sudo mkdir /tftpboot
$ sudo chmod 777 /tftpboot

一般,为了配置简便,通常将tftp服务的目录放在/tftpboot,当然这个位置是可以配置的,在/etc/inetd.conf文件中,可以看到tftp目录被放在了/srv/tftp中,你可以根据需要更改。


$ sudo sed -e "s,/src/tftp,/tftpboot," /etc/inetd.conf >
/etc/inetd.conf_out &&
sudo mv /etc/inetd.conf /etc/inetd.conf_bak &&
sudo mv /etc/inetd.conf_out /etc/inetd.conf

测试一下。


$ echo "HELLO" > /tftpboot/FILE.txt
$ tftp
tftp> connect localhost
tftp> get FILE.txt

另外一个选择是使用xinet.d来驱动tftpd,取代inet.d。

安装xinet.d。

$ sudo apt-get install xinetd

配置tftpd服务。

打开/etc/xinet.d/tftpd文件,根据下面的样子照猫画虎就行了,需要注意的是disable=yes这一行变成disable=no。另外,默认的配置文件中可能需要增加访问控制选项,即将only_from这个选项固定为局域网。


service tftp
{
protocol = udp
port = 69
socket_type = dgram
wait = yes
user = nobody
group = nobody
server = /usr/sbin/in.tftpd
server_args = /tftpboot
only_from = 192.168.1.0/24
disable = no
}

使用xinet.d的好处是安全性增强。也是一个比较不错的选择。


参考URL:
http://hogeo.jp/blog/memo/2008/07/tftpubuntu.html
http://0x100.com/Gentoo/Server/tftpd.html