momo zone

调核人的blog

Monthly Archives: 三月 2010

linux 信号列表说明

 
$ kill -l
1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT 17) SIGCHLD
18) SIGCONT     19) SIGSTOP     20) SIGTSTP     21) SIGTTIN
22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO
30) SIGPWR      31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1
36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4  39) SIGRTMIN+5
40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8  43) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6  59) SIGRTMAX-5
60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2  63) SIGRTMAX-1
64) SIGRTMAX
列表中,编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。

下面我们对编号小于SIGRTMIN的信号进行讨论。

 

1) SIGHUP
本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。

登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个 Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进 程组和后台有终端输出的进程就会中止。不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也 能继续下载。

此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。

 

2) SIGINT
程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。

 

3) SIGQUIT
和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。

 

4) SIGILL
执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行数据段. 堆栈溢出时也有可能产生这个信号。

 

5) SIGTRAP
由断点指令或其它trap指令产生. 由debugger使用。

 

6) SIGABRT
调用abort函数生成的信号。

 

7) SIGBUS
非法地址, 包括内存地址对齐(alignment)出错。比如访问一个四个字长的整数, 但其地址不是4的倍数。它与SIGSEGV的区别在于后者是由于对合法存储地址的非法访问触发的(如访问不属于自己存储空间或只读存储空间)。

 

8) SIGFPE
在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误。

 

9) SIGKILL
用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号。

 

10) SIGUSR1
留给用户使用

 

11) SIGSEGV
试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.

 

12) SIGUSR2
留给用户使用

 

13) SIGPIPE
管道破裂。这个信号通常在进程间通信产生,比如采用FIFO(管道)通信的两个进程,读管道没打开或者意外终止就往管道写,写进程会收到SIGPIPE信号。此外用Socket通信的两个进程,写进程在写Socket的时候,读进程已经终止。

 

14) SIGALRM
时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该信号.

 

15) SIGTERM
程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。

 

17) SIGCHLD
子进程结束时, 父进程会收到这个信号。

如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。这种情 况我们应该避免(父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init进程来接管)。

 

18) SIGCONT
让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作. 例如, 重新显示提示符…

 

19) SIGSTOP
停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.

 

20) SIGTSTP
停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号

 

21) SIGTTIN
当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行.

 

22) SIGTTOU
类似于SIGTTIN, 但在写终端(或修改终端模式)时收到.

 

23) SIGURG
有"紧急"数据或out-of-band数据到达socket时产生.

 

24) SIGXCPU
超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变。

 

25) SIGXFSZ
当进程企图扩大文件以至于超过文件大小资源限制。

 

26) SIGVTALRM
虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.

 

27) SIGPROF
类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间.

 

28) SIGWINCH
窗口大小改变时发出.

 

29) SIGIO
文件描述符准备就绪, 可以开始进行输入/输出操作.

 

30) SIGPWR
Power failure

 

31) SIGSYS
非法的系统调用。

 

在以上列出的信号中,程序不可捕获、阻塞或忽略的信号有:SIGKILL,SIGSTOP
不能恢复至默认动作的信号有:SIGILL,SIGTRAP
默认会导致进程流产的信号有:SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ
默认会导致进程退出的信号有:SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM
默认会导致进程停止的信号有:SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU
默认进程忽略的信号有:SIGCHLD,SIGPWR,SIGURG,SIGWINCH

此外,SIGIO在SVR4是退出,在4.3BSD中是忽略;SIGCONT在进程挂起时是继续,否则是忽略,不能被阻塞。

10个比较酷的命令


  • sudo !!

    以 root 帐户执行上一条命令。

  • python -m SimpleHTTPServer

    利用 Python 搭建一个简单的 Web 服务器,可通过 http://$HOSTNAME:8000 访问。

  • :w !sudo tee %

    在 Vim 中无需权限保存编辑的文件。

  • cd -

    更改到上一次访问的目录。

  • ^foo^bar

    将上一条命令中的 foo 替换为 bar,并执行。

  • cp filename{,.bak}

    快速备份或复制文件。

  • mtr google.com

    traceroute + ping。

  • !whatever:p

    搜索命令历史,但不执行。

  • $ssh-copy-id user@host

    将 ssh keys 复制到 user@host 以启用无密码 SSH 登录。

  • ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg

    把 Linux 桌面录制为视频。

  • cmd !$

    把上个命令的参数作为参数。

  • ASUS R3E 主板

    有人说ASUS的玩家国度是华而不实,完全是暴发户的专利,但现在好像每次平台更迭时的记录保持者都是这个系列的主板。而且这个系列总的来说一直在不断改进,这次R3E的供电依然进行了更好的改进,usb3.0 和4X8XPCI-E 也都有了,新加了蓝牙无线超频(噱头啊),当然BIOS系统依旧很无敌。
     

     

    调试kernel时对bios加电后过程的一些心得

    前几天折腾了一下kernel 并debug了引导和初始化部分,有一些心得,更正了一直以来的很多错误认识。
    这里还是拿linux 0.00 的代码来实验,制作好引导盘后启动 bochs (已重新编译加了 –enable-debugger –enable-disasm 参数)
     
    下图是IBM PC内存的分布状况:
    (注意:0xA0000 is the pointer address to the Graphical Mode and 0xB8000 is the pointer address to the Color Text Mode and 0xB0000 is the pointer to the Monochrome text Mode. 
     
    尽管上面很多区域在bios初始化后填充了内容但其实是可以将kernel 载入除640KB – 1MB 以及4G高位内存附近的任何存储空间中。因为BIOS提供的参数数据和中断向量kernel并不使用,可以被直接覆盖。
     
    下面总结一下整个过程:
     
     1.
    加电后cpu 的 状态是:
    eax:0x00000000, ebx:0x00000000, ecx:0x00000000, edx:0x00000543
    ebp:0x00000000, esp:0x00000000, esi:0x00000000, edi:0x00000000
    eip:0x0000fff0, eflags:0x00000002, inhibit_mask:0
    cs:s=0xf000, dl=0x0000ffff, dh=0xff009bff, valid=1
    ss:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
    ds:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
    es:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
    fs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
    gs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
    ldtr:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
    tr:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
    gdtr:base=0x00000000, limit=0xffff
    idtr:base=0x00000000, limit=0xffff
    dr0:0x00000000, dr1:0x00000000, dr2:0x00000000
    dr3:0x00000000, dr6:0xffff0ff0, dr7:0x00000400
    cr0:0x00000010, cr1:0x00000000, cr2:0x00000000
    cr3:0x00000000, cr4:0x00000000

    通过cs:ip可以发现第一条指令是在0xf000:0xfff0 执行的. 如果只读过大学那些涉及皮毛的书你肯定会认为其物理地址就是0xffff0 (0xf000<<1+0xfff0)。但这样的认识仅仅是针对i8086 ,真正的x86 架构即i80386 之后是这样的:cpu刚刚设置cs:0xf000的时候其实并不是像课本上说的那样在实模式下。此时的物理地址需要根据cs中的隐藏寄存器dl=0x0000ffff, dh=0xff009bff中去查。这个其实就是段描述符(至少在保护模式下是,这里也暂时这样称呼吧) dh的最高8位和最低8位以及dl的高16位组成了32位段基址:0xffff0000 再加上ip:0xfff0 那么物理地址就是0xfffffff0 正好是4GB空间的最后16Byte。
    即执行的第一条指令也在这里:
    (0) [0xfffffff0] f000:fff0 (unk. ctxt): jmp far f000:e05b         ; ea5be000f0
    跳转到真正BIOS程序的入口地址

    这里做很精妙,因为intel考虑到兼容性问题设置了cpu加电后cs:ip=0xf000:0xfff0: 如果是i8086那么该跳转指令将在16位cpu可寻址最大空间1MB(基本内存)的最后16Byte,如果是i80386则将在32位cpu可寻址最大空间4GB的最后16Byte。

    再反汇编看一下:

    <bochs:3> x /10 0xf000:0xfff0
    [bochs]:
    0x000ffff0 <bogus+       0>:    0x00e05bea      0x2f3730f0      0x302f3630      0xe4fc0035
    0x00100000 <bogus+      16>:    0x00000000      0x00000000      0x00000000      0x00000000
    0x00100010 <bogus+      32>:    0x00000000      0x00000000

    <bochs:4> u /10
    000ffff0: (                    ): jmp far f000:e05b         ; ea5be000f0
    000ffff5: (                    ): xor byte ptr ds:[bx], dh  ; 3037
    000ffff7: (                    ): das                       ; 2f
    000ffff8: (                    ): xor byte ptr ds:0x302f, dh ; 30362f30
    000ffffc: (                    ): xor ax, 0xfc00            ; 3500fc
    000fffff: (                    ): in al, 0x0                ; e400
    00100001: (                    ): add byte ptr ds:[bx+si], al ; 0000
    00100003: (                    ): add byte ptr ds:[bx+si], al ; 0000
    00100005: (                    ): add byte ptr ds:[bx+si], al ; 0000
    00100007: (                    ): add byte ptr ds:[bx+si], al ; 0000

    这里应为CR0的PE标志复位所以会显示不正确的物理地址(000ffff0,00100007等)

    2.

    但刚才那种即非实模式也非保护模式的特殊寻址方式不会持续很久,因为intel规定当这时cs再次载入值时cpu将完全进入实模式。也就是说刚才jmp far f000:e05b 导致cs载入0xf000(注意这个是长跳转哦) 这就使cpu进入实模式,而且物理地址即0xf000<1+0xe05b=0xfe05b (实模式段长64KB)
    反汇编看一下代码:
    (0) [0x000fe05b] f000:e05b (unk. ctxt): xor ax, ax                ; 31c0
    <bochs:3> n
    Next at t=2
    (0) [0x000fe05d] f000:e05d (unk. ctxt): out 0xd, al               ; e60d
    <bochs:4>
    Next at t=3
    (0) [0x000fe05f] f000:e05f (unk. ctxt): out 0xda, al              ; e6da
    现在的代码都是在1MB空间里执行的。

    3.
    执行完BIOS代码后(现在的BIOS 都相当大和复杂)默认从fd0(IBM PC传承的传统)将第一扇区的内容copy到物理地址0x7c00。 但有趣的是这里0x7c00处是一个长跳转指令,而且呈现的虚拟地址是0x0:0x7c00:
    (0) [0x00007c00] 0000:7c00 (unk. ctxt): jmp far 07c0:0005         ; ea0500c007
    单步执行后:
    (0) [0x00007c05] 07c0:0005 (unk. ctxt): mov ax, cs                ; 8cc8

    可以看到重新加载了cs寄存器,但物理地址还是紧接着跳转指令。从dump_cpu中也可以看到:

    eax:0x0fffaa55, ebx:0x00000000, ecx:0x00110001, edx:0x00000000
    ebp:0x00000000, esp:0x0000fffe, esi:0x00007362, edi:0x0000ffde
    eip:0x00000005, eflags:0x00000082, inhibit_mask:0
    cs:s=0x07c0, dl=0x7c00ffff, dh=0x00009b00, valid=1
    ss:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=7
    ds:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
    es:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
    fs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
    gs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
    ldtr:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
    tr:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
    gdtr:base=0x00000000, limit=0xffff
    idtr:base=0x00000000, limit=0xffff
    dr0:0x00000000, dr1:0x00000000, dr2:0x00000000
    dr3:0x00000000, dr6:0xffff0ff0, dr7:0x00000400
    cr0:0x00000010, cr1:0x00000000, cr2:0x00000000
    cr3:0x00000000, cr4:0x00000000

    不过这样做的目的还真的不太清楚了

    4.
    进入保护模式后bochs的偏移地址会变更为32位 :
    (0) [0x00007c46] 07c0:0046 (unk. ctxt): mov ax, 0x1               ; b80100         
    <bochs:1407>                                                                       
    Next at t=483362698                                                                
    (0) [0x00007c49] 07c0:0049 (unk. ctxt): lmsw ax                   ; 0f01f0         
    <bochs:1408>                                                                       
    Next at t=483362699                                                                
    (0) [0x00007c4c] 07c0:0000004c (unk. ctxt): jmp far 0008:0000         ; ea00000800

    google 真的退出了

    没想到google 真的退出中国市场了,我之前都没有关注过这个话题,突然的离开让我重新回顾google 最近的情况

    这次google 的退出不是单纯的商业问题,文化问题和政治问题,它牵扯出一个很重要话题,中国在未来世界中的话语权是否会和自己增长的经济一样扩大。目前看来中国真的敢对老美说不了

    说句实话, 中国的发展恐怕是世界上最ji xing的发展了,正文治方面的我不敢说,但民生和人木又的状况真的不能说很好,而言论方面又有很严格的控制,从google的退出可见一斑。google表面和baidu竞争,其实是和整个国家机器和正文府对立。这对一个商业机构是不公平的,但其实很多类似的不公平造就了中国目前的经济发展速度,但这也是无可厚非的。

    退就退吧,现在.hk 没有了过滤反而用起来更顺手了。google 的市场根本就不可能被baidu吃掉,所以google的退出对自己损失不大。但中国正文府的形象是否受到影响就很难说了。

    还是那句话,“中国在能够输出自己的价值观之前不会成为真正的强国”。我党目前仅能采取的措施就是挡(看看WAPI和TD-CDSMA就知道了)。当今时代,没有一个强国是在受言论和强权的控制的情况下产生的。

     

    下面是一个blog的好文,帖一下吧。

     

    1、DCCI互联网数据中心的主任胡延平去年10月23日通过新浪微博透露:“确切消息:Google开始撤退,所有在中国境内的服务器全部搬走。”当天迟些时候,谷歌中国公关部发言否认将撤走境内全部服务器,称“此次谷歌只是在中国撤掉一批旧服务器,属于一次普通的IDC调整,(Google撤出中国)这种说法是完全错误的,完全没有的事,我们不但不会撤走,还会加强对中国用户的服务。”在此阶段,Google正在进行前期撤退的筹备工作,与中国政府的交涉已经崩坏。

    2、再往前追溯,去年9月4日,前Google大中华区总裁李开复突然激流勇退宣布离职创办个人项目“创新工场”,实际上就已经是对谷歌在中国地区的前途感到失望的选择,Google已经无法容忍谷歌借着“本土化”的理由而不断妥协原则,但是那个时候Google还未察觉到来自谷歌内部的盗窃行为。

    3、导致Google退出中国的直接原因是屡查不绝的针对Google产品的密集性攻击,尤其以某由民间起草的宣言所用来收集签名的Gmail邮箱、中国异见份子的私人Gmail邮箱、以及用于传播性的部分Google Docs页面为攻击目标,实际上这些攻击并未触及Google的企业利益,或者说,攻击行为巧妙而好心的绕过了Google,希望用定点打击的方式以最小的影响干掉目标对象,但是Google显然认为其产品用户遭受侵犯就等同于企业遭受侵犯,借由美国政府与中国政府开展谈判无效后,Google选择了放弃,从此拒绝服务一个极权国家。

    4、与此同时,中国政府对Google的逼迫一直没有消退,反而伴随着国内对于互联网的全面收缩更加夸张了,中国网络管理部门曾经要求Google对其每一条搜索结果实施审核,以避免不被允许浏览的信息在其搜索页面呈现(也正是因为这一条要求的限制,饭否一直到现在都无法开放),Google认为这是荒谬且粗暴的,其公关部与中国政府周旋了数年,用上了各种手段(包括极具中国特色的)予以拖延,而中国政府给予其“不诚”态度的惩罚则是至今以来泼给Google的各种污水,希望以此让Google感到疼痛,吸取教训。

    5、最让Google总部感到忧虑的是,有证据表明,谷歌公司内部的某名员工从去年以来就一直在窃取Google部分产品的源代码和运作程式,并且提交给了Google公司以外的组织或机构,Google开放给其工程师的权限相当的大,底层的员工都可自由访问Google70%以上的产品代码,这也是因为Google有自信认为其他竞争对手即便是开发出了一模一样的产品也无法在服务和品牌上做得比Google更加出色,但是Google并没有意识到代码外流的另一种后果,获取那些代码的人并不想与Google做市场竞争,他们只想借以技术手段更加完善破坏行为,所谓“知己知彼,百战百胜”。

    6、Google几乎是全球范围内载誉最为恢宏的互联网公司了,即使是攻击Twitter、仇视美国的伊朗黑客,也使用着Google的邮箱服务,唯独在亚洲面积最大的国家里,Google被聚合了整个国家的宣传力量来批判,低俗、色情、虚伪、自大……Google自己都不明白自己在中国究竟犯了哪条戒规,在其他国家都好好的,怎么到了中国,就变成反面榜样了呢?下面是Keso整理出来的谷歌中国至今为止所被套上的总计十九次“XX门”事件:

    2006年2月 牌照门
    2006年11月 辞职门
    2007年2月 地图门
    2007年4月 词库门
    2007年5月 抄袭门
    2007年6月 报告门
    2007年7月 流氓软件门
    2007年8月 恶搞门
    2007年10月 税务门
    2008年3月 抄袭门2.0
    2008年3月 漏税门
    2008年6月 捐款门
    2008年6月 泄密门
    2008年11月 广告门
    2009年1月 低俗门
    2009年4月 低俗门2.0
    2009年6月 涉黄门
    2009年10月 版权门
    2009年12月 涉黄门2.0

     

    7、Google总部对于谷歌中国的盈利能力没有太多意见,毕竟中国的互联网环境在全世界都是出了名的荒唐和艰难,能够占据第二名的市场份额并没有超过Google总部的耐心程度,但是因为谷歌中国在维持这个份额数字的同时所付出的成本远远超出了美国IT小子们的想像,这个成本不单指的财政成本,更是博弈成本,Google的信条一向是做好服务,然后让用户去选择,没想到在中国,这样简单的前因后果中间竟然夹杂进入了棋盘中的暗流涌动,到了最后,人们都不再谈论Google哪项产品做得好可以增大多少市场份额,而是说,该怎么去打点某个国家电视台,修改其第二天将要报道的稿件措辞,以便这个国家的人们不对Google继续滋生负面印象。

    8、美国政府一直没有停止过Google与中国政府之间的斡旋工作,但是现任总统奥巴马的软弱以及中美之间的债务关系使美国在当中起到的作用并不明显,美国国会对此也相当不满,所以具有更强硬姿态的希拉里被推了出来,1月7日她在白宫宴请了美国科技业界的旗舰人物,包括Google的首席执行官Eric Schmidt、Twitter联合创始人Jack Dorsey、微软首席研究与战略官raig Mundie、以及思科市场总监Susan Bostron等人,在晚宴上希拉里提出了几项议题,希望面前这些全球互联网精锐们能够共同推动新技术领域的发展,使互联网能够被更加自由的为人们所应用、并且要找到合适的方法降低应用门槛、打破人为阻隔。

    9、Google此次退出不是永久性的,用贺卫方近期的一句话来说:“再说,你真以为这堵墙可以一直伫立下去?”我们应当保持适度的乐观,一条简单的“CN4Iran”标签让伊朗人不觉得自己是孤独的,让国际主义的花朵在互联网上绽放芬芳,世界从来没有想过抛弃中国,是中国远离了世界,同样的,中国也可以随时选择回归世界,只要……

    10、微软CEO鲍尔默对Google退出中国一事评价说:“网络攻击每天都有,我认为没有出现什么异常情况,因此我对谷歌考虑退出中国不太理解。我们每天都遭到来自世界各地的攻击,我认为其他人也是如此,我们没看到什么不同寻常的事情。”我们应当保持相当长一段时间以内的悲观,固然是出自竞争立场,但是向鲍尔默这样隔岸观火的人也为数不少,而Google的退出除了“忍无可忍,无需再忍”的畅快、“宁为玉碎,不为瓦全”的决绝以外,还有着“心有余,而力不足”的无奈,记住,每一次退让,都是专制对自由的一次胜利,温水里的青蛙,一定要赶在沸腾之前掀翻水壶。

    rpm 打包小结

      通过一个简单的hello
    world例子来打一个名字为hello的rpm包。

    /** hello.c */

    #include <stdio.h>

    int main(){

            printf("Hello, world! version 1.0.0n");

    }

      这个是最简单的例子,放置在目录hello-1.0.0/的下面,在这个
    目录下面,有一个可执行的configure文件和Makefile文件。注意,configure的权限必须是可执行的,否则在打包的过程中会报错。这
    么简单的程序,也没有什么特别需要配置的。如下:

    echo "hello, This is configure file, do noting."

      Makefile程序如下,属于常规写法
    ,唯一需要注意的是增加了一个DESTDIR的参数,这个与后面打包的相关:

    CC      = gcc

    CFLAGS  =

    INCLUDE =

    OBJECTS = hello.o

    TARGET  = hello

    DESTDIR  =

    all:    $(TARGET)

    hello.o:

            $(CC) -c hello.c

    $(TARGET):      $(OBJECTS)

            $(CC) -o hello $(OBJECTS)

    install:

            cp $(TARGET) $(DESTDIR)/usr/local/bin/$(TARGET)

    rm:     clean

    clean:

            rm -f *.o

            rm $(TARGET) /usr/local/bin/$(TARGET)

      接着将目录进行tar,得到hello-1.0.0.tar.gz。
    如果得到一个tar.gz的源代码,通常处理就是一、解压;二、configure;三、make,四、make
    install。例子中具备了这些步骤,虽然configure并没有任何实际的动作,只是走了形式。

      在当前用户目录~下面建立rpmbuild,例如/home/wei
    /rpmbuild,rpmbuild有五个子目录,可以先建立SOURCES和SPECS,其他的三个目录在打包的过程中可以自动生成。将
    hello-1.0.0.tar.gz放置在SOURCES目录下面,在SPECS目录下面写的spec文件,这是打包的关键,这个文件是构造rpm包的脚本文件。

    #################### 文件头 #####################

    Summary

    : GNU hello test for rpm building  

    //这
    是对软件包的描述

    Name

    : hello               //这是软件包的名称,

    最终RPM软件包是用该名字与版本号,释出号及体系号来命名软件包的


    Version

    : 1.0.0             //这是软件包的版本

    Release

    : 1                 //这是RPM的版本号,如果修复
    了spec文件中内容重新发布该rpm,应该增加发行版号

    Source0

    : %{name}-%{version}.tar.gz //源程序软件包
    的名字,这里是源文件的压缩包,即hello-1.0.0.tar.gz,如果有多个,可以有Source0,Source1

    License

    : GPL             //软件包所采用的版权规则。具体
    有:GPL(自由软件),BSD,MIT,Public
    Domain(公共域),Distributable(贡献),commercial(商业),Share(共享)等

    Group

    : Development/Tools   //表示软件类型,
    帮助其他人在管理RPM程序中按照组来列出RPM

    Vendor

    : WEI              //软件开发者的名字

    %description

             //这是对软件包的描述,这个以及上面的信息,在安装
    rpm后,可以通过rpm –qi hello中获得

    The GNU hello little program is used to test how to building a simple

    rpm, just for study.

    #################### %prep段
    #####################

    #从这
    里开始就是嵌入spec的shell文本。这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备。%prep负责对软件包解
    包。在最常见情况下,您只要用 %setup 宏即可,它会做适当的事情,在构建目录下解包源 tar 文件。加上 -q
    项只是为了减少输出。将会在~/rpmbuild/BUILD目录下面解开压缩包

    #对于
    打补丁的部分也放置在这里


    %prep

       

    %setup -q

    #################### %build段
    #####################

    #本段
    是建立段,所要执行的命令为生成软件包服务,如make 命令。编译该软件包。该 shell
    脚本从软件包的子目录下运行,在例子中,将会在~/rpmbuild/BUILD/hello-1.0.0/下面执行。和通常的编译一样,执
    行./configure文件,以及进行make。这里给出编译过程中执行的步骤。如果编译kernel,可能会写上make bzImage等等。

    %build

    ./configure

    make

    #################### %install段
    #####################

    #在构
    建系统上安装软件包。为了最后能封装成rpm,需要将所需封装的文件及其安装的目录放置在$RPM_BUILD_ROOT(即~/rpmbuild
    /BUILDROOT/hello-1.0.0-1.i386)下面。例如需要将编译后的可执行文件hello最终方式在/usr/local
    /bin下面,那么需要将hello拷贝到~rpmbuild/BUILDROOT/hello-1.0.0-1.i386/usr/local
    /bin/hello。

    %install

    install -d $RPM_BUILD_ROOT/usr/local/bin

    make install DESTDIR=$RPM_BUILD_ROOT

    #################### %clean段
    #####################

    #删除
    临时文件,在最后执行

    %clean

    rm –rf
    $RPM_BUILD_ROOT

     

    #################### %file段
    #####################

    #

    文件
    段,用于定义软件包所包含的文件,分为三类–说明文档(doc),配置文件(config)及执行程序,还可定义文件存取权限,拥有者及组别。

    #列出
    应该捆绑到 RPM 中的文件,并能够可选地设置许可权和其它信息。可以使用 一次

    %defattr

    来定义缺省的许可权、所有者和组;在这个示例中, %defattr(-,root,root)

    会安装 root 用户拥有的所有文件,使用当 RPM 从构建系统捆绑它们时它们所具有的任何许可权。可以用 %attr(permissions,user,group)

    覆盖个别文件的所有者和许可权。可以在 %files 中用一行包括多个文件

    #可以通过在行中添加 %doc 或 %config 来标记文件。
    %doc 告诉 RPM 这是一个文档文件,因此如果用户安装软件包时使用 –excludedocs ,将不安装该文件。您也可以在 %doc
    下不带路径列出文件名,RPM 会在构建目录下查找这些文件并在 RPM 文件中包括它们,并把它们安装到
    /usr/share/doc/%{name}-%{version} 。以 %doc 的形式包括 README 和 ChangeLog
    这样的文件是个好主意。

    #%config 告诉 RPM 这是一个配置文件。在升级时,RPM 将会试图避免用 RPM 打包的缺省配置文件覆盖用户仔细修改过的配置。

    %files

    %defattr(-,root,root)

    /usr/local/bin/hello

    #%doc /usr/local/info/hello.info

    #%doc %attr(0444,root,root) /usr/local/man/man1/hello.1

    #%doc COPYING AUTHORS README NEWS

    #################### %changelog段
    #####################

    #修改
    日志段。你可以将软件的每次修改记录到这里,保存到发布的软件包中,以便查询之用。每一个修改日志都有这样一种格式:第一行是:*
    星期 月 日 年
    修改人电子信箱。其中:星期、月份均用英文形式的前3个字母,用中文会报错。接下来的行写的是修改了什么地方,可写多行。一般以减号开始,便于后续的查
    阅。这个例子中不需要这个部分。

    如果是
    发布下一个版本可以加上如下的内容。

    *
    Mon
    Jul 6 2009 Name<Email-address> –1.0.1-1


    modified …… 可以多行,表面增加或者修改的地方

      此外,在开始部分,通过BuildRequires:列出软件编译必须依
    赖的软件包,如果有人用你的src.rpm自己编译,会提示他需要安装这些包才能编译。通过Requires:是软件运行时依赖的软件包,这个非常重要,
    因为仓库安装要依赖它来同时安装其他依赖的软件包(虽然rpm有自动依赖关系判定,但不能100%保险)。

      

    除了上面这些部分外,还有%pre(在安装包之前运行),
    %post(在安装包之后运行), %preun(在卸载包之前运行),
    %postun(在卸载包之后运行)。例如可以在%post中加上某些链接的文件。

      在这个例子中,在make
    install中增加了辅助参数DESTDIR,曾考虑过在configure的配置来进行,但是IBM工程师的文档建议:请注意

    要使用./configure –prefix=$RPM_BUILD_ROOT
    。这会在假设整个软件包文件的最终位置是构建根的情况下安装整个软件包。这可能没有关系,但任何需要在运行时找到其安装文件的程序都将失败,因为当
    RPM 最终安装到用户系统后,这些文件就不再位于构建根之下 ― 那只是您构建系统上的一个临时目录。

      之后执行:rpmbuild –ba
    hello.spec,将在~/rpmbuild/RPMS得到:hello-1.0.0-1.i386.rpm和hello-debuginfo-
    1.0.0-1.i386.rpm, 在~rpmbuild/SPRMS中得到hello-1.0.0-1.src.rpm。

      如果只想得到二进制的rpm包,使用rpmbuild
    -bb,在RPMS中得到hello-1.0.0-1.i386.rpm,如果只想得到源代码包,使用rpmbuild –bs,在SRPMS中
    得到hello-1.0.0-1.src.rpm。如果只需要生成源文件,使用rpmbuild
    -bp,将在BUILD目录下面得到打好补丁的source code。

      运行rpmbuild –ivh
    hello-1.0.0-1.i386就可以安装hello rpm包。

    rpm 内部脚本出错

    报这样的错:error: %postun(xxxx) scriptlet failed, exit status 1

    结果用 rpm -e xxx(包名) –noscripts 搞定

    HP 笔记本与 蟑螂

    今天看了315晚会,HP榜上有名一点都不意外,但意外的是竟然HP能和蟑螂给扯上,我已经完全震惊了。

    被ERP5 折腾了

    话说这个安装和文档都一塌糊涂的东西是怎么被领导看上的。文档还没研究,但就数那问题不计其数的安装脚本就让人丧失信心了~

    zope,python,mysql,CMF 那几个方面有一点错误就无所适从了.

    ERP5安装手记:

    ERP5目前仅能安装在linux平台之上。安装方式有多种:

    1.buildout:自动从svn站点下载ERP5部分基础组件(比如python,mssql)源码并进行编译和配置,通过自动化脚本完成站点建立,数据库初始化等工作。比较适合一般平台开发者。

    2.RPM/apt:使用各发行版通用的包管理工具直接安装已编译软件包,能够快速部署和实践,适合最快体验的用户(仅限Mandriva和debian等官方直接支持的发行版)。

    3.Source Code:通过所有ERP5基础构件和应用模板的源码编译重新打包并发布为一个单独的ERP5可部署软件包。适合ERP5
    底层和定制应用的开发者。

    4.erp5-install:和RPM/apt 方式类似,但更灵活,允许用户自己指定安装参数和数据存放路径。

     

    首先尝试buildout安装方式:

    作业平台:openSuSE 11.2 ,  kernel 2.6.31, gcc 4.4-1 , glibc-2.10

    1.创建作业目录

    #>mkdir erp5-software

    #>cd erp5-software

     

     

    2.下载svn tree

    #>svn co
    https://svn.erp5.org/repos/public/erp5/trunk/buildout  .

     

    3.下载组件并编译mssql,python及其他

    make

     

    4.修改配置文档

    #>vi my_config.cfg

    [buildout]

    extends=profiles/deployment.cfg

    [software_definition]

    software_home=/root/erp5-software

     

    5.开始构建ERP5

    #>/root/erp5-software/bin/python2.4 bootstrap/bootstrap.py -c
    my_config.cfg

    #>bin/buildout -c my_config.cfg

     

    6.发布已构建的ERP5

    #>vi development.cfg

    [buildout]

    extends=base.cfg profiles/development.cfg

    part+=development-site

    #> bin/buildout -c development.cfg

     

    7. 启动zope/ERP5

    #>zopectl start

    8. 登录ERP5

    #> http://localhost:18080/erp5

     

    过程总结:

    使用buildout方式安装,过程其实就是通过脚本自动下载,然后自动编译配置并部署实例,其中任何一个细节出现错误都将会导致安装失败。

    其中在编译mysql-5.0 时遭遇头文件找不到的问题:

    gcc -DMAP_TO_USE_RAID -I. -I../include -I../include
    -I../include    -DDBUG_OFF  -DDBUG_OFF
    -I/root/erp5-software/parts/senna/include     -MT
    mi_open.o -MD -MP -MF .deps/mi_open.Tpo -c -o mi_open.o
    mi_open.c                                 
    In file included from
    myisamdef.h:18,                                          
                    
    from
    fulltext.h:20,                                           
                    
    from
    mi_open.c:18:                                            
    ../include/myisam.h:36:19: error: senna.h: No such file or
    directory           
    In file included from
    myisamdef.h:18,                                          
                    
    from
    fulltext.h:20,                                           
                    
    from
    mi_open.c:18:                                            
    ../include/myisam.h:38: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or
    ‘__attribute__’ before
    ‘senna_logger’                                                          
    ../include/myisam.h:216: error: expected specifier-qualifier-list
    before
    ‘sen_index’                                                                           
    mi_open.c: In function ‘mi_open’:
    mi_open.c:361: error: ‘MI_KEYDEF’ has no member named ‘senna’
    mi_open.c:386: error: ‘sen_log_notice’ undeclared (first use in this
    function)
    mi_open.c:386: error: (Each undeclared identifier is reported only
    once
    mi_open.c:386: error: for each function it appears in.)
    mi_open.c:391: error: ‘MI_KEYDEF’ has no member named ‘senna’
    mi_open.c:392: error: ‘sen_log_info’ undeclared (first use in this
    function)
    mi_open.c:392: error: ‘MI_KEYDEF’ has no member named ‘senna’
    mi_open.c:393: error: ‘MI_KEYDEF’ has no member named ‘senna’
    mi_open.c:396: error: ‘MI_KEYDEF’ has no member named
    ‘senna_encoding’
    mi_open.c: In function ‘setup_key_functions’:
    mi_open.c:812: error: ‘MI_KEYDEF’ has no member named ‘ck_insert’
    mi_open.c:813: error: ‘MI_KEYDEF’ has no member named ‘ck_delete’
    mi_open.c:820: error: ‘MI_KEYDEF’ has no member named ‘ck_insert’
    mi_open.c:821: error: ‘MI_KEYDEF’ has no member named ‘ck_delete’
    mi_open.c:825: error: ‘MI_KEYDEF’ has no member named
    ‘bin_search’
    mi_open.c:826: error: ‘MI_KEYDEF’ has no member named ‘get_key’
    mi_open.c:827: error: ‘MI_KEYDEF’ has no member named ‘pack_key’
    mi_open.c:828: error: ‘MI_KEYDEF’ has no member named ‘store_key’
    mi_open.c:832: error: ‘MI_KEYDEF’ has no member named ‘get_key’
    mi_open.c:846: error: ‘MI_KEYDEF’ has no member named
    ‘bin_search’
    mi_open.c:848: error: ‘MI_KEYDEF’ has no member named
    ‘bin_search’
    mi_open.c:849: error: ‘MI_KEYDEF’ has no member named ‘pack_key’
    mi_open.c:850: error: ‘MI_KEYDEF’ has no member named ‘store_key’
    mi_open.c:854: error: ‘MI_KEYDEF’ has no member named
    ‘bin_search’
    mi_open.c:855: error: ‘MI_KEYDEF’ has no member named ‘pack_key’
    mi_open.c:856: error: ‘MI_KEYDEF’ has no member named ‘store_key’
    mi_open.c:861: error: ‘MI_KEYDEF’ has no member named
    ‘bin_search’
    mi_open.c:862: error: ‘MI_KEYDEF’ has no member named ‘get_key’
    mi_open.c:863: error: ‘MI_KEYDEF’ has no member named ‘pack_key’
    mi_open.c:864: error: ‘MI_KEYDEF’ has no member named ‘store_key’
    make[2]: *** [mi_open.o] Error 1
    make[2]: Leaving directory
    `/root/erp5-software/parts/mysql-tritonn-5.0__compile__/mysql-5.0.87/myisam’
    make[1]: *** [all-recursive] Error 1
    make[1]: Leaving directory
    `/root/erp5-software/parts/mysql-tritonn-5.0__compile__/mysql-5.0.87′
    make: *** [all] Error 1

    senna 是基于mysql的全文搜索引擎。

    其实缺少的头文件senna.h 就在parts目录senna.h
    的include中,直接copy到myisam中就可以越过,但这样仍然不能解决符号找不到的问题(因为编译器没有根据 ‘-L’
    找到需要的库):

    ft_nlq_search.c:(.text+0xc99): undefined reference to
    `sen_logger_pass’
    ft_nlq_search.c:(.text+0xccd): undefined reference to
    `sen_logger_put’
    ft_nlq_search.c:(.text+0xd11): undefined reference to
    `sen_logger_pass’
    ft_nlq_search.c:(.text+0xd41): undefined reference to
    `sen_logger_put’
    ft_nlq_search.c:(.text+0xdab): undefined reference to
    `sen_logger_pass’
    ft_nlq_search.c:(.text+0xdf4): undefined reference to
    `sen_logger_put’
    ft_nlq_search.c:(.text+0xe35): undefined reference to
    `sen_records_next’
    libmyisam.a(ft_nlq_search.o): In function
    `ft_nlq_find_relevance’:
    ft_nlq_search.c:(.text+0xf7c): undefined reference to
    `sen_logger_pass’
    ft_nlq_search.c:(.text+0xfbd): undefined reference to
    `sen_logger_put’
    ft_nlq_search.c:(.text+0xfd2): undefined reference to
    `sen_records_find’
    libmyisam.a(ft_nlq_search.o): In function `ft_nlq_close_search’:
    ft_nlq_search.c:(.text+0x10c4): undefined reference to
    `sen_logger_pass’
    ft_nlq_search.c:(.text+0x10fe): undefined reference to
    `sen_logger_put’
    ft_nlq_search.c:(.text+0x110c): undefined reference to
    `sen_records_close’
    libmyisam.a(ft_nlq_search.o): In function `ft_nlq_get_relevance’:
    ft_nlq_search.c:(.text+0x1150): undefined reference to
    `sen_logger_pass’
    ft_nlq_search.c:(.text+0x118a): undefined reference to
    `sen_logger_put’
    ft_nlq_search.c:(.text+0x1198): undefined reference to
    `sen_records_curr_score’
    libmyisam.a(ft_nlq_search.o): In function `ft_nlq_reinit_search’:
    ft_nlq_search.c:(.text+0x11c2): undefined reference to
    `sen_logger_pass’
    ft_nlq_search.c:(.text+0x11fc): undefined reference to
    `sen_logger_put’
    ft_nlq_search.c:(.text+0x120a): undefined reference to
    `sen_records_rewind’
    collect2: ld returned 1 exit status
    make[2]: *** [myisamchk] Error 1
    make[2]: Leaving directory
    `/root/erp5-software/parts/mysql-tritonn-5.0__compile__/mysql-5.0.87/myisam’
    make[1]: *** [all-recursive] Error 1
    make[1]: Leaving directory
    `/root/erp5-software/parts/mysql-tritonn-5.0__compile__/mysql-5.0.87′
    make: *** [all] Error 2

    这里首先想到的是将part/senna/lib 中的所有文件copy到/usr/lib/
    中但执行编译后还是同样的错误。经过反复思考发现ldconfig -p
    中并没有任何senna库文件的输出所以只能手动添加的动态连接设置到/etc/ldconfig.conf 中:

    echo  ‘/usr/lib/’ >>/etc/ldconfig.conf

    注意这样直接在mysql的目录下执行make仍然不能正常编译,因为autoconfig文件没有更新,需要手动执行./configure
    会重新配置编译时库文件的位置。这样就可以正常编译完mysql。

    然后回到工作目录继续make编译其他构建,不走运的是还是有问题:

    Installing mysql-tritonn-5.0.
    mysql-tritonn-5.0: [ENV] CFLAGS =
    -I/root/erp5-software/parts/senna/include
    mysql-tritonn-5.0: [ENV] CXXFLAGS =
    -I/root/erp5-software/parts/senna/include
    mysql-tritonn-5.0: [ENV] LDFLAGS =
    -L/root/erp5-software/parts/senna/lib
    mysql-tritonn-5.0: [ENV] PATH =
    /root/erp5-software/parts/senna/bin:/usr/lib/mpi/gcc/openmpi/bin:/sbin:/usr/sbin:/usr/local/sbin:/opt/kde3/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/kde3/bin:/usr/lib/jvm/jre/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin
    While:
      Installing mysql-tritonn-5.0.

    An internal error occured due to a bug in either zc.buildout or in
    a
    recipe being used:
    Traceback (most recent call last):
      File
    "/root/erp5-software/eggs/zc.buildout-1.4.3-py2.6.egg/zc/buildout/buildout.py",
    line 1660, in main
        getattr(buildout, command)(args)
      File
    "/root/erp5-software/eggs/zc.buildout-1.4.3-py2.6.egg/zc/buildout/buildout.py",
    line 532, in install
        installed_files =
    self[part]._call(recipe.install)
      File
    "/root/erp5-software/eggs/zc.buildout-1.4.3-py2.6.egg/zc/buildout/buildout.py",
    line 1204, in _call
        return f()
      File
    "/root/erp5-software/eggs/hexagonit.recipe.cmmi-1.3.0-py2.6.egg/hexagonit/recipe/cmmi/__init__.py",
    line 96, in install
        os.mkdir(compile_dir)
    OSError: [Errno 17] File exists:
    ‘/root/erp5-software/parts/mysql-tritonn-5.0__compile__’
    make: *** [software] Error 1

    这个很明显是python
    脚本的问题,因为之前已经手动编译了mysql。这里脚本再次进行编译的时候根本就没有考虑到这种情况。尝试再次make时用stop方法进行替换文件再
    fg继续执行。目前可以判断这些错误都是因为以补丁的形式加载了senna的原因,那么把mysql-5.0-tritonn-
    patch/tritonn-1.0.12-mysql-5.0.87.diff
    清空就
    能避免打补丁,使用纯净的mysql代码。

    接下来还会去编译svn-python,
    会报错提示缺少svn_client.h,这个是因为SuSE默认的开发包里不包含subversion-devel , 用zypper in
    安装即可,同时依赖的几个包也要安装: libapr-util1-devel libapr1-devel libexpat-devel
    subversion-devel subversion-python

    发布mysql 实例时会提示如下错误:

    100311 22:49:10 [ERROR]
    /root/erp5-software/parts/mysql-tritonn-5.0/libexec/mysqld: unknown
    variable ‘table_open_cache=64’

    这是因为SuSE已经有mysql-5.2 ,起配置脚本my.cnf中的table_open_cache=64 参数和5.0
    不兼容。

    #>zypper rm mysql

    #>copy var/etc/my.cnf /etc/

    这样可以解决问题。

     

    继续执行  bin/buildout -c profiles/development.cfg  遇到错误

     

    nohup: ignoring input
    /root/erp5-software/parts/mysql-tritonn-5.0/libexec/mysqld: File
    ‘./mysql-bin.index’ not found (Errcode: 13)
    100311 23:39:37 [ERROR] Aborting

    100311 23:39:37 [Note]
    /root/erp5-software/parts/mysql-tritonn-5.0/libexec/mysqld: Shutdown
    complete

    100311 23:39:37  mysqld ended

    缺少的mysql-bin.index是一个日至轮转的索引文件,可以手工创建:

    #>vi var/mysql/mysql/mysql-bin.index

    ./mysql-bin.000001

    ./mysql-bin.000002

    ./mysql-bin.000003

    ./mysql-bin.000004

    ./mysql-bin.000005

    ./mysql-bin.000006

    ./mysql-bin.000007

    ./mysql-bin.000008

    ./mysql-bin.000009

    ./mysql-bin.000010

    ./mysql-bin.000011

    ./mysql-bin.000012

    ./mysql-bin.000013

    ./mysql-bin.000014

    ./mysql-bin.000015

    ./mysql-bin.000016

    ./mysql-bin.000017

     

    再次手动启动mysql daemon:

    #>~/erp5-software/parts/mysql-tritonn-5.0/bin/mysqld_safe

     

    提示错误:

    100312  1:07:48 [ERROR] Can’t start server : Bind on unix
    socket: Permission denied

    100312  1:07:48 [ERROR] Do you already have another mysqld
    server running on socket: /root/erp5-data/var/mysql/mysql.sock ?

    100312  1:07:48 [ERROR] Aborting

    看似是/var/mysql 目录有权限问题。但已证实是mysql-5.0的bug,安装无法继续进行。

    找了台笔记本随便试了下SuSE11.2

    这台随便找来的本子配置可不低:

    HP DV6 (没错,又是HP,只是感觉做工比DV9000 更垃圾了)

    CPU AMD Turion II Ultra Dual-core Mobile M620  (很强的CPU)

    RAM 8GB  (一年后者才能是标配)  

    HD 600G (够耍了,比主流多一倍)

    GPU Redeon Mobile HD4650 (R700)  (啥也不说了,这种显卡用在笔记本上……)

    其实我是奔着KDE4 来的,suse11.1 的那个根本没法用。

    转完后一开始就给我愣了一下, kernel 提示pxii4 和ACPI 冲突,用acpi=off的参数虽然能过去,但还是几率性死机。 可以肯定这机器的BIOS有问题,不想再去刷了,凑合用。

    然后是framebuffer 无法正常工作,预料之内,R700 ~~~ 罪过啊,也不想折腾fglrx了。

    结论:在新上市或未上市的机种上搞linux (特别是这种无耻显卡)等于瞎折腾,俺不玩了。

    然后准备去瞧瞧KDE4 的desktop effect , 又死机了(其实是xorg 死了), 恢复初始设置,也不搞了。 说实话我很不喜欢kde4的默认风格和图标,太素雅但谈不上精致,实用性又赶不上KDE3.X 。 看来要等一年再看。