2007年6月5日 星期二

学会理解并编辑fstab

推荐进入原文:学会理解并编辑fstab阅读。

可能玩Linux的朋友都知道fstab这个文件,如果要用好linux,熟悉linux的一些核心配置文件是必要的,而fstab则是其中之一。这个文件描述系统中各种文件系统的信息,应用程序读取这个文件,然后根据其内容进行自动挂载的工作。因此,我们需要理解其中的内容,了解它如何与 mount命令配合工作,并能够针对自己的情况进行修改。

作为系统配置文件,fstab通常都位于/etc目录下,它包括了所有分区和存储设备的信息,以及它们应该挂载到哪里,以什么样子的方式挂载。如果遇到一些类似于无法挂载你的windows分区阿,无法使用你的光驱阿,无法对某个分区进行写入操作阿什么的,那么基本上可以断定,你的fstab内容有问题了。也就是说,你可以通过修改它来搞定这些问题,而不用去论坛冰天雪地裸体跪求答案了。
说了半天,/etc/fstab其实就是一个文本文件,用gedit或者vi都可以打开,当然,前提是root权限。在这个文件中,每个文件系统(包括分区或者设备)用一行来描述,在每一行中,用空格或TAB符号来分隔各个字段,文件中以*开头的行是注释信息。Fstab文件中的纪录的排序十分重要。因为 fsck,mount或umount等程序在做它们的工作时会按此顺序进行本。下面进行详细的讲解,本文假设读者已经有挂载文件系统和分区的基础知识。




在讲解之前要说一下,每个人所使用的系统情况都是不同的,包括硬件种类,所用系统等,因此fstab文件肯定是有所差异的。但是其基本结构,如上所述,都不会变。所以我们先以一个fstab内容作为模板进行讲解。

首先请看下面这个例子:












































/dev/hda2/ext2defaults1 1
/dev/hdb1/homeext2defaults1 2
/dev/cdrom/media/cdromautoro,noauto,user,exec0 0
/dev/fd0/media/floppyautorw,noauto,user,sync0 0
proc/procprocdefaults0 0
/dev/hda1swapswappri=420 0

这些看起来毫无意义的字符代表了什么?在对应相应分区或者存储设备信息的每一行中,每一列又是什么意思?先大体讲一下,第一列表示设备的名称,第二列表示该设备的挂载点,第三列是文件系统,第四列是挂载选项,第五列是dump选项(用一个数字表示),第六列(接下来的数字)表示文件系统检查选项。好了,接下来,就要详细介绍这些参数的具体含义了。

第一、二列:设备和默认挂载点


说实话,第一列和第二列的内容是最简单最直接的,它们的作用就是告诉mount命令,我想挂载什么分区或者什么设备,以及我所希望的挂载点在哪里。在fstab中为某一个设备指定的挂载点是其默认挂载点,也就是当你在挂载目录的时候没有手工指定其他目录的话,系统就将该设备挂载到这个目录。大多数Linux发行版都会为挂载点创建专门的目录,大多数是在/mnt下,但是一些发行版(比如SUSE或者ubuntu)是在/media下。笔者使用的是ubuntu,所以示例信息中也是用的/media目录。

按照我们给出的fstab示例,如果你敲入命令

$ mount /dev/fd0

你的软驱就将挂载到/media/floppy,因为这是你告诉系统的软驱默认挂载点。如果没有这个信息,当你敲入mount命令时,mount会感到很困惑:该死的,你想让我把这玩意挂载到哪里去呢?当然,如果你看fstab中发行版给你指定的默认挂载点不顺眼,也可以自由修改它,修改成任何一个你希望的目录都可以。如果还不存在,就首先创建这个目录。要知道,fstab是不会把所有工作都给你包干的哦。

另外,有一些分区和存储设备是在Linux系统启动的时候就自动挂载的,比如,让我们看看刚才列出来的fstab示例信息,有两行是这样的:















/dev/hda2/ext2defaults1 1
/dev/hdb1/homeext2defaults1 2

正如刚才我们讲到的那样,这两行表示/dev/hda2默认挂载到/根目录,而 /dev/hdb1则默认挂载到/home目录,。这些工作在你Linux系统启动的时候就会通过读取fstab自动完成,否则的话......想象你会遭受什么样的折磨吧,所有的程序都在/根目录下,而你却无法使用,因为你没有挂载/根目录!恩,我保证,这将是一次让人沮丧的系统使用经历。

除了显示的使用设备名,你可以使用设备的UUID或设备的卷标签,例如,你可以在这个字段写成“LABAL=root”或“UUID=3e6be9de- 8139-11d1-9106-a43f08d823a6”,这将使系统更具伸缩性。例如,如果你的系统添加或移除了一个SCSI硬盘,这有可以改变你的设备名,但它不会修改你的卷标签。

对于NFS mount操作,这个字段应该包含host:dir格式的信息,例如:knuth.aeb.nl:/,对于进程文件系统procfs,使用proc。

第三列:文件系统类型


fstab中的第三列指示了设备或者分区的文件系统类型。它支持很多种类的文件系统,我们在这里只介绍最为常用的。如果想了解你的kernel目前支持哪些文件系统,可以查看/proc/filesystems的内容。如果这个字段定义为swap,这条纪录将关联到一个用于交换目的的文件或分区。如果这个字段定义为ignored,这行将被忽略。这对于显示目前没有使用的分区非常有用。

ext2 和 ext3: Linux下的Ext2文件系统,是 GNU/Linux 系统中标准的文件系统,其特点为存取文件的性能极好,对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计。至于Ext3文件系统,它属于一种日志文件系统,是对ext2系统的扩展。日志式文件系统的优越性在于,它会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有需要时可以回朔追踪。由于详细纪录了每个细节,故当在某个过程中被中断时,系统可以根据这些记录直接回朔并重整被中断的部分,而不必花时间去检查其他的部分,故文件系统检测不一致时,重整的工作速度相当快,几乎不需要花时间。

reiserfs: ReiserFS是一个非常优秀的文件系统。也是最早用于Linux的日志文件系统之一,其机制比Ext3要先进得多,风雷小弟一直使用的就是它,很多发行版现在也把它作为默认文件系统了。可惜其作者前段时间出事了......具体情况就不说了,也不知道下一代reiserfs4还能不能出来,因为ext4都有了。

swap: Swap,即交换区,把它想象成虚拟内存就行了。

vfat 和 ntfs: 一看就知道是Windows分区格式了,呵呵。98,me等系统都是使用的vfat,也就是最流行的fat32格式,而NT系列则多使用NTFS,当然也不是固定的,因此2000或者XP系统要具体情况具体分析。当初Linux对NTFS的写入支持不好,所以大多数资料都建议用户使用vfat格式,但是现在支持已经很好了,即使不重新编译内核,也可以通过ntfs-3g来进行写入支持(具体方法请参考这篇文章),因此不用太在意这个了。

auto: 当然,这不是一个文件系统类型。auto只是表示,文件系统的类型将被自动检测。在上面的示例中,你会发现软驱和光驱的文件系统类型都是auto,为什么呢?因为它们的文件系统类型随时都可能改变, 比如软驱,优盘这种设备,可能今天是vfat格式,明天你就把它格式化成了ntfs,因此,最明智的做法就是告诉系统,我没法确定这东西的当前类型,还是你自己检测吧。

udf: 由于刻录光驱越来越流行,现在很多发行版自带的fstab中,光驱的文件格式类型是UDF,UDF是Universal Disc Format的缩写,与ISO 9660格式相容。它采用标准的封装写入技术(PW,Packet Writing)将CD-R/CD-RW当作硬盘使用,用户可以在光盘上修改和删除文件。利用UDF格式进行刻录时,刻录软件将数据打包,并在内存中临时建立一个特殊文件目录表,同时接管系统对光盘的访问。

iso9660: 很多光驱也使用的这个选项。ISO9660是一种描述适合CD盘片的电脑文件结构的国际标准。采用此标准的盘片可以在不同的操作系统上使用,如MAC和Windows。

第四列:挂载选项


fstab中的第四列表示设备或者分区所需要的挂载选项。这一列也是fstab中最复杂最容易出错的一列,当然,只要你能知道一些最常用的选项是什么意思,就可以让你从头疼中解脱出来。如果要把可用的选项一项一项介绍......恩,我估计我会写到明天,所以,我还是只是分析最常用的一些选项,如果你想知道更多的东西,还是求助于man吧。

auto 和 noauto: 这是控制设备是否自动挂载的选项。auto是默认选择的选项,这样,设备会在启动或者你使用mount -a命令时按照fstab的内容自动挂载。如果你不希望这样,就使用noauto选项,如果这样的话,你就只能明确地通过手工来挂载设备。

user 和 nouser: 这是一个非常有用的选项,user选项允许普通用户也能挂载设备,而nouser则只允许root用户挂载。nouser是默认选项,这也是让很多Linux新手头疼的东西,因为他们发现没有办法正常挂载光驱,Windows分区等。如果你作为普通身份用户遇到类似问题,或者别的其他问题,就请把user属性增加到fstab中。

exec 和 noexec: exec允许你执行对应分区中的可执行二进制程序,同理,noexec的作用刚好相反。如果你拥有一个分区,分区上有一些可执行程序,而恰好你又不愿意,或者不能在你的系统中执行他们,就可以使用noexec属性。这种情况多发生于挂载Windows分区时。exec是默认选项,理由很简单,如果noexec变成了你/根分区的默认选项的话......

ro: 以只读来挂载文件系统。

rw: 以可读可写的属性来挂载系统。

sync 和 async: 对于该文件系统的输入输出应该以什么方式完成。sync的意思就是同步完成,通俗点讲,就是当你拷贝一个东西到设备或者分区中时,所有的写入变化将在你输入cp命令后立即生效,这个东西应该立马就开始往设备或者分区里面拷贝了。而如果是async,也就是输入输出异步完成的话,当你拷贝一个东西到设备或者分区中时,可能在你敲击cp命令后很久,实际的写入操作才会执行,换句话说,就是进行了缓冲处理。

有时候这种机制蛮不错的,因为sync会影响你系统的运行速度,但是这也会带来一些问题。想一想,当你希望将一个文件拷贝到u盘上时,你执行了cp命令,却忘记执行umount命令(它会强行将缓冲区内容写入),那么你拷贝的文件实际上并没有在u盘上面。如果你是使用的mv命令,而你又很快将u盘拔出......恭喜你,文件会从这个星球上消失的。因此,虽然async是默认属性,但是对于u盘,移动硬盘这种可移动存储设备,最好还是让他们使用sync选项。

defaults: 所有选项全部使用默认配置,包括rw, suid, dev, exec, auto, nouser, 和 async。

一般用户没有特殊需求,直接使用defaults就可以了。看完介绍,我们再回过头去看看前面的示例内容,以光驱为例,主要关注挂载选项这里,可以看到,光驱和其他分区设备的不同是ro,因为普通光驱是只读的。而exec则让你可以从光驱上直接执行某些程序。

第五、六列:dump和fsck选项


Dump和fsck?这是什么东西?恩,dump是一个备份工具,而fsck是一个文件系统扫描检查工具。我不会在这里详细介绍它们,因为用man或者google都可以获得更加详细的信息。

fstab的第五列是表示dump选项,dump工具通过这个选项位置上的数字来决定文件系统是否需要备份。如果是0,dump就会被忽略,事实上,大多数的dump设置都是0。而第六列是fsck选项,fsck命令通过检测该字段来决定文件系统通过什么顺序来扫描检查,根文件系统/对应该字段的值应该为1,其他文件系统应该为2。若文件系统无需在启动时扫描检查,则设置该字段为0。

参考文章:How to edit and understand /etc/fstab
查阅全文»

0 评论:

完美升级到thunderbird2.0

推荐进入原文:完美升级到thunderbird2.0阅读

对于当前大多数人来说,管理邮件的方式不外乎两种,客户端或者webmail。webmail的代表自然是gmail,我也一直在使用gmail,不过由于校园网那能和蜗牛比赛的速度,我还是无法脱离客户端的依赖。我的网络应用包括mail,rss,新闻组,新闻组目前已经被万能的google集成了,可以说是相当方便地通过邮件进行,所以当初选择雷鸟而不是evolution的原因就是其集成rss和邮件两个功能。可惜单纯从功能上讲,thunderbird差gmail不是一点两点,特别在邮件量比较大的时候。在忍受了thunderbird 1.5的邮件管理缺陷之后,终于等到了thunderbird 2.0的正式版本,其实前段时间就出来了,只不过不想用自己的开发机做小白鼠,要事出了什么意外项目组会把我杀了,所以等了一段时间,觉得没有什么问题之后,终于在昨天进行了升级。一下子眼前一亮,恩,UI更新很大阿:

一开始想安装的时候,一直很奇怪,因为去官方网页找了半天,仔细看了几遍release note,就是找不到linux下的详细安装说明,安装包带的README等于空话。一般来说,很多人使用thunderbird 2.0的方法是去官方网站下载压缩包,然后下下来解压后直接使用,可能出现下列错误信息:

The program 'thunderbird-bin' received an X Window System error.
This probably reflects a bug in the program.
The error was 'BadWindow (invalid Window parameter)'.
(Details: serial 432 error_code 3 request_code 20 minor_code 0)
(Note to programmers: normally, X errors are reported asynchronously;
that is, you will receive the error a while after causing it.
To debug your program, run it with the --sync command line
option to change this behavior. You can then get a meaningful
backtrace from your debugger if you break on the gdk_x_error() function.)

或者直接就是内核错误。解决办法也不是没有,要改脚本,而且这样其实不符合unix系统安装软件的习惯(常见安装路径参考这篇文章)。还有些朋友是参考了这个方法,不过这样有可能出现一些问题,比如只能在root下打开,在桌面下却打不开等。

其实2.0出来这么久了,多上网查一查就可以查到用于ubuntu的deb包。我是按照以下步骤安装的:

1. 编辑/etc/apt/sources.list,加入源
deb http://gnomefreak.youmortals.com/mozilla-testing feisty main
deb-src http://gnomefreak.youmortals.com/mozilla-testing feisty main

2.执行apt-get update 更新。

3.就可以安装thunderbird2.0了。

这样安装其实就是升级,而且直接调用home目录下的.thunderbird里面的资料,所有mail和rss完全不变,感觉很爽。至于最直观的感觉,就是界面更清爽了,无论是左边的目录栏图标,还是右边的邮件列表。尤其是邮件列表,取消每封信前面的icon后,信件状态更加清晰了,还支持新邮件提醒,鼠标停在有新消息的文件夹上面,就可以列出新邮件内容提示。而且支持了彩色标签,搜索功能终于不是可有可无了。邮件消息可以由任意多个标签来组织,这些标签还可以在搜索中搜索并保存,这是非常典型的web2.0的特征,可以看看图示:

tag(点击缩放)

另一个重要更新就是直接对gmail的支持,由于内置支持Gmail和.Macy用户,不像之前的版本访问这些邮件服务器你需要配置所有的细节,包括smtp,pop3,,端口等,在thunderbird2.0里,你只需要提供账号和密码,就可以正常接收邮件。

其他更新还包括对vista的支持,搜索保存功能等。说实话核心改进没有想像中那么大,但是已经很不错了,还是可以推荐升级的。

最后需要提醒一点,添加的这个deb地址可能是mozilla的测试版本的软件库,所以一旦更新之后可能还会同时更新你的firefox,我的firefox本来是2.0.3,它提示我更新,更新完还是2.0.3,但是占用资源感觉突然变大,很不爽,也不知道他到底更新了那些库,所以建议不要选择进行firefox的更新。不过现在也有补救措施,就是现升级到它这个版本之后,再升级到官方的2.0.0.4,就能恢复正常了。

恩,如果有什么意见和感想,欢迎讨论~~
查阅全文»

0 评论:

linux文件系统详细讲解

很多使用Linux的用户都是从Windows转过来的,因此,对于他们来说,GNU/Linux上的文件系统组织形式和之前他们所熟悉的形式有很大的不同,最开始上手的时候会感到非常迷茫,往常天天见的C盘D盘哪去了?怎么出来一个/目录?为什么所有其它目录和所有可用资源都位于这个/文件树下?什么是根目录(这个和根用户有着本质不同,别搞混了)?问题接踵而来。本文试图以比较的方式,将你所熟悉的东西和现有Linux文件目录联系起来,给你一个大致的概念,以后再继续在学习过程中深入理解。

基本问题 - 我的文件夹在哪里?


在安装了Linux之后,我们的硬盘会拥有一些不同的分区,而要使用它们,前提就是将他们作为目录树下的某个特定文件夹来挂载到系统上。例如,如果我们希望有一个特定的分区来成为我们的home文件夹,就将这个分区挂载为/home即可,以此类推。当然,还有一些外部资源,例如软驱(似乎很少人用了)、光驱或USB设备,它们在从前可能是直接挂载到根目录下,或者是/mnt目录,但按照现在的标准,它们都应该挂载到/media目录下,通常名字都是/media/cdrom0,/media/fd0这种。

另外一个大家很关心的问题,就是被安装的应用程序的位置。习惯了Windows下安装程序的朋友,对 Program Files 文件夹都不会陌生,也知道大多数软件的相关资源,都会在这个文件夹下面找到。但是Linux有很大的不同,由于Linux包的高度模块化,导致很多程序都不是完全独立的,而是在某些功能上对其它程序有一定依赖,因此,程序通常都不是安装在一个独立的文件夹下的。 相反,相关文件都被放到了目录树中预定义的位置里,这样其它程序需要用到时,才能轻易找到它们。这里所指的文件大多是指动态链接库或者可执行文件。

也就是说,在Linux下,我们告别了那著名的 Program Files ,要学会接受把一个软件安装到各个独立的文件夹下:二进制文件进入到bin目录,库文件进入到lib目录,文档进入到doc目录,等等。

好了,空谈了这么多理论,该搞点实际的了。接下来的表格,就说明了Windows下流行的文件系统在Linux下的对应位置:









































MS WindowsGNU/Linux
系统根目录C:\/
用户目录C:\Documents and settings\USER\My documents (XP) 或者 C:\Users\USER (Vista)/home/USER (np. /home/zdzisiek)
配置文件隐藏状态, 通过regedit命令来定制/etc
系统文件C:\Windows二进制: /bin, /sbin库: /lib
安装程序C:\Program Files二进制: /usr/bin, /usr/local/bin, etc库: /usr/lib, /usr/local/lib, /usr/share/lib, etc文档: /usr/share/doc/, /usr/doc, etc
光驱D:\ (或者其它盘符)/media/cdrom ( 或者以软链接形式存在的 /mnt/cdrom or /cdrom)
软驱A:\/media/fd0 (或者以软链接形式存在的 /mnt/fd0 or /floppy)

管理分区和驱动器(/etc/fstab)


我们在这里不详细介绍如何理解并修改 /etc/fstab 文件,只针对其进行相关介绍。

通常在/etc/fstab中,我们会告诉系统,哪些资源是我们希望使用的,比如哪些驱动器,哪些分区,哪些外部设备,哪些共享文件系统,等等。这些资源能够在系统启动时被自动挂载,当然你也可以手工挂载它们,只需要修改auto/nonauto选项即可。

所有Linux系统的资源,在使用它们之前,都要先挂载它们。同样的,如果是移动设备,不再需要使用它们时,应该卸载它们。在Windows下,这些工作都是后台进行的,对你来说没有什么差别,Linux同样可以自动完成这些工作,只不过在Linux下,你可以拥有自己的选择。在很多人性化的发行版本中,像光驱或者USB设备这些流行的设备都会被系统自动挂载,但是,我们仍然有必要理解挂载的原理,只有这样,一旦我们的系统遇到错误了,我们才能自己手工进行操作。

关键的命令就是mount。比如这个命令
mount /media/cdrom

它会将光驱挂载到/media/cdrom目录下。同样的
umount /media/cdrom

将卸载这个设备。

除了挂载设备外,估计大家最为关心的另一个问题就是,如何挂载一个windows分区?这对于双系统用户来讲尤其重要。Windows环境下最常用的两种文件系统就是FAT和NTFS了,前者较老,更基础,但是在Linux下有比较良好的支持,可读可写;后者较新,更高级,但是过去在Linux下使用存在一些问题,比如不可写,虽然后来在高版本内核编译中能够打开,但是非常不稳定。当然,随着ntfs-3g的推出,这已经成为了历史。现在在很多发行版中都自带ntfs-3g,例如我现在所用的feisty。当然,如果系统不自带,你也可以自行下载安装。之后通过gksu ntfs-config,可以在非常傻瓜化的界面中选择要支持的NTFS分区以及是否打开支持NTFS写入功能。

filesystem(点击缩放)

当然,在操作Windows分区之前,我们需要先挂载它们。我们通过fdisk来看看,Linux下是如何辨识它们的:
# fdisk -l /dev/hda

Disk /dev/hda: 60.0 GB, 60011642880 bytes
255 heads, 63 sectors/track, 7296 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/hda1 1 1211 9727326 7 HPFS/NTFS
/dev/hda2 1216 7296 48845632+ 5 Extended
/dev/hda5 * 1216 3040 14648224+ 83 Linux
/dev/hda6 3041 3679 5132736 b W95 FAT32
/dev/hda7 3680 4049 2971993+ 83 Linux
/dev/hda8 4050 4319 2168743+ 82 Linux swap
/dev/hda9 4320 7296 23908216+ 83 Linux

这里的输出显示了硬盘上所有的分区和设备信息。我们发现,磁盘上有两个Windows分区,分别是hda1 (NTFS)以及hda6 (FAT32)。如果想挂载它们,只需要使用以下命令即可:
# mount -t ntfs /dev/hda1 /mnt/C
# mount -t vfat /dev/hda1 /mnt/D

注意,你首先要在mnt目录下分别建立/mnt/C 和 /mnt/D两个子目录,才能进行挂载。挂载完成后,我们就有权限通过mnt目录来访问这两个分区了。但是每次想使用它们都要这样做,是不是觉得有点麻烦?而且也只有root权限的用户才能访问它们。怎么办呢?此时,/etc/fstab文件就派上用场了。通过它,系统可以自动挂载你想挂载的资源,只需要注意权限分配即可。和这两个Windows分区相关的挂载命令行如下:
/dev/hda1 /mnt/hda1 ntfs ro,umask=0222,nls=utf8 0 2
/dev/hda6 /mnt/hda6 vfat rw,uid=1000,gid=1000,iocharset=cp936,locale=utf8 0 2

其中,rw和ro选项分别表示可读可写和只读。uid和gid选项则表示只有uid=100的用户或者gid=1000的用户组的成员才能完全访问相应分区。如果你想自行调整这些值,可以参考/etc/group文件。对于FAT32的分区hda6,由于其文件名中包括有unicode字符集,因此我们还指定了特定的编码支持。通常,只要是分区或者设备中有非ASCII字符,就要指定对相关编码的支持。

关于option的的设定,不同的机器环境是不一样的,这个最好是根据个人机器情况制定,如果装了ntfs-3g但是没有安装上面提到的config,可能fstab的写法也不一样,因此有问题请直接留言,我会尽力解答。

附录:linux文件系统层次简单介绍


在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 - 文档

参考文章:Linux file system and disks
查阅全文»

0 评论:

2007年5月24日 星期四

Linux不能正常启动了,怎么办?

对于使用Linux的人来说,迟早都可能在某一阶段遇到这个问题:你正在兴高采烈得探索你的系统,调整,优化以挖掘其最大的潜力,突然,omg,你 发现,系统不能启动了!如果你之前已经习惯了使用Windows系统,我打赌,这是一个经常性的问题,而你最初闪出的念头就是格式化并重装系统。而对于 Linux而言,重装系统绝对是最后的选择,只有在我们其它努力都作废之后,才需要考虑这一点。我个人认为,唯一能让人不得不重装系统的情况就是,不幸的 你以root身份敲下了不幸的命令rm -rf /。恩,千万别模仿!虽然你可以通过“ctrl c”来终止这该死的自杀操作。

对于Linux,一旦出现无法启动系统情况的时候,也许你知道错误大概出在哪里,有比较明确的修复方向,比如调整屏幕分辨率,或者修改某个脚本,等等。但是,现在问题的关键,是需要能够启动或者访问Linux系统,这样才能修复它。下面就是一些应急措施的介绍。

最先应该想到,也许也是最简单的办法,就是当boot loader—通常都是grub—开始执行时,通过它调整系统运行级别。在出现菜单项后,按下键盘上的“e”按键,这样,菜单项能显示一个或者多个启动命 令,找到有关内核的这一行,将光标移到上面,高亮这一行,再按下“e”,grub就会将这行内容用一个简单的编辑器环境打开,让我们能够对其做出改变。那 么,到底怎么改变呢?很简单,只需要告诉init程序,我们希望通过那个级别启动即可。在内核命令行的最后加上“init X”参数,其中X表示你所希望的运行级别,举个实际例子,如果你判断可能是因为显卡驱动或者分辨率导致的启动错误,就可以启动到命令行模式来修复它,那 么,就应该把运行级别改为纯命令行模式,假设是4,改动后的内核命令行就应该是类似于这样的。

/boot/vmlinuz-2.6.17-11-generic root=UUID=5cc79966-969d-4cd0-abb2-74a132efbd7c ro vga=794 quiet splash init 4

这样,就等于告诉了init程序,我要以运行级别4启动,而不是默认的运行级别。

但是如果你发现,所有的常规运行级别都不能起作用,都会出现启动失败的情况,怎么办?不要着急,我们还可以进入一种特殊的单用户模式,也就是运行级 别1。通过添加命令“init 1”或者“init s”,或者直接添加“single”,它们都起着相同作用,就是让系统启动到单用户模式。

如果这些招数都无法奏效了,怎么办?难道我们就坐以待毙了?no。这里还有一个偏门可以供你使用。我们知道,在默认情况下,内核启动时会执行 init程序,但是你可以指定不同的程序让内核来执行,只需要在后面添加参数“init=/some/program”即可。 “/some/program”通常表示诸如/bin/bash或者/bin/sh这种shell程序。注意这里的等于符号,它的作用是告诉内核,你别启 动init程序了,而是启动我等号后面所指定的任意程序吧。大体命令行如下:

/boot/vmlinuz-2.6.17-11-generic root=UUID=5cc79966-969d-4cd0-abb2-74a132efbd7c ro vga=794 quiet splash init=/bin/bash

这样,你就可以直接启动到所指定的shell中,对发生的错误进行分析,修复等操作。

如果这样做都还是不行……好吧,我觉得你人品有问题^_^!那么,还是拿出恢复cd,通常就是你的安装光盘,它允许你在启动时选择是否进入 rescue修复模式。进入这个模式之后,他会自动找到你的硬盘安装的系统,并将它们挂载到一个临时目录下,这样,你就能进行修改配置文件或者其它修复操 作了。

如果还是不行呢?!@#$%^&*()~~~恭喜你,回到Windows时代,还是老老实实重新安装吧。

这是一篇翻译稿,原文请见这里


查阅全文»

0 评论:

2007年5月10日 星期四

自己动手提高ubuntu系统的性能

这里有一些效果不支持,如果希望最完整的观看本文,请访问http://www.forwind.cn/2007/05/10/ubuntu-howto-improve/

在每一个基本的系统中,都包含有各种各样的基本进程,用于检查系统服务,和操作系统通信等等。进程和系统的性能表现有着很大的关系,因此,一个系统管理者应该清楚了解当前系统中正在运行什么东西,有什么资源可用等等,只有这样,你才能够调整配置,例如,禁止不需要的进程,打开必须的监护程序以及将你的内核调整到最优化,最后得到一个最适合自己使用的最好的系统。Ubuntu是一个为大众设计的系统,这也就决定了其系统设置的大众化,换句话说,臃肿化。为了适应兼容性而支持的很多东西,我们其实不一定需要。在这里,笔者试图讲解一些通过调整内核参数,shell参数以及特定应用的设置来优化系统的方法,供大家参考。需要注意的是,不同的ubuntu系统有着不同的启动脚本,并有着不同的运行进程,这里我只能以7.04系统为基础来讲解。其实自己学会对进程进行追踪查看是非常重要的,只有这样你才能在不同的系统中都游刃有余。另外,如果要更加深入调整系统,那么自己编译一个属于自己的系统是最合适的,本文没有牵涉这么深入的东西。如果你对自己编译linux系统感兴趣,可以参考这篇文章这篇文章

本文假设你有一点点基本使用linux的基础,所以很多东西只是讲一个概念性的大纲,想深入了解的话,网络上有很多文章。如果你是系统高手,基本就可以不用看本文了,你会觉得很简单,如果你是连ps,who -r都不知道的新手,建议你还是先放google搜索一些入门文章,并亲自使用linux一周以上,再回过头来看这篇文章。本文很大程度上参考了Ubuntu Performance Guides,篇幅较长,故分两页发出。

基础知识


理解进程


进程简介


刚才就几次提到进程,那么,我们应该怎么理解这个词语?广泛得说,所有在系统中运行的,用于执行各种各样任务的,都是一个进程,只不过根据具体执行任务的不同可以有所区分,例如,用于管理和维持操作系统运行的属于系统进程,而用于处理用户需求的就是用户进程。

进程并不是一个独立的概念,它是相互交互的,很多进程都为其他进程提供服务,或者携手共同完成某一个功能。这些服务中,有一些对于系统的运作是非常关键的,例如X-Windows服务。绝大多数的系统进程都是服务性质的进程,而绝大多数用户进程则是应用程序类进程。应用程序,比如你现在在使用的FireFox(或者其它,估计FF最多吧)通常是由一个或多个满足用户需求的进程组成。总的来说,服务的开启和关闭是基于系统需求的,而应用程序的开启和关闭,则是基于用户的需求的。

我们上面说的这些进程阿,服务阿啥的,其实之间的区分并不是很明显,举个例子,Gnome的桌面系统就是由各种程序和进程组成,而他们不仅提供其它程序需要的服务,还可以支持用户的需求。GDE完全可以被称为是程序,进程,应用和服务的集合体,这不会产生任何冲突。

当然,我们还是要稍微做一下区分,后面才方便继续讲解。现在就统一一下,进程表示任何可以产生运行中的进程标志符的东西,程序则表示能产生进程的可执行文件。用户能够直接使用应用程序,而操作系统才使用服务。

进程基本操作


在你的机器上,唯一能够消耗你资源的就是正在运行的进程。如果当你发现自己的系统突然很慢,运行不正常时,通常只有两个可能,一种是某些进程运行异常,另一种就是某些进程所消耗的资源已经大于你所拥有的资源。

当然,想看看什么东西正在你机器上运行其实很简单,使用ps -aux或者top命令即可,这些东西资料很多,我就不多说了,实在不行man top或者man ps吧。当然,对于初学者来说最方便的还是利用图形化界面的系统监视器,如图:

screeshot(点击缩放)

所有信息都尽显眼前。注意,在系统监视器中,你不仅能看到进程运行情况,还能看到磁盘使用,CPU使用等很多有价值的信息,这些信息是接下来的部分可能用到的。

ok,现在我们知道,如果系统异常,如何去确定是什么进程异常了。但是接下来该怎么处理呢?无论是命令行还是图形界面显示,你都可以看到每一个进程都有属于自己的ID,也就是PID。它们都是进程的句柄,而不是表示真实的进程。这有什么区别?对于一个拥有多线程的进程来讲,可以让所有的线程都拥有同一个句柄,也可以让每一个线程都拥有一个句柄。太专业了?恩,通俗来讲,这就相当于......进程的身份证,我们通过它来标志进程。这个东西在ubuntu中默认可以有32768个不同的PID,每有一个新的进程,就分配一个当前未用的PID给它。

好了,让我们找到那个让我们系统变慢的该死的罪魁祸首,看看它的PID,然后用kill PID命令来关闭它。等等,你确定就是这个进程影响了你的系统?你确信没有错杀好人?好吧,其实可以先用kill -stop PID命令来暂停一个进程,看看没有了它,我们的系统是否正常。如果发现了冤假错案,没关系,kill -cont PID能让进程继续工作。

除了直接使用kill PID之外,我们还有更进一步的kill进程的办法。kill PID仅仅是发出一个TERM信号,然后进程能捕捉这个信号,开始释放资源,关闭程序,这不是一下子就完成的,因此在关闭程序之前,你可以结束打开的文件和完成正在做的任务。但是这导致一个问题,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号,而且如果进程失去响应了怎么办?别急,我们还可以试一试kill -1 PID命令,这个命令发送的是hang up信号,含义是“中止信号”,它告诉进程,终端已经被kill了。但这个信号同样只被运行良好的进程所拦截。假设这两种方式都无法结束进程,那么只能使用kill -9 PID了。这个命令发送的是真正的kill信号,对于这个信号,进程是不能忽略的。 这是一个“我不管您在做什么,立刻停止”的信号,也就是说进程立刻被终止,不实施清理操作。

信号是用来与守护程序和进程通信的。任何活动任务都是一个进程,而守护程序是等待对某些事件做出反应或者按照日程安排执行任务的后台服务。一个程序必须有建在其中的信号处理程序用于捕获和应答信号。在LINUX中的signal参考指南解释了各种不同信号和这些信号的用途。常用的信号除了上面介绍的以外,还有INT,CHLD等。

进程操作进阶


当然,仅仅了解上面的知识,对于对进程的理解,还是不够的。下面,我会介绍更多的关于进程的知识。

首先,我们需要知道,并不是所有的进程都会被动态分配PID,至少有两个进程不会,就是kernel和init。kernel进程的PID是0, 一直是0,而且你无法从ps,top这些命令中看见它,当然,也无法用kill命令来终止它。init进程是主父进程,什么意思呢?每一个进程都需要一个父进程来监管它,父进程的作用就是接受子进程的返回值和状态值。而如果任何一个进程的父进程被终止,init就会成为它的父进程。init进程的PID固定是1,从理论上讲,你也可以终止它,但是千万不要试图这样做,因为它是用来清除呆死进程的,一旦将其kill,系统最终将崩溃。

除了他俩,还有一些进程是你不应该kill的,包括Zombies,/O Bound—A和Interception。事实上,我们很少解除这几个进程,普通用户也没必要接触它们,因此,在这里我不会详细解释它们的用途,有兴趣的朋友可以自己google。

其它进程,在保证系统本身不崩溃的情况下,一旦有异常你都可以试图去kill,不过要知道,kill命令只作用一次,也就是说,假如,我是说假如,这个进程在被kill后又重新自启动,那么你不得不再运行一次kill,这样循环。当然,此时,你就不能一直陪它kill下去了,追踪查看其自启动的根源才是正确的做法。你觉得这太麻烦了?好吧,还有一个懒办法,就是看看这个进程的名字,然后用kill name来阻止它。我知道很多地方都有介绍kill -9 -1这个命令,但是你需要知道,这个命令会kill你所有的进程,包括界面进程以及终端。而且如果你是root权限......它会连所有系统应用都一起kill,然后,你的系统就将崩溃。所以用这个命令,你还不如直接按下你的重新启动按键,还更加省心......

进程的启动


我们能够查看正在运行的进程,查看进程的具体信息,但是,我们能不能知道它们是怎样开始的?难道是和孙猴子一样从石头里面崩出来的?你也许会看它的PPID,恭喜你,摸着点门道了,but......你会发现大多数进程的PPID都是1,init进程。而事实上,进程的启动原因可能是很多种,启动脚本,设备配置脚本,网络变化,甚至是任务日程等等等等。因此,我们需要探查进程启动的秘密。

启动脚本


看看你的/etc/init.d/文件夹,你会发现其中包含了很多用于启动和停止系统服务的脚本,而它们,都将以链接形式存在于/etc/rc0.d, /etc/rc1.d以及类似目录中。例如,在/etc/rc1.d执行命令ls -l,你会看见如下结果:
lrwxrwxrwx 1 root root 13 2007-04-21 22:01 K01gdm -> ../init.d/gdm*
lrwxrwxrwx 1 root root 17 2007-04-21 21:59 K01usplash -> ../init.d/usplash*
lrwxrwxrwx 1 root root 17 2007-04-23 14:54 K09apache2 -> ../init.d/apache2*
lrwxrwxrwx 1 root root 17 2007-04-21 21:58 K11anacron -> ../init.d/anacron*
lrwxrwxrwx 1 root root 13 2007-04-21 21:58 K11atd -> ../init.d/atd*
lrwxrwxrwx 1 root root 14 2007-04-21 21:58 K11cron -> ../init.d/cron*
lrwxrwxrwx 1 root root 16 2007-04-21 21:59 K19cupsys -> ../init.d/cupsys*
lrwxrwxrwx 1 root root 15 2007-04-21 21:59 K19hplip -> ../init.d/hplip*
lrwxrwxrwx 1 root root 22 2007-04-21 21:58 K20acpi-support -> ../init.d/acpi-su
...................................

如果你的运行级别是1,init就会进入/etc/rc1.d并调用其中的链接符号,也就是启动相应的进程,以此类推。如果想知道目前系统的运行级别,最简单的办法就是用who -r命令,会显示:
run-level 2 2007-05-04 10:09

这就表示我目前的系统运行级别是2。在boot的时候,所有/etc/rc2.d目录下对应的init脚本的输出都会存到/var/log/messages这个文件中,你可以根据它来判断哪些进程被执行了。

启动设备


udev进程用于动态管理设备的配置,这个进程监视和管理即插即用设备。一旦这些设备生效,存在于/etc/udev/rules.d/文件夹下的哪些脚本就会生效,调用不同的应用程序。

shell启动脚本


每当你登入登出系统,或者是启动了一个新的shell之后,都会执行配置脚本,每一个脚本都会启动进程。对于笔者使用的ubuntu而言,默认的shell是bash,相应的配置脚本如下:

/etc/profile:每次登录shel都会执行,全局配置文件
$HOME/.bash_profile:基于用户自定义,每一个用户都可以有自己的登录脚本
/etc/bash.bashrc:交互式非登录全局配置脚本,这个文件在.bashrc中会调用
$HOME/.bashrc:交互式非登录用户自定义的配置脚本,也是我们大多数时候需要修改的文件
/etc/bash.logout:不一定存在,如果存在的话,每次用户登出时调用它
$HOME/.bash_logout:同上,只不过是用户自定义的

我们可以注意到,上面这些脚本大致可以分为两类,一类是用于登入登出的,一类是交互式。它们有什么区别么?简单得说,每当你登入你的系统时,登入脚本和交互式脚本都会执行。而当你打开一个终端窗口时,只有交互式脚本才会被执行。

桌面脚本


linux喊了一万年的要易用,要占领桌面系统,简单说来,就是希望有一个漂亮易用的图形界面。大多数人的大多数应用还是基于图形界面的,因此,除了上面介绍的shell脚本,我们还应该关注一下图形界面脚本。

在启动图形界面的时候,首先会运行/etc/X11/xinit/xinitrc, /etc/X11/Xsession和/etc/X11/xinit/xserverrc这三个脚本。它们会设置相应的环境变量,并在最开始启动时运行应用程序。在X-Windows启动完毕之后,就是Gnome的启动,它会调用很多程序,产生很多进程,也就是类似于Windwos下的开机自启动程序。到底是哪些进程呢?我们可以从存放系统级别启动脚本的/etc/X11/gdm/目录,用于用户自定义启动程序的$HOME/.gnomerc文件,或者通过系统>首选项>会话菜单来查看:

screeshot(点击缩放)

好,问题来了。既然有这么多的地方都能进行开机自启动程序的添加,难道它们都是完全一样的么?这样有什么意义呢?

恩,它们当然不是完全一样的,而是各司其职。

如果你希望自启动程序是作用于使用X-Windwos的所有人,那么你要修改的地方就是/etc/X11/Xsession,或者把脚本放置到/etc/X11/Xsession.d/目录下。如果仅仅是希望对你自己使用X-Windwos时生效,则修改$HOME/.xsession即可。

如果你希望自启动程序是作用于使用Gnome的所有人,那么你要修改的地方就是/etc/X11/gdm/PostSession/Default,它会仅仅对Gnome使用者起作用,而不是KDE使用者或者其他。或者把脚本放置到/etc/X11/Xsession.d/目录下。如果仅仅是希望对你自己使用Gnome时生效,则修改$HOME/.gnomerc即可。
小知识:Gnome和X-Windows的区别?
X-Windows是图形界面底层,提供的功能是在屏幕上构造方块(窗口),然后画出里面的元素,但不提供交互式操作。gnome,kde这些都是基于X-Windows的不同风格的界面,属于桌面环境。怎么理解这个桌面环境呢?基本的意思是指“ Mac OS 和 Windows的图形界面有,而X没有却应该有的东西”。通常是一组有着共同外观和操作感的应用程序,和程序库,以及创建新的应用程序的方法。事实上你可以同时有两个文件管理器,两个面板,等等,并不冲突,因为它们都是属于应用。

桌面应用


插入光盘,就会自动弹出文件浏览器,插入数码相机,就会自动弹出照片导入程序,等等。这些应用是怎么实现的?如何禁止程序的自动执行?如何自定义在即插即用设备被认出以后的启动程序?
答案就在 系统>首选项>可移动驱动器和介质 里。打开它,你就明白怎么回事了,这东西实在太简单,我就不多说了。 只有一点补充的,就是如果你要使用一款新的即插即用设备,而这种设备在可移动驱动器和介质选项中没有,那么此时你就必须求助于udev了。至于udev的具体知识,讲起来又是一篇文章,所以就不讲了,还是那句话,放google~~^_^。

评估资源


刚才我们一直再说资源资源,当然,系统资源的使用情况直接决定了你系统当前的性能。那么,我们如何才能对自己系统的性能做一个基础评估呢?在评估之前,我们需要对资源做一个更加详细的解释。所谓的资源,都是指进程所能使用的资源,包括了CPU处理能力,磁盘空间,磁盘I/O,RAM使用情况,显存使用情况,网络流量等。而这些资源的当前使用状态,我们都是有办法自己获取的。

系统监视器和proc


正如大多数linuxer所知道的那样,/proc挂载了一个虚拟文件系统,专门用于列出当前系统资源情况和正在运行的进程。在这里,所有的东西都是动态的,随时可能改变的。最关键的是,/proc目录下有很多以数字命名的文件夹,这些文件夹都对应了某一个响应PID的进程,内含进程的很多信息,包括使用命令,运行环境等。还有一些不是以数字命名的文件夹,那是设备驱动和内核的情况,例如,cpuinfo这个文件就提供了系统中cpu的相关信息。

当然,你可能觉得从这里面获取系统资源信息实在太麻烦了,你会抱怨,拜托,我仅仅是初学者,有没有直观的办法?sure!刚才我们说的CPU处理能力,磁盘可使用空间,内存情况,网络情况,你统统都可以从系统监视器中看到。监视器以曲线图的形式把情况呈现在你的面前,你可以根据它评估系统的运行是否良好,有没有异常的发生。

screeshot-1(点击缩放)

其它


那么,监视器就是万能的?no,至少显存和磁盘I/O的情况它就无法呈现给你。在实际使用中,可能会发生你的系统中有好几个磁盘,但某个磁盘的I/O通道堵塞会导致系统性能下降的现象。有什么办法来确定是哪个通道在搞鬼呢?这里,iostat就可以帮助我们了。这是一个小的,评估I/O性能的软件,通过sudo apt-get install sysstat来获得它。安装完后直接输入iostat命令,就会显示:
avg-cpu: %user %nice %system %iowait %steal %idle
7.18 0.08 3.58 2.34 0.00 86.83

Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda 16.63 0.19 0.16 1046 877
sdb 0.01 0.00 0.00 0 0

包括基本CPU负荷以及I/O情况。我机器上磁盘数量较少,所以结果比较少。好了,光知道这些数据是没用的,我们需要做的是根据这些数据来分析系统负荷。我们假设现在sdb设备数据量不正常,好,接下来就用mount命令来看看,是哪个文件挂载到sda下的,得出文件路径名后,用lsof来查看这个目录下打开了哪些文件,哪些进程,以及相关信息。这样,就能有的放矢得来寻找到让你磁盘I/O情况异常的东西。

之后谈谈显存的情况读取。首先谈谈我们为什么要关注显存,显存的容量会直接影响你的显示情况,例如,如果你只有一块老的,256K显存的显卡,那么屏幕的显示最高也就是支持到800x600,16位色深。 如今,大部分的高端显卡都拥有至少128MB的显存,能够轻松在32位色深的情况下上到1280x1024的分辨率。更多的显存同样对游戏以及桌面的逼真度有益,因为可以由显存的一部分来保持主画面的显示,其它空余下来的显存就可以用来体现各种层面的仿真元素。我们可以通过lspci –v 命令来显示所有PCI卡,包括显卡的存储关联情况。这个命令有什么用呢?当你遇到硬件问题,比如缺乏关键的硬件环境支持时,可以用这个命令来诊断到底是什么设备出了问题。这个命令在我这里奏效,但我不保证在所有的机器上都能奏效。在显示的情况中找VGA这一栏,可以看到显示信息如下:
01:00.0 VGA compatible controller: ATI Technologies Inc RV370 [Sapphire X550 Silent] (prog-if 00 [VGA])
Flags: bus master, fast devsel, latency 0, IRQ 16
Memory at 20000000 (32-bit, prefetchable) [size=256M]
I/O ports at 2000 [size=256]
Memory at 30110000 (32-bit, non-prefetchable) [size=64K]
Expansion ROM at 30120000 [disabled] [size=128K]
Capabilities:

从这里,我们就可以看出我的显卡是256M显存。



实战演练


在经过上面基础知识的介绍,就算是超级新手,也大概应该明白一些东西了。好,下面我们就进入实际调整的环节。同样,所有内容都是基于我的ubuntu feisty系统,如果你的不是这个系统,请仔细核对后再实践,我不对任何内容做“肯定可行”的保证。

加快系统启动速度


刚才我们已经介绍过了,每次开机启动的时候,启动脚本都放在/etc/rc*.d/目录下,这个*取决于你的运行级别。但是,并不是所有的脚本都是你目前这个系统需要的。如果把那些你不需要的启动进程都去除,那么不仅仅是系统启动速度会变快,开机后分配给你使用的资源也会增多。

所以现在,我会告诉你一些常见的可禁止的启动进程。在此之前,我得提醒各位,对于那些我没有提及的进程,除非你很清楚知道自己在干什么,否则最好不要去动它们,比如gdm(Gnome桌面)或者module-init-tools(内核模块)这种,要是误操作了,系统错误可别怪我......

事实上,我们可以通过系统--》管理--》服务的图形界面来做这种活,但是在这里,它并没有列出所有的服务,因此,为了对所有的启动进程都能进行自定义,我们选择sysv-rc-conf工具来进行操作。可以通过
sudo apt-get install sysv-rc-conf

命令来安装它。然后以root权限打开,界面如下:

sysv-rc-conf(点击缩放)

第一行的一排数字表示你的系统运行级别,对应的列就是该级别对应的启动进程,具体打开和关闭启动进程的操作方式很简单,下面就有说明。

好了,介绍一下常见的可以考虑去除的进程吧
* anacron — 这是一个一个自动化运行任务守护进程。你可以把它屏蔽,然后用cron来安排计划任务。

* atd and cron — 如果你根本就不会使用计划任务功能,那么可以连这个也不要。不过它占用的资源极少,不是特殊情况也没有必要禁止它。

* apmd — 这是一个电源管理方面的服务,专门用于监视那些不支持ACPI的旧系统的电池。如果你使用的笔记本比较新,或者使用的是台式机,就没有必要要它。

* acpid — 这个服务用于监视电池电量,以及那些键盘上的特殊功能键,比如屏幕亮度调整键,音量控制键,无线网卡开关等等,也可以监视台式机键盘上一些网络应用等类似快捷键。如果你使用的不是笔记本,也不需要这些快捷键,就可以禁止它。

* bluez-utiles — 提供蓝牙服务的支持,怎么操作就取决于你有没有蓝牙设备了。

* dns-clean, ppp, 和pppd-dns — 这些服务用于动态拨号连接。如果你使用的不是拨号,就可以禁止。

* hplip — 提供对HP Linux 图像和打印系统的支持。建议禁止,因为就算没有它,也可以通过lpr这些来实现打印。

* fetchmail - 接受邮件的守护程序,建议关闭。

* nvidia-kernel- ATI显卡用户可以关闭,自己编译显卡驱动的用户也可以关闭。

* hwtools - 优化irqs的工具,不用irqs的话就可以关闭

* mdadm, mdadm-raid, and lvm — 用于支持RAID的文件系统和逻辑卷管理(lvm)。如果没有使用它们,就可以禁止。不过笔者建议在熟悉基本操作后可以自己尝试学习一些LVM相关的知识,还是挺有意义的。关不关看自己吧。

* nfs-common, nfs-kernel-server, and portmap — NFS(Network File System)是一种分布式文件系统,允许网络中的安装不同操作系统的计算机间共享文件和外设。如果你不是经常需要NFS服务,就可以先禁止它,等要使用时,再用下面的命令来启动它们:

sudo /etc/init.d/portmap start
sudo /etc/init.d/nfs-common start
sudo /etc/init.d/nfs-kernel-server start

* pcmcia and pcmciautils — 提供对笔记本上PCMCIA设备的支持。如果没有PCMCIA插槽,还要它干吗?

* powernowd and powernowd.early — 用于控制可变速CPU的服务。现在新的计算机CPU大部分都是可自动变速来节省电量了,所以只有那些很老机器的用户才建议关闭它。事实上,这部分用户已经很少很少,所以我个人建议还是保持开启。

* readahead and readahead - 一般只有内存非常小的用户,才建议关闭这个启动进程,因为它会预加载一些库,让一些程序在启动时更快,这样会消耗一些内存。如果你内存比较大,就没有必要管它。

* rsync— 用于在计算机之间同步文件的服务,极少人用到,基本都可以禁止。

* vbesave — rvices monitors the 监视Video BIOS实时配置的服务。它是ACPI的功能之一,通常是笔记本需要在屏幕显示或者外接显示(投影仪之类)之间切换时才起作用。如果你的计算机不支持ACPI或者没有这种应用的需求,就可以禁止。

调整内核参数


查看参数


不要把内核参数想象得太神秘,事实上,有很多参数是你自己就可以调整的。用下面这个命令在终端中执行试试看,结果是什么?
sudo sysctl -a | sort | more

是的,显示的就是一系列内核参数。即使你不用sudo,也可以看见大多数参数设置。这些显示的参数都很好理解,比如kernel.threads-max = 16379,就表示同时运行的最大进程数是16379个。也许你会奇怪,PID的最大值不是65536么?怎么这个设置小这么多?是的,这就是我在这里介绍调整内核参数的原因。我们完全可以通过调整这个值来适应不同的系统,比如如果你的cpu频率很低,内存很小,就可以把这个值缩小一些。如果你的cpu很棒,内存很足,就可以不用管它,甚至调大也行。这完全取决于你的机器配置,和你自己的想法。事实上,在你安装ubuntu的时候,它就会自动根据可用资源来调整这个参数,所以不同机器上,这个参数可能是不同的。但是记住,机器调整的毕竟没有人调整的好,无法最大限度发挥系统的性能。

调整参数


好,我们现在已经可以看到很多内核参数了,那么,接下来的事情就是根据自己机器的情况来调整。通常有两种方法来调整参数,一种是在命令行下,通过类似命令
sudo sysctl -w kernel.threads-max=16000

这样来调整。这种方法调整过的参数会立刻生效,但是不会永久生效。什么意思呢?也就是说一旦你重新启动,所有改动就会消失。那这样岂不是毫无意义么?所以还有第二种方法,就是直接修改/etc/sysctl.conf文件。这个文件本身没有任何内容,有的东西全部是注释,就等着你来修改。比如,你可以将
kernel.threads-max=16000

这行命令加进去,这样,在重新启动之后,threads-max的值就会变成16000了。

通常,我们应该配合这两种办法来进行内核参数调整。首先用命令行形式调整,看看并测试直观的效果,如果比较满意,再把调整写入文件中。命令行调整的好处就是,不管你怎么胡乱修改,甚至导致系统错误,没关系,只要重新启动,一切就将恢复原样。

修改共享内存


在linux下,不同的应用程序可以共享同一块虚拟内存地址,这样方便不同程序之间的通信和信息共享,通常有两种共享内存的分配方式:临时和永久。临时分配的意思就是在所有共享的应用程序都释放内存句柄,不再需要它时,内存就会被收回。而永久分配的意思就是即使没有任何应用程序使用它,这些共享内存也会继续保持,这就有利于将状态保存于其中。

我们可以通过ipcs命令来查看进程间通信的状态。输入ipcs -m来浏览内存使用情况,显示结果为
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 131073 windstorm 600 393216 2 dest
0x00000000 393218 windstorm 600 393216 2 dest
0x00000000 425987 windstorm 600 393216 2 dest
0x00000000 229380 windstorm 600 393216 2 dest
0x00000000 262149 windstorm 600 393216 2 dest
0x00000000 294918 windstorm 600 393216 2 dest
0x00000000 327687 windstorm 600 393216 2 dest
0x00000000 360456 windstorm 600 393216 2 dest
0x00000000 458761 windstorm 600 393216 2 dest
0x00000000 3964938 windstorm 600 393216 2 dest
0x00000000 524299 windstorm 600 393216 2 dest
........

是不是有点晕了?我们可以看到一些共享内存的信息,包括共享内存ID,所有者,状态等等,但是这对于普通用户来说是不够的。你总得让我知道是谁在用吧?所以,我们应该使用下面这个命令
ipcs -m -p

来看看输出结果:
------ Shared Memory Creator/Last-op --------
shmid owner cpid lpid
131073 windstorm 5473 4790
393218 windstorm 5568 4790
425987 windstorm 5566 4790
229380 windstorm 5413 5513
262149 windstorm 5490 8277
294918 windstorm 5512 4790
327687 windstorm 5496 7300
360456 windstorm 5496 7300
........

好了,现在我们知道这些共享内存块分别是谁创建的(cpid),谁最近一次访问(lpid)。有时候,你会发现一些被遗弃的共享内存,就可以用ipcrm -m|-q|-s shm_id来删除共享内存信息。

但是通常情况下,如果所用的系统是作为数据库或者高性能网络服务器使用,我们更加关心的是如何分配更多的共享内存,而不是清除废弃的共享内存。那么首先,我们可以通过sysctl kernel | grep shm命令看看当前共享内存的分配情况。
sysctl kernel | grep shm

我的机器上果如下:
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmax = 33554432

这是什么意思呢?这些数据表示,当前总共有33,554,432 bytes (32 MB)可用共享内存,每一个单独的程序最高能够分配到2,097,152 bytes,也就是2 MB,而最小的分配单元是4096 bytes。这些数据对于常用的应用来说完全足够了,但是如果是那种类似于数据库的高性能应用,可能你就需要考虑增大它们的数值了。修改方法?请参考“调整参数”小节。

ipcs还有很多其他的查看方式,比如ipcs -m –t能够显示最近一次共享内存的访问的时间,ipcs -m –c则可以显示访问权限,请man ipcs来自行查阅更多用法。

修改个人用户设置


在内核设置层面之上,还有很多个人用户配置的参数,ulimit命令就是bash下提供的,查看对指定应用的限制值的工具。你可以通过ulimit –a命令显示当前设置:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) unlimited
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

上面的信息什么意思?举个例子,
open files (-n) 1024

表示一个用户shell最多可以打开1024个文件,想增加怎么办?ulimit -n num即可。
core file size (blocks, -c) 0

表示core dumps功能关闭。想打开怎么办?ulimit -c num即可。
如果你只是普通身份用户,则只能对数值进行减少的修改。如果想增加数值,需要用root权限修改。而且,一些参数的上限是和内核参数对应的,比如你可以增加打开文件句柄的数目,但数目的最大值不能超过内核参数fs.file-max设置的值(sysctl fs.file-max看看)。

修改日志数据


好吧,我知道这招有些冒险,但是确实很有作用。为了避免一些朋友在使用后出问题又无法解决,我在后面也附上了问题解决方法。

我们知道,无论是Ext3还是ReiserFS,都有三种日志方式:
1) Journal Data Writeback
2) Journal Data Ordered
3) Journal Data

三者的不同点,简单得说就是实际数据被写入文件系统以及相关日志的时间不同。默认系统采用的是Journal Data Ordered方式。如果采用Journal Data Writeback方式,能够有效提高系统速度,只不过这是有代价的:一旦系统崩溃,在通过日志恢复后,你可能只能得到一些旧的数据,而不是最新数据。所以,在修改前,请三思,如果你是对当前工作进度的备份要求非常苛刻的人,最好不要使用这个办法。

那么,接下来就介绍一些具体的修改办法,首先, 如果你是Ext3系统,需要进行以下步骤,否则可能在重新启动时出错:
sudo tune2fs -o journal_data_writeback /dev/hda1

这是人工在重启之前把文件系统设置为writeback模式。用下面这个命令来确认是否得到了执行:
sudo tune2fs -l /dev/hda1

千万注意,ReiserFS文件系统不用这样。

然后sudo vim /etc/fstab,在你的root分区mount属性中增加

data=writeback

这一句,使其看起来是这样的:
/dev/hda1 / ext3 defaults,errors=remount-ro,atime,auto,rw,dev,exec,suid,nouser,data=writeback 0 1

保存,然后sudo vim /boot/grub/menu.lst,在下面两行加上粗体属性:
# defoptions=quiet splash rootflags=data=writeback
# altoptions=(recovery mode) single rootflags=data=writeback

这样的话,即使升级内核,增加的标志也会保持,不会被覆盖。最后运行sudo update-grub即可。

ok,再提醒一句,这样做是比较冒险的。我知道你很有冒险心理,所以一旦重新启动出问题时,请用一下方法解决:
将系统重新启动到恢复模式下,在命令行下输入
mount -o remount,rw /dev/sdXX/

这个sdXX就是你的硬盘分区,这样就允许你修改硬盘上的fstab和menu.lst文件,将改变还原,然后在正确的系统中再去思考到底哪里出了问题。

杂项


1. 上面已经介绍,/etc/init.d/下面的都是启动脚本,默认这些脚本是按顺序启动的,实际上,如果你使用的是SATA 或SCSI,可以并行启动这些脚本程序,加速启动过程。而如果你的机器配置较老,则最好还是不要修改。修改方法是通过命令
sudo vim /etc/init.d/rc

找到并修改该行:
CONCURRENCY=none
为:
CONCURRENCY=shell

2. 长期使用 Ubuntu 后有一种感觉,那就是在 GNOME 中启动应用程序时,速度越来越慢。在 Ubuntu 英文论坛那边看到一个技巧,可以对这个问题起到改善作用。打开 /etc/hosts 文件,可以看到类似下面的内容:
127.0.0.1 localhost
127.0.1.1 windstorm

现在,只需在第一行的末尾加上主机名即可
127.0.0.1 localhost windstorm
127.0.1.1 windstorm

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

3. Pango是一个着重于国际化的,用于输出和文本渲染的库,但是这个库可能导致firefox等一些程序有着过高的cpu占用资源。我们可以
sudo vim /etc/environment

然后在其中添加:
MOZ_DISABLE_PANGO="1"

这样就可以禁用Pango了。

参考文章:
1. Hacking Ubuntu to Improve Performance
2. HOWTO: Tweak your ext3 filesystem for a performance boost
查阅全文»

0 评论:

2007年5月5日 星期六

编译安装Pidgin 2.0.0

Pidgin 2.0.0正式版终于发布了。它是gaim换名的版本,相当于是gaim 2.0.0正式版。你可以等待官方源的发布,然后apt-get install它,也可以去sourceforge下载相应的源代码编译安装。鉴于我迫不及待想试用的心情,就下载了Pidgin 2.0.0在ubuntu7.04下编译安装,安装步骤如下:

1.首先sudo apt-get build-dep gaim 准备编译 Pidgin 所需的依赖。
2.将下载的源代码包解包,然后进入解包后的目录。
3.运行命令./configure,默认安装在/usr/local/bin,/usr/local/man这些目录下,如果你希望和别的大多数软件一 样安装在/usr目录下,在命令后面添加–prefix=/usr即可,–prefix=PATH是决定安装路径的。还有其它一些可改的选项,可以用 ./configure –help 查询需要使用的选项,根据自己的实际情况选择。
4.make,时间有点长,可以去喝杯咖啡~^_^
5.make check,进行自测试。
6.make install
7.如果你想卸载程序,使用命令make clean即可。make distclean命令则可以连configure创建的文件都一起删除。

经过以上步骤后,Pidgin 就安装到系统中了。在终端中输入 pidgin 即可执行程序。下面来看看它的真面目:

virtualbox(点击缩放)

这是我最大化之后的效果,可以看出,和gaim的beta7区别不大,色调更加柔合了一些,稳定性目前来看没有什么太大的问题,还在进一步试验中。

喜欢?那就去这里下载吧。



http://www.forwind.cn/2007/05/05/linux-pidgin/
查阅全文»

0 评论:

2007年5月1日 星期二

ubuntu7.04下用上virtual box虚拟win,超快!

使用linux这么久以来,感觉最不方便的不外乎两点:
1 无法用firefox使用网银和taobao。
2 无法使用visio,目前linux下还没有能够完美替代的工具。dia?no,实在是有点难用。

但是之前一直都忍了,毕竟都是些小问题,终于,最后,一件事促使我爆发,那就是,我无法使用腾讯通,无法和实验室所有人交流。基本上,意味着我一直处于与室隔绝的状态。每次看到骡子他们在腾讯通上聊得high 的,然后商量讨论实验室的事情,心里面就感到被歧视了,俺也要参与……

在犹豫了很久,摇摆了很久,思想斗争了很久之后,我决定,一定要摆脱这种状况!怎么摆脱呢?让我放弃linux是不可能的,我对ubuntu的爱已经深到骨髓了,呵呵。于是,在wine和虚拟机的解决方案之间,我选择了虚拟机。

早就听说virtual box速度很快,但是想着自己只有512M内存,安装虚拟机的话分一半内存,肯定比较慢。传统的windows思想……不过先试一下吧。下载deb包,安装,进入,安装系统,一路都非常顺利,畅通无阻。找到deepin xp精简版本的系统iso,挂载,安装,完成后重启……

于是进入了传说中的虚拟windows:



安装腾讯通,安装maxthon,打开网页,打开qq,跑了半个多小时,同时linux也在播放音乐以及一些基本任务,感觉非常流畅,如果 linux什么都不做,在windows下的应用感觉比真系统还流畅(内存分配机制的不同,这是正常现象)……我才分了192M的内存给它的……

windows能做到这点么?

It’s the reason why I love linux.


查阅全文»

0 评论:

2007年4月29日 星期日

在ubuntu7.04上自己构建lamp以及wordpress

LAMP (Linux + Apache + MySQL + PHP/Perl/Python) 近几年来,已经成为Web 社区的事实标准,成为了一个廉价的,开放源码的,高性能的Web 开发平台。在这里,我将介绍在ubuntu7.04环境下的LAMP组合的安装,以及利用世界上最流行的blog系统wordpress来建站的步骤。所有相关软件都是开放源代码产品,不必担心产品的价格以及版权问题,而且这些软件现在已经非常人性化了,使用非常方便。本文假设你有ubuntu或者其他 linux的使用经验。ok,由此进入:

1.安装

IP与域名配置

首先,假设你用有一个固定IP(事实上,每一个服务器都应该拥有一个固定IP),并假设你有一个域名。当然,没有域名的话,在后续的管理步骤中直接 用IP也可以。好,让我们来编辑/etc/network/interfaces 文件,配置一个固定IP。然后编辑/etc/hosts文件,让你的域名和IP对应:

vi /etc/hosts

127.0.0.1 localhost.localdomain localhost
192.168.0.100 www.forwind.com server1

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

最后,编辑一下/etc/hostname文件,加上www.forwind.cn,并重新启动。

好,让我们来确认一下,在终端下输入

hostname
hostname -f

结果都应该是www.forwind.cn

安装相关包

我们可以用下列命令一次性把相关需要的包全部安装:

apt-get install binutils cpp fetchmail flex gcc libarchive-zip-perl libc6-dev libcompress-zlib-perl libdb4.3-dev libpcre3 libpopt-dev linux-kernel-headers lynx m4 make ncftp nmap openssl perl perl-modules unzip zip zlib1g-dev autoconf automake1.9 libtool bison autotools-dev g++

安装LAMP软件

打开新立得,编辑 –> 使用任务分组标记软件包 –> 勾选 LAMP Server。完毕之后再单独安装 phpmyadmin:

sudo apt-get install phpmyadmin

确认安装

在你的机器上,打开Firefox或者其他浏览器,输入你的刚才配置的IP 地址或者域名,看看是不是出来了 Apache 的默认页?

2.设置LAMP

基本设置

设置apache的密码:GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY "xxx";在这里,root是用户名,xxx是你想设置的密码。密码设置好以后,用“quit”退出。接下来看看 Mysql 现在有的数据库:

mysqlshow -u root -p //mysqlshow

结果有 information_schema 和 mysql 这两个数据库,这样就ok了。

配置 apache2.conf

sudo gedit /etc/apache2/apache2.conf

去掉 AddHandler cgi-script .cgi 前的注释 “#”。

然后在任意地方添加这么一段:

DocumentRoot /var/www/

Options FollowSymLinks
AllowOverride all


Options ExecCGI

重启服务器
sudo /etc/init.d/apache2 restart

其它设置

如果你希望MySQL不仅仅接受localhost的连接,而是所有,就需要编辑/etc/mysql/my.cnf ,注释下面这一行成这样:

vi /etc/mysql/my.cnf

[…]
#bind-address = 127.0.0.1
[…]

然后重新启动

/etc/init.d/mysql restart

接下来检查一下网络连接情况

netstat -tap

在结果中你应该看到下面的内容:

tcp 0 0 *:mysql *:* LISTEN 22565/mysqld

当然,你还可以在本机上启用 mod_rewrite 模块

sudo a2enmod rewrite

这样就可以生成各种指定形式的Permalink(一个静态html形式的页面地址),便于搜索引擎的查找和用户的使用。具体关于mod_rewrite 的资料,请自行google。

这样,一个基本的LAMP就建立起来了,此时/var目录下就会出现www网络服务根目录,如果想自己建立站点的话,PHP 程序放 /var/www/ 下面,CGI 程序放 /var/www/cgi/ 下面,就行了。接下来,针对利用世界上最流行的blog系统wordpress来讲解基本的建站步骤。

3.安装wordpress

建立数据库

如果你虚拟主机的服务商会给你提供一个数据库,那就不用你亲自动手了。但一般服务商都提供接口,允许你自己创建数据库,创建用户和密码,或者你想用 自己的电脑做网站服务器,那么建议你根据以下的步骤,来创建一个数据库。这里仅针对本机数据库讲解,服务商的数据库服务步骤几乎一样。

* www.forwind.cn/phpmyadmin进入 phpmyadmin。域名可以改成刚才设置的IP。出现如下画面:

phpmyadmin(点击缩放)

* 点击 Create new database(创建数据库) ,添上数据库的名字,例如forwind。
* 回到主页面,点击 Privileges(权限) ,进入权限管理,创建数据库用户。点击 Add a user(增加一个用户) ,选中 Use text field(使用文本域) ,添上要添加的用户名,并填写一个尽量负责的密码。Global privileges(全局权限)一栏保持默认项即可。然后点击 Go(执行) 。
* 然后回到权限页,在刚刚创建的用户名旁边点击 Check privileges(检查权限) 图标,然后再选择刚刚创建的数据库 jiang_demo,phpMyadmin 会把你带到 Add privileges to the following database(为数据库添加权限) 页面, Check All(全选) ,然后执行。
* 到此为止,就完成了建立数据库的工作。

建立完数据库,不要忘记记录下你的 database, username, password 和 hostname。

安装wordpress

进入解压缩得到的 Wordpress 文件夹,用编辑器编辑wp-config-sample.php 文件,找到以下几行:

1. define(’DB_NAME’, ‘wordpress’); // The name of the database
2. define(’DB_USER’, ‘username’); // Your MySQL username
3. define(’DB_PASSWORD’, ‘password’); // …and password
4. define(’DB_HOST’, ‘localhost’); // 99% chance you won’t need to change this value

将之前我们配置好的数据库名,用户名,密码和数据库服务器(hostname)分别填上。然后输入http: //forwind.cn/wordpress/wp-admin/install,这里域名同样可以更换成IP,如果是本机,localhost也可 以。这样就开始安装了。安装完毕之后,可以通过http://www.forwind.cn/wp-admin/来进行管理。

这就是整个LAMP+wordpress的安装建立基本步骤,有关wordpress更深层次的应用,需要你自己去wordpress中文站挖掘。

转载原创文章请注明: 风雷的技术天地 [ http://www.forwind.cn]

本文链接: http://www.forwind.cn/2007/04/29/how-to-lamp-wordpress/


查阅全文»

0 评论:

2007年4月27日 星期五

终于完成了新站点的建立

在进行了将近一个星期的捣鼓之后,终于用wordpress把个人站点建立起来了。新站点的网址是www.forwind.cn,今后将是主力站点,希望各位订阅了这个站点的朋友订阅那里,当然,这里会一直保持同步更新的,呵呵

从开始写blog到现在,先后经历了bokee 网,sina以及现在同步更新的blogspot等阶段,还用上过google提供的googlepages作为主页,最后还是决心自己用wordpress建一个小站。真的是下了很大的决心,要知道bokee 网哪里已经到了12万的访问量,pagerank值长期稳定在4,一段时间甚至冲上了5……虽然很舍不得,但是不得不换,只有这样,网站的程序和数据库才都是属于自己的,页面风格才能由自己决定。只要这个世界还有空间在,我的小站就不会倒,而且一直不变---bloggers估计都猜到我啥意思了,前段时间 blogspot被封的……那叫一个伤心阿。
其实纯建站只用了一天时间,因为太简单了。只是寻找模板花了我很久,自己修改模板又花了很久,还让我通宵了一次,最后才改成这种目前来看还不错的清爽三栏界面。我比较喜欢便清爽的东西,不喜欢花里胡哨的。还花了很多时间找wp的插件,唉,确实是花了不少心血。因为这个站点属于技术空间,不是用来做什么 web2.0内容来吸引眼球的,所以故意找了一个清爽的模板并自己修改了一下,风格样式单调比较正常,个人不大喜欢花哨的,相对来说还是喜欢比较清爽的。但是毕竟是自己的想法,各位朋友如果有什么好的建议的话,希望能在留言板或者本文处留下评论,非常感谢。

另外,我所使用的空间是双线服务器,从目前反馈的情况来看,电信访问比较快,网通一般,校园网比较慢,这也是没有办法的事情,比较校园网很多是网通出口,而机房在南方,电信为主导。觉得比较慢的朋友,又需要看某篇文章的话,可以访问blogspot,那里是和这里同步更新的,校园网打开速度似乎快一点点。当然,大多数的互动讨论都将在这里进行,而googlepages将主要作为原创文章与软件仓库,也就是说,将来所有的工作重心都会放在这里了。

最后,新站开张,有很多不足,欢迎各位在留言簿中提出宝贵的意见,谢谢!

查阅全文»

0 评论:

2007年4月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岁的今天,终于大彻大悟。

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

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

人生若只如初见,多好。

查阅全文»

2 评论:

如何在英文环境下安装fcitx

当初为了使用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。

查阅全文»

0 评论:

2007年3月29日 星期四

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

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

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

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

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

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

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

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

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

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

不同时长的打盹:

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

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

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

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

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

查阅全文»

1 评论:

2007年3月28日 星期三

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

全世界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了。

查阅全文»

7 评论:

2007年3月23日 星期五

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

最近在为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程序,输入数据宽度也可调。有兴趣的朋友可以去看看。

查阅全文»

0 评论:

2007年3月22日 星期四

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

伟大的GFW再一次把我们的blogspot封杀了。一直没有想通,为什么同样的东西在国外畅通无阻,一到国内来就不得不改头换面甚至连生存空间都没有?wiki也好,blogspot也好,好的东西,我们都没有办法使用,或者至少是正常使用。GFW,您太有才了。

幸好我们广大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下实验成功的话,希望通知一声。

不过只要GFW存在一天,我们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的子域名可以没有限制的访问(内含GFW关键字的除外),嗯,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,GFW只是封杀了其中的一个IP地址,默认的那个,其他的还是好好的,所以可以用这种方法进行访问,但也取决于网站本身,比如vox.com之前还支持,后来其IP地址为“204.9.178.110”的服务器修改了设置,所以上方法就不能用了。以此类推,同志们还可以去Hack一下Technorati等等其他好的网站的其他服务器的IP地址,这样照着修改一下就能畅通无阻的访问了。

查阅全文»

2 评论:

2007年3月16日 星期五

linux文件体系介绍

在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 - 文档

查阅全文»

0 评论:

2007年3月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.

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

查阅全文»

5 评论:

2007年3月10日 星期六

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

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





















































































查阅全文»

3 评论:

2007年3月8日 星期四

Grub配置入门大宝库

这些资料来源于:
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.

查阅全文»

0 评论:

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

在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?或者也许是某些地方没有配置好?

查阅全文»

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 临走前带一些好吃的回西安

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

查阅全文»

4 评论:

2007年2月25日 星期日

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

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 可以在安装后建立交换分区,或者建立交换文件。

查阅全文»

0 评论:

2007年2月21日 星期三

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

你在用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启动即可。

启动后的引导界面如下:



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

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

查阅全文»

1 评论:

2007年2月18日 星期日

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

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




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

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

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

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



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



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



不到最后一刻,永不言弃



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



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



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



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

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

生日快乐,帮主。

查阅全文»

0 评论:

Linux下文件关联的实现原理

来自:http://blog.csdn.net/absurd/的文章,有助于开发相关软件时文件关联的实现机制参考,收录在这里。

我们知道在Windows下,双击一个可执行文件,文件管理器会自动运行这个应用程序。而双击一个数据文件时,文件管理器会用与之关联的应用程序打开它。数据文件与应用程序之间的关联是通过注册表来实现的:文件管理器查询注册表,找到数据文件对应的应用程序,然后运行这个应用程序,并把数据文件的文件名作为命令行参数传给它。

这种文件关联的方式非常好用,省去了先起动应用程序再打开文件的麻烦。Linux下的桌面环境也有类似的功能,而且实现方式更合理。最近负责开发一个资源管理器,本来GNOME有一个功能强大的资源管理器Nautilus,只是它过于庞大,不但有超过10万行的代码,还依赖于libgnome、gnome -vfs和CORBA等,故不适合于嵌入式应用。最终我们决定自己开发一个简化的资源管理器,但又要尽量兼容现有的应用程序,这要了解相关标准,文件关联方式是其中之一。把这几天学到的知识做个笔记吧,供有兴趣的朋友参考:

首先让我们看看文件关联要做些什么。

1. 数据文件与应用程序的关联。一个应用程序通常只能打开一些特定的数据文件,比如图片浏览工具可以打开PNG、BMP和JPEG等图片文件。打开一词的意义比较宽泛,这里包括:打开、播放、安装、编辑和打印等等。

2. 文件类型信息。资源管理器把数据文件列出来时,通常会用一个图标来标识这类文件,同时也会加上一个简短的名称,以便用户可以很容易把它与其它类型的文件区分开来。

下面我们看看linux下是如何实现的。

1. 判断文件类型。文件的数量是无限的,我们只能按文件类型来处理。如何判断一个文件所属的文件类型呢?可能有人会说,很简单,用扩展名区分就行了。没错,用扩展名可以做到,但这种方法有两个缺陷:一方面它不是很精确,相同扩展名的文件的类型可能完全不同,比如dat文件,可能是一个视频文件,也可能是一个普通数据文件。另一方面它不是很准确,扩展名可以任何改动,为了某种目的,完全可以把exe扩展名改为htm扩展名。

而且在Linux下扩展名只是一个可选项,很多文件根本没有扩展名,所以纯粹采用文件扩展名的方式来判断肯定是不行的。为了更好的判断文件类型,在 linux下同时采用两种方式:优先采用magic方式,其次才采用文件扩展名方式。所谓magic方式,就是根据文件内容来判断。绝大多数文件,内部都有一些特定的标记,这些标记称为magic,比如BMP图片文件以BM两个字符开头,BM就是一个magic。虽然即使采用了双保险机制也有误判的可能,但概率已经大大降低了。

2. 文件类型的表示。

文件类型如何表示呢?我们说JPEG是图片文件,说txt是文本文件,WML是XML文件。这种分类很直观,但也有几个问题:对JPEG文件来说,称它图片文件太笼统了。有的图片浏览工具虽然能够打开大部分图片文件,但不一定能打开所有图片文件,它需要更详细的文件类型信息。对txt和WML来说,它们其实都是文本文件,有的编辑器可能以同样的方式处理它们。为了避免分类太细或者太粗,linux采用了MIME(可以参考相关RFC)规范,它用一种层次型的方式来分类,如:

JPEG文件:image/jpeg

文本文件:text/plain

XML文件:text/xml

这种分类方式就可以粗细兼顾了。

3. 文件类型的数据信息。

在linux下,关于文件类型的信息通常放在/usr/share/mime、/usr/local/share/mime和用户目录下,所有应用程序可以共享这些信息。在该目录下,一般会有以下这些文件:

l aliases:文件类型的别名。比如application/pdf 有时也称为application/x-pdf 。

l magic:各种文件的内部标识,用于从文件内容来判断文件类型。如BMP图片文件以BM开头。

l globs:扩展名与文件类型的对应关系。如*.cpp文件是text/x-c++src类型的。

l packages目录:用于安装新文件类型用。

l 其它子目录及其下的文件:更详细的描述各种文件类型。比如image下的jpeg.xml文件描述了jpeg文件类型。为了方便国际化,这些描述信息有各种语言版本。

4. 图标文件与数据文件的关联。

在资源管理器中,通常用不同的图标来区分不同的文件类型。同时图标也是桌面主题相关的,主题不同,图标的大小和外观也不一样。图标文件通常存放在/usr/share/icons/主题/大小/mimetypes目录下。

文件类型与图标文件的对应关系是通过文件名来实现的。比如,JPEG文件对应的图标文件为gnome-mime-image-jpeg.png。

(这块不是很确定,有待进一步研究)


5. 应用程序与数据文件的关联。

应用程序与数据文件的关联是通过.desktop文件来实现的。应用程序要出现在开始菜单中或者桌面上,它要提供一个desktop文件才行。应用程序安装之后,desktop文件通常安装到/usr/share/applications下。

可以在desktop文件中,指明其可以操作的文件类型。如,软件包安装程序可以操作rpm文件,它的desktop文件(system-install-packages.desktop)内容为:

[Desktop Entry]

Name=Install Packages

GenericName=Install Packages

Comment=Install new packages on the system

MimeType=application/x-rpm;

Exec=/usr/bin/system-install-packages %F

Terminal=false

Type=Application

Icon=system-config-packages.png

Encoding=UTF-8

NoDisplay=true

MimeType项指明它可以操作rpm类型的文件。


Linux比windows的做法科学之处。

1. Linux采用了双保险机制,对文件类型的判断更正确,出错的概率更小。

2. Linux分离文件类型判断信息和文件关联方式,这样文件类型信息可以被重用。比如file命令可以用这些信息来判断文件类型,而不必打开它。


参考资料:

http://standards.freedesktop.org ... info-spec-0.13.html

http://www.freedesktop.org/wiki/Standards_2fAddingMIMETutor

查阅全文»

0 评论:

2007年2月16日 星期五

寒假听歌推荐榜单,just english,都不是新歌

进入寒假,在一天的某些时候,总是我的电脑及mp3和我相伴,所以,从网上找歌,然后下载到mp3中试听,好听的留下,不好听的go out,哇卡卡,还真让我找到不少好听的歌。我找的素材基本都是来自billboard单曲2006TOP100,恩,总之就是高品质的拉。下面介绍几首特别棒的,推荐大家下下来听一下。

首先推荐单曲《What Hurts The Most》,来自 Rascal Flatts 06年4月发行的第四张专辑《Me & My Gang》,和很多美国当代乡村组合一样,Rascal Flatts的音乐中并没有传统乡村音乐的感觉,使用的传统乡村乐器也并不是很多,甚至有很多老牌乡村音乐人还批评Rascal Flatts的音乐太过流行化,就连组合成员Jay DeMarcus也笑称Rascal Flatts其实就是当代乡村音乐届的后街男孩(Backstreet Boys)和超级男孩(N Sync)。



当然,我就是喜欢这种乡村感觉的流行乐。一开始的旋律就非常伤感,吸引人听下去。歌手的声音很柔和,配合歌词,给人很棒的感觉,很有失恋的味道。

歌词请看这里

接下来的一首歌叫做so sick,来自有“R&B神童”之称的美国创作型男歌手Ne-Yo。



Ne -Yo在Def Jam发行的首张个人专辑《In My Own Words》一经发行就在Billboard 200专辑榜中成功登顶,而主打单曲《So Sick》随后也已经夺得了Billboard Hot 100单曲榜的冠军,刚刚发行首张个人专辑的Ne-Yo便已经成为美国榜的双冠王。
So Sick这首歌曲调非常轻快,不过是以轻快的旋律表达......自己的思恋,自己对爱人的那种回忆。

歌词请见这里

第三首,来自Nickelback的Photograph。

在沉寂了两年之后,加拿大最受欢迎的乐队之一Nickelback发行了乐队的第五张专辑《All the Right Reasons》。而已经十分沉稳老练的Nickelback依靠此前两张专辑打下的江山,使得这张新作在发行的第一周就获得了31万7千张的高销量,以较大优势领先第二名轻松获得 Billboard 200专辑榜的桂冠,同时也是近几周专辑榜的冠军专辑首次销量突破30万张。



Photograph是一首相当棒的,我强烈推荐的,朗朗上口的,深情感人的,恋旧歌曲。
I miss that town
I miss their faces
You can't erase
You can't replace it

I miss it now
I can't belive it
So hard to stay
So hard to leave it

wow,想起我当初离开家乡的感觉......摇滚味道的歌曲。再说一次,强烈推荐

顺便多说一句,Nickelback有好几首歌都好听,比如saving me,far away。

接下来是:Daniel Powter隆重登场!



Daniel Powter 生长在加拿大英属哥伦比亚省的奥克纳根地区,自幼酷爱音乐,学习拉小提琴。他这种异于其他同龄小孩的行为使得他在学校处处受孤立,于是他把所有的热情都倾注到了音乐之中,为后来选择音乐道路打下了伏笔。与一些美国和加拿大的偶像艺人一鸣惊人的星路历程不同,Daniel 的不懈努力在 15 年后才终于结出硕果。他苦涩的奋斗过程充满了辛酸,勤勉地创作,演奏音乐,四处奔波联系唱片公司,不停地吃闭门羹。Daniel 自己说道,“我总是往唱片公司跑,感觉就像是奇渴难当的我被带到了某个水源却被禁止饮水。”他又补充道,“但我想我已经到达那里了,基本上我所要做的就是等待,认输只是一种极不成熟的处理方式。”

Daniel 的坚忍和顽强使他迈向了成功之路。去年可口可乐选中他的歌曲“Bad Day”作为一个为期两周的广告活动的宣传曲目,此后这首歌曲便攀升上了欧洲的排行榜,随后在他的祖国加拿大也开始走红。

他的处女专辑dp中,有两首歌我非常喜欢,一首是bad day。主打单曲“Bad Day”是一首舒心的流行作品,简约的钢琴伴奏缓缓飘入耳际,Daniel 清新高亢的歌声不时穿插着假声转换,显得具有力度而又不失流畅感。这是一首,恩,恩,励志歌曲?也许吧,可以这样看。心情低落的时候听听,真的可能会好起来哦。另一首是Free Loop。如何形容Free Loop呢,我个人觉得,这是一首简单,干净,让你听到之后绝对会爱上的歌曲。浪漫,情调,轻快,自由,有点哀伤的歌曲。

根据一个品歌的朋友blog上所说,Bad Day的MV拍得非常有意思,描述一对相隔咫尺、却一直素不相识的男女,在各自生活里或喜或悲,并最终因为个性深处的契合而走近彼此的故事,特别是里面男女主角在同一广告板上涂鸦的情节显得非常真切动人……而它又不仅仅是一出“向左走,向右走”的爱情小品,歌曲背地里折射出来的现代人的生活观,则是可以使之意味悠长的原因所在。

如果爱情是谁的劫难,那我们永可不必相交。但若爱情是我们的转机,我们又可轻易让它溜走?

歌词在这里:bad dayFree Loop

然后是一首相对较老的歌。当初bx星际站队的一个队友(slassi)制作站队官方视频的时候,就是以这首歌作为背景音乐,当时听到之后,一听钟情。我听的是D.H.T的版本,后来找原版Roxette的听了一下,觉得不如D.H.T,但有的朋友就喜欢Roxette,这个看个人感觉吧。



歌词在这里

接下来是什么歌呢?来自James Blunt,You're Beautiful。



在2005年的英国乐坛里,出现了一位充满传奇性的音乐人,和一张专辑及一首单曲。这位今年在英国乐坛,让大家惊艳不已的歌手就是上尉诗人 James Blunt,和他的英国冠军专辑《Back to Bedlam》及冠军单曲 You are Beautiful。截至目前为止 James Blunt 的专辑已经蝉连英国金榜专辑榜冠军5周,同时也在单曲上蝉连4周冠军,因此更创下专辑及单曲双榜连续冠军4周的纪录。

James Blunt的嗓子很有特色,略带沙哑,却极富感情,非常独特,令人回味,让我想起了Bryan Adams。第一次听You're Beautiful的时候,觉得一般,后来听一次,就增加一份喜欢。有人说这首歌是他写给科索沃的,这个我无从考证,但是歌词中,表现出那种感动的音符,让你的心灵为那份极度珍惜却无法得到的感情而揪动,充斥着淡淡的忧伤,真的让人感伤。

生活歌手。最贴近生活的歌手。

歌词见这里

过年前继续更新。接下来的歌来自The All-American Rejects团队,名字叫swing,swing



这首歌是在西安音乐台中听到的,之后立马上网下载,当时听得比较少,回家后细细品尝,发现很有味道的,歌的种类有点像陈小春以前的歌,什么我没那种命阿这种,但是曲调比较轻快,是那种“无奈”的诉苦。其实这个乐队名字虽然是The All-American Reject,但是好多歌都感觉蛮追求流行的,是么,这年头,生存之上,呵呵。

歌词见此

接下来,将连续介绍一个人的歌,这就是来自大名鼎鼎的联合公园的主唱:mike的歌曲。具体联合公园最终是否解散现在还不是很清楚,但是mike单独以Fort Minor / 黑暗堡垒为名推出的专辑,确实是相当相当棒。什么,你说你不知道联合公园?拜托,就是林肯公园么。林肯公园你也不知道?好吧,算我没说,别扔臭鸡蛋就行......



其中一首歌,是NBA 2006里面的一首主题曲,NBA2005-2006季后赛精彩镜头官方回顾视频配乐,同时还是PLU2006的主题曲,很多游戏站队的宣传片背景音乐都选它,这首歌就是------Remember the Name。

我打赌,喜欢游戏的朋友绝对不会对这首歌陌生。很有气势,振奋人心,适合于比赛之前的激励。其实从歌词中就可以看出来,这首歌很有美国街头那种张扬的风格,我可不是单纯指街头篮球,但是街头篮球确实可以最好体现其精神。舍我其谁,俾倪天下的感觉,很爽。超赞的一首说唱!歌词见此

下一首是同样来自FM的Believe Me。我个人感觉和上一首的风格比较类似,节拍很强烈,所不同的是带有一点拉丁的味道,很适合心情低落的时候听听。歌词见此

还有一首Where'd You Go,billboard top100的歌,感觉比较伤感,不适合现在的氛围,呵呵,就不详细推荐了,有兴趣的自己下下来听一听。

to be continue......

查阅全文»

5 评论:

AMD/Ati驱动,终于被你感动

据新闻报道,AMD/Ati终于开始了和Nvidia的驱动竞争。所有深受其害的,郁闷至极的,等到花儿也谢了的linux及Ati显卡的用户们,俺们要熬出头了。新闻内容是这样的:

Vista系统推出后,AMD(ATi)和Nvidia在新系统驱动方面的竞争也随之开始,一向以驱动见长的Nvidia此次有些落后,而AMD在初享成功喜悦之后再接再厉,为我们竭力展示Catalyst的光明"远景"。

日前在PC Perspective网站上Catalyst制作人Terry Makedon揭示了一些AMD Vista驱动未来的开发情况。

首先继Cat 7.1在1月31日发布后,2月份将发布7.2版的Catalyst驱动,该版本将提供显著的OpenGL性能优化,并解决一些初期驱动的性能问题。我们还将7.2中看到新的Catalyst软件安装程序。

3月发布7.3,7.3将支持在OpenGL下开启Crossfire交火功能,同时OGL性能还将进一步优化。该驱动还将引入对64bit的Windows Vista的蓝光和HD-DVD支持。

4月将发布Cat 7.4,同时还有Linux版本的Catalyst控制中心。

5月是7.5版本,最大的亮点是增加了全新的MSAA自适应AA功能,该功能将使得Catalyst的AA选项接近或者超过Nvidia当前G80驱动的同类功能。该功能目前只是初步设置了时间表,但AMD还不能确定具体时间。

恩,4月,不远了,呵呵。早就受够了每次装新系统或者重装就要输入一大堆命令步骤,自己去下载一堆东西编译,捣鼓半天之后还不一定成功的那种郁闷,虽然口上不服输,但是心里面还是挺羡慕Nv那些用户的。现在?嘿嘿,正应了那句话:

翻身农奴要做主人了!

查阅全文»

0 评论:

2007年2月14日 星期三

总结自己编译内核的步骤

如果下面的步骤都注意并执行了,编译内核不是很复杂的事情,我第一次编译就成功了。编译过程如下,与各位分享:

1、修改ubuntu 6.10上的/bin/sh
在ubuntu6.10上,/bin/sh默认是链接到/bin/dash的,当你从源代码编译软件的时候,dash可能会导致一些错误,至少我遇到过 类似问题,因此,我把/bin/sh的连接改为了/bin/bash。(估计中国绝大部分使用者都是用的bash吧)
如果你使用的就是6.10,那么应该这样做:

rm -f /bin/sh

ln -s /bin/bash /bin/sh


2、安装相关的软件,包括
a、Ubuntu Dapper Drake 6.06 LTS 首选“软件”,自己想办法安装吧
b、build-essential,里面有gcc,make等东西要用到。
c. kernel-package,里面有make-kpkg要用。
d. qt库,主要是为了用make xconfig图形界面配置,你要安装libqt3-headers,libqt3-mt-dev等
e. libncurses5-dev,主要是用make menuconfig,我就用这个。
f. gtk库,用于make gconfig。安装gtk2.0,相关lib。

3、到www.kernel.org下载当前最新版的源代码。下载的分类有p,f等区别,要下f类型的连接,不要下补丁。下好的源代码应该有40多M。然后解压缩源代码。

tar xjvf linux-2.6.20.tar.bz2 -C /usr/src/linux-2.6.20

cd /usr/src/linux-2.6.20


4、如果需要给内核源代码打补丁,首先下载相对应的补丁,在这里我们以patch.bz2代替。将其放到/usr/src目录下,然后用下来的命令来使其生效:

bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run

bzip2 -dc /usr/src/patch.bz2 | patch -p1

注意!此时,你应该一直处于/usr/src/linux-2.6.20目录下。

第一个命令仅仅是试验性质的,它并不会对你的源代码产生什么变动。如果没有产生什么错误信息,你才能用第二个命令来对源代码产生真正的修补动作,如果第一条指令就出错了,请别继续执行下去,看看错误出在哪里。

同样,你也可以向你的内核提供预补丁,例如,一旦你发现有一个自己需要的特性在2.6.19 rc4中提供,但这个版本的内核并没有发行所有的完整源代码,只有patch-2.6.19-rc4.bz2是可选的。于是,你就可以提供这个patch 到2.6.18的内核中,但不是2.6.8.1,或者2.6.8.2。

5、创建一个指向新内核代码的符号链接

sudo ln -s /usr/src/linux-2.6.16ck12 linux

然后进入这个目录:

cd /usr/src/linux

6、运行命令 make mrproper 来清一下包。

7、可以用现有的配置文件作为新内核配置文件的基础,先复制已经存在的配置文件到/usr/src/linux目录中

cp /boot/config-`uname -r` ./.config

然后运行

sudo make menuconfig或者sudo make xconfig

如果希望自己配置,那么就在这里面详细选。对选项如何选择不熟悉的,请参考这篇文章。看不懂中文?参考这里

下面补充一些内容,只说几个这篇文章中没有提到的。

Bus options (PCI, PCMCIA, EISA, MCA, ISA)
PCI support
PCI Express support 老式机器没有PCI-E设备的可以选N
ISA support 较新的新机器没有ISA设备,可以选N
MCA support 一般选N
NatSemi SCx200 support 一般选N
PCI Hotplug Support
Support for PCI Hotplug (EXPERIMENTAL) 如果没有PCI热插拔设备,选N
这里的选项都要全部编译进内核,而不是以模块形式存在。

Device Drivers
Block devices
Packet writing on CD/DVD media
Enable write caching (EXPERIMENTAL) 如果你有刻录机,想启用写缓存功能,选Y

ATA/ATAPI/MFM/RLL support
Include IDE/ATA-2 DISK support 如果你的/boot是放在IDE硬盘上,那么这里一定要选Y,选M都不行。否则启动时会出现“waiting for root file system”的提示而停滞不前。
SCSI device support 如果有SATA硬盘,就选Y
SCSI disk support 如果你的/boot放在SATA硬盘上,一定要选Y。
Character devices
I2C support 一般可以选Y或者M
Graphics support 不建议把显卡驱动编译进内核。,选M,编译成模块方便日后升级驱动。

File systems
CD-ROM/DVD Filesystems
ISO 9660 CDROM file system support 一般选Y
DOS/FAT/NT Filesystems
VFAT (Windows-95) fs support 有FAT32分区就选Y吧
NTFS file system support 有NTFS分区就选Y吧
NTFS write support 如果想对 NTFS分区进行写操作,选Y
Native Language Support
Simplified Chinese charset (CP936, GB2312) 选Y或者M使读取FAT分区不会遇到中文乱码现象
必须将启动盘的文件系统编译进内核,默认是编译成模块,这样无法启动系统。最好是把硬盘上所有用到的分区文件系统全部编译进内核。

设置完,保存即可。

8、接下来,就开始构建内核了。首先清理一下东西:

sudo make-kpkg clean

然后

sudo make-kpkg -initrd --revision=lk_517 kernel_image kernel_headers modules_image

lk_517是可以自己换得,表示镜像的名字,必须要以数字结尾。最后是生成镜像包和头文件包。你也可以用binary代替,它融合了image.headers.doc.source,是最完整的包。

make-kpkg是一个可以自动替换"make dep;make clean;make bzImage;make modules"命令序列的脚本。而最其最常用的两个参数就是--append-to-version与--revision。
--append-to-version这个选项可以让我们来指定一个额外的内核版本,这个可以成为内核名的一问分。我们可以使用数字,"+",",", 但是不要使用下划线。要避免设置--append-to-version为如"-686","-K7","-sparc"等值,因为这些值常为Debian的预编译内核所使用。

内核模块位于/lib/modules子目录下。每一个内核有他自己的子目录。每次当我们以一个新的名字来安装一个新的内核时,这个包安装程序就会在/lib/modules目录下创建一个新的子目录来保存他自己的模块。这就意味着每一次我们使用--append-to-version的一个新的值来编译一个内核时,我们就可以保证这个内核有一个新的名字,而他的模块也不会与其他的内核模块相冲突。

注意:如果我们使用相同的名字来安装一个内核时,安装程序就会覆盖掉已安装的内核及其模块。--revision只会影响Debian软件包本身的名字而不是内核的名字。与--append-to-version相似,我们只可以使用数,"+ ",".",不要使用下划线"_"。如果我们并没有为--revision指定一个值,make-kpkg就会使用"10.00.Custom".使用不同的--revision的值就可以避免相同名字的内核之间的冲突。


9、在内核构建成功之后,你能在/usr/src目录下看见三个.deb文件。其中包括linux-image-2.6.20- custom_2.6.20-custom-10.00.Custom_i386.deb (包含真实内核) and linux-headers-2.6.20-custom_2.6.20-custom-10.00.Custom_i386.deb (包含那些编译附加内核模块所需要的文件)。

kernel-image文件的名字格式如下:

kernel-image-(kernel-version)(--append-to-version)_(--revision)_(architecture).deb

我用这种办法安装:

sudo dpkg -i xxx.deb

你甚至可以将这两个deb包转移到其他的ubuntu系统中,并用相同的办法安装它们。这意味着,你不再需要再一次编译它们了。

10、好了,现在,你可以检查一下你的menu.lst文件,多了两个与新内核有关的部分。现在,重新启动计算机,shutdown -r。如果一切顺利的话,重新启动之后,你使用的就是新的内核了。你可以通过 " uname -r"命令来看看目前的内核版本。

这下就算彻底完成了。重新启动计算机,在GRUB中选择新内核启动。如果启动失败,当你看见屏幕上出现 "Press ESC to enter the menu...1"这行字的时候,按下ESC,此时会进入grub的启动菜单,好,选择你的旧版内核,启动系统。现在,你不得不重新编译一次内核,使其能 够正常使用。编译之前别忘了,从menu.lst中去除之前的两个不能正常工作的内核区域。

查阅全文»

0 评论:

从生与死想到的

看着姥爷的遗体被运进火化台的画面,一直不愿意相信,一个活人,最后出来的是一堆骨头。一把扫帚在上面刷阿刷的,骨灰盒就在下面,工作人员将大骨头扫进去,再将骨灰扫到上面,一铺,一盖,一拿,一埋。这就是人的归宿。

当人真正感受到死亡的时候,坚强如姥爷的人,也会害怕电视发出的蓝光,害怕黑暗,害怕死亡。人家说人越老,求生欲望越强,真是不假。但是无论你求生欲望再强,还是逃不出阎王爷的手掌心。也许你能拖过三更,拖过五更,但是,你却拖不过那张生死令。人的一生就是这样,出来,活着,进去。纵使你多么辉煌,多么富有,多么崇高,抑或是多么伟大。最终还是归于尘土。历史的纪录?who knows?who cares?对不起,你已经死了。

每次回家去看姥爷姥姥的时候,进到姥爷的屋子里,听着他的山西腔问我问题,用他那饱经战火的大手摸我,到现在,还在脑海里,没有散去。听起妈妈讲您以前的事情,更觉得自己喜欢您的性格,坚强的,正直的,不屈的性格。也许只有我,才会如此喜欢您的性格吧。

去给姥爷烧三期的时候,妈妈让我说几句话,我愣了半天,面对面前这个我最敬佩的姥爷,的墓碑,愣是没有憋出来,就只能听妈妈在旁边自言自语。我本来想告诉姥爷,你想看到我的两个事情,都没有看到。都怪我,国庆的时候还比较犹豫,思前顾后,结果错过了让你看到其中一样的机会。现在想起来真的好悔。当我们一起拿着香帮你烧的时候,墓前人依旧,泉下有谁知。

其实亲身感受一下死亡,还是有好处,一下子觉得人一辈子一定要好好活,因为有了人生短暂的紧迫感,从而会对自己的行为更负责任,对自己的人生更负责任。想想过去,断断续续的幸福,间或出现的痛苦,我用记忆去扫过那天真的童年,幸福的少年,迷茫但略有小成的青年,难忘的画面犹如蜻蜓点水般在脑海中放映,猛然发觉,不经意间,时光已经走过了20余年。再过3,4个20年,或许更短,我就将面临这种命运。也就是说,我已经走完了人生的1/4弱了。现在的我,应该清楚什么是幸福,什么是值得去追求的东西,值得去努力的东西。其实人这一辈子的追求不外乎这几个要素:健康,快乐,亲情,友情,恋情。什么功名,权力,金钱,想一想,都是虚的。所以,我会一直努力保持快乐,珍惜亲情,善待友情,努力健康,并且,追求最适合自己的恋情。坚定自己的选择,走下去,不用在意别人的看法,follow my heart。也只有这样,当我面临死亡的时候,我才不会有什么遗憾。

查阅全文»

0 评论:

2007年2月5日 星期一

用partimage备份你的linux系统

partimage是一个Linux/UNIX下的,用于将各种分区以不同格式保存成镜像文件的工具。所生成的镜像文件能够以GZIP/BZIP2的格式压缩,用以节省磁盘空间。同时,该工具还支持将镜像分割成许多个小块,来方便用可移动存储器的拷贝(例如ZIP)。从0.6.0版本开始,partimage加入了通过网络保存分区的功能支持。下面是这个软件的使用指南。

当然,当使用软件的时候,准备操作的分区必须首先被卸载(unmounted)。(风雷友情提示,想卸载分区,如果直接卸载不行的话,必须进入单用户模式,因为你不能让所需要处理的分区(例如home)中的任何文件处于打开状态。如何进入呢?用init1。具体资料请google或者留言询问)
partimage在以下情况下将起很好的作用:首先,当某个分区出现诸如感染病毒,文件系统错误等问题的时候,你可以轻松恢复分区的资料,让问题不会对你产生什么烦扰,只需要大约10分钟的时间,一个原始状态的分区就将呈现在你面前。如果害怕镜像占用硬盘空间的话,你可以把镜像烧录到一张CD-R刻录碟中。另外,它在为很多台相同配置的电脑安装系统时也能有很大的作用。例如,假设你购买了50台电脑,配置完全一样,然后你希望在这50台电脑上都安装linux系统,那么,partimage将大大为你节省时间。你可以首先在某台电脑上安装系统,然后为其创建一个镜像,然后通过partimage的恢复功能,在另外49台机器上将系统恢复上去。
partimage支持以下文件系统:ext2fs/ext3fs,Reiser3,FAT16/32,NTFS,HPFS,JFS,XFS,UFS(beta),HFS(beta)。
好,接下来就介绍这个软件的用法:
首先,我们要安装partimage在系统中。对于ubuntu用户而言,使用的命令是
sudo apt-get install partimage
对于debian用户,安装命令是
#apt-get install partimage
在启动程序之前,你要先检查以下,能够操作的分区有哪些:
sudo fdisk -l(for ubuntu) or #fdisk -l(for debian)
然后启动partimage程序:
sudo partimage(for ubuntu) or #partimage(for debian)
一旦程序打开,你会看到类似于这样的界面:



通过上下箭头按键来选择你需要备份的分区。

然后,在“Image file to create/use”这里输入你要存放镜像文件的路径和名称。在这个例子中,由于我挂载了backup分区到backup目录上,因此,我的路径名必须是/backup/serverbackup,而不是简单的serverbackup(简单的backup会把文件放到/分区,而如果你要备份的是/分区......呵呵)。接下来要做的,就是把分区保存到备份的新镜像中拉。

在下一个屏幕中,如果你希望备份速度快一些,可以选择不压缩的备份,只有在你外接存储器或者用于存放备份文件的分区空间比较紧张,可能无法容纳你所备份的分区内容的时候,才使用Gzip或者Bzip2选项来压缩备份文件。



好,这时候请注意,分区中只有使用的内容才会被备份。例如,如果你的分区是100GB,但是只使用了其中的10GB,那么备份的镜像文件也将只有10GB。

接下来,按F5进入下一屏。在这里,你需要输入保存分区的描述,也就是起个名字:



partimage会花一小段时间来检查分区数据,然后生成一个大致情况的总结汇报。看完之后按下回车就行了:



好,现在,软件将开始备份分区到你所设定的镜像文件中,你可以从下面的屏幕中看到备份进度:



当你看到下面的画面时,表示备份结束:



此时,就可以回到终端中了。

好,看完如何备份分区,接下来让我们来看一看,如何恢复一个分区。首先,用和上面一样的方法来启动partimage,然后你会看到下面这样的屏幕。



在这里,你需要选择恢复的分区,恢复所用的镜像文件,在这个例子中,我的备份文件是serverbackup.000。一般来说,如果你指定了后缀名img,那么备份文件将以后缀img形式存在,否则,它默认是以000为后缀名。接下来,选择”restore partition from an image file“选项,然后进入下一屏:



简单回车即可。然后你会看到下面这个屏幕:



你需要注意的选项,就是“Erase free blocks with zero values”,如果这个选项被选中,所有未被使用的空间都被填充为0,也就是说,这个分区以前的数据将不复存在(有点像硬盘修复工具中的“填零”选项)。如果这个选项没有被选中,那么,未被恢复的区域中,原来的数据依然存在,你也可以去访问(可能会遇到一些困难,因为可访问性只是理论上的而已,当然,可以使用dd程序来读取这些老数据)。好了,接下来按下F5,进入下一屏:



用于恢复的分区必须和保存的分区大小相同,如果分区比原分区小,那么操作将不能继续进行。如果分区比原分区大,那么未被使用的部分就会被浪费,换句话说,就是会丢失空间。好,这时候,检查一下概况:



然后对镜像文件的名称进行确认:



然后就是恢复的进度指示:



现在,我们就成功完成了从一个备份镜像中恢复分区的操作,怎么样,比较简单吧?你自己也可以试一试哦。come on。

原文:http://www.debianadmin.com/backup-and-restore-linux-partitions-using-partimage.html
翻译者:http://likunarmstrong.googlepages.com/


查阅全文»

0 评论: