一次不愉快的尝试及思考(5)

吐槽一下我对linux桌面应用的不满。

首先,各种桌面环境(或仅仅是窗口管理器)以及会话管理器风格迥异,完全没有一个统一的指挥棒。君不见就连Linux的文件系统结构都还有个FHS,而那个传说中的POSIX不也是考虑到异常混乱而搞出来的吗?各种发行版的包管理器(deb,rpm等)以及同样的包管理器出现的各种不同的package(比如debian的和ubuntu的对bash的打包方式)暂且不谈,看看单是gdm,kdm,lightdm,lxdm,slim,xdm和gnome,unity,kde,openbox,lxde,awesome,wmii,wm的组合就足以让人瞠目结舌了。而关键在于不同的会话管理器的功能不同导致不一定就能发挥桌面环境的功能,而不同的会话管理器的配置和使用的权限本身又非常不统一,这导致了想真正达到自由地定制在很多情况下意味着你需要很强的折腾劲才行,而这可能会无果而终。举个例子,ubuntu下的lxdm无法登陆xfce;slim下登陆时networkmanager会有权限问题;lightdm下退出可能回不到登陆界面。或许让每个用户最为头疼的是某过于当安装了某个桌面环境后会绑定其集成的工具,然而你却看到了另一个发行版的相似的工具也在;你当然会希望删去一些冗余的package,但是其依赖关系往往让你只有删除了整个环境后才可以。当然在硬盘空间如此廉价的情况下,这关键的问题并不在于删去碍眼的包,而在于挑选那些适合的包而让另外一些不可见;但是有这种机制的软件本身却是依赖于桌面环境的(比如gnome有个所谓的main menu的管理,如果将这个设置为每个发行版都必须有的那该多好啊)。那么,去除这些依赖的概念,而让每个软件都静态打包,能不能解决这种用混乱呢?众所周知,这同样不合理。要不还要那么多共享库干嘛呢?多个依赖于一个共享库的打包的程序还需要包这样的共享库都加载了这不是浪费吗?对于小型程序还好,吃资源很厉害的应用多了就扛不住了。况且,要达到一定的整体的体验,这种小件的组合打包方式是不合适的。

其次,选择太多。Python对perl的反叛莫过于一件事只用一种方法去做。而在开源的世界里,看到的是完全的反面。往往是一搜一大堆对某个问题的结果;一问一大堆可以解决问题的软件。比如说关于字符乱码问题,用vim和emacs完全可以解决,但是iconv是一般发行版都会自带的;面向Vimer当然用vim来解决最好了,Emacser亦然,都不用的iconv当然可以,同时还有数以万计的其他工具也可以完成。当然前面这个例子举得非常不好,因为这恰也可以作为其优势。但是一个不能忽视的问题是学会用一种工具是需要时间的,而真正掌握了一门工具的使用是会将写工具的理念也吸收进去的,正如书是传递思想的工具一样,工具也是。而多种理念的混杂导致先要从中选择一种方案,对面临一堆问题的且不想花很久来解决的人来说是不利,因为又引入了另一个问题。另一个例子是在处理乱码这种问题上,居然没有一个必然有效且简单明了的方案。这不禁让人想到了c语言作为这样一门优秀的语言其标准居然没有提供GUI库一样。

再有,由于要顾及多种平台写代码的苦逼作者们不得不花更多的心思来迎合各种环境,那这样的话势必就减少了更多的功能的实现。然而那些发行版为了不得罪开发者也只好将不够成熟的代码加进repo中。众所周知,现在的Linux桌面GUI软件大多都不够稳定。。。最后导致的是尽管有了这么多的应用,但是killer级别的却不是很多。而那些写应用的家伙大多则是基于自己的兴趣而不是以别人的需求为出发点的,这让开源的软件多了一些geek的风格之外也让人有了这些桌面的应用都是toy的感觉。

另外,或许由于Linux的基因问题。x window服务虽然有更多的灵活性;却需要更多的消息传递,这意味着更多的资源消耗(记得有个project正是着手解决这个问题)。而那些gtk,qt的开发库为了兼容性不得不作出牺牲,这导致了很多情况下只有靠硬件的牛逼和绚丽的效果才能和Windows下的应用媲美。

当然,上面的所有观点从反面讲或许正是Linux桌面的优势,这也未可知。

NoTech Comments(3) Thu, 14 Jun 2012 19:57:43 +0800

一次不愉快的尝试及思考(4)

在重装了各种package之后,遇到了一个不可小觑的小问题:系统时间不对。更准确的说是时区不对。网上有说法是通过date -s修改和clock -w写回CMOS的方法。但我用了之后却毫无反应,时钟依旧我行我素。后来听说可能是BIOS本身时间设置有误,于是还真的发现BIOS时间不对;但是雷人的是在修改之后时间仍然是不对的。再看看网上的说法是需要用ntpupdate通过服务器校准并写回BIOS,这样的方法开始还有效,但是重启之后,该怎样还是怎样。灰心之下,通过一个叫time-admin的GUI工具来校准,选择了shanghai的时区,但发现竟然可以在我修改数据之后它自动帮我改回去了,得,全白搭了。更为奇怪的是,当我不服输第二次重新进行同样的操作时系统提示我没有安装相应的ntp同步软件包。不得不说这中情况非常让我困惑:刚才ntpupdate都成功了,并且第一次用time-admin时没出现错误,怎么这次就出岔了呢?在费尽我的脑细胞之后终于查清原因,原来dotfiles真的是不可以瞎用的;sontek在他的.profile中直接写死了自己的TZ,然后我就屁颠屁颠地用过来了。偷懒真要命。

在找到time-admin的时候,实际上我是用tasksel安装了xubuntu的桌面环境了(一直想看看xfce这个被Linus看好的dw究竟什么鸟样)。现在才知道,总将xubuntu和lubuntu比较是极其不对的,甚至是有害的;这种不合情理的比较正像C和C++比较一样。两者根本就是两种理念;要说到渊源,至少在ubuntu系列下,xubuntu更像gnome 2时代的ubuntu。整个桌面环境更加统一,这种整体性的代价就是你再也很难自由的定制了。尽管看起来,你是得到了一个各个组件都更为独立的桌面环境,但是事实上你只能在它允许你的环境下进行为数不多的hack;如果想继续深入的话花费的代价将是指数级增加的(一个高耦合的脚本足以让人见不着北了)。比如那个看似人性话的mail reader可以让用户选择用什么邮件客户端;然而事实上可以使用的邮件客户端其实也就是thunderbird和evolution这两种主流的,用其他的GUI的可会断则会出现各种奇怪的错误信息;自然的,像mutt之类的邮件客户端是怎么着也没法用的 。另一方面,邮件客户端可能再也不是什么先进的玩意儿了,因为webmail是如此普及,而浏览器操作系统业已开始深入人心。一味地以客户端为中心,无异于让那些hacker大跌眼镜;即使对于我这种以浏览器和IDE为中心的用户也会对这种强奸人意的观念不以为然。或许有人会认为商务中用邮件客户端是不可避免的,但事实上一个如ubuntu这样不够稳定的发行版用作商务机是太具风险了。

高度的集成带来的好处是统一性,Unity给人的一致的感觉,完全对得起这名号;这中好处包括了安全性、可靠性和高质量。比如,在它这样的思路下,你很少会做出出格的事情来;你不错,就减少了case的种类,那么出错的可能性就降低了;而它也就可以把时间花在其他诸如界面优化的因素上了。然而你必须接受它的调教,说不的代价是昂贵的。

我个人还是希望有更多的定制性,可这却是不利于发行版的发展的。当众口极其难调时,出现的test case必然成指数级增长,这对所有的开发人员和测试人员无异于噩梦一场。所以现在出现的问题是,对于那些更加清爽的发行版,其支持比那种高集成的支持要少得多。比如说吧,现在的非开源新的应用大多有deb和rpm包,但是针对gentoo和arch的就少得多(更远一点,比如puppy的支持就更少了,尽管如其名它本身就是一个玩具)。真正能解决问题的是user=developer;然而这又会让更多人对开源望而却步。这是一个delimma。

为这次的失败的经历作个总结,以免下次再二了:磁盘这玩意儿少碰为好,实在没办法的话找些傻瓜式的软件搞搞就行。我不是做运维的,没有必要在这上面花时间,否则会很苦。如果被逼无奈下确实要处理磁盘的话,先想想最坏的可能。重要的东西先备份再说,千万别对这种事有太多的信心。平时就得养成备份的好习惯,做什么事留一手。跨平台的同步盘绝对是个好的东西。github,svn是备份配置文件的好工具。Linux的底层是个非常不好驯服的东西,配置是一个极其能装逼己但又不需要花很多就能学会的玩意儿;所以在这上面折腾对我不利。那些总是拿配置炫耀的人不是优秀的developer而最多算一个合格的user。所有的系统都很糙,你只可以在调教与被调教间做出折中。

NoTech Comments(7) Thu, 14 Jun 2012 19:57:23 +0800

一次不愉快的尝试及思考(3)

上回说到,被逼无奈之下我只好选择重装;可怜我那~下的文件全都付之成灰;人是物非,欲语泪先流。不禁感慨人生不过如此,赤条条来去无牵挂。然而,比那些文件好的是,还有些东西可以证明我的存在,比如如果这篇文章不小心被人看到之后还至少会有人想起这不是一个哪怕极具智能的机器人所能写出来的。顺便以此作为我对上次系统的缅怀之情,好作葬花吟。

在选择发行版的时候,又陷入了进退维谷之境。对于包管理,Ubuntu系列总算是我最熟悉不过的了,它的上流debian我应该也算熟悉;然而这两者U可用太媚俗来形容,d则过于正义;fedora也在算选之列,yum也已经比较完善。而arch和gentoo虽为至简而设计,但是其包管理机制却并不完善(此依旧是后话),而且仅仅依靠社区的支持显然是不够的——我的观点是一个成功的发行版的社区后面总有一个公司或基金会在支柱着,正如一个成功的男人后面总有一个贤惠的妻子一样(我想多了,orz)。辗转反侧之后,还是用了lubuntu的版本,原因只是它是所有有桌面环境的ubuntu家族的最清爽的一个;其实我更热性与fedora的lxde,因为它更加纯粹和好用。但是,由于我的立身处世导致了这样的选择。其实很多情况下,人作出的选择都是和冠冕堂皇的理由不同的,恰恰是有些非理性的因素在选择时占了优势,而在事后被询问为什么的时候却只用看似“理性”的理由来搪塞其选择的必然性。

Canonical这样一家弄潮公司的确在推动Linux桌面上功不可没,可惜Linux for human beings本身就决定了其必须迎合更多人的心态。然而尽管如此,那些鼓吹arch、gentoo的人贬损ubuntu却大可不必,因为论起安全性和易用性来说ubuntu的确更胜一筹,而一直被诟病的ubuntu稳定性也比arch和gentoo好些吧。再说,本是同根生,相煎何太急?不还都是一个定制的结果吗?个人觉得,ubuntu的确得为Linux哲学提供点insight。不得不说,公司对lubuntu的支持实在太少了,比如装个ibus都会出现图标不显示在panel的问题;而在xubuntu和ubuntu上居然不存在这种结果!这显然是某个库文件、图标或者脚本缺失或者粗制滥造的结果。不过这也难为那些测试人员了。在搜索空间如此广阔(explosion)之下找到bug最好的就是让用户成为最广大的同盟军了。

前面说到,我的最大的伤就是在于分布在家目录下的各种配置文件了。Linux还是有很大程度上遵循了Unix的遗留的设计理念,文件都是数据流。这样,所看到的配置文件很多都是文本文件。《Unix编程思想》中曾经说到,当Linux的提示“您选择的文件用该程序无法打开”时就是它背叛Unix的开始(大概就是这个意思吧)。反过来说,之前那些从Unix移植过来的工具都还是清一色的“Unixy”的。这导致的一个问题是很多工具都有各执己见,用自己的特有的文件配置格式,这种情况比比皆是。比如vim和emacs这被Linux黑客盛传是世界上为数不多的三种editor的两者,如果不花费各种精力配置的话其用途居然还不如一个简单的notpad用得舒坦。而不得不说,这两个利器的学习曲线是如此陡峭以致于只有真正牛逼的人和装逼的人才会说它们是法宝。配置文件以dot和rc而享誉Linux界;这和Windows的注册表并称双煞。在配置角度上它们没有注册表那样的统一格式,取而代之的是集市一般的自由洒脱——换句话说是散乱;由于没有一个“仁慈的独裁者”制定规则导致各行其道、百家争鸣。然而,它们伪善的可读性、系统独立性和系统对于配置文件的放置惯例让崇拜者们将这视为一大优势。试想,没多少人可以无聊到将注册表导出并放到github上吧?不过问题最大在于定制配置文件的过程之艰辛,我曾经花费了好多天来写bash、vim、conky等的配置文件,最后发现由于没有全局的统领导致整体的体验并不好。花费了这么多时间去做了一件可有可无的事(毕竟配置文件写得再好最多不过说明你是一个好的user而不是一个developer),而这些事件本可以用来做那些优先级更高的事(比如写写代码看看书之类),岂不更好?所以这次,我是选择了用sontek的成果。为何不站在巨人的肩膀上呢?Linux下的配置文件就是这样一个好处(但这也许是一个坏处):拿来即用。然后我所要做的就是慢慢适应sontek的做法,适时做些改进。其实,做research等不都是按照这样一个思路进行的吗?

以前的binary文件和各种都没了,这是永恒的痛,想起来都大有“黄鹤一去不复返,白云千载空悠悠”之感。尤其是在空荡荡的硬盘之下。

NoTech Comments(2) Thu, 14 Jun 2012 19:56:55 +0800

一次不愉快的尝试及思考(2)

在尝过了那种菜鸟特有的稍有一点胜利就自鸣得意之后,被冲昏头脑的我在稀里糊涂之下误以为使用fdisk调整了分区号的同时将物理位置也改变了。然后,我d掉了根分区了.............................................................................

再次重启时看到grub rescue时还微微一笑,小case,我已经是身经百战的人了,对这点小事还不驾轻就熟?然而,每次insmod时总是file not found或file system not recognized。百思不得其解,最终才发现我实在是遭天谴了。

当时那个心情啊,简直肠子都青了,悔恨,抱头,撞墙之心油然而生。要知道,我是废了多大的精力才将Linux的系统配置成我喜欢的样子的啊;而家目录中的dotfiles和那些binary包花费了我多长时间才搞定呢。

伤心之余,不由得骂起fdisk了,当时在删除的时候,居然没有特别对待一下这个根分区,好歹你也提示一下这样的操作极度危险之类的呀!我知道这正是你牛逼的地方,削铁如泥莫过于此;gparted望尘莫及。正如c语言的指针操作强悍无比一样,对内存的操作其他语言只有袖手旁观。但是,告诉用户这种行为的后果你会死啊!比如像删除某些重要的package时shell会提示用户输入一个字符串来确认用户明白知道所作所为,那这种极具杀伤力且无法挽回的操作只是告诉用户只有在reboot之后才能生效,是何居心?光凭这点,我就可以加入unix痛恨者之列了。不禁想起了rm -rf /这样的操作和fork炸弹了。这样的设计确实蛮符合Unix的哲学的。王垠大哥最近吐槽“Unix is simple. It just takes a genius to understand its simplicity.”这话恰和“The clothes made of this material are invisible to any man who is unfit for his office or unpardonably stupid.”有异曲同工之处。窃深以为然。Everything should be made as simple as possible, but not simpler.

不过还是想挽回点,用了livecd并找到了testdisk这样一个磁盘修复工具。在进行长达20分钟的deeper search之后,居然成功地定位到我前面数次磁盘格式化及删除操作。其中的一个插曲就是由于testdisk也是一个simple的工具,按q之后居然没有任何提示是否保存查询信息的操作,以致于我稀里糊涂下按了两次“成功”完全退出了搜素结果从而不得不进行第二次搜索。可是testdisk也没成功恢复出根分区的内容,提示分区损坏。

这下的我万念俱灰了,我知道肯定有修复的方法;但是已经没有这个精力和耐心去折腾了。重装吧,这是最不想做的,可不得不这样。

这种不快的经历,让我重新认识到Unix的哲学并不是那么正确的,至少对一部分人是不适合的。Unix的“无为”的做法是需要user花费巨大的代价来维护的;当然可以将Linux调教得服服帖帖,但是前提是你得先被它蹂躏得非常乖觉了。总有人将Unix和C联系在一起,的确因为设计者的思想的固化导致这两者成为杀人越货的利器的同时也总是伤人一千、自损八百。这两者都是野马,只是不是所有人都能驾驭。

NoTech Comments(0) Thu, 14 Jun 2012 19:56:27 +0800

一次不愉快的尝试及思考(1)

将笔记本中的磁盘都重新格式化为了ex4,但是它在Windows世纪还残存的种种分区的不合理之处实在让我这个有各种强迫症的人感到很不自在。然而问题在于,由于我一直用的是Ubuntu,因此从来没有深入理解过和Linux内核有过半毛钱关系的东西;这次不愉快的fdisk就是一个惨痛的教训——因为我的naive竟然将根分区给格式化了,并且在修复数据无果的情况下最终选择了重装。而最大的教训莫过于像我这种吊丝根本不配用Linux。

首先,我还是选择的是gparted,这是一个界面很友好的软件,其傻瓜程度对比Windows下的PQ等磁盘管理工具; 管理器有过之而无不及;事实上我就是用这个来进行格式化的。当然这个软件设计得比较雷人的地方在于,当磁盘选择格式化操作但还处于挂起状态时居然是不可以继续标记磁盘label。Unix是有个观点是做一件事并做得最好,但是这种类似“语法糖”的东西加上去完全应该是在情理之中吧,况且在GUI下的软件设计理念本来就是应该和CLI下有所区别的。之所以没有用gparted来调整分区的原因在于它不够强大。因为笔记本嘛一块物理硬盘被分割成的多块逻辑分区,而不巧的是我的根分区所在的逻辑盘恰好是出于物理分区的中间位置,然而更可悲的是这个分区的逻辑号恰好是最大的一个(所以每次在使用fdisk -l时总是在总是提示分区顺序不一致的情形,此是后话,容我慢慢细谈)。而gparted在删除分区之前的一个必要条件是比所删除的分区逻辑号大的分区都必须都已经先卸载(umount)了。

那么最先的想法就在:是否可以用gparted来先调整逻辑分区的number?据网上的结果还不可以。于是gparted只把我带到了这儿,剩下的由fdisk来进行吧。fdisk是一款Linux发行版都自带的分区表创建和操作程序,在ubuntu/debian下是打包在util-linux底下的;这组工具的牛逼之处在于如果没用过一半以上完全不好意思说自己搞过运维,没听说过其中的command的话完全不好意思说自己是Linuxer。fdisk尽管是个上层的外部命令,但确实是一把不错的瑞士军刀;只是如此犀利,以致于我辈菜鸟总是划伤自己。

fdisk /dev/sda

界面是个menu,内容还是蛮多的,不过我只用到了m(打印帮助)、p(打印分区信息,相当于直接fdisk -l)、d(删除分区)和x(扩展模式)。“扩展模式”(extended)中有一个选项f传说是可以调整逻辑分区的次序的,可是如果尽管写回(w)了当你使用df或gparted来查看时仍然会显示原来的逻辑号(尽管这时fdisk已经固执己见地认为一切已经ok了);貌似是需要重启的,然后可以看到分区号的确是变化了。(然而,令我迷惑的是在我重装之后调整逻辑号,在重启时分区号没有变化,这是什么原因呢?)

----------------------------休息一下----------------------------------

这里顺便记录对分区的理解。Linux中规定每个硬盘设备最多有4个主分区(primary),但是可以扩展分区(extend)可以让一个Linux的系统存在多于4个分区;Windows早期只承认一个主分区(传说中的ghost等系统安装工具中的“一键将磁盘分成四个分区”事实上是1个主分区+3个逻辑分区;这估计是历史遗留问题吧)。主分区和扩展分区的差别在于,只有主分区可以安装有bootloader;而一般的双系统中的Linux的根分区都是在逻辑分区的,和引导程序所在的分区(比如Windows的c盘)并不在同一个地方。话虽如此,但是扩展分区整体还是占用了一个主分区号,而各个实际的扩展分区部分的逻辑分区(logic)又占了各自的号码。对于每个IDE或者SCSI设备,Linux囫囵吞枣似地分配了16个序列号码;同时规定了主分区(或扩展分区)的号码必须是1~4之间的数字;所以这样,其他那些逻辑分区只好处在了5-16的位置了。从前重装系统时看到分区表的逻辑号总是没有3,4,现在想想我实在是弱爆了(1自然是主分区了,2是后面所有逻辑分区形成的扩展分区,5开始就是逻辑分区了)。按照这个说法,一块正常的硬盘最多可以用到的是15个“感觉得到”的分区(3个主分区+1个由12个逻辑分区组成的扩展分区)。

--------------------------继续痛苦回忆------------------------------

接下来fdisk删除分区了;p一下看看分区表;d之后在提示下输入对应的分区(/dev/sda#格式)。然而,由于仅仅只有一个物理盘,在写回之后提示设备忙且只有在重启或运行partprobe/kpart才能真正调整刚才的操作。但事实上我用了partprobe之后仍然提示无法进行这样的操作;本着不折腾的心只好重启。顺便说一下,从这里已经可以发现fdisk的强大之处了;因为这玩意儿gparted之流是不做的。

当重启电脑的时候,就出现了能够让我这种菜鸟诟病不已而让高手洋洋得意的情景了。grub rescue。。。

什么原因呢?被删除的这块逻辑分区就被丢到了三不管的乱坟岗中,原来删除的逻辑号现在已经不复存在了;“后面”的逻辑盘符就得依次减一。可是grub还是在那里墨守成规,依旧我行我素;结果呢,顺着bootloader中提示的方向再也找不着Linux中加载模块(如normal.mod)的地方了。不过修复这玩意儿还不是很难,原因就在于grub支持的命令实在太少了,而且修复的目标太单纯了:整个过程就是帮助如何寻找缺失的文件。rescue下的命令有set,ls,insmod,root和prefix。

从set可以看到当前的配置信息并可以重新设置新的配置信息。

 

grub rescue>set
grub rescue>prefix=(hd0,msdos8)/boot/grub
grub rescue>root=hd0,msdos9

root是主分区或逻辑分区的盘符;prefix则是模块所在文件夹的路径。注意这里的盘符和Linux中使用的又有所不同,具体可以参看这个页面。围观set的输出,看吧,grub犯二了,还是把我原来的/dev/sda9当成了根分区;而事实上现在已经变成了/dev/sda8。那么如何知道现在已经有了的分区呢,瞎猜可不行?ls!一看就知道是显示分区及文件系统信息的了。不仅可以直接ls,而且可以ls(hd0,msdos5)/boot/之类的,总的来说就是它具备了一个最基本的ls应该具备的功能了。

这下就不用担心了。找到了模块的位置,接下来就是重设root和prefix,

 

grub rescue>set prefix=(hd0,msdos8)/boot/grub
grub rescue>set root=(hd0,msdos8)

据说前面的set以及第二行的括号都是不必须有的;不过这无足轻重。下面加载模式

grub rescue>insmod /boot/grub/normal.mod
grub rescue>normal

如果第一行不显示找不到文件之类信息的话大可进入系统了。但是这样的修改不是永久的,如果发行版没有相应的措施的话下次还得继续手动修改。最简单的做法莫过于grub-install或update-grub了。

到目前为止至少一切还都顺利,只是在我被胜利冲昏头脑时,接下来的事着实让我可以理解RMS在包掉了之后的心情了。下篇继续。

NoTech Comments(0) Thu, 14 Jun 2012 19:56:02 +0800