免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3096 | 回复: 8
打印 上一主题 下一主题

挂载/分区的目录 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-02 18:24 |只看该作者 |倒序浏览
想请教一个问题, 我们都知道根分区是挂载在/目录上的, 但有个问题,/目录在系统启动的时候在哪?

其实也就是问/目录在哪? 是开辟一段内存建立的吗? 网上找了些资料没怎么看明白, 哪位能帮我说一下, 谢谢!

论坛徽章:
0
2 [报告]
发表于 2009-08-02 21:24 |只看该作者
描述详细些
你想知道啥?

论坛徽章:
0
3 [报告]
发表于 2009-08-02 22:01 |只看该作者
原帖由 liu2g 于 2009-8-2 18:24 发表
目录在系统启动的时候在哪?也就是问/目录在哪? 是开辟一段内存建立的吗?

根分区跟内存啥关系?
你启动一下系统,看启动过程。

论坛徽章:
7
天蝎座
日期:2013-08-16 23:19:32丑牛
日期:2014-01-08 09:20:14寅虎
日期:2014-01-11 11:03:44午马
日期:2014-04-28 11:02:40天秤座
日期:2014-05-16 23:24:24摩羯座
日期:2014-07-20 10:46:04卯兔
日期:2014-08-08 15:21:41
4 [报告]
发表于 2009-08-02 22:54 |只看该作者
内核寻找到硬件设备,加载完编译在启动镜像文件的静态驱动之后,立刻只读加载根文件系统,之后就是加载根文件系统的动态模块,以及启动init进程。

论坛徽章:
0
5 [报告]
发表于 2009-08-03 21:04 |只看该作者
两个部分
第一次是initrd.img在内存解压执行的,
把initrd用 zcat initrd-2.6.18-128.el5.img |cpio -i 释放之后,查看init文件,会有如下命令行
echo Creating root device.
mkrootdev -t ext3 -o defaults,ro sda3

第二次
在/etc/rc.sysinit 的脚本里边,通过LABEL来重新挂载的,而不是以设备名

论坛徽章:
0
6 [报告]
发表于 2009-08-03 22:53 |只看该作者
原帖由 Aramis 于 2009-8-3 21:04 发表
两个部分
第一次是initrd.img在内存解压执行的,
把initrd用 zcat initrd-2.6.18-128.el5.img |cpio -i 释放之后,查看init文件,会有如下命令行
echo Creating root device.
mkrootdev -t ext3 -o default ...



谢谢你给我的解答, 下面一段是我找到的:

启动时用到initrd来mount根文件系统。注意理解ramdisk和initrd这两个概念,其实 ramdisk只是在ram上实现的块设备,类似与硬盘操作,但有更快的读写速度,它可以在系统运行的任何时候使用,而不仅仅是用于启动;initrd(boot loaderinitialized RAMdisk)可以说是启动过程中用到的一种机制,具体的实现过程也使用ramdisk技术。就是在装载linux之前,bootloader可以把一个比较小的根文件系统的映象装载在内存的某个指定位置,姑且把这段内存称为initrd(这里是initrd所占的内存,不是ramdisk,注意区别),然后bootloader通过传递参数的方式告诉内核initrd的起始地址和大小(也可以把这些参数编译在内核中),在启动阶段就可以暂时的用 initrd来mount根文件系统。initrd的最初的目的是为了把kernel的启动分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在initrd中,这样就在启动过程中可以从initrd所mount的根文件系统中装载需要的模块。这样的一个好处就是在保持kernel不变的情况下,通过修改initrd中的内容就可以灵活的支持不同的硬件。在启动完成的最后阶段,根文件系统可以重新 mount到其他设备上,但是也可以不再 重新mount(很多嵌入式系统就是这样)。initrd的具体实现过程是这样的:bootloader把根文件系统映象装载到内存指定位置,把相关参数传递给内核,内是核启动时把initrd中的内容复制到ramdisk中(ram0),把initrd占用的内存释放掉,在ram0上mount根文件系统。从这个过程可以看出,内核需要对同时对ramdisk和initrd的支持(这种需要都编入内核,不能作为模块)。


是initrd先将/分区中的一些必须的模块读取并映射到内存, 然后内核把initrd映射中的内容复制并解压到内存, 释放掉initrd, 最后在内存上mount真正的根"分区"咯~~!

其实我想问的就是, 我们平常访问的"/"目录, 只是单说这个目录不是说分区, 其实是内存中的区域吧?  "/"目录的inode和block也是内存中的区域?

论坛徽章:
0
7 [报告]
发表于 2009-08-04 23:43 |只看该作者
"是initrd先将/分区中的一些必须的模块读取并映射到内存, 然后内核把initrd映射中的内容复制并解压到内存, 释放掉initrd, 最后在内存上mount真正的根"分区"咯~~!"

内核借助于initrd解压之后lib中的模块以及insmod命令才得以识别硬盘,而不是/分区的模块,在你还没有识别到硬盘的时候如何能从/来读取必须的模块呢?  又是所谓的鸡蛋/蛋鸡了

initrd文件释放之后
[root@bogon initrd]# ls
bin  dev  etc  init  lib  proc  sbin  sys  sysroot
[root@bogon initrd]# cd lib/
[root@bogon lib]# ls                  下边绝大多数都是和存储相关的模块,有了他们才能找到存储设备
ata_piix.ko      dm-mod.ko          ext3.ko    mptbase.ko   scsi_mod.ko
dm-log.ko        dm-raid45.ko       firmware   mptscsih.ko  scsi_transport_spi.ko
dm-mem-cache.ko  dm-region_hash.ko  jbd.ko     mptspi.ko    sd_mod.ko
dm-message.ko    ehci-hcd.ko        libata.ko  ohci-hcd.ko  uhci-hcd.ko
[root@bogon lib]#

/ 应该是在硬盘上的,就像你新加个硬盘要将他挂载一样,需要提前建立一个挂载点,然后将其挂载,当卸载掉设备之后,挂载点仍然不会消失,重启后仍然存在,我是这样理解的

有一种情况比较特殊,那就是用rescue模式的时候,比如redhat,在未执行chroot /mnt/sysimage的时候,执行mkdir 建立目录的时候是在内存中建立的

[ 本帖最后由 Aramis 于 2009-8-4 23:45 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-08-05 00:21 |只看该作者
搜索一下,找了一个IBM的社区文章,关于initrd的
http://www.ibm.com/developerworks/cn/linux/l-k26initrd/index.html

最新的内核都是cpio的
[root@bogon boot]# zcat initrd-2.6.18-128.el5.img |file -
/dev/stdin: ASCII cpio archive (SVR4 with no CRC)

cpio-initrd 的处理流程

1. boot loader 把内核以及 initrd 文件加载到内存的特定位置。

2. 内核判断initrd的文件格式,如果是cpio格式。

3. 将initrd的内容释放到rootfs中。

4. 执行initrd中的/init文件,执行到这一点,内核的工作全部结束,完全交给/init文件处理。

论坛徽章:
0
9 [报告]
发表于 2009-08-05 07:01 |只看该作者
read the fucking code!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP