LinuxSir.cn,穿越时空的Linuxsir!

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

文件系统未加载时怎么加载内核文件

[复制链接]
发表于 2004-11-29 15:08:18 | 显示全部楼层 |阅读模式
initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态,比如,使用的是scsi硬盘,当内核vmlinuz中并没有编译进scsi硬件的驱动时,那么在装入scsi模块之前,内核不能加载根文件系统,但scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际文件系统的initrd内核,即在initrd中加载scsi模块,修正scsi引导问题,所以initrd中一定要把所要支持的文件系统模块编译进去。但initrd-x.x.x.img 和vmlinuz-x.x.x.img在启动时都是存在/boot下的,既然系统启动时能够找到initrd和vmlinuz那不是说明它识别出了文件系统并进行了读取了吗?那这样岂不是和前面所讲的initrd的作用矛盾了吗?是不是和启动时的loader如lilo,grub有关,即grub或lilo要么在MBR中标示了这两个内核文件的在硬盘上具体物理位置,要么就是grub和lilo能识别文件系统?所以loader能够加载进这两个内核文件,然后用initrd作为根文件系统,加载scsi模块,利用该模块读取真正的文件系统,再卸载initrd,挂接真正文件系统。如果我以上假设成立的话,那其实loader只要记住initrd的硬盘物理位置,加载这个初始ramdisk后,在读取文件系统中的vmlinuz和各相关模块?
   期望各位高手能够给出详细解释,谢谢!
 楼主| 发表于 2004-11-29 15:20:35 | 显示全部楼层

附加:刚看到,网上对mkinitrd的解释

Mkinitrd creates filesystem images for use as initial ramdisk (initrd) images. These ramdisk images are often used to preload the block device modules (SCSI or RAID) needed to access the root filesystem. In other words, generic kernels can be built without drivers for any SCSI adapters which load the SCSI driver as a module. Since the kernel needs to read those modules, but in this case it isn't able to address the SCSI adapter, an initial ramdisk is used. The initial ramdisk is loaded by the operating system loader (normally LILO) and is available to the kernel as soon as the ramdisk is loaded. The ramdisk image loads the proper SCSI adapter and allows the kernel to mount the root filesystem. The mkinitrd program creates such a ramdisk using information found in the /etc/ modules.conf file.
看到lilo加载进initrd作为根文件系统,然后内核利用这个ramdisk加载模块,从而能读取真正的root filesystem. 现在对initrd和vmlinuz的作用和区别还有有点不明,能给出详细解释吗?对了,Lilo是如何加载initrd和vmlinuz的?
发表于 2004-11-29 15:31:28 | 显示全部楼层
加载内核和initrd的是引导程序,不是内核,引导程序能认识硬盘上的文件系统不等于内核能认识,这是两个不同的概念。
 楼主| 发表于 2004-11-29 16:03:24 | 显示全部楼层

谢谢版主回复

那loader是如何加载vmlinuz和lilo,版主的意思是loader能识别文件系统,还是loader在mbr里标识了其在硬盘上的具体物理位置,如磁道扇区等信息?
发表于 2004-11-29 18:08:13 | 显示全部楼层

回复: 谢谢版主回复

最初由 grix 发表
那loader是如何加载vmlinuz和lilo,版主的意思是loader能识别文件系统,还是loader在mbr里标识了其在硬盘上的具体物理位置,如磁道扇区等信息?

loader,就应该指的是OS loader,如GRUB、lilo,不是什么别的。
既然你的硬盘上的文件是以某个具体的文件系统(如ext2)来组织的,那么loader要定位所需文件,必然要在能识别该文件系统的前提下实现,你自己ls一下/boot/grub就可以看到很多*_stage_1_5,这是很明显的逻辑问题。
GRUB自己本身能识别多种文件系统,进而才定位到内核(文件)和initrd,将initrd放到某个标识的内存区域,最后将控制权交给内核,由内核来初始化自身并进一步处理initrd。
 楼主| 发表于 2004-11-29 18:25:16 | 显示全部楼层
谢谢home_king,kj501的回复!
发表于 2004-11-30 17:08:45 | 显示全部楼层

回复: 回复: 谢谢版主回复

最初由 home_king 发表
loader,就应该指的是OS loader,如GRUB、lilo,不是什么别的。
既然你的硬盘上的文件是以某个具体的文件系统(如ext2)来组织的,那么loader要定位所需文件,必然要在能识别该文件系统的前提下实现,你自己ls一下/boot/grub就可以看到很多*_stage_1_5,这是很明显的逻辑问题。
GRUB自己本身能识别多种文件系统,进而才定位到内核(文件)和initrd,将initrd放到某个标识的内存区域,最后将控制权交给内核,由内核来初始化自身并进一步处理initrd。


补充一下:
*_stage_1_5是加载grub的stage2 专用的,然后加载其他的文件如kernel,initrd就用stage2中的文件系统。
发表于 2004-12-3 11:18:44 | 显示全部楼层
那lilo是不是记录内核的位置啊??
否则没有必要每次修改lilo.conf文件 都需要运行lilo进行加载
发表于 2004-12-3 11:31:09 | 显示全部楼层
最初由 z21921 发表
那lilo是不是记录内核的位置啊??
否则没有必要每次修改lilo.conf文件 都需要运行lilo进行加载


对,lilo不认识文件系统
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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