LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2292|回复: 3

[修正完善中……]SLES(或其他Linux发行版)硬盘安装的关键:GRUB、loadlin、linux、initr

[复制链接]
发表于 2004-12-11 23:05:40 | 显示全部楼层 |阅读模式
实际上这篇文章也可以叫做:
《Linux硬盘安装的关键:GURB、Loadlin、vmlinuz.img、initrd》,只不过SLES把通常的vmlinuz.img、initrd.gz改名为linux、initrd了,作用是一样的,只不过改了名字而已。

我们来看一下linux(vmlinux.img)是干什么用的:
下面的信息来源:
http://www.linuxfans.org/nuke/mo ... rticle&sid=2375

一、vmlinuz
vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行的Linux内核,它位于/boot/vmlinuz,它一般是一个软链接,比如图中是vmlinuz-2.4.7-10的软链接。
vmlinuz的建立有两种方式。一是编译内核时通过“make zImage”创建,然后通过:
“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage /boot/vmlinuz”产生。zImage适用于小内核的情况,它的存在是为了向后的兼容性。二是内核编译时通过命令make bzImage创建,然后通过:“cp /usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz”产生。bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起误解,bz表示“big zImage”。 bzImage中的b是“big”意思。
zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。
内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage 或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage。
vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。


我认为vmlinuz最起码起到了侦测硬件、加载initrd.gz的作用,功能与MSDOS的MSDOS.SYS、WinNT/2000/XP/2003 的NTDETECT.COM、Win9x/ME的IO.SYS有点相似(只是有部分作用相同)。它做完自己的事情之后就开始加载initrd.gz,同时把它侦测到的硬件信息传送给initrd.gz处理。

二、 initrd-x.x.x.img
initrd是“initial ramdisk”的简写。initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。图中的initrd-2.4.7-10.img主要是用于加载ext3等文件系统及scsi设备的驱动。比如,使用的是scsi硬盘,而内核vmlinuz中并没有这个scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正scsi引导问题。initrd-2.4.7-10.img是用gzip压缩的文件,下面来看一看这个文件的内容,操作步骤如下图所示:

从图中linuxrc这个脚本的内容可以看到,initrd实现加载一些模块和安装文件系统等。
initrd映象文件是使用mkinitrd创建的。mkinitrd实用程序能够创建initrd映象文件。这个命令是RedHat专有的。其它Linux发行版或许有相应的命令。这是个很方便的实用程序。具体情况请看帮助:man mkinitrd


我认为initrd.gz的作用是接收vmlinuz传过来的硬件信息,加载相应的驱动程序模块,然后开始启动Linux系统或者启动Linux安装程序(我认为它至少有两种功能,就是启动Linux系统或者启动Linux安装程序,这取决于配置,光盘镜像上的initrd.gz就是启动安装程序,Linux安装完毕后在Linux根分区/boot下面的initrd.gz就是启动Linux系统)。

我们再来看GRUB和loadlin:

GRUB和loadlin都是起着加载系统引导程序的作用,不过GRUB可以引导各种系统如Windows等,而loadlin则是专门用来加载Linux系统的引导程序,它们的工作方式也有不同,loadlin只能在MSDOS环境下运行,而GRUB,有至少三种环境可以运行:
1、安装到MBR,通过MBR启动(Linux自带的GRUB和GRUB for DOS都可以实现)
2、从WinNT的启动菜单启动(GRUB for DOS带了这个模块,叫grldr,名字是不是很像WinNT的ntldr?)
用法:把grldr复制到WinNT/2000/XP/2003的C盘根目录下(放到其它地方也可,不过建议放到WinNT系统根目录下),然后用记事本修改C:\boot.ini,在boot.ini的[operating systems]节中加入C:\GRLDR="GRUB"这一行,重新启动WinNT就可以看到启动菜单中多了"GRUB"这一项了。(注意:boot.ini是系统隐藏文件,在WinNT中取消"不显示系统隐藏文件"的选项后方可显示。)
3、从Linux的其他引导程序kexec、GRUB或者LILO启动(GRUB for DOS也带了这个模块,名字是grub4lin)
从kexec启动的方法:
kexec启动后,输入命令:
kexec -l grub4lin
kexec -e
从已有的GRUB启动(这不是多重GRUB吗,呵呵):
将grub4lin复制到Linux的根目录,启动GRUB后输入命令:
kernel (hd0,0)/grub4lin((hd0,0)代表grub4lin在hda0根目录,视情况修改)
boot
从LILO启动的方法:
把grub4lin复制到/boot/目录下,然后在lilo.conf文件中加入以下两行:
image=/boot/grub4lin
label=grub4lin

下面再来看看loadlin和GRUB是如何引导安装程序的:
1、loadlin
loadlin是一个DOS命令行程序,应该在纯DOS下运行(Win9x的命令行方式应该也是可以的,但WinNT/2000/XP/2003都是采用16位程序保护模式,所以不能使用)。所以,首先必须启动DOS(不管是硬盘启动、软盘启动、光盘启动都行),然后运行loadlin,以我最开始安装SUSE为例:
基本情况:
我有两个硬盘,SLES9解压到第二个硬盘的主分区F:\(FAT32文件系统)里面,6张CD分别放在CD1、CD2、CD3、CD4、CD5、CD6这六个目录里。loadlin.exe、linux、initrd这几个文件也放在F:\里。
我用Win98光盘启动MSDOS后,切换到F:\,运行loadlin:
loadlin linux initrd=initrd ramdisk_size=96000 devfs=mount,dall
这个是我在网上抄的,结果运行之后提示说没有root目录,于是我又google了一下,然后改成了:
loadlin linux initrd=initrd root=/dev/ram ramdisk_size=96000 devfs=mount,dall
当时我也不知道root=/dev/ram这个参数是什么意思,只是觉得像是Linux的某个设备名,就像/dev/hda1这样的东西。没有找到root目录怎么办?我想了想,这个root目录应该就是对应initrd这个文件所在的目录,也就是F:\,由于在Linux下F:/应该表示为/dev/hdb0,于是我又把命令改为:
loadlin linux initrd=initrd root=/dev/hdb0 ramdisk_size=96000 devfs=mount,dall
这下不提示没有root目录了,但是还是提示错误,说:
Kernel panic: No init found. Try passing init=option to kernel.
这个init是什么?init进程运行级?我很快排除了这种可能。那么,init应该就是initrd模块了,为什么没有找到init呢?我想了半天,终于想到了:
devfs=mount,dall
这一句是什么意思呢?应该是加载分区啊,mount命令嘛,那么后面的devfs和dall是什么意思呢?dev是device的意思,也就是设备,fs是file system,文件系统。dall呢?我到现在还不知道。但是我猜到了,dall的意思是指明文件系统的类型,既然是文件系统的类型,那么可以用代表fat16/fat32文件系统的vfat来代替了,我想这次我又找到了问题所在,赶紧改过来:
loadlin linux initrd=initrd root=/dev/hdb0 ramdisk_size=96000 devfs=mount,vfat
再运行,OK!进入安装程序!不一会SLES的安装画面就出现了(非图型界面)。终于可以在DOS下安装SLES了!我看了看SLES的安装选项,在“文件系统模块”里我看到了vfat、NTFS(Read Only)、SMBFS等各种文件系统的支持模块,原来SLES安装程序还支持NTFS的,这就意味着即使把安装源文件放在NTFS分区里,也可以安装!然后我继续安装,系统提示我选择安装源所在分区,我先选上安装源所在分区F:(也就是/了),回车,系统又提示我输入安装源所在路径,我想既然F:已经是/目录了,那么只要输入/CD1就可以了(有的朋友用hd:///、dir:///、file:///表示路径,我没有试过,不过我认为/xxx才是正宗的Linux写法),果然成功载入安装源!不过由于不是图形界面安装,显示中文乱码,所有我没有继续下去,赶快回到Windows下写了这篇文章。

GRUB:
我发现GRUB的参数和loadlin其实是一样的,只不过GRUB是使用kernel、initrd、boot这三个命令来启动安装程序而已。我在这里也写一下:
kernel (hd1,0)/linux root=/dev/hdb0 ramdisk_size=96000 devfs=mount,vfat
initrd (hd1,0)/initrd
boot
即可启动安装程序(不过不是图形界面安装)。(hd1,0)也就是Windows的F:或者Linux的hdb0了。

我们再来看看上面的命令行:
loadlin的:
loadlin linux initrd=initrd root=/dev/hdb0 ramdisk_size=96000 devfs=mount,vfat
其中:"loadlin"是指明loadlin程序的名字,"linux"是指引导程序linux(在其他Linux系统上可能是"vmlinuz.img"或其它)的名字,"linux"这个引导程序是由loadlin来加载,而后面的一长串都是由loadlin传送给"linux"引导程序的参数,指明了initrd的位置、/目录的位置、ramdisk的大小、安装源所在文件系统的类型等。
我们再来看后面的参数,这些参数都是由loadlin收集,并交给"linux"引导程序处理的,所以,它们不是loadlin程序本身的参数(loadlin本身的参数只要运行不带参数的"loadlin"就会看到提示),而是"linux"将要处理的参数。"initrd=initrd"其中第一个"initrd"是固定的,不能改,后面的"initrd"是文件名(在其他Linux系统上可能是initrd.gz或其它的名字)。"root=/dev/hdb0"其中"root"的意思是,后面的"/dev/hdb0"将会是"initrd"这个文件所在的路径。"ramdisk_size=96000"的意思是,将会在内存区域中划分96000KB作为虚拟磁盘,估计是用作临时文件交换。"devfs=mount,vfat"是指需要加载的分区的文件系统类型(安装源文件可以不放在这个分区上,但"linux"和"initrd"这两个文件必须放在这个分区的根目录)。

GRUB的命令与loadlin相似,所以我就不多赘述了。通过上面的详解,大家应该可以比较清楚地认识到loadlin、GRUB以及linux(vmlinuz.img)和initrd(initrd.gz)的作用的工作方式了。

本文没有解释清楚的是:linux(vmlinuz.img)可以使用的其他参数,如"vga=788"、"splash=silent"、"manual=1"、"showopts"、"acpi=off"、"ide=nodma"、"apm=off"、"acpi=off"、"barrier=off"这些参数,还有没有其他的参数我也不清楚,希望大家都来补充!文章中的错误之处也请大家指出!

另外我认为GRUB和loadlin在加载linux(vmlinuz.img)后会立即从内存中消失,而且MSDOS也会立即从内存中消失,至于是被谁清除出内存的,我也不清楚,这个就烦请高人解答了。

本文中提到的Linux系统:
SUSE Linux Enterprise Server 9.0 (changelog中标明RC5,应该就是正式版了吧)

本文中提到的工具:
GRUB for DOS、loadlin(loadlin是SLES9光盘中自带的)
GRUB for DOS 0.2.0 pre13 最新版官方下载地址:
http://newdos.yginfo.net/grubdos.htm
GRUB for DOS 的使用方法请看它的README文件,也可以在GRUB for DOS启动后输入命令help查看帮助。
GRUB的使用详解(非GRUB for DOS,但部分相通):
http://www.linuxsir.cn/forum.php ... &highlight=grub

经过这些,我觉得我已经悟到了所有Linux发行版本硬盘安装的基本思路,相对于五花八门的硬盘安装方法,这认为这篇文章会更有益处,因为可以让你知其然,也知其所以然,不光是告诉你硬盘安装的方法,更重要的是让你了解硬盘安装的思路和Linux系统启动的方式,别人告诉你的方法是死的,自己领悟到的思路才是活的,如果大家能够从本文中得到一点小小的启发,我很高兴,我不是高手,但希望与大家共同学习、交流!所以我建议版主给此贴加精、固顶!
 楼主| 发表于 2004-12-12 00:36:08 | 显示全部楼层
我贴一下SLES CD1\boot\loader\isolinux.cfg,这个应该是SLES的官方设置参数了(每一个以"#"开头的节都是一种设置):
default harddisk

# hard disk
label harddisk
  kernel linux
  append SLX=0x202 showopts

# install
label linux
  kernel linux
  append initrd=initrd ramdisk_size=65536 splash=silent showopts

# noacpi
label noacpi
  kernel linux
  append initrd=initrd ramdisk_size=65536 splash=silent showopts acpi=off

# failsafe
label failsafe
  kernel linux
  append initrd=initrd ramdisk_size=65536 splash=silent showopts ide=nodma apm=off acpi=off barrier=off

# manual
label manual
  kernel linux
  append initrd=initrd ramdisk_size=65536 splash=silent manual=1 showopts

# rescue
label rescue
  kernel linux
  append initrd=initrd ramdisk_size=65536 splash=silent rescue=1 showopts

# memory test
label memtest
  kernel memtest

implicit        0
gfxboot                bootlogo
display                message
prompt                1
timeout                200
readinfo        2
framebuffer        1
notice                2
发表于 2004-12-13 19:21:56 | 显示全部楼层
说得真是好
大家一后就要多学学这些知识才是阿!
发表于 2005-11-5 15:03:34 | 显示全部楼层
谢谢啊!

一篇好文!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表