ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:41.34KB ,
资源ID:5781649      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5781649.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(linuxrc详解.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

linuxrc详解.docx

1、linuxrc详解linuxrc详解来源: ChinaUnix博客 日期: 2008.12.18 16:38(共有0条评论) 我要评论主題: 請問在busybox 中 linuxrc 與 /sbin/init 的不同處linuxrc 是 busybox make install 產生出來的/sbin/init 也是busybox 用來初始開機的程式我分別用來開機 都可正常運作那請問兩者的差別在哪裡還是這兩個東西其實都是一樣的 以下為摘自linux kernel Documentation應該可以解決你的疑問。When using initrd, the system typically boo

2、ts as follows:1) the boot loader loads the kernel and the initial RAM disk2) the kernel converts initrd into a normal RAM disk and frees the memory used by initrd3) initrd is mounted read-write as root4) /linuxrc is executed (this can be any valid executable, including shell scripts; it is run with

3、uid 0 and can do basically everything init can do)5) linuxrc mounts the real root file system6) linuxrc places the root file system at the root directory using the pivot_root system call7) the usual boot sequence (e.g. invocation of /sbin/init) is performed on the root file systemthe initrd file sys

4、tem is removedlinuxrc常见错误2008年09月04日 星期四 下午 04:161 linuxrc不具备可执行属性 2 linuxrc的解释shell不在首行 3 linuxrc的解释shell不存在一般都出不了上面三个原因.linuxrc脚本kernel启动后,执行/root_china/linuxrc脚本文件,接下来执行/root_china/usr/etc/rc.local脚本文件。这两个文件我以前没去管是什么意思,起到什么作用,直到今天。/root_china/linuxrc:#!/bin/shecho mount /etc as ramfs/bin/mont -n

5、-t ramfs ramfs /etc /将/etc目录mount成可写的ramfs文件系统/bin/cp -a /mnt/etc/* /etc /将/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/2 / /将/dev/mtdblock/2 mount成根文件系统/bin/mount -f -t ramfs ramfs /etcexec /sbin/init

6、 /执行脚本档 /usr/etc/rc.local1. /bin/mount -n -t ramfs ramfs /etc 这句话的作用加载一个ramfs作为/etc目录。这样/etc就是一个可写目录。看这个脚本,得出根文件系统是一个cramfs(只读可压缩文件系统),而/etc作为系统运行配置文件的存放地点,可能会写一些运行状态在这里,linuxrc第一件事情就是将一个ramfs mount到/etc只读目录中,使得/etc/目录可写,指定参数-n的目的是告诉mount不要写/etc/mtab(这个文件存放当前系统mount了的所有文件系统)。因为现在/etc/目录还是只读,所以这次moun

7、t不要写这个文件,否则会失败。ramfs在哪里?在 /etc/fstab文件中应该有ramfs一项,mount会去找这项,如果没有,mount会失败。后面就执行不下去。2. /bin/cp -a /mnt/etc/* /etc/etc成为可写目录后,将所有/mnt/etc中的配置文件拷贝到/etc/中,这说明ramfs可能是一个空的ramfs,没有配置文件,或者配置文件比较老。 同时也说明这个系统是一个只读系统,每次系统运行中写入的配置不会保留。将以前mount的那些信息重新写到/etc/mtab中,命令就是下面这些。3. /bin/mount -f -t cramfs -o remount,

8、ro /dev/bon/2 /bin/mount -f -t ramfs ramfs /etc这些命令只是将这些mount信息写到/etc/mtab中,不会实际去mount这些block device,说明你的根文件系统依然是以前的那个/dev/bon/24. exec /sbin/init执行根文件系统中的init执行程序,使其成为1号进程。shell正式运行linux启动过程详解2008-01-12 00:43这几天看了很多文档,算是对linux的启动过程有了比较细致的了解. 网上有很多文章谈到这方面的内容,但总觉得没有一篇完全的解析linux启动的细节,下面是我小弟在学习的过程中总结出来

9、的一些东东.这个是完整的linux启动过程,不涉及内核,但是我觉得比较详细哦. (由于本人比较懒,这一段是从网上抄的) 机器加电启动后,BIOS开始检测系统参数,如内存的大小,日期和时间,磁盘设备以及这些磁盘设备用来引导的顺序,通常情况下,BIOS都是被配置成首先检查软驱或者光驱(或两者都检查),然后再尝试从硬盘引导。如果在这些可移动的设备中,没有找到可引导的介质,那么BIOS通常是转向第一块硬盘最初的几个扇区,寻找用于装载操作系统的指令。装载操作系统的这个程序就是boot loader. linux里面的boot loader通常是lilo或者grub,从Red Hat Linux 7.2起

10、,GRUB(GRand Unified Bootloader)取代LILO成为了默认的启动装载程序。那么启动的时候grub是如何被载入的呢? grub有几个重要的文件,stage1,stage2,有的时候需要stage1.5.这些文件一般都在/boot/grub文件夹下面.grub被载入通常包括以下几个步骤:1. 装载基本的引导装载程序(stage1),stage1很小,网上说是512字节,但是在我的系统上用 du -b /boot/grub/stage1 显示的是1024个字节,不知道是不是grub版本不同的缘故还是我理解有误.stage1通常位于主引导扇区里面,对于硬盘就是MBR了,sta

11、ge1的主要功能就是装载第二引导程序(stage2).这主要是归结于在主引导扇区中没有足够的空间用于其他东西了,我用的是grub 0.93,stage2文件的大小是 107520 bit.2. 装载第二引导装载程序(stage2),这第二引导装载程序实际上是引出更高级的功能,以允许用户装载入一个特定的操作系统。在GRUB中,这步是让用户显示一个菜单或是输入命令。由于stage2很大,所以它一般位于文件系统之中(通常是boot所在的根分区).上面还提到了stage1.5这个文件,它的作用是什么呢? 你到/boot/grub目录下看看,fat_stage_1.5 e2fs_stage_1.5 xf

12、s_stage_1.5等等,很容易猜想stage1.5和文件系统有关系.有时候基本引导装载程序(stage1)不能识别stage2所在的文件系统分区,那么这时候就需要stage1.5来连接stage1和stage2了.因此对于不同的文件系统就会有不同的stage1.5.但是对于grub 0.93好像stage1.5并不是很重要,因为我试过了,在没有stage1.5的情况下, 我把stage1安装在软盘的引导扇区内,然后把stage2放在格式化成ext2或者fat格式的软盘内,启动的时候照常引导,并不需要e2fs_stage_1.5或者fat_stage_1.5.下面是我的试验: #mkfs.e

13、xt2 /dev/fd0 #mount -t ext2 /dev/fd0 /mnt/floppy #cd /mnt/floppy #mkdir boot #cd boot #mkdir grub (以上三步可用mkdir -p boot/grub命令完成) #cd grub #cp /boot/grub/stage1,stage2,grub.conf ./ #cd; umount /mnt/floppy 以上几步把软盘格式化成ext2格式,然后把stage1,stage2,grub.conf这几个启动的时候必须的文件拷贝到软盘的指定目录下.下面安装grub到软盘上. #grub (进入grub

14、环境) grub install (fd0)/boot/grub/stage1 (fd0) (fd0)/boot/grub/stage2p (fd0)/boot/grub/grub.conf 以上这条命令也可以用下面的两句代替 grubroot (fd0) #grub的根目录所在的分区 grubsetup (fd0) #这一步就相当于上面的install命令 我在这里解释一下 install (fd0)/boot/grub/stage1 (fd0) (fd0)/boot/grub/stage2 p(fd0)/boot/grub/grub.conf 这条命令.install 告诉GRUB将(fd

15、0)/boot/grub/grub/stage1 安装到软驱的引导扇区(fd0).(fd0)/boot/grub/stage2 告诉grub stage2这个文件所在的位置.p 参数后面跟着(fd0)/boot/grub/grub.conf 告诉grub的配置文件所在的位置. 好了,让BIOS从软驱启动,试一下,没有e2fs_stage_1.5文件照样能够进入系统.其实这就是一个小小的启动盘啊.(了解了grub的运行原理,就简单多了_)3. 现在我们已经到grub的开机选单这一步了,接下来grub所需要做的就是装载在一个特定分区上的操作系统,如linux内核。一旦GRUB从它的命令行或者配置文

16、件中,接到开始操作系统的正确指令,它就寻找必要的引导文件,然后把机器的控制权移交给操作系统. 由于篇幅有限,避免冗长,grub的命令我就不多说了,网上很有多的资料,一个典型完整的引导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).再如

17、/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的根目录和文件系统的根目录的区别.

18、 再回到上面的几行命令. kernel命令用来指定内核所在的位置,/代表(hd0,0),也就是grub的根目录 initrd命令用来指定初始化ram的img文件所在位置. grub载入内核bzImage并展开到指定位置(应该是0x100000这个地方),同时载入initrd.img到内存(不知道是什么地方).ps: grub的任务至此就结束了,下面grub将机器的控制权转交给操作系统(linux). 操作系统接到控制权之后,开始start_kernel,接着内核将initrd.img展开到/dev/ram0为临时根文件系统,执行里面的linuxrc文件. P.这里有必要说一下initrd的作用

19、特别是它里面的核心文件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系统调用指定新的根目录

20、并将现有的根目录place到指定位置. 7)在新的文件系统下正式init 8)initrd被卸载. 为了便于理解,我将red hat linnux9 里面的initrd-2.4.20-8.img拿出来分析一下. 这其实是一个压缩了的文件,是以gz结尾的.rootlocalhost root#cp /boot/initrd-2.4.20-8.img /mnt/initrd-2.4.20-8.gzrootlocalhost root#gunzip /mnt/initrd-2.4.20-8.gzrootlocalhost root#mount -o loop /mnt/initrd-2.4.20-8

21、 /mnt/ramrootlocalhost root#cd /mnt/ramrootlocalhost ram#lsbin dev etc lib linuxrc loopfs proc sbin sysrootrootlocalhost ram#ls bininsmod modprobe nashrootlocalhost ram#ls libBuslogic.o ext3.o jbd.o scsi_mod.o sd_mod.orootlocalhost ramls devconsole null ram systty tty1 tty2 tty3 tty4sbin目录是指向bin目录的一

22、个连接,其他目录是空的.rootlocalhost ramcat linuxrc#!/bin/nash1.echo Loading scsi_mod.o module2.insmod /lib/scsi_mod.o3.echo Loading sd_mod.o module4.insmod /lib/sd_mod.o5.echo Loading BusLogic.o module6.insmod /lib/BusLogic.o7.echo Loading jbd.o module8.insmod /lib/jbd.o9.echo Loading ext3.o module10.insmod /

23、lib/ext3.o11.echo Mounting /proc filesystem12.mount -t proc /proc /proc13.echo Creating block devices14.mkdevices /dev15.echo Creating root device16.mkrootdev /dev/root17.echo 0x0100 /proc/sys/kernel/real-root-dev18.echo Mounting root filesystem19.mount -o defaults -ro -t ext3 /dev/root /sysroot20.p

24、ivot_root /sysroot /sysroot/initrd21.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使它

25、后面的参数/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的作用

26、: (参考/usr/src/linux-2.4/Documentation/initrd.txt文档) 2)/linuxrc文件决定在挂载真正的文件系统之前所需完成的事情(譬如加载必要的网络驱动或者加载ext3文件系统). 3)/linuxrc加载必要的模块. 4)/linuxrc挂载根文件系统 5)/linuxrc调用pivot_root来改变根目录 关于initrd的用途可以查考上面提到的文档,想知道linux系统是如何安装的吗?那里面由答案. 既然linuxrc的主要目的是加载模快用的,那如果我们的内核没有动态的模块而所需的功能都是静态编译进内核的,那么是不是可以不用linuxrc文件呢

27、? 答案是可以不用,在普通的linux操作系统里面可以加入noinitrd选项以告知bootloader 不使用initrd.如果我们做网关,因为ram是我们的文件系统的载体,所以initrd一行当然不能去掉,但是我们可以不用linuxrc文件,sysroot文件夹和initrd文件夹. 不信的话,试试看吧. 好了,initrd(linuxrc)已经介绍完了. linuxrc执行完毕之后,系统就会以真正的根目录正式init. 系统在/bin/或者/sbin目录下找到init程式,然后根据它的配置文件/etc/fstab进行初始化,最后调用mingetty程式启动login完成引导. ps:in

28、it这一部分网上有很多的详细资料所以我在这里并没有展开来说. 终于写完了,希望对你有所帮助.如有错误,还望指正.Trackback: Linux init详解2008-12-08 12:25Linux init详解 init是Linux系统操作中不可缺少的程序之一。 所谓的init进程,它是一个由内核启动的用户级进程。 内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。 内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说

29、)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。 一、什么是INIT: init是Linux系统操作中不可缺少的程序之一。 所谓的init进程,它是一个由内核启动的用户级进程。 内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。 内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh

30、,如果运行失败,系统的启动也会失败。 二、运行级别 那么,到底什么是运行级呢? 简单的说,运行级就是操作系统当前正在运行的功能级别。这个级别从1到6 ,具有不同的功能。 不同的运行级定义如下:(可以参考Red Hat Linux 里面的/etc/inittab) # 0 - 停机(千万不能把initdefault 设置为0 ) # 1 - 单用户模式 # 2 - 多用户,没有 NFS # 3 - 完全多用户模式(标准的运行级) # 4 - 没有用到 # 5 - X11 (xwindow) # 6 - 重新启动 (千万不要把initdefault 设置为6 ) 这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1