Chinaunix首页 | 论坛 | 博客
  • 博客访问: 183799
  • 博文数量: 64
  • 博客积分: 1451
  • 博客等级: 上尉
  • 技术积分: 665
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-24 10:07
文章分类

全部博文(64)

文章存档

2010年(7)

2009年(57)

我的朋友

分类: LINUX

2009-09-08 14:47:21

通过Ramdisk和initrd,可以在系统启动时在内存上先运行initrd镜像,然后再转移当前根目录,并将控制权转交。但是经过前面操作之 后,系统仍然是运行在本身的存储介质上,并没有运行在内存上。当然,为使系统运行在内存上,可以将所需要的所有东西都放进initrd镜像中,系统启动 initrd后即可作为一个符合要求的系统运行,无需再转换根目录和转交控制权。但是,这种方法只适用于比较小的,功能比较单一的嵌入式系统,如果系统较 大,达到几十兆,这种方法显然是不合适也不可行的,所以下面介绍另一种方法,使大系统也可以运行在内存上。

    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,最终将服务各种启动起来。

阅读(1101) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~