|
沙发
楼主 |
发表于 2005-11-8 09:30:43
|
只看该作者
re:initrd在载入内核的过程之中...
initrd<br>
<br>
在载入内核的过程之中,都只会mount根目录/,而且一般只以readonly的方式挂接。为了更加方便接挂驱动之类,通常会使用虚拟磁盘(Ramdisk)来辅助实现,这就是initrd和linuxrc了。initrd映像会被一起载入,Linux内核系统会设置虚拟磁盘,并使用linuxrc这个程序的功能来进行模块的加载。完成加载驱动的工作之后,initrd所建立的虚拟磁盘就会被从内存之中去除了。Initrd并非必要的,不过现在的版本好像都有initrd。Linuxrc一般要符合以下条件:<br>
• 文件名必须是linuxrc<br>
• 放置在initrd的最顶层目录<br>
• 是可以被内核执行的<br>LILO<br>
<br>
如果按照之前的default安装,将会选定GRUB作为Bootloader,所以如果要使用LILO的话,需要自己安装LILO包。可以使用rpm命令安装。具体操作如下:<br>
将安装盘4装入CD-ROM<br>
$mount /mnt/cdrom<br>
$cd /mnt/cdrom/RedHat/RPMS<br>
$rpm –Uvh lilo*<br>
记住这只是LILO软件的安装,并不代表LILO已经安装至MBR或者Linux的分区。如果要将LILO安装成真正的Bootloader,(当然Linux安装过程已经帮我们做了这些事情)跟着以下步骤:<br>
第一步,编辑lilo的配置文件<br>
第二步,运行lilo命令。<br>
<br>
LILO的stage 1和stage 2的两个部分通过lilo命令都被写入了MBR或者是分区的启动扇区之中。<br>
<br>
Notes:<br>
Lilo命令的作用是读取LILO的配置文件(一般是/etc/lilo.conf,可在命令行指定),然后更新MBR或者分区启动扇区的引导纪录,在引导纪录之中包含了诸如内核文件,initrd文件的在硬盘位置之类的寻址资料,所以每次配置文件有变化,或者内核文件和initrd文件的任何可能移动都要重新运行lilo更新MBR或者启动扇区内的LILO引导纪录。Lilo命令和/etc/lilo.conf文件只是安装LILO的辅助工具。其实在PC启动过程之中是完全无用甚至是不可见的。<br>
<br>
配置文件的部分参数解释:<br>
<br>
全局参数:<br>
boot = /dev/hda # The boot device is /dev/had<br>
指定LILO安装的设备,如果是硬盘/dev/had这样的没有数字在后面的,会写入硬盘的MBR,如果是分区后面带有数字比如/dev/hda1,则只会写入分区的启动扇区。<br>
<br>
map = /boot/map # Save the map file as /boot/map<br>
<br>
指定map文件的位置,预设是 /boot/map<br>
<br>
install=boot-sector <br>
使用指定文件作为新的boot sector.预设是/boot/boot.b.<br>
password=password<br>
<br>
启动时候进入交互模式的访问密码。并未加密。<br>
<br>
default=name <br>
设定预设的启动image,如果没有设定将会按顺序的第一个。<br>
delay=tsecs <br>
进入default image的等待时间。1/10秒为单位,30表示3秒。<br>
message=message-file <br>
指定message文件。最大 65,535 bytes.<br>
prompt <br>
显示boot:命令行模式。<br>
linear <br>
生成并使用liner sector addresses寻址。<br>
Image选项:<br>
<br>
image=pathname <br>
指定Linux内核文件。<br>
label=name <br>
为image指定一个名称。如果没有指定就是文件名(不包括路径)<br>
alias=name <br>
还可以再指定一个别名。<br>
loader=chain-loader <br>
对于非Linux系统,可以指定下一个bootloader,预设是/boot/chain.b,这个预设的chain loader会交给other选项指定的设备,或者是第一个硬盘的活动分区的启动扇区。<br>
password=password <br>
image的密码。<br>
other=devicename<br>
非Linux系统,指定该系统的安装分区。<br>
内核Kernel选项:<br>
<br>
其中的append, read-only, read-write, root, 和vga 也可以作为全局参数配置。<br>
<br>
append=string <br>
会传送给内核的参数,比如BIOS无法识别大于64M内存时可以使用 append = "mem=128M"。<br>
initrd=filename <br>
指定initrd的ramdisk映像文件。<br>
noinitrd <br>
不使用ramdisk?<br>
root=root-device <br>
指定root分区。<br>
vga=mode <br>
<br>
VGA模式设定。<br>
<br>
read-only<br>
<br>
启动时以readonly方式mount根,这个只是启动第二阶段的根,不是最后我们所看到的根,一般都会使用read-only方式<br>
<br>
read-write<br>
<br>
启动时以read write方式mount根,这个只是启动第二阶段的根,不是最后我们所看到的根<br>
<br>
<br>
LILO配置文件示例:<br>
<br>
1、(摘自RHCE Red Hat Certified Engineer Linux Study Guide (Exam RH302), Fourth Edition):<br>
<br>
prompt <br>
timeout=50<br>
default=linux<br>
boot=/dev/hda<br>
map=/boot/map<br>
install=/boot/boot.b<br>
message=/boot/message<br>
linear<br>
<br>
image=/boot/vmlinuz-2.4.21-3<br>label=linux<br>initrd=/boot/initrd-2.4.21-3.img<br>read-only<br>append="hdc=ide-scsi root=LABEL=/" <br>
other=/dev/hda1<br>label=Win98<br>table=/dev/hda<br>
<br>
2、(摘自Linux in a Nutshell, 3rd Edition):<br>
<br>
prompt <br>
default=linux<br>
boot=/dev/hda<br>
install=/boot/boot.b <br>
map=/boot/map <br>
image=/boot/vmlinuz <br>label=linux <br>root=/dev/hda2 <br>read-only ## Image section: For testing a new Linux kernel image=/testvmlinuz <br>label=testlinux <br>root=/dev/hda2 <br>read-only <br>optional # Omit image if not available when map is<br>built ## Image section: For booting DOS <br>
other=/dev/hda1 <br>label=dos <br>loader=/boot/chain.b <br>table=/dev/hda # The current partition table ## Image section:<br>For booting Windows 95 <br>
other=/dev/hda1 <br>label=win95 <br>loader=/boot/chain.b <br>table=/dev/hda<br>
<br>
LILO的交互模式:<br>
<br>
有必要在这里介绍一下LILO的交互模式。可以进行配置(主要是内核参数)的调试。不过交互模式不会帮你修改配置文件,调试完成后需要自己更改配置文件并重新运行lilo更新MBR或者是相应的分区。<br>
• 如果设定了prompt , LILO总会停留在等待画面,等待用户的输入。如果你选择按CTRL+X进入text的命令行模式,你可以再指定内核参数。<br>
• 如果没有设定prompt,当出现 "LILO"的时候,按 Control, Shift,或者 Alt,就会到 boot:的text命令行模式。<br>
• 在boot:之下,你可以使用tab来选择image,就是之前的label名称,也可以输入。而且可以在后面增加参数。例如:boot:linux single<br>
以下参数可以在这时传送给内核:<br>
<br>
debug <br>
打印所有内核消息到console。<br>
hd=cylinders,heads,sectors <br>
指定硬盘参数。<br>
load_ramdisk=n <br>
<br>
指定多少个ram disk会传送给内核。<br>
<br>
mem=size <br>
指定内存参数。<br>
noinitrd <br>
如果设定后,不会进行the two-stage的启动,而且保留在/dev/initrd的内容,于是启动后还可见。<br>
number <br>
指定runlevel。<br>
ro <br>
Mount根为readonly。<br>
rw <br>
Mount根为read-write。如果没有制定ro或者rw,将会用rw方式。<br>
single <br>
启动单用户模式。对排错很有帮助。<br>
<br>GRUB<br>
<br>
GRUB同样支持菜单和命令行两种方式来控制启动。<br>
GRUB通过filesystem进行寻址并将内核读入内存。<br>
GRUB启动过程:<br>
1、 GRUB启动时会在/boot/grub/中寻找一个名字为menu.lst的配置文件<br>
2、 如果找不到此文件则不进入菜单模式而直接进入命令行模式。<br>
3、 找到文件后根据文件显示菜单<br>
4、 用户选择后,根据配置文件制定的路径加载内核<br>
5、 将控制交给Linux内核<br>
<br>
安装到MBR或者分区:<br>
<br>
GRUB的软件安装在这里就不做多讲了,这里讲讲如何重新安装GRUB到MBR或者某个分区。好比我一直使用LILO,现在我想换成GRUB了,需要做什么。<br>
方法一:<br>
$grub-install install_device<br>
方法二:<br>
$grub<br>
grub>setup install_device<br>
两种方法都可以有不同的选项。可以自行察看帮助文件。<br>
<br>
GRUB的文件系统规范<br>
<br>
GRUB支持FAT、FFS、minix、ext2 和 ReiserFS 分区。<br>
GRUB之中的的一些约定与Linux的约定不尽相同,大家需要注意一下。所谓此root不是彼root,很容易搞混淆,所以我打算先说说这一点。hd还是hd的,这点没有区别,接下去就不同了。GRUB使用数字来区别硬盘,不象Linux的had-hdd的字母表示,所以在GRUB之中的对应分别是hd0-hd3,我们也可以看出在GRUB之中一切都是从0开始计数的。分区怎么表示呢,在GRUB完整的分区表示是这样的:(hd0,0)。最后一个位只是需要用Linux的分区规则减一就好了。重点是GRUB的所谓root,GRUB作为一个多系统的bootloader,并不关心启动之后的事情,所以对于GRUB的root通常就是Linux内核文件的放置位置,一般是/boot。当然如果/boot没有自己的分区,就是/了。定义了root之后在之后的配置之中所有的文件将会是相对于这个root的,比如内核是/boot/vmlinuz,而/boot又是一个独立的分区,那么在配置文件里我们应该使用kernel /vmlinuz而不是kernel /boot/vmlinuz。后者会让GRUB去寻找/boot/boot/vmlinuz的。<br>
<br>
<br>
利用 chain loader 的方式: <br>
Chain loader就是将控制权交给下一个bootloader。启动事也交给下一个bootloader,所以需要知道的只是下一个bootloader的分区和所在的磁盘位置,GRUB可以指定那个扇区。比如我们的windows安装在hda1,Linux安装在hda2,在MBR的GRUB的有关启动windows的设定如下:<br>
title windows partition<br>root (hd0,0)<br>chainloader +1<br>
这里root就是代表了windows所在的分区hda1,而chainloader的+1就是代表第一个扇区。<br>
<br>
配置文件:(/boot/grub/grub.conf或者/boot/grub/menu.lst,后者是前者的链接)<br>
<br>
全局选项<br>
<br>
default=0 <br>
GRUB的计数都是从0开始的。<br>
timeout=3 <br>
表示默认等待的时间,这儿是3秒钟。超过3秒,用户还没有作出选 择的话,系统将自动选择默认的操作系统。 <br>
<br>
root=device <br>
指定GRUB的root,就是stage 2的所在分区。 <br>
<br>
splashimage=pathname <br>
指定开机画面文件的位置 <br>
<br>
<br>
Title选项<br>
<br>
类似LILO的image部分。<br>
<br>
title description<br>
<br>
为每个启动设定义一个说明<br>
<br>
root=device <br>
指定GRUB的root,就是stage 2的所在分区。 <br>
<br>
kernel=pathname <br>
指定Linux内核文件。<br>
initrd=pathname <br>
指定initrd映像文件。<br>
chainloader +1<br>
指定下一个bootloader的位置。<br>
<br>
内核Kernel选项:<br>
<br>
同LILO,请参照LILO相应部分。<br>
<br>
命令行的交互模式:<br>
<br>
GRUB的命令行模式比LILO更加强大,一般用于调试配置。基本命令基本与上面一些配置选项相同:<br>
1、grub>root (hd0,0) #设置GRUB的root<br>
2、grub>kernel /vmlinuz root=LABEL=/<br>
3、grub>initrd /initrd.img<br>
4、boot<br>
详细命令可以参照help。<br>
<br>
GRUB配置文件示例:<br>
<br>
# grub.conf generated by anaconda <br>
# <br>
# Note that you do not have to rerun grub after making changes to this # file <br>
# NOTICE: You do not have a /boot partition. This means that <br>
# all kernel and initrd paths are relative to /, eg. <br>
# root (hd0,0) <br>
# kernel /boot/vmlinuz-version ro root=/dev/hda1 <br>
# initrd /boot/initrd-version.img <br>
#boot=/dev/hda <br>
<br>
default=0 <br>
timeout=3 <br>
splashimage=(hd0,0)/boot/grub/splash.xpm.gz <br>
title Red Hat Linux (2.4.18-14) <br>root (hd0,0) <br>kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/ <br>initrd /boot/initrd-2.4.18-14.img <br>
title Microsoft Windows XP <br>map (hd0) (hd1) <br>map (hd1) (hd0) <br>root (hd1,0) <br>chainloader (hd1,0)+1 <br>boot<br>总结<br>
<br>
LILO不认识filesystem,所以将相关绝对寻址存入了MBR之中,每次变动都需要运行lilo来更新启动扇区或者MBR。<br>
GRUB可以读取filesystem内(主要是/boot下)的文件,而不必存储内核在硬盘的绝对指针,取而代之的是路径相对路径。所以更改配置文件或者更新移动内核后无需重新安装MBR或者启动扇区部分代码。 |
|