2005年December月 发布的文章

用MagicLinux做桌面

很久没有用过 Linux 作桌面了,在很久很久以前,用Linux做桌面的不是英文小神童,就是忍者。那时候的Linux桌面不调理上一个星期很难到一个顺手的境界。配声卡,配网卡,配X/显卡,配中文,配WM,哪个都得折腾一阵子。所以除了只编程不需要任何娱乐的哥们,很少有人专门用Linux做桌面。后来时代发展了,一方面Linux驱动不断增加,另一方面硬件厂商不断兼并,到现在 Linux 对主流硬件的支持已经算比较好了。但是中文支持还是一样的衰。大部分dist的中文显示都发虚,各种软件里面默认设置的编码都不是中文,等等。虽然说这些事情都可以自己慢慢装各种补丁,改系统配置之类搞定,但是我还是不太喜欢用Linux来作桌面,毕竟 OS 是拿来用的,不是用来死磕的。

MagicLinux 是中国人改的一个RPM based Linux 发行版,我比较喜欢他的原因是开发者比较正常,不会像opendesktop之流拼命追求界面像Windows,结果弄到不伦不类,也不像红旗之流面向政府机构里面不会用Linux的人,弄出来一些功能很弱的web管理界面。

MagicLinux 目前的版本是 2.0 rc2 ,只有一张安装盘,安装的时候没有的可选,只能全装,而且 installer 还有不少不足之处,比如不支持 USB 光驱和网络安装,没有 IDE 光驱的人只能用 vfloppy + 硬盘安装。他的 kernel 默认是加了 ntfs 支持的,installer 还会在安装时候检测所有的分区,并把所有 Windows 分区都 mount 到 /mnt 下面很多目录下面,可写的分区都 mount 成 umask = 0 的,我很喜欢这一点。

MagicLinux 另一点很令人欣赏的地方是他非常新潮,系统自带的软件通常都是一些你以前可能很少听说过,但是确实很好用的软件。我最初见到 Beep Media Player 就是在 ML 1.0 里面。那时候没有一个 dist 里面默认带 BMP。ML 1.2 则是直接用了 KDE 里面的 amarOk,。 此外, ML 里面还针对国内上网需求,内置了很多只有国人才用得着的软件,比如 BT 客户端,SCIM, eva(QQ客户端) 。装好 ML 以后基本什么都不用改,就可以直接用来上网听歌聊天了。

MagicLinux 的开发者是一个 KDE 爱好者,默认设置的各种工具大部分都是 KDE 里面的,当然KDE也确实争气,颇有几个软件还挺好用的,相比起来gnome真是一个扶不上墙的阿斗,做了这么多年,拿的funding比KDE也多了不少,结果到现在还是基本没有什么特别好用的东西,只能靠各种零散用 gtk 的程序来撑场子。人家 KDE 非常完备的一套玩意都出来了,上到KOffice, 下到 KHTML 。

这篇文章就是在 MagicLinux 下面,用 Konqueror ,SCIM 贴上来的。同时用 amarok 放歌,用 k3b 刻 DVD,用 eva 上 QQ, 用 Kopete 上 MSN 。

有趣的Winsock扩展

Winsock 大部分函数都是从 BSD socket 来的,不过 Winsock 做了不少扩展,其中有不少相当有趣。

1: 异步Socket: 这个是 Winsock 的最大亮点,不过很多人都知道,就没有那么有趣了
2: ConnectEx 和 AcceptEx:这俩函数看起来是个批处理操作,比如 AcceptEx 就等于 accept + 一次 recv,这看起来很没道理,有必要这么兴师动众吗?其实不然,在高负载情况下面,accept 加一次 recv 就多了一次无谓的进程切换。可能会造成响应时间大大增加,特别是像 HTTP 这样初始发送数据通常非常少的协议,很适合用这一对。
3: TransmitFile 和 TransmitPackets:这个基本可以认为是 sendfile 和 writev 的变种,不过TransmitPackets 比 writev 高级在于他也支持像TransmitFile/sendfile那样的句柄作为输入。
4: WSARecvEx :这个比较的没有特点,不过这个函数支持收取半截的UDP Data , 用 recv 直接收取的时侯,如果 UDP Data 比 buffer 大,就会失败一次,得准备更大 buffer 来接收,用 Ex 版本好处是可以少一次上下文切换。
5: 对于传统的 BSD socket, Winsock 也进行了一些扩展,这个下次再补上

-=待续=-

Apache 2精简版本

去掉所有mod, 只用来作 pv log,同时用 icc 编译之

CC=icc CXX=icc AR=xiar LD=xild CFLAGS=”-O3 -ipo -axKWP -funroll-loops -unroll256 -static -mcpu=pentium4 -mtune=pentium4 -march=pentium4 -fomit-frame-pointer -static-libcxa -cxxlib-icc -i-static -fno-exceptions -no-prec-div” LDFLAGS=”-ipo -static” ./configure –with-mpm=leader –disable-access –disable-auth –disable-include –disable-env –disable-setenvif –disable-mime –disable-status –disable-autoindex –disable-asis –disable-cgid –disable-cgi –disable-negotiation –disable-dir –disable-imap –disable-actions –disable-userdir –disable-alias –disable-so –enable-nonportable-atomics=yes

不要使用 cp 替换正在使用中的Linux 动态库

记得以前如果一个.so被 load 了,应该和程序本身一样,不能覆盖啊,强行覆盖也不会覆盖原来的inode,而是创建新的inode并替换当前目录里面的inode, 原来打开的文件还是正确的。

但是最近发现在 Linux i386 上面 load .so 以后覆盖 .so ,没有任何提示,正在运行的程序退出时侯则通常都会 segfault.  和 sparc 很像了。

难道我记错了吗?

用 strace 看了一下,cp 打开目标文件的时侯,都是在 open 加 O_WRONLY|O_TRUNC|O_LARGEFILE 参数,但是打开正在使用的程序时,就会返回 ETXTBSY, 动态库直接成功。

怀疑 ld-linux.so 在处理 .so 时侯是不是有什么问题,于是 strace 了一下动态库的 load 过程, 发现就是 open O_RDONLY 以后mmap 加 MAP_DENYWRITE 参数,但是 man 了一下 mmap, man page 说这个 MAP_DENYWRITE 参数现在已经被忽略了,原因是会造成 denial of service (我不是很明白这个为啥会造成 DoS),看起来就是这个原因了,mmap 这样并不能阻挡其他程序改写 .so 文件。

但是为啥主程序就可以呢?还是得看 kernel 代码。发现 kernel 内部在加载主程序的时侯,是用的 do_mmap 函数来 mmap 文件的(binfmt_elf.c),参数也有 MAP_DENYWRITE,因为是 kernel 内部函数,所以这个 MAP_DENYWRITE 实际是有效的,在 do_mmap_pg_off 函数(mmap.c)里面也确实可以看到对 MAP_DENYWRITE 参数的处理。

结论就是,Linux ,至少是现在的 Linux 下面无法像 Windows 一样,保护正在使用的 .so 文件,因此开发过程中如果要更新代码,请不要使用 cp 这么粗暴原始的替换方式,还是用 install 来做吧

最近评论

时光机

其他