分类: LINUX
2009-09-08 14:47:21
linux系统在指定了initrd镜像之后,启动时会首先执行linuxrc。既然这样,那就可以先在initrd镜像中创建出与磁盘上系统相同的根目 录结构(此处不一定只有根目录,子目录如果需要也可以创建),然后在liunxrc中将各个目录mount到对应的目录上。可以将磁盘上体积较大的目录通 过文件系统压缩,例如cramfs等,挂载时只需将其作为loop设备挂载即可(mount -o loop /sda/bin.cfs /bin)。
linuxrc执行完毕后,系统确实运行在了内存上,目录结构和文件也同磁盘上的一样(因为是mount上的嘛,不一样就怪了)。但是系统提 供的服务一个都没启动(因为没执行init嘛,自然不会启动)。解释一下,linux在将根目录指定为root=/dev/sda1时,在指定了 initrd的情况下,会执行linuxrc,如果没有initrd,则执行init。如果根目录指定为root=/dev/ram0,则会直接执行 init。而我们的要求是必须linuxrc和init都要执行,并且是要先执行linuxrc,然后执行init。所以需要做如下修改,仅有两步:
1.menu.lst中,root=/dev/sda1,不要设为任何一个ram
2.在linuxrc文件的最后面添加一句echo 0x0100 > /proc/sys/kernel/real-root-dev 告诉linux系统,当前的跟位于root=/dev/ram0,如上面所说,root=/dev/ram0的话,系统会执行init。
这样,系统就会首先以为跟在sda1,然后去执行linuxrc,将各个目录一一挂载,执行到最后,通过echo 0x0100 > /proc/sys/kernel/real-root-dev 人为的修改了根的路径,系统就又会去执行/sbin/init,最终将服务各种启动起来。