• ubuntu11.04启动 及虚拟文件系统 分类: arm-linux-Ubuntu 2013-07-22 16:28 369人阅读 评论(0) 收藏


    虚拟文件系统(VFS)是由Sun microsystems公司在定义网络文件系统(NFS)时创造的。它是一种用于网络环境的分布式文件系统,是允许和操作系统使用不同的文件系统实现的接口。虚拟文件系统(VFS)是物理文件系统与服务之间的一个接口层,它对Linux的每个文件系统的所有细节进行抽象,使得不同的文件系统在Linux 核心以及系统中运行的其他进程看来,都是相同的。严格说来,VFS并不是一种实际的文件系统。它只存在于内存中,不存在于任何外存空间。VFS在系统启动时建立,在系统关闭时消亡。

    形象地说,Linux的内核好象一个PC机的母板,VFS就是上面的一个插槽,具体的文件系统 就是一块块的接121卡。因此,每一个文件系统之间互不干扰,而只是调用相应的程序来实现其功能。

    文件系统注册后便在设备上按一定格式建立文件系统,但是此时设备上的文件和节点都还不是可访问的,还不能按照一定的路径名访问其中特定的节点或文件。只有把它安装到文件系统中某个节点上,才能使设备上的文件和节点可被访问。因此注册了wej系统只代表Linux系统支持这种文件系统的应用,要真正使用该文件系统还必须安装它。 

    4 解决问题

    4.1 跨文件系统的文件操作的基本原理

    到此,我们也就能够解释在Linux中为什么能够跨文件系统地操作文件了。举个例子,将vfat格式的磁盘上的一个文件a.txt拷贝到ext3格式的磁盘上,命名为b.txt。这包含两个过程,对a.txt进行读操作,对b.txt进行写操作。读写操作前,需要先打开文件。由前面的分析可知,打开文件时,VFS会知道该文件对应的文件系统格式,以后操作该文件时,VFS会调用其对应的实际文件系统的操作方法。所以,VFS调用vfat的读文件方法将 a.txt的数据读入内存;在将a.txt在内存中的数据映射到b.txt对应的内存空间后,VFS调用ext3的写文件方法将b.txt写入磁盘;从而实现了最终的跨文件系统的复制操作。

    4.2“一切皆是文件的实现根本

    不论是普通的文件,还是特殊的目录、设备等,VFS都将它们同等看待成文件,通过同一套文件操作界面来对它们进行操作。操作文件时需先打开;打开文件时, VFS会知道该文件对应的文件系统格式;当VFS把控制权传给实际的文件系统时,实际的文件系统再做出具体区分,对不同的文件类型执行不同的操作。这也就 一切皆是文件的根本所在。

    5 总结

    VFS即虚拟文件系统是Linux文件系统中的一个抽象软件层;因为它的支持,众多不同的实际文件系统才能在Linux中共存,跨文件系统操作才能实现。 VFS借助它四个主要的数据结构即超级块、索引节点、目录项和文件对象以及一些辅助的数据结构,向Linux中不管是普通的文件还是目录、设备、套接字等都提供同样的操作界面,如打开、读写、关闭等。只有当把控制权传给实际的文件系统时,实际的文件系统才会做出区分,对不同的文件类型执行不同的操作。由此可见,正是有了VFS的存在,跨文件系统操作才能执行,Unix/Linux中的一切皆是文件的口号才能够得以实现


    ***********************ubuntu启动过程***********************

    加载内核

    initrd
    init
    login

    系统启动和第一阶段是所有系统都相同的
    系统启动
    1、系统加电
    2、BIOS 自检 → 本地设备枚举和初始化(概括来说有三个步骤)
       首先检测外围设备
       其次检测启动设备
       最后读取与执行启动设备的第一个扇区
    3、POST 代码从内存中清除,但运行时服务(runtime service)仍然留在内存。
    4、BIOS 从 CMOS 的设置中找出第1/2/3 启动设备(可能有第4个),然后逐个尝试,
       并在第一个 ”active“状态的硬盘上读入其 MBR
     
    第一阶段引导加载程序
    1、MBR 实际上是由3个部分组成 :主引导加载程序(master bootloader code,446 字节)、主分区表  (ppt)、magic nubmer (0xAA55)组成
       主分区表有4个记录,对应主分区1-主分区4,共64 字节。最后的 magic number 是 2 字节
    2、主引导加载程序搜索主分区表,扫描全部4个分区记录,确保只有1个是被标为”active“ 的(用 fdisk 可以设置某个分区为 active 分区)。
       然后读入该分区的引导扇区(前512 字节)。active 分区一般是 C 盘或者 linux 的第一个分区
    3、主引导加载程序的作用就是读入第2阶段的引导加载程序
     


    第二阶段引导加载程序
    1、第2阶段引导加载程序的目的是加载内核和 initrd 。GRUB 和 LILO 都是把 boot loader 程序分成两部分,一部分在 MBR ,一部分在”active" 分区的引导扇区
    2、第2阶段引导加载程序被读入内存后,它读取 root() 命令给出的分区下的 /boot/grub/grub.cfg ,显示一个菜单,供用户选择
    3、GRUB 可以细分为3个阶段,中间的一个是 stage1.5 ,它跟在 stage1 的后面,目的是让 grub 能够识别文件系统的类型
     

    1、加载内核,内核自解压(/boot下的vmlinuz是可引导的、压缩的内核,“vm”即“Virtual Memory”,2.6.3.8就只有4M)
    **********************vmlinuz概述*********************************************
    vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行的 Linux内核,它位于/boot/vmlinuz,它一般是一个软链接
    两种建立方式
       一是编译内核时通过“make zImage”创建,然后通过:“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage/boot/vmlinuz”产生。zImage适用于小内核的情况,它的存在是为了向后的兼容性。

      二是内核编译时通过命令make bzImage创建,然后通过:“cp/usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz”产生。bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起误解,bz表示“big zImage”。 bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有 gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。

      内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage。 vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。
    ************************************************************************************************
    2、按照 bootloader 向它提供的 initrd 在内存中的地址,initrd.img加载到内存

    ***********************************initrd的概述和机制******************************************************************

    初始 RAM 磁盘(initrd)是在实际根文件系统可用之前挂载到系统中的一个初始根文件系统。initrd 与内核绑定在一起,并作为内核引导过程的一部分进行加载。内核然后会将这个 initrd 文件作为其两阶段引导过程的一部分来加载模块,这样才能稍后使用真正的文件系统,并挂载实际的根文件系统。

    initrd 中包含了实现这个目标所需要的目录和可执行程序的最小集合,例如将内核模块加载到内核中所使用的 insmod 工具。

    在桌面或服务器 Linux 系统中,initrd 是一个临时的文件系统。其生存周期很短,只会用作到真实文件系统的一个桥梁。在没有存储设备的嵌入式系统中,initrd 是永久的根文件系统
    initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。在 linux内核启动前, boot loader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。在 boot loader 配置了 initrd 的情况下,内核启动被分成了两个阶段,第一阶段先执行 initrd 文件系统中的"某个文件",完成加载驱动模块等任务,第二阶段才会执行真正的根文件系统中的 /sbin/init 进程。这里提到的"某个文件",Linux2.6 内核会同以前版本内核的不同,所以这里暂时使用了"某个文件"这个称呼,后面会详细讲到。第一阶段启动的目的是为第二阶段的启动扫清一切障爱,最主要的是加载根文件系统存储介质的驱动模块。我们知道根文件系统可以存储在包括IDE、SCSI、USB在内的多种介质上,如果将这些设备的驱动都编译进内核,可以想象内核会多么庞大、臃肿。

    linux2.6 内核支持两种格式的 initrd,一种是 linux2.4 内核那种传统格式的文件系统镜像-image-initrd,它的制作方法同 Linux2.4 内核的 initrd 一样,其核心文件就是 /linuxrc。另外一种格式的 initrd 是 cpio 格式的,这种格式的 initrd 从 linux2.5 起开始引入,使用 cpio 工具生成,其核心文件不再是 /linuxrc,而是 /init,

    11.04用的是cpio格式

    cpio-initrd 的处理流程

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

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

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

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

    image-initrd的处理流程

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

    2. 内核判断initrd的文件格式,如果不是cpio格式,将其作为image-initrd处理。

    3. 内核将initrd的内容保存在rootfs下的/initrd.image文件中。

    4. 内核将/initrd.image的内容读入/dev/ram0设备中,也就是读入了一个内存盘中。

    5. 接着内核以可读写的方式把/dev/ram0设备挂载为原始的根文件系统。

    6. .如果/dev/ram0被指定为真正的根文件系统,那么内核跳至最后一步正常启动。

    7. 执行initrd上的/linuxrc文件,linuxrc通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动, 以及加载根文件系统。

    8. /linuxrc执行完毕,常规根文件系统被挂载

    9. 如果常规根文件系统存在/initrd目录,那么/dev/ram0将从/移动到/initrd。否则如果/initrd目录不存在, /dev/ram0将被卸载。

    10. 在常规根文件系统上进行正常启动过程 ,执行/sbin/init。

    **********************initrd里头的/linuxrc 或者/init的执行步骤**************************

    3、执行其上面的 /linuxrc 或者 /init 脚本,目的是加载驱动模块
    4、在 /linuxrc 和 /init 脚本中,会有 pivot_root ()或者 switchroot 把 /sysroot 下的真正根文件系统设备挂载到 / ,把初始根文件系统挂载到 /initrd 下
    5、/linuxrc 和 /init 脚本的后面会 umount /initrd 下的初始根文件系统(即使没有完全卸载,也会在 /etc/rc.d/rc.sysinit 中把它们全部卸载)

    查看 initrd 的内容适用于cpio格式的
    # mkdir temp ; cd temp  # cp /boot/initrd-2.6.14.2.img ./  # cpio -i --make-directories < initrd-2.6.14.2.img  然后你就会看到
    bin  conf  etc  init  initrd-2.6.38.img  lib  sbin  scripts  usr
    所执行的init就在这个文件系统的根目录下  
    制作initrd可见:http://www.ibm.com/developerworks/cn/linux/l-k26initrd/

    **************************两个阶段过后init进程*************************
    启动 init 进程。在 2.4 内核中,这个步骤是由内核完成的。但在 2.6 内核中,这个步骤是由 /init 脚本完成的。
    Init
    1、/etc/rc-sysinit.conf
    2、/etc/init.d/rcS
    3、/etc/init.d/rc S
    4、默认runlevel是2,执行/etc/rc[runlevel].d/下的所有文件,其中S表示启动,随后的数字表示启动的顺序,最后一个是/etc/init.d/rc.local,local是S99rc.local
    ********************************************login******************************************************
    登陆界面login
    1 /etc/profile
    2 /etc/bash.bashrc
    3 ~/.profie
    4 ~/.bashrc

    /etc/profile和/etc/bash.bashrc设置环境变量和bash shell的设置,对所有用户生效

    ~/.bashrc和~/.profile同上,只对此用户生效
    参考
    ubuntu10.04启动:http://wiki.ubuntu.org.cn/%E5%90%AF%E5%8A%A8
    redhat启动浅谈http://my.chinaunix.net/space.php?uid=14439719&do=blog&id=130599#quickcommentform_130599
    linux架构和目录:http://blog.csdn.net/runningya/archive/2010/01/01/5118277.aspx

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Rhythmbox中文乱码解决的方法
    苟富贵勿相忘
    C++“窗体”程序设计启蒙
    Java模式(适配器模式)
    sql server 2005 32位+64位、企业版+标准版、CD+DVD 下载地址大全
    STL学习小结
    Spring3.0 AOP 具体解释
    图解iPhone开发新手教程
    已有路由器为何还要交换机
    路由器功能
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706958.html
Copyright © 2020-2023  润新知