Latest Publications

n900,第三天

基本上把我该装的东西都装够了. rootfs还剩11M,反正还够用,所以暂时不去清理。我觉得最该被清理的就是apt-get/dpkg的那些cache文件,哗啦哗啦几十M就没了。网上满天飞的什么“优化N900的rootfs”,进去一看,不过是把一些目录软链接到ext3的分区上。其实,用mount也能达到同样的效果(只不过对于不解内情的用户这个危害更大)。不明事理的优化是万恶之源啊,比如,把font目录挪出去真是不应该,因为几乎每个应用程序都会去读这个文件。字体就应该装在自己的~/.fonts目录下,如果这个字体很常用,就应该放在rootfs里。

n900的一个很大的问题就是package依赖的问题。举个例子,我想装一个闹钟程序,但是它是用qt写的。所以我安装的时候就连QT一起安装了。后来我不想要这个闹钟了,我就把闹钟卸载了,但是QT呢?依然会被保留在系统中。日积月累,垃圾package就越来越多,对于PC,这不是什么问题,顶多占点硬盘,顶多update的时候多耗的时间,可是对于N900,这是一个非常严重的问题,因为它的“硬盘”就是内存,NAND Memory。这是非常稀缺的资源。而对于End User而言,别指望都能明白这每个package的作用,哪些是可以被删除的。于是越来越多的人发现rootfs不够用,然后去“优化”。其实rootfs不够用另外一个常见的原因就是用完apt之后没有进行apt-get clean,释放/var/所占的空间。

相比于apt-get update,每天执行的更多的是hal-device bme,查看电量。因为nokia自带的那个电量显示很诡异,一共7个格子,第一个格子代表了50%的电量,还不显示百分比。orz。。。

昨天我兴冲冲的把syslog装了,结果发现用途竟然不大,每天的日志很少,大部分程序都不使用syslog。cron暂时还没找到,sendmail也别想了,但是最好还是找个轻量版的sendmail,否则为手机增加uucp和mail relay的功能简直和拿n900玩星际一样脑残!(p.s.上周末我有幸见到diablo2的制作人了)

n900,作为一个手机,电话本的功能太残废了。连分组都不支持,因为我登陆了skype/gmail,它就把这些联系人以及我本身的号码本粘在一起,上千个啊!经常看见几个联系人是同样的名字,实际就是一个人,但是没有简单的操作能merge成同一个。并且我怀疑这样的merge是否可能。因为如果把skype/msn的联系人信息合在一起并删除掉一个,这个人大概就真的从msn/skype上消失了。短信的功能也很次。彩信还需要第三方的软件,并且还不完善。

我试了一下,在打开wifi,并且不选择wifi省电模式的情况下,我的手机在2个小时内跑掉了70%的电量。于是,我总是在充电。

我拿默认安装的kmplayer去播放avi,发现没有把字幕挂上,后来才发现它的backend不是mplayer,于是就用apt去装mplayer,然后换上,发现真的很爽。YY下,屏幕要是能再大一点就好了,嘿嘿。

在这种键盘上玩emacs铁定是个很折磨人的事情,所以我就没装emacs,用内置的vi先凑合着。

n900既然跑的是linux,那么安全性也不可与其它低端手机同等对待。netstat 没有-p选项,我就只好用lsof去找谁打开了哪些端口。很奇怪的是keepassx居然会监听tcp/udp端口,是在公共IP 0.0.0.0上监听,而不是127.0.0.1。它要做什么?另外,没有iptables,随意的下载二进制文件但是没有数字签名也没有杀毒软件,是多么可怕的一件事情啊。

最后说一个算是BUG的东西吧:

当n900用usb和电脑连接,并选择mass storage mode之后,那么它的那个fat分区就会消失,并挂载到PC上。可是,这里面包含了很多程序使用的时候需要的文件夹(例如地图数据),比如,此时打开ovi map,就会重新下载地图文件,放在那个2G的ext3分区上(而不是那个20多G的fat分区)。等拔掉USB,过一小会儿才会重新mount上,在这个间歇期间打开ovi map也会因之产生一些很奇怪的行为,而这些事情是很难给End User解释清楚的,要知道有多少人在用nokia的手机,而只有多少人懂得ext3/mount是什么?就像我现在的win7,C盘的剩余空间莫名其妙增加减少几个G,而我全然不知所措,不知道到底为什么,发生了什么,变成红色、报警的时候我要做什么。

test my n900 mobile phone

从手机上写点东西试一试

nokia的n900实在是太有意思了

我买不起蓝牙键盘,但是它有ssh,非常好使

每天必须要执行的命令:apt-get update

刚装好nmap/wireshark,我正在寻觅syslog/sendmail。

文件系统丰富多样,它独特的rootfs,自带的ext3/fat,可装的samba。用fuse读写zfs/ntfs也只是迟早的事情吧。

作为nokia最贵的机型,居然不支持彩信!操作界面难用的一塌糊涂,xterm是王道。自带的文本编辑器有2个,一个手写一个输文字的,居然是分开的,并且,没有清空按钮。回到之前,命令行是王道,我不喜欢vi,我正在装emacs。

不知道何年何月才能支持拼音查找电话本。我的contacts有900多个……正在加速膨胀中。原因:sim卡的、qq的、skype的、msn的都被列一起了。没有方便的查找功能,真的会死人滴!

———————————————————————

经常会getpty失败

例如:Can not write log, openpty() failed (/dev/pts not mounted?)

后来发现原来是ssh连接因为wifi的自动省电设置导致断线,而ssh进程还在,pty也没有释放。把僵死的进程kill掉就好了

2010-02-02

solaris的ps工具是建立在procfs之上的,而freebsd的ps工具似乎是通过kvm_xxx实现的。但是kmv_xxx中还有极少数的函数依然是依赖于procfs的。
solaris的/proc目录下只有子目录,没有普通文件。freebsd的/proc的包含一个符号链接curproc。linux则是变态至极,什么的东西都往里塞。

举个例子,在linux,想看有几个cpu有多少内存,直接看/proc下的文件即可
如果是freebsd,那么最好的方式就是sysctl hw.physmem。无论是对于程序员还是系统管理者,都可以方便的使用sysctl
如果是solaris,那么就应该用prtconf

今天在solaris下做这个测试

测试代码如下:
#include <stdlib.h>
#include <unistd.h>
int main(){
void* p=malloc(512*1024*1024);
if(p==NULL) return -1;
sleep(10000000);
return 0;

}

然后我用g++ 4.3.2编译
g++-4.3.2 -o testm testm.c

开了5个,开到第6个的时候,malloc就返回-1了。可是,可是,令人惊奇的是
这个时候,我无论是用vmstat还是用mdb看,我都还有大量的空闲的物理内存
>::memstat
Page Summary                Pages                MB  %Tot
————     —————-  —————-  —-
Kernel                     144849               565   14%
ZFS File Data               62043               242    6%
Anon                       146323               571   14%
Exec and libs                3640                14    0%
Page cache                  34357               134    3%
Free (cachelist)            35896               140    3%
Free (freelist)            600734              2346   58%

Total                     1027842              4015
Physical                  1027841              4015
这与我开这几个程序之前,没有明显的变化。(相比而下,在windows下,这个时候系统已经卡的快嗝屁了)

然后我用ps来看
# ps -eo pid,vsz,rss,args |grep testm
1298 527292 1356 ./testm
1309 4224 1256 grep testm
1300 527292 1356 ./testm
1302 527292 1356 ./testm
1296 527292 1356 ./testm
1304 527292 1356 ./testm

# pmap 1296
1296:    ./testm
08046000       8K rwx–    [ stack ]
08050000       4K r-x–  /tmp/testm
08060000       8K rwx–  /tmp/testm
08062000  524296K rwx–    [ heap ]
FEB70000     320K r-x–  /lib/libm.so.2
FEBCF000       8K rwx–  /lib/libm.so.2
FECD0000      24K rwx–    [ anon ]
FECE0000    1280K r-x–  /usr/lib/libc/libc_hwcap1.so.1
FEE20000      28K rwx–  /usr/lib/libc/libc_hwcap1.so.1
FEE27000       8K rwx–  /usr/lib/libc/libc_hwcap1.so.1
FEE30000      52K r-x–  /usr/lib/libgcc_s.so.1
FEE4C000       4K rwx–  /usr/lib/libgcc_s.so.1
FEE50000       4K rwx–    [ anon ]
FEE60000     856K r-x–  /usr/lib/libstdc++.so.6.0.10
FEF45000     160K rwx–  /usr/lib/libstdc++.so.6.0.10
FEF6D000      24K rwx–  /usr/lib/libstdc++.so.6.0.10
FEF80000       4K r–s-  /var/ld/ld.config
FEF90000       4K rwx–    [ anon ]
FEFA0000       4K rw—    [ anon ]
FEFB0000       4K rw—    [ anon ]
FEFBE000     180K r-x–  /lib/ld.so.1
FEFFB000       8K rwx–  /lib/ld.so.1
FEFFD000       4K rwx–  /lib/ld.so.1
total    527292K

系统的确给这个进程分配了地址空间(看它的heap有多大),但是压根儿就没有给它分配物理内存。我想不出的是,它依据什么来拒绝新的申请。
由于环境有限,我没有找到良好的环境在freebsd下重复这个实验。我在freebsd.unix-center.net上做这个测试,但是把每个进程分配的内存缩小到64M,然后开了100个这样的进程,据估计至少需要6G的内存,malloc一直都是成功的,我的手酸了,懒得弄了。

最有趣的在于这个:
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(){
void* p=malloc(512*1024*1024);
if(p==NULL) return -1;
memset(p,0,512*1024*1024);
free(p);
sleep(10000000);
return 0;

}

用ps/pmap去看,事实证明,free函数根本就没有释放物理内存。free是把malloc得到的物理内存还给了自己进程,而不是还给了操作系统。
在这一点上,freebsd是有差别的。执行完free之后,rss明显降了下来

no title

美国人给twitter制造点小故障,然后大规模攻击baidu,然后引发第三世界大战。我这个假设成立吗?

爱国主义本来就应被高度警惕,盲目的爱国情绪更是可怕。我若是baidu的管理层,我也愿意主动来演这么一遭苦肉计,以淡化google退出中国对baidu的谩骂。

一事当前,先问真假,后断是非,再说利害

今天发生的一件很寒心的事情

2009年最后一个月的工资发了。连带未休的年假的补贴一起。

某同事,因为08年实习的时候请了半个多月的假回学校答辩,导致09年没有年假。hr的理由是他08请假太多了,而事实是当时他还未入职,连劳动合同都没有。实习期之后签劳动合同之后才是漫长的试用期

另外一个同事,说他年假的天数不对。hr答曰:第一年没有年假,第13月开始每个月有5/12天的年假。于是我的同事就拿出劳动法理论,说他今年不是第一年工作,hr就要求该同事找管档案的开据劳动证明说明今年不是第一年参加工作。我同事问为什么入职的时候的离职证明上的日期不能算,答曰:不算就是不算。

你说这算什么事儿啊这!

一切福利待遇都按劳动法的最低要求来,工作环境比我老家的网吧还拥挤、空气比那网吧还差。好不容易中秋节想起来关怀下员工,每人发了2个月饼,很普通的月饼,结果,这月饼还是因为质量不合格被强迫从超市下架的,细菌含量超标。

但并不是央企就好。某同学说,他们从来没有不休年假就补钱的说法。所以有机会一定得休。也是啊,你说,国企什么时候缺人干活了?

无耻的404劫持

从freebsd的网站,按照如下网址下载一个软件(一个屡次被多种杀毒软件报告为盗号木马的聊天软件)
#wget -c ‘http://www.freebsd.org/yy-2.1.2.exe
–22:58:20–  http://www.freebsd.org/yy-2.1.2.exe
=> `yy-2.1.2.exe’
正在解析主机 www.freebsd.org… 69.147.83.33, 2001:4f8:fff6::21
Connecting to www.freebsd.org|69.147.83.33|:80… 已连接。
已发出 HTTP 请求,正在等待回应… 302 Found
位置:http://219.239.26.5/download/2203814/3118780/1/exe/1/117/1260924550401_373/yy-2.1.2.exe [跟随至新的 URL]
–22:58:20–  http://219.239.26.5/download/2203814/3118780/1/exe/1/117/1260924550401_373/yy-2.1.2.exe
=> `yy-2.1.2.exe’
Connecting to 219.239.26.5:80… ^C

事实上,这个文件是根本不存在的。

还可以随意的修改网址,只要保证依然是以这个文件名结尾
# wget -c ‘http://www.freebsd.org/sfdaii234/yy-2.1.2.exe
–22:59:30–  http://www.freebsd.org/sfdaii234/yy-2.1.2.exe
=> `yy-2.1.2.exe’
正在解析主机 www.freebsd.org… 69.147.83.33, 2001:4f8:fff6::21
Connecting to www.freebsd.org|69.147.83.33|:80… 已连接。
已发出 HTTP 请求,正在等待回应… 302 Found
位置:http://219.239.26.5/download/2203814/3118780/1/exe/1/117/1260924550401_373/yy-2.1.2.exe [跟随至新的 URL]
–22:59:30–  http://219.239.26.5/download/2203814/3118780/1/exe/1/117/1260924550401_373/yy-2.1.2.exe
=> `yy-2.1.2.exe’
Connecting to 219.239.26.5:80… ^C

还可以修改版本号,只要保证这个版本的确存在,比如2.0.2,而不是尚未发布。比如2.3.2或3.0.2

换个域名也无所谓。别换成政府网站或者sina/sohu
#wget -c ‘http://www.17ka.com/sfdaii234/yy-2.0.2.exe
–23:01:52–  http://www.17ka.com/sfdaii234/yy-2.0.2.exe
=> `yy-2.0.2.exe’
正在解析主机 www.17ka.com… 124.172.111.137
Connecting to www.17ka.com|124.172.111.137|:80… 已连接。
已发出 HTTP 请求,正在等待回应… 302 Found
位置:http://219.239.26.19/download/1571043/1662690/3/exe/92/185/1257429033820_953/yy-2.0.2.exe [跟随至新的 URL]
–23:01:52–  http://219.239.26.19/download/1571043/1662690/3/exe/92/185/1257429033820_953/yy-2.0.2.exe
=> `yy-2.0.2.exe’
Connecting to 219.239.26.19:80…

测试环境:
# uname -a
SunOS opensolaris 5.11 snv_111b i86pc i386 i86pc Solaris

# wget –version
GNU Wget 1.10.2

Copyright (C) 2005 Free Software Foundation, Inc.
此程序发布的目的是希望它会有用,但它不作任何保证;
甚至没有可售性或适用于特定目的的保证。
详情请查看 GNU General Public License。

最初由 Hrvoje Niksic <hniksic@xemacs.org> 编写。

打包并加密

打包并加密:

tar -cvf – myfiles | openssl enc -des > myfiles.tar

解密并解压:
openssl enc -des -d < myfiles.tar | tar -xvf – -C /tmp

优点:
1、所用的所有工具都是开源的,不会有后门。
2、多种加密算法可选。

thunderbird关不掉的问题终于找到了

我的thunderbird最近一个月总是关不掉,窗口叉掉后进程还在。只能强行从taskmgr中杀掉。否则不能打开新的

今天在卸载所有addon之后问题依旧。最终发现,原来是因为我在安全设备中加载了一个第三方的pkcs11 dll,而那个不能正确卸载。

huge page

使用大页面最大的好处是提高TLB的命中率。对于单个进程,它可以一部分内存是4K的大小page,一部分内存是2M大小的page。操作系统本身在kernel mode下已经很广泛的使用大页面。

windows下在C/C++程序中使用大页面:
http://msdn.microsoft.com/en-us/library/aa366720(VS.85).aspx

要让linux支持大页面,需要在编译kernel的时候打开CONFIG_HUGETLBFS和CONFIG_HUGETLB_PAGE (在file systems下)
具体参见:http://www.mjmwired.net/kernel/Documentation/vm/hugetlbpage.txt

linux/windows下在java中使用大页面:
http://java.sun.com/javase/technologies/hotspot/largememory.jsp

freebsd对大页面的支持是从7.2开始的。用sysctl设置vm.pmap.pg_ps_enabled=1,操作系统会自动选择page size。因为这个也是最近一两年新加进来的,所以文档比较少。

至于数据库中的PAGE_SIZE为什么通常是4K,这个是为了保持和文件系统的block size保持一致。在class PageFile中使用pread/pwrite读写文件的时候,操作系统首先会去文件系统的cache里面查找。如果db.h的PAGE_SIZE小于文件系统的block size而这部分文件内容又不在cache中,可能会导致操作系统必须先执行一次read操作把数据读出来,然后modify一部分,然后写入磁盘。如果db.h的PAGE_SIZE大于文件系统的block size,会导致单个page的读写在kernel中需要执行多次read/write。

在linux下用xfs_info可以查看xfs的block size,bsize字段就是。