北京之行感触总结

2007年04月22日

终于回来了。终于结束了朝八晚十的生活,彻底和庞大的小强大军say:Goodbye!以下就是这一个月生活和感触的总结~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~感触分割线~~~~~~~~~~~~~~~~~~~~~~~~~~

终于回来了。终于结束了朝八晚十的生活,彻底和庞大的小强大军say:Goodbye!

大三的时候竞赛争杯时去过北京,当时对北京的印象就不大好。繁华,同时繁忙,大气,但是拥挤。从一个地方到另一个地方,倒地铁要倒几次,倒公车还要倒几次。不禁深深怀恋家乡那一辆出租全城跑的景象,就算是在西安,公交某一路,也基本满足需求了。

或许一个懒人,就不会喜欢这种生活状态吧。所以这次去北京待了一个月,同样没有对这个城市的看法有任何改观。反而还多了一个不好的印象:啥东西都是死贵。

香蕉跳楼甩卖了,3块7一斤。
草莓便宜卖了,6块一斤。
老板,盒饭多少钱?兄弟,10块。

抢劫阿~~~~~~~~~

有一天,走在大街上,看见卖菠萝的摊子,一问价,一块钱一个!Yes,终于找到和西安一样价钱的东西了!所以每天都要买上两三个,吃得美滋滋的。然后今天回到西安,看见西安大街上卖的一块钱菠萝,彻底崩溃了------这里的个头是北京的两倍大。

我心中最后一块圣地也被玷污了。

其它诸如房价什么的,也让我对这个城市欣赏不起来。以前至少还有天。第九层楼道高于我的视线,所以没看见什么。在对面五层楼的护栏上,排着七盆花草。时节还没完全来到,有三盆依旧秃着中一件淡绿细直纹短袖我最喜欢。之前两天它都区别其它的短袖,单件掺着洗衣粉放在红色小塑料桶浸泡,现在应该把它们一门和ms亚洲研究院让我非常向往,但是俺们现在已经是linuxer了,这次也抽时间去天。第九层楼道高于我的视线,所以没看见什么。在对面五层楼的护栏上,排着七盆花草。时节还没完全来到,有三盆依旧秃着中一件淡绿细直纹短袖我最喜欢。之前两天它都区别其它的短袖,单件掺着洗衣粉放在红色小塑料桶浸泡,现在应该把它们一门看了看升旗,因此,北京再也没有任何一个吸引我的地方了。以后找工作会来么?不知道,至少,北京不会是最好的选择。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~完成目标分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~

来北京的第一天就定下了这几个目标:

1 有机会一定要见到若水和camp两人。
2 一定要去西单的五环或者nike,adi专卖逛逛,合适就买一些衣服。
3 逛任意一间有名的大书城
4 好好逛一逛中关村
5 临走前带一些好吃的回西安

现在来一个总结陈述吧。

首先,深深为我和若水的缘份叹息。在我来到北京的前两周,这小子居然来到了陕西出差......也许我们在火车上擦肩而过阿。等他回北京的时候,我已经忙着加班,没有时间出来玩了。

其次,买衣服,估计是我这次完成的最出色的目标。一件nike的宽型短袖,一条adi硕大的裤子,都是我最喜欢的衣服风格,就是,肥大型。以前很胖的时候,买衣服就一定要买很大的,现在虽然瘦了很多,但是这个习惯还是保留了。其它诸如lining以及锐步的衣服若干,可谓大丰收。当然,也花去了一半多的实习薪水......

第三,我选择了中关村图书大厦。进去逛了一圈发现,其实和成都西安的大书城是差不多的。在越来越习惯网上购书的今天,我对书城已经彻底失去了逛的兴趣。

第四,虽然没有见到若水,不过好歹还是见了远望上的ccn以及柠檬等朋友,和他们一起在中关村渡过了开心的一天。从他们身上看到了以前狂爱硬件的自己,呵呵,很有热情和很有水平的一群人阿。这个目标也算完成得不错。

最后,深深的,再次深深的,第三次深深的,为所有要求我带好吃的回学校的同志们说声道歉~~~~~~我确实去了n次沃尔玛,但是我确实没有找到任何在西安没有的,只有北京有的,独具特色的好吃的东西------价值1000以上的老鳖除外。所以最后,我什么吃的东西都没有带回来。各路朋友不要失望,你们应该感到开心,因为至少说明了我们西电周围的大超市的物品种类还是很丰富的,呵呵。

所以,总的来说,这次去北京的任务计划基本还是达到了。

~~~~~~~~~~~~~~~~~~~~不要再瘦不要再瘦不要再瘦增肥分割线~~~~~~~~~~~~~~~~~~~~

在去北京之前,心里觉得肯定会长胖。一个月不打球,每天都吃得很饱,虽然味道一般,但是营养也不错。所以心想,说不定回西安时候,就会长到190了。190一直都是我所认为的最合适体重,稍微有点胖,又不算太胖,刚刚好那种。

然后盼星星盼月亮,盼到了回西安,兴冲冲地跑到宿舍楼口的秤一称......God,我没有看错吧,居然只有1*8*0!要知道,我寒假回家的时候也有185阿。心里面莫名地泛起一种恐惧感:难道我以后都不能长胖了么?

想当初小时候,就没有瘦过,一直都是处于“李*可爱的小胖子*锟”状态,自己也蛮满足这种状态的。想想当初第一次从220斤瘦到160斤,用不了多久,生活质量一上去,立马又回到210斤了。还颇为得益得觉得,自己的体重可以随意控制。从去年暑假开始,觉得210斤还是太胖了,然后蛮有信心地制定了减肥计划,事实也证明,如果我想瘦下来,确实是很快就能瘦下来。

但是唯一一点不同的是,我现在胖不上去了。

我少打球,我多吃肉,我每天在实验室喝三包豆奶,中午吃肉,晚上吃肉,水果不断,临睡前偶尔还加餐,吃花生饼干啥的。我已经很努力,很努力得让自己朝着长胖的目标前进了。

别人说瘦了好看,但是我的生活不是拿来给别人看的。我喜欢稍微胖一点的状态,冬天不冷,打球能吃身体,平时上街被抢的几率都会少上很多。我姐当初都说,谁和我一起上街,肯定有无敌的安全感。

可我现在为什么就是不长胖呢?

从今天开始制定增肥计划,我这人一旦下决心做一件事情,那么就会不顾一切去实现他。而这次的决心,就是:暑假之前恢复到190!主阿,我会好好学习天天向上努力工作遵守六项原则为和谐社会的建设贡献自己的力量,我唯一的要求就是:让我恢复能够随意控制体重的超能力吧!

~~~~~~~~~~~~~~~~~~~~~~~个人分割线~~~~~~~~~~~~~~~~~~~~~~~~~~

我喜欢阿甘。

我知道很多人都挺喜欢他的,傻傻的人,最后取得了一系列完全出乎人们意料的成功。且不说他搞笑般的成功,至少人们会为这部片子所感动,就说明了,在现代逐渐迷失的社会,其实人的内心,还是追求着那一份纯洁。

傻乎乎和白痴,有时候等同于一系列优秀品质:朴实,勇敢,诚信,坚韧,努力,善良,对感情的执著,以及,最重要的,童真。也许只有心纯如此,才能成为阿甘,一个智商75,到现在也被不少人嘲笑的傻瓜。

所以我喜欢他,我希望在他身上看到我自己。人们普遍羡慕的是大军火商尤瑞的叱诧风云,或者是尼克·内勒能够吸引全天下女子的那张颠倒黑白的嘴。如果不是歪打正着,谁会知道阿甘?who know and who care?

life is like a box of chocolate, you never know what you're gonna get.

老外喜欢随机放混装口味的巧克力。说白了,这句话就是想告诉我们,生活就是随机过程,无论我们现在经历的是何种人生,我们都应该庆幸,因为结果并不是最重要的。只有保持阿甘这种生活态度和坚强意志的人,只有拥有享受过程的信念的人,只有为了自己的目标踏实、不懈、坚定地奋斗的人,只有心灵中没有杂念的人,才能在人生中举重若轻,获得属于自己的辉煌。

阿甘能够打败肖申克,拿下奥斯卡,也许对生命的执著和生活的期望这种对心灵深处最朴实的冲击才是最需要的。人们都喜欢这东西。因为人们都缺少这东西。所以我喜欢傻子阿甘。更庆幸的是,我身边有少部分认识的人,有大多数这样的品质。

我承认这些话放在这里特别突兀,只是北京之行中的一些事情,让我对自己的风格产生了一丝怀疑。辗转反侧,终于想起了阿甘,多年前给我心灵撞击的人,然后回顾了一次阿甘正传,在23岁的今天,终于大彻大悟。

当世界与你不同时,用沉默反驳,用行动挣脱枷锁。保持自己,过自己想要的生活,即使全世界都在你前面拜金。

~~~~~~~~~~~~~~~~~~~最后发骚线~~~~~~~~~~~~~~~~~~~~~

人生若只如初见,多好。

如何在英文环境下安装fcitx

2007年04月22日

当初为了使用eda工具而不在终端下显示那么多警告,把实验室的机器整成了英文环境的ubuntu,啥都正常,就是不能用自己编译的fcitx。寻觅了很久,终于得出解决办法。现在虽然已经换回704的中文环境了,但是还是放出方法如下:

1.

1 安装fcitx包,从源里安装3.1或者自己编译最新的3.4版都可以,总之是要安上。值得注意的一点是,安装完毕后在/etc/X11/xinit/xinput.d/下应该有一个fcitx文件,这个是之后的im-swith需要用到的。如果从源里安装这个文件会自动生成,如果是自己编译安装,可能需要自己建立这个文件,内容为:

XIM=fcitx
XIM_PROGRAM=/usr/bin/fcitx
XIM_ARGS=""
GTK_IM_MODULE=XIM
QT_IM_MODULE=XIM
DEPENDS="fcitx"

还要注意一点,就是如果自己编译时不指定安装路径,默认的可执行文件会在/usr/local/bin而不是/usr/bin下,所以要么修改上面的XIM_PROGRAM一行,要么在/usr/bin下建个符号链接。

2 然后,确认安装了im-switch,如果没有就apt安装一下。之后运行:

im-switch -s fcitx

如果成功,会有如果提示:

From the package dependency information, following packages
may be useful to install:
"fcitx"

如果没成功,看下第一点的注意事项。

3 做完以上步骤后理论上已经配置好了fcitx的环境,当locale设置为zh_CN*的时候,可以不设置XMODIFIERS。当为en_US.utf-8时,必须设置XMODIFIERS,否则将无法工作,因为所有的gtk程序在完成以上的配置后,默认的输入法仍然是“default”而不是“X Input Method(即XIM)”。注意一下输入区域的右键菜单“Input Method”项,就会发现这一点,而此时如果你从那个菜单里选择“X Input Method”,输入法就可以成功调出来了。

现在的问题是怎么让系统把GTK程序的默认的输入法设置成XIM而不需要你自己每次手动从菜单里改(何况在firefox这种程序里,右键菜单都没有Input Method那项)。在LinuxSir上有人提出过修改.bashrc或者.bash_profile文件,加入export GTK_IM_MODULE=XIM的方法。我试过,不管改的是哪个文件都不起作用。今天看到这一贴,提到了一个十分牛逼的方法,即修改/etc/gtk-2.0/gtk.immodules文件,把有关xim的部分改成:

"/usr/lib/gtk-2.0/2.4.0/immodules/im-xim.so"
"xim" "X Input Method" "gtk20" "/usr/share/locale" "en:ko:ja:th:zh"

多加上的en就会使GTK程序在en_US的环境下也启用xim作为输入法了。

4 你经常会遇到的问题如下:

FCITX -- Get signal NO.:11 FCITX -- Exit signal NO.:11
这种问题通常是在安装新版本之前没有删除home目录下的.fcitx目录所导致。只有删除后重新安装才能继续使用。

im-switch的时候提示
Please install following packages:
"( fcitx )"
这个问题很奇怪,我也不清楚怎么回事,但是不会影响使用,反正不管就行了。

5 小知识:怎样设定locale呢?

设定locale就是设定12大类的locale分类属性,即 12个LC_*。除了这12个变量可以设定以外,为了简便起见,还有两个变量: LC_ALL和LANG。它们之间有一个优先级的关系: LC_ALL>LC_*>LANG 可以这么说,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值。 1、如果你设定了LC_ALL=zh_CN.UTF-8,那么不管LC_*和LANG设定成什么值,它们都会被强制线吸引我,我加了七元钱换下它。此刻房子里的光线较差,到门口刚明亮一点又很快暗下去。天变得真快,我俯下身子往盆子服从 LC_ALL的设定,成为 zh_CN.UTF-8。 2、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_*=en_US.UTF-8,并且没有设定LC_ALL的话,那么系统的locale设定以LC_*=en_US.UTF-8。 3、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_*,和LC_ALL均未设定的话,系统会将LC_*设定成默认值,也就是LANG的值 zh_CN.UTF-8 。 4、假如你设定了 LANG=zh_CN.UTF-8,而其他的LC_CTYPE=en_US.UTF-8,其他的LC_*,和LC_ALL均未设定的话,那么系统的 locale设定将是:LC_CTYPE=en_US.UTF-8,其余的 LC_COLLATE,LC_MESSAGES等等均会采用默认值,也就是 LANG的值,也就是LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=zh_CN.UTF-8。

所以,locale是这样设定的: 1、如果你需要一个纯中文的系统的话,设定LC_ALL= zh_CN.XXXX,或者LANG= zh_CN.XXXX都可以,当然你可以两个都设定,但正如上面所讲,LC_ALL的值将覆盖所有其他的locale设定,不要作无用功。 2、如果你只想要一个可以输入中文的环境,而保持菜单、标题,系统信息等等为英文界面,那么只需要设定LC_CTYPE=zh_CN.XXXX,LANG= en_US.XXXX就可以了。这样LC_CTYPE=zh_CN.XXXX,而LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=en_US.XXXX。 3、假如你高兴的话,可以把12个LC_*一一设定成你需要的值,打造一个古灵精怪的系统: LC_CTYPE=zh_CN.GBK/GBK(使用中文编码内码GBK字符集); LC_NUMERIC=en_GB.ISO-8859-1(使用大不列颠的数字系统) LC_MEASUREMEN=de_DE@euro.ISO-8859-15(德国的度量衡使用ISO-8859-15字符集) 罗马的地址书写方式,美国的纸张设定……。估计没人这么干吧。 4、假如你什么也不做的话,也就是LC_ALL,LANG和LC_*均不指定特定值的话,系统将采用POSIX作为lcoale,也就是C locale。

如何打一个完美的......盹

2007年03月29日

lifehack又出好文,这真是一个奇妙的网站。solidot把它翻译了过来。恩看来以后在实验室和课堂上睡觉有理由了!我在打*源动力*盹。

* 1 首先在心理学上:认识到并不是你懒;打盹会让你更加高效而且机敏。

* 2 试着在早上或午餐后打盹;人的生物钟让下午更容易深度(慢波)睡眠。

* 3 避免饮食大量咖啡,高脂高糖的食物,那些会干扰睡眠的能力。

* 4 相反,在你打盹前的一两个小时内,使用高钙高蛋白的食物,那些会促进睡眠。

* 5 找一个干净,安静的地方,那里路人和手机不会打扰你。

* 6 试着让你的打盹区更昏暗,或者带上眼罩。黑暗会刺激褪黑激素,那是睡眠诱导荷尔蒙。

* 7 记住睡觉时体温会下降。要提高室温或用被子。

* 8 当你放松下来准备睡觉,定好闹钟来达到想要的持续时间。

不同时长的打盹:

纳米级盹: 10到20秒的睡觉在研究上还没有得到是否有利的断定,就像你在火车上盹在某个人的肩膀上。

微型盹: 两到五分钟被证明能惊人地有效驱除睡意。

迷你盹: 五到二十分钟能增加机敏度,耐力,运动学习,运动性能。

源动力盹: 20分钟不仅包括微型和迷你的益处,同时还改善了肌肉记忆并大脑中的无用信息,能对长期记忆(记忆事实,事情,和名字)有益。

懒虫盹: 50到90分钟包括慢波和雷姆睡眠;对改善认知处理有益;同时当系统内生长荷尔蒙过量时,能帮助修补骨骼和肌肉。"

关于grub启动流程的讨论总结

2007年03月28日

全世界linuxer都知道grub是什么东西,但对于MBR引导到grub再引导到具体操作系统的这个流程可能有不少朋友就比较迷糊了。这不,cu上一位朋友就发出了这样一个求助贴:

假如现在一台电脑上装了WIN2000系统,那么我现在在装上LINUX系统和GRUB,那么假如把GRUB装在主分区的话,GRUB直接引导 LINUX和WIN2000,我是可以理解的,因为MBR中是GRUB的STAGE1(对不对呢?),MBR通过检查DPT分区信息引导系统跳转至DBR (活动分区),我这里想问的活动分区是什么时候设的呢?那么装GRUB到MBR里,那原来MBR中的WIN的引导信息是怎么处理的呢?是不是我们假如说装 GRUB到MBR的时候,GRUB就把GRUB所在那个区设置为了活动分区了呢?然后GRUB引导时候,MBR就找到那个活动分区找到所需要的文件,然后继续呢?假如说把GRUB装到其他分区(非主引导区)的话,那是怎么样实现GRUB先启动的呢?不是先MBR吗?因为装到了其他分区,没有改主引导区,因此主引导区还是WIN2000的引导数据啊,怎么会GRUB先启动了呢?这是为什么呢?跟活动分区有关系没有呢?我看资料上写的是哪个系统启动哪个系统就是活动分区,可是那样的话,似乎就解释不通了啊,就是最最开始这个地方一直不懂,理不清楚。

下面就是cu各个玩家对这个问题分析讨论的总结。

首先让我们看看传统的启动流程:加载并运行Master Boot Record(MBR)主引导区内容(如lilo等)。然后扫描分区表,定位活动分区,并将活动分区上的引导扇区内容加载到内存中执行。

系统引导过程主要由以下几个步骤组成(以硬盘启动为例)

  1、 开机;
  2、 BIOS加电自检(POST——Power On Self Test),内存地址为0fff:0000;
  3、 将硬盘第一个扇区(0头0道1扇区,也就是Boot Sector)读入内存地址0000:7c00处;
  4、 检查(WORD)0000:7dfe是否等于0xaa55.若不等于则转去尝试其他介质;如果没有其他启动介质,则显示 “No ROM BASIC” ,然后死机;
  5、 跳转到0000:7c00处执行MBR中的程序;
  6、 MBR先将自己复制到0000:0600处,然后继续执行;
  7、 在主分区表中搜索标志为活动的分区。如果发现没有活动分区或者不止一个活动分区,则停止;
  8、 将活动分区的第一个扇区读入内存地址0000:7c00处;
  9、 检查(WORD)0000:7dfe是否等于0xaa55,若不等于则显示 “Missing Operating System”,然后停止,或尝试软盘启动;
  10、 跳转到0000:7c00处继续执行特定系统的启动程序;
  11、 启动系统。
  

装grub到逻辑分区,那么就一定把grub装入的逻辑分区设为活动的。不过,这时候,grub接管了11步以后的动作:从stage 1.5读出grub.conf。再由配置和用户选择决定下一步的引导行为。

一般安装grub都有两种情况,对于安装到MBR这种情况而言,GRUB直接覆盖了原来的MBR引导程序。这也是为什么要换回“原来的windows的引导方式”,只要用dos引导fdisk /mbr一下就可以的原因。为什么可以这样做,请注意,1-11步中有两个地方出现了0000:7c00。不管是dos boot sector还是nt loader它本身也是从0000:7c00运行的。其实ms当年开发分区管理的这个小程序相当于是在bios引导boot sector中插进去的。grub因为也是写的从0000:7c00这个内存开始的子程序,那么既可以被BIOS加载又可以被dos的MBR加载应该好理解了吧。

开机自检后,引导权交给了硬盘的MBR,此时grub就启动了。由grub来引导windows /linux都可以。注意:linux不一定要安装在活动分区,因为引导程序在MBR!但是windows一定要安装在活动分区(可引导的windows),第二个windows可以不安装在活动分区,但它的引导文件一定在活动分区。

大体顺序是:
grub---->windows-->查找引导文件---引导加载---启动windows
grub---->linux--->查找引导文件(/boot)-->引导加载---启动linux

那么,如果把grub安装到了其它的分区上,不是MBR呢?这是grub所装在的那个主分区必须被设为活动分区。因为MBR(物理主引导分区)中其实并没有OS相关的引导程序的,通常MBR只是扫描并读取随后的分区表,找到相应的活动分区,读取相应活动分区的第一个扇区的512字节程序并运行,该程序负责进一步引导相应分区的相应系统。因此,大概的运行次序是
BIOS--->MBR---->GRUB---->菜单。

这样,大体的真实流程就可以总结如下了:

  1、 开机;
  2、 BIOS加电自检(POST——Power On Self Test),内存地址为0fff:0000;
  3、 将硬盘第一个扇区(0头0道1扇区,也就是Boot Sector)读入内存地址0000:7c00处;
  4、 检查(WORD)0000:7dfe是否等于0xaa55.若不等于则转去尝试其他介质;如果没有其他启动介质,则显示 “No ROM BASIC” ,然后死机;
  5、 跳转到0000:7c00处执行MBR中的程序;
  6、 MBR先将自己复制到0000:0600处,然后继续执行;假如先装XP后装LINUX,并且LINUX没有装在MBR,那这个MBR中的数据还是WIN写的数据,它的作用都是下步中所说的作用,就是搜索主分区表中标志为活动的分区,那么这个时候就必须把GRUB所在的主分区设置为活动的分区,这个时候才能正常的启动GRUB,然后GRUB的STAGE1在调STAGE1.5和其他的,从而来引导整个系统。假如说先装XP后装LINUX,但是GRUB装在了MBR,那样STAGE1直接调入内存,STAGE1在调STAGE1.5和STAGE2等,从而来引导系统。那这个时候是不需要将GRUB其他文件所在的主分区设为活动分区的,它直接调STAGE1.5等,然后再调STAGE2等,来识别文件系统,从而实现可多启动。
  7、 在主分区表中搜索标志为活动的分区。如果发现没有活动分区或者不止一个活动分区,则停止;
  8、 将活动分区的第一个扇区读入内存地址0000:7c00处;
  9、 检查(WORD)0000:7dfe是否等于0xaa55,若不等于则显示 “Missing Operating System”,然后停止,或尝试软盘启动;
  10、 跳转到0000:7c00处继续执行特定系统的启动程序;
  11、 启动系统。
  
一点资料:

能正常工作的grub应该包括一下文件:stage1、stage2、*stage1_5、menu.lst。
其中stage1的大小一定是512字节,它要被安装(也就是写入)某个硬盘的主引导记录,或者某个活动分区(这个分区要用fdisk标记成可启动的)的启动扇区。stage1的主要的也是唯一的作用就是找到你存放在硬盘上某个地方的stage2文件,来完成后续的工作。

stage2文件可以存在在某个特定的文件系统中,比如你分了一个linux分区,在上面创建一个ext2文件系统,然后把这个文件拷贝到这个分区的某个目录下。也可以把stage2直接存放在硬盘的某个位置,也就是未分区的某个地方。不过,好像没有多少人会这么做吧。^_^

因为stage1的容量有限(主引导记录MBR和启动扇区的大小只能够是512字节),所以它对文件系统是无法识别的,那如果你把stage2存放在 ext2或者fat格式的文件系统上,它如何来找到这个文件呢?这就要用到上面提到的那些stage1_5的文件了,它们负责解释文件系统。你的 stage2放在什么格式的文件系统上,就要调用对应的那个stage1_5文件。比如,你把stage2存放在ext2格式的文件系统上,就需要 e2fs_stage1_5;stage2存放在fat格式的文件系统上,就需要fat_stage1_5了。

crc32硬件实现心得分享,并放出源代码

2007年03月23日

最近在为fpga做一个crc32校验的模块,本来不想找现成的代码,准备自己看原理来编写,没想到原理很简单,由于输入数据的频率非常高,考虑到数据同步,实际的编写过程还是有点周折的,以为一天搞定的事情,花了至少三、四天吧。网上提供的crc32源代码基本都是c语言或者汇编,用硬件描述语言的非常少,因此把自己总结以及网上搜集整理的学习心得总结一下,并放出两种实现方式的verilog源代码。结果和winrar的crc校验结果比较过,均正确。
1 如何生成CRC校验码

(1) 设G(X)为W阶,在数据块末尾添加W个0,使数据块为M+ W位,则相应的多项式为XrM(X);
  
(2) 以2为模,用对应于G(X)的位串去除对应于XrM(X)的位串,求得余数位串;
  
(3) 以2为模,从对应于XrM(X)的位串中减去余数位串,结果就是为数据块生成的带足够校验信息的CRC校验码位串。

这个二进制除法的没有优化的伪代码大概可以这样写(设除数有P个bits):
  {
    任命余数r = 被除数的前(P-1)位;
    while(被除数还有剩余bit没有补入到r中)
    {
      补入一个bit到r中;
      r = 补位后的r作为被除数 除以 除数 所得的余数;
    }
    把r拿出来
  }

这个G(X)不用自己去选择,现在基本都成标准的多项式了,去网上一搜就有一堆。

我们知道G(x)的最高位一定是1,而商1还是商0是由被除数的最高位决定的。而我们并不关心商究竟是多少,我们关心的是余数。例如上例中的G(x)有5 位。我们可以看到每一步作除法运算所得的余数其实就是被除数的最高位后的四位于G(x)的后四位XOR而得到的。那被除数的最高位有什么用呢?我们从打记号的两个不同的余数就知道原因了。当被除数的最高位是1时,商1然后把最高位以后的四位于G(x)的后四位XOR得到余数;如果最高位是0,商0然后把被除数的最高位以后的四位于G(x)的后四位XOR得到余数,而我们发现其实这个余数就是原来被除数最高位以后的四位的值。也就是说如果最高位是0就不需要作XOR的运算了。到这我们总算知道了为什么先前要这样建立模型,而算法的原理也就清楚了。

关于除数多项式Poly(以下简称Poly)。我曾经看过一篇中文文档中说,“不要问我为什么Poly的最高位和最低位都是1,因为这是规定”。规定当然是规定,但是做出这种规定也应当是有原因的吧?根据我的个人理解(当然,也许这是错误的理解),首先最高位必须为1,这个bit位在英文文档中称为 "Active" bit,为什么呢?如果Poly最高位不是1那么除法无法进行下去而得到有我们所需要的位数的余数(当Poly最高位为0而被除数高位为1时无法抵消)。而低位为什么也必须为1呢?在有的使用场合是把CRC的Poly和被除数都做了反射之后再进行的,这种情况下低位反射成了高位,基于前面同样的理由,所以必须保持最低位也为1。

2 查表法综述

可是上面实现的算法却是非常的低效。现在假设有和32bit的register。根据同样的原理我们可以得到如下的算法:

While (还有剩余没有处理的数据)

Begin

检查register头字节,并取得它的值

求不同偏移处多项式的和

register左移一个字节,最右处存入新读入的一个字节

把register的值和多项式的和进行XOR运算

End

对于每一个bit来说,都有0或者1都有其异或规则,那么同样的,每一个头字节也会对应和值。如果我们以8bit为单位移位,8 bit就该有 256个值与它对应。于是我们可以预先建立一个表然后,编码时只要取出输入数据的头一个字节然后从表中查找对应的值即可。这样就可以大大提高编码的速度了。

算法如下:
1、将寄存器向右边移动一个字节。
2、将刚移出的那个字节与我们的字符串中的新字节进行XOR运算,得出一个指向值表table[0..255]的索引。
3、将索引所指的表值与寄存器做XOR运算。
4、如果数据没有全部处理完,则跳到步骤1。

这个算法的C语言描述如下:
temp = (oldcrc ^ abyte) & 0x000000FF;
crc = (( oldcrc >> 8) & 0x00FFFFFF) ^ crc32tbl[temp];
return crc;

说实话,查找表算法如果不画图实在是很难描述清楚,所以我也不多费口舌了,网上有不少好文章来详细介绍,有兴趣的朋友去查阅就行了。

从CRC的编码规则可以看出,CRC编码实际上是将代发送的m位二进制多项式t(x)转换成了可以被g(x)除尽的m+r位二进制多项式 ,所以解码时可以用接受到的数据去除g(x),如果余数位零,则表示传输过程没有错误;如果余数不为零,则在传输过程中肯定存在错误。许多CRC的硬件解码电路就是按这种方式进行检错的。同时 可以看做是由t(x)和CRC校验码的组合,所以解码时将接收到的二进制数据去掉尾部的r位数据,得到的就是原始数据。

3 实际程序

crc32查表verilog程序如下:

`timescale 1ns / 1ps
module crc32_table
(
crc_clk,
rst_n,
data,
valid,

crc32,
done
);

// input
input crc_clk;
input rst_n;
input valid;
input done;
input [15:0] data;

// output
output [31:0] crc32;
wire [31:0] crc32;

// parameter
parameter state_size = 3;
parameter IDLE = 3'b001, // wait for valid signal
CRC1 = 3'b010, // handle data
CRC2 = 3'b100;

// internal
reg [15:0] data_buf; // buffer for input data
reg [31:0] crc32_r;
reg [31:0] register;
reg [31:0] register_r;
reg [state_size-1:0] state;
reg [31:0] crctab[255:0];

always @( posedge crc_clk or negedge rst_n )
begin
if( !rst_n )
begin
state <= IDLE; //state_next <= state; register <= 32'hffffffff; register_r <= 32'hffffffff; data_buf <= 16'h0; crctab[0] <= 32'h00000000; ........ // 这些是crc32的表值,网上有很多 crctab[255] <= 32'h2D02EF8D; end else begin case( state ) IDLE: begin if( valid ) // data is valid begin data_buf <= data; register_r <= 32'hffffffff; state <= CRC1; crc32_r <= register; end else if( done ) // data is complete begin crc32_r <= crc32_r; register <= 32'hffffffff; state <= IDLE; end // 调试时注意valid和done交接时数据包的处理有没有问题 else begin state <= IDLE; end end CRC1: begin register_r <= ( crctab[register[7:0] ^ data_buf[7:0]] ) ^ {8'h0,register[31:8]}; state <= CRC2; end CRC2: begin register <= ( crctab[register_r[7:0] ^ data_buf[15:8]] ) ^ {8'h0,register_r[31:8]}; state <= IDLE; end endcase end end assign crc32 = done?~crc32_r:32'd0; endmodule 标准表值请见此文件:http://likunarmstrong.googlepages.com/crc_table.txt 下面是优化过直接计算crc32值的程序。 ////////////////////////////////////////////////////////////////////////////// // // crc calculation // This VERILOG code was generated using CRCGEN.PL version 1.7 // Last Modified: 01/02/2002 // Options Used: // Module Name = crc32 // CRC Width = 32 // Data Width = 16 // CRC Init = F // Polynomial = [0 -> 32]
// 1 1 1 0 1 1 0 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1
//
//////////////////////////////////////////////////////////////////////////////

module crc32 (
crc,
d,
calc,
init,
d_valid,
clk,
reset
);

output [15:0] crc;
reg [15:0] crc;

input [15:0] d;
input calc;
input init;
input d_valid;
input clk;
input reset;

//////////////////////////////////////////////////////////////////////////////
// Internal Signals
//////////////////////////////////////////////////////////////////////////////
wire [31:0] next_crc;
reg [31:0] crc_reg;

//////////////////////////////////////////////////////////////////////////////
// Infer CRC-32 registers
//
// The crc_reg register stores the CRC-32 value.
// The crc register is the most significant 16 bits of the
// CRC-32 value.
//
// Truth Table:
// -----+---------+----------+----------------------------------------------
// calc | d_valid | crc_reg | crc
// -----+---------+----------+----------------------------------------------
// 0 | 0 | crc_reg | crc
// 0 | 1 | shift | bit-swapped, complimented msbyte of crc_reg
// 1 | 0 | crc_reg | crc
// 1 | 1 | next_crc | bit-swapped, complimented msbyte of next_crc
// -----+---------+----------+----------------------------------------------
//
//////////////////////////////////////////////////////////////////////////////

always @ (posedge clk or negedge reset)
begin
if (!reset) begin
crc_reg <= 32'hFFFFFFFF; crc <= 16'hFFFF; end else if (init) begin crc_reg <= 32'hFFFFFFFF; crc <= 16'hFFFF; end else if (calc & d_valid) begin crc_reg <= next_crc; crc <= ~{next_crc[16], next_crc[17], next_crc[18], next_crc[19], next_crc[20], next_crc[21], next_crc[22], next_crc[23], next_crc[24], next_crc[25], next_crc[26], next_crc[27], next_crc[28], next_crc[29], next_crc[30], next_crc[31]}; end else if (~calc & d_valid) begin crc_reg <= {crc_reg[15:0], 16'hFFFF}; crc <= ~{crc_reg[0], crc_reg[1], crc_reg[2], crc_reg[3], crc_reg[4], crc_reg[5], crc_reg[6], crc_reg[7], crc_reg[8], crc_reg[9], crc_reg[10], crc_reg[11], crc_reg[12], crc_reg[13], crc_reg[14], crc_reg[15]}; end end ////////////////////////////////////////////////////////////////////////////// // CRC XOR equations ////////////////////////////////////////////////////////////////////////////// assign next_crc[0] = crc_reg[22] ^ crc_reg[25] ^ d[5] ^ d[3] ^ d[6] ^ crc_reg[16] ^ crc_reg[28] ^ d[15] ^ d[9] ^ crc_reg[26]; assign next_crc[1] = crc_reg[22] ^ crc_reg[17] ^ d[3] ^ crc_reg[27] ^ d[15] ^ d[4] ^ crc_reg[25] ^ d[8] ^ crc_reg[23] ^ d[2] ^ crc_reg[29] ^ d[6] ^ crc_reg[16] ^ crc_reg[28] ^ d[14] ^ d[9]; assign next_crc[2] = crc_reg[22] ^ crc_reg[17] ^ d[1] ^ crc_reg[30] ^ d[15] ^ crc_reg[24] ^ d[13] ^ d[7] ^ crc_reg[18] ^ crc_reg[25] ^ d[8] ^ d[2] ^ crc_reg[23] ^ d[6] ^ crc_reg[29] ^ crc_reg[16] ^ d[14] ^ d[9]; assign next_crc[3] = crc_reg[17] ^ d[1] ^ crc_reg[31] ^ crc_reg[30] ^ crc_reg[24] ^ crc_reg[19] ^ d[13] ^ d[7] ^ crc_reg[18] ^ crc_reg[25] ^ d[5] ^ d[12] ^ d[8] ^ crc_reg[23] ^ d[6] ^ d[14] ^ crc_reg[26] ^ d[0]; assign next_crc[4] = crc_reg[22] ^ crc_reg[31] ^ d[3] ^ crc_reg[27] ^ d[15] ^ crc_reg[24] ^ d[4] ^ crc_reg[19] ^ d[13] ^ d[7] ^ crc_reg[20] ^ crc_reg[18] ^ d[12] ^ d[11] ^ crc_reg[16] ^ crc_reg[28] ^ d[9] ^ d[0]; assign next_crc[5] = crc_reg[22] ^ crc_reg[17] ^ d[15] ^ crc_reg[19] ^ crc_reg[20] ^ crc_reg[21] ^ d[12] ^ d[5] ^ d[8] ^ d[10] ^ d[11] ^ crc_reg[23] ^ d[2] ^ crc_reg[29] ^ crc_reg[16] ^ d[14] ^ d[9] ^ crc_reg[26]; assign next_crc[6] = crc_reg[22] ^ crc_reg[17] ^ d[1] ^ crc_reg[27] ^ crc_reg[30] ^ crc_reg[24] ^ d[4] ^ d[13] ^ d[7] ^ crc_reg[20] ^ crc_reg[21] ^ crc_reg[18] ^ d[8] ^ d[10] ^ d[11] ^ crc_reg[23] ^ d[14] ^ d[9]; assign next_crc[7] = crc_reg[31] ^ d[15] ^ crc_reg[24] ^ crc_reg[19] ^ d[13] ^ d[7] ^ crc_reg[21] ^ crc_reg[18] ^ d[5] ^ d[12] ^ d[8] ^ d[10] ^ crc_reg[23] ^ crc_reg[16] ^ crc_reg[26] ^ d[0]; assign next_crc[8] = crc_reg[17] ^ d[3] ^ crc_reg[27] ^ d[15] ^ d[4] ^ crc_reg[24] ^ crc_reg[19] ^ crc_reg[20] ^ d[7] ^ d[12] ^ d[5] ^ d[11] ^ crc_reg[16] ^ crc_reg[28] ^ d[14] ^ crc_reg[26]; assign next_crc[9] = crc_reg[17] ^ d[3] ^ crc_reg[27] ^ d[4] ^ d[13] ^ crc_reg[20] ^ crc_reg[21] ^ crc_reg[18] ^ crc_reg[25] ^ d[10] ^ d[11] ^ d[2] ^ crc_reg[29] ^ d[6] ^ crc_reg[28] ^ d[14]; assign next_crc[10] = d[1] ^ crc_reg[30] ^ d[15] ^ crc_reg[19] ^ d[13] ^ crc_reg[21] ^ crc_reg[18] ^ crc_reg[25] ^ d[12] ^ d[10] ^ d[2] ^ crc_reg[29] ^ d[6] ^ crc_reg[16]; assign next_crc[11] = crc_reg[17] ^ d[1] ^ d[3] ^ crc_reg[31] ^ crc_reg[30] ^ d[15] ^ crc_reg[19] ^ crc_reg[20] ^ crc_reg[25] ^ d[12] ^ d[11] ^ d[6] ^ crc_reg[16] ^ crc_reg[28] ^ d[14] ^ d[0]; assign next_crc[12] = crc_reg[22] ^ crc_reg[17] ^ crc_reg[31] ^ d[3] ^ d[15] ^ d[13] ^ crc_reg[20] ^ crc_reg[21] ^ crc_reg[18] ^ crc_reg[25] ^ d[10] ^ d[11] ^ d[2] ^ d[6] ^ crc_reg[29] ^ crc_reg[16] ^ crc_reg[28] ^ d[14] ^ d[9] ^ d[0]; assign next_crc[13] = crc_reg[22] ^ crc_reg[17] ^ d[1] ^ crc_reg[30] ^ crc_reg[19] ^ d[13] ^ crc_reg[21] ^ crc_reg[18] ^ d[5] ^ d[12] ^ d[8] ^ d[10] ^ crc_reg[23] ^ d[2] ^ crc_reg[29] ^ d[14] ^ crc_reg[26] ^ d[9]; assign next_crc[14] = crc_reg[22] ^ d[1] ^ crc_reg[31] ^ crc_reg[27] ^ crc_reg[30] ^ crc_reg[24] ^ d[4] ^ crc_reg[19] ^ d[13] ^ d[7] ^ crc_reg[20] ^ crc_reg[18] ^ d[12] ^ d[8] ^ d[11] ^ crc_reg[23] ^ d[9] ^ d[0]; assign next_crc[15] = d[3] ^ crc_reg[31] ^ crc_reg[24] ^ crc_reg[19] ^ crc_reg[20] ^ d[7] ^ crc_reg[21] ^ crc_reg[25] ^ d[12] ^ d[8] ^ d[10] ^ d[11] ^ crc_reg[23] ^ d[6] ^ crc_reg[28] ^ d[0]; assign next_crc[16] = crc_reg[0] ^ d[3] ^ d[15] ^ crc_reg[24] ^ crc_reg[20] ^ d[7] ^ crc_reg[21] ^ d[10] ^ d[11] ^ d[2] ^ crc_reg[29] ^ crc_reg[16] ^ crc_reg[28]; assign next_crc[17] = crc_reg[22] ^ crc_reg[17] ^ d[1] ^ crc_reg[30] ^ crc_reg[21] ^ crc_reg[25] ^ d[10] ^ d[2] ^ d[6] ^ crc_reg[29] ^ crc_reg[1] ^ d[14] ^ d[9]; assign next_crc[18] = crc_reg[22] ^ d[1] ^ crc_reg[31] ^ crc_reg[30] ^ d[13] ^ crc_reg[18] ^ d[5] ^ d[8] ^ crc_reg[23] ^ d[9] ^ d[0] ^ crc_reg[26] ^ crc_reg[2]; assign next_crc[19] = crc_reg[31] ^ crc_reg[27] ^ crc_reg[24] ^ d[4] ^ crc_reg[19] ^ d[7] ^ d[12] ^ d[8] ^ crc_reg[23] ^ d[0] ^ crc_reg[3]; assign next_crc[20] = crc_reg[4] ^ d[3] ^ crc_reg[24] ^ crc_reg[20] ^ d[7] ^ crc_reg[25] ^ d[11] ^ d[6] ^ crc_reg[28]; assign next_crc[21] = crc_reg[5] ^ crc_reg[21] ^ crc_reg[25] ^ d[5] ^ d[10] ^ d[2] ^ d[6] ^ crc_reg[29] ^ crc_reg[26]; assign next_crc[22] = d[1] ^ d[3] ^ crc_reg[27] ^ crc_reg[30] ^ d[15] ^ d[4] ^ crc_reg[25] ^ d[6] ^ crc_reg[16] ^ crc_reg[28] ^ crc_reg[6]; assign next_crc[23] = crc_reg[22] ^ crc_reg[17] ^ crc_reg[31] ^ d[15] ^ crc_reg[7] ^ crc_reg[25] ^ d[2] ^ d[6] ^ crc_reg[29] ^ crc_reg[16] ^ d[14] ^ d[9] ^ d[0]; assign next_crc[24] = crc_reg[17] ^ d[1] ^ crc_reg[8] ^ crc_reg[30] ^ d[13] ^ crc_reg[18] ^ d[5] ^ d[8] ^ crc_reg[23] ^ d[14] ^ crc_reg[26]; assign next_crc[25] = crc_reg[9] ^ crc_reg[31] ^ crc_reg[27] ^ crc_reg[24] ^ d[4] ^ crc_reg[19] ^ d[13] ^ d[7] ^ crc_reg[18] ^ d[12] ^ d[0]; assign next_crc[26] = crc_reg[22] ^ crc_reg[10] ^ d[15] ^ crc_reg[19] ^ crc_reg[20] ^ d[12] ^ d[5] ^ d[11] ^ crc_reg[16] ^ d[9] ^ crc_reg[26]; assign next_crc[27] = crc_reg[17] ^ crc_reg[27] ^ d[4] ^ crc_reg[20] ^ crc_reg[21] ^ d[8] ^ d[10] ^ d[11] ^ crc_reg[11] ^ crc_reg[23] ^ d[14]; assign next_crc[28] = crc_reg[22] ^ d[3] ^ crc_reg[24] ^ d[13] ^ d[7] ^ crc_reg[21] ^ crc_reg[18] ^ d[10] ^ crc_reg[12] ^ crc_reg[28] ^ d[9]; assign next_crc[29] = crc_reg[22] ^ crc_reg[19] ^ crc_reg[25] ^ d[12] ^ d[8] ^ crc_reg[13] ^ crc_reg[23] ^ d[2] ^ d[6] ^ crc_reg[29] ^ d[9]; assign next_crc[30] = d[1] ^ crc_reg[30] ^ crc_reg[24] ^ crc_reg[20] ^ d[7] ^ crc_reg[14] ^ d[5] ^ d[8] ^ d[11] ^ crc_reg[23] ^ crc_reg[26]; assign next_crc[31] = crc_reg[31] ^ crc_reg[27] ^ d[4] ^ crc_reg[24] ^ d[7] ^ crc_reg[21] ^ crc_reg[25] ^ crc_reg[15] ^ d[10] ^ d[6] ^ d[0]; endmodule 这个程序应该是是非常晦涩难懂的,如果想知道原理,请去xilinx官方网站下载设计文档xapp209。同名的压缩包里面自带了一个perl程序,通过运行参数的不同,可以自动生成从crc8到crc256的所有verilog程序,输入数据宽度也可调。有兴趣的朋友可以去看看。

用host文件解决blogspot不能正常访问的问题

2007年03月22日

伟大的G里的集体宿舍人满为患,后来的人无处容身,像我,就需要租间房子。这栋楼老太太有两层房,之前楼下住着她的儿子儿媳,F它的猎物,眼下正挑逗。屋里的人将衣服挂在窗外,巷子中砖瓦紧凑地接着淅淅沥沥的水滴。“滴答滴答下小雨了,种子说我W再一次把我们的blogspot封着雨滴,落在我阳台盆栽的榕树叶上,叶子颤动,枝丫摇晃,但还是支撑不住这重量。风从东面吹来,雨水砸在窗口上的铁罩杀了。一直没有想通,为什么同样的东西在国外畅通无阻,一到国内来就不得不改头换面甚至连生存空间都没有?wiki也好,blogspot也好,好的东西,我们都没有办法使用,或者至少是正常使用。G里的集体宿舍人满为患,后来的人无处容身,像我,就需要租间房子。这栋楼老太太有两层房,之前楼下住着她的儿子儿媳,F它的猎物,眼下正挑逗。屋里的人将衣服挂在窗外,巷子中砖瓦紧凑地接着淅淅沥沥的水滴。“滴答滴答下小雨了,种子说我W,您太有才了。

幸好我们广大blogger在经受一次又一次的打击之后,总算统一了应对办法,那就是,修改host文件。

如果你是windows用户,可以通过修改Windows系统下的Hosts文件,以正常访问blogspot。

以XP为例,用记事本打开下面的文件:

C:\WINDOWS\system32\drivers\etc\hosts

再手动添加下面的内容即可:

59.151.21.100 你想访问的blogspot地址

用这个方法,将你经常访问的blogspot blog给添加进去,每行一个,即可以正常访问它们了。记得修改完后,保存一下。

建议大家共同参与编辑下面的Hosts wiki页面:http://groups.google.com/group/ggpi/web/hostwiki

即把自己的blogspot blog地址添加进去。理论上,当所有blogspot用户都参与了编辑后,就得出了一个"无敌"的Hosts文件,拥有它,blogspot就可完全正常访问了。虽然有点"愚公移山"的味道,但总比什么都不做要好一些。
  
如果你是linux用户,可以试着修改/etc/hosts文件。但是我实验了一下,似乎不行,如果有朋友在linux下实验成功的话,希望通知一声。

不过只要G里的集体宿舍人满为患,后来的人无处容身,像我,就需要租间房子。这栋楼老太太有两层房,之前楼下住着她的儿子儿媳,F它的猎物,眼下正挑逗。屋里的人将衣服挂在窗外,巷子中砖瓦紧凑地接着淅淅沥沥的水滴。“滴答滴答下小雨了,种子说我W存在一天,我们blogger的命运就一直掌握在别人的手中。因此为了摆脱这种让人愤怒的境遇,我决定回西安就开始学习lamp,自己搞空间来建blog。正如一句话所说:再也不能这样blog了!

顺便再说一个通过修改hosts来改善应用程序启动速度的办法。长期使用 Ubuntu 后有一种感觉,那就是在 GNOME 中启动应用程序时,速度越来越慢。今天在 Ubuntu 英文论坛那边看到一个技巧,可以对这个问题起到改善作用。

打开 /etc/hosts 文件,可以看到类似下面的内容:

127.0.0.1 localhost
127.0.1.1 inspiron

现在,只需在第一行的末尾加上主机名即可:

127.0.0.1 localhost inspiron
127.0.1.1 inspiron

保存后,重启系统,更改将生效。

如果这种方法无法起效的话,这里还有台湾一位朋友的办法:

首先打开Notepad(或者其他的编辑器),写入如下内容:

function FindProxyForURL(url,host){
if(dnsDomainIs(host, ".blogspot.com")){
return "PROXY 72.14.219.190:80";
}
}

另存为proxy.pac到C盘的根目录下,以Firefox为例,打开Firefox,依次点击Tools->Options-> Advanced->Network->Settings...->选中Automatic proxy configuration URL,在下面填写:

file:///C:/proxy.pac

,再点Reload,再点Ok,一路 Ok下去,就可以了。这个方法的巧妙之处(其实一点都不巧妙啦)就在于不用像极速客介绍的那样修改一堆有的没的的Hosts,只要一个“.”就保证了所有 blogspot的子域名可以没有限制的访问(内含G里的集体宿舍人满为患,后来的人无处容身,像我,就需要租间房子。这栋楼老太太有两层房,之前楼下住着她的儿子儿媳,F它的猎物,眼下正挑逗。屋里的人将衣服挂在窗外,巷子中砖瓦紧凑地接着淅淅沥沥的水滴。“滴答滴答下小雨了,种子说我W关键字的除外),嗯,Enjoy。

P.S. Linux用户应该不需要Linux版本了吧,照葫芦画瓢对与Linux用户来说应该是再简单不过了,XD

下面有朋友提到Wordpress.com可不可以通过这种方式访问,回答是:当然可以!只需要把proxy.pac用记事本打开,修改为

function FindProxyForURL(url,host){
if(dnsDomainIs(host, ".blogspot.com")){
return "PROXY 72.14.219.190:80";
}
if(dnsDomainIs(host, ".wordpress.com")){
return "PROXY 72.232.101.41:80";
}
}

然后保存,重启浏览器就可以了。这个原理是利用了该域名的多服务器的特征,每个服务器对应一个IP,G里的集体宿舍人满为患,后来的人无处容身,像我,就需要租间房子。这栋楼老太太有两层房,之前楼下住着她的儿子儿媳,F它的猎物,眼下正挑逗。屋里的人将衣服挂在窗外,巷子中砖瓦紧凑地接着淅淅沥沥的水滴。“滴答滴答下小雨了,种子说我W只是封着雨滴,落在我阳台盆栽的榕树叶上,叶子颤动,枝丫摇晃,但还是支撑不住这重量。风从东面吹来,雨水砸在窗口上的铁罩杀了其中的一个IP地址,默认的那个,其他的还是好好的,所以可以用这种方法进行访问,但也取决于网站本身,比如vox.com之前还支持,后来其IP地址为“204.9.178.110”的服务器修改了设置,所以上方法就不能用了。以此类推,同志们还可以去Hack一下Technorati等等其他好的网站的其他服务器的IP地址,这样照着修改一下就能畅通无阻的访问了。

linux文件体系介绍

2007年03月16日

在linux系统中,所有的文件系统都包含在一个文件体系下。root文件夹是最顶层的目录,而它下面所有的子文件夹则组成了目录体系,这种组织结构是和 windows等其它操作系统不一样的,它们为每一个设备和分区都单独提供目录体系。下面就是linux中root目录下各个子文件夹进行组织的介绍。

* /bin - 二进制应用程序,包括了绝大多数的执行文件。

* /boot - 启动所需要的文件,例如内核文件等。

* /dev - 你所有的设备。

* /etc - 针对你系统的所有配置文件。

* /etc/profile.d - 包括了在登入时通过/etc/profile运行的脚本。

* /etc/rc.d - 包括了很多在不同的运行级别下启动时运行的shell脚本。同时,通常还有用于启动网络的rc.inet1,用于加载模块化设备驱动的 rc.modules,能够被修改用以运行管理员所需要的命令的rc.local脚本(有点类似于DOS下的批处理文件)。

* /etc/rc.d/init.d - 包括了绝大多数基于rpm的系统中的初始化脚本。

* /etc/rc.d/rc*.d - “*'’ 表示是默认运行级别的数字,不同数字对应不同的目录。这些目录包含了用于启动和停止属于当前运行级别的文件。在基于rpm的系统中,这些文件是以它们自己原始脚本的符号链接形式存在的。

* /etc/skel - 包含各种例程或初始化界面的轮廓,通常还包含了很多子文件夹以及文件,它们都是某个新用户刚刚拥有自己的home目录后最先看到的东西。

* /etc/X11 - X Window的配置文件。

* /home - 不用说了吧。用户的本地文件夹。

* /lib - 系统库(有点类似于windows下的program files文件夹)。

* /lost+found - 丢失的文件从这里也许可以找到。

* /media - 诸如cdroms, 数码相机等设备的挂载点。
.
* /mnt - 用于挂载文件系统。

* /opt - 可选的用于安装程序的文件夹。

* /proc - 包含了各种进程信息的动态文件夹。

* /root -root用户的home目录。

* /sbin - 仅用于系统管理的程序。

* /sys - 包含系统信息。

* /tmp - 临时文件。

* /usr - 用户正常情况下使用的应用程序,包括了绝大多数应用程序。

* /var - 主要是登陆信息,数据库信息等等。

* /usr/local/bin - 用于存放你自己程序的地方,它们将不会被升级操作覆盖。

* /usr/share/doc - 文档

决定当今硬盘性能的因素讨论

2007年03月12日

决定硬盘性能的因素有很多种,大家在评估性能的时候,都趋向于理论性评估。实际上,有很多东西的真实性能影响是不能通过字面数据参数体现的。这里通过THG的一篇评测文章,顺带讲一讲各种硬盘性能因素以及其对当代硬盘的作用大小。

1.理论分析

这是一个去掉了上盖的硬盘图

可以看出,硬盘是由一个或多个拥有同心磁道的磁盘组成的,通过规则排列的磁性粒子来存储数据。不同盘面上相同位置的磁道组成柱面,磁盘的双面均可存储数据。具体的bit位是以扇区形式组织的,多个扇区又联合组成一个簇,簇是存储数据的最小单位,根据文件系统的不同而不同。一般来说,簇越大,平均连续吞吐速度越快,但是如果平均文件大小比簇小很多的话,对磁盘容量是极大的浪费。

下面谈谈存储密度。存储密度的计量单位和数据密度不同,后者是gB/每盘,前者是gb/每平方英尺。这是因为,制造商通常都不会利用整个盘来存储数据。存储密度通常由硬盘记录技术决定,现在常用的是PMR,就是垂直存储记录,将来可能引进的是HAMR,通过激光加热表面来减小影响盘面磁性部分所需要的磁场密度。这种技术将进一步增大数据密度。高数据密度能对数据传输性能产生积极的影响,但是,随机访问时间是不会从高存储密度中获益的,因为它不会改变磁头定位的速度,这是机械问题,通常高转速才会对其有利。

如果你仅仅从转速上来判断硬盘性能,你会以为所有硬盘性能都是差不多的,但事实上不是这样。由于一般硬盘都是以恒定角速度转动,所以相同时间内,对比经过磁头的长度而言,磁盘外圈的磁道总是比内圈的磁道长,也就是说越靠近磁盘外部,数据传输率就越高。这也就是为什么大多数磁盘整理软件都把零散数据整理到外圈,同时把windows交换文件放在存储媒质的最开始处,只有在这里,交换文件才能体现出最佳的性能。同时这也是为什么在相同条件下,2.5英寸磁盘的数据传输率不可能比3.5英寸磁盘高的原因。

2.缓存,用处有多大?

决定硬盘的常见因素还有一点:缓存。现在很多硬盘都是8MB的缓存了,而16MB的也逐渐增多。
介绍了这么多因素,到底这些因素分别对硬盘产生哪些,程度多深的影响呢?让我们来看看THG的测试结果。
访问时间测试结果如下:

接口性能测试结果如下:

读传输速率测试性能如下:

写传输速率测试性能如下:

写文件性能如下:

另外还有很多诸如输入输出性能,工作站性能,网络性能等测试方式,就不上图了。从这些测试中我们可以看出,缓存的大小和性能表现并不是一一对应的。很意外,是吧?

3.谁的寻道时间更短?

这里还有一个很意外的结论,就是磁盘容量“浪费”得越多的硬盘,寻道访问时间越少,每秒执行的输入输出操作数越高。

通常人们都是认为,容量越大的硬盘应该表现更佳才对。事实证明,这是错误的。举个例子,对于容量250GB和320GB的硬盘来说,由于拥有两个盘片,其理论容量应该是332GB才对。对于400GB和500GB的硬盘来讲,理论容量应该是570GB,因为它们有三个盘片。厂商在出厂时就屏蔽了无用的容量,这是市场的需求。比如对于250G的硬盘来说,其屏蔽的容量就占了总容量的25%,而对于400G的硬盘来说,这个比例则是30%。而最大的750G呢?其盘体内拥有4个盘片,理论容量就是750GB左右,因此,其屏蔽容量为0.

好,为什么屏蔽容量越大的硬盘表现越好呢?理由很简单,其被屏蔽的磁道通常都是内部磁道,保留的扇区什么的都在靠外的磁道。而且磁头的活动范围也不用那么大了。现在你知道原因了吧。

有趣的图片集:我的女朋友

2007年03月10日

相当有趣,温馨的图片集。某人,你就希望我变成这个样子吧?
文章含有大量图片,杀猫!网速慢者就别进了。

Grub配置入门大宝库

2007年03月8日

这些资料来源于:
1 linuxsir北南兄的 系统引导管理器 GRUB 为初学者指南
2 linuxfans的linuxlover的 Grub配置杂谈,以及linky_fan的 grub错误之总结报告
3 linuxmine的 重装grub的方法

ok,let's begin。

一、什么是多重操作系统引导管理器,什么是GRUB;

1、什么是多重操作系统引导管理器及工作原理;

系统启动引导管理器,是在计算机启动后运行的第一个程序,他是用来负责加载、传输控制到操作系统的内核,一旦把内核挂载,系统引导管理器的任务就算完成退出,系统引导的其它部份,比如系统的初始化及启动过程则完全由内核来控制完成;

Briefly, boot loader is the first software program that runs when a computer starts. It is responsible for loading and transferring control to the operating system kernel software (such as the Hurd or the Linux). The kernel, in turn, initializes the rest of the operating system (e.g. GNU).

在X86 架构的机器中,Linux、BSD 或其它Unix类的操作系统中GRUB、LILO 是大家最为常用,应该说是主流;

Windows也有类似的工具NTLOADER;比如我们在机器中安装了 Windows 98后,我们再安装一个Windows XP ,在机器启动的会有一个菜单让我们选择进入是进入Windows 98 还是进入Windows XP。NTLOADER就是一个多系统启动引导管理器,NTLOADER 同样也能引导Linux,只是极为麻烦罢了;

在Powerpc 架构的机器中,如果安装了Linux的Powerpc 版本,大多是用yaboot 多重引导管理器,比如Apple机目前用的是IBM Powerpc处理器,所以在如果想在Apple机上,安装Macos 和Linux Powerpc 版本,大多是用yaboot来引导多个操作系统;

因为目前X86架构的机器仍是主流, 所以目前GRUB和LILO 仍然是我们最常用的多重操作系统引导管理器;

2、什么是GRUB;为什么我要选择GRUB;

1)什么是GRUB;

GNU GRUB 是一个多重操作系统启动管理器。GNU GRUB 是由GRUB(GRand Unified Bootloader) 派生而来。GRUB 最初由Erich Stefan Boleyn 设计和应用;

GNU GRUB is a Multiboot boot loader. It was derived from GRUB, GRand Unified Bootloader, which was originally designed and implemented by Erich Stefan Boleyn.

2)“GRUB太不好用”──对GRUB的认识的误区;

GRUB真的不好用吗?不是的,通过LinuxSir.Org 社区近四年来的运行,我发现了大多新手弟兄还是不太了解GRUB;当然这也有中文Linux社区的责任,虽然也有GRUB的中文译本,初学Linux的弟兄可能有点看不懂;

我们欣喜的看到LinuxSir.Org 社区的好多弟兄都曾经或正在写GRUB实践文档,也有的弟兄也总结了GRUB的一些基础知识,比如 probing兄弟的 《GRUB 学习笔记》;由于每个人的写文档时风格不同,可能同一份文档不同的人来写就有不同的风格;所以今天也抖胆也一篇入门级的教程,由于北南不会写高级教程,所以还得请高手弟兄指教,先谢过;

3)为什么要选择GRUB;

基于在X86架构的CPU而开发操作系统,系统引导管理器不仅仅有GRUB ,而且也有LILO,但对于多重系统引导管理器,你只能选择其一而用;不能两个同时使用;

目前这两个多重系统引导管理器是大家最常用的,也是主流Linux发行版而采用的;有的弟兄喜欢GRUB,比如我个人,有的弟兄喜欢LILO ,比如etony兄(谁是etony,请参见 http://debian.linuxsir.org );

主流发行版 Fedora、Redhat、Centos等基于RPM包的系统,在最新版本中都默认GRUB引导;Slackware 目前仍采用LILO;而Debian发行版目前最新的版本也是采用GRUB;

从目前看来,GRUB有逐渐取代LILO之势,GRUB 2.0正在开发之中;所以我们有理由用GRUB,我也有理由写GRUB使用教程;

二、GRUB软件包版本选择和安装;

1、GRUB的版本选择,Linux版本的GRUB及Windows版本的GRUB的说明;

GRUB不但有Linux版本,也有Windows版本;现我们一一介绍;

如前面所说,目前在在Unix类的操作系统中,大多是都有GRUB;GRUB几乎能引导所有X86架构的操作系统;功能之强,使用简单是GRUB最大的卖点;由于Windows 操作系统的先入为主的优势,使得大家对Windows的NTLOADER了解的比较多,而对开源社区的GRUB显得有点寞生,由此而带来使用上的“心理恐惧”;究其初学者对GRUB“恐惧”的主要原因还是对GRUB没有太多的了解和深入;无论是WINGRUB还是Linux版本的GRUB,最方便的还是对 GRUB命令行的操作;一谈到命令行(Command)的操作,可能初学者对此恐惧;其实没有什么难的,象北南这样低级的写手,还能操作得起来,您也应该能行;

2、GRUB的Windows版本WINGRUB;

请参考:《以WINGRUB 引导安装Fedora 4.0 为例,详述用WINGRUB来引导Linux的安装》

3、GRUB的Linux版本软件包的安装;

其实对于Linux的GRUB,几乎所有的Linux主流发行版都有打包,如果您安装了Linux,并且在开机后出现GRUB字样的,证明您已经安装了GRUB;而无需再次安装;Linux的GRUB软件包安装部份并不是本文的重点;

如果您的Linux系统没有安装GRUB,或者采用的是LILO,而您想用GRUB,可以用系统安装盘自带GRUB软件包来安装,或者到相关发行版本的软件仓库下载后安装;

GRUB 的Linux版本目前在各大发行版中都有打包;比如Fedora/Redhat/Centos/Mandrive/Mandriva/SuSE等以RPM包管理机制的系统,可以通过如下的命令来安装;

请参考《Fedora / Redhat 软件包管理指南》

[root@localhost ~]# rpm -ivh grub*.rpm

如果是Slackware 您可以用如下的办法来安装;

[root@localhost ~]# installpkg grub*.tgz

其它的发行版本请用其自己特色的软件包管理工具来安装;

当然您也可以通过源码包,在任何Linux的发行版上安装;至于源码包的安装方法;

请参考:《如何编译安装源码包软件》

[root@localhost ~]#tar zxvf grub*.tar.gz

[root@localhost ~]#cd grub-xxx

[root@localhost ~]#./configure;make;make install

确认您是否成功安装了GRUB,您可以测试是否有如下两个命令;

[root@localhost ~]# grub

[root@localhost ~]# grub-install

如果您不能找到这两个命令,可能您的可执行程序的路径没有设置;

请参考:《设置可执行程序路径》,当然您可以用绝对路径;比如下面的;

[root@localhost ~]# /usr/sbin/grub

[root@localhost ~]# /usr/sbin/grub-install

如果您还是找不到GRUB软件包安装在哪了;您可以用下面的命令来解决和查找;

[root@localhost ~]# updatedb 注:这个要花很长时间;是索引slocate 的库,然后再通过locate来查找;

[root@localhost ~]# locate grub

比如找到的是有类似如下的;

[root@localhost ~]# locate grub

/sbin/grub-md5-crypt

/sbin/grub

/sbin/grub-install

/sbin/grub-terminfo

在一般情况下,在路径中带有bin或sbin中字样的,这些路径下都是可执行程序;sbin 是超级权限用户才能使用的管理命令;要使用这些命令一般的情况下得切换到root用户下才能使用;比如

[beinan@localhost ~]$ su - 注:切换到root用户,并且切换到其家目录;

Password:

[root@localhost ~]#/sbin/grub 注:用绝对路径来运行grub命令;

三、在Linux中,GRUB的配置中的安装和写入硬盘的MBR;

1、在Linux中,GRUB配置过程中的安装grub-install;

grub-install 命令有何用呢?其实就是把我们前面已经安装的软件包中的一些文件复制到 /boot/grub中;对于新安装GRUB软件包后,也是一个必经的过程;我们前面所说的GRUB软件包的安装;而现在我们说的是GRUB配置的过程中的安装;虽然在洋文中都是install ,但表达的意思是不一样的;

我们首先要运行 fdisk -l 来确认到底是硬盘的标识;

这个过程主要是确认硬盘的标识是哪个调备,到底是/dev/hda还是/dev/hdb 还是其它的;

[root@localhost ~]# fdisk -l

Disk /dev/hda: 80.0 GB, 80026361856 bytes

255 heads, 63 sectors/track, 9729 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System

/dev/hda1 * 1 970 7791493+ 7 HPFS/NTFS

/dev/hda2 971 9729 70356667+ 5 Extended

/dev/hda5 971 2915 15623181 b W95 FAT32

/dev/hda6 2916 4131 9767488+ 83 Linux

/dev/hda7 4132 5590 11719386 83 Linux

/dev/hda8 5591 6806 9767488+ 83 Linux

/dev/hda9 6807 9657 22900626 83 Linux

/dev/hda10 9658 9729 578308+ 82 Linux swap / Solaris

如果通过fdisk -l 出现有/dev/hda字样的,我们就要用下面的命令来安装;

[root@localhost ~]# grub-install /dev/hda

Installation finished. No error reported.

This is the contents of the device map /boot/grub/device.map.

Check if this is correct or not. If any of the lines is incorrect,

fix it and re-run the script `grub-install'.

(fd0) /dev/fd0

(hd0) /dev/hda

如果是您fdisk -l 出现的有/dev/hdb呢,那就如下运行;

[root@localhost ~]# grub-install /dev/hdb

如果既有/dev/hda和/dev/hdb 就安装到/dev/hda中;

[root@localhost ~]# grub-install /dev/hda

值得注意的是如果您有一个/boot分区,应该用如下的办法来安装;

[root@localhost ~]#grub-install --root-directory=/boot /dev/hda

[root@localhost ~]#grub-install --root-directory=/boot /dev/hdb

注解:具体是/dev/hda还是/dev/hdb,请以fdisk -l 为准;如果两个都有,就看您把/boot分区是放在第一块硬盘还是第二块硬盘上了,以实际情况为准;

2、设定GRUB的/boot分区并写入MBR;;

在Linux中,GRUB软件包的安装,及在配置过程中安装grub到 /boot中还是不够的, 还要把GRUB,写入MBR才行;有时我们重新安装了Windows,Windows会把MBR 重写,这样GRUB就消失了;如果您出现这样的情况,就要进行这个过程;

[root@localhost ~]# grub

会出现grub>提示符,这是grub命令行模式 ,如果能在开机中出现提示符,没有引导不起来的系统,除非您的系统破坏的极为严重。如果仅仅是GRUB被破坏了,GRUB命令行是能让操作系统引导起来的;

接着看例子,我们要找到 /boot/grub/stage1的,在grub>后面输入;

grub> find /boot/grub/stage1

(hd0,6)

(fd0) 注:这个是软驱;现在很少用软驱了,如果您有这方面的需要,自己看GRUB的DOC吧;

注解:

(hd0,6) 这是/boot所在的分区;不要误解为是Linux 的/所在的分区,这是值得注意的;

(fd0) 注:这个是软驱;现在很少用软驱了,如果您有这方面的需要,自己看GRUB的DOC吧;

grub>root (hd0,6) 注:这是/boot所在的分区;

grub>setup (hd0) 注:把GRUB写到MBR上;

注解:

上面这步骤是根据 find /boot/stage1而来的,仔细看一下就明白了;现在我们一般安装很少会把/boot分区列为一个单独的分区;不过有的弟兄可能也喜欢这么做;所以还是有必要说一下为好;

四、GRUB的配置文件的menu.lst的写法;

对于GRUB来说,如果没有配置menu.lst,无论是Linux版本的 GRUB,还是WINGRUB,都会有命令行可用,通过命令行是一样能把操作系统引导起来的;有些弟兄总以为menu.lst 配置错了,或者在机器启动后出现grub>命令行模式就要重新安装系统,其实根本没有这个必要;只要学会GRUB的命令行的用法,根本没有必要重装系统;

menu.lst 位于/boot/grub目录中,也就是/boot/grub/menu.lst 文件;您可以用vi或您喜欢的编辑器来编辑他;如果您不会用vi,还是去学习一下吧;简单的用法怎么也得会,对不对?毕竟这个文档不是讲vi的用法的;

有的弟兄会说,我没有menu.lst怎么办?那就创建一个;用下面的命令;

[root@localhost ~]# touch /boot/grub/menu.lst

然后我们再做一个/boot/grub/menu.lst 的链接 /boot/grub/grub.conf

[root@localhost ~]# cd /boot/grub

[root@localhost ~]# ln -s menu.lst grub.conf

现在我们来写GRUB的menu.lst了,因为/boot/grub/grub.conf是 /boot/grub/menu.lst的链接文件,改哪个都行。链接文件相当于Windows的快捷方式,这样可能能更好的理解;

1、menu.lst的写法之一;

首先我们看一下我的Fedora 4.0 中的/boot/grub/menu.lst 的内容;

default=0

timeout=5

#splashimage=(hd0,6)/boot/grub/splash.xpm.gz

hiddenmenu

title Fedora Core (2.6.11-1.1369_FC4)

root (hd0,6)

kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/

initrd /boot/initrd-2.6.11-1.1369_FC4.img

title WinXp

rootnoverify (hd0,0)

chainloader +1

注解:

default=0

default=0 是默认启动哪个系统,从0开始;每个操作系统的启动的定义都从title开始的,第一个title 在GRUB的启动菜单上显示为0,第二个启动为1,以此类推;

timeout=5

注:表示在开机后,GRUB画面出现几秒后开始以默认启动;如果在启动时,移动上下键,则解除这一规则;

#splashimage=(hd0,6)/boot/grub/splash.xpm.gz 注:GRUB的背景画面,这个是可选项;我不喜欢GRUB的背景画面,所以加#号注掉,也可以删除;

hiddenmenu

注解:隐藏GRUB的启动菜单,这项也是可选的,也可以用#号注掉;

一般的情况下对Linux操作系统的启动,一般要包括四行;title 行;root行;kernel 行;initrd 行;

1)在menu.lst中 ,通过 root (hd[0-n],y)来指定/boot 所在的分区;

title XXXXX 注:title 后面加一个空格,title 是小写的,后面可以自己定义;比如FC4,自己定义一个名字就行;

root (hd[0-n],y) ,在本例中,我们看到的是root (hd0,6) ,root (hd[0-n],y)表示的是/boot所在的分区;有时我们安装Linux的时候,大多是不设置/boot的,这时/boot和/所在的同一个分区;这个root (hd[0-n],y)很重要,因为/boot目录中虽然有grub目录,最为重要的是还有kernel 和initrd文件,这是Linux能启动起来最为重要东西;

有的弟兄会问,root (hd[0-n],y)是怎么来的?

请参考:《在Linux系统中存储设备的两种表示方法》

2)在menu.lst中,kernel 命令行的写法;

kernel 一行,是通指定内核及Linux的/分区所在位置;

比如例子中是;

kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/

在这里以kernel 起始,指定Linux的内核的文件所处的绝对路径;因为内核是处在/boot目录中的, 如果/boot是独立的一个分区,则需要把boot省略;如果/boot是独立的分区,这行要写成:

kernel /vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/

因为/boot所处的分区已经在title 下一行root (hd[0-n],y)中指定了,所以就无需要再指明内核处在哪个分区了;另外Linux系统的硬盘分区的挂载配置文件在/etc/fstab ,原理是通过 mount /dev/hd[a-z]X /boot 来进行的;您可以对照着来理解;

ro 表示只读; root=LABEL=/ 来表示Linux的根所处的分区。LABEL=/ 这是硬盘分区格式化为相应文件系统后所加的标签;如果您不了解什么是标签,也可以直接以/dev/hd[a-z]X 或者/dev/sd[a-z]X来表示;就看您的Linux是根分区是在哪个分区了。比如我的是在/dev/hda7 ,那这里就可以写成root=/dev/hda7;

如果查看系统运行所挂载的分区,请用 df -lh 来查看,就能明白是不是/boot是独立的分区,或者查看/etc/fstab也能知道;

[root@localhost ~]# df -lh

Filesystem 容量 已用 可用 已用% 挂载点

/dev/hda7 11G 9.2G 1.2G 90% /

/dev/shm 236M 0 236M 0% /dev/shm

在这个例子中,我们可以发现 /boot并没有出现只有/dev/hda7,这表示/boot并不是独立的一个分区;所有的东西都包含在/中;于是我们在/boot中查看内核版本;

[root@localhost ~]# ls /boot/vmlinuz*

/boot/vmlinuz-2.6.11-1.1369_FC4 注:看到内核vmlinuz所处的目录;

于是我们就可以这样kernel 这行了;

kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7

3)initrd 命令行的写法;

如果是/boot独立一个分区,initrd 一行要把/boot中省略;如果/boot不是处于一个分区,而是和Linux的/分区处于同一分区,不应该省略;

比如我们在2)中用的例子;现在拿到这里,我们应该首先查看 /boot中的initrd的文件名到底是什么;

[root@localhost ~]# ls /boot/initrd*

/boot/initrd-2.6.11-1.1369_FC4.img

如果是通过df -lh 得知或查看/etc/fstab 也行, 得知/boot是独立的分区;这时initrd 应该写成;

initrd /initrd-2.6.11-1.1369_FC4.img

如果是 /boot不是独处一个分区,而是在/同一处一个分区, 则要写成;

initrd /boot/initrd-2.6.11-1.1369_FC4.img

4)menu.lst第一种写法的总结和实践;

在这里,我们只说重要的,不重要的就一带而过了;

1]用fdisk -l ;df -lh ;more /etc/fstab来确认分区情况;

我们过fdisk -l ;df -lh ; more /etc/fstab 来确认/boot所在的分区,及Linux的根分区所在位置;

比如我们确认/boot和Linux的/分区同处一个分区;

[root@localhost ~]# df -lh

Filesystem 容量 已用 可用 已用% 挂载点

/dev/hda7 11G 9.2G 1.2G 90% /

/dev/shm 236M 0 236M 0% /dev/shm

然后我们/etc/fstab 中,查看/分所在的分区或分区标签是什么;

[root@localhost ~]# more /etc/fstab

# This file is edited by fstab-sync - see 'man fstab-sync' for details

LABEL=/ / ext3 defaults 1 1

/dev/devpts /dev/pts devpts gid=5,mode=620 0 0

/dev/shm /dev/shm tmpfs defaults 0 0

/dev/proc /proc proc defaults 0 0

/dev/sys /sys sysfs defaults 0 0

LABEL=SWAP-hda1 swap swap defaults 0 0

/dev/hdc /media/cdrecorder auto pamconsole,exec,noauto,managed 0 0

经过上面的df -lh 和more /etc/fstab 的对照中得知,/boot并是独处一个分区,而是和/在同一个分区;这个Linux系统安装在/dev/hda7上,文件系统(此分区)的标签为 LABEL=/ ,/boot也是处于/dev/hda7 ,/dev/hda7也可以说是 root (hd0,6);

(注:在 Linux 中,当谈到 "root" 文件系统时,通常是指主 Linux 分区。但是,GRUB 有它自己的 root 分区定义。GRUB 的 root 分区是保存 Linux 内核的分区。这可能是您的正式 root 文件系统,也可能不是。我们讨论的是 GRUB,需要指定 GRUB 的 root 分区。进入 root 分区时,GRUB 将把这个分区安装成只读型,这样就可以从该分区中装入 Linux 内核。GRUB 的一个很“酷”的功能是它可以读取本机的 FAT、FFS、minix、ext2 和 ReiserFS 分区.到目前为止,您可能会感到一点疑惑,因为 GRUB 所使用的硬盘/分区命名约定与 Linux 使用的命名约定不同。在Linux 中,第一个硬盘的第五个分区称作 "hda5"。而 GRUB 把这个分区称作 "(hd0,4)"。GRUB 对硬盘和分区的编号都是从 0 开始计算。另外,硬盘和分区都用逗号分隔,整个表达式用括号括起。现在,可以发现如果要引导 Linux 硬盘 hda5,应输入 "root (hd0,4)"。
知道了内核在哪儿,还要具体指出哪个文件是内核文件,这就是kernel的工作。
kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/说明/boot/vmlinuz-2.4.18-14就是要载入的内核。后面的都是传递给内核的参数。root=LABEL=/ 就是linux的硬盘分区表示法,ro是readonly的意思。initrd用来初始的linux image,并设置相应的参数。
命令map:当你有两块硬盘,一个无法从第二块硬盘启动的操作系统,例如Windowsxp,就可以使用map命令.你能够将hd0映射为hd1,将hd1映射为hd0。换句话说,你可以虚拟的交换两个硬盘而启动所需要的操作系统 。命令形式如下:
grub> map (hd0) (hd1)
grub> map (hd1) (hd0)
GRUB 使用了“链式装入器”(chainloader)。链式装入器从分区 (hd1,0) 的引导记录中装入winxp自己的引导装入器,然后引导它。这就是这种技术叫做链式装入的原因 -- 它创建了一个从引导装入器到另一个的链。这种链式装入技术可以用于引导任何版本的 DOS 或 Windows。
GRUB的配置文件要简单就这么简单,如果你要更个性化一点,试一试把“color light-gray/blue ”加在default语句的下面

2]查看内核vmlinuz的和initrd文件名的全称;

[root@localhost ~]# ls -lh /boot/vmlinuz*

-rw-r--r-- 1 root root 1.6M 2005-06-03 /boot/vmlinuz-2.6.11-1.1369_FC4

[root@localhost ~]# ls -lh /boot/initrd*

-rw-r--r-- 1 root root 1.1M 11月 26 22:30 /boot/initrd-2.6.11-1.1369_FC4.img

3]开始写menu.lst ;

我们根据上面所提到的,可以写成如下的样子;

default=0

timeout=5

title FC4

root (hd0,6)

kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/

initrd /boot/initrd-2.6.11-1.1369_FC4.img

也可以写成;

default=0

timeout=5

title FC4

root (hd0,6)

kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7

initrd /boot/initrd-2.6.11-1.1369_FC4.img

注解:上面两个不同之处在于一指定Linux的根/所在的分区时,一个是用了文件系统的标签,另一个没有用标签;

2、menu.lst的写法之二,精简型;

本写法主要是把指定/boot所位于的所分区直接写入kernel 指令行;这样就省略了通过root (hd[0-n],y)来指定/boot所位于的分区;

1)第一种情况:/boot和Linux的/根分区在同一个分区;

有前面的那么多的讲解,menu.lst写法之二就好理解多了;也得分两种情况,咱们先把/boot并不是独处一个分区,而是和Linux的根分区处于同一个分区;我们以 4)menu.lst第一种方法的写法总结 的实例为例子;

default=0

timeout=5

title FC4x

kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7

initrd (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.img

注解:

title FC4x 注:自己为这个Linux 起个简单的名,以title开头,然后一个空格,后面就自己发挥吧,FC4或FC4x都行;

kernel 空格 (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 空格 ro 空格 root=/dev/hda7

kernel 这行这样理解 kernel (boot所在的分区)/boot/内核文件件全称 ro root=Linux根所位于的分区或标签

initrd 空格 (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.img

initrd 这行可以这样理解 initrd (/boot所在的分区)/boot/内核文件名全称

2)第二种情况:/boot独立一个分区,和Linux的根分区不是同一个分区;

比如我们查看到df -lh 得到的是

[root@localhost ~]# df -lh

Filesystem 容量 已用 可用 已用% 挂载点

/dev/hda6 200M 120M 80M 60% /boot

/dev/hda7 11G 9.2G 1.2G 90% /

我们再进一行查看/etc/fstab 得知;

LABEL=/ / ext3 defaults 1 1

LABEL=/boot /boot ext3 defaults 1 2

所以我们应该写成如下的;

title FC4x

kernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/

initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.img

因为Linux的根分区是/dev/hda7,通过/etc/fstab和df -h的内容得知标签为 LABEL=/的分区就是/dev/hda7 ,所以有;

title FC4x

kernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7

initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.img

五、通过GRUB命令行来启动Linux操作系统;

GRUB的命令行才是王道,如果知道怎么用命令行来启动操作系统,那理解menu.lst的写法也不难;也就是说在开机的时候,不用GRUB的菜单,通过GRUB的命令也是一样能把操作系统引导起来。

因为menu.lst的内容就是GRUB的一个一个的指令集合;是不是Linux这玩意很神奇?

1、为什么需要学习GRUB的命令行;

当我们把GRUB的menu.lst写错的时候,或者丢掉了menu.lst的时,比如在开机的时候,GRUB会出现grub>类似的命令提示符,这时需要我们用命令行启动系统;当然您可以不用定义GRUB的菜单,直接用命令行来启动系统,比如我现在就是,为了写GRUB的文档,就把menu.lst 删除了,直接用命令来启动系统;

2、用命令行来引导Linux操作系统的步骤;

通过命令行来引导操作系统的流程,也没有什么难的;无非是把指令手工输入到grub>提示符的后面;在这个过程中,tab键的命令补齐功能就显得很重要了。如果您不知道有哪些命令,可以输入help;

1)进入GRUB的命令行模式 grub>

如果开机时,GRUB出现的是grub>,说明你没有 /etc/grub/menu.lst ,您需要自己写一个才会GRUB的菜单,让我们来选择进入哪个系统。如果有GRUB的菜单,您可以按Ctrl+c组合键进入GRUB的命令行模式,会出现 grub> 提示符;

grub>

2)获取帮助GRUB的 help

只要您在grub>提示符的后面输入help 就能得到GRUB所有的命令提示;

grub> help

blocklist FILE boot

cat FILE chainloader [--force] FILE

clear color NORMAL [HIGHLIGHT]

configfile FILE device DRIVE DEVICE

displayapm displaymem

find FILENAME geometry DRIVE [CYLINDER HEAD SECTOR [

halt [--no-apm] help [--all] [PATTERN ...]

hide PARTITION initrd FILE [ARG ...]

kernel [--no-mem-option] [--type=TYPE] makeactive

map TO_DRIVE FROM_DRIVE md5crypt

module FILE [ARG ...] modulenounzip FILE [ARG ...]

pager [FLAG] partnew PART TYPE START LEN

parttype PART TYPE quit

reboot root [DEVICE [HDBIAS]]

rootnoverify [DEVICE [HDBIAS]] serial [--unit=UNIT] [--port=PORT] [--

setkey [TO_KEY FROM_KEY] setup [--prefix=DIR] [--stage2=STAGE2_

terminal [--dumb] [--no-echo] [--no-ed terminfo [--name=NAME --cursor-address

testvbe MODE unhide PARTITION

uppermem KBYTES vbeprobe [MODE]

如果需要得到某个指令的帮助,就在 help 后面空一格,然后输入指令,比如;

grub>help kernel

3)cat的用法;

cat指令是用来查看文件内容的,有时我们不知道Linux的/boot分区,以及 /根分区所在的位置,要查看/etc/fstab的内容来得知,这时,我们就要用到cat (hd[0-n],y)/etc/fstab 来获得这些内容;注意要学会用tab键命令补齐的功能;

grub> cat ( 按tab 键会出来hd0或hd1之类的;

grub> cat (hd0, 注:输入hd0,然后再按tab键;会出来分区之类的;

grub> cat (hd0,6)

Possible partitions are:

Partition num: 0, Filesystem type unknown, partition type 0x7

Partition num: 4, Filesystem type is fat, partition type 0xb

Partition num: 5, Filesystem type is reiserfs, partition type 0x83

Partition num: 6, Filesystem type is ext2fs, partition type 0x83

Partition num: 7, Filesystem type unknown, partition type 0x83

Partition num: 8, Filesystem type is reiserfs, partition type 0x83

Partition num: 9, Filesystem type unknown, partition type 0x82

grub> cat (hd0,6)/etc/fstab 注:比如我想查看一下 (hd0,6)/etc/fstab的内容就这样输入;

LABEL=/ / ext3 defaults 1 1

/dev/devpts /dev/pts devpts gid=5,mode=620 0 0

/dev/shm /dev/shm tmpfs defaults 0 0

/dev/proc /proc proc defaults 0 0

/dev/sys /sys sysfs defaults 0 0

LABEL=SWAP-hda1 swap swap defaults 0 0

/dev/hdc /media/cdrecorder auto pamconsole,exec,noauto,

managed 0 0

有的弟兄可能会说,我不知道Linux安装在了哪个分区。那根据文件系统来判断一个一个的尝试总可以吧我;只要能cat出/etc/fstab就能为以后引导带来方便;

主要查看/etc/fstab中的内容,主要是Linux的/分区及/boot是否是独立的分区;如果没有/boot类似的行,证明/boot和Linux的/处于同一个硬盘分区;比如上面的例子中LABEL=/ 这行是极为重要的;说明Linux系统就安在标签为LABEL=/的分区中;

如果您的Linux系统/boot和/没有位于同一个分区,可能cat (hd[a-n],y) 查到的是类似下面的;

LABEL=/ / ext3 defaults 1 1

LABEL=/boot /boot ext3 defaults 1 2

4) root (hd[0-n,y) 指令来指定/boot所在的分区;

其实这个root (hd[0,n],y)是可以省略的,如果省略了,我们要在kerenl 命令中指定;我们前面已经说过 (hd[0-n],y) 硬盘分区的表示方法的用途;主要是用来指定 /boot所在的分区;

比如我们确认/boot和 (hd0,6),所以就可以这样来输入root (hd0,6)

grub> root (hd0,6)

如果发现不对,可以重新来过;没有什么大不了的;

5) kernel 指令,用来指定Linux的内核,及/所在的分区;

kernel 这个指令可能初学者有点怕,不知道内核在哪个分区,及内核文件名的全称是什么。不要忘记tab键的命令补齐的应用;

如果我们已经通过root (hd[0-n],y) 指定了/boot所在的分区,语法有两个:

如果/boot和Linux的/位于同一个分区,应该是下面的一种格式;

kernel /boot/vmlinuz在这里按tab键来补齐,就看到内核全称了 ro root=/dev/hd[a-z]X

如果/boot有自己独立的分区,应该是;

kernel /vmlinuz在这里按tab键来补齐,就看到内核全称了 ro root=/dev/hd[a-z]X

在这里 root=/dev/hd[a-z]X 是Linux 的/根所位于的分区,如果不知道是哪个分区,就用tab出来的来计算,一个一个的尝试;或用cat (hd[0-n],y)/etc/fstab 中得到Linux的/所在的分区或分区的标签;

grub> kernel /boot/在这里按tab键;这样就列出/boot中的文件了;

Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369

_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 grubBAK memtest86+-1.55

.1 xen-syms xen.gz

grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/

[Linux-bzImage, setup=0x1e00, size=0x18e473]

注解: root=LABEL=/ 是Linux的/所在的分区的文件系统的标签;如果您知道Linux的/在哪个具体的分区,用root=/dev/hd[a-z]X来指定也行。比如下面的一行也是可以的;

grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7

也可以把/boot所在的分区的指定 root (hd[0-n],y)这行省掉,直接在kernel 中指定/boot所在的分区;所以就在下面的语法;

如果是/boot和Linux的根同处一个分区;

kernel (hd[0-n],y)/boot/vmlinuz ro root=/dev/hd[a-z]X

比如:

grub>kernel

如果是/boot和Linux所在的根不在一个分区;则是;

kernel (hd[0-n],y)/vmlinuz ro root=/dev/hd[a-z]X

grub> kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7

[Linux-bzImage, setup=0x1e00, size=0x18e473]

或下面的输入,以cat 出/etc/fstab内容为准;

grub> kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/

[Linux-bzImage, setup=0x1e00, size=0x18e473]

6)initrd 命令行来指定initrd文件;

grub> initrd /boot/initrd在这里tab 来补齐;

grub> initrd /boot/initrd-2.6.11-1.1369_FC4.img

[Linux-initrd @ 0x2e1000, 0x10e685 bytes]

如果/boot是独立的一个分区,应该是如下样子的语法;比如下面的;

grub> initrd /initrd在这里tab 来补齐;

grub> initrd /initrd-2.6.11-1.1369_FC4.img

[Linux-initrd @ 0x2e1000, 0x10e685 bytes]

7)boot 引导系统;

grub>boot

前面的几个步骤都弄好 。就进入引导;尝试一下就知道了。。

8)引导Linux系统实例全程回放;

实例:/boot和Linux的/处于同一个硬盘分区;

grub> cat (hd0,6)/etc/fstab

# This file is edited by fstab-sync - see 'man fstab-sync' for details

LABEL=/ / ext3 defaults 1 1

/dev/devpts /dev/pts devpts gid=5,mode=620 0 0

/dev/shm /dev/shm tmpfs defaults 0 0

/dev/proc /proc proc defaults 0 0

/dev/sys /sys sysfs defaults 0 0

LABEL=SWAP-hda1 swap swap defaults 0 0

/dev/hdc /media/cdrecorder auto pamconsole,exec,noauto,managed 0 0

grub> root (hd0,6)

Filesystem type is ext2fs, partition type 0x83

grub> kernel /boot/在这里按tab补齐,全列出/boot所有的文件;

Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4

memtest86+-1.55.1 xen-syms xen.gz

grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7 注:输入

[Linux-bzImage, setup=0x1e00, size=0x18e473]

grub> initrd /boot/在这里按tab补齐

Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4

memtest86+-1.55.1 xen-syms xen.gz

grub> initrd /boot/initrd-2.6.11-1.1369_FC4.img 注;输入intrd文件名的全名;

[Linux-initrd @ 0x2e1000, 0x10e685 bytes]

grub> boot

我们指定Linux的根时,可以用cat出来的fstab的内容中Linux的/分区文件系统标签来替代;也就是kernel 那行中 root=/dev/hd[a-z]X;

grub> cat (hd0,6)/etc/fstab

# This file is edited by fstab-sync - see 'man fstab-sync' for details

LABEL=/ / ext3 defaults 1 1

/dev/devpts /dev/pts devpts gid=5,mode=620 0 0

/dev/shm /dev/shm tmpfs defaults 0 0

/dev/proc /proc proc defaults 0 0

/dev/sys /sys sysfs defaults 0 0

LABEL=SWAP-hda1 swap swap defaults 0 0

/dev/hdc /media/cdrecorder auto pamconsole,exec,noauto,managed 0 0

grub> root (hd0,6)

Filesystem type is ext2fs, partition type 0x83

grub> kernel /boot/在这里按tab补齐,全列出/boot所有的文件;

Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4

memtest86+-1.55.1 xen-syms xen.gz

grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/

[Linux-bzImage, setup=0x1e00, size=0x18e473]

grub> initrd /boot/在这里按tab补齐

Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 grubBAK

memtest86+-1.55.1 xen-syms xen.gz

grub> initrd /boot/initrd-2.6.11-1.1369_FC4.img 注;输入intrd文件名的全名;

[Linux-initrd @ 0x2e1000, 0x10e685 bytes]

grub> boot

如果是/boot和Linux的根分区不在同一个分区,要把kernel和initrd 指令中的/boot去掉,也就是/vmlinuzMMMMMM 或 /initrdNNNN

也可以不用root (hd[0-n]来指定/boot所在分区,要在kernel 和initrd 中指定;比如Linux的/根所位于的分区和/boot所位于的分区都是(hd0,6),并且我们cat出来的/etc/fstab是Linux的/根分区的文件系统的标签为LABEL=/,引导操作系统的例子如下;

grub>kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/

grub>initrd (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.img

grub>boot

grub>kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7

grub>initrd (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.img

grub>boot

如果/boot位于 /dev/hda6,也就是(hd0,5),Linux的根/位于分区/dev/hda7,并且我们cat 出来的/etc/fstab 中/分区的标签为 LABEL=/。下面的两种方法都可以引导;

grub>kernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/

grub>initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.img

grub>boot

grub>kernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7

grub>initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.img

grub>boot

六、通过GRUB引导Windows操作系统;

1、通过编辑 menu.lst 来引导Windows 系统;

如果您的Windows所处于的分区在(hd0,0),可以在menu.lst 加如下的一段就能引导起来了;

title WinXp

rootnoverify (hd0,0)

chainloader +1

如果您的机器有两块硬盘,而Windows 位于第二个硬盘的第一个分区,也就是(hd1,0)

您可以用grub的map来指令来操作把两块硬盘的序列对调,这样就不用在BIOS中设置了;在menu.lst中加如下的内容,比如下面的;

title WinXp

map (hd0) (hd1)

map (hd1) (hd0)

rootnoverify (hd0,0)

chainloader +1

makeactive

如果Windows的分区不位于硬盘的第一个分区怎么办呢?比如在(hd0,2);

这个也好办吧,把rootnoverify 这行的(hd0,0)改为 (hd0,2)

title WinXp

rootnoverify (hd0,2)

chainloader +1

makeactive

如果Windows的在第二个硬盘的某个分区,比如说是位于(hd1,2),则要用到map指令;

title WinXp

map (hd0) (hd1)

map (hd1) (hd0)

rootnoverify (hd1,2)

chainloader +1

makeactive

如果有多个Windows 系统,怎么才能引导出来呢?应该用hide 和unhide指令操作;比如我们安装了两个Windows ,一个是位于(hd0,0)的windows 98 ,另一个是安装的是位于(hd0,1)的WindowsXP;这时我们就要用到hide指令了;

title Win98

unhide (hd0,0)

hide (hd0,1)

rootnoverify (hd0,0)

chainloader +1

makeactive

title WinXP

unhide (hd0,1)

hide (hd0,0)

rootnoverify (hd0,1)

chainloader +1

makeactive

2、通过GRUB指令来引导Windows ;

其实我们会写menu.lst了,在menu.lst中的除了title外,都是一条条指令;如果我们启动Windows ,只是输入指令就行了;

比如 Windows的分区在 (hd0,0),我们在开机后,按ctrl+c ,进入GRUB的命令模式;就可以用下面的

grub> rootnoverify (hd0,0)

grub> chainloader +1

grub> boot

其它同理... ...

七、GRUB丢失或损坏的应对策略;

如果GRUB是Linux版本才出会这样的问题;WINGRUB可以不写在MBR上;所以不会出现这样的问题。WINGRUB用起来比较简单。menu.lst 和命令行的用法和Linux版本的GRUB是一样的;

1、由于重新安装Windows或其它未知原因而导致GRUB的丢失;

您可以通过系统安装盘、livecd进入修复模式;

请参考:《Linux 系统的单用户模式、修复模式、跨控制台登录在系统修复中的运用》

首先:您根据前面所说grub-install来安装GRUB到/boot所在的分区;要仔细看文档,/boot是不是处于一个独立的分区是重要的,执行的命令也不同;

其次:要执行grub ,然后通过 root (hd[0-n],y)来指定/boot所位于的分区,然后接着执行 setup (hd0),这样就写入MBR了,比如下面的例子;

grub>root (hd0,6)

grub>setup (hd0)

grub>quit

重新引导就会再次出现MBR的菜单了或命令行的提示符了;

2、如果出现GRUB提示符,而不出现GRUB的菜单,如何引导系统;

存在的问题可能是/boot/grub/menu.lst丢失,要自己写一个才行;您可以用命令行来启动系统,进入系统后写一写menu.lst就OK了。前面已经谈过了;

写好后还要建一个grub.conf的链接,如下:

[root@localhost ~]# cd /boot/grub

[root@localhost grub]# ln -s menu.lst grub.conf

3、如果你用grub来引导linux和windows,当windows出毛病重新安装后,会破坏MBR中的grub,这时需要恢复grub.
a.把linux安装光盘的第一张放到光驱,然后重新启动机器,在BOIS中把系统用光驱来引导。
b.等安装界面出来后,按[F4]键,也就是linux rescue模式。
c.一系列键盘以及几项简单的配制,过后就[继续]了。。。这个过程,我不说了,比较简单。
d.然后会出现这样的提示符:
sh#
e.我们就可以操作GRUB了.输入grub:
sh#grub
会出现这样的提示符:
grub>
我们就可以在这样的字符后面,输入:
grub>root (hdX,Y)
grub>setup (hd0)
如果成功会有一个successful......
这里的X,如果是一个盘,就是0,如果你所安装的linux的根分区在第二个硬盘上,那X就是1了;Y,就是装有 linux系统所在的根分区。 setup (hd0)就是把GRUB写到硬盘的MBR上。

另外说下,有人说我没安装光盘啊?我是从硬盘安装的.呵呵,那你的ISO文件还在吧..那再来次硬盘安装进入安装界面也是一样的....

4 grub的错误总结报告:

注意:

* 本文所有例子均为举例说明, 切不可生搬硬套, 如有雷同, 实属巧合^-^
* 在本文的例子中使用的发行版为gentoo, 安装软件的方法依不同发行版各有不同, 如有安装软件方面的问题请参考相应的发行说明.
* 再次提醒, 给硬盘的mbr或分区的mbr动手之前请做好备份, 以备不测......
* 本文绿色文字部分(代码部分除外)为Gentoo代码, 使用其他发行版的用户不必深究.
* 如果有Grub方面的问题请不要根贴, 本贴仅作查询与补完之用, 谢谢配合
* 如要转载请注明出处为www.linuxfans.org, 谢谢配合.

1. Grub loading, please wait...

出现症状:
代码:

GRUB loading stage 1.5
GRUB loading, please wait...

屏幕出现这段文字之后, 系统停止, 如果尝试使用一张linux启动软盘(也就是有安装在软盘上的grub)可以引导系统.

解决方法:
设置本机的bios, 不要使用floopy作为第一启动设备, 改用hard drive作为第一启动.

对于gentoo的用户来说, 错误的CFLAGS也会导致该错误的发生, 虽然现在的grub ebuild文件已经过滤掉了-fstack-protector, 但是当问题还是无法解决的时候用干净的CFLAGS重新编译一下grub也不失是一个好办法.

# CFLAGS="-O2 -march=i686 -fomit-frame-pointer -pipe" emerge grub

2. Grub Error 12

出现症状:
代码:
12 : Invalid device requested.

该症状是当设备描述符正确但是随后出现没定义过的某个错误时出现.

解决方法:
该错误一般出现在使用交互式的Grub安装方式(也就是Grub>下的安装方法)时没有输入以下两行.
代码:

grub> root (hd0,0)

grub> setup (hd0)

(hd0,0) 必须用你自己的引导扇区代替, (hd0)也必须同时用你选择的hard drive代替, 因为上述两条命令的实质就是在把bootloader安装到第一个硬盘(The primary master)的 Master Boot Record上.

3. Grub Error 15

出现症状:
该错误可能出现在Grub配置的两个不同的阶段, 一种可能是出现在Grub的安装配置阶段(也就是在MBR上安装Grub的时候), 屏幕显示如下:
代码:
grub> root (hd0,0)
Filesystem type is xfs, partition type 0x83

grub> setup (hd0)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... no

Error 15: File not found

还有一种情况就是启动电脑后选择启动linux或其他在Grub启动列表中列出的系统时, 屏幕显示如下:
代码:

Booting 'gentoo Linux'

root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
kernel (hd0,0)/boot/kernel-2.4.20 root=/dev/hda3 vga=792

Error 15: File not found
Press any key to continue...

解决方法 (第一种情况) :
该错误在找不到指定的文件时出现, 但是此时像磁盘或分区信息这样的其他配置都没问题(只是找得到相应的分区或磁盘, 至于对不对它可不管). 一般来说没找到的文件以kernel居多. 首先需要确认一下在你的/boot里的那个kernel, 如果需要存在于你/boot里那个kenel的完整的文件名, 使用livecd, rescue盘或其他安装在硬盘上的linux系统引导成功后挂载那时在配置Grub时候指定的/分区和/boot(需要的话), 然后使用chroot进入那时的根分区, 使用下面的命令进行查找.
代码:

# cd /boot
# ls

如果发现kernel文件丢失, 进入/usr/src/linux(再此之前确认一下该目录下放置了kernel的source code)重新compile一个, 命令如下:
代码:

# cd /usr/src/linux/
# make menuconfig
# make

完成之后拷贝进/boot:
# cp /usr/src/linux/arch/i386/boot/bzImage /boot

重命名一下kernel, 和你在grub.conf中指定的一样就可以了. 顺便再检查一下grub.conf中kernel那行引用的分区是否正确.

除了kernel的丢失或损坏, BIOS无法识别存放Grub的stages和kernel的硬盘分区也会出现相同的Missing 错误.同时存放Grub的stages和kernel的分区不应该是使用software RAID-5(或者是使用其他优化存储技术的分区, 比如LVM或LVM2)的.

解决方法 (第二种情况) :
第一, 检查grub.conf的root行和setup行配置正确.如果你确认你使用的方法是正确的, 那可能你使用的Grub版本存在bug(比如0.93.20031222这个版本), 使用你所用发行版的软件工具新安装一个或是升级你原来所用的Grub).

Gentoo用户可以使用下面的命令:

(在chroot环境下执行该命令)
# echo "=sys-boot/grub-0.93.20031222" >> /etc/portage/package.mask
# emerge grub -p

然后你也可以使用Grub开发人员建议使用的 grub-install脚本进行Grub的在MBR中的安装:

(--root-directory 在你使用单独的/boot分区时是必选项)
# grub-install --root-directory=/boot /dev/hda

如果上面的方法你都试过, 但是还是没法解决问题的话, 请检查一下你的/boot分区, 可能是你的/boot分区存在问题:

(确认一下你将要进行fsck的分区是处于unmount状态下的, 在给出的例子中使用的是/dev/hda1.)
代码:

# fsck -y /dev/hda1

4. Grub error 16

出现症状:
代码:
Error 16: Inconsistent filesystem structure

翻成中文的意思是不兼容的文件系统, 也就是说你的/boot无法被Grub识别(可能是使用了Grub没法识别但linux可以识别的文件系统), 如果你的/boot不是单独分区的话, 那代表着你的根分区也就是/无法被Grub识别.

解决方法:
同样使用rescue盘或livecd或第二个可以使用的linux系统, 启动完成后不要挂载原系统的/或/boot, 可以先使用fdisk查看一下所使用的文件系统再使用fsck -y检查.

5. Grub Error 17

出现症状:
代码:
root (hd0,0)
filesystem type unknown partition type 0x7

Error 17 : Cannot mount selected partition

解决方法:
中文意思为无法挂载分区, 也就是Grub可以确认所使用的分区存在但是该分区上使用的文件系统无法被Grub识别.

1. 确认一下再grub.conf中的root(x,y)设置是否正确.
2. 如果在选择启动Windows时出现上述错误, 请检查一下grub.conf关于Win的配置中是否有 root (hdX,Y) (或 rootnoverify (hdX,Y)) 和 chainloader (hdX,Y)+1.

6, Grub error 18

代码:
kernel (hd1,4)/bzImage root=/dev/hdb7

Error 18: Selected cylinder exceeds max supported by BIOS

解决方法:
该错误经常发生在古老的硬件和新的硬盘连接的时候, 当试图访问一个BIOS无法转换的地址时(换句话说就是Grub试图读取的地址已经超过了BIOS可以访问的极限). 尝试升级一下BIOS或把/boot分区尽量移动到可使用硬盘空间的前面. 对于偶们来说估计没有谁还在用8G以下的硬盘吧, 呵呵.

7. GRUB GRUB GRUB GRUB GRUB ...

出现症状:
代码:
GRUB GRUB GRUB GRUB GRUB GRUB GRUB GRUB GRUB GRUB GRUB GRUB GRUB GRUB GRUB
GRUB GRUB GRUB GRUB GRUB GRUB GRUB GRUB GRUB GRUB GRUB GRUB GRUB GRUB GRUB
...

解决方法:
一种可能的情况是你在BIOS里设定了AUTO 检测HDD, 可以尝试把BIOS的相关条目改成 User Type HDD看看.

另一种可能的情况是当你在已经在MBR中安装了Grub, 但是为了修改分区或增加硬盘而重新安装了Grub, 但是在再次安装的时候却犯了某些错误. 对这种情况来说重新安装一遍Grub比查出哪里犯了错更迅速也更解决问题.

8. Probing Devices to Guess BIOS Drives. This May Take a Long Time.

出现症状:
在安装Grub时候屏幕显示下述文字后系统挂起:
代码:
# grub

Probing devices to guess BIOS drives. This may take a long time.

解决方法:
检查一下你的硬件配置, 可能在同一根IDE连接线上既连接了Ultra DMA的设备也连接了不支持Ultra DMA的设备.

9. 安装Grub时, 系统挂起

出现症状:
运行grub命令后, 屏幕无任何其他显示后系统挂起.
代码:
# grub
(这个时候, 系统挂起)

解决方法:
grub命令会优先检查floopy, 如果没有软驱, 请使用下面的附加参数跳过floopy检查.
代码:

# grub --no-floppy

10, Uncompressing Linux... Ok, booting the kernel.

出现症状:
系统在显示完下面的内容后挂起.
代码:

Uncompressing Linux... Ok, booting the kernel.

解决方法:
确切来说, 这个error并不是Grub的错误, 可能的原因是你使用的内核或你编译的内核其用了ACPI, 但是实际ACPI并没有工作正常. 可以在BIOS里disable掉ACPI或在启动该 kernel 时加入 no acpi 参数.

11. Grub只显示了一个Grub提示符

出现症状:
在引导计算机时本来应该出现的各个启动条目被一个Grub提示符取代.

解决方法:
用livecd或rescue 盘启动并挂载/boot分区, 检查一下其中的grub.conf是否丢失.
代码:
# mount /dev/hda1 /mnt/someplace/boot

# cat /mnt/someplace/boot/grub/grub.conf

另外也检查一下其中menu.lst的符号连接是否存在.
代码:
# ls -l /mnt/gentoo/boot/grub/menu.lst
lrwxrwxrwx 1 root root 9 Mar 7 14:00 /mnt/gentoo/boot/grub/menu.lst -> grub.conf

如果没有找到这个符号连接, just make it.
代码:
# cd /mnt/gentoo/boot/grub
# ln -snf grub.conf menu.lst

然后重新安装一遍Grub
代码:
(在chroot环境中运行如下命令)
# grub-install --root-directory=/boot /dev/hda

12. Could Not Find Device For /boot/boot: Not Found Or Not a Block Device

出现症状:
当你在Grub安装过程中使用grub-install脚本时出现以下错误:
代码:
# grub-install --root-directory=/boot /dev/hda
Could not find device for /boot/boot: not found or not a block device

解决方法:
检查一下下面这个步骤有没有做过.
代码:
# cp /proc/mounts /etc/mtab

13. 在Grub Menu中单击回车后系统重启.

出现症状:
在Grub Menu中单击回车后系统重启.

解决方法:
尝试在kenel中disable 掉 framebuffer 或者直接在启动的kernel后添加参数.如果无效的话再disable掉APM或ACPI试试.

14. 在Grub Menu中单击回车后, 屏幕黑屏.

出现症状:
在Grub Menu中单击回车后, 屏幕黑屏, 但是这个时候系统并没有挂起, NumLock键依然有效.

解决方法:
关闭grub.conf 中的 framebuffer 支持(也就是移除 vga=XYZ 行) 顺便再检查一下kernel的config中关于arch的选择是否符和你的硬件要求.

15. Grub 启动时背景图片缺失

出现症状:
启动系统时无法看到默认的图片背景.

解决方法:
检查一下你在grub.conf中相关的splash那行有没有被注释掉或者指定的splash文件是否存在或者文件名是否相符.

16. 在试图启动第二个硬盘上的Windows时失败.

出现症状:
选择了对应的Windows条目, 但是系统拒绝启动, 提示信息也没有很清楚的给出错误的所在.

解决方法:
很多情况下都是因为没有在grub.conf中正确使用map命令所至.
代码:
title Windows XP
map (hd0) (hd1)
map (hd1) (hd0)
chainloader (hd1,0)+1

17. Grub 安装时候出现段错误

出现症状:
该情况很多都是出现在grub-0.95.x的安装过程中, 屏幕显示如下:
代码:
grub> root (hd0,0)

grub> setup (hd0)

Segmentation fault

解决方法:
该错误是一个已知的0.95版本Grub的bug, 在0.96版本中已经修复, 同时0.94 r1 和 0.94 r2没有这个bug, 如果这些也都出现段错误, 尝试emerge grub-static . 该软件包在amd64平台下属于stable, 在~x86平台上属于 unstable.

modelsim6.2系列的一个优化选项导致的问题

2007年03月8日

在6.2以前的所有版本中,modelsim安装目录下的modelsim.ini文件中,VoptFlow选项是默认被注释掉,也就是关闭的,而在6.2系列版本中,默认是打开的,这就可能导致仿真时出现问题。

VoptFlow在ini文件中的描述是:Set to turn on automatic optimization of a design.

但是如果打开,在用modelsim仿真时,可能出现不能把object添加到wave中去的问题,用add wave all命令的话,会提示

# .main_pane.mdi.interior.cs.vm.paneset.cli_0.wf.clip.cs.pw.wf
# ** Error: (vish-4014) No objects found matching '*'.
# Error in macro ./stopwatch_tb.fdo line 19
# (vish-4014) No objects found matching '*'.
# while executing
# "add wave *"

必须把ini文件中的这句

VoptFlow = 1

注释掉,或者把1改为0,方可解决问题。

不是很清楚为什么打开优化选项后会产生这种问题,也许是bug?或者也许是某些地方没有配置好?

北京实习初体验

2007年03月8日

还记得上一次来北京,是电子设计竞赛的全国复测,和队友一起做火车,安顿在北京理工,复测,逛了一趟亲戚,然后就回了。前后不过几天时间,对北京的印象也不大好------至少没有上海好。总觉得吧,首都不应该是这个样子的。这一次到中科来,估计要待近一个月时间,于是就想着,怎么着也要到处逛逛,真正感受一把one month in beijing。

在西安火车站,就真切感受了一把春运的魅力。啥叫人多,俄地神阿,不仅把茶座室改为临时普通候车室,而且所有候车室都是人挤人,几乎没有一点缝隙。眼见俺们的车次开始检票了,没办法,我只好用上老天赐给我的一付好身板,发挥出一个壮汉少有的灵活性,施展出篮球场上躲闪腾挪的功夫,最后,终于,和同学一起挤到了检票口。刚检票过去,后面就有一女孩哭,原来买到假票了。这年头,唉。在不断对其同情的时候,腿还是不停往车的方向跑。要是没赶上车,哭的就是我了。

车上蛮无聊,除了看书,和某人发了一些短信以外,就是睡觉。10点熄灯的时候,我旁边铺上一大汉已然睡着,那鼾声,相当强悍。我对面铺一哥们说道,这人打鼾真利害,我还不住点头表示赞同,并和其一起在心里面小小谴责了一下这种明明鼾声如雷睡眠还极好的同志。半夜2,3点,我再次在梦中被鼾声吵醒,心想,这声音还升级了,怎么更大了。屏气静听,恩?居然是对面哥们在打鼾,他鼾声和刚才的鼾声此起彼伏争奇斗艳,大有不分出高下誓不罢休的味道。我说哥们,你还真是五十步笑百步阿,亏我开始还和你统一战线呢。唉,高昂的鼾声加上心中对这哥们的忿恨,搞的我一晚上都没睡好。

早上7点过,就到北京了,下了火车,打的去地铁站,然后就到了目的地。从地铁站出来,极目远眺,整条街上好像都是大楼。一路走过来,经过沃尔玛,就来到了西格马大厦,也就是传说中的微软亚洲研究院。再往过走就是航天卫星大厦,航天恒星大厦,卫星制造厂,中科院空间技术研究院以及一系列公司。本想照相留恋一下的,居然忘记带相机了,那个悔阿。走到卫星桥,然后师兄就出来把我们接了进去。

我们具体工作的地方是光电所下属的一个公司办公地点,说实话,感觉还没有我们实验室宽畅明亮。不大的屋子里面挤着几十号人,虽然也是一人一个小隔间,小桌子,一个电话,但是由于排布实在太密,感觉没有丝毫隐私权------或许真正的公司就是这样,本来就没准备给你隐私权。整个公司总共就4台上网机,平时想查询资料都很不方便。作息时间也比较奇怪,早上8点半上班,11点半就下班,然后给你一个半小时休息时间------吃完饭后,很多人在睡觉或者看电影------然后1点继续上班。上到3点半,会有音乐响起,表示你可以休息一下,大概历时20分钟左右,据我观察,一般只有一半左右的人在休息,大家的自觉性还是蛮高的。有些时候,公司会在这个点提供像饼干,爆米花之类的小食品供你随便享用,但不是每天都有的。

下午5点就是下班时间,总的来说白天的时间安排还是很紧的。晚上公司里面一般都有人加班,但是不超过10个,所以晚上是俺们xdu四人帮最佳上网时机,嘿嘿,一般的邮件处理,技术新闻,我都是晚上在网上浏览的。看到晚上9点左右回去,休息一会,几个人侃侃大山,发发短信,也就睡觉了。IT民工的生活阿!

刚开始在这里的食堂吃饭的时候才极度崩溃,一份土豆丝,一份萝卜,一份炒肉,一份鸡丁,凑成一盘盒饭,在西安也就是4块钱的水准,在这里居然要8块。这还是职工食堂!后来一想,人家好歹也是首都嘛,消费是要高一点,忍了。后街有一些小馆子,面食和炒饭都还平易近人,我是说价格,不是说质量。有一次我进了一家川菜馆,要了一份红烧牛肉面,最后吃了一份清汤......牛肉面,好吧,如果清汤上漂了几块肥牛肉就算牛肉面的话。这个价格是------5块。强烈怀恋家乡雅安的牛肉面ing......

至于工作压力,还是不小,6号早上7点到北京,行李直接背到公司,8点半就开始上班。由于挂的名号都是“联合实验室派来的有水平的人”,别人根本没把你当成刚上研究生的实习生看待,任务交下来也基本没有人仔细带,全部自己琢磨。可能是这里的待遇在北京还算不错吧,每天都有不少北邮北航以及别的学校的研究生来应聘,omg,不知道为什么,看着他们,心里面就有一种紧迫感。加油吧,虽然自己以后不怎么可能来北京,但是在哪里,IT都是一个竞争的行业。

终于可以说宿舍了。来这里之前,蝈蝈师兄就说了住宿条件不大好,已经有了一定的思想准备,不过真正看到实地,心里面还是凉了半截。其面积大约是我们学校宿舍的......1/2左右,却摆了三张架子床,然后是一张桌子,这就是整个屋子的内容。房东是和公司有关系的一个南方人,听口音应该是浙江那边的,不住向我们称赞,说公司对我们多好多好,连被单枕头这些都是全新的,我心想你这不是废话么,又不是打发叫花子,敢情别的公司发的是旧的?讨好也讨得这么有才。

既来之则安之吧,咱也不是不能吃苦的人,于是开始铺床。铺的时候感觉有些不对劲,好像挺难铺平的,然后干脆爬上去铺,这下知道为啥了:床实在是太摇晃了,这还能 ** ?我看叫摇篮差不多。天阿,我可是180斤的大个子阿,让我睡这种床的上铺......忍了。还好,不影响睡觉,反正睡着了就啥都不知道。唯一的利好消息,就是到目前为止还没有发现老鼠,蟑螂倒是不少,师兄的策略是发现一只消灭一只,我相信,在我们的杀光政策下,蟑螂迟早不敢在我们屋子里面出现的。

其实生活了几天,觉得除了住得憋屈以外,其它还是挺好玩的,工作很紧凑,我的任务比较重,经常加班,每天吃饭的时候就去后街找找看看,哪里的菜相对来说便宜又好吃,晚上回去经常自己洗洗袜子,衣服什么的,然后和师兄们聊聊,搞笑搞笑,然后躺在床上想想家里面的幸福日子,最后睡觉,第二天周而复始,感觉挺充实的。累点无所谓,反正就近一个月时间么,要是这点苦都吃不了,以后怎么在“挨踢”这个竞争极强的行业立足呢,呵呵。

关于周末的安排,由于不想在周末加班,所以应该基本上就是上上网,逛逛啥的。在北京的朋友其实蛮多的,远望的朋友,本科的同学,还有一些技术上认识的朋友,周末都可以拉出来见见。

拟定一个游玩清单吧:
1 有机会一定要见到若水和camp两人。
2 一定要去西单的五环或者nike,adi专卖逛逛,合适就买一些衣服。
3 逛任意一间有名的大书城
4 好好逛一逛中关村
5 临走前带一些好吃的回西安

其它的临时安排吧。先写到这里,以后有时间再写,呵呵。

对linux交换分区swap的一些认识总结

2007年02月25日

cu.linux上讨论得热火朝天的,我在这里总结在一起,绝对对各位大有帮助。要看具体讨论,请去这里。详细内容如下:

在debian 和 fedora的文档中,都看到有说明,swap分区最好不要超过2G。实际上,对于linux 2.6以上的内核,可以直接支持不大于64G的内存。ext3等日志型文件系统,也可以直接支持超过2G的单个文件,所以,对于64G以内的swap,在文件系统支持的情况下,建立成一个单独的分区或文件,不会影响系统的performace。

Linus曾经在一个mail讨论中指出:

In the course of discussion, it became clear that Linux 2.4.x required more swap than previous versions. Rik van Riel mentioned, "2.4 keeps dirty pages in the swap cache, so you will need more swap to run the same programs..." He asked Linus Torvalds, "is this something we want to keep or should we give the user the option to run in a mode where swap space is freed when we swap in something non-shared ?" Linus replied:

I'd prefer just documenting it and keeping it. I'd hate to have two fairly different modes of behaviour. It's always been the suggested "twice the amount of RAM", although there's historically been the "Linux doesn't really need that much" that we just killed with 2.4.x.

If you have 512MB of RAM, you can probably afford another 40GB or so of harddisk. They are disgustingly cheap these days.

Zlatko Calusic worried that more data in swap would degrade performance because the disk head would need more seek time to find data. He asked if Linus was sure this would be okay, and Linus replied, "I'm not _sure_, obviously. However, one thing I _am_ sure of is that the sticky page-cache simplifies some things enormously, and make some things possible that simply weren't possible before." . But in a nearby post he admitted, "the sticky allocation _might_ make the IO we do be more spread out." He felt it was important to consider these kinds of potential downsides, though he felt that in this case the benefits outweighed the drawbacks; and at one point Eric W. Biederman explained succinctly, "The tradeoff when implemented correctly is that writes will tend to be more spread out and reads should be better clustered together."

Zlatko ran some tests, and could not find any problems with the 2.4.0 memory management logic, though he added, "I have found that new kernel allocates 4 times more swap space under some circumstances. That may or may not be alarming, it remains to be seen." At one point, Linus gave his overall take on 2.2/2.4 performance issues. He said:

I personally think 2.4.x is going to be as fast or faster at just about anything. We do have some MM issues still to hash out, and tuning to do, but I'm absolutely convinced that 2.4.x is going to be a _lot_ easier to tune than 2.2.x ever was. The "scan the page tables without doing any IO" thing just makes the 2.4.x memory management several orders of magnitude more flexible than 2.2.x ever was.

(This is why I worked so hard at getting the PageDirty semantics right in the last two months or so - and why I released 2.4.0 when I did. Getting PageDirty right was the big step to make all of the VM stuff possible in the first place. Even if it probably looked a bit foolhardy to change the semantics of "writepage()" quite radically just before 2.4 was released).

Elsewhere, he considered the case of swapless or low-swap machines:

If you don't have any swap, or if you run out of swap, the major difference between 2.2.x and 2.4.x is probably going to be the oom handling: I suspect that 2.4.x might be more likely to kill things off sooner (but it tries to be graceful about which processes to kill).

Not having any swap is going to be a performance issue for both 2.2.x and 2.4.x - Linux likes to push inactive dirty pages out to swap where they can lie around without bothering anybody, even if there is no _major_ memory crunch going on.

If you do have swap, but it's smaller than your available physical RAM, I suspect that the Linux-2.4 swap pre-allocate may cause that kind of performance degradation earlier than 2.2.x would have. Another way of putting this: in 2.2.x you could use a fairly small swap partition to pick up some of the slack, and in 2.4.x a really small swap-partition doesn't really buy you much anything.

在讨论中,Linus明确的说明了,在Linux2.4.x中,内存管理(MM)策略的改变。就如Windows98向Windows2000转变一样,微软在内存和交换区中保存了更多的脏页,而不是及时回收内存,大幅提高了系统的效率。(见Widnows核心编程第18章的论述)。

Linus还指出,即使是512M内存,也可以分配高达40G的交换区,以提高系统的性能。Zlatko 在向Linus提出性能的质疑后,自己进行了验证。实验表明大交换区策略,没有增加磁盘I/O的流量。

那么,swap是不是必须的?很多人认为是,其实,普通意义上所谓的swap是内存的2倍只是一个给新手使用的经验值,实际使用swap的大小是根据程序对内存使用状况需要调整的。如果机器在运行时对内存的需求量不大,就没有必要要swap。

这个问题就变成了 我不知道所有任务最大内存需求是多少,那怎么办?

可以1步1步来:
1 用swapoff 关掉所有swap 然后正常运行任务,如果出现内存不足的提示,就需要逐步增加swap。
2 一般来讲,物理内存达到256m,在安装时即可不用划分交换分区。
3 可以在安装后建立交换分区,或者建立交换文件。

轻松重装grub------Super Grub Disk介绍

2007年02月21日

你在用linux/win双系统吗?你遇到过重装windows后grub出错的情况么?用常规的手工补救方法来重新安装grub,你觉得麻烦么?没关系,有了Super Grub Disk,一切都将变得很简单。进来看看吧。

Super Grub Disk可用于系统急救,提供了软盘启动、USB可移动存储器启动和光盘启动三种类型。针对 Linux 系统,Super Grub Disk 具有自动将 Grub 恢复到 MBR、直接引导 Linux、激活 Linux 分区等功能。对于 Windows 系统来说,Super Grub Disk 同样能够派上用场,比如修复 Windows 的引导问题、直接引导 Windows、以及从第二块硬盘或第二个分区引导 Windows 等。此外,Super Grub Disk 还有激活分区或隐藏分区等特性。

对于广大的普通用户来说,可以到Super Grub Disk的下载主页上下载其光盘镜像iso文件,刻录在光盘上,通过光盘引导来启动Super Grub Disk。这个过程是非常简单的,所以我就不多介绍了。

如果你想更加方便,你的机器又支持u盘启动,就可以利用超级普遍的u盘来引导系统并使用Super Grub Disk。使用步骤如下:

1 在分类下载页面中找到usb版本的压缩文件下载。也就是以tar.gz结尾的归档压缩文件。

2 在任意一个目录解压缩

3 解压缩出来的文件夹里面的字文件夹是boot,将boot文件夹转移到u盘上。

4 使用sudo grub命令,进入grub的命令界面。

5 输入geometry (hd,然后按tab键补全信息,用来看具体是hd0还是hd1还是其他的分区是你的usb分区(也相当于优盘分区)。

6 假设hd2,0是你的usb分区,就输入root(hd2,0)。这是告诉Grub,你所安装的grub必须是以这个分区的文件系统为基准的。如果不进行这步,我们可能会将用于硬盘安装的grub安装到usb驱动器中。

7 输入setup (hd2),安装我们拷贝过来的/boot目录下的grub到usb驱动器中。

这样,你就将拥有安装了SGD的usb驱动器了。只要在bios中设置从USBdisk启动即可。

启动后的引导界面如下:

是不是有点像风景画?呵呵。画面下方有语言选择菜单,这里没有显示出来。

引导后的使用步骤可以参考截图,更加详细的说明可以参见此使用文档

迟到的生日祝福,the god in my heart

2007年02月18日

84年,一个男孩出生于一个小城市,开始了他的人生历程。
84年,一个男人进入NBA篮球联盟,开始了他的职业生涯。
92年,8岁的男孩在父亲的怀抱里,以不够懂事的思想,观摩了梦之队在巴塞罗那的表演。男孩没有迷上搞怪的得分王巴克利,没有迷上潇洒的魔术师,但是,男孩迷上了神。


由于年龄的关系,男孩没有赶上神的第一次霸业,但是幸运的是,他赶上了第二次。

初中的小卖铺,政治老师的小屋,以及,没有父母的家里。每次遇到总决赛,逃课永远是那时候篮球迷公认的选择。杂志,画册,以及简陋的,刚刚开办的体坛周报,成为了男孩寻找神消息的精神寄托。总是在上自习时偷偷翻看神的比赛照片,总是节约钱购买大徐所写的神的球队的一本本专刊,总是在篮球场上幻想,幻想着拥有神的气质。总是在神遇到任何挫折的时候,坚定不移得相信,最后胜利的一定是这个男人。

男孩看到了第二个三连冠,看到了邮差和老约翰的无奈,看到了全世界最坏的男人和全世界最好男人的组合,看到了十年难遇的总决赛警匪片,还看到了,神的正式加冕。98年,神正式成为了神,带着6枚总冠军戒指。

因为你君临天下舍我其谁的王者之风

你能够降伏这个世界上最坏的男人

任何伤病都不能阻止你的梦想

不到最后一刻,永不言弃

于是就有了世界上最美丽的篮球芭蕾,惊世一投

还记得你第三次复出的身影,男孩在读高三,每遇到比赛,只要一下课,就不顾老师的反对打开电视机,只为能看上那几分钟神的身影。当你最后一次宣布退役的时候,你的背影就永远凝固在男孩心中。

现在的江湖,已经不是从前的江湖了。一个又一个的翩翩少年正在向神的地位发起一波又一波的挑战。包括这两个我现在最喜欢的男人

但是,没有人能取代神在男孩心目中的地位。如果说男孩喜欢的东西,都有某些特殊的意义的话,神对于男孩,就是精神上的偶像。神不是一个完美的男人,但是至少在精神层面上,他是最完美的。有谁能像他那样让所有对手都输得心服口服?没有。

努力耕耘,不断进取,挑战极限,挑战自我,永不言败。这就是从84年腾飞的这个男人身上领袖精神最好的体现。希望这样的精神,能在84年出生的小男孩身上体现出些许的影子。

生日快乐,帮主。