Fedora 和 Ubuntu 上的段错误

LilyBBS discussion: Segmentation Fault on Fedora and Ubuntu

昨天和别人在小百合 LinuxUnix 版发帖讨论 Segmentation Fault 的问题,整理如下:

flyDutchMan 根据自己存在段错误的程序在 Fedora 和 Ubuntu 上的运行结果,认为 Fedora 和 Ubuntu 对段错误的处理方式不同,他的观点是(原文链接:[href: http://bbs.nju.edu.cn/vd83468/bbscon?board=LinuxUnix&file=M.1185514732.A&num=6528 ] ):

“Ubuntu认为段错误是很严重的错误,它的做法是当即中断程序。而Fedora对待段错误是比较宽容的,在Fedora中即使检测到某个进程正在对不属于它的地址空间进行操作,他仍然会完成这次“非法”的操作,并且继续执行后面的操作,只是在终端上打印出“Segment Fault”的错误。所以在这个程序中,虽然发生了段错误,Fedora仍然能运行到connect(),是整个程序顺利跑起来。”

并给出了一个 demo:

#include <stdio.h>

#define IP_ADDR_LENGTH 16
#define UMP_FUNC_NUM 6

int main() {
  char addr[IP_ADDR_LENGTH];
  addr[0] = '';
  strcat(addr, "172.16.64.181" );

  char (*taskpath)[IP_ADDR_LENGTH];

  printf("the address is %dn", &amp;taskpath[0]);

  int a;
  int b;

  sprintf(taskpath[0], "%s", addr);

  printf("taskpath[0]: %sn", taskpath[0]);
  printf("finish!n");
  fflush(stdout);

  return 0;
}

“在Ubuntu下运行,系统不会输出“ finish! ”这句,而是在输出taskpath[0]的地址后直接终止程序。注意,上面的int a; int b;声明不能省略,也不能赋值!因为如果省略或赋值,就不会产生Segment Fault!(赋值的话系统就会把这两个变量分配到Stack中,这就与对Heap操作的taskpath没有冲突了)”

我的回复是(原文链接:[href: http://bbs.nju.edu.cn/vd83468/bbscon?board=LinuxUnix&file=M.1185532985.A&num=6538 ]):

首先,我的观点,没有所谓 Fedora 和 Ubuntu 对段错误处理的不同。因为它们都是使用 Linux kernel,而内存管理只要 Kernel 的版本一样,我认为不会有不同的处理方式。

其次,我想纠正上文中的一个说法(可能有些讨人嫌哈,不过一些东西还是说清楚点儿好,因为 ls 用这个来解释自己的程序):

> 赋值的话系统就会把这两个变量分配到Stack中,这就与对Heap操作的taskpath没有冲突了

无论你赋值与否,这两个变量都是存在在 stack 中的; taskpath 也不是对 heap 进行操作,它只是存在于 stack 上的一个指针变量。

> 因为如果省略或赋值,就不会产生Segment Fault!

在我的系统中,都会产生段错误。

最后,我来给出我对这个问题的解释:

就上文的 demo 程序来说, a, b, addr, taskpath 都是存在于 stack 上的,这个很清楚,调试过 C 语言程序的人应该都知道,我就不解释了。

1. 为什么会出现段错误?

因为 taskpath 是一个野指针,在使用之前没有被赋值,所以 taskpath 会指向任何位置,对一个随机的位置进行写操作,显然会出现段错误。

2. 为什么同一个程序,定义不定义 a, b 会影响段错误出来的时间点?

虽然上面说 taskpath 会指向任何位置,但是这个说法并不完全正确。因为大家知道,taskpath 是在 stack 上的一个变量,而 stack 呢,是一直在重复使用的一个区域。要明确这一个概念,在操作系统中执行一个可执行文件,程序并不是从 main 开始的,它要先执行一段代码,也就是平常所说的 crt(c runtime)。这个一般是由 lib 提供的,其中要调用一些库函数,所以呢,在 main 执行之前, stack 被 crt 用过(这是最关键的一点)。

因为 stack 使用完是会被释放的,这也就是在调用函数时 function prologue 和 epilogue 所干的事情,开辟栈空间和恢复栈空间,主要动作就是移动栈指针。那么 taskpath 所占的位置很有可能被 crt 用过(不是一定),那么如果被 crt 写过,比如被 crt 用做保留 ebp 或者什么其他的寄存器,它的值就是确定的(在一定程度上说)。

如果 crt 在 taskpath 这个位置上保存过寄存器的值,尤其是 ebp 或者 esp,那么很有可能 taskpath 就指向此程序栈空间的某个位置。那么写 taskpath 指向的内存产生的段错误就没那么 critical,或者说操作系统对它的指针在自己栈空间中的操作比较容忍,就不会立即停止程序的运行。但是如果 crt 没有在这个位置上进行操作,那么这个位置就可能是某个垃圾地址,比如说操作系统自己的内存空间,那么写 taskpath 指向的内存就会造成很严重的后果,操作系统会立马检查出来终止它的运行。

我在 Ubuntu 7.04 下使用 gcc 4.1.2 编译、调试并反汇编的结果显示:两个程序唯一的不同是 taskpath 在堆栈上的位置,当定义 int a, b; 时,taskpath 是 $ebp -40 而这个地址没有被操作过;当不定义 int a, b; 时, taskpath 是 $ebp - 32,这个地址曾经被 crt 使用过。所以按照上面的解释,系统报段错误的时间不一样。

如果熟悉 GDB 的话,可以很容易的用调试证明这一点。计算出 crt 入口的 $ebp 和 main 中 $ebp 的差,以此计算出 taskpath 保存的位置,在上面设置 watch point,从 _init 执行到 main,看其中有没有对 taskpath 所在位置进行写操作。

3. 为什么不同的操作系统,结果不一样?
这个就比较简单了。kernel 不一样,可能内存管理的方式不一样。使用的 lib 或者 gcc 不一样,可能引起 crt 的汇编结果不一样。这两个都能导致同样的程序报错的时间不一样。

所以,不是 Fedora 或者 Ubuntu 能不能容忍段错误,没有 OS 容忍段错误,不同只是在产生段错误够不够 crucial 需要得到立即处理。

Hacking 《自己动手写操作系统》Chapter 1&2

——Writing x86 PC Bootloader With Free Software

本文内容已整理成一本电子书,请到这里下载

今天在看一本书,《自己动手写操作系统》(于渊,电子工业出版社),虽然很欢迎这样一本详尽介绍怎样写操作系统的书出现,但看完前两章后对作者的某些做法很不以为然。比如使用 Windows 作为开发平台,采用商业虚拟机作为测试平台,不是每个人都买得起这些软件的(我们要在心中牢固树立使用盗版软件就是犯罪的观念 X-D)。

我这篇文章的目的就是为了展示 Linux/Free Software 的强大,不使用任何商业软件,不用自己写的任何工具,使用免费的工具链,照样可以完成而且更高效地完成《自己动手写操作系统》前两章的 demo。

当然我也希望这篇文章为推动 Linux 和 Free Software 的发展出一点力,比如让部分读者(尤其是 EE 和 CS 学生)看完这篇文章后舍弃瘟都死,投身到 Linux 和 Free Software 阵营中来,或者《自己动手写操作系统》的作者在下一版(如果有的话)中完全使用 Free Software 来做 demo。

好了,下面开始,先介绍一下需要使用的工具。
操作系统:Ubuntu 7.04 Feisty,平台: i386 PC。
使用工具:gcc, binutils(as, ld, objcopy), dd, make, hexdump, vim, virtualbox。
上面所说的工具中,除了 virtualbox 虚拟机,剩下的工具在任何能用做开发环境的 Linux 版本上都是默认安装的。VirtualBox 也是遵从 GPL 协议的开源软件,可以从这里 [href: http://www.virtualbox.org ]下载。Ubuntu 只需要 sudo apt-get install virtualbox 安装即可。

首先,我们看第一个示例代码:
[wbyang@solrex-PC loader]$ more boot.asm
org 07c00h ; 告诉编译器程序加载到7c00处
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 调用显示字符串例程
jmp $ ; 无限循环
DispStr:
mov ax, BootMessage
mov bp, ax ; ES:BP = 串地址
mov cx, 16 ; CX = 串长度
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov dl, 0
int 10h ; 10h 号中断
ret
BootMessage: db "Hello, OS world!"
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
此段代码使用 Intel 格式的汇编语言写成,本也是用同样开源的 NASM 编译,但是鉴于很少有人在 Linux 下使用此汇编语法,它在 Linux 平台上的扩展性和可调试性都不好(GCC 不兼容),而且不是采用 Linux 平台上编译习惯,所以我把它改成了使用 GNU tool chain 去编译连接。这样的话,对以后使用 GNU Toolchain 编写其它体系结构的 bootloader 也有帮助,毕竟 NASM 没有 GAS 用户多。

上面的汇编文件可以用 AT&T 风格改写为:
[wbyang@solrex-PC loader]$ more boot.S
.code16 ;使用16位模式汇编(GAS 默认认为 .S 文件是 pure 32-bits i386 code)
.text ;代码段开始(为 link script 做定位)
mov %cs,%ax
mov %ax,%ds
mov %ax,%es
call DispStr ;调用显示字符串例程
INF: jmp INF ;无限循环(GAS 没有 $ 作为当前行标号的约定)
DispStr:
mov $BootMessage, %ax
mov %ax,%bp ; ES:BP = 串地址
mov $16,%cx ; CX = 串长度
mov $0x1301,%ax ; AH = 13, AL = 01h
mov $0x00c,%bx ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov $0,%dl
int $0x10 ; 10h 号中断
ret
BootMessage:.ascii "Hello, OS world!"
.org 510 ; 填充到 510 字节,使生成的二进制代码恰好为512字节
.word 0xaa55 ; 结束标志

但有一个问题, NASM 可以直接使用 nasm boot.asm -o boot.bin 将 boot.asm 编译成 bin 文件,GAS 不能。但是 GAS 的不能恰好给开发者一个机会去分步地实现这个过程,使编译更为灵活。下面请看 link script 和 Makefile:
[wbyang@solrex-PC loader]$ more solrex_x86.ld
SECTIONS
{
. = 0x7c00;
.text :
{
_ftext = .; //告诉链接器程序加载到内存的7c00处
} = 0
}

这个连接脚本的功能就是,在 link 的时候,将程序加载到内存 0x7c00 的位置(BOIS 将 PC 控制权转交给这个位置运行的程序),相当于 boot.asm 中的 org 07c00h 一句。有人可能觉得麻烦,还需要用一个脚本控制加载地址,但是 《自己动手写操作系统》就给了一个很好的反例:Chapter 1.5 代码 1-2,作者切换调试和运行模式时候需要对代码进行注释,而使用脚本控制,只需要编译时候调用不同脚本进行连接,就能解决这个问题。

这在嵌入式编程中是非常常见的处理方式,使用不同的连接脚本一次 make 生成某个程序分别运行在 board 上和 simulator 上的两个二进制文件 。

相信只要能耐心看到这里的人对下面 Makefile 中的内容都不会陌生。
[wbyang@solrex-PC loader]$ more Makefile
CC=gcc
LD=ld
LDFILE=solrex_x86.ld #使用上面提供的连接脚本 solrex_x86.ld
OBJCOPY=objcopy

all: boot.img

boot.img: boot.bin
@dd if=/dev/zero of=emptydisk.img bs=512 count=2880 #生成空白软盘镜像文件
@dd if=boot.bin of=boot.img bs=512 count=1 #用 bin file 生成对应的镜像文件
@dd if=emptydisk.img of=boot.img skip=1 seek=1 bs=512 count=2879 #在 bin 生成的镜像文件后补上空白,最后成为合适大小的软盘镜像

boot.bin: boot.elf
@$(OBJCOPY) -R .pdr -R .comment -R.note -S -O binary boot.elf boot.bin

boot.elf: boot.o
$(LD) boot.o -o boot.elf -e c -Tsolrex_x86.ld

boot.o: boot.S
$(CC) -c boot.S

clean:
@rm -rf boot.o boot.elf boot.bin boot.img

使用 Makefile,一个是方便,直接就可以生成可引导的软盘镜像文件,二是为了清楚,其间对源文件的任何处理都一清二楚。下面解释一下 Makefile 都做了什么:
第一步, gcc 调用 as 将 boot.S 编译成目标文件 boot.o;
第二步, ld 调用连接脚本 solrex_x86.ld 将 boot.o 连接成可执行文件 boot.elf。
第三步, objcopy 移除 boot.elf 中没有用的 section(.pdf,.comment,.note),strip 掉所有符号信息,输出为二进制文件 boot.bin。
第四步, dd 使用 boot.bin 生成可引导的软盘镜像 boot.img。

到此,我们使用开源工具链编译生成 bootloader 的过程已经结束,没有使用到任何商业软件,也没有自己写任何转换工具。《自己动手写操作系统》文中提到的 HD-COPY 和 Floopy Writer 都没有使用到。 为了验证也可以先用 hexdump -x -n 512 boot.img 将 boot.img 前 512 个字节打印出来,可以看到 boot.img dump 的内容和附送光盘中的 TINIX.IMG dump 的内容完全相同。这里我们也显然用不到 EditPlus 或者 UltraEdit,即使需要修改二进制码,也可以使用 vim 的 %!xxd 命令进行十六进制编辑。

写得真够累的,那个 virtualbox 就不说了,用法跟 virtualPC 没有什么大差别。安装上以后,新建一个虚拟机,加载 boot.img 光盘镜像到软驱,然后选择虚拟机重新启动,就可以看到红色的:
Hello, OS world!
当然,你如果喜欢的话,可以改成 "F-U_C-K Microsoft!" 不过要注意的一点是,做这件事是需要权限的,要把当前用户加到 vboxusers 组中,否则这个行为无法成功 :-)。

综上,很显然 VirtualPC 也不需要。《自己动手写操作系统》可怜的作者费了半天劲在瘟都死的 VirtualPC 里装 Redhat Linux,解决瘟都死和 Linux 的文件共享问题,解释了一番自己“工欲善其事,必先利其器”的动机,但我实在没看出有一点儿需要瘟都死的原因。瘟都死什么都不能给你,但 Linux 能给你整个世界!

Tor - Anonymity on Line

其实以前就见过 Baosheng 在博客里推荐 Tor 这个工具,据说可以访问 Wikipedia,只是当时潜意识里觉得太麻烦,就懒得搞。昨天晚上 Baosheng bg,请 ufx222, xum84, daoming, proline 我们一起吃饭,又提到了这个洋葱路由,今天就尝试了一下,果然好用。

简单来说,Tor 的功能就是,采用不同的“洋葱路由器(onion router 意思和代理服务器差不多)”来重定向网络请求,并且随时间更换路由,这样别人就无法监视你的网络访问情况,主要目的是为了保护隐私。而由此带来的副产品就是,onion routers 遍布全世界各地,所以就可以使用这个工具通过 onion routers 访问被“墙”封掉的站点(比如现在的 blogspot.com )。更多介绍请登录 Tor 官方网站 [href: http://tor.eff.org/ ] 。

从我的使用来看,刚开始使用访问网站速度可能慢点儿,用了一段时间之后速度就快很多了,大概是 Tor 自动在寻找洋葱路由服务器。而且最牛的是,我们公司的 DNS 坏了一小段时间,其间什么网站都没办法访问,而通过 Tor 居然访问正常,大概是 Tor 记录的是 IP 而不是 domain 吧。有意思的是访问 google.com 往往被重定向到某个欧洲的 Google 服务器,比如: google.de, google.es 之类的。

在 Linux 下 Tor 的配置很简单(我估计在 Windows 下会更简单,官方网站上有各种系统安装介绍):

首先,安装 Tor 软件,在 Ubuntu 下面就是:
sudo apt-get install tor
使用默认配置即可,即在 9050 端口打开一个 SOCKS 服务器。Tor 程序会以后台方式一直运行在系统里。

其次,为 Firefox 下载 torbutton 插件[href: https://addons.mozilla.org/en-US/firefox/addon/2275 ],安装。安装完成后,到"Tools->Add-ons->Extensions->Torbutton Preferences",在 "Proxy Settings" 中选择 "Use custom proxy settings",然后将前四个都留空,最后 "SOCKS Host:" 中填: localhost, Port: 9050,这样配置就完成了。

可以留意 Firefox 状态栏的最右端(窗口右下角),这时候会出来一个 "Tor Disabled",用鼠标点击该区域,就可以在 "Tor Disabled/Tor Enabled" 状态切换。这样在访问某些敏感站点时候就可以 Enable 它,在不需要时 Disable 它。也可以在 Torbutton Preferences中把这个文字格式的提醒改成一个洋葱头的图标提醒。

其实我想,不安装插件,只在网络设置中使用 SOCKS 代理也可以实现这种功能,如果这样的话,这里插件的作用只是启用和不启用代理的区别。那么,如果在校园网内,这个插件能否起到在 Firefox 的代理和插件这两个代理之间切换的目的呢?如果可以的话,就算不使用或者不能使用 Tor,这个插件也可以用作切换校园网代理使用了,倒也蛮方便的(只是我不需要用到了,所以就留给别人验证吧 X-D)。

PS: Yo2.cn 服务质量在下降,从 2007年7月19日8:25 到 9:00 之间都无法连接上,wget 可以下载但无法显示速度,更无法登录,最后出来一个错误:504 Gateway Time-out。唉,国产的 BSP 千万别学国产的足球队啊!烦死了,回去睡觉。

又回到北京了

好些天没有更新博客了(针对我的更新频率而言),原因很简单,有更重要的事情去做 :-)。

1 号到的北京,把寄放在同学那里的被子拖到租住的公寓,请邓飞、丽君吃了顿饭。2 号到公司报到,换了个办公桌,换了个电话。寄来的包裹和录取通知书同时到达,纳闷不已,为什么北京往南京挂号需要七天而南京挂号到北京只需要三天?害得我为了一张纸折腾(中科院的录取通知书着实简陋,信封是牛皮小信封,通知书就是一张请柬大小)。我原以为是通知书的那玩意儿是入学须知,但搞不明白的是,为什么入学须知要寄给我两次?

一毕业,这同学们好久不更新的博客都重新拾起来了,反而显得我有点儿懒。这下到公司工作,晚上的时间就多了些,可能又要恢复我正常的更新速度了。

这两天工作也没干什么事,FPGA 调试还不太熟练,模拟器又改了不少,而且更新中工作不太正常,所以就随便看看代码、看看邮件列表和一些 patch。GDB 的 mailing list 里这两天挺有意思的,有个人发了一个希望把 GDB 代码用 C++ 重写的邮件,然后一群大佬说这个问题别讨论了,各持己见讨论起来会没个头的。但是某个邮件里有巨牛的一句话:“The more C++ code I see, the more convinced I get that the language should die. ”让我叹服不已,哈哈。

重装了一个 Ubuntu,当然也装上了 beryl,比原来用着更方便了。Google desktop for linux 推出了,试用了一下,挺好的,特别喜欢它的两下 ctrl 就可以弹出搜索框,这样就免得我还得用鼠标把光标定位在 Google toolbar 里去。Google desktop 的 sidebar 没有在 Linux 版本上体现出来比较遗憾,那些小工具很有意思,但其实 Linux 本身就带有很多有一些的小玩意儿,喜欢玩的能把桌面配置得很 cool 或者 cute。为 Firefox 装了一个 IE7 的主题,看起来还是蛮好的,看来 Microsoft 的 UI 工程师也不是吃干饭的。但是 wine 现在还不支持 IE7,用 ies4linux 测试版装上之后,IE7 的 UI 效果一点儿也没有,真没劲。

毕业了,大家都在干不同的事,还有人(XHO)感叹没假期了,哈哈,准备成家立业的时候已经开始了,慢慢就该习惯了。

Idle time ?

劳动节在家呆了两天,又犯了一次胃炎,痛了大半天。这也是我在北京太不注意饮食的报应。其余的就乏善可陈了,睡睡觉,遛遛狗,养养神。那条狗的所做所为这次给我带来了不少乐趣,不过至于那些委琐狗事,就不说了。

昨晚一夜车到南京,原来 8 个小时 40 分钟的车程提速后 6 个小时 20 分钟就到了。看到长江大桥的时候我都有点恍惚,有这么快吗?还好有大桥这个地标,不至于错过南京站。凌晨 3 点半到宿舍,几个小子居然谈兴大起,说话到 5 点。眯了一会儿实在无法入睡,就爬起来了。

桌上床上乱成一片,好打扫了一番,把老余拿走的电脑搬回来,重装了遍 Win。小百合上发帖讨了个 Ubuntu Feisty,还劳驾 dolphin9 亲自给我送到了宿舍,明天装罢。

习惯了公司的专线网络,再回到南大乱七八糟的网络里,真闹心。google 的服务勉强还算可用,space 居然可以在校内访问了,但其它的国外网站依然的是相望不相闻。yahoo mail 用不了了,虽然我已经在 gmail 里 pop 过来,但回归测试报告总是被 yahoo 当作 spam 处理的,忘记设置 pop spam 了。习惯了早上看报告,现在一没有还真有点担心。不过南大的破网络又不允许通过代理 ssh 到服务器上,就算想工作也没办法,就随它去吧。

我最纳闷的一点是,在 Win 下为什么 firefox 2.0 会不能登录 google 和 space,而 IE6.0 却可以,难道是安全性设置有问题?好久没用 Win 了,连一些常用的东西在哪儿都有点晕了,再说吧。

唯一还能值得称道的一点是 ftp 资源依然很丰富,晚上拖了不少电影,光顾得聊天了,明日再看好了。代理又开始限速,在国内下载也不如以前快了。不就是为了推广一个什么"奶罩(BRAS)"网络嘛,何必逼学生那么急呢?明天装上 tex 软件之后要把论文的一些想到的硬伤修改一下,再好好润色一遍,拿去给吴老师看看。事情倒是不多,也不是很忙,挺惬意的。还是有些不适应,刚回来嘛,难免,不过这生活可比打工强多了。

Scim comes back

哈哈,我的 Ubuntu(feisty)能输入中文字了,虽然 Kmail 里还是不能显示所有中文字,但编码是没有问题了的。不能用诡异,能用也诡异,我什么都没
做,就过了几天登录ubuntu,不小心点到了ctrl+space,惊喜地发现scim弹出来了,开心开心。

我要搬到Ubuntu下工作了,要享受beryl带来的快感了。

Beryl is so cool

以前看到 SUSE 10.1 带的 beryl 效果,觉得非常有意思,但肯定会吃资源,就没想过尝试。自从那天看到同事的桌面也用了 beryl 之后,我才知道原来集成显卡也是可以安装滴。只可惜我的 SUSE 是 10.0,Qt 库的版本不够,只能望屏兴叹。昨天晚上下好了 Ubuntu 7.04, 叫什么 herd-3 测试版还是什么东西,我也记不住这种东西。心想,安上这个就可以玩 beryl 了。

测试版真的是很讨厌,我的 SATA 硬盘,WinC 盘是 FAT32 的,为什么把光盘镜像放在这个分区上就找不到呢?我差点想去改 initrd.gz 里面的寻找路径,还真从那里面让我找到了,但头痛的是,我不知道我改了后再压缩会不会识别不了。心想,算了,说不定是分区的问题,失败两次之后就学乖巧了些,拷贝到 ext3 格式的 linux 分区一个镜像,结果再找镜像就 OK 了。

但是安装时候还出了一个问题,我选择语言是中文,国家和地区是中国,它就是会停到安装 openoffice-java-commen 这个包上,真是奇怪了。只好选择语言英文,但是,但是,为什么我选择语言是英文不能选择国家和地区是中国呢?这是什么逻辑?没的办法只好选择香港。

安装好以后,彻底 upgrade 一番,这没出问题。但在安装中文支持的时候,最后一步说不能识别 zh locale。我郁闷了,一看,下载下来的中文支持包是 6.06 版本的,怪不得,那么久没有更新了。所以,现在我的 feisty 能正常显示中文了但不能输入,scim 能启动但就是没法换输入法,唉,忍了吧,谁让咱是中国人呢?中国博大精深的文字那些鬼佬们怎么能轻易而举地使用呢?

然后就是安 beryl,看网上教程看到头痛,丫的安一个软件这么费劲。我一怒,不管了,就把 ubuntu 的 beryl org 的源加到 source.list 里面,然后 wget 一下 key,直接 sudo apt-get update, sudo apt-get install beryl。我紧张地看着进程跑完,哈哈哈哈,居然没出问题,直接就能用。看来 Ubuntu 在这方面还是下了点功夫的。

我最喜欢 beryl 的就是桌面的转换,cool 啊,而且使用快捷键比原来 1234 桌面换来换去直接地多,也能在脑子里形成反射:恩,去左面的桌面,恩,去右面的桌面。而不用像以前一样老在想,该进几号桌面啊?

版上还有人评价 windows vista 和 beryl 达到同等效果所耗费的内存。虽然两个操作系统这么比没意思,但还是觉得 beryl 做的相当不错。

Ubuntu is so cool

上次用Breezy,还没有体验到Ubuntu的好处,这次装上Dapper,才发现Ubuntu用起来那么爽,真是很酷,怨不得有那么多FANS。

1.免费的光盘派送

虽然说这个不是起决定作用,但是能有正版的无差错的安装光盘,谁愿意去下载那些很难保证质量的光盘镜像呀,就像上次下的FedoraCore5,更新安装时候还好,起码剩个系统用,全新安装时候根本无法成功安装。

2.方便的软件安装,丰富的更新源

这也是那么多人喜欢Debian的原因,可以很方便的管理软件,而且,apt-get命令简化了很多麻烦的操作,避免了编译软件包或者直接安装时候出来的某个某个库找不到的罗嗦,直接apt-get就能把所有需要安装的部分自动下载安装好。况且,Ubuntu的更新源也很多,国内国外教育网都有,速度也还可以。

3.全面的使用和配置文档,尤其是中文文档

Ubuntu Wiki涵盖的范围非常广泛,包含了许多可能遇到的问题和解决方案,尤其是中文方面,比其他版本的要好很多,遇到问题再也不用Google半天了。

4.简单快速的系统

显然,只有一张CD,安装速度也很快,半个小时左右,比起5张CD的FC5,4张CD的RedFlag,DVD的SUSE是方便多了。启动速度也很快,配置好以后启动不超过1分钟。简单并不代表不好,基本功能已经很全了,需要什么更多的软件apt-get一下就行。而且桌面也很漂亮,GNOME桌面能做成这个效果,真的很不错了。

总之,作为桌面使用来说,Ubuntu绝对是相当相当的优秀。到现在为止发现它唯一不爽的地方就是,它不带金山词霸,这也是垃圾RedFlag为数不多能让我赞一下的地方:),BTW,RedFlag自带的应用软件真的是很丰富。

P.S. 贴一下速度比较快的源,sources.list For Dapper(6.06),系统自带的那些个不是很好,比较难连上,速度也不行。
# http://www.ubuntulinux.nl/source-o-matic
#
# If you get errors about missing keys, lookup the key in this file
# and run these commands (replace KEY with the key number)
#
# gpg --keyserver subkeys.pgp.net --recv KEY
# gpg --export --armor KEY | sudo apt-key add -

# Ubuntu supported packages (packages, GPG key: 437D05B5)
deb http://de.archive.ubuntu.com/ubuntu dapper main restricted
deb http://de.archive.ubuntu.com/ubuntu dapper-updates main restricted
deb http://security.ubuntu.com/ubuntu dapper-security main restricted universe multiverse

# Ubuntu community supported packages (packages, GPG key: 437D05B5)
deb http://de.archive.ubuntu.com/ubuntu dapper universe multiverse
deb http://de.archive.ubuntu.com/ubuntu dapper-updates universe multiverse

# CN99
deb http://ubuntu.cn99.com/ubuntu/ dapper main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ dapper-updates main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ dapper-security main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ dapper-backports main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu-cn/ dapper main restricted universe multiverse

# LUPA浙江
deb http://mirror.lupaworld.com/ubuntu/archive/ dapper main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu/archive/ dapper-security main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu/archive/ dapper-updates main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu/archive/ dapper-backports main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu/ubuntu-cn/ dapper main restricted universe multiverse

# Ubuntu官方
deb http://archive.ubuntu.com/ubuntu/ dapper main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ dapper-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ dapper-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ dapper-backports main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu-cn/ dapper main restricted universe multiverse

# 上海交通大学
# deb http://ftp.sjtu.edu.cn/ubuntu/ dapper main multiverse restricted universe
# deb http://ftp.sjtu.edu.cn/ubuntu/ dapper-backports main multiverse restricted universe
# deb http://ftp.sjtu.edu.cn/ubuntu/ dapper-proposed main multiverse restricted universe
# deb http://ftp.sjtu.edu.cn/ubuntu/ dapper-security main multiverse restricted universe
# deb http://ftp.sjtu.edu.cn/ubuntu/ dapper-updates main multiverse restricted universe
# deb http://ftp.sjtu.edu.cn/ubuntu-cn/ dapper bleeding main multiverse restricted universe

# 清华大学
# deb http://mirror.net9.org/ubuntu/ dapper main multiverse restricted universe
# deb http://mirror.net9.org/ubuntu/ dapper-backports main multiverse restricted universe
# deb http://mirror.net9.org/ubuntu/ dapper-proposed main multiverse restricted universe
# deb http://mirror.net9.org/ubuntu/ dapper-security main multiverse restricted universe
# deb http://mirror.net9.org/ubuntu/ dapper-updates main multiverse restricted universe
# deb http://mirror.net9.org/ubuntu-cn/ dapper main multiverse restricted universe

Copyright © 2005-2006 Solrex Yang. All rights reserved.

又重装了

自从来到鼓楼以后,RedFlag出了些问题,必须关闭电源再启动才能连接上网络,否则显示网卡无连接。其实这问题早就存在,应该是RedFlag网卡驱动的问题,在浦口时候经常停电,也就无所谓了。可到了鼓楼后,一直是不断电的,每次为了上网还要拔插销,麻烦死。Ubuntu是5.0的,自带Firefox是1.0版本,也就不耐烦用,所以一直在用XP。

前几天中了个IE插件,Kaspersky5.0一直杀不掉,结果换装6.0时候就引起了冲突,什么services.exe错误,然后就60秒关机,用shutdown -a停止掉关机,但是发现忽然所有程序都无法上网了,网络是一点问题没有,连接也在。估计是网卡的服务进程出现了问题。重启,没用,修复安装,也没用,只好重装了。其实自从装了几十个更新包之后系统已经变得巨慢,早就想重装了,正好体验下Ubuntu6.06。

重装Windows速度很快,半个小时就搞定了,再装上杀毒软件,免费的简化版Kaspersky6.0:Active Virus Shield,是Kaspersky和AOL一起推出的有一年使用许可的杀毒软件。然后天网,Office,剩下的基本就不用装了,全在D盘里。

Ubuntu6.06的安装方式真让我吃了一惊,居然还能先进LiveCD再装Linux的,不用说配置安装的速度巨慢,真不如原来的简单界面,而且最恶心的是分区,在step5分好的分区,在step6里居然看不见,只能先取消,然后再执行一遍安装过程才能在step6看见。不过系统安装速度似乎比原来快了些。

装好Ubuntu后比较烦的就是升级,由于需要代理出校,在apt-get软件包管理器的代理设置却不能设需要密码的代理,只好到同学那里开一个配好的CCproxy,再从我电脑上用他的代理,软件包下载速度也很慢,不超过10K,一般在3K,是从官方的下载。从镜象是可以下载,但是有好多包镜象站点上没有,非常郁闷。

本来还想体验下SUSE10,上次听讲座弄了张盘,结果给它8G的空间它却说:空间太小,无法安装最小系统。得,伺候不起你,咱闪。

Copyright © 2005-2006 Solrex Yang. All rights reserved.

Summer School第一天

今天Siemens Summer School开学,六点半就迷迷糊糊的爬起去赶公交上课,到地儿一看,呵,人还真不少。报名的好多没去,没报名的却有不少凑热闹。西门子似乎也颇为重视这次活动,Siemens PSE Nanjing的President兼CEO Mr.Siebenhofer居然坚持了一天,真不容易。如果是一般企业的老总,上去讲几句话,拍拍屁股就走了。

第一天课程乏善可陈,无外乎是介绍一下西门子的情况和企业文化之类的,下午的lecture很搞笑,名字起的是Softeware Development Overview: The Current Situation and Trend of Software Industry,内容却是Siebenhofer君讲了点西门子对软件工程的看法,Liu Jun Cheng君扯了点Web 2.0和Animated Prototype。

原以为只有上午会有,谁知道安排的都是整天的课程,在鼓楼校区得五点多才下课,连校车都赶不上,这鬼天气下坐公交真是遭罪呀,蒸笼里过一趟。

正好碰到朱易然老师把我订的Ubuntu 6.06的盘转交给了我,这老外做事就是实在,五张for PC的,三张for Mac,三张for 64bit,免费寄过来一分钱不要,像国内的RedFlag那种垃圾企业,利用别人的开源成果不遵从GPL协议还口口声声要保护知识产权,Linux软件的更新升级居然还要序列号,把Linux的GUI硬生生改成和Windows一样,这样的企业也只有在中国的现在才能生存下去。不过,话说回来,RedFlag还是有点优点的,中文化不用设置,应用软件多点。

过几天就要搬宿舍了,关于分配情况不多说了,我没有负责。其实说老实话我也不想往自己身上揽这种出力不讨好的活,就让老师决定吧。我们宿舍楼是男生7舍和14舍筒子楼的3间,女生4舍。具体分配情况到9月1日前再公布,因为这些宿舍暑假里充当研究生的临时宿舍,还没有腾空,搬家时间大概提早不了,还是9月1号、2号。
Copyright © 2005-2006 Solrex Yang. All rights reserved.

Linux学习笔记(5)

有关Ubuntu的一些心得

Ubuntu的安装:

安装方法和普通Linux没什么区别,不过主要是英文界面,要注意看,尤其是分区的时候,不然万一选错了,硬盘上数据就惨了。分区的时候可能会有明明可用的分区它标为不可用,不知道什么原因。

在安装基本系统的时候有时会出现错误,但是Ubuntu最好的就是它会让你再选择从什么步骤开始,只需要重复一下安装基本操作系统这个步骤基本就可以解决。相比而言Redhat做的就太差了,一个小文件错误就得从头开始重新安装。

Ubuntu退出安装按ESC就可以,然后选择最后一个步骤退出安装。安基本系统大概在8分钟左右,拷贝文件大概在15分钟左右,重新启动以后安装软件大约20分钟。

Ubuntu安装时候没有设置root的密码,需要进入single模式修改密码,方法是在grub引导的时候选择safe mode,更一般地,对所有Linux都适用的是,光标放到引导选项上按E进入编辑启动项,在启动内核的那句(就是最长的那句)后面加一个词:single,结束编辑再按B启动。

进入single模式不需要用户名,直接就有root权限,更改密码用:passwd。

Ubuntu中库的安装:

有些程序库默认是没有安装的,就如GCC的一些库。有时候会用到,比如Ubuntu的Firefox是1.0版本的,想用1.5的话,可以下一个1.5的免安装包,运行就需要libstdc++5.so,这时候到软件包里找到这个包装上就是了。Debian核心的Linux的介绍比较少,现在也不是很清楚怎么装软件包以外的软件。rpm包是可以用alien -i命令来安装的,但是会有诸多问题,比如依赖性不好解决。不过直接从源代码编译应该是最好的办法,就是太浪费时间了。最好是上网从Ubuntu的官方介绍的方法下载安装。

Ubuntu中如何拨号上网:

版本Ubuntu 5.10,系统中没有附带像FC里system-config-network和Red Hat中redhat-config-network这样的带图形用户界面的网络设置工具,但它附带了一个类图形界面的专门拨号工具:pppoeconf,默认是不安装的,需要在开机后从软件包中安装。可以在虚拟控制台下运行,配置拨号上网的命令是:pppoeconf,在控制台中会有页面提示,按照提示操作即可。配置好以后,可以用 pon dsl-provider 命令拨号,poff 挂断,plog 查看状态。

有时候拨号连不上,如果网路没问题的话,而且再用pppoeconf 配置,在开始的modem检查阶段就通不过,重启一下Modem可以解决问题。

Ubuntu的配置:

配置方法在Ubuntu的官方主页上就有,UbuntuWiki给出了很多指导,有什么问题到那里查一下就行了。包括软件的更新和安装,也可以从那里找到下载。
Copyright ?? 2005-2006 Solrex Yang. All rights reserved.

Linux学习笔记(6)

apache服务器

安装:

可以从官方下安装包,不过一般的Linux发行版本都会带,除了一些叫Desktop的版本(就比如Red Flag Desktop)。现在一般都是apache2.x。

根据版本的不一样,一些命令可能有差别,Red Hat一直是用httpd守护进程来执行的一些命令和管理,但是Ubuntu就是直接用apache相关的命令来管理,可能根据各自的使用范围有些差别吧,但是核心的东西还是一样的。我用的是Ubuntu,大致debian也应该如此吧。

基本配置:

基本配置文件的位置和名称也随着发行版本的不同而不同,Red Hat用的是httpd.conf,Ubuntu的是apache2.conf,虽然也有httpd.conf,但是作用是不一样的。如果你是自己编译源代码,可以设置它的名字和位置为你自己的东西。在Ubuntu中它的位置在/etc/apache2/目录下。

由于好多书介绍的服务器配置针对的是低版本的服务器,这里尝试对apache2的conf文件的格式和内容进行一下解释:
格式:一行一个指令,指令不区分大小写,指令参数要区分大小写,"#"开头行表示注释,被忽略。
内容:
ServerRoot "/etc/apache2"
apache2配置文件所在目录,主要是寻找站点的设定和模块的链接。
LockFile /var/lock/apache2/accept.lock
系统初始化时控制脚本使用LockFile来协调启动和关闭进程。
PidFile /var/run/apache2.pid
服务器启动时候保存进程序列号,以便于管理。
Timeout 300
在终止某个功能之前,用这个变量来设置时间,单位为秒,也是为了便于管理。
KeepAlive On , MaxKeepAliveRequests 100 , KeepAliveTimeout 15
是否允许每个连接提出多于一个的请求,最多允许多少个请求,服务器对请求的等待时间
<IfModule *.c>
………………
</IfModule>
用于特定模块的指令,当加载时候才会生效,仅在启动中起作用。其中有几个比较重要的:
MinSpareServers 5 , MaxSpareServers 10
系统用来处理瞬时负载的后备服务器监控程序的最小(大)数目。
StartServers 5
控制脚本运行时,默认启动的监控程序的数目。
MaxClients 20
最多客户端连接数。
MaxRequestsPerChild 0
最大请求数,超过这个次数就停止服务器,0为不限制。
User www-data
Group www-data
执行服务器的用户名和所属组
LogFormat "%{User-agent}i" agent
服务器日志格式
ErrorLog /var/log/apache2/error.log
全局错误日志位置
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
包含模块的设置
Include /etc/apache2/httpd.conf
包含用户的配置
Include /etc/apache2/ports.conf
包含监听的端口,在低版本的服务器上是用Listen命令直接加到这里的。
Alias /icons/ "/usr/share/apache2/icons/"
别名,或者叫做映射,在URL路径中加上前面的/icons/,服务器默认指向后面的目录。
<Directory "/usr/share/apache2/icons">
…………
</Directory>
此类模块中的指令和配置只作用于后面指定的目录中,若是<Files "">则是指文件。
ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var
指定的服务器错误页面指向,一般只用默认即可。
DirectoryIndex index.html index.cgi index.pl index.php index.xhtml
默认主页文件名,如果目录下存在其中的一种,就直接将它返回,比较经常修改的一个属性。
AccessFileName .htaccess
辅助访问文件名,将此文件放到某一个目录下,可以定义此目录的访问设置。
UseCanonicalName Off
TypesConfig /etc/mime.types
HostnameLookups Off
IndexOptions FancyIndexing VersionSort
这几个不是很懂。
AddIcon , AddEncoding , AddLanguage, AddCharset, AddType
顾名思义,没什么意思,默认即可。
AddHandler cgi-script .cgi .pl
以cgi或者pl为后缀的文件当作cgi-script,返回cgi处理后的数据。在这里设置以后对全局生效,一般情况下出于安全性考虑会被注释掉。
BrowserMatch "Mozilla/2" nokeepalive
对于访问类型使用不同的方法对待连接。
Include /etc/apache2/sites-enabled/[^.#]*
包含站点的设定文件,即是虚拟目录设定所在目录,在apache中,站点属性和虚拟目录的设定是在另外的目录中进行的。

也是刚开始学习,有些地方说不太清楚,以后会有更详尽的解释。
Copyright ?? 2005-2006 Solrex Yang. All rights reserved.

心烦意乱

最近心情不是很平静,大概又该到五一的缘故。每逢节日的时候就会感到孤单,也许和环境有关吧,痛恨自己。

第三天晚上没有出去自习了,本来今天是没打算呆在宿舍的,可是昨天踢球时候把腿磕破了,正好在膝盖上方,裤子一碰到就痛得不行。想想在教室里卷着裤腿也不雅观,还是回来吧。自制力还是不够,懦弱的人那。

在宿舍也干不了什么事情,迷上了wiki,用来作笔记挺不错的。调了一下一个asp的,可是没想到上传到空间里居然不能用,两个能用的吧自己又不喜欢,算了,就只在自己的机子上装一个好了,asp的东西还是不好用。

跟电脑过不去,Linux老是对中文支持不好,FC和Ubuntu用起来都很麻烦,已经习惯了Redhat的Linux,对Debian还是不习惯。一怒之下,干脆装了个RedFlag,正好自己还有原装的盘,也不用再去下了,还支持国货。没想到居然用起来很爽(这句话说出来恐怕是要被那些用Debian,SuSE的人鄙视的),但用起来真的很方便,中文输入法和文件名都根本不用配置。可惜的是它为了追求易用在界面上丧失了一些Linux共有的东西,一切全仿照Windows来的,虽然说核心没变。KDE的窗口也有点耗资源。决心以后再也不在操作系统上消耗时间了。

唉,越来越不习惯在BLOG上写自己的心情了,也没有太多的空闲去牢骚。手机也很少短信,每天晚上回去开一会儿机,有一两条就回一下,没有就关机睡觉。现在觉得实在是身外之物,不带也罢,乐得没辐射,就让它天天在宿舍躺着吧。

这个学期还是蛮平静的,偶尔烦躁一下也是难免,有点像大一时候了。对一切不再抱有期望,冷眼看人来人往,说是随遇而安也不为过。想起来东坡的词:余问柔:岭南水土,应是不好?柔对曰:此心安处,便是吾乡。可是仍有勘不破啊。

又,每晚听“City夜动听”临末了张艺的祝福:春暖心安,是一个不错的词,送诸位!

Copyright © 2005-2006 Solrex Yang. All rights reserved.

Internship

现在是危机感越来越重,才大三就想找个暑期实习的机会锻炼一下。所以这两天就一直在找Intern。谁知道老师忽然给了个通知,说,贴去吧,Goldman Sachs的实习生招聘。想是可能高盛有查看简历的南大学生,在百合上说只有7个人应聘,觉得应该给南大学生通个风、报个信,就找到了老师让帮下忙。

看了是做技术支持的,我觉得还满感兴趣。再说,计算机,数学,金融,我学的这几门全了。要是真做金融的话,我还不定想去申请,既然是计算机,应该还好吧。

填简历真是一个痛苦的工程啊,浪费时间不说,我真的很怀疑公司要了那么多个人信息究竟要干什么?这大概就是跨国公司的信息战略吧,说不定哪天用得上呢。先要英文,后要中文,你真不如早说了要两份先,我准备好了再去上网添,别到半拉子再让我临时做。

英文的resume是用OpenOffice做的,感觉还挺不错,看来开源也能做到很perfect嘛,而且它里面集成了导出成pdf文件功能,这点就比word好,word还必须用acrobat插件。今天背单词偶然发现acrobat居然还是一个词:杂技演员。看来好多软件公司给软件起名字还是蛮有艺术的,像Eclipse,Delphi,Ubuntu,挺好玩的。

最近还把个人网站改了一下,改用Flash,更新太麻烦了,打算就这样放那好了,就是做个个人介绍嘛。Flash是用的免费模板,原来是法文的,而且照片属于那种巨艺术的,文字和链接改了改,图片实在也不知道改什么好,就放那了。

还准备再申请几个公司的Internship,不过都是巨牛的,录取的可能性渺茫。可是万一哪块砖头砸到我了,就发大了。尤其是高盛这个,香港啊,光冲着免费给我来回香港和办理出入海关,我就觉得非常之值得。几乎所有公司都要英文能力,填得我发蒙,虽然说咱英语也不差,但是那些乱七八糟的东西怎么翻成英文着实是费了老鼻子劲了。而且,口语,最难的一关了怕是,所以要开始晨读了,别管能不能侃,起码发音得准点吧,真怀念高中时候在教室读书的感觉。

努力啊!
Copyright © 2005-2006 Solrex Yang. All rights reserved.