2009年2月7日 星期六

Thinkpad T61指纹仪过热问题

在系统登录或做系统管理任务时,用刷指纹来代替输入长长的密码,方便快捷,又能减轻手指的疲劳。在公共场合或办公区使用计算机时,为了信息保密,人离开机器后必须锁定屏幕。这早已成为我多年的习惯。然而Thinkpad T61使用Ubuntu8.04,出现锁定屏幕后指纹仪过热的问题。

按快捷键或其他任意方式锁定屏幕后,指纹仪不停地发热,越来越热,十几分钟后热得无法触摸。我担心它会损坏,因此很长时间在办公室的时候不用Ubuntu。Google此问题之后,没找到解决的办法。本想在Ubuntu的launchpad上报告此Bug,却发现早已有人先我一步,但却没人提供答案。订阅该帖几个月后,近日终于收到邮件,有人回复,提供了解决方法。原来thinkwiki上早已有人对此作了详尽说明。我想翻译成中文,置此备忘。

点击这里查看原文

修复指纹仪过热

如果你注意到你的指纹仪偶尔会变得很热,那你也许会对这一节的内容有兴趣。感谢Tino Keitel,他通过linux-thinkpad邮件列表给了我这个解决方案。

首先我们需要检测指纹仪是否没有处在自动挂起模式。
打开一个终端并运行:

for i in `find /sys/devices/*/*/usb* -name level` ; do echo -n "$i: " ; cat $i ; done

我们关心的是那些状态为“on”的设备,并且我们需要检测看是否其中之一就是指纹仪。所以对这些设备每一个都运行一次类似这样的命令:

cat /sys/devices/pci0000\:00/0000\:00\:1a.0/usb1/1-2/idVendor
0483(这是命令输出的结果)

cat /sys/devices/pci0000\:00/0000\:00\:1a.0/usb1/1-2/idProduct
2016(这是命令输出的结果)

以上命令中要用状态为“on”的那些设备所对应的路径,然后和lsusb命令的输出结果进行对比。举个例子:

lsusb的输出结果:Bus 001 Device 004: ID 0483:2016 SGS Thomson Microelectronics Fingerprint Reader

这正和上面命令的输出结果(0483:2016)相匹配。一旦检测完你指纹仪的路径,然后就用su -变成root并且执行:

echo "auto" > /sys/<设备的路径>/power/level

之后,指纹仪应该就处于“自动挂起”模式,并且再也不会变热了。而且它仍能正常工作。
这只对当前会话有效。如果你想让这个改动持续有效并且已经安装了sysfsutils,则编辑文件/etc/sysfs.conf并加入这行:

<设备的路径>/power/level = auto

对于前面的例子,则应该是

devices/pci0000\:00/0000\:00\:1a.0/usb1/1-2/power/level = auto


另外一种方法,你可以安装一个初始化脚本:

sudo gedit /etc/init.d/ReaderNoMoreHot

粘贴以下内容到其中:

#!/bin/bash
#
echo "auto" > /sys/<设备的路径>/power/level

保存并关闭。然后:

sudo chmod 755 /etc/init.d/ReaderNoMoreHot
sudo update-rc.d ReaderNoMoreHot defaults 90

标签: ,

2008年7月10日 星期四

Thinkpad T61指纹登录Ubuntu

将Ubuntu 8.04安装到Thinkpad T61上,声卡显卡网卡无线网卡ACPI等大部分硬件都直接支持,包括Fn系列快捷键,令我满意。开源的显卡驱动提供了良好的2D显示。系统启动后,受限驱动管理器自动提示需启用显卡的3D驱动,启用后桌面特效即可打开,令我满意。
唯有指纹仪没能用起来,稍有遗憾。

遂Google之,发现方法无数,多次尝试无效。
反复揣摩,终于完成。gdm登录或其他需要sudo,gksu的时候,无需再输口令,指纹一刷即可。非常方便快捷。方法总结如下:

1. 从源中搜索thinkfinger,发现三个软件包,装之。
sudo apt-get install thinkfinger-tools libpam-thinkfinger libthinkfinger0
网上有人说自己编译安装,我觉得何苦呢。

2. 启用指纹功能
sudo /usr/lib/pam-thinkfinger/pam-thinkfinger-enable
网上有文说需手动修改某些配置文件,我打开那配置文件后却发现早已改好,无须人工干预。

3. 重启系统
否则进行后续步骤时可能会报如下三种错误:
Undefined error occured (0xff).

Warning: usb_bulk_read expected to read 0x40 (read 0x10 bytes).
亦或
Could not acquire fingerprint (communication with fingerprint reader failed)
无数人报了以上这三种错误,我也都一一遇到了。但最终发现此步骤时重启一下,便好了。

4. 录制指纹
sudo tf-tool --acquire
网上有文说此处不加sudo,但我若不加sudo,总是失败。于是只好先sudo录之,然后把生成的指纹文件的属主由root改为当前用户。例如我的用户名为sanhe,便如此输入:
sudo chown sanhe:sanhe ~/.thinkfinger.bir

5. 检验指纹
tf-tool --verify
此处不加sudo,因为那个指纹的文件已经被改为当前用户的了。若提示验证通过,则至此设置全部完成。

网上有文说之后还得用
tf-tool --add-user添加用户,然而我的tf-tool只有--acquire和--verify等参数,根本没--add-user这参数,不知何来此说。总之完成这5步然后重启,指纹就可用了。
记录于此,以示他人。

标签: ,

2007年7月23日 星期一

Linux的前景

半年前,一个严重依赖Windows操作系统的友人在MSN上叫嚣说Linux要完蛋了。我猜想他大概看到了什么新闻,并由于不了解而产生了不正确的判断。内心觉得这说法多少有点荒谬,但没和他争辩什么。

不争的原因有二。一是我也不敢肯定Linux的未来是怎样的,二是我觉得对一个工具,正确的态度应是各取所需而不是试图排除异己。但内心依然希望Linux能好好发展,原因同样有二。一是自由软件本身的优点吸引人。自由软件虽然经常表现得有点散漫,有点随心所欲。但它开发和应用的模式,强调自由,开放,协作,这在知识的传承和软件的发展等诸多方面有很多好处,的确是种先进的文化。二是我希望自己的志趣和在自由软件上投入的精力不要荒废。

虽然广泛的传播对软件的发展很重要,但其实需求的满足才是根本。听说过Linux的人已经不少,但用的人却依然不是很多。服务器上用Linux的场合很多,但PC和Laptop上用的人依然不多。有不少人尝试使用Linux,但他们的很多需要Linux目前并不能满足。例如操作简便,良好的游戏支持等。因此我觉得如果真的想支援Linux的发展,更应当致力于改进软件本身。应用成熟后,传播自然不是问题。

我没有资格预测Linux的前途,只能偶尔在我狭窄的可见范围内设想一番它的前景。服务器方面,Linux已经应用得很普遍。Redhat和Suse在这方面做了不少事,仅管我喜欢Debian,但它们的功劳也不可没。

如果桌面计算机和嵌入式设备上也能广泛应用Linux,那就正中很多人下怀。因此看到戴尔在美国市场推出预装Ubuntu7.04的桌面计算机和笔记本后,我就暗自窃喜。据说此举是响应用户的要求,预装Ubuntu的机器卖得不错。据说戴尔正在考虑是否在美国以外的地区推出预装Ubuntu的台式机和笔记本。传说惠普也想出预装Ubuntu的机器,不知道是真是假。

其实尝试卖预装Linux的桌面计算机,这回已不是首次。但我想,现在机会真正成熟了。相信对戴尔此举,高兴的不只是Canonical,还有很多公司和很多人。在嵌入式方面,摩托罗拉要卖Linux的智能手机,日本人要把Linux用在数码家电上。人们在谈论着ACCESS公司的ACCESS Linux Platform,开源的OpenMoko。也许有一天,我们的台式机,笔记本,手机,家电,上面用的都是Linux操作系统。我隐约感到不远了。仅管还有很长的路要走,Linux要更好的发展,还需要软硬件厂商的联合支持。我以为,商业化运作的支持,是Linux更有希望,更光明的道路。

前段时间,曾叫嚣说Linux要完蛋了的那个友人兴致勃勃地告诉我,他因为要维护自己网站的原因学习了点Linux的操作,觉得挺有趣。他也开始用Linux了,仅管用的并不多。我想了想,5年后,或者用不了5年,也许他的台式机和笔记本上,运行的都是Linux操作系统了。谁知道呢。

标签:

2007年5月28日 星期一

当Synaptic遇上ISA

在我们研发部的办公室,可以上研发网和办公网。研发网无需代理,办公网则使用微软的ISA代理上网,这给Linux下的应用程序带来很多困扰。并非它们不支持代理,相反几乎都支持代理。无奈的是ISA用NTLM验证用户,除了FireFox,其它程序即使设置了账号也不能通过认证。即便是FireFox保存了账号和口令,每次启动还是需要多按一下回车。

其他的可以不上,软件不能不下。Synaptic遇上ISA,并且需要认证,那就基本报废了。微软永远不和竞争对手兼容,自由软件却想方设法和各种主流软件兼容。源中有ntlmaps,一个会NTLM认证的代理服务器。用它在本机为各个需要访问互联网的程序作代理,就能通过ISA的NTLM认证了。从源安装,根据提示简单设置。若还不能用,手动修改/etc/ntlmaps/server.cfg。只要将用户名密码和登陆的域设置了即可。

NTLM Authorization Proxy Server
'NTLM Authorization Proxy Server' (APS) is a proxy software that allows you to authenticate via an MS Proxy Server (e.g. ISA server) using the proprietary NTLM protocol. Since version 0.9.5 APS has an ability to behave as a standalone proxy server and authenticate http clients at web servers using NTLM method. It can change arbitrary values in your client's request header so that those requests will look like they were created by MS IE. It is written in Python v1.5.2 language.

Main features:
* supports NTLM authentication via parent proxy server
(Error 407 Proxy Authentication Required)
* supports NTLM authentication at web servers
(Error 401 Access Denied/Unauthorized)
* supports translation of NTLM scheme to standard "Basic"
authentication scheme
* supports the HTTPS 'CONNECT' method for transparent tunnelling
through parent proxy server
* has ability to change arbitrary values in client's request headers;
* supports unlimited number of client connections
* supports connections from external hosts
* supports HTTP 1.1 persistent connections
* stores user's credentials in config file or requests
password from a console during the start time

标签:

2007年2月28日 星期三

Firestarter启动的问题

我和论坛里的很多朋友都遇到这样一个问题。启动Firestarter的时候,提示
“External network device $IF is not ready. Aborting..”
其中$IF是个变量,是当前使用的网络接口的名字。例如如果用eth0上网,那么显示的就是
“External network device eth0 is not ready. Aborting..”
这个问题也让我感到很困惑,并且至今没有发现有人解答。只好自己捣鼓。一番猜测和检查后,终于发现了问题所在。就此谈谈其原因和解决的办法。

在我的记忆中,该问题的发生,是在一次软件升级之后。在以前,我将firestarter设置为自启动,以方便随时查看防火墙的状态。它一直工作得很好,就在一次软件升级后,它出现了上述问题。为了查看我的eth0配置是否正确,当时便执行了ifconfig。结果发现软件升级前,ifconfig输出信息都是英文。而升级后,都是中文的了。当时并没有在意,觉得可能是安装了一些中文包的缘故。也并没有把这个变化和Firestarter无法启动的事情联系到一起。在后续检查中,发现虽然Firestarter提示错误,但iptables却运行正常。既然防火墙工作正常,那么这个图形前端,不看也罢。于是将该问题就此搁置,直到今天又想念这个图形前端了,才重新捡起来。

想到这两个变化,便做了一个推测。觉得可能是Firestarter的启动脚本比较愚蠢,会从ifconfig的输出信息中查找相关接口的配置信息。以前它查找的肯定是英文的字符串,现在由于ifconfig的输出信息变成了中文的,一些参数信息它可能无法获取了,所以导致启动失败。于是检查Firestarter的启动脚本,发现竟和我预料的一样。于是问题迎刃而解。

Firestarter的启动脚本是/etc/init.d/firestarter,其中执行了/etc/firestarter/firestarter.sh来启动防火墙,因此,其实Firestarter真正的启动脚本是/etc/firestarter/firestarter.sh。

编辑/etc/firestarter/firestarter.sh
根据本机ifconfig的输出信息来修改以下几行代码:
IP=`/sbin/ifconfig $IF | grep inet | cut -d : -f 2 | cut -d \ -f 1`
MASK=`/sbin/ifconfig $IF | grep Mas | cut -d : -f 4`
BCAST=`/sbin/ifconfig $IF |grep Bcast: | cut -d : -f 3 | cut -d \ -f 1`

例如,我的系统使用eth0上网,就执行ifconfig eth0。其中IP地址依然可以通过以上代码的第一行获取,只是子网掩码和广播地址的获取会有问题。于是保留第一行不做修改,将后两行代码中grep搜索的英文字符串改为相应中文字符串即可。

IP=`/sbin/ifconfig $IF | grep inet | cut -d : -f 2 | cut -d \ -f 1`
MASK=`/sbin/ifconfig $IF | grep 掩码: | cut -d : -f 4`
BCAST=`/sbin/ifconfig $IF |grep 广播: | cut -d : -f 3 | cut -d \ -f 1`

保存文件后,启动Firestarter。一切正常。
不知道别人遇到的问题是否和我的一样,记录下来,仅供参考吧。

Update:
无意中看到有人转载了我这个文章,内心竟萌生出一点责任感。
其实这个方法挺傻的。没有任何通用性可言。
于是把想到的一个更好一些的法子写到这里,献丑了。
sudo vi /etc/firestarter/firestarter.sh
找个合适的地方,例如在
# External network interface data
这行注释的上面,添加一行:
LANG=en_US

这样,ifconfig的输出就是英文的了,这个启动脚本也就可以从它的输出信息中搜索出需要的几个参数了。这个方法更加简单,并且感觉上通用性似乎好一点。

标签:

2007年2月3日 星期六

自由软件对谈录

me:
OO中写的doc,到了MS Word 2003中,图就乱了。
我辛辛苦苦画的流程图,变得乱七八糟。
我恨OO。早知如此,我就直接在Windows上用MSO写了

Ma: 这不赖OO

me:
那赖谁?
另外用OO Drawing画图实在太痛苦了,用Dia花图还不如用OO方便。可能是我不会用吧

Ma: 如果你用OO,为什么做完了还要拿到MS的O去打开呢

me:
因为我的领导用的都是Windows呀
别的同事用的也是Windows,他们只有MSO
我写文档不是给自己看的

Ma: 如果真要用linux下的O来完成MSO的工作,你还是试试永中的O吧

me:
微软总是唯我独尊,从不考虑和同类软件的兼容。
仗着他在操作系统上占的市场份额,嚣张得不行。

Ma: 因为1张2003的MSO才不到5RMB,你们同事为什么不使用MSO呢

me: 啊,我多么希望中国正版化运动的来临

Ma:
那样也不好
真正正版了,咱们都不能使用xp了,除非购买正版

me: 不用了呗

Ma: 我不希望因为买个xp还要买一堆相关的软件

me:
大家都用Linux,FreeBSD呗
实在想用Windows就花钱买去呗

Ma: 缺少了很多娱乐

me: 别娱乐呗

Ma: 比如游戏

me:
那样的话,游戏厂商会连夜加班去做他们游戏的Linux版本的。
你放心吧
他们为了赚钱,肯定会干。

Ma: 买了这么好配置的硬件,不game一下,还不如买个普通的机子

me:
你顶多枯燥上半年,各大游戏厂商就会纷纷推出他们游戏的Linux版本。
硬件厂商,比如傻逼华硕,也会出Linux下的驱动程序。
我就不用再为我的笔记本不能使用显卡的3D功能而惋惜。
你也可以在Linux用OO办公,FF上网上银行,删掉Wine这类的模拟器,直接安装暴雪的游戏。
那时候,网吧里装的全是Linux,傻逼游戏小孩儿的机器装的也都是Linux
计算机启蒙课程,不再讲授DOS操作,而是Linux操作。
高中生不再以会修改注册表为荣,而是以熟练的Unix shell脚本能力而沾沾自喜。
那是什么样的世界,妈的?

me:
我决定费劲周折用OO写出MSO可以基本正常浏览的文档。
假设我一旦用了盗版MSO,就会名誉扫地,遭到巨额罚款,失去银行贷款需要的社会信誉。

Ma: 那时我也鄙视你

me:
我不能为了让他们在Windows下看得舒服就付出这么大代价。
况且即便我没有被发现,盗版的行径影响了整个软件行业,使这个行业不景气。
我的薪水会因此下降,找工作困难,生活窘迫。
因此我不能为了让他们看着舒服,就冒这么大的风险。
下了。88

标签:

2007年1月5日 星期五

新年的新气象

从通州度假回来,想起一些事情,记录于此。
新的年子来了,终日为我卖命的ubuntu也有了一些新气象。

伴随我左右的火狐狸,近日新添了TorButton,MediaWrap,FlashGot,三个扩展。加上以前的Tab Mix Plus,火狐狸工作得更合我意了。不知道什么时候开始,FireFox无法播放一些在线的媒体了。连百度上的歌曲也不能在线播放。于是填上MediaWrap,问题解决。FlashGot用来方便得批量下载。TorButton则是为方便得启用Tor。

作为gnome爱好者,以前在选择软件的时候,有些排斥K开头的系列KDE工具。
这无疑是十分荒谬的错误。这违背了软件存在和发展的根本意义。
不应当陷入工具的争议,没必要属于任何工具的阵营。只要是好的工具,就应当积极推进使用。
LumaQQ无法传输文件,不能展示图片。虽然IMTaTa可以在线登录QQ和MSN,并且竟然有文件传输,语音聊天,视频聊天的功能。但这三个功能需要Flash9的支持,而我只能安装Flash7,beta版本的Flash9会令火狐崩溃。因此还是需要一个合适的QQ客户端,至少有传文件的功能。

Anjuta功能简陋,并且新版2.x连基本的功能都无法正常使用。实在忍无可忍。大概自行下载编译最新的版本会好一些,但已经心灰意冷,不愿折腾。

D4X经常无法下载,甚至不及火狐自带的下载管理器。昨晚下个Flash9的插件,由于速度太慢,决定挂着它,我去睡觉。这时候开始在d4x中到处找“下载完成后关机”这样的选项,发现竟然没有。

于是开始使用EVA作为我的QQ客户端,使用KGet作为下载管理器,使用KDevelop作为IDE。
这几个KDE的软件,为我的新年,带来了高兴的体验。

标签:

2006年12月8日 星期五

Ubuntu下的开发环境

如果还没有安装基本的编译调试工具,首先把gcc,g++,gdb安装了。源中的这些软件版本还是比较新的。最好把build-essential,内核头文件这类的软件包也一并安装了。

安装Sun的jdk,源中有Eclipse,但没有Netbeans。需要的话可到Sun的网站下载安装包。Netbeans不但是很好的Java开发环境,也可以安装C/C++包来开发C/C++程序。不过Java如果解释执行,速度还是比较慢。

如果想节约使用键盘,避免使用命令行的gdb来调试,可以使用gdb的图形前端DDD。如果需要使用一个IDE来开发C/C++程序,可以使用Anjuta或KDevelop。这样就不需要手工制作Makefile,也方便调试和发布。另外最好将推荐安装的软件包也一并装上,否则很多重要的功能无法启用。目前来看KDevelop要比Anjuta更好。

浏览源码,vim+ctag+cscope不爽的话,不妨试试Source Navigator。它在源中的名字叫sourcenav,安装后运行snavigator即出。它不会自动在菜单中添加项目,需要的话手工添加一个。

至于版本控制,默认安装已经有了cvs,可以安装一个它的图形前端gCVS以方便使用。gCVS自动添加了菜单项目,可惜有错,需要改改才能出来。我更喜欢SVN,到源中搜索svn,发现没有。很疑惑。后来搜索全称Subversion才找到。有一个值得推荐的GUI的SVN客户端,它叫RapidSVN。安装没有自动添加菜单项目,我手工添加了一个。RapidSVN并非svn的图形前端,而是一个独立的客户端。虽然Anjuta和Netbeans中有CVS和SVN的插件,但功能太弱了。找到一些SVN的资源,列出备忘。

http://subversion.tigris.org/
http://www.subversion.org.cn/
http://svnbook.red-bean.com/

标签:

2006年11月19日 星期日

自由

升级到Edgy后,转眼已经过去一周。觉得有些事情,不得不提。

我的笔记本,华硕W3Z。显卡ATI Radeon Xpress 200M。CPU为AMD Turion64。这样的本子,很苦。因为它无法安装ATI官方提供的驱动,也无法安装开源的ATI驱动。我经过无数次尝试,不断听取网上其他人的说法。 看了我可以用Google搜索到的几乎所有中英文的文章。最后终于证明了这件事。

关于此事,有两种说法:
1. 安装旧版的一个库。但提供的链接不可用,我无法下载这个库,也无从尝试这个方法了。
2. 在BIOS中设置显示模式为UMA+SidePort(使用显存并映射内存),128M显存。HP有几个和我类似的机型,他们和我遇到了同样的困惑,但最 终修改BIOS设置后解决了问题。但我使用的华硕笔记本,BIOS设置中的项目少得可怜。根本没有这么详细的设置项。本想用一些软件直接刷显卡BIOS, 后来觉得风险太大,放弃了。

于是,尽管我的Ubuntu2D显示效果很好,但无法获得3D加速。其他大部分硬件可以使用,不过调制解调器和红外线没有被支持。还有如PCMCIA和火线,我也没有试过。

Edgy的确没有Dapper稳定。之所以武断得说出这样的结论,是由于多次无端的崩溃。
升级后,gaim崩溃。重新安装gaim后,旧问题解决,新问题来临。关闭gaim时它常常崩溃。
Anjuta的几个插件,一用必崩。只好不用这几个插件,避开它们。
FireFox还算争气,可惜偶尔也会崩溃。这是在Dapper中从未遇到的。
令我不解的是,gedit也曾经崩溃。致使我正在写的文章丢失。从此写几行字便赶紧保存一次。
Totem和mplayer有时也会崩溃。不过这不是新问题,用dapper的时候它们偶尔也会如此。
今天Nautilus也无端崩溃了一次,令我十分不悦。我想,怎么能如此草率呢?

尽管如此,我并无怨言。几乎每次程序崩溃,我都会去report bug。只希望,自由软件,不要因自由而丧失质量。只希望,Linux可以承载我对自由的信念和渴望。
今天因为到处找显卡驱动,在MSN上遇见一个旧时的友人。他对我讲了很多Linux的坏话,很多是有真凭实据的事情。无心争辩,大家各有所好。其实开源模式本身的优点和缺点,我们心知肚明。只是个人取向不同罢了。我想要的,其实无非二字。说起来令人颇为感动的那两个字。前些天在Edgy发布会上,Ubuntu创始人在回答问题时半开玩笑地喊出的那两个字。

── 自由!!

标签:

2006年11月10日 星期五

Evince的困扰

Evince为Ubuntu自带的PDF阅读器。用它查看某些中文PDF时,遭遇乱码。
在Synaptic中搜索PDF,试图找到其他更好的PDF阅读器。于是发现XPDF。
安装它以及所需的一些软件包(xpdf-common,xpdf-reader,xpdf-utils),并且额外安装xpdf-chinese-simplified。
再试,发现XPDF界面竟然如此简单,并且用它来查看先前在Evince中乱码的PDF文件,却乱得更厉害了。
很偶然的机会,我心有不甘,又一次用Evince开打曾经乱码的PDF。
令人惊喜的是,我前后打开的是同一个文件,它却不再乱码了。显示效果很好。

反复试验,得出一个滑稽的结论:
使用Evince打开无内嵌字体的中文PDF文件发生乱码时,安装XPDF及其中文包可以解决问题。

其实在Linux下阅读PDF,可使用Adobe Reader,源中有最新版本7.x,最好的PDF浏览软件。

标签:

2006年11月5日 星期日

按住它

先放一段介绍。
执行sudo apt-cache show anjuta,将结果中的描述信息抄下:
A GNOME development IDE, for C/C++
This IDE for C/C++ and GNOME/Gtk+ applications has features that enable easy
debugging and management of code. It also integrates with glade and CVS.

Anjuta,我读做“按住它”。这听起来滑稽可笑,似乎充满暴力和戏弄的色彩。
在Linux 中,本可以用vim+ctags+cscope来方便地编写代码,然而我似乎觉得也应当有一个IDE。IDE这个东西并不是最高效的,因为它常常有着复杂 的界面和繁琐的功能,并且执行速度较慢,不够灵活。然而有些时候,IDE也有它显而易见的好处。譬如,功能集成化,可视化,丰富的快捷键,动态提示, Makefile自动生成等便利条件。所以我觉得即便是Linux,倘若有图形,还是需要一个IDE的。

KDevelop据说是Linux中的VC。然而我比较迷信Gnome,所以没有心情使用KDE的工具。Eclipse+CDT可以玩C和C++,但用了 一下,发现似乎没有函数动态提示。并且似乎不能自动为工程生成Configure。这对以源码方式发布程序不是很方便。虽然可以用autoconf和 automake自行搞定,但这似乎不爽。其他还有众多IDE环境,我无心一一尝试,于是决定就用Anjuta。

sudo apt-get install anjuta

Anjuta据说用GTK写的,建立工程后,未能自动生成Makefile。错误提示说需要安装glib,令我奇怪。我早已安装了 libglib2.0, libgtk2.0等包,为何这般?于是复制错误信息,Google之。有人云,需要安装libglib2.0-dev和libgtk2.0-dev。恍 然大悟,安装,成功。颇爽。

它并不漂亮,不像Eclipse那么美观。但它不是用Java写的,所以它跑得比较快。并且它不至于像DDD那么丑。虽然在操作上觉得还不是很便利,但尚觉得满意。

标签:

Makefile纪事

在繁琐的事务或流程中,图表的表达能力是自然语言望尘莫及的。看了两个讲述Makefile自动生成的文章,冗长的赘述令我心烦。偶然见一图,觉得一目了然,省却千篇文字。大喜。贴到这里,以供借鉴。
另附两篇文章的链接:
文章一
文章二
他们讲述的是旧版本的Automake,新版本略有一些变化,我试图用最简化和优化的方式说清楚此事,并且补上新版本的一些情况。

在Linux中,人们经常以源码形式发布程序。
这样做的原因之一是为了开源。另外的原因是为了便于在不同的平台和环境下能够更好地运行程序。
为了使程序适应不同的平台和环境,具有更好的兼容性,需要在相应的平台上编译程序。
这就要求有一个通用的,规范的,方便的编译程序的方法。
Automake提供了一个便利的解决方案。

程序一般均由make管理和生成,而make需要一个配置文件,叫做Makefile。
可以手工编写Makefile,但如果项目较大,那么这样做会很繁琐,且不易于维护。
手工编写的Makefile可能没有遵循GNU Makefile的惯例,致使Makefile的通用性差。
另外IDE环境需要一个Makefile自动生成的途径,以方便用户创建和处理工程。
基于以上考虑,可以使用Automake和Autoconf来自动生成一些脚本和配置文件。
把这些脚本和配置文件同程序的源代码一同发布。
当用户使用程序时,首先执行脚本(configure)自动生成适用于用户环境的Makefile,然后用make编译和安装程序。
这样,即使平台和环境有差异,人们也可以正常地使用程序。

举例说明:

Ubuntu6.06,automake1.9.

保证系统中已经安装了所需软件包:
gcc
g++
make
automake(目前Dapper的源中最新版是1.9)
autoconf
m4(Unix的一种宏处理器)
libtool(产生动态库需要这个包)
perl(aclocal是用perl编写的,所以需要安装perl)

1. 创建一个目录,于其下放入要编译的所有源文件。例如foo.c和main.c。

2. 创建一个名为Makefile.am的文件,该文件用于生成Makefile.in(用于生成Makefile的配置文件)。写入以下内容:
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = foo
foo_SOURCES = foo.c main.c
如果没有设置AUTOMAKE_OPTIONS = foreign,
那么需要在当前目录中建立README,NEWS,AUTHORS,ChangeLog这几个文件。后两行设置了要生成的程序的名字以及所需要的源码等信息。

3. 到该目录中,执行autoscan来扫描目录中的所有源文件。
生成两个文件,configure.scan和autoscan.log(日志文件,可以删除)。执行autoscan时提示错误,但如果已经成功生成所需文件,那么忽略之。

4. 将configure.scan改名为configure.in或configure.ac(.ac为新版的格式,建议改为.in以和旧版兼容)。 mv configure.scan configure.in

5. 编辑configure.in,其中为一系列m4的宏。我常常去掉宏 AC_CONFIG_HEADER([config.h]),这样以后会省一些事。修改AC_INIT宏,对应写入程序名,版本,和作者联系地址。如AC_INIT(foo, 1.0, foo@gmail.com)。当然这个宏也可以不修改。在AC_INIT和AC_OUTPUT之间的任意位置添加一行AM_INIT_AUTOMAKE(foo, 1.0),用以指定生成程序的名字和版本。如果没有执行步骤2,则不会自动生成宏AC_CONFIG_FILES([Makefile]),需要手工添加。如果执行了步骤2,则该宏会自动生成。

6. 执行aclocal。
它将根据configure.in生成文件aclocal.m4和目录autom4te.cache(缓存目录,最后可以删除之)。aclocal.m4中包含了automake所需的一些宏。若未生成该文件,说明configure.in有问题。可以尝试执行automake来查看提示的错误信息,根据提示再次修改configure.in,直到正确为止。

[7]. 如果在步骤5的configure.in中去掉了宏 AC_CONFIG_HEADER([config.h]),则不再需要这一步。如果没有去掉则需要执行autoheader,它将根据configure.in生成文件config.h.in。

8. 执行automake --add-missing,生成Makefile.in。另外这一步还生成了三个符号链接(install-sh,missing,depcomp),分别指向automake目录中的三个可执行脚本。

9. 执行autoconf。
它将根据aclocal.m4和configure.in生成可执行的脚本configure。

到此,全部工作完成。将以下配置文件和脚本与程序的源码一同发布。(示例中有两个源码文件foo.c和main.c)
configure.in
configure
Makefile.am
Makefile.in
aclocal.m4
三个符号链接所指向的三个脚本install-sh,missing,depcomp也需要一起发布。
虽然在我有限的尝试中,没有发布missing脚本也没问题,但觉得还是发布了为好。

注意: 如果在configure.in中保留了宏 AC_CONFIG_HEADER([config.h]),则需要将config.h.in也一同发布。否则无法正常使用。觉得比较麻烦,所以我一般去掉那个宏,然后省略步骤7。

在用户编译程序时,到程序源码目录中执行脚本configure来生成Makefile,然后用make编译和安装。
./configure
make
如果需要安装,则继续运行:
make install

标签:

在Debian中编译内核

VMware中,Debian Sarge,内核版本2.6.8-2。试图重新编译内核。

上网搜罗相关文章,中英文俱有。但我需要的,是严谨而细致的手册。

到LinuxSir的Debian板块,打开这两篇文档作为参考:
1.http://debian.linuxsir.org/book/reference/lyoo/ch-kernel.html
2.http://debian.linuxsir.org/book/faq/etony/ch-kernel.zh-cn.html
第一个相对详细,第二个日期更新一些。
适当重视文档的写作时间,例如倘是2002年的,那时效性可能差一些。

开始,按照Debian方式。这是一种简化和优化了的方式。
所谓Debian方式,就是以Debian的软件包管理方法来处理问题。
所以使用kernel-package中的工具make-kpkg来编译内核。
最终产生一个deb包,然后使用软件包管理工具dpkg来安装或卸载。

先前曾安装过Debian安装盘中的内核源码,以及kernel-package包。
到/usr/src下,可看到名为kernel-source-2.6.8.tar.bz2的压缩包。
到/usr/share/kernel-package下,可看到一篇名为README的文档。
它包含了编译内核所需的大部分内容,并且解说细致,条理清晰。

从该Readme文档以及那篇FAQ(前面提到的第二个链接)中,
可以知道编译内核首先需要安装哪些软件包。
除了系统必备的一些,其它的软件包,逐一搜索检查。
如果没有,则用Debian安装盘全部装好。

从该README文档中可以得知具体步骤和要执行的命令。
到/usr/src下,解压缩源码包,配置,编译。

在我编译之前,从README文档中得知,initrd并非必须。
如果有它,即使启动时内核镜像所在文件系统的驱动作为内核模块存在也可以。
如果没有它,那么该文件系统驱动必须被直接编译到内核中而非内核模块中。

如果需要initrd,则应当先为内核源码打cramfs补丁,再开始编译内核。
当然除了打cramfs补丁外,还有一种办法,见相关文档。
但是,既然完全可以不要initrd,那为什么要它?
所以我在编译内核时没有加--initrd参数,
并且也不打算之后使用mkinitrd等工具来生成它。

整个过程执行了这样的命令:
cd /usr/src
tar -jxvf kernel-source-2.6.8.tar.bz2
cd kernel-source-2.6.8
本来还想从/boot目录中找个当前的配置文件作为我的默认配置。
但我后来忘记做这个了。
make gconfig
尝试了make xconfig,觉得还是gconfig更好一些。

修改完成并保存后,当前目录下多了一个隐藏文件.config。
我多次反复用make gconfig修改了它。
其间我到slackware的FTP上找了一个config文件作参考。

之后执行了这些命令:
make-kpkg clean
make-kpkg --revision=custom.1.0 kernel_image
由于我用root用户登录的,所以我不需要文档中提到的fakeroot之类。
cd ..
这里发现产生了一个kernel-image-2.6.8_custom.1.0_i386.deb。
dpkg -i kernel-image-2.6.8_custom.1.0_i386.deb
从安装过程的提示信息中,可以看出:
新编译好的内核和模块都被自动安装到恰当的位置了。
相关配置文件也修改好了。
自动搜索到了grub,并且自动修改了grub的配置文件。

打开grub的配置文件,发现新内核的配置项已添加到现有内核配置之后。
我大喜,重新启动计算机,选择新的内核。
启动失败,提示
kernel panic:VFS:Unable to mount root fs on unknown-block ...

我的确已经将ext2和ext3都直接编译到内核里了。
不知为何。
想过妥协,弄个initrd出来,估计应该可以启动。但没有那样做。
我选择了继续摸索,绝不使用initrd!

Update: 多次尝试,终于发现问题所在,虽然将文件系统驱动直接编译进了内核,但硬盘是SCSI的,我却没有选上一些SCSI所需的驱动。新内核成功运行。

顺便说一句,过程可以散漫,态度不可不严谨。

标签: