﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-TimeLord-文章分类-Linux</title><link>http://www.cnitblog.com/libocumt/category/6251.html</link><description>有志者，事竟成，卧薪尝胆，百二秦关终属楚； 苦心人，天不负，破斧沉舟， 三千越甲可吞吴！</description><language>zh-cn</language><lastBuildDate>Fri, 07 Oct 2011 18:22:12 GMT</lastBuildDate><pubDate>Fri, 07 Oct 2011 18:22:12 GMT</pubDate><ttl>60</ttl><item><title>Linux目录概要</title><link>http://www.cnitblog.com/libocumt/articles/44558.html</link><dc:creator>TimeLord</dc:creator><author>TimeLord</author><pubDate>Thu, 29 May 2008 09:56:00 GMT</pubDate><guid>http://www.cnitblog.com/libocumt/articles/44558.html</guid><description><![CDATA[目录树可以分为小的部分，每个部分可以在自己的磁盘或分区上。主要部分是根、/usr&nbsp;、/var&nbsp;和&nbsp;/home&nbsp;文件系统。每个部分有不同的目的。 <br><br>每台机器都有根文件系统，它包含系统引导和使其他文件系统得以mount所必要的文件，根文件系统应该有单用户状态所必须的足够的内容。还应该包括修复损坏系统、恢复备份等的工具。&nbsp; <br><br>/usr&nbsp;文件系统包含所有命令、库、man页和其他一般操作中所需的不改变的文件。&nbsp;/usr&nbsp;不应该有一般使用中要修改的文件。这样允许此文件系统中的文件通过网络共享，这样可以更有效，因为这样节省了磁盘空间(/usr&nbsp;很容易是数百兆)，且易于管理(当升级应用时，只有主/usr&nbsp;需要改变，而无须改变每台机器)&nbsp;即使此文件系统在本地盘上，也可以只读mount，以减少系统崩溃时文件系统的损坏。&nbsp; <br><br>/var&nbsp;文件系统包含会改变的文件，比如spool目录(mail、news、打印机等用的)，&nbsp;log文件、formatted&nbsp;manual&nbsp;pages和暂存文件。传统上/var&nbsp;的所有东西曾在&nbsp;/usr&nbsp;下的某个地方，但这样/usr&nbsp;就不可能只读安装了。&nbsp; <br><br>/home&nbsp;文件系统包含用户家目录，即系统上的所有实际数据。一个大的/home&nbsp;可能要分为若干文件系统，需要在/home&nbsp;下加一级名字，如/home/students&nbsp;、/home/staff&nbsp;等。&nbsp; <br><br>虽然上面将不同的部分称为文件系统，但它们不必是真的分离的文件系统。如果系统是小的单用户系统，而用户希望简单化，可以很容易地放在一个文件系统中。根据磁盘容量和不同目的所需分配的空间，目录树也可以分到不同的文件系统中。重要的是使用标准的名字，即使/var&nbsp;和/usr&nbsp;在同一分区上，名字/usr/lib/libc.a&nbsp;和/var/adm/messages&nbsp;必须能工作，例如将/var&nbsp;下的文件移动到/usr/var&nbsp;，并将/var&nbsp;作为/usr/var&nbsp;的符号连接。&nbsp; <br><br>Unix文件结构根据目的来分组文件，即所有的命令在一个地方，所有的数据在另一个地方，所有的文档又在一个地方，等等。另一个方法是根据属于的程序分组文件，即所有Emacs文件在一个目录中，所有TeX文件在另一个中，等等。后一种方法的问题是文件难于共享(程序目录经常同时包含静态可共享的和动态不可共享的文件)，有时难于查找&nbsp;(例如man页在极大数量的地方，使man程序查找它们极其困难)。&nbsp; <br><br>根文件系统 <br>根文件系统一般应该比较小，因为包括严格的文件和一个小的不经常改变的文件系统不容易损坏。损坏的根文件系统一般意味着除非用特定的方法(例如从软盘)系统无法引导。&nbsp; <br><br>根目录一般不含任何文件，除了可能的标准的系统引导映象，通常叫/vmlinuz&nbsp;。所有其他文件在根文件系统的子目录中。&nbsp; <br><br>/bin&nbsp;&nbsp; <br>引导启动所需的命令或普通用户可能用的命令(可能在引导启动后)。&nbsp; <br>/sbin&nbsp;&nbsp; <br>类似/bin&nbsp;，但不给普通用户使用，虽然如果必要且允许时可以使用。&nbsp; <br>/etc&nbsp;&nbsp; <br>特定机器的配置文件。&nbsp; <br>/root&nbsp;&nbsp; <br>root用户的家目录。&nbsp; <br>/lib&nbsp;&nbsp; <br>根文件系统上的程序所需的共享库。&nbsp; <br>/lib/modules&nbsp;&nbsp; <br>核心可加载模块，特别是那些恢复损坏系统时引导所需的(例如网络和文件系统驱动)。&nbsp; <br>/dev&nbsp;&nbsp; <br>设备文件。&nbsp; <br>/tmp&nbsp;&nbsp; <br>临时文件。引导启动后运行的程序应该使用/var/tmp&nbsp;，而不是/tmp&nbsp;，因为前者可能在一个拥有更多空间的磁盘上。&nbsp; <br>/boot&nbsp;&nbsp; <br>引导加载器(bootstrap&nbsp;loader)使用的文件，如LILO。核心映象也经常在这里，而不是在根目录。如果有许多核心映象，这个目录可能变得很大，这时可能使用单独的文件系统更好。另一个理由是要确保核心映象必须在IDE硬盘的前1024柱面内。&nbsp; <br>/mnt&nbsp;&nbsp; <br>系统管理员临时mount的安装点。程序并不自动支持安装到/mnt&nbsp;。&nbsp;/mnt&nbsp;可以分为子目录(例如/mnt/dosa&nbsp;&nbsp;可能是使用MSDOS文件系统的软驱，而/mnt/exta&nbsp;可能是使用ext2文件系统的软驱)。&nbsp; <br>/proc&nbsp;,&nbsp;/usr&nbsp;,&nbsp;/var&nbsp;,&nbsp;/home&nbsp;&nbsp; <br>其他文件系统的安装点。&nbsp; <br><br><br><br>/etc目录 <br>/etc&nbsp;目录包含很多文件。许多网络配置文件也在/etc&nbsp;中。&nbsp; <br><br>/etc/rc&nbsp;&nbsp;or&nbsp;/etc/rc.d&nbsp;&nbsp;or&nbsp;/etc/rc*.d&nbsp;&nbsp; <br>启动、或改变运行级时运行的scripts或scripts的目录。&nbsp; <br><br>/etc/passwd&nbsp;&nbsp; <br>用户数据库，其中的域给出了用户名、真实姓名、家目录、加密的口令和用户的其他信息。&nbsp; <br><br>/etc/fdprm&nbsp;&nbsp; <br>软盘参数表。说明不同的软盘格式。用setfdprm&nbsp;设置。 <br><br>/etc/fstab&nbsp;&nbsp; <br>启动时mount&nbsp;-a命令(在/etc/rc&nbsp;或等效的启动文件中)自动mount的文件系统列表。&nbsp;Linux下，也包括用swapon&nbsp;-a启用的swap区的信息。 <br><br>/etc/group&nbsp;&nbsp; <br>类似/etc/passwd&nbsp;，但说明的不是用户而是组。&nbsp; <br><br>/etc/inittab&nbsp;&nbsp; <br>init&nbsp;的配置文件。&nbsp; <br><br>/etc/issue&nbsp;&nbsp; <br>getty&nbsp;在登录提示符前的输出信息。通常包括系统的一段短说明或欢迎信息。内容由系统管理员确定。&nbsp; <br><br>/etc/magic&nbsp;&nbsp; <br>file&nbsp;的配置文件。包含不同文件格式的说明，file&nbsp;基于它猜测文件类型。 <br><br>/etc/motd&nbsp;&nbsp; <br>Message&nbsp;Of&nbsp;The&nbsp;Day，成功登录后自动输出。内容由系统管理员确定。经常用于通告信息，如计划关机时间的警告。&nbsp; <br><br>/etc/mtab&nbsp;&nbsp; <br>当前安装的文件系统列表。由scripts初始化，并由mount&nbsp;命令自动更新。需要一个当前安装的文件系统的列表时使用，例如df&nbsp;命令。&nbsp; <br><br>/etc/shadow&nbsp;&nbsp; <br>在安装了影子口令软件的系统上的影子口令文件。影子口令文件将/etc/passwd&nbsp;文件中的加密口令移动到/etc/shadow&nbsp;中，而后者只对root可读。这使破译口令更困难。&nbsp; <br><br>/etc/login.defs&nbsp;&nbsp; <br>login&nbsp;命令的配置文件。&nbsp; <br><br>/etc/printcap&nbsp;&nbsp; <br>类似/etc/termcap&nbsp;，但针对打印机。语法不同。&nbsp; <br><br>/etc/profile&nbsp;,&nbsp;/etc/csh.login&nbsp;,&nbsp;/etc/csh.cshrc&nbsp;&nbsp; <br>登录或启动时Bourne或C&nbsp;shells执行的文件。这允许系统管理员为所有用户建立全局缺省环境。&nbsp; <br><br>/etc/securetty&nbsp;&nbsp; <br>确认安全终端，即哪个终端允许root登录。一般只列出虚拟控制台，这样就不可能(至少很困难)通过modem或网络闯入系统并得到超级用户特权。&nbsp; <br><br>/etc/shells&nbsp;&nbsp; <br>列出可信任的shell。chsh&nbsp;命令允许用户在本文件指定范围内改变登录shell。提供一台机器FTP服务的服务进程ftpd&nbsp;检查用户shell是否列在&nbsp;/etc/shells&nbsp;文件中，如果不是将不允许该用户登录。&nbsp; <br><br>/etc/termcap&nbsp;&nbsp; <br>终端性能数据库。说明不同的终端用什么"转义序列"控制。写程序时不直接输出转义序列(这样只能工作于特定品牌的终端)，而是从/etc/termcap&nbsp;中查找要做的工作的正确序列。这样，多数的程序可以在多数终端上运行。 <br><br><br>/dev目录 <br>/dev&nbsp;目录包括所有设备的设备文件。设备文件用特定的约定命名。 <br><br>/usr文件系统 <br>/usr&nbsp;文件系统经常很大，因为所有程序安装在这里。&nbsp;/usr&nbsp;里的所有文件一般来自Linux&nbsp;distribution；本地安装的程序和其他东西在/usr/local&nbsp;下。这样可能在升级新版系统或新distribution时无须重新安装全部程序。 <br><br>/usr/X11R6&nbsp;&nbsp; <br>X&nbsp;Window系统的所有文件。为简化X的开发和安装，X的文件没有集成到系统中。&nbsp;X自己在/usr/X11R6&nbsp;下类似/usr&nbsp;。&nbsp; <br>/usr/X386&nbsp;&nbsp; <br>类似/usr/X11R6&nbsp;，但是给X11&nbsp;Release&nbsp;5的。&nbsp; <br>/usr/bin&nbsp;&nbsp; <br>几乎所有用户命令。有些命令在/bin&nbsp;或/usr/local/bin&nbsp;中。&nbsp; <br>/usr/sbin&nbsp;&nbsp; <br>根文件系统不必要的系统管理命令，例如多数服务程序。&nbsp; <br>/usr/man&nbsp;,&nbsp;/usr/info&nbsp;,&nbsp;/usr/doc&nbsp;&nbsp; <br>手册页、GNU信息文档和各种其他文档文件。&nbsp; <br>/usr/include&nbsp;&nbsp; <br>C编程语言的头文件。为了一致性这实际上应该在/usr/lib&nbsp;下，但传统上支持这个名字。&nbsp; <br>/usr/lib&nbsp;&nbsp; <br>程序或子系统的不变的数据文件，包括一些site-wide配置文件。名字lib来源于库(library);&nbsp;编程的原始库存在/usr/lib&nbsp;里。&nbsp; <br>/usr/local&nbsp;&nbsp; <br>本地安装的软件和其他文件放在这里。&nbsp; <br><br><br>/var文件系统 <br>/var&nbsp;包括系统一般运行时要改变的数据。每个系统是特定的，即不通过网络与其他计算机共享。&nbsp; <br><br>/var/catman&nbsp;&nbsp; <br>当要求格式化时的man页的cache。man页的源文件一般存在/usr/man/man*&nbsp;中；有些man页可能有预格式化的版本，存在/usr/man/cat*&nbsp;中。而其他的man页在第一次看时需要格式化，格式化完的版本存在/var/man&nbsp;中，这样其他人再看相同的页时就无须等待格式化了。&nbsp;(/var/catman&nbsp;经常被清除，就象清除临时目录一样。)&nbsp; <br>/var/lib&nbsp;&nbsp; <br>系统正常运行时要改变的文件。&nbsp; <br>/var/local&nbsp;&nbsp; <br>/usr/local&nbsp;中安装的程序的可变数据(即系统管理员安装的程序)。注意，如果必要，即使本地安装的程序也会使用其他/var&nbsp;目录，例如/var/lock&nbsp;。&nbsp; <br>/var/lock&nbsp;&nbsp; <br>锁定文件。许多程序遵循在/var/lock&nbsp;中产生一个锁定文件的约定，以支持他们正在使用某个特定的设备或文件。其他程序注意到这个锁定文件，将不试图使用这个设备或文件。&nbsp; <br>/var/log&nbsp;&nbsp; <br>各种程序的Log文件，特别是login&nbsp;&nbsp;(/var/log/wtmp&nbsp;log所有到系统的登录和注销)&nbsp;和syslog&nbsp;(/var/log/messages&nbsp;里存储所有核心和系统程序信息。&nbsp;/var/log&nbsp;里的文件经常不确定地增长，应该定期清除。&nbsp; <br>/var/run&nbsp;&nbsp; <br>保存到下次引导前有效的关于系统的信息文件。例如，&nbsp;/var/run/utmp&nbsp;包含当前登录的用户的信息。&nbsp; <br>/var/spool&nbsp;&nbsp; <br>mail,&nbsp;news,&nbsp;打印队列和其他队列工作的目录。每个不同的spool在/var/spool&nbsp;下有自己的子目录，例如，用户的邮箱在/var/spool/mail&nbsp;中。&nbsp; <br>/var/tmp&nbsp;&nbsp; <br>比/tmp&nbsp;允许的大或需要存在较长时间的临时文件。&nbsp;(虽然系统管理员可能不允许/var/tmp&nbsp;有很旧的文件。)&nbsp; <br><br><br>/proc文件系统 <br>/proc&nbsp;文件系统是一个假的文件系统。它不存在在磁盘某个磁盘上。而是由核心在内存中产生。用于提供关于系统的信息(originally&nbsp;about&nbsp;processes,&nbsp;hence&nbsp;the&nbsp;name)。下面说明一些最重要的文件和目录。&nbsp; <br><br>/proc/1&nbsp;&nbsp; <br>关于进程1的信息目录。每个进程在/proc&nbsp;下有一个名为其进程号的目录。&nbsp; <br>/proc/cpuinfo&nbsp;&nbsp; <br>处理器信息，如类型、制造商、型号和性能。&nbsp; <br>/proc/devices&nbsp;&nbsp; <br>当前运行的核心配置的设备驱动的列表。&nbsp; <br>/proc/dma&nbsp;&nbsp; <br>显示当前使用的DMA通道。&nbsp; <br>/proc/filesystems&nbsp;&nbsp; <br>核心配置的文件系统。&nbsp; <br>/proc/interrupts&nbsp;&nbsp; <br>显示使用的中断，and&nbsp;how&nbsp;many&nbsp;of&nbsp;each&nbsp;there&nbsp;have&nbsp;been.&nbsp; <br>/proc/ioports&nbsp;&nbsp; <br>当前使用的I/O端口。&nbsp; <br>/proc/kcore&nbsp;&nbsp; <br>系统物理内存映象。与物理内存大小完全一样，但不实际占用这么多内存；it&nbsp;is&nbsp;generated&nbsp;on&nbsp;the&nbsp;fly&nbsp;as&nbsp;programs&nbsp;access&nbsp;it.&nbsp;(记住：除非你把它拷贝到什么地方，/proc&nbsp;下没有任何东西占用任何磁盘空间。)&nbsp; <br>/proc/kmsg&nbsp;&nbsp; <br>核心输出的消息。也被送到syslog&nbsp;。&nbsp; <br>/proc/ksyms&nbsp;&nbsp; <br>核心符号表。&nbsp; <br>/proc/loadavg&nbsp;&nbsp; <br>系统"平均负载"；3个指示器指出系统当前的工作量。&nbsp; <br>/proc/meminfo&nbsp;&nbsp; <br>存储器使用信息，包括物理内存和swap。&nbsp; <br>/proc/modules&nbsp;&nbsp; <br>当前加载了哪些核心模块。&nbsp; <br>/proc/net&nbsp;&nbsp; <br>网络协议状态信息。&nbsp; <br>/proc/self&nbsp;&nbsp; <br>到查看/proc&nbsp;的程序的进程目录的符号连接。当2个进程查看/proc&nbsp;时，是不同的连接。这主要便于程序得到它自己的进程目录。&nbsp; <br>/proc/stat&nbsp;&nbsp; <br>系统的不同状态，such&nbsp;as&nbsp;the&nbsp;number&nbsp;of&nbsp;page&nbsp;faults&nbsp;since&nbsp;the&nbsp;system&nbsp;was&nbsp;booted.&nbsp; <br>/proc/uptime&nbsp;&nbsp; <br>系统启动的时间长度。&nbsp; <br>/proc/version&nbsp;&nbsp; <br>核心版本。<br>
<img src ="http://www.cnitblog.com/libocumt/aggbug/44558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/libocumt/" target="_blank">TimeLord</a> 2008-05-29 17:56 <a href="http://www.cnitblog.com/libocumt/articles/44558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sed命令使用详解</title><link>http://www.cnitblog.com/libocumt/articles/44475.html</link><dc:creator>TimeLord</dc:creator><author>TimeLord</author><pubDate>Wed, 28 May 2008 07:15:00 GMT</pubDate><guid>http://www.cnitblog.com/libocumt/articles/44475.html</guid><description><![CDATA[sed 编辑器是 Linux 系统管理员的工具包中最有用的资产之一， <br>因此，有必要彻底地了解其应用
<p>Linux 操作系统最大的一个好处是它带有各种各样的实用工具。存在如此之多不同的实用工具，几乎不可能知道并了解所有这些工具。可以简化关键情况下操作的一个实用工具是 sed。它是任何管理员的工具包中最强大的工具之一，并且可以证明它自己在关键情况下非常有价值。 </p>
<p>sed 实用工具是一个&#8220;编辑器&#8221;，但它与其它大多数编辑器不同。除了不面向屏幕之外，它还是非交互式的。这意味着您必须将要对数据执行的命令插入到命令行或要处理的脚本中。当显示它时，请忘记您在使用 Microsoft Word 或其它大多数编辑器时拥有的交互式编辑文件功能。sed 在一个文件（或文件集）中非交互式、并且不加询问地接收一系列的命令并执行它们。因而，它流经文本就如同水流经溪流一样，因而 sed 恰当地代表了流编辑器。它可以用来将所有出现的 "Mr. Smyth" 修改为 "Mr. Smith"，或将 "tiger cub" 修改为 "wolf cub"。流编辑器非常适合于执行重复的编辑，这种重复编辑如果由人工完成将花费大量的时间。其参数可能和一次性使用一个简单的操作所需的参数一样有限，或者和一个具有成千上万行要进行编辑修改的脚本文件一样复杂。sed 是 Linux 和 UNIX 工具箱中最有用的工具之一，且使用的参数非常少。 </p>
<p>sed 的工作方式 </p>
<p>sed 实用工具按顺序逐行将文件读入到内存中。然后，它执行为该行指定的所有操作，并在完成请求的修改之后将该行放回到内存中，以将其转储至终端。完成了这一行上的所有操作之后，它读取文件的下一行，然后重复该过程直到它完成该文件。如同前面所提到的，默认输出是将每一行的内容输出到屏幕上。在这里，开始涉及到两个重要的因素—首先，输出可以被重定向到另一文件中，以保存变化；第二，源文件（默认地）保持不被修改。sed 默认读取整个文件并对其中的每一行进行修改。不过，可以按需要将操作限制在指定的行上。 </p>
<p>该实用工具的语法为： </p>
<p><br>sed [options] '{command}' [filename] </p>
<p>在这篇文章中，我们将浏览最常用的命令和选项，并演示它们如何工作，以及它们适于在何处使用。 </p>
<p>替换命令 </p>
<p>sed 实用工具以及其它任何类似的编辑器的最常用的命令之一是用一个值替换另一个值。用来实现这一目的的操作的命令部分语法是： </p>
<p><br>'s/{old value}/{new value}/' </p>
<p>因而，下面演示了如何非常简单地将 "tiger" 修改为 "wolf"： </p>
<p><br>$ echo The tiger cubs will meet on Tuesday after school | sed <br>'s/tiger/wolf/' <br>The wolf cubs will meet on Tuesday after school <br>$ </p>
<p>注意如果输入是源自之前的命令输出，则不需要指定文件名—同样的原则也适用于 awk、sort 和其它大多数 LinuxUNIX 命令行实用工具程序。 </p>
<p>多次修改 </p>
<p>如果需要对同一文件或行作多次修改，可以有三种方法来实现它。第一种是使用 "-e" 选项，它通知程序使用了多条编辑命令。例如： </p>
<p><br>$ echo The tiger cubs will meet on Tuesday after school | sed -e ' <br>s/tiger/wolf/' -e 's/after/before/' <br>The wolf cubs will meet on Tuesday before school <br>$ </p>
<p>这是实现它的非常复杂的方法，因此 "-e" 选项不常被大范围使用。更好的方法是用分号来分隔命令： </p>
<p><br>$ echo The tiger cubs will meet on Tuesday after school | sed ' <br>s/tiger/wolf/; s/after/before/' <br>The wolf cubs will meet on Tuesday before school <br>$ </p>
<p>注意分号必须是紧跟斜线之后的下一个字符。如果两者之间有一个空格，操作将不能成功完成，并返回一条错误消息。这两种方法都很好，但许多管理员更喜欢另一种方法。要注意的一个关键问题是，两个撇号 (' ') 之间的全部内容都被解释为 sed 命令。直到您输入了第二个撇号，读入这些命令的 shell 程序才会认为您完成了输入。这意味着可以在多行上输入命令—同时 Linux 将提示符从 PS1 变为一个延续提示符（通常为 "&gt;"）—直到输入了第二个撇号。一旦输入了第二个撇号，并且按下了 Enter 键，则处理就进行并产生相同的结果，如下所示： </p>
<p><br>$ echo The tiger cubs will meet on Tuesday after school | sed ' <br>&gt; s/tiger/wolf/ <br>&gt; s/after/before/' <br>The wolf cubs will meet on Tuesday before school <br>$ </p>
<p>全局修改 </p>
<p>让我们开始一次看似简单的编辑。假定在要修改的消息中出现了多次要修改的项目。默认方式下，结果可能和预期的有所不同，如下所示： </p>
<p><br>$ echo The tiger cubs will meet this Tuesday at the same time <br>as the meeting last Tuesday | sed 's/Tuesday/Thursday/' <br>The tiger cubs will meet this Thursday at the same time <br>as the meeting last Tuesday <br>$ </p>
<p>与将出现的每个 "Tuesday" 修改为 "Thursday" 相反，sed 编辑器在找到一个要修改的项目并作了修改之后继续处理下一行，而不读整行。sed 命令功能大体上类似于替换命令，这意味着它们都处理每一行中出现的第一个选定序列。为了替换出现的每一个项目，在同一行中出现多个要替换的项目的情况下，您必须指定在全局进行该操作： </p>
<p><br>$ echo The tiger cubs will meet this Tuesday at the same time <br>as the meeting last Tuesday | sed 's/Tuesday/Thursday/g' <br>The tiger cubs will meet this Thursday at the same time <br>as the meeting last Thursday <br>$ </p>
<p>请记住不管您要查找的序列是否仅包含一个字符或词组，这种对全局化的要求都是必需的。 </p>
<p>sed 还可以用来修改记录字段分隔符。例如，以下命令将把所有的 tab 修改为空格： </p>
<p><br>sed 's// /g' </p>
<p>其中，第一组斜线之间的项目是一个 tab，而第二组斜线之间的项目是一个空格。作为一条通用的规则，sed 可以用来将任意的可打印字符修改为任意其它的可打印字符。如果您想将不可打印字符修改为可打印字符—例如，铃铛修改为单词 "bell"—sed 不是适于完成这项工作的工具（但 tr 是）。 </p>
<p>有时，您不想修改在一个文件中出现的所有指定项目。有时，您只想在满足某些条件时才作修改—例如，在与其它一些数据匹配之后才作修改。为了说明这一点，请考虑以下文本文件： </p>
<p><br>$ cat sample_one <br>one 1 <br>two 1 <br>three 1 <br>one 1 <br>two 1 <br>two 1 <br>three 1 <br>$ </p>
<p>假定希望用 "2" 来替换 "1"，但仅在单词 "two" 之后才作替换，而不是每一行的所有位置。通过指定在给出替换命令之前必须存在一次匹配，可以实现这一点： </p>
<p><br>$ sed '/two/ s/1/2/' sample_one <br>one 1 <br>two 2 <br>three 1 <br>one 1 <br>two 2 <br>two 2 <br>three 1 <br>$ </p>
<p>现在，使其更加准确： </p>
<p><br>$ sed ' <br>&gt; /two/ s/1/2/ <br>&gt; /three/ s/1/3/' sample_one <br>one 1 <br>two 2 <br>three 3 <br>one 1 <br>two 2 <br>two 2 <br>three 3 <br>$ </p>
<p>请再次记住唯一改变了的是显示。如果您查看源文件，您将发现它始终保持不变。您必须将输出保存至另一个文件，以实现永久保存。值得重复的是，不对源文件作修改实际是祸中有福—它让您能够对文件进行试验而不会造成任何实际的损害，直到让正确命令以您预期和希望的方式进行工作。 </p>
<p>以下命令将修改后的输出保存至一个新的文件： </p>
<p><br>$ sed ' <br>&gt; /two/ s/1/2/ <br>&gt; /three/ s/1/3/' sample_one &gt; sample_two </p>
<p>该输出文件将所有修改合并在其中，并且这些修改通常将在屏幕上显示。现在可以用 head、cat 或任意其它类似的实用工具来进行查看。 </p>
<p>脚本文件 </p>
<p>sed 工具允许您创建一个脚本文件，其中包含从该文件而不是在命令行进行处理的命令，并且 sed 工具通过 "-f" 选项来引用。通过创建一个脚本文件，您能够一次又一次地重复运行相同的操作，并指定比每次希望从命令行进行处理的操作详细得多的操作。 </p>
<p>考虑以下脚本文件： </p>
<p><br>$ cat sedlist <br>/two/ s/1/2/ <br>/three/ s/1/3/ <br>$ </p>
<p>现在可以在数据文件上使用脚本文件，获得和我们之前看到的相同的结果： </p>
<p><br>$ sed -f sedlist sample_one <br>one 1 <br>two 2 <br>three 3 <br>one 1 <br>two 2 <br>two 2 <br>three 3 <br>$ </p>
<p>注意当调用 "-f" 选项时，在源文件内或命令行中不使用撇号。脚本文件，也称为源文件，对于想重复多次的操作和从命令行运行可能出错的复杂命令很有价值。编辑源文件并修改一个字符比在命令行中重新输入一条多行的项目要容易得多。 </p>
<p>限制行 </p>
<p>编辑器默认查看输入到流编辑器中的每一行，且默认在输入到流编辑器中的每一行上进行编辑。这可以通过在发出命令之前指定约束条件来进行修改。例如，只在此示例文件的输出的第 5 和第 6 行中用 "2" 来替换 "1"，命令将为： </p>
<p><br>$ sed '5,6 s/1/2/' sample_one <br>one 1 <br>two 1 <br>three 1 <br>one 1 <br>two 2 <br>two 2 <br>three 1 <br>$ </p>
<p>在这种情况下，因为要修改的行是专门指定的，所以不需要替换命令。因此，您可以灵活地根据匹配准则（可以是行号或一种匹配模式）来选择要修改哪些行（从根本上限制修改）。 </p>
<p>禁止显示 </p>
<p>sed 默认将来自源文件的每一行显示到屏幕上（或重定向到一个文件中），而无论该行是否受到编辑操作的影响，"-n" 参数覆盖了这一操作。"-n" 覆盖了所有的显示，并且不显示任何一行，而无论它们是否被编辑操作修改。例如： </p>
<p><br>$ sed -n -f sedlist sample_one <br>$ </p>
<p>$ sed -n -f sedlist sample_one &gt; sample_two <br>$ cat sample_two <br>$ </p>
<p>在第一个示例中，屏幕上不显示任何东西。在第二个示例中，不修改任何东西，因此不将任何东西写到新的文件中—它最后是空的。这不是否定了编辑的全部目的吗？为什么这是有用的？它是有用的仅因为 "-n" 选项能够被一条显示命令 (-p) 覆盖。为了说明这一点，假定现在像下面这样对脚本文件进行了修改： </p>
<p><br>$ cat sedlist <br>/two/ s/1/2/p <br>/three/ s/1/3/p <br>$ </p>
<p>然后下面是运行它的结果： </p>
<p><br>$ sed -n -f sedlist sample_one <br>two 2 <br>three 3 <br>two 2 <br>two 2 <br>three 3 <br>$ </p>
<p>保持不变的行全部不被显示。只有受到编辑操作影响的行被显示了。在这种方式下，可以仅取出这些行，进行修改，然后把它们放到一个单独的文件中： </p>
<p><br>$ sed -n -f sedlist sample_one &gt; sample_two <br>$ </p>
<p>$ cat sample_two <br>two 2 <br>three 3 <br>two 2 <br>two 2 <br>three 3 <br>$ </p>
<p>利用它的另一种方法是只显示一定数量的行。例如，只显示 2-6 行，同时不做其它的编辑修改： </p>
<p><br>$ sed -n '2,6p' sample_one <br>two 1 <br>three 1 <br>one 1 <br>two 1 <br>two 1 <br>$ </p>
<p>其它所有的行被忽略，只有 2-6 行作为输出显示。这是一项出色的功能，其它任何工具都不能容易地实现。Head 将显示一个文件的顶部，而 tail 将显示一个文件的底部，但 sed 允许从任意位置取出想要的任意内容。 </p>
<p>删除行 </p>
<p>用一个值替换另一个值远非流编辑器可以执行的唯一功能。它还具有许多的潜在功能，在我看来第二种最常用的功能是删除。删除与替换的工作方式相同，只是它删除指定的行（如果您想要删除一个单词而不是一行，不要考虑删除，而应考虑用空的内容来替换它—s/cat//）。 </p>
<p>该命令的语法是： </p>
<p><br>'{what to find} d' </p>
<p>从 sample_one 文件中删除包含 "two" 的所有行： </p>
<p><br>$ sed '/two/ d' sample_one <br>one 1 <br>three 1 <br>one 1 <br>three 1 <br>$ </p>
<p>从显示屏中删除前三行，而不管它们的内容是什么： </p>
<p><br>$ sed '1,3 d' sample_one <br>one 1 <br>two 1 <br>two 1 <br>three 1 <br>$ </p>
<p>只显示剩下的行，前三行不在显示屏中出现。对于流编辑器，一般当它们涉及到全局表达式时，特别是应用于删除操作时，有几点要记住： </p>
<p>上三角号 (^) 表示一行的开始，因此，如果 "two" 是该行的头三个字符，则 </p>
<p><br>sed '/^two/ d' sample_one </p>
<p>将只删除该行。 <br>美元符号 ($) 代表文件的结尾，或一行的结尾，因此，如果 "two" 是该行的最后三个字符，则 </p>
<p><br>sed '/two$/ d' sample_one </p>
<p>将只删除该行。 </p>
<p>将这两者结合在一起的结果： </p>
<p><br>sed '/^$/ d' {filename} </p>
<p>删除文件中的所有空白行。例如，以下命令将 "1" 替换为 "2"，以及将 "1" 替换为 "3"，并删除文件中所有尾随的空行： </p>
<p><br>$ sed '/two/ s/1/2/; /three/ s/1/3/; /^$/ d' sample_one <br>one 1 <br>two 1 <br>three 1 <br>one 1 <br>two 2 <br>two 2 <br>three 1 <br>$ </p>
<p>其通常的用途是删除一个标题。以下命令将删除文件中所有的行，从第一行直到第一个空行： </p>
<p><br>sed '1,/^$/ d' {filename} </p>
<p>添加和插入文本 </p>
<p>可以结合使用 sed 和 "a" 选项将文本添加到一个文件的末尾。实现方法如下： </p>
<p><br>$ sed '$a <br>&gt; This is where we stop <br>&gt; the test' sample_one <br>one 1 <br>two 1 <br>three 1 <br>one 1 <br>two 1 <br>two 1 <br>three 1 <br>This is where we stop <br>the test <br>$ </p>
<p>在该命令中，美元符号 ($) 表示文本将被添加到文件的末尾。反斜线 () 是必需的，它表示将插入一个回车符。如果它们被遗漏了，则将导致一个错误，显示该命令是错乱的；在任何要输入回车的地方您必须使用反斜线。 </p>
<p>要将这些行添加到第 4 和第 5 个位置而不是末尾，则命令变为： </p>
<p><br>$ sed '3a <br>&gt; This is where we stop <br>&gt; the test' sample_one <br>one 1 <br>two 1 <br>three 1 <br>This is where we stop <br>the test <br>one 1 <br>two 1 <br>two 1 <br>three 1 <br>$ </p>
<p>这将文本添加到第 3 行之后。和几乎所有的编辑器一样，您可以选择插入而不是添加（如果您希望这样的话）。这两者的区别是添加跟在指定的行之后，而插入从指定的行开始。当用插入来代替添加时，只需用 "i" 来代替 "a"，如下所示： </p>
<p><br>$ sed '3i <br>&gt; This is where we stop <br>&gt; the test' sample_one <br>one 1 <br>two 1 <br>This is where we stop <br>the test <br>three 1 <br>one 1 <br>two 1 <br>two 1 <br>three 1 <br>$ </p>
<p>新的文本出现在输出的中间位置，而处理通常在指定的操作执行以后继续进行。 </p>
<p>读写文件 </p>
<p>重定向输出的功能已经演示过了，但需要指出的是，在编辑命令运行期间可以同步地读入和写出文件。例如，执行替换，并将 1-3 行写到名称为 sample_three 的文件中： </p>
<p><br>$ sed ' <br>&gt; /two/ s/1/2/ <br>&gt; /three/ s/1/3/ <br>&gt; 1,3 w sample_three' sample_one <br>one 1 <br>two 2 <br>three 3 <br>one 1 <br>two 2 <br>two 2 <br>three 3 <br>$ </p>
<p>$ cat sample_three <br>one 1 <br>two 2 <br>three 3 <br>$ </p>
<p>由于为 w (write) 命令指定了 "1,3"，所以只有指定的行被写到了新文件中。无论被写的是哪些行，所有的行都在默认输出中显示。 </p>
<p>修改命令 </p>
<p>除了替换项目之外，还可以将行从一个值修改为另一个值。要记住的是，替换是对字符逐个进行，而修改功能与删除类似，它影响整行： </p>
<p><br>$ sed '/two/ c <br>&gt; We are no longer using two' sample_one <br>one 1 <br>We are no longer using two <br>three 1 <br>one 1 <br>We are no longer using two <br>We are no longer using two <br>three 1 <br>$ </p>
<p>修改命令与替换的工作方式很相似，但在范围上要更大些—将一个项目完全替换为另一个项目，而无论字符内容或上下文。夸张一点讲，当使用替换时，只有字符 "1" 被字符 "2" 替换，而当使用修改时，原来的整行将被修改。在两种情况下，要寻找的匹配条件都仅为 "two"。 </p>
<p>修改全部但&#8230;&#8230; </p>
<p>对于大多数 sed 命令，详细说明各种功能要进行何种修改。利用感叹号，可以在除指定位置之外的任何地方执行修改—与默认的操作完全相反。 </p>
<p>例如，要删除包含单词 "two" 的所有行，操作为： </p>
<p><br>$ sed '/two/ d' sample_one <br>one 1 <br>three 1 <br>one 1 <br>three 1 <br>$ </p>
<p>而要删除除包含单词 "two" 的行之外的所有行，则语法变为： </p>
<p><br>$ sed '/two/ !d' sample_one <br>two 1 <br>two 1 <br>two 1 <br>$ </p>
<p>如果您有一个文件包含一系列项目，并且想对文件中的每个项目执行一个操作，那么首先对那些项目进行一次智能扫描并考虑将要做什么是很重要的。为了使事情变得更简单，您可以将 sed 与任意迭代例程（for、while、until）结合来实现这一目的。 </p>
<p>比如说，假定您有一个名为 "animals" 的文件，其中包含以下项目： </p>
<p>pig <br>horse <br>elephant <br>cow <br>dog <br>cat </p>
<p>您希望运行以下例程： </p>
<p><br>#mcd.ksh <br>for I in $* <br>do <br>echo Old McDonald had a $I <br>echo E-I, E-I-O <br>done </p>
<p>结果将为，每一行都显示在 "Old McDonald has a" 的末尾。虽然对于这些项目的大部分这是正确的，但对于 "elephant" 项目，它有语法错误，因为结果应当为 "an elephant" 而不是 "a elephant"。利用 sed，您可以在来自 shell 文件的输出中检查这种语法错误，并通过首先创建一个命令文件来即时地更正它们： </p>
<p><br>#sublist <br>/ a a/ s/ a / an / <br>/ a e/ s/ a / an / <br>/a i/ s / a / an / <br>/a o/ s/ a / an / <br>/a u/ s/ a / an / </p>
<p>然后执行以下过程： </p>
<p><br>$ sh mcd.ksh 'cat animals' | sed -f sublist </p>
<p>现在，在运行了 mcd 脚本之后，sed 将在输出中搜索单个字母 a （空格，"a"，空格）之后紧跟了一个元音的任意位置。如果这种位置存在，它将把该序列修改为空格，"an"，空格。这样就使问题更正后才显示在屏幕上，并确保各处的编辑人员在晚上可以更容易地入睡。结果是： </p>
<p>Old McDonald had a pig <br>E-I, E-I-O <br>Old McDonald had a horse <br>E-I, E-I-O <br>Old McDonald had an elephant <br>E-I, E-I-O <br>Old McDonald had a cow <br>E-I, E-I-O <br>Old McDonald had a dog <br>E-I, E-I-O <br>Old McDonald had a cat <br>E-I, E-I-O </p>
<p>提前退出 </p>
<p>sed 默认读取整个文件，并只在到达末尾时才停止。不过，您可以使用退出命令提前停止处理。只能指定一条退出命令，而处理将一直持续直到满足调用退出命令的条件。 </p>
<p>例如，仅在文件的前五行上执行替换，然后退出： </p>
<p><br>$ sed ' <br>&gt; /two/ s/1/2/ <br>&gt; /three/ s/1/3/ <br>&gt; 5q' sample_one <br>one 1 <br>two 2 <br>three 3 <br>one 1 <br>two 2 <br>$ </p>
<p>在退出命令之前的项目可以是一个行号（如上所示），或者一条查找/匹配命令： </p>
<p><br>$ sed ' <br>&gt; /two/ s/1/2/ <br>&gt; /three/ s/1/3/ <br>&gt; /three/q' sample_one <br>one 1 <br>two 2 <br>three 3 <br>$ </p>
<p>您还可以使用退出命令来查看超过一定标准数目的行，并增加比 head 中的功能更强的功能。例如，head 命令允许您指定您想要查看一个文件的前多少行—默认数为 10，但可以使用从 1 到 99 的任意一个数字。如果您想查看一个文件的前 110 行，您用 head 不能实现这一目的，但用 sed 可以： </p>
<p><br>sed 110q filename </p>
<p>处理问题 </p>
<p>当使用 sed 时，要记住的重要事项是它的工作方式。它的工作方式是：读入一行，在该行上执行它已知要执行的所有任务，然后继续处理下一行。每一行都受给定的每一个编辑命令的影响。 </p>
<p>如果您的操作顺序没有十分彻底地考虑清楚，那么这可能会很麻烦。例如，假定您需要将所有的 "two" 项目修改为 "three"，然后将所有的 "three" 修改为 "four"： </p>
<p><br>$ sed ' <br>&gt; /two/ s/two/three/ <br>&gt; /three/ s/three/four/' sample_one <br>one 1 <br>four 1 <br>four 1 <br>one 1 <br>four 1 <br>four 1 <br>four 1 <br>$ </p>
<p>最初读取的 "two" 被修改为 "three"。然后它满足为下一次编辑建立的准则，从而变为 "four"。最终的结果不是想要的结果—现在除了 "four" 没有别的项目了，而本来应该有 "three" 和 "four"。 </p>
<p>当执行这种操作时，您必须非常用心地注意指定操作的方式，并按某种顺序来安排它们，使得操作之间不会互相影响。例如： </p>
<p><br>$ sed ' <br>&gt; /three/ s/three/four/ <br>&gt; /two/ s/two/three/' sample_one <br>one 1 <br>three 1 <br>four 1 <br>one 1 <br>three 1 <br>three 1 <br>four 1 <br>$ </p>
<p>这非常有效，因为 "three" 值在 "two" 变成 "three" 之前得到修改。 </p>
<p>标签和注释 </p>
<p>可以在 sed 脚本文件中放置标签，这样一旦文件变得庞大，可以更容易地说明正在发生的事情。存在各种各样与这些标签相关的命令，它们包括： <br>接下来的步骤 </p>
<p>访问并收藏 Linux 技术中心 </p>
<p>阅读 Dale Dougherty 和 Arnold Robbins 的著作 sed &amp; awk, 2nd Edition （O'Reilly &amp; Associates 出版社）。 </p>
<p>: 冒号表示一个标签名称。例如： </p>
<p><br>:HERE </p>
<p>以冒号开始的标签可以由 "b" 和 "t" 命令处理。 </p>
<p>b {label} 充当 "goto" 语句的作用，将处理发送至前面有一个冒号的标签。例如， </p>
<p><br>b HERE </p>
<p>将处理发送给行 </p>
<p><br>:HERE </p>
<p>如果紧跟 b 之后没有指定任何标签，则处理转至脚本文件的末尾。 </p>
<p>t {label} 只要自上次输入行或执行一次 "t" 命令以来进行了替换操作，就转至该标签。和 "b" 一样，如果没有给定标签名，则处理转至脚本文件的末尾。 </p>
<p># 符号作为一行的第一个字符将使整行被当作注释处理。注释行与标签不同，不能使用 b 或 t 命令来转到注释行上</p>
<p>没想到sed的用法还真是麻烦，不过功能的确强大。<br><a href="http://bbs.chinaunix.net/forum/24/040529/336126.html"><u><font color=#0000ff>http://bbs.chinaunix.net/forum/24/040529/336126.html</font></u></a>， 有空把这个可以慢慢消化。<br></p>
<p>今天下午想实现的一个功能是，在某个文件中查找包含特定字符串的所在行，并且把下一行内容提到当前行的结尾上来。<br>在上面的网页中发现一个可供参考的用法<br></p>
<p style="COLOR: #800000"># number each line of file, but only print numbers if line is not blank <br>#给文件每一行加上数字序号，但是仅当行非空时打印数字 <br>sed '/./=' filename | sed '/./N; s/\n/ /' <br>###sed '/./=' filename的用处是查找除非空行赋予行号,sed '/./N; s/\n/ /'查找非 <br>##空行并把后一行附加到当前行,然后用空格替换换行符\n </p>
<p style="COLOR: #000080">Had many tries. Finally I found the right way. See below：<br><span style="COLOR: #ff0000">/bin/sed&nbsp; '/APM_Main::receiveMessage/N;s/\n//g' $LOGFILE </span></p>
<img src ="http://www.cnitblog.com/libocumt/aggbug/44475.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/libocumt/" target="_blank">TimeLord</a> 2008-05-28 15:15 <a href="http://www.cnitblog.com/libocumt/articles/44475.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>更换GRUB引导界面</title><link>http://www.cnitblog.com/libocumt/articles/43975.html</link><dc:creator>TimeLord</dc:creator><author>TimeLord</author><pubDate>Tue, 20 May 2008 10:20:00 GMT</pubDate><guid>http://www.cnitblog.com/libocumt/articles/43975.html</guid><description><![CDATA[<p style="TEXT-INDENT: 2em"><strong>一幅背景</strong>
<p style="TEXT-INDENT: 2em">首先，需要一幅图片，要求它的解析度在640&#215;480或之上。虽然从道理上讲小于这个尺寸也没关系，因为可以把它扩张为640&#215;480，但是这样会造成比较严重的画质损失，所以最好不要小于这个尺寸。选好图片后，需要在GRUB的目录中建立一个存放图片的文件夹，一般情况可以通过以下命令来做：
<p style="TEXT-INDENT: 2em"><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>＃cd /boot/grub &amp;&amp; mkdir image</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p style="TEXT-INDENT: 2em">但是仅仅这么做是不够的，因为一是没有修改grub.conf，使所做的设置生效；二是GRUB使用压缩了的XPM图像格式，而比较常见的图片格式是BMP、JPG、GIF和PNG之类的，所以需要将图片格式转换成XPM。可能有人想到了使用GIMP，但是GIMP使用起来相对麻烦，而且如果没有安装X-Window的话就无法使用GIMP了。所以这里建议使用命令convert进行图片格式转换（可以使用man convert命令详细阅读其使用手册）。简单说一下convert使用方法，比如要将image.jpg转换为image.xpm，使用命令如下：
<p style="TEXT-INDENT: 2em"><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>＃convert -geometry 640x480 -colors 14 image.jpg image.xpm</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p style="TEXT-INDENT: 2em">convert命令在Red Hat Linux 9.0上默认是安装的。这个命令是把image.jpg转变尺寸为640&#215;480，色深是14的image.xpm。注意，命令行中的640和480之间是小写字母&#8220;x&#8221;，不要写错。另外，GRUB要求图片色深必须是14，一般可以这样来证明：
<p style="TEXT-INDENT: 2em"><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>＃cd /boot/GRUB &amp;&amp; gunzip splash.xpm.gz &amp;&amp; less splash.xpm</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p style="TEXT-INDENT: 2em">在文件头部可以找到这些信息：
<p style="TEXT-INDENT: 2em"><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>/* XPM */
            static char *10[] = {
            /* columns rows colors chars-per-pixel */
            "640 480 14 1"，</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p style="TEXT-INDENT: 2em">所以需要进行上述的转换步骤以达到GRUB的要求。接下来压缩这幅图片,使用下面的命令：
<p style="TEXT-INDENT: 2em"><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>＃gzip -9 image.xpm</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p style="TEXT-INDENT: 2em">结果生成了image.xpm.gz，然后把这个文件拷贝到image目录，再修改grub.conf。注意，grub.conf是重要的启动文件，如果用户没有把握在GRUB引导失效后记住该文件内容，最好备份一下。使用vi编辑器找到类似于这样的行：
<p style="TEXT-INDENT: 2em"><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>splashimage=(hd0,1)/GRUB/splash.xpm.gz</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p style="TEXT-INDENT: 2em">把它改为：
<p style="TEXT-INDENT: 2em"><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>splashimage=(hd0,1)/GRUB/image/image.xpm.gz</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p style="TEXT-INDENT: 2em">然后使用命令wq存盘退出。这时不要着急删掉splash.xpm.gz，因为如果修改失败的话，还能有个引导画面，否则的话每次进入GRUB就只有一个光秃秃的黑色背景了。
<p style="TEXT-INDENT: 2em">这样就大功告成了，赶快重启试试，看看自己的修改成果。虽然画质有所下降，但是比起以前的单调画面还是耳目一新的。如果重启后进入GRUB引导画面时图像严重失真，无背景或黑屏，则证明修改grub.conf有错或图片没有转化正确。如果GRUB没有错误，进入系统后像上面那样使用less检查图像信息；如果进不去系统的话使用系统盘进入单用户模式，然后恢复grub.conf就行了。
<p style="TEXT-INDENT: 2em"><strong>多幅图片</strong>
<p style="TEXT-INDENT: 2em">下面谈一点高级话题。如果图片很多的话，就需要一个脚本来批量转换：
<p style="TEXT-INDENT: 2em"><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>#!/bin/bash2
            #usuage： ./convert.sh *.jpg
            #convert  *.jpg etc to *.xpm.gz
            IMAGE_PATH=/boot/grub/image
            CURRENT=`pwd`
            for parm
            do
            for i in `ls -1 $IMAGE_PATH | wc -l`
            do
            /usr/bin/convert -geometry 640x480 -colors 14
            $CURRENT/$parm $IMAGE_PATH/$i.xpmg
            zip -9 $IMAGE_PATH/$i.xpm rm -f
            $CURRENT/$parm
            done
            done</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p style="TEXT-INDENT: 2em">把上面的脚本命名为convert.sh，然后放在/boot/grub/image下，使用下面的命令：
<p style="TEXT-INDENT: 2em"><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>＃ln -s /boot/grub/image/convert.sh /bin/chgbimg</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p style="TEXT-INDENT: 2em">这样每次在批量转换图像前先进入被转换的图像所在目录再执行chgbimg *.jpg就行了。如果/boot和/bin不在相同的分区上，可以使用下面的命令：
<p style="TEXT-INDENT: 2em"><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>＃export chgbimg=/boot/grub/image/convert.sh
            ＃echo 'chgbimg=/boot/grub/image/convert.sh' &gt;&gt; ~/.bashrc</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p style="TEXT-INDENT: 2em">与上述方法有同样的效果，不过使用时要这样：
<p style="TEXT-INDENT: 2em"><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>$chgbimg *.jpg。</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p style="TEXT-INDENT: 2em">可以更换的图片多了，随之而来的问题就是手动修改grub.conf所带来的麻烦和危险性。快速、安全和方便才是目标。我们再写一个脚本：
<p style="TEXT-INDENT: 2em"><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code># ~/.bash_logout
            GB_PATH=/boot/grub
            IMAGE_NUM_PLUS=`ls -1 $GB_PATH/image | wc -l`
            N_TEMP=`cat /proc/uptime | awk '{print $1}' | awk -F. '{print $1}'`
            N=`expr $N_TEMP % \( $IMAGE_NUM_PLUS - 1 \) + 1`
            mv -f ${GB_PATH}/grub.conf ${GB_PATH}/grub.conf.bak</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p style="TEXT-INDENT: 2em">上述脚本可能有点复杂，简单地解释一下IMAGE_NUM_PLUS计算了可供使用的图片数量，但是这个目录里还有个convert.sh，所以实际数量会减1。convert.sh放在这里的一个原因是放在这里比放在别处更容易理解;另一个原因是下一个要放在这个目录里的新图片的序号应该是当前图片数加1，convert.sh放在这里正好补足了这个误差。N是为了产生随机数，因为图片序号是N.xpm.gz，每次N都增1的话不免有些规律性，所以使用开机时间作为随机种子。最后使用sed找到要修改的文本并替换掉。 这样内容保存在~/.bash_logout中，这样就做到了每次的GRUB的引导画面都不相同。好了，快享受一下这一番劳动成果所带来的喜悦吧。 </p>
<img src ="http://www.cnitblog.com/libocumt/aggbug/43975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/libocumt/" target="_blank">TimeLord</a> 2008-05-20 18:20 <a href="http://www.cnitblog.com/libocumt/articles/43975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>引导程序之争：LILO、GRUB</title><link>http://www.cnitblog.com/libocumt/articles/43966.html</link><dc:creator>TimeLord</dc:creator><author>TimeLord</author><pubDate>Tue, 20 May 2008 06:17:00 GMT</pubDate><guid>http://www.cnitblog.com/libocumt/articles/43966.html</guid><description><![CDATA[<span class=a14c id=zoom>&nbsp;
<p style="TEXT-INDENT: 2em">从普通的桌面用户到 Linux&#174; 系统管理员，大部分 Linux 用户都使用过一种名为引导加载程序的工具。此类工具的不同变种会提供不同层次的支持和功能。在很多情况下，Linux 发行版默认安装的引导加载程序并不总是适合需要；每个引导加载程序的默认设置也是如此。在本文中，Laurence Bonney 讨论了两个流行的引导加载程序 —— LILO 和 GRUB —— 的优点和缺点，并建议了很多配置，以充分发掘机器的潜力。
<p style="TEXT-INDENT: 2em">在不考虑他们的工作或专业情况下，所有 Linux 用户都会使用的是哪个工具？引导加载程序。通过本文了解引导加载程序的工作原理，认识两个流行的引导加载程序 LILO（LInux LOader）和 GNU GRUB（GRand Unified Boot loader）， 并研究两者各自的优点和缺点。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">什么是引导加载程序？
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">最简单地讲，引导加载程序（boot loader） 会引导操作系统。当机器引导它的操作系统时，BIOS 会读取引导介质上最前面的 512 字节（即人们所知的 主引导记录（master boot record，MBR））。在单一的 MBR 中只能存储一个操作系统的引导记录，所以当需要多个操作系统时就会出现问题。所以需要更灵活的引导加载程序。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">主引导记录本身要包含两类内容 —— 部分（或全部）引导加载程序以及分区表（其中包含有关于介质其余部分如何划分为分区的信息）。当 BIOS 引导时，它会寻找硬盘驱动器第一个扇区（MBR）中存储的数据；BIOS 使用存储在 MBR 中的数据激活引导加载程序。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">由于 BIOS 只能访问很少量的数据，所以大部分引导加载程序分两个阶段进行引导。在引导的第一个阶段中，BIOS 引导一部分引导加载程序，即 初始程序加载程序（initial program loader，IPL）。IPL 查询分区表，从而能够加载位于不同介质上任意位置的数据。首先通过这步操作来定位第二阶段引导加载程序（其中包含加载程序的其余部分）。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">第二阶段引导加载程序是引导加载程序的主体；很多人认为这才是引导加载程序的真正部分。它包含有加载程序更需要磁盘空间的部分，比如用户界面和内核引导程序。从简单的命令行到绘声绘色的 GUI，这些用户界面的范围很广泛。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">引导加载程序通常配置为两种方式的其中之一：要么是作为主引导加载程序（primary boot loader），要么是作为二级引导加载程序（secondary boot loader）。主引导程序 是安装在 MBR 上的第一阶段引导加载程序（见先前的描述）。 二级引导加载程序 是安装在可引导分区的第一阶段引导加载程序。必须在 MBR 上安装单独的引导加载程序，并配置它将控制权转交给二级引导加载程序。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">很多较新的 Linux 引导加载程序特别实用，因为它们提供了不同程度的交互，比如高级的 GUI 和加密的口令，以及通过选择操作系统进行引导的能力。这样，可以在具有多个物理磁盘的同一机器上共存多个操作系统。这种设置越来越常见，因为它帮助很多用户在安装新的 Linux 时，能够保留先前由 Windows&#174; 机器所生成的宝贵数据资料。我个人认为这种设置非常美妙；只使用一台机器就可同时拥有 Linux 和 Windows。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">随着时间的推移，引导加载程序已经得到了增强，为用户引入了大量的功能。各个引导程序的功能和配置存在差异，但基本的目标是相同的。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">现在来看两个较为流行的引导加载程序：LILO 和 GRUB。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">LILO
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">LInux LOader（LILO） 已经成为所有 Linux 发行版的标准组成部分。作为一个 较老的/最老的 Linux 引导加载程序，它那不断壮大的 Linux 社区支持使它能够随时间的推移而发展，并始终能够充当一个可用的现代引导加载程序。有一些新的功能，比如增强的用户界面，以及对能够突破原来 1024-柱面限制的新 BIOS 功能的利用。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">虽然 LILO 仍在不断地发展，但 LILO 工作原理的基本概念保持不变。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">使用 LILO 作为引导加载程序
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">要使用 LILO 作为引导加载程序，需要做的事情取决于是要进行全新安装还是要让已经安装的 Linux 改为使用 LILO。如果是要进行全新安装，那么直接跳转到 配置 LILO 那一节。如果已经安装了某个 Linux 发行版，那么通常可以选择安装并配置 LILO（并可以将机器引导到新的 Linux 安装）。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">要将现有的 Linux 迁移到 LILO，首先必须获得最新版本的 LILO（见 参考资料）。在做任何其他事情之前，建议您确保在手边拥有一张 Linux 引导盘 —— 如果偶而弄错了某些地方，它可以提供很大的帮助，能够恢复到初始的 Linux 配置！将 LILO 安装到系统中之后，让它接管 MBR 非常简单。以 root 用户身份输入：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"># /sbin/lilo -v -v
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">这将使用当前的 LILO 默认值，抹去 MBR 中当前所有内容。不过，请阅读 配置 LILO，以确保能够按预期引导起来。也要注意，如果想要在同一机器上运行 Windows 和 Linux，那么应该先安装 Windows OS，然后再安装 Linux OS，这样，在 Linux 安装中所选择的引导加载程序就不会被 Windows 引导加载程序所覆盖。与 Linux 引导加载程序不同，多数 Window 引导加载程序不支持引导 Linux。如果已经先安装了 Linux，那么只需要自己创建一张 Linux 引导盘，这样就可以在安装完 Windows 之后，回到 Linux 安装中并重写 MBR。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">配置 LILO
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">LILO 的配置都是通过位于 /etc/lilo.conf 的一个配置文件来完成的。清单 1 给出了一个示例配置，使用的是我的家用机器，支持 Linux 和 Windows 机器的双重引导。了解我的工作站的基本配置，就可以想像出这些配置是如何与实际机器相关联的：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">主 HDD（物理磁盘 1）上安装了 Windows XP（最初机器上只有它）。在 Linux 术语中，这个 HDD 是 /dev/hda（在 GRUB 术语中是 hd0,0）。
<p style="TEXT-INDENT: 2em">从 HDD（物理磁盘 2）上安装了 Red Hat Linux；root 分区位于这个硬盘驱动器的第三个分区，即 /dev/hdb3（在 GRUB 术语中是 hd1,3）。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">清单 1. lilo.conf 示例文件
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">boot=/dev/hda
<p style="TEXT-INDENT: 2em">map=/boot/map
<p style="TEXT-INDENT: 2em">install=/boot/boot.b
<p style="TEXT-INDENT: 2em">prompt
<p style="TEXT-INDENT: 2em">timeout=100
<p style="TEXT-INDENT: 2em">compact
<p style="TEXT-INDENT: 2em">default=Linux
<p style="TEXT-INDENT: 2em">image=/boot/vmlinuz-2.4.18-14
<p style="TEXT-INDENT: 2em">label=Linux
<p style="TEXT-INDENT: 2em">root=/dev/hdb3
<p style="TEXT-INDENT: 2em">read-only
<p style="TEXT-INDENT: 2em">password=linux
<p style="TEXT-INDENT: 2em">other=/dev/hda
<p style="TEXT-INDENT: 2em">label=WindowsXP
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">清单 1 中的选项：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">boot= 行告诉 LILO 在哪里安装引导加载程序。在上面的示例中，将把它安装到第一块硬盘的 MBR。也可以选择将 LILO 安装到 /dev/hdb3（示例中的 Linux 分区），这样需要向 /dev/hda 安装另一个引导加载程序，并令其指向 LILO 引导加载程序；然后只需要让 LILO 作为二级引导加载程序。通常，引导加载程序应该位于 /dev/hda。还可以将这个参数指向软盘驱动器（最常见的是 /dev/fd0），来制做 LILO 软盘引导磁盘。
<p style="TEXT-INDENT: 2em">map= 指向引导期间 LILO 内部使用的映射文件。当使用 /sbin/lilo 命令安装 LILO 时，它会自动生成这个文件，其中包含有描述符表（还有其他内容）。建议不要改动这个文件！
<p style="TEXT-INDENT: 2em">install= 是 LILO 在引导过程中内部使用的文件之一。它同时包含有引导加载程序的主要部分和二级部分。boot.b 文件的一个片段被写入到 MBR（引导加载程序的主要部分），它会指向那个映射，接下来指向二级引导加载程序。同样，不要改动它！
<p style="TEXT-INDENT: 2em">prompt= 告诉 LILO 使用用户界面（本例中给出了两个选择 —— Linux 和 WindowsXP）。除了使用 prompt/user 界面以外，在适当情况下还可以为 Linux 内核等指定具体的参数。如果不在配置文件中指定此选项，那么 LILO 将引导到默认的 OS，不发生任何用户交互，也不会等待。（但是请注意，如果在引导时按下了 SHIFT，那么还是可以得到提示，当不想把引导加载程序暴露给普通用户时，这非常有用）。
<p style="TEXT-INDENT: 2em">timeout= 是引导提示在自动引导默认 OS（本例中是 Linux）之前的等待时间（以十分之一秒为单位）。如果在 lilo.conf 没有指定 prompt，那么这个参数就会被忽略。
<p style="TEXT-INDENT: 2em">compact 选项可以大大加速引导过程，它会将连续的读磁盘的请求合并为一个单独的请求。不过，这可能是一件祸福参半的事情，因为我在论坛上看到过很多贴子提到了关于此选项的问题。当希望从软盘引导时，这个选项尤其有用。
<p style="TEXT-INDENT: 2em">default= 选项告诉 LILO 默认使用哪个映像进行引导，比如在等待超时之后。这与 lilo.conf 文件中的某个映像的标签相关联。如果没有在配置文件中指定此选项，那么它将引导文件中指定的第一个映像。
<p style="TEXT-INDENT: 2em">对于允许用户引导到的每一个 Linux 版本，都应该指定 image= 及以下三个选项。image 选项指定希望引导到的内核版本。
<p style="TEXT-INDENT: 2em">label= 标明了在运行期间希望能够从用户界面引导的不同 OS。另外，这个标签用于指定引导的默认 OS。（注意：标签名称中避免出现空格；否则，引导那个文件时会出现无法预期的错误。）
<p style="TEXT-INDENT: 2em">root= 告诉 LILO OS 文件系统实际所在的位置。在我们的示例中为 /dev/hdb3，即第二块硬盘上的第三个分区。
<p style="TEXT-INDENT: 2em">read-only 告诉 LILO 以只读的方式初始引导到文件系统。OS 一旦完全引导起来，就会以读写方式挂载。
<p style="TEXT-INDENT: 2em">password= 允许您为将要引导到的特定 OS 设置口令。不幸的是，这个口令是以可读文本的方式保存在 lilo.conf 文件中，所以，所有人都能够读取它。如果需要，还可以对想要引导自的每个操作系统设置口令（在我们的示例中，只为 Linux 的引导设置了一个口令）。
<p style="TEXT-INDENT: 2em">other= 的动作类似于 image 和 root 选项的组合，但是用于除了 Linux 以外的其他操作系统。在我们的示例中，它告诉 LILO 到哪里去找到 Windows OS（位于第一块硬盘的第一个分区）。如果先安装 Windows，后安装 Linux，通常会是这样。
<p style="TEXT-INDENT: 2em">label= 与所有其他 label 选项相同。
<p style="TEXT-INDENT: 2em">在 lilo.conf 文件中可以使用很多其他参数，不过清单 1 中的参数就足以让机器可用了。要获得关于 lilo.conf 的这些以及其他参数的进一步资料，请参考手册页（man lilo.conf）。由于在引导时不会读取 lilo.conf，所以，当这个文件有改动时，需要&#8220;更新&#8221;MBR。如果不完成此步骤就重新引导，那么对 lilo.conf 的修改不会在启动中反映出来。与先前将 LILO 写入 MBR 类似，需要运行：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">$ /sbin/lilo -v -v
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">-v -v 标记会为您给出非常详细的输出。当像我们那样运行 LILO 时，有很多参数可以指定。参阅手册页以获得更进一步的信息（man lilo）。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">初始引导过程
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">当 LILO 初始引导时，它会按次序打印出每个字母 —— L-I-L-O。如果所有字母都显示出来，那么第一阶段引导就成功了。缺少任何内容都表示出现了问题：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">L：第一阶段引导加载程序已经被加载。如果 LILO 停止在这里，那么是在引导第二阶段引导加载程序时出现了问题。这通常会伴随有一个错误代码。在这个阶段的常见问题是介质问题，或者在 lilo.conf 文件中指定了不正确的磁盘参数。
<p style="TEXT-INDENT: 2em">LI：第二阶段引导加载程序已经被加载。LILO 在此处停止表示第二阶段引导加载程序不能被执行。同样，这可能是因为出现了与只显示 L 类似的问题：正在加载，或者因 boot.b 文件被破坏、移动或删除而不能加载。
<p style="TEXT-INDENT: 2em">LIL：第二阶段引导加载程序正在被执行。此时，可能会再次出现介质问题，或者映射文件（如 lilo.conf 文件中所指定的）在寻找描述符表时可能会出现问题。
<p style="TEXT-INDENT: 2em">LIL?：加载到与上面相同的阶段。这通常意味着加载第二阶段引导加载程序使用了错误的地址，最常见的原因是 boot.b 所在的位置与 lilo.conf 文件所指定的不同。
<p style="TEXT-INDENT: 2em">LIL-：加载到与上面相同的阶段。加载描述符表时出现问题，最常见的原因是描述符表错误。
<p style="TEXT-INDENT: 2em">LILO：LILO 成功被加载，没有出现任何错误。
<p style="TEXT-INDENT: 2em">引导时的附加配置
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">LILO 被成功加载后，将看到 LILO 提示符。还是使用前面的示例 lilo.conf 文件，此时将有两个选择，可能对 LILO 新手来说并不直观。首先，可以让 LILO 超时（10 秒后），这将引导 /dev/hdb3，即 Linux 分区。另外，可以按下 TAB 键，这将列出将要引导的操作系统选项。在我们的示例 lilo.conf 中，将得到的选项是 &#8220;Linux&#8221; 和 &#8220;Windows&#8221;。输入哪一个，就会引导到哪个 OS。指定加载 Linux 选项，会提示输入一个口令，在本例中是 linux。如果输入的口令有误，则会返回 LILO 提示符。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">不幸的是，LILO 不支持引导期间的交互式配置，所以，只能在 lilo.conf 中或者运行 /sbin/lilo 时指定选项。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">关于第一次尝试 LILO 的最后一点建议是：我发现使用软盘引导磁盘比使用硬盘实现 LILO 配置更为安全。为此，必须在 lilo.conf 文件中使用 boot=/dev/fd0 替换 boot=/dev/hda。那样，如果弄乱了 lilo.conf 文件中的任何配置，都可以取出引导磁盘并像先前一样引导到 Linux。当使用软盘进行引导一切正常以后，可以将 lilo.conf 修改回 boot=/dev/hda，然后最后一次运行 /sbin/lilo 来上传修改。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">GNU GRUB
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">近来，GRand Unified Boot loader（通常称为 GRUB）似乎要取代 LILO 在引导加载程序方面的统治地位。GNU GRUB 基于原来的 GRUB 程序（最初由 Erich Stefan Boleyn 所创建），正在由自由软件基金会（Free Software Foundation）进行积极开发。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">使用 GRUB 作为引导加载程序
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">与使用 LILO 相同，使用 GRUB 作为活动的引导加载程序所需要的步骤，取决于是安装全新的 OS 还是已经安装了 Linux 并计划转移到 GRUB。如果是进行全新安装，那么可以直接跳转到 配置 GRUB 那一节。如果已经安装了某个 Linux 发行版，那么通常可以选择安装并配置 GRUB（并可以将机器引导到新的 Linux 安装）。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">计划迁移到 GRUB 的当前 Linux 用户需要去获得最新版本的 GRUB（见 参考资料）。同样，与 LILO 相同，在做任何其他事情之前，需要在手边准备一张 Linux 引导盘。使用交互模式（后面将描述）则不需要这张磁盘，不过最好拥有一张以备急需时使用。将 LILO 安装到系统中之后，让它接管 MBR 非常简单。以 root 用户身份输入：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"># /boot/grub/grub
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">这样将加载一个类似于 BASH 的命令提示符，可以在这里使用 GRUB 命令：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">grub&gt; install (hd1,3)/boot/grub/stage1 (hd0) (hd1,3)/boot/grub/stage2 p (hd1,3)/boot/grub/menu.conf
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">这个命令使用了 GRUB 安装命令，需要为它给出第一阶段映像的位置以及 MBR 的位置（install (hd1,3)/boot/grub/stage1 (hd1)）。也要给出第二阶段映像的位置（(hd1,3)/boot/grub/stage2）。最后，可选项 p (hd1,3)/boot/grub/menu.conf 告诉 GRUB GUI 菜单配置文件的位置。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">在前面的示例中，hd1 是我的 Linux Disk，hd0 是我的 Windows 磁盘。这样将使用当前 GRUB 默认值，并抹去 MBR 中当前所有内容（请阅读 配置 GRUB，以确保能够按预期引导起来）。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">配置 GRUB
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">GRUB 的配置都是通过位于 /boot/grub/grub.conf 的一个配置文件来完成的。清单 2 给出了一个示例配置，使用的是我的家用机器，支持 Linux 和 Windows 机器的双重引导：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">清单 2. grub.conf 示例文件
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">default=0
<p style="TEXT-INDENT: 2em">timeout=10
<p style="TEXT-INDENT: 2em">splashimage=(hd1,3)/grub/splash.xpm.gz
<p style="TEXT-INDENT: 2em">password --md5 $1$opeVt0$Y.br.18LyAasRsGdSKLYlp1
<p style="TEXT-INDENT: 2em">title Red Hat Linux
<p style="TEXT-INDENT: 2em">password --md5 $1$0peVt0$Y.br.18LyAasRsGdSKLYlp1
<p style="TEXT-INDENT: 2em">root (hd1,3)
<p style="TEXT-INDENT: 2em">kernel /vmlinuz-2.4.18-14 ro root=LABEL=/
<p style="TEXT-INDENT: 2em">initrd /initrd-2.4.18-14.img
<p style="TEXT-INDENT: 2em">title Windows XP
<p style="TEXT-INDENT: 2em">password --md5 $1$0peVt0$Y.br.18LyAasRsGdSKLYlp1
<p style="TEXT-INDENT: 2em">rootnoverify (hd0,0)
<p style="TEXT-INDENT: 2em">chainloader +1
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">清单 2 中的选项：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">default= 选项通知 GRUB 在超时之后默认使用哪个映像进行引导。这一选项与 grub.conf 文件中的某个映像相关联。 0 表示指定了第一个，1 表示指定了第二个，依次类推。如果没有在配置文件指定此选项，那么它将引导文件中指定的第一个映像。
<p style="TEXT-INDENT: 2em">timeout= 是在自动引导默认 OS（在本例中是 Red Hat Linux）之前引导提示会等待多少秒。
<p style="TEXT-INDENT: 2em">splashimage= 是用作 GRUB GUI 背景的图片所在的位置。
<p style="TEXT-INDENT: 2em">password 选项指定了使用 MD5 加密的口令，用于访问 GRUB 的交互式引导选项。注意，这不会阻止用户选择引导已经定义的 OS；需要为 每一个 -title 设置它。为了生成一个 md5 口令，请运行 GRUB 所附带的 grub-md5-crypt 工具（以 root 身份）。它将提示输入一个希望加密的口令。然后输出使用 MD5 加密的口令。将这个口令拷贝到 grub.conf 中 password -md5 之后，但是要在同一行上。通常这个口令可以设置为 root 口令，因为无论如何也只有 root 才可以读取 grub.conf 文件。
<p style="TEXT-INDENT: 2em">title 标明了在运行期间能够从用户界面引导的具体 OS。与 LILO 不同，在这个名称中可以有空格。
<p style="TEXT-INDENT: 2em">password 的设置方式与前面的 password 相同。如果计划与其他用户共享此机器，那么不要将这个口令设置为 root 口令。
<p style="TEXT-INDENT: 2em">root 告诉 GRUB OS 文件系统的实际位置。可见，GRUB 引用介质的方式与 LILO 不同。在 LILO 示例中， /dev/hdb3 是第二块硬盘中的第三个分区。Grub 将此硬盘引用为（hd1,3），即第二块硬盘的第三个分区（disk 0 是第一块硬盘）。
<p style="TEXT-INDENT: 2em">kernel：vmlinuz-X.X.XX-XX 是 root 目录中默认引导映像的名称。
<p style="TEXT-INDENT: 2em">initrd：initrd-X.X.XX-XX.img 是 root 目录中默认 initrd 映像的名称。
<p style="TEXT-INDENT: 2em">title 与所有其他 title 选项相同。
<p style="TEXT-INDENT: 2em">password：见其他口令选项。
<p style="TEXT-INDENT: 2em">rootnoverify 告诉 GRUB 不要尝试去改变 OS 的 root。这样，当文件系统不被 GRUB 所支持时，不会出现引导错误。
<p style="TEXT-INDENT: 2em">chainloader +1 告诉 GRUB 使用一个链式加载程序来加载这个 OS，加载 Windows 时需要这个选项。
<p style="TEXT-INDENT: 2em">在 grub.conf 文件中可以使用很多其他参数，不过清单 2 中的参数就足以让机器可用了。要获得关于 grub.conf 的这些以及其他参数的进一步资料，请参考手册页（man grub.conf）。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">与 LILO 的配置文件不同，grub.conf 会在引导时被读取，当被修改时不必去更新 MBR。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">初始引导过程
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">与 LILO 类似，当 GRUB 初始加载时，从 MBR 加载第一阶段程序。加载后，它进入第一阶段和第二阶段引导加载程序之间的中间阶段（为了方便讨论，可称为第 1.5 阶段）。之所以存在第 1.5 阶段，是为了能够对 /boot/grub 中的 GRUB 配置文件进行常规的文件系统访问，而不是去访问磁盘块。然后进入引导加载程序的第二阶段，GRUB 加载 grub.conf 文件。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">现在应该能够看到 GRUB GUI 了。对于熟悉 Windows 的用户来说，这看起来感觉比 LILO 更友好。不过，不要因为 GRUB 拥有 GUI 就认为它是一个不能处理数据的引导加载程序。可选项多得惊人。（见 引导时的附加配置 中的提示。）
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">如果像我那样配置，那么现在应该能看到屏幕中有两个选项：引导到 Red Hat Linux 或者引导到 Windows XP。默认情况下，它将加载 Linux。选择任意一个的结果不言而喻。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">现在来看一些好东西。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">引导时的附加配置
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">在 GRUB GUI 中，按下任何键都会停止超时的计时。然后按下 P 键，可以输入 GRUB 口令，并获得对 GRUB 交互式引导选项的完全访问权限。按下以下其中一个键，应该能够使用三个选项之中的一个：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">要在引导之前编辑命令，请按下 E。这将让您能够为当前选中的 OS 编辑具体的选项。GRUB 只会显示出与那个 OS 的引导相关的选项，然后您可以恰当地进行编辑。当为 root 文件系统指定了错误的 HDD 时，这尤其有用。如果需要以单用户模式访问机器（不需要指定口令就能够让您获得 root 访问权限!），那么在 GRUB 主屏幕上选择 Linux OS。然后与前面一样，按下 E，并移到内核那一行（在我的示例中是 kernel /vmlinuz-2.4.18-14 ro root=LABEL=/）。然后在那一行最后添加 single，并按下 B 来使用修改过的 grub.conf 进行引导。在编辑模式下所做的任何修改都不会保存到 grub.conf 文件中。
<p style="TEXT-INDENT: 2em">要修改内核参数，请按下 A。如果您是一位经验丰富的 Linux 用户，可以根据需要调整内核参数。
<p style="TEXT-INDENT: 2em">要获得类似于 BASH 的命令行界面，请按下 C。这个小型的命令行界面允许您在系统中查找 GRUB 配置文件，加载另外的配置文件，编辑配置文件中的行，以及直接输入 GRUB 命令。如果配置的变化（比如删除了某个分区）让系统无法引导，那么可能会用到这个界面。如果需要将系统引导为单用户模式，或者要让运行级别为 3 而不是普通的运行级别，也可能会使用到它。
<p style="TEXT-INDENT: 2em">这些选项有很多用途，但超出了本文的范围。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">可见，GRUB 真正开放了引导期间的可能性。不过，这可能是一件好坏参半的事情，因为 GRUB 也潜在地允许攻击者在 OS 加载之前访问系统。会被误用的主要开放领域是：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">访问单用户模式。所有加载到单用户模式的人都会得到 root 访问权限，使得 Linux 可被随意滥用。
<p style="TEXT-INDENT: 2em">访问其他操作系统。任何配置为不需要口令的可引导操作系统，比如 DOS，都将是开放的。
<p style="TEXT-INDENT: 2em">访问 GRUB 编辑器。这允许用户获得修改 GRUB 配置的完全访问权限。
<p style="TEXT-INDENT: 2em">在 GRUB 配置中，设置安全性非常重要；设置口令，并使用 MD5 加密，可以保证整个系统的安全。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">GRUB 的未来
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">GRUB 将要被 GRUB2 所取代。原来的 GRUB 将要被重新命名为 GRUB Legacy；除了修复 bug 以外，不会再对它进行积极开发。GRUB2 将是对原来 GRUB 的完全重写。到目前为止，以下特性是变化的核心部分：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">通过创建压缩的核心映像取代了第 1.5 阶段
<p style="TEXT-INDENT: 2em">支持核心映像的动态加载
<p style="TEXT-INDENT: 2em">争取让整个 GRUB 框架成为面向对象的
<p style="TEXT-INDENT: 2em">支持国际化，比如 非-ASCII 字符集
<p style="TEXT-INDENT: 2em">支持不同硬件体系结构和不同平台（不同于 Linux 的平台）
<p style="TEXT-INDENT: 2em">请参考 GRUB Web 站点（见下面的 参考资料 部分）以了解最新的进展。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">GRUB 与 LILO 的比较
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">如本文开始处所述，所有引导加载程序都以类似的方式工作，满足共同的目的。不过，LILO 和 GRUB 之间有很多不同之处：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">LILO 没有交互式命令界面，而 GRUB 拥有。
<p style="TEXT-INDENT: 2em">LILO 不支持网络引导，而 GRUB 支持。
<p style="TEXT-INDENT: 2em">LILO 将关于可以引导的操作系统位置的信息物理上存储在 MBR 中。如果修改了 LILO 配置文件，必须将 LILO 第一阶段引导加载程序重写到 MBR。相对于 GRUB，这是一个更为危险的选择，因为错误配置的 MBR 可能会让系统无法引导。使用 GRUB，如果配置文件配置错误，则只是默认转到 GRUB 命令行界面。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">结束语
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">与所有软件相同，对某个用户来说是最好的选择，并不是对所有人来说都是最好的。至于这里所涉及的两个引导加载程序，我个人喜欢的是 GNU GRUB。它是一个非常好的全面的加载程序，组合了灵活的用户界面和大量的功能。但是，还有很多使用过并忠爱 LILO 的人仍然选择 LILO 作为引导加载程序。幸运的是，如果您刚刚开始接触 Linux 引导加载，使用哪个都不会有太大问题。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">关于安全性，任何可以接触到引导磁盘/CD 的人，只需要使用没有设置安全性的 grub.conf 或 lilo.conf，就可以绕过本文中提及的所有安全措施。特别是使用 GRUB 时，因为能够引导到单用户模式，所以是一个严重的安全漏洞。解决此问题的一个简单方法是在机器的 BIOS 中禁止通过 CD 和软盘进行引导，并确保为 BIOS 设置了一个口令，使得其他人不能修改这些设置。</p>
</span>
<img src ="http://www.cnitblog.com/libocumt/aggbug/43966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/libocumt/" target="_blank">TimeLord</a> 2008-05-20 14:17 <a href="http://www.cnitblog.com/libocumt/articles/43966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GRUB基本使用介绍</title><link>http://www.cnitblog.com/libocumt/articles/43965.html</link><dc:creator>TimeLord</dc:creator><author>TimeLord</author><pubDate>Tue, 20 May 2008 05:53:00 GMT</pubDate><guid>http://www.cnitblog.com/libocumt/articles/43965.html</guid><description><![CDATA[GRUB是一个多重开机管理工具，它可用来激活Linux、BSD、OS/2、BeOS与Windows95/98/NT等众多操作系统，GRUB是一个独立于操作系统之外的开机程序，并不像LILO是依靠Linux才能进行设定与维护，也提供了类似Bash的命令列模式，让使用者更方便地设定GRUB。 <br>　　<br>　　取得与安装GRUB： <br>　　<br>　　GRUB的原始码压缩档可至GNU的ftp站台( ftp://alpha.gnu.org/gnu/GRUB/ )下载最新版本 ，下载回来后可存放在/usr/local/src/目录下并将其解压缩： <br>　　<br>　　cp grub.tar.gz /usr/local/src/ <br>　　<br>　　tar zxvf grub.tar.gz <br>　　<br>　　在GRUB的目录下执行configure文件、make与make install，如下： <br>　　<br>　　./configure <br>　　<br>　　make <br>　　<br>　　make install <br>　　<br>　　当make install完成后GRUB也已顺利安装完毕，并有三个指令文件也被安装至系统中：grub、grub-install与mbchk。而GRUB的相关档案通常被安装到/usr/local/share/grub的目录下。 <br>　　<br>　　接下来先假设硬盘分割如下： <br>　　<br>　　hda1：Windows98 (hd0,0) <br>　　<br>　　hda2：Slackware Linux (hd0,1) <br>　　<br>　　hdb1：Mandrake Linux (hd1,0) <br>　　<br>　　注意的是GRUB认硬盘的方式跟Linux是不一样的，在Linux中第一颗IDE硬盘是hda(SCSI：sda)以此类推，而GRUB则将第一颗IDE硬盘视为hd0(SCSI：sd0)以此类推；在Linux中第一颗IDE硬盘的第一个分割区是hda1(SCSI：sda1)以此类推，而GRUB将第一颗IDE硬盘的第一个分割区表示为hd0,0(SCSI：sd0,0)以此类推。 <br>　　<br>　　制作GRUB激活磁盘： <br>　　<br>　　制作GRUB激活磁盘其实不难，首先需要两个必备档案，分别是stage1与stage2，可以在GRUB的安装目录下的i386-pc目录中找到这两个档案，以及一片已格式化的干净磁盘，然后依照下面的制作步骤就可制作出GRUB的激活磁盘： <br>　　<br>　　cd /usr/local/share/grub/i386-pc/ <br>　　<br>　　dd if=stage1 of=/dev/fd0 bs=512 count=1 <br>　　<br>　　dd if=stage2 of=/dev/fd0 bs=512 seek=1 <br>　　<br>　　制作好了GRUB的开机磁盘之后，就可以试着使用GRUB来进行多重操作系统的开机激活。 <br>　　<br>　　利用GRUB开机磁盘激活系统： <br>　　<br>　　接着重新激活系统并设定BIOS由磁盘开机，然后就可以看到grub&gt;的命令列正等待指令，这就是GRUB的命令列环境，表示GRUB已顺利地从激活磁盘加载并正常运作当中了。现在假设要激活上述的Slackware Linux的话，在GRUB提示符号下键入如下的指令，如此就会进入Slackware Linux系统： <br>　　<br>　　grub&gt; root (hd0,1) <br>　　<br>　　grub&gt; kernel /boot/vmlinuz root=/dev/hda2 ro <br>　　<br>　　grub&gt; boot <br>　　<br>　　root指令会mount后面参数的硬盘分割区位置。当mount完成后kernel指令会加载其参数的系统核心，Linux的核心通常是在/boot目录下名为vmlinuz的档案。最后的两个参数都是要传给刚加载的核心，root=/dev/hda2是告诉核心根目录的位置是在/dev/hda2，并要求挂载成只读(ro)。 <br>　　最后执行boot指令以进行Slackware系统的开机激活。同理，位在hdb1上的Mandrake Linux也可以用类似的方式激活： <br>　　<br>　　grub&gt; root (hd1,0) <br>　　<br>　　grub&gt; kernel /boot/vmlinuz root=/dev/hdb1 ro <br>　　<br>　　grub&gt; boot <br>　　<br>　　现在root指令改mount (hd1,0)的分割区，此分割区就是Mandrake Linux的根目录位置。然后kernel指令加载Mandrake的核心文件，告诉核心Mandrake系统的根目录是在/dev/hdb1，并要求挂载成只读。最后以boot指令进行系统的激活。 <br>　　<br>　　以上的方式都可以顺利地激活Linux系统，但是对Windows系统可是不管用的，要激活在hda1上的Windows98的话，则要换些指令才行得通，请在GRUB命令列中依序键入下列指令就可以进入Windows98： <br>　　<br>　　grub&gt; rootnoverify (hd0,0) <br>　　<br>　　grub&gt; chainloader +1 <br>　　<br>　　grub&gt; makeactive <br>　　<br>　　grub&gt; boot <br>　　<br>　　以rootnoverity指令让GRUB不要mount (hd0,0)的分割区，只要知道待会是要激活此分割区上的操作系统。chainloader +1的意思是指定此分割区上的第一个扇区来做激活。makeactive指令是要在此分割区上设定active的旗标，只要是Windows的操作系统都是要这么做的。最后以boor指令进行开机。 <br>　　<br>　　使用硬盘上的GRUB开机激活： <br>　　<br>　　GRUB的开机磁盘固然方便好用，但制作GRUB开机磁盘的目的只在于系统救援之用，要能确实享用GRUB的强大功能，最好是可以用硬盘上的GRUB来进行开机，就像LILO一样安装到硬盘的MBR上。 <br>　　<br>　　首先要在系统上建立GRUB专用的开机目录/boot/grub，如同制作GRUB的开机磁盘一样须要stage1文件和stage2檔，所以请把GRUB安装目录下的i386-pc目录中的stage1文件和stage2檔copy到刚刚建立的/boot/grub目录底下： <br>　　<br>　　mkdir /boot/grub <br>　　<br>　　cp /usr/local/share/grub/i386-pc/stage* /boot/grub <br>　　<br>　　完成之后键入指令GRUB指令进入GRUB命令列环境，在GRUB命令列环境里键入如下的指令： <br>　　<br>　　grub&gt; root (hd0,2) <br>　　<br>　　grub&gt; setup (hd0) <br>　　<br>　　grub&gt; quit <br>　　<br>　　如此即可完成GRUB在/boot/grub中的开机设定，先用root指令mount目录/boot/grub所在的位置，其中的(hd0,2)就是指上面假设的Slackware系统，也就是说/boot/grub目录是在Slackware系统中所建立的。所若是要改成由Windows98来放置GRUB的stage档的话，就要在Windows98的系统上建立/boot/grub的目录，并将stage1檔和stage2檔存放在Windows98上的\boot\grub目录里，而root指令的参数也要改为Windows98所在的分割区，也就是上面假设的(hd0,0)。第二个指令setup是指要将GRUB安装在哪个位置来开机激活，如果是要安装到硬盘的MBR上的话只须加上硬盘的位置如(hd0)，若是要安装到硬盘第一个分割区上的第一个扇区的话就要加上分割区的位置如(hd0,0)。 <br>　　<br>　　除非是有特殊的情况，不然最好是装在硬盘的分割区上较安全。最后使用quit指令离开GRUB命令列环境。 <br>　　<br>　　使用选项清单： <br>　　<br>　　现在虽然可以用GRUB来做多重开机的管理，但每次都要输入繁杂的指令也不方便，因此GRUB也提供了选项清单的方式，让每次开机时只须按上下键选择要开机的系统再按下Enter键即可进行开机而不必再输入任何的指令。GRUB在开机时会先寻找/boot/grub目录下的menu.lst档，找到的话GRUB就会依照menu.lst文件的内容显示一个选项清单的图形接口，让使用者选择要开机的操作系统。 <br>　　<br>　　首先在/boot/grub目录下建立一个新档名为menu.lst，底下是menu.lst文件的设定范例： <br>　　<br>　　#/boot/grub/menu.lst <br>　　<br>　　timeout 30 <br>　　<br>　　default 0 #Default Slackware Linux <br>　　<br>　　fallback 1 #Windows98 <br>　　<br>　　fallback 2 #Mandrake Linux <br>　　<br>　　color light-green/brown blink-red/blue <br>　　<br>　　# For booting Slackware Linux <br>　　<br>　　title Slackware <br>　　<br>　　root (hd0,1) <br>　　<br>　　kernel /boot/vmlinuz root=/dev/hda2 ro <br>　　<br>　　#For booting Windows <br>　　<br>　　title Windows98 <br>　　<br>　　rootnoverify (hd0,0) <br>　　<br>　　chainloader +1 <br>　　<br>　　makeactive <br>　　<br>　　#For booting Mandrake Linux <br>　　<br>　　title Mandrake <br>　　<br>　　root (hd1,1) <br>　　<br>　　kernel /boot/vmlinuz root=/dev/hdb1 ro <br>　　<br>　　上面menu.lst文件的范例是针对之前所假设的硬盘分割区上配置的操作系统而设定的。menu.lst是以#符号当作注解的开头，GRUB会忽略所有以#符号启始的注解行。timeout指令是指GRUB激活之后的等待时间，以秒为单位，所以上面的范例就是等待30秒的意思。default指令就是当GRUB激活之后等待的时间超过指令timeout所设定的时间的话，就会指令default后面参数所指定的系统，参数0代表menu.lst文件中第一个被设定的操作系统，以上面的范例而言就是指Slackware Linux，因为它是最先被设定的，如果参数改为1的话就是激活Windows98，以此类推。fallback指令是指当GRUB激活指令default所指定的操作系统失败的话，便会激活指令fallback所指定的操作系统，以上面的范例而言，当Slackware激活失败的话GRUB就会激活fallback所指定的便是Windows98。指令color可以设定GRUB选项清单的前景/背景的颜色，有关GRUB可以指定的颜色可以查看GRUB的info文件。接下来的指令就是设定操作系统，指令title可以设定该操作系统的标题。<br>　　<br>　　设定好menu.lst文件后，将此设定文件存在/boot/grub目录底下即可，然后重新开机便会看到GRUB漂亮的选项清单，现在就可以试着激活不同的操作系统了。 <br>　　<br>　　以上是GRUB的基本使用说明，当硬盘上有许多的操作系统时，使用GRUB是理所当然的，并且是正确的选择，就算硬盘上只有一两种操作系统也可以使用GRUB。当然GRUB的功能是很强大的，已足以取代传统的LILO，可以多阅读GRUB的info文件里面的说明。
<img src ="http://www.cnitblog.com/libocumt/aggbug/43965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/libocumt/" target="_blank">TimeLord</a> 2008-05-20 13:53 <a href="http://www.cnitblog.com/libocumt/articles/43965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lilo配置攻略</title><link>http://www.cnitblog.com/libocumt/articles/43948.html</link><dc:creator>TimeLord</dc:creator><author>TimeLord</author><pubDate>Tue, 20 May 2008 03:42:00 GMT</pubDate><guid>http://www.cnitblog.com/libocumt/articles/43948.html</guid><description><![CDATA[<font face=Verdana size=2>LILO（linux Loader）是Linux自带的一个优秀的引导管理器，使用它可以很方便地引导一台机器上的多个操作系统。与其他常用的引导加载程序相比，LILO引导方式显得更具有艺术性，对其深入的理解，将有助于我们方便地处理多操作系统、网络引导、大硬盘及大内存等诸多棘手的问题。<br>　　通常我们谈到LILO，会涉及到两个方面——LILO引导程序和LILO安装命令/sbin/lilo。为了不至于混淆这两个概念，本文将用LILO表示LILO引导程序，而lilo表示/sbin/lilo。<br><br>　　一般地，LILO使用一个文本文件/etc/lilo.conf作为其配置文件。lilo读取lilo.conf，按照其中的参数将特定的LILO写入系统引导区。任何时候，修改了/etc/lilo.conf，都必须重新运行lilo命令，以保证LILO正常运行。lilo.conf使用的配置参数很多，配置起来也相当复杂。下面以RedHat linux为例作一些初步探讨，RedHat的lilo程序包版本为0.20，别的Linux发行版本可能会有所出入，但不会太大。<br><br>　　lilo.conf文件中的配置参数分为两部分，一部分是全局参数，另一部分是引导映像参数。与linux系统其他的配置文件一样，&#8220;#&#8221;号后的一行文字表示注释。<br><br>一、LILO的全局参数<br><br>　　全局参数是全程有效的，它可以出现在文件lilo.conf中的任何地方。以下是具体的参数项：<br>　　1.backup=backup-file<br>　　在装入LILO之前将原先的引导区备份到backup-file，而不是RedHat 缺省的/boot/boot.NNNN。也可以备份到一个设备上,如: /dev/null。注意：如果原先已有一个同名文件，该参数将被忽略。我们可通过这个备份恢复原先的引导扇区：<br>　　dd if=/boot/boot.NNNN of=/dev/hda bs=446 count=1<br>　 原先的MBR。（注：虽然boot.NNNN有512字节，但只能恢复前446字节到MBR。）<br>　　2.boot=boot-device<br>　　指定一个用于安装LILO的设备。通常LILO可安装在如下几个地方：<br>　　MBR：第一个硬盘的主引导区, 对应于/dev/hda、/dev/sda等。<br>　　Root:linux根分区的超级块（Super block）, 对应于/dev/hda1、/dev/hda2、/dev/hda5、/dev/sda1、/dev/sda5等。<br>　　Floppy:LILO安装在软盘上，对应于/dev/fd0。<br>　　不指定时,lilo缺省安装在根分区超级块上。<br>　　3.compact<br>　　该参数用于优化LILO，产生一个更小的&#8220;map&#8221;文件。如果在软盘上安装LILO，强烈推荐使用此参数。<br>　　4.default=name<br>　　指定缺省引导的操作系统。如default=dos 表示将label为DOS的系统作为缺省引导的操作系统。如不指定该参数，排在lilo.conf中的第一个操作系统将作为缺省操作系统。<br>　　5.delay=tsecs<br>　　在没有指定&#8220;prompt&#8221; 参数时，LILO将立即引导缺省的操作系统,&#8220;delay&#8221;参数在这之间插入一段延时，单位是1/10秒。<br>　　6.disk=device-name<br>　　为某些非标准硬盘定义参数。其内部还包括有几个可选的子参数。<br>　　bios=〈bios_device_code〉：　　设备号。十六进制数0x80表示第一硬盘；0x81表示第二硬盘，依此类推。<br>　　sectors=〈sectors〉：硬盘扇区数。<br>　　heads=〈heads〉：硬盘磁头数。<br>　　cylinders=〈cylinders〉：硬盘柱面数。受系统BIOS限制，柱面数必须在1024以内。<br>　　partition=〈partition_device〉：用于物理定位特殊硬盘上的分区，有一个子参数start。<br>　　start=〈partition_offset〉：每一分区的起始扇区。<br>　　例如：<br>　　disk = /dev/sda<br>　　bios=0x80<br>　　#指定SCSI硬盘为第一硬盘<br>　　 sectors = 32<br>　　 heads = 64<br>　　 cylinders=632<br>　　#硬盘参数为632/64/32<br>　　partition=/dev/sda1<br>　　start=2048<br>　　#第一分区起始扇区为2048<br>　　partition = /dev/sda2<br>　　start=204800<br>　　#第二分区起始扇区为204800<br>　　 partition = /dev/sda3<br>　　　　start = 500000<br>　　 partition = /dev/sda4<br>　　　　start = 900000<br>　　当机器上有两块硬盘，一块为SCSI硬盘，另一块为IDE硬盘时，LILO很有可能无法自动识别它们的主、从顺序，这时可进行如下设置：<br>　　disk = /dev/sda<br>　　 bios = 0x80<br>　　disk = /dev/hda<br>　　 bios = 0x81<br>　　#SCSI硬盘为主硬盘，IDE硬盘为从硬盘<br>　　该参数是为linux无法识别的硬盘准备的，一般Linux可以正确识别和使用大多数硬盘，除非最坏的情况，否则不用设置它。<br>　　7.force-backup=backup-file<br>　　类似&#8220;backup&#8221;参数，但是将覆盖原有的同名文件。<br>　　8.ignore-table<br>　　通知lilo忽略无效的硬盘分区表。<br>　　9.install=boot-sector<br>　　LILO实际上包含有几个部分，而这几部分都存放在/boot/boot.b文件中。如果忽略&#8220;install&#8221;参数，则lilo认为install=/boot/boot.b。<br>　　10.linear<br>　　产生用于替换硬盘sector/head/cylinder地址（硬盘几何参数）的linear扇区地址。linear地址在运行时产生并且不依赖于硬盘几何参数。某些SCSI硬盘和一些以LBA方式使用的IDE硬盘可能会需要使用这个参数。注意，在将LILO安装到软盘上时不能使用&#8220;linear&#8221;参数。<br>　　11.lock<br>　　出现LILO提示后立即按最近一次的引导映像启动计算机。也就是说，当我们在lilo.conf中加入了该参数，然后运行lilo安装LILO，再重新启动计算机，这时LILO会提示我们选择引导哪一种操作系统，这一选择将被LILO记录下来，即&#8220;锁定&#8221;，下次启动计算机时，LILO将忽略&#8220;delay&#8221;、&#8220;prompt&#8221;等参数及键盘输入而直接跳转到其&#8220;锁定&#8221;的操作系统。<br>　　12.map=map-file<br>　　指定map文件。 没有本项时缺省使用/boot/map，每次执行lilo命令都会产生一个新的map文件。<br>　　13.message=message-file<br>　　该命令用于指定一个包含注释信息的文件，该文件将在系统打印出字符串&#8220;LILO&#8221;之前显示。如果在LILO启动时想获取较多的信息，可以编辑一个文件，再使用该命令就可以了。文件中如果包含有ASCII码为0xFF的字符（Ctrl+L）则表示清屏。注意,文件的大小不能超过65535个字节。每次文件改变之后,都必须重新运行lilo命令重建map文件，以保证其正常显示。<br>　　14.optional<br>　　当用于启动的引导映像不存在时，该参数使lilo忽略它。这对用于测试一个不长期存在的linux核心是有用的。<br>　　15.password=password<br>　　为LILO设置口令保护，每次重新启动计算机提示用户输入口令。设置了口令后，建议将lilo.conf的文件属性改为600，以免让非root用户看到口令。<br>　　16.prompt<br>　　给出&#8220;boot:&#8221;提示，强制LILO等待用户的键盘输入，按下回车键则立即引导默认的操作系统，而按下Tab键则打印可供选择的操作系统。当&#8220;prompt&#8221;被设置而&#8220;timeout&#8221;没有被设置时，系统会一直处于等待状态而不引导任何操作系统。不设置该参数时，LILO不给出&#8220;boot:&#8221;提示而直接引导默认操作系统，除非用户按下了Shift、Ctrl、Alt三键中的任何一个。大多数情况下，如果你的硬盘上有多个操作系统，建议使用参数，它留给用户一个选择的余地。<br>　　17.restricted<br>　　与&#8220;password&#8221;联用，使&#8220;password&#8221;仅作用于在LILO提示后有命令行输入的时候。<br>　　18.serial=parameters<br>　　使用串行口控制。这将初始化指定的串口，并将使引导管理器能接受来自串口的输入。从串口发送一个中断信号相当于从控制台键盘上按下Shift键，它同样会被LILO捕捉到。如果不能保证来自串口的访问和控制台一样安全，比方说有一个modem连在串口上，建议为每个引导映像加上口令保护（password）。参数串有如下语法：<br>　　〈port〉[,〈bps〉[〈parity〉[〈bits〉]]]<br>　　〈port〉:数字表示的串口号，0表示COM1，其余类推。所有四个串口都可被使用。<br>　　〈bps〉:串口速率，支持110、 150、300、600、1200、2400、4800和 9600 bps，缺省值为2400bps。<br>　　〈parity〉:设置串口校验。一般情况下，LILO忽略奇偶校验。n表示无校验，e 表示偶校验，o 表示奇校验。<br>　　〈bits〉:字符位数，只能取7或8，缺省值是8。当有奇偶校验时只能取7。<br>　　如果设置了&#8220;serial&#8221;，即使没有设置&#8220;delay&#8221;，系统也会将&#8220;delay&#8221;项的值自动增加20。<br>　　19.timeout=tsecs<br>　　设置等待键盘输入的时长，单位是0.1秒。超过这段时间没有输入则为超时，系统将自动引导缺省的操作系统。如果不设置本参数，缺省的超时时间长度为无穷大。<br><br>二、引导映像参数<br><br>　　引导映像参数作用于每一个引导映像区。如果某一引导映像参数（例如：password）与全局参数的定义相抵触，则以该引导映像参数的定义为准，但仅限于该引导映像区。以下是具体参数项：<br>　　image=pathname<br>　　设置包含linux核心引导映像的文件或设备。<br>　　other=pathname<br>　　设置包含非linux操作系统，如DOS、SCO UNIX、Windows 95等系统引导映像的文件或设备。<br>　　range=start-end<br>　　如果&#8220;image&#8221;参数被设置为一个设备，则linux核心引导映像的存放范围必须被设置。<br>　　image = /dev/fd0<br>　　range = 1-512<br>　　# linux核心引导映像存放在软盘上的第一至512扇区<br>　　label=name<br>　　通过此参数来标识当前操作系统，即操作系统名。用户可通过在LILO提示后输入&#8220;标识&#8221;来决定引导哪一个操作系统。<br>　　alias=name<br>　　给当前操作系统起一别名。<br>　　lock<br>　　类似同名全局参数。<br>　　optional<br>　　类似同名全局参数。<br>　　password=password<br>　　类似同名全局参数。<br>　　restricted<br>　　类似同名全局参数。<br>　　以下两个参数项用于非linux操作系统：<br>　　loader=chain-loader<br>　　如果要引导第二块硬盘上的非linux操作系统或将LILO安装到软盘，这个参数是必需的。不指定时，缺省值是/boot/chain.b。如启动第二块硬盘上的MS-DOS或Windows 95，可定义loader=/boot/any_d.b；对于OS/2，则为loader=/boot/os2_d.b。<br>　　作为一个特殊的功能模块，any_d.b已不合时宜，在0.20版以后的lilo程序包中已不再包含它并将其功能整合进chain.b，os2_d.b亦有所变动。它们的功能可用如下语句代替。<br>　　例：<br>　　 other = /dev/hdb1<br>　　　　 loader = /boot/any_d.b<br>　　替换为：<br>　　 other = /dev/hdb1<br>　　　　 map-drive = 0x80<br>　　　　 to = 0x81<br>　　　　 map-drive = 0x81<br>　　　　 to = 0x80<br>　　对于os2_d.b:<br>　　 other = /dev/hdb1<br>　　　　 loader = /boot/os2_d.b<br>　　替换为：<br>　　 other = /dev/hdb1<br>　　 loader = /boot/os2_d.b<br>　　 map-drive = 0x80<br>　　　　　　 to = 0x81<br>　　 map-drive = 0x81<br>　　　　 to = 0x80<br>　　map-drive=〈bios_device_code〉<br>　　通知chain.b装入重映射软驱或硬驱的内存驻留驱动程序，使用它可以引导不同硬盘上的不同操作系统，条件只有一个， BIOS必须能访问硬盘。&#8220;map-drive&#8221;后跟有变量&#8220;TO=〈盘设备号〉&#8221;。实际上，&#8220;map-drive&#8221;起到了&#8220;软&#8221;交换两个软驱或硬驱主、从顺序的作用，避免了手工接线的麻烦。<br>　　例：交换软驱<br>　　　　 map-drive = 0<br>　　　　 to = 1<br>　　　　 map-drive = 1<br>　　　　 to = 0<br>　　交换硬驱（参看loader参数例）<br>　　table=device<br>　　指定包含非linux系统分区的主设备。举例来说，如果Windows 95在第一个IDE硬盘的第一个基本分区上，即/dev/hda1上，那么必须定义table=/dev/hda 。<br><br>三、核心参数<br>　　如果LILO引导的是linux系统，我们可用下面命令传递一些参数给Linux核心。除&#8220;literal&#8221;之外，它们也可用于全局参数区。<br>　　append=string<br>　　append传递一个特殊硬件的参数串string给linux系统的核心。它常用来配置一些Linux不能正确测试到的硬件设备。例如：<br>　　append = "hd=64,32,202"<br>　　通知linux核心，硬盘参数为64柱面、32磁头、202扇区。具体的参数串设置可参看/usr/doc/HOWTO/BootPrompt-HOWTO文件。<br>　　literal=string<br>　　类似于&#8220;append&#8221;，但它将撤消所有的其它核心参数（比如设置了root设备）。因为&#8220;literal&#8221;会不分青红皂白地撤消一些必需的、重要的参数,所以不能将它设置在全局参数区。<br>　　ramdisk=size<br>　　指定RAM盘的大小。size为零时不建立RAM盘。忽略此参数时，RAM盘大小由linux核心引导映像决定。<br>　　read-only<br>　　通知LILO以只读方式载入根文件系统。通常我们在检查根文件系统时需要将根文件系统以只读方式载入。linux系统在每次启动时也会将根文件系统以只读方式载入，待例行的文件系统检查后再将其重新载入为读写方式。<br>　　read-write<br>　　通知LILO以读写方式载入根文件系统。<br>　　root=root-device<br>　　指定被安装根文件系统硬盘分区设备。<br>　　vga=mode<br>　　指定引导linux系统时的VGA模式。有以下取值：<br>　　normal:常规80&#215;25文本模式<br>　　extended (or ext): 80&#215;50文本模式<br>　　ask: 引导时询问用户使用哪一种VGA模式，这时敲回车键将显示一个可分配的VGA模式表。<br>　　如果不指定VGA模式，系统将缺省地使用包含在系统核心里的VGA模式值。<br><br>四、lilo.conf配置实例<br>　　有了这些基础知识，我们可以很容易地按照自己的意图配置LILO。请看一个lilo.conf文件的例子：<br>　　boot=/dev/hda　　　　　　　　 #将LILO安装在MBR。LILO作为主引导管理器<br>　　message=/boot/message　　　　 #注释为/boot/message<br>　　compact　　　　　　　　　　　　 #产生一个更小的&#8220;map&#8221;文件<br>　　map=/boot/map　　　　　　　　 #指定&#8220;map&#8221;文件为/boot/map<br>　　install=/boot/boot.b<br>　　password=zhoudi　　　　　　　　 #设置口令<br>　　vga=normal　　　　　　　　　　 #80x25文本模式<br>　　linear　　　　　　　　　　　　 #使用&#8220;linear&#8221;地址<br>　　prompt　　　　　　　　　　　　 #提示用户键盘输入<br>　　timeout=50　　　　　　　　　　 #超时时长为5秒<br>　　default=dos　　　　　　　　　　#缺省引导label为dos的操作系统<br>　　#设定linux<br>　　image=/boot/vmlinuz-2.0.34-1<br>　　#设置linux核心引导映像<br>　　 label=linux　　　　　　　　 #标识为linux<br>　　 root=/dev/hda1　　　　　　 #设置根文件系统<br>　　 read-only　　　　　　　　　　#LILO以只读方式载入根文件系统<br>　　#设定MS-DOS或Windows 95<br>　　other=/dev/hda2　　　　　　　　 #DOS分区为第一个IDE硬盘的第二分区<br>　　 label=dos　　　　　　　　　　#标识为dos<br>　　 table=/dev/hda　　　　　　 #主设备为第一个IDE硬盘<br>　　#设定SCO UNIX<br>　　注意：SCO分区必须设为活动（active）分区并将LILO安装在MBR上。<br>　　other=/dev/hda3<br>　　 label=sco<br>　　 table=/dev/hda<br>　　这个例子中，LILO是作为主引导管理器来管理机器上所有操作系统的。LILO也可作为二级引导管理器，这只要将&#8220;boot&#8221;参数改为根分区就可做到。例如：<br>　　boot=/dev/hda1<br>　　以这种方式使用LILO时，linux根分区必须用DOS或Linux的fdisk程序将其设置为活动分区，并且这种方式只对硬盘主分区（不是扩展或逻辑分区）有效。<br>　　LILO还可以启动第二个以上的操作系统。在我的机器上有两块希捷硬盘，一块硬盘为8.4GB，另一块为1.2GB，都以LBA模式接在主IDE口上。8.4GB跳线为主盘，1.2GB跳线为从盘，linux核心很容易地就将它们辨认出来并能正常使用，1.2GB的硬盘上安装了MS-DOS 6.22。笔者是这样设置lilo.conf的：<br>　　disk=/dev/hda<br>　　 bios=0x80<br>　　#由于IDE硬盘存在双硬盘问题，所以当启动DOS系统时，会提示&#8220;无系统盘或系统盘错！&#8221;，需修改程序如下。<br>　　disk=/dev/hdb<br>　　 bios=0x81<br>　　boot=/dev/hda<br>　　map=/boot/map<br>　　install=/boot/boot.b<br>　　linear<br>　　prompt<br>　　timeout=50<br>　　default=dos<br>　　image=/boot/vmlinuz-2.2.11-1<br>　　 label=linux<br>　　 root=/dev/hda1<br>　　 read-only<br>　　other=/dev/hdb1<br>　　 label=dos<br>　　 map-drive = 0x80<br>　　　　　　to = 0x81<br>　　　　　　map-drive = 0x81<br>　　　　　　to = 0x80<br>　　#交换两硬盘主、从顺序<br>　　 table=/dev/hdb<br>　　配置好lilo.conf文件后，在root账户下执行lilo命令，新的LILO就被载入系统。上面第一个例子执行结果如下：<br>　　#lilo<br>　　Added linux<br>　　Added dos*<br>　　Added sco<br>　　（注：带*号的表示其为缺省操作系统）<br><br>五、LILO提示信息<br>　　LILO在运行时会给出一些提示信息，了解它的含义对我们正确配置lilo.conf或查找硬件错误是有帮助的。<br>　　当LILO装入它自己的时候，显示单词 &#8220;LILO&#8221;：每完成一个特定的过程显示一个字母。如果LILO在某个地方失败了，屏幕上就停留几个字母,以指示错误发生的地方。<br>　　注意，如果磁盘发生瞬间故障，可能会在第一个字母&#8220;L&#8221;后插入一些十六进制数字（磁盘错误码）。除非LILO停在那里并不停地产生错误码流，否则并不说明有严重问题。<br>　　没有提示： LILO没有安装或者安装LILO的分区没有被激活。<br>　　L〈错误码〉 ： LILO的第一部分已经被装入并运行了，但它不能装入第二部分的引导程序。两位数字的错误码指示问题的类型(参见&#8220;磁盘错误码&#8221;)，这种情况通常是在介质访问失败或硬盘参数错误。<br>　　LI： LILO第一部分正确但是第二部分执行时出错。这一般是硬盘参数有误或/boot/boot.b被移动后没有重新运行map安装程序。<br>　　LIL： LILO第二部分开始执行，但是不能从&#8220;map&#8221;文件中读取描述符表（ descriptor table）。 这通常是因介质错误或磁盘参数有误引起的。<br>　　LIL?： LILO在错误的地方加载。原因与&#8220;LI&#8221;大致相同。<br>　　LIL-：描述符表（descriptor table）错误。典型原因是硬盘几何参数微妙的不匹配或/boot/boot.b被移动而没有运行map安装程序。<br>　　LILO： LILO执行正确。<br>　　1010101010: 分区情况已经改变却没有重新安装LILO，另外，超频也可能会出这种情况。<br><br>六、磁盘错误码<br>　　0x00：&#8220;内部错误&#8221;。 由LILO扇区读取子程序产生。可能是因为被破坏的文件，重建map文件试试看。另一个原因也许是，当使用&#8220;linear&#8221;参数时去访问超出1024的柱面。<br>　　0x01：&#8220;非法命令&#8221;。这意味着LILO访问了BIOS不支持的硬盘。<br>　　0x02：&#8220;没找到地址标记&#8221;。通常是介质问题，多试几遍看看。<br>　　0x03：&#8220;写保护错&#8221;。 仅在写操作时出现。<br>　　0x04：&#8220;扇区未找到&#8221;。典型的原因是硬盘参数错误。<br>　　0x06：&#8220;激活顺序改变&#8221;。这应该是短暂的错误，再试一次。<br>　　0x07：&#8220;无效的初始化&#8221;。BIOS没有适当地初始化硬盘，热启动一次或许有帮助。<br><br>　　0x08：&#8220;DMA超出限度&#8221;。这不应当发生，重新启动。<br>　　0x09：&#8220;DMA试图越过64kB边界&#8221;。这不应当发生，建议忽略&#8220;compact&#8221;参数。<br>　　0x0C：&#8220;无效的介质&#8221;。这不应当发生，重新启动看看。<br>　　0x10：&#8220;CRC错误&#8221;。检测到介质错误。建议多启动几次，运行map安装程序，把map文件从坏块写到正常的介质上。<br>　　0x11：&#8220;ECC纠正成功&#8221;。读错误发生然后被纠正，但是LILO并不知道这个情况，终止了启动过程。<br>　　0x20：&#8220;控制器错误&#8221;。一般不应发生。<br>　　0x40：&#8220;定位失败&#8221;。这可能是介质问题，重新启动试试。<br>　　0x80：&#8220;磁盘超时&#8221;。磁盘或驱动器没有准备好。介质坏了或磁盘没有转，也有可能是从软盘启动而没有关上软驱门。<br>　　0xBB：&#8220;BIOS错误&#8221;。一般不应发生，如果反复发生，可考虑去掉&#8220;compact&#8221;参数或添加删除&#8220;linear&#8221;参数。<br>　　如果在写操作过程中发生错误，则在错误码前有个前缀&#8220;w&#8221;。尽管写错误并不影响启动过程，但它们暗示了系统中存在某种错误，建议重新配置LILO成只读格式(read-only)。<br>　　LILO的配置相当复杂，读者只有在实践中不断学习、摸索，勤于思考，才能用好LILO。</font><br>
<img src ="http://www.cnitblog.com/libocumt/aggbug/43948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/libocumt/" target="_blank">TimeLord</a> 2008-05-20 11:42 <a href="http://www.cnitblog.com/libocumt/articles/43948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】grub安装配置及使用汇总 </title><link>http://www.cnitblog.com/libocumt/articles/43943.html</link><dc:creator>TimeLord</dc:creator><author>TimeLord</author><pubDate>Tue, 20 May 2008 03:00:00 GMT</pubDate><guid>http://www.cnitblog.com/libocumt/articles/43943.html</guid><description><![CDATA[<p><strong></strong>&nbsp;</p>
(一)安装linux时安装grub.<br><br>　　安装redhat linux时会提示安装引导程式,假如选择grub为引导程式,建议把grub安装到硬盘的引导扇区MBR.grub 还能够引导其他操作系统，如 FreeBSD、NetBSD、OpenBSD、GNU HURD 和 DOS，连同 Windows 95、98、NT、2000、XP。<br><br>　　(二)grub的配置<br><br>　　一旦选择了grub为引导程式,下面我们来了解一下他的配置.<br><br>　　/boot/grub/grub.conf是grub产生一个引导选择菜单连同配置一些选项.下面是我的grub.conf:<br><br>　　#==========例子开始==========<br><br>　　# grub.conf generated by anaconda<br><br>　　#<br><br>　　# Note that you do not have to rerun grub after making changes to this file<br><br>　　# NOTICE: You have a /boot partition. This means that<br><br>　　# all kernel and initrd paths are relative to /boot/, eg.<br><br>　　# root (hd0,6)<br><br>　　# kernel /vmlinuz-version ro root=/dev/hda10<br><br>　　# initrd /initrd-version.img<br><br>　　#boot=/dev/hda<br><br>　　default=0<br><br>　　timeout=10<br><br>　　splashimage=(hd0,6)/grub/splash.xpm.gz<br><br>　　# --&gt; Redhat linux 8.0 &lt;--<br><br>　　title Red Hat linux (2.4.18-14)<br><br>　　root (hd0,6)<br><br>　　kernel /vmlinuz-2.4.18-14 ro root=LABEL=/<br><br>　　initrd /initrd-2.4.18-14.img<br><br>　　# --&gt; Microsoft Windows XP &lt;--<br><br>　　title Microsoft Windows XP<br><br>　　rootnoverify (hd0,0)<br><br>　　chainloader +1<br><br>　　#===========例子结束==========<br><br>　　配置选项解释:<br><br>　　以"#"开头的是注释行.<br><br>　　我这里有两个操作系统,分别是Red Hat linux和Microsoft Windows XP.<br><br>　　其中 timeout标识默认等待时间,我这配置为10秒,超过10秒用户还没作出选择的话,将自动选择默认的操作系统(我这里默认的是Redhat linux 8.0)<br><br>　　默认的操作系统是由default一项来控制的,default后的数字表明第几个是默认的,这里0表示第一个,1表示第二个.所以假如您想修改默认的操作系统,就修改default后的数字.<br><br>　　title一项是配置操作系统的名称,grub不支持中文(有点遗憾).<br><br>　　splashimage一项指定grub界面的背景图片,有兴趣的朋友能够修改grub的背景哦!<br><br>　　root (hd0,6)标识从第一个硬盘,第7个分区来启动搜索引导内核.注意这儿的root和linux的root分区不同,此root非彼root也!grub的硬盘标识方法和linux的有点不同.在linux中第一个主分区为hda1,第二个主分区为hda1,第一个逻辑分区为hda5,而在grub中是以(hdx,y)来标识的,如第一个主分区为(hd0,0)第一个逻辑分区为(hd0,1)依此类推.所以这儿root后面的是您的/boot所在分区标识.<br><br>　　知道了内核在哪儿，还要具体指出哪个文档是内核文档，这就是kernel的工作。<br><br>　　kernel /vmlinuz-2.2.18-14 ro root=LABEL=/.说明/boot/vmlinuz-2.2.18-14 就是要载入的内核。后面的都是传递给内核的参数。ro是以readonly的意思。注意我这里内核前面的路径是"/",因为我的boot单独分了一个区,假如您没有为boot单独分区,那么内核前面的路径就是"/boot".<br><br>　　initrd用来初始的linux image，并配置相应的参数<br><br>　　再来看一看windows的定义段吧。<br><br>　　这里，我添加了一项来引导 WindowsXP。要完成此操作，GRUB 使用了"链式装入器"(chainloader)。链式装入器从分区 (hd0,0) 的引导记录中装入 winXP 自己的引导装入器，然后引导他。这就是这种技术叫做链式装入的原因 -- 他创建了一个从引导装入器到另一个的链。这种链式装入技术能够用于引导任何版本的 DOS 或 Windows。假如您在电脑中装有win98,winme,win2k,winxp的话,chainloader会把引导权交和win的NTLoader来引导.<br><br>　　(三)Grub引导盘的制作<br><br>　　要制作引导盘，需执行一些简单的步骤。首先，在新的软盘上创建 ext2 文档系统。然后，将其安装，并将一些 GRUB 文档复制到该文档系统，最后运行 "grub" 程式，他将负责配置软盘的引导扇区。<br><br>　　将一张空盘插入 1.44MB 软驱，输入：<br><br>　　# mke2fs /dev/fd0<br><br>　　创建了 ext2 文档系统后，需要安装该文档系统：<br><br>　　# mount /dev/fd0 /mnt/floppy<br><br>　　现在，需要创建一些目录，并将一些关键文档（原先安装 GRUB 时已安装了这些文档）复制到软盘：<br><br>　　# mkdir /mnt/floppy/boot<br><br>　　# mkdir /mnt/floppy/boot/grub<br><br>　　# cp /boot/grub/stage1 /mnt/floppy/boot/grub<br><br>　　# cp /boot/grub/stage2 /mnt/floppy/boot/grub<br><br>　　再有一个步骤，就能得到可用的引导盘。<br><br>　　在linux bash中，从 root 用户运行"grub"，该程式很有趣并值得注意，因为他实际上是 GRUB 引导装入器的半功能性版本。尽管 linux 已启动并正在运行，您仍能够运行 GRUB 并执行某些任务，而且其界面和使用 GRUB 引导盘或将 GRUB 安装到硬盘 MBR 时看到的界面(即GRUB控制台)完全相同。<br><br>　　在 grub&gt; 提示符处，输入：<br><br>　　grub&gt; root (fd0)<br><br>　　grub&gt; setup (fd0)<br><br>　　grub&gt; quit<br><br>　　现在，引导盘完成了。<br><br>　　(四).恢复被windows破坏的grub.<br><br>　　假如您用grub来引导linux和windows,当windows出毛病重新安装后,会破坏MBR中的grub,这时需要恢复grub.<br><br>　　1.把linux安装光盘的第一张放到光驱，然后重新启动机器，在BOIS中把系统用光驱来引导。<br><br>　　2.等安装界面出来后，按［F4］键，也就是linux rescue模式。<br><br>　　3.一系列键盘连同几项简单的配制，过后就［继续］了。。。这个过程，我不说了，比较简单。<br><br>　　4.然后会出现这样的提示符:<br><br>　　sh#<br><br>　　5.我们就能够操作GRUB了.输入grub:<br><br>　　sh#grub<br><br>　　会出现这样的提示符:<br><br>　　grub&gt;<br><br>　　我们就能够在这样的字符后面，输入:<br><br>　　grub&gt;root (hdX,Y)<br><br>　　grub&gt;setup (hd0)<br><br>　　假如成功会有一个successful......<br><br>　　这里的X，假如是个盘，就是0，假如您所安装的linux的根分区在第二个硬盘上，那X就是1了；Y，就是装有linux系统所在的根分区。 setup (hd0)就是把GRUB写到硬盘的MBR上。<br><br>　　(五).用NTLoader来引导linux.<br><br>　　假如您在安装linux时没有选择安装grub,不必着急,现在我们来看看如何在安装linux后安装grub.并用windows的NTLoader来引导linux.<br><br>　　1. 安装grub<br><br>　　我用的grub是Redhat8.0带的grub安装包: grub-0.92-7.rpm<br><br>　　安装: rpm -ivh grub-0.92-7.rpm<br><br>　　其他安装方式也相同,只要您安装上grub就行了.RH8缺省用的grub, 1,2步骤能够省了.<br><br>　　2. 建立grub的环境<br><br>　　cp /usr/share/grub/i386-pc/* /boot/grub<br><br>　　3. 生成grub的配置文档/boot/grub/menu.conf<br><br>　　按照上面所讲的grub.conf来生成一个配置文档.<br><br>　　注意了, 这里我的linux在/dev/hda4,所以menu.conf那些分区位置为(hd0,3),<br><br>　　您的可能不相同了,不能完全照着"画瓢"噢! 下面第3步install的中的分区位置也应该和您的系统一致.<br><br>　　3. 安装grub至linux分区boot<br><br>　　将grub的stage1安装到/dev/hda4的boot扇区(hd0,3). 过程如下:<br><br>　　/sbin/grub (运行grub)<br><br>　　grub&gt; install (hd0,3)/boot/grub/stage1 d (hd0,3) (hd0,3)/boot/grub/stage2 p (hd0,3)/boot/grub/menu.conf<br><br>　　(注意,上面"grub&gt;"为grub的提示符,其后内容写在一行上.)<br><br>　　4. 取得grub的boot信息<br><br>　　过程如下:<br><br>　　dd if=/dev/hda4 of=/grub.lnx bs=512 count=1<br><br>　　这样得到grub的引导信息,只要用NT Loader来加载他就行了.<br><br>　　5. 将上面得到的grub.lnx弄到Windows的C盘根目录下<br><br>　　能够先把grub.lnx弄得软盘上,然后启动windows,拷贝到C:; 情况允许也能够直接在linux下拷贝到C:了. 我的C盘(即设备/dev/hda1)为FAT32, 能够直接从Linux下弄过去了. 如下:<br><br>　　mount -t vfat /dev/hda1 /mnt/c<br><br>　　cp /grub.lnx /mnt/c<br><br>　　umount /mnt/c<br><br>　　6. 修改NT Loader的boot.ini<br><br>　　在其中加入一行: C:grub.lnx="Redhat linux - GRUB"<br><br>　　加入后boot.ini的内容如下:<br><br>　　[boot loader]<br><br>　　timeout=15<br><br>　　default=C:oot.lnx<br><br>　　[operating systems]<br><br>　　multi(0)disk(0)rdisk(0)partition(1)WINDOWS="Microsoft Windows XP Professional" /fastdetect<br><br>　　[VGA mode]" /basevideo /sos<br><br>　　C:grub.lnx="Redhat linux - GRUB"<br><br>　　OK. 能够用NT Loader加载linux了, 其实上面过程基本上和用NT Loader加载LILO相同.其基本思想就是用NT Loader来加载LILO或grub的引导区(grub.lnx), 其中的关键就是LILO或grub的引导区的获取.<br><br>　　(六)活用grub的交互功能<br><br>　　grub具备强大的交互功能.学会了将会使您受益非浅!<br><br>　　1.grub没有显示菜单怎么办?<br><br>　　当开机后进入grub界面但没了菜单,只剩下一个grub&gt;提示符,怎么启动呢?别急,看下面:<br><br>　　grub&gt;cat (hd0,6)/boot/grub/grub.conf (为了看参数)<br><br>　　grub&gt;root (hd0,6)<br><br>　　grub&gt;kernel (hd0,6)/vmlinuz-2.4.18-14 ro root=LABEL=/<br><br>　　grub&gt;initrd (hd0,6)/initrd-2.4.18-14.img<br><br>　　grub&gt;boot<br><br>　　OK!启动了吧!以上有些数字要根据您的实际情况更改.<br><br>　　以上这个方法也能够用于测试新编译的内核.<br><br>　　2.进入单用户模式.<br><br>　　有时不小心把root用户密码忘了,只能进入单用户模式来重新配置root密码.方法如下:<br><br>　　开机进入grub界面,按C进入命令行模式,然后按照上面的方法进行,只是在第三步要在后面加入single参数<br>
<img src ="http://www.cnitblog.com/libocumt/aggbug/43943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/libocumt/" target="_blank">TimeLord</a> 2008-05-20 11:00 <a href="http://www.cnitblog.com/libocumt/articles/43943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】LILO与Grub简介</title><link>http://www.cnitblog.com/libocumt/articles/43122.html</link><dc:creator>TimeLord</dc:creator><author>TimeLord</author><pubDate>Wed, 30 Apr 2008 07:36:00 GMT</pubDate><guid>http://www.cnitblog.com/libocumt/articles/43122.html</guid><description><![CDATA[<p><span class=a14c id=zoom></p>
<p style="TEXT-INDENT: 2em">从普通的桌面用户到 Linux&#174; 系统管理员，大部分 Linux 用户都使用过一种名为引导加载程序的工具。此类工具的不同变种会提供不同层次的支持和功能。在很多情况下，Linux 发行版默认安装的引导加载程序并不总是适合需要；每个引导加载程序的默认设置也是如此。在本文中，Laurence Bonney 讨论了两个流行的引导加载程序 —— LILO 和 GRUB —— 的优点和缺点，并建议了很多配置，以充分发掘机器的潜力。
<p style="TEXT-INDENT: 2em">在不考虑他们的工作或专业情况下，所有 Linux 用户都会使用的是哪个工具？引导加载程序。通过本文了解引导加载程序的工作原理，认识两个流行的引导加载程序 LILO（LInux LOader）和 GNU GRUB（GRand Unified Boot loader）， 并研究两者各自的优点和缺点。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">什么是引导加载程序？
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">最简单地讲，引导加载程序（boot loader） 会引导操作系统。当机器引导它的操作系统时，BIOS 会读取引导介质上最前面的 512 字节（即人们所知的 主引导记录（master boot record，MBR））。在单一的 MBR 中只能存储一个操作系统的引导记录，所以当需要多个操作系统时就会出现问题。所以需要更灵活的引导加载程序。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">主引导记录本身要包含两类内容 —— 部分（或全部）引导加载程序以及分区表（其中包含有关于介质其余部分如何划分为分区的信息）。当 BIOS 引导时，它会寻找硬盘驱动器第一个扇区（MBR）中存储的数据；BIOS 使用存储在 MBR 中的数据激活引导加载程序。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">由于 BIOS 只能访问很少量的数据，所以大部分引导加载程序分两个阶段进行引导。在引导的第一个阶段中，BIOS 引导一部分引导加载程序，即 初始程序加载程序（initial program loader，IPL）。IPL 查询分区表，从而能够加载位于不同介质上任意位置的数据。首先通过这步操作来定位第二阶段引导加载程序（其中包含加载程序的其余部分）。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">第二阶段引导加载程序是引导加载程序的主体；很多人认为这才是引导加载程序的真正部分。它包含有加载程序更需要磁盘空间的部分，比如用户界面和内核引导程序。从简单的命令行到绘声绘色的 GUI，这些用户界面的范围很广泛。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">引导加载程序通常配置为两种方式的其中之一：要么是作为主引导加载程序（primary boot loader），要么是作为二级引导加载程序（secondary boot loader）。主引导程序 是安装在 MBR 上的第一阶段引导加载程序（见先前的描述）。 二级引导加载程序 是安装在可引导分区的第一阶段引导加载程序。必须在 MBR 上安装单独的引导加载程序，并配置它将控制权转交给二级引导加载程序。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">很多较新的 Linux 引导加载程序特别实用，因为它们提供了不同程度的交互，比如高级的 GUI 和加密的口令，以及通过选择操作系统进行引导的能力。这样，可以在具有多个物理磁盘的同一机器上共存多个操作系统。这种设置越来越常见，因为它帮助很多用户在安装新的 Linux 时，能够保留先前由 Windows&#174; 机器所生成的宝贵数据资料。我个人认为这种设置非常美妙；只使用一台机器就可同时拥有 Linux 和 Windows。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">随着时间的推移，引导加载程序已经得到了增强，为用户引入了大量的功能。各个引导程序的功能和配置存在差异，但基本的目标是相同的。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">现在来看两个较为流行的引导加载程序：LILO 和 GRUB。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">LILO
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">LInux LOader（LILO） 已经成为所有 Linux 发行版的标准组成部分。作为一个 较老的/最老的 Linux 引导加载程序，它那不断壮大的 Linux 社区支持使它能够随时间的推移而发展，并始终能够充当一个可用的现代引导加载程序。有一些新的功能，比如增强的用户界面，以及对能够突破原来 1024-柱面限制的新 BIOS 功能的利用。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">虽然 LILO 仍在不断地发展，但 LILO 工作原理的基本概念保持不变。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">使用 LILO 作为引导加载程序
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">要使用 LILO 作为引导加载程序，需要做的事情取决于是要进行全新安装还是要让已经安装的 Linux 改为使用 LILO。如果是要进行全新安装，那么直接跳转到 配置 LILO 那一节。如果已经安装了某个 Linux 发行版，那么通常可以选择安装并配置 LILO（并可以将机器引导到新的 Linux 安装）。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">要将现有的 Linux 迁移到 LILO，首先必须获得最新版本的 LILO（见 参考资料）。在做任何其他事情之前，建议您确保在手边拥有一张 Linux 引导盘 —— 如果偶而弄错了某些地方，它可以提供很大的帮助，能够恢复到初始的 Linux 配置！将 LILO 安装到系统中之后，让它接管 MBR 非常简单。以 root 用户身份输入：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"># /sbin/lilo -v -v
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">这将使用当前的 LILO 默认值，抹去 MBR 中当前所有内容。不过，请阅读 配置 LILO，以确保能够按预期引导起来。也要注意，如果想要在同一机器上运行 Windows 和 Linux，那么应该先安装 Windows OS，然后再安装 Linux OS，这样，在 Linux 安装中所选择的引导加载程序就不会被 Windows 引导加载程序所覆盖。与 Linux 引导加载程序不同，多数 Window 引导加载程序不支持引导 Linux。如果已经先安装了 Linux，那么只需要自己创建一张 Linux 引导盘，这样就可以在安装完 Windows 之后，回到 Linux 安装中并重写 MBR。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">配置 LILO
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">LILO 的配置都是通过位于 /etc/lilo.conf 的一个配置文件来完成的。清单 1 给出了一个示例配置，使用的是我的家用机器，支持 Linux 和 Windows 机器的双重引导。了解我的工作站的基本配置，就可以想像出这些配置是如何与实际机器相关联的：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">主 HDD（物理磁盘 1）上安装了 Windows XP（最初机器上只有它）。在 Linux 术语中，这个 HDD 是 /dev/hda（在 GRUB 术语中是 hd0,0）。
<p style="TEXT-INDENT: 2em">从 HDD（物理磁盘 2）上安装了 Red Hat Linux；root 分区位于这个硬盘驱动器的第三个分区，即 /dev/hdb3（在 GRUB 术语中是 hd1,3）。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">清单 1. lilo.conf 示例文件
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">boot=/dev/hda
<p style="TEXT-INDENT: 2em">map=/boot/map
<p style="TEXT-INDENT: 2em">install=/boot/boot.b
<p style="TEXT-INDENT: 2em">prompt
<p style="TEXT-INDENT: 2em">timeout=100
<p style="TEXT-INDENT: 2em">compact
<p style="TEXT-INDENT: 2em">default=Linux
<p style="TEXT-INDENT: 2em">image=/boot/vmlinuz-2.4.18-14
<p style="TEXT-INDENT: 2em">label=Linux
<p style="TEXT-INDENT: 2em">root=/dev/hdb3
<p style="TEXT-INDENT: 2em">read-only
<p style="TEXT-INDENT: 2em">password=linux
<p style="TEXT-INDENT: 2em">other=/dev/hda
<p style="TEXT-INDENT: 2em">label=WindowsXP
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">清单 1 中的选项：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">boot= 行告诉 LILO 在哪里安装引导加载程序。在上面的示例中，将把它安装到第一块硬盘的 MBR。也可以选择将 LILO 安装到 /dev/hdb3（示例中的 Linux 分区），这样需要向 /dev/hda 安装另一个引导加载程序，并令其指向 LILO 引导加载程序；然后只需要让 LILO 作为二级引导加载程序。通常，引导加载程序应该位于 /dev/hda。还可以将这个参数指向软盘驱动器（最常见的是 /dev/fd0），来制做 LILO 软盘引导磁盘。
<p style="TEXT-INDENT: 2em">map= 指向引导期间 LILO 内部使用的映射文件。当使用 /sbin/lilo 命令安装 LILO 时，它会自动生成这个文件，其中包含有描述符表（还有其他内容）。建议不要改动这个文件！
<p style="TEXT-INDENT: 2em">install= 是 LILO 在引导过程中内部使用的文件之一。它同时包含有引导加载程序的主要部分和二级部分。boot.b 文件的一个片段被写入到 MBR（引导加载程序的主要部分），它会指向那个映射，接下来指向二级引导加载程序。同样，不要改动它！
<p style="TEXT-INDENT: 2em">prompt= 告诉 LILO 使用用户界面（本例中给出了两个选择 —— Linux 和 WindowsXP）。除了使用 prompt/user 界面以外，在适当情况下还可以为 Linux 内核等指定具体的参数。如果不在配置文件中指定此选项，那么 LILO 将引导到默认的 OS，不发生任何用户交互，也不会等待。（但是请注意，如果在引导时按下了 SHIFT，那么还是可以得到提示，当不想把引导加载程序暴露给普通用户时，这非常有用）。
<p style="TEXT-INDENT: 2em">timeout= 是引导提示在自动引导默认 OS（本例中是 Linux）之前的等待时间（以十分之一秒为单位）。如果在 lilo.conf 没有指定 prompt，那么这个参数就会被忽略。
<p style="TEXT-INDENT: 2em">compact 选项可以大大加速引导过程，它会将连续的读磁盘的请求合并为一个单独的请求。不过，这可能是一件祸福参半的事情，因为我在论坛上看到过很多贴子提到了关于此选项的问题。当希望从软盘引导时，这个选项尤其有用。
<p style="TEXT-INDENT: 2em">default= 选项告诉 LILO 默认使用哪个映像进行引导，比如在等待超时之后。这与 lilo.conf 文件中的某个映像的标签相关联。如果没有在配置文件中指定此选项，那么它将引导文件中指定的第一个映像。
<p style="TEXT-INDENT: 2em">对于允许用户引导到的每一个 Linux 版本，都应该指定 image= 及以下三个选项。image 选项指定希望引导到的内核版本。
<p style="TEXT-INDENT: 2em">label= 标明了在运行期间希望能够从用户界面引导的不同 OS。另外，这个标签用于指定引导的默认 OS。（注意：标签名称中避免出现空格；否则，引导那个文件时会出现无法预期的错误。）
<p style="TEXT-INDENT: 2em">root= 告诉 LILO OS 文件系统实际所在的位置。在我们的示例中为 /dev/hdb3，即第二块硬盘上的第三个分区。
<p style="TEXT-INDENT: 2em">read-only 告诉 LILO 以只读的方式初始引导到文件系统。OS 一旦完全引导起来，就会以读写方式挂载。
<p style="TEXT-INDENT: 2em">password= 允许您为将要引导到的特定 OS 设置口令。不幸的是，这个口令是以可读文本的方式保存在 lilo.conf 文件中，所以，所有人都能够读取它。如果需要，还可以对想要引导自的每个操作系统设置口令（在我们的示例中，只为 Linux 的引导设置了一个口令）。
<p style="TEXT-INDENT: 2em">other= 的动作类似于 image 和 root 选项的组合，但是用于除了 Linux 以外的其他操作系统。在我们的示例中，它告诉 LILO 到哪里去找到 Windows OS（位于第一块硬盘的第一个分区）。如果先安装 Windows，后安装 Linux，通常会是这样。
<p style="TEXT-INDENT: 2em">label= 与所有其他 label 选项相同。
<p style="TEXT-INDENT: 2em">在 lilo.conf 文件中可以使用很多其他参数，不过清单 1 中的参数就足以让机器可用了。要获得关于 lilo.conf 的这些以及其他参数的进一步资料，请参考手册页（man lilo.conf）。由于在引导时不会读取 lilo.conf，所以，当这个文件有改动时，需要&#8220;更新&#8221;MBR。如果不完成此步骤就重新引导，那么对 lilo.conf 的修改不会在启动中反映出来。与先前将 LILO 写入 MBR 类似，需要运行：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">$ /sbin/lilo -v -v
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">-v -v 标记会为您给出非常详细的输出。当像我们那样运行 LILO 时，有很多参数可以指定。参阅手册页以获得更进一步的信息（man lilo）。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">初始引导过程
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">当 LILO 初始引导时，它会按次序打印出每个字母 —— L-I-L-O。如果所有字母都显示出来，那么第一阶段引导就成功了。缺少任何内容都表示出现了问题：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">L：第一阶段引导加载程序已经被加载。如果 LILO 停止在这里，那么是在引导第二阶段引导加载程序时出现了问题。这通常会伴随有一个错误代码。在这个阶段的常见问题是介质问题，或者在 lilo.conf 文件中指定了不正确的磁盘参数。
<p style="TEXT-INDENT: 2em">LI：第二阶段引导加载程序已经被加载。LILO 在此处停止表示第二阶段引导加载程序不能被执行。同样，这可能是因为出现了与只显示 L 类似的问题：正在加载，或者因 boot.b 文件被破坏、移动或删除而不能加载。
<p style="TEXT-INDENT: 2em">LIL：第二阶段引导加载程序正在被执行。此时，可能会再次出现介质问题，或者映射文件（如 lilo.conf 文件中所指定的）在寻找描述符表时可能会出现问题。
<p style="TEXT-INDENT: 2em">LIL?：加载到与上面相同的阶段。这通常意味着加载第二阶段引导加载程序使用了错误的地址，最常见的原因是 boot.b 所在的位置与 lilo.conf 文件所指定的不同。
<p style="TEXT-INDENT: 2em">LIL-：加载到与上面相同的阶段。加载描述符表时出现问题，最常见的原因是描述符表错误。
<p style="TEXT-INDENT: 2em">LILO：LILO 成功被加载，没有出现任何错误。
<p style="TEXT-INDENT: 2em">引导时的附加配置
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">LILO 被成功加载后，将看到 LILO 提示符。还是使用前面的示例 lilo.conf 文件，此时将有两个选择，可能对 LILO 新手来说并不直观。首先，可以让 LILO 超时（10 秒后），这将引导 /dev/hdb3，即 Linux 分区。另外，可以按下 TAB 键，这将列出将要引导的操作系统选项。在我们的示例 lilo.conf 中，将得到的选项是 &#8220;Linux&#8221; 和 &#8220;Windows&#8221;。输入哪一个，就会引导到哪个 OS。指定加载 Linux 选项，会提示输入一个口令，在本例中是 linux。如果输入的口令有误，则会返回 LILO 提示符。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">不幸的是，LILO 不支持引导期间的交互式配置，所以，只能在 lilo.conf 中或者运行 /sbin/lilo 时指定选项。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">关于第一次尝试 LILO 的最后一点建议是：我发现使用软盘引导磁盘比使用硬盘实现 LILO 配置更为安全。为此，必须在 lilo.conf 文件中使用 boot=/dev/fd0 替换 boot=/dev/hda。那样，如果弄乱了 lilo.conf 文件中的任何配置，都可以取出引导磁盘并像先前一样引导到 Linux。当使用软盘进行引导一切正常以后，可以将 lilo.conf 修改回 boot=/dev/hda，然后最后一次运行 /sbin/lilo 来上传修改。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">GNU GRUB
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">近来，GRand Unified Boot loader（通常称为 GRUB）似乎要取代 LILO 在引导加载程序方面的统治地位。GNU GRUB 基于原来的 GRUB 程序（最初由 Erich Stefan Boleyn 所创建），正在由自由软件基金会（Free Software Foundation）进行积极开发。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">使用 GRUB 作为引导加载程序
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">与使用 LILO 相同，使用 GRUB 作为活动的引导加载程序所需要的步骤，取决于是安装全新的 OS 还是已经安装了 Linux 并计划转移到 GRUB。如果是进行全新安装，那么可以直接跳转到 配置 GRUB 那一节。如果已经安装了某个 Linux 发行版，那么通常可以选择安装并配置 GRUB（并可以将机器引导到新的 Linux 安装）。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">计划迁移到 GRUB 的当前 Linux 用户需要去获得最新版本的 GRUB（见 参考资料）。同样，与 LILO 相同，在做任何其他事情之前，需要在手边准备一张 Linux 引导盘。使用交互模式（后面将描述）则不需要这张磁盘，不过最好拥有一张以备急需时使用。将 LILO 安装到系统中之后，让它接管 MBR 非常简单。以 root 用户身份输入：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"># /boot/grub/grub
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">这样将加载一个类似于 BASH 的命令提示符，可以在这里使用 GRUB 命令：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">grub&gt; install (hd1,3)/boot/grub/stage1 (hd0) (hd1,3)/boot/grub/stage2 p (hd1,3)/boot/grub/menu.conf
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">这个命令使用了 GRUB 安装命令，需要为它给出第一阶段映像的位置以及 MBR 的位置（install (hd1,3)/boot/grub/stage1 (hd1)）。也要给出第二阶段映像的位置（(hd1,3)/boot/grub/stage2）。最后，可选项 p (hd1,3)/boot/grub/menu.conf 告诉 GRUB GUI 菜单配置文件的位置。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">在前面的示例中，hd1 是我的 Linux Disk，hd0 是我的 Windows 磁盘。这样将使用当前 GRUB 默认值，并抹去 MBR 中当前所有内容（请阅读 配置 GRUB，以确保能够按预期引导起来）。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">配置 GRUB
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">GRUB 的配置都是通过位于 /boot/grub/grub.conf 的一个配置文件来完成的。清单 2 给出了一个示例配置，使用的是我的家用机器，支持 Linux 和 Windows 机器的双重引导：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">清单 2. grub.conf 示例文件
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">default=0
<p style="TEXT-INDENT: 2em">timeout=10
<p style="TEXT-INDENT: 2em">splashimage=(hd1,3)/grub/splash.xpm.gz
<p style="TEXT-INDENT: 2em">password --md5 $1$opeVt0$Y.br.18LyAasRsGdSKLYlp1
<p style="TEXT-INDENT: 2em">title Red Hat Linux
<p style="TEXT-INDENT: 2em">password --md5 $1$0peVt0$Y.br.18LyAasRsGdSKLYlp1
<p style="TEXT-INDENT: 2em">root (hd1,3)
<p style="TEXT-INDENT: 2em">kernel /vmlinuz-2.4.18-14 ro root=LABEL=/
<p style="TEXT-INDENT: 2em">initrd /initrd-2.4.18-14.img
<p style="TEXT-INDENT: 2em">title Windows XP
<p style="TEXT-INDENT: 2em">password --md5 $1$0peVt0$Y.br.18LyAasRsGdSKLYlp1
<p style="TEXT-INDENT: 2em">rootnoverify (hd0,0)
<p style="TEXT-INDENT: 2em">chainloader +1
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">清单 2 中的选项：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">default= 选项通知 GRUB 在超时之后默认使用哪个映像进行引导。这一选项与 grub.conf 文件中的某个映像相关联。 0 表示指定了第一个，1 表示指定了第二个，依次类推。如果没有在配置文件指定此选项，那么它将引导文件中指定的第一个映像。
<p style="TEXT-INDENT: 2em">timeout= 是在自动引导默认 OS（在本例中是 Red Hat Linux）之前引导提示会等待多少秒。
<p style="TEXT-INDENT: 2em">splashimage= 是用作 GRUB GUI 背景的图片所在的位置。
<p style="TEXT-INDENT: 2em">password 选项指定了使用 MD5 加密的口令，用于访问 GRUB 的交互式引导选项。注意，这不会阻止用户选择引导已经定义的 OS；需要为 每一个 -title 设置它。为了生成一个 md5 口令，请运行 GRUB 所附带的 grub-md5-crypt 工具（以 root 身份）。它将提示输入一个希望加密的口令。然后输出使用 MD5 加密的口令。将这个口令拷贝到 grub.conf 中 password -md5 之后，但是要在同一行上。通常这个口令可以设置为 root 口令，因为无论如何也只有 root 才可以读取 grub.conf 文件。
<p style="TEXT-INDENT: 2em">title 标明了在运行期间能够从用户界面引导的具体 OS。与 LILO 不同，在这个名称中可以有空格。
<p style="TEXT-INDENT: 2em">password 的设置方式与前面的 password 相同。如果计划与其他用户共享此机器，那么不要将这个口令设置为 root 口令。
<p style="TEXT-INDENT: 2em">root 告诉 GRUB OS 文件系统的实际位置。可见，GRUB 引用介质的方式与 LILO 不同。在 LILO 示例中， /dev/hdb3 是第二块硬盘中的第三个分区。Grub 将此硬盘引用为（hd1,3），即第二块硬盘的第三个分区（disk 0 是第一块硬盘）。
<p style="TEXT-INDENT: 2em">kernel：vmlinuz-X.X.XX-XX 是 root 目录中默认引导映像的名称。
<p style="TEXT-INDENT: 2em">initrd：initrd-X.X.XX-XX.img 是 root 目录中默认 initrd 映像的名称。
<p style="TEXT-INDENT: 2em">title 与所有其他 title 选项相同。
<p style="TEXT-INDENT: 2em">password：见其他口令选项。
<p style="TEXT-INDENT: 2em">rootnoverify 告诉 GRUB 不要尝试去改变 OS 的 root。这样，当文件系统不被 GRUB 所支持时，不会出现引导错误。
<p style="TEXT-INDENT: 2em">chainloader +1 告诉 GRUB 使用一个链式加载程序来加载这个 OS，加载 Windows 时需要这个选项。
<p style="TEXT-INDENT: 2em">在 grub.conf 文件中可以使用很多其他参数，不过清单 2 中的参数就足以让机器可用了。要获得关于 grub.conf 的这些以及其他参数的进一步资料，请参考手册页（man grub.conf）。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">与 LILO 的配置文件不同，grub.conf 会在引导时被读取，当被修改时不必去更新 MBR。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">初始引导过程
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">与 LILO 类似，当 GRUB 初始加载时，从 MBR 加载第一阶段程序。加载后，它进入第一阶段和第二阶段引导加载程序之间的中间阶段（为了方便讨论，可称为第 1.5 阶段）。之所以存在第 1.5 阶段，是为了能够对 /boot/grub 中的 GRUB 配置文件进行常规的文件系统访问，而不是去访问磁盘块。然后进入引导加载程序的第二阶段，GRUB 加载 grub.conf 文件。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">现在应该能够看到 GRUB GUI 了。对于熟悉 Windows 的用户来说，这看起来感觉比 LILO 更友好。不过，不要因为 GRUB 拥有 GUI 就认为它是一个不能处理数据的引导加载程序。可选项多得惊人。（见 引导时的附加配置 中的提示。）
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">如果像我那样配置，那么现在应该能看到屏幕中有两个选项：引导到 Red Hat Linux 或者引导到 Windows XP。默认情况下，它将加载 Linux。选择任意一个的结果不言而喻。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">现在来看一些好东西。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">引导时的附加配置
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">在 GRUB GUI 中，按下任何键都会停止超时的计时。然后按下 P 键，可以输入 GRUB 口令，并获得对 GRUB 交互式引导选项的完全访问权限。按下以下其中一个键，应该能够使用三个选项之中的一个：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">要在引导之前编辑命令，请按下 E。这将让您能够为当前选中的 OS 编辑具体的选项。GRUB 只会显示出与那个 OS 的引导相关的选项，然后您可以恰当地进行编辑。当为 root 文件系统指定了错误的 HDD 时，这尤其有用。如果需要以单用户模式访问机器（不需要指定口令就能够让您获得 root 访问权限!），那么在 GRUB 主屏幕上选择 Linux OS。然后与前面一样，按下 E，并移到内核那一行（在我的示例中是 kernel /vmlinuz-2.4.18-14 ro root=LABEL=/）。然后在那一行最后添加 single，并按下 B 来使用修改过的 grub.conf 进行引导。在编辑模式下所做的任何修改都不会保存到 grub.conf 文件中。
<p style="TEXT-INDENT: 2em">要修改内核参数，请按下 A。如果您是一位经验丰富的 Linux 用户，可以根据需要调整内核参数。
<p style="TEXT-INDENT: 2em">要获得类似于 BASH 的命令行界面，请按下 C。这个小型的命令行界面允许您在系统中查找 GRUB 配置文件，加载另外的配置文件，编辑配置文件中的行，以及直接输入 GRUB 命令。如果配置的变化（比如删除了某个分区）让系统无法引导，那么可能会用到这个界面。如果需要将系统引导为单用户模式，或者要让运行级别为 3 而不是普通的运行级别，也可能会使用到它。
<p style="TEXT-INDENT: 2em">这些选项有很多用途，但超出了本文的范围。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">可见，GRUB 真正开放了引导期间的可能性。不过，这可能是一件好坏参半的事情，因为 GRUB 也潜在地允许攻击者在 OS 加载之前访问系统。会被误用的主要开放领域是：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">访问单用户模式。所有加载到单用户模式的人都会得到 root 访问权限，使得 Linux 可被随意滥用。
<p style="TEXT-INDENT: 2em">访问其他操作系统。任何配置为不需要口令的可引导操作系统，比如 DOS，都将是开放的。
<p style="TEXT-INDENT: 2em">访问 GRUB 编辑器。这允许用户获得修改 GRUB 配置的完全访问权限。
<p style="TEXT-INDENT: 2em">在 GRUB 配置中，设置安全性非常重要；设置口令，并使用 MD5 加密，可以保证整个系统的安全。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">GRUB 的未来
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">GRUB 将要被 GRUB2 所取代。原来的 GRUB 将要被重新命名为 GRUB Legacy；除了修复 bug 以外，不会再对它进行积极开发。GRUB2 将是对原来 GRUB 的完全重写。到目前为止，以下特性是变化的核心部分：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">通过创建压缩的核心映像取代了第 1.5 阶段
<p style="TEXT-INDENT: 2em">支持核心映像的动态加载
<p style="TEXT-INDENT: 2em">争取让整个 GRUB 框架成为面向对象的
<p style="TEXT-INDENT: 2em">支持国际化，比如 非-ASCII 字符集
<p style="TEXT-INDENT: 2em">支持不同硬件体系结构和不同平台（不同于 Linux 的平台）
<p style="TEXT-INDENT: 2em">请参考 GRUB Web 站点（见下面的 参考资料 部分）以了解最新的进展。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">GRUB 与 LILO 的比较
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">如本文开始处所述，所有引导加载程序都以类似的方式工作，满足共同的目的。不过，LILO 和 GRUB 之间有很多不同之处：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">LILO 没有交互式命令界面，而 GRUB 拥有。
<p style="TEXT-INDENT: 2em">LILO 不支持网络引导，而 GRUB 支持。
<p style="TEXT-INDENT: 2em">LILO 将关于可以引导的操作系统位置的信息物理上存储在 MBR 中。如果修改了 LILO 配置文件，必须将 LILO 第一阶段引导加载程序重写到 MBR。相对于 GRUB，这是一个更为危险的选择，因为错误配置的 MBR 可能会让系统无法引导。使用 GRUB，如果配置文件配置错误，则只是默认转到 GRUB 命令行界面。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">结束语
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">与所有软件相同，对某个用户来说是最好的选择，并不是对所有人来说都是最好的。至于这里所涉及的两个引导加载程序，我个人喜欢的是 GNU GRUB。它是一个非常好的全面的加载程序，组合了灵活的用户界面和大量的功能。但是，还有很多使用过并忠爱 LILO 的人仍然选择 LILO 作为引导加载程序。幸运的是，如果您刚刚开始接触 Linux 引导加载，使用哪个都不会有太大问题。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">关于安全性，任何可以接触到引导磁盘/CD 的人，只需要使用没有设置安全性的 grub.conf 或 lilo.conf，就可以绕过本文中提及的所有安全措施。特别是使用 GRUB 时，因为能够引导到单用户模式，所以是一个严重的安全漏洞。解决此问题的一个简单方法是在机器的 BIOS 中禁止通过 CD 和软盘进行引导，并确保为 BIOS 设置了一个口令，使得其他人不能修改这些设置。(T002) </p>
</span>
<img src ="http://www.cnitblog.com/libocumt/aggbug/43122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/libocumt/" target="_blank">TimeLord</a> 2008-04-30 15:36 <a href="http://www.cnitblog.com/libocumt/articles/43122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>