Linux中linuxrc的作用

一个典型完整的引导linux的命令如下:
     title 51base
           root(hd0,0)
           kernel /bzImage ro root=/dev/ram0
           initrd /initrd.img
这里有必要注意一下几个问题:
(1)grub的磁盘以及分区的命名方式和linux有所区别,第一个磁盘是从0开始,第一个分区也是从0开始.譬如第一个硬盘的第5分区在linux下面是/dev/hda5 ,而在grub里面是(hd0,4).再如/dev/fd0在grub里面是(fd0,0).
(2)不管是IDE硬盘hda,hdb还是SCSI硬盘sda,sdb在grub里面都是以hd方式命名.譬如虚拟机里面的/dev/sda2在grub里面是(hd0,1),再如/dev/hdb7在grub里面以(hd1,6)命名.

(3)要搞清楚上面两个root的关系,root (hd0,0)中的root是grub命令,它用来指定boot所在的分区作为grub的根目录.而root=/dev/ram0是kernel的参数,它告诉操作系统内核加载完毕之后,真实的文件系统所在的设备.

要注意grub的根目录和文件系统的根目录的区别.

     

再回到上面的几行命令.

kernel命令用来指定内核所在的位置,"/"代表(hd0,0),也就是grub的根目录
initrd命令用来指定初始化ram的img文件所在位置.
grub载入内核bzImage并展开到指定位置(应该是0x100000这个地方),同时载入
initrd.img到内存(不知道是什么地方).
ps:
grub的任务至此就结束了,下面grub将机器的控制权转交给操作系统(linux).


操作系统接到控制权之后,开始start_kernel,接着内核将initrd.img展开到/dev/ram0为临时根文件系统,执行里面的linuxrc文件.


    initrd是inital ram disk的宿写.
当存在initrd的时候,机器启动的过程大概是以下几个步骤(当initrd这一行用noinitrd 命令代替后,就不存在initrd了)
1)boot loader(grub)加载内核和initrd.img
2)内核将压缩的initrd.img解压成正常的ram disk并且释放initrd所占的内存空间
3)initrd作为根目录以读写方式被挂载
4)initrd里面的文件linuxrc被执行
5)linuxrc挂载新的文件系统
6)linuxrc使用pivot_root系统调用指定新的根目录并将现有的根目录place到指定位置.
7)在新的文件系统下正式init
8)initrd被卸载.
为了便于理解将red hat linnux9 里面的initrd-2.4.20-8.img拿出来分析.
[root@localhost ram]cat linuxrc
#!/bin/nash
1.echo "Loading scsi_mod.o module"
2.insmod /lib/scsi_mod.o
3.echo "Loading sd_mod.o module"
4.insmod /lib/sd_mod.o
5.echo "Loading BusLogic.o module"
6.insmod /lib/BusLogic.o
7.echo "Loading jbd.o module"
8.insmod /lib/jbd.o
9.echo "Loading ext3.o module"
10.insmod /lib/ext3.o
11.echo Mounting /proc filesystem
12.mount -t proc /proc /proc
13.echo Creating block devices
14.mkdevices /dev
15.echo Creating root device
16.mkrootdev /dev/root
17.echo 0x0100 > /proc/sys/kernel/real-root-dev
18.echo Mounting root filesystem
19.mount -o defaults --ro -t ext3 /dev/root /sysroot
20.pivot_root /sysroot /sysroot/initrd
21.umount /initrd/proc

首先必须注意的是这里使用的shell是nash而不是bash,nash是专门为linuxrc可执行脚本设计的,因此你有必要看一看nash的man文档.

1-10行是加载一些必要的模快.

11-12行加载proc内核文件系统,

13-14行利用nash内建的命令mkdevices创建块设备,mkdevices是根据/proc/partitions文件创建里面列出的所有

块设备.

15-16行利用nash内建的命令mkrootdev,mkrootdev使它后面的参数/dev/root成为一个块节点从而使得根分区设备被挂载,其中根分区设备由grub.conf里面的kernel命令后面所带的参数root=决定,如果root=参数没有被指定,/proc/sys/kernel/real-root-dev文件将提供根分区设备号.

17行将数字256写入到后面的文件里面去.

18-19行挂载根文件系统到/sysroot目录下,/dev/root里面的内容就是root=参数所指定的设备里面的内容

20行调用pivot_root改变根目录所在地并place旧的根目录到指定的位置.21行卸载旧的根目录里面的proc内核文件系统.


这里面总结一下linuxrc的作用: (参考/usr/src/linux-2.4/Documentation/initrd.txt文档)

    1)/linuxrc文件决定在挂载真正的文件系统之前所需完成的事情(譬如加载必要的网络驱动或者加载ext3文件系统).
    2)/linuxrc加载必要的模块.
    3)/linuxrc挂载根文件系统
    4)/linuxrc调用pivot_root来改变根目录
    
    既然linuxrc的主要目的是加载模快用的,那如果我们的内核没有动态的模块而所需的功能都是静态编译进内核的,那么是不是可以不用linuxrc文件呢?
    答案是可以不用,在普通的linux操作系统里面可以加入noinitrd选项以告知boot 
loader 不使用initrd.

如果我们做网关,因为ram是我们的文件系统的载体,所以initrd一行当然不能去掉,但是我们可以不用linuxrc文件,sysroot文件夹和initrd文件夹.


linuxrc执行完毕之后,系统就会以真正的根目录正式init.
系统在/bin/或者/sbin目录下找到init程式,然后根据它的配置文件/etc/fstab进行初始化,最后调用mingetty程式启动login完成引导.

      ps:init这一部分网上有很多的详细资料,在这里并没有展开来说.


(http://www.cnblogs.com/king-77024128/articles/2275545.html)

/Linuxrc 执行init 进程初始化文件。主要工作是把已安装根文件系统中的/etc 安装为ramfs,并拷贝/mnt/etc/目录下所有文件到/etc,这里存放系统启动后的许多特殊文件;接着Linuxrc 重新构建文件分配表inittab;之后执行系统初始化进程/sbin/init。
/mnt/etc/init.d/rcS 完成各个文件系统的 mount,再执行/usr/etc/rc.local;通过rcS 可以调用 dhcp 程序配置网络。rcS 执行完了以后,init 就会在一个 console 上,按照 inittab 的指示开一个 shell,或者是开 getty + login,这样用户就会看到提示输入用户名的提示符。
/usr/etc/rc.local 这是被init.d/rcS 文件调用执行的特殊文件,与Linux 系统硬件平台相关,如安装核心模块、进行网络配置、运行应用程序、启动图形界面等。
/usr/etc/profile rc.local 首先执行该文件配置应用程序需要的环境变量等。
Linuxrc 
#!/bin/sh
echo "mount /etc as ramfs"
/bin/mount -n -t ramfs ramfs /etc
/bin/cp -a /mnt/etc/* /etc
echo "re-create the /etc/mtab entries"
# re-create the /etc/mtab entries
/bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/3 /
/bin/mount -f -t ramfs ramfs /etc
exec /sbin/init

rcS
/mnt/etc/init.
d/
#!/bin/sh
/bin/mount -a
exec /usr/etc/rc.local

rc.local
/usr/etc/
#!/bin/sh
. /usr/etc/profile
echo "HELLO! Embest"
echo "ifconfig eth0 192.168.0.10"
ifconfig eth0 192.168.0.10

你可能感兴趣的:(Linux环境使用与软件安装)