首页 > 其他 > 详细

11.开机流程、模块管理与loader

时间:2014-02-22 03:30:08      阅读:505      评论:0      收藏:0      [点我收藏+]

 


Boot Loader:认识操作系统的文件格式,并据以加载核心到主存储器执行。LILO(早期)、grub(现在主流)、spfdisk(台湾)

BIOS:(Basic Input Output System)"基本输入输出系统"。其实,它是一组固化到计算机主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

CMOS:(Complementary Metal Oxide Semiconductor),互补金属氧化物半导体常指保存计算机基本启动信息(如日期、时间、启动设置等)的芯片。有时人们会把CMOS和BIOS混称,其实CMOS是主板上的一块可读写的RAM芯片,是用来保存BIOS的硬件配置和用户对某些参数的设定。

PnP设置:(plugin and play)PNP是由Microsoft提出的,意思是系统自动侦测周边设备和板卡并自动安装设备驱动程序,做到插上就能用,无须人工干预,是Windows自带的一项技术。

MBR:(master boot record)主要启动记录区,每个开机装置的第一个启动扇区

INT 13:直接通过控制磁盘控制器来访问磁盘,但这样就要涉及许多的硬件细节,如是OS们都借助于BIOS的int 13h中断例程来访问磁盘.

SATA:(Serial Advanced Technology Attachment),是由Intel、IBM、Dell、APT、Maxtor和Seagate公司共同提出的硬盘接口规范。

IDE:Integrated Drive Electronics)即“电子集成驱动器”,俗称PATA并口。


 

/boot/vmlinuz     or   /boot/vmlinuz-verson          ----核心档案

/lib/modules                ----模块的放置位置(驱动程序多以模块的方式存在,/lib和/必须在同一分区)

/boot/initrd     or   /boot/initrd-verson          ----虚拟文件系统 ,能够透过boot loader加载到内存仿真成一个根目录,该文件系统还可提供一直程序加载开机过程需要的核心模块(驱动程序)

/etc/inittab                ----/sbin/init的配置文件,包含runlevel等设定项目

/etc/rc.d/rc.sysinit        ----这个脚本在加载各项系统服务前设定好系统环境(不同的发行版可能会不同)【1-12】

/etc/rc.d/rc.local            ----用户自定义的开机启动脚本

/etc/sysconfig/                ----开机过程涉及到的配置文件

/etc/sysconfig/modules/                ----用户自定义加载的模块的位置

/etc/modprobe.conf                ----对应自定义模块的配置文件(系统发现驱动程序错误时我们才需要手动处理),更多信息:man modprobe.conf

/boot/vmlinuz        or        /boot/vmlinuz-verson        ----..核心

/boot/initrd     or   /boot/initrd-verson        ----..核心解压缩需要借助的虚拟文件系统

/lib/modules/version/kernel            or        /lib/modles/$(username -r)/kernel

/usr/src/linux                ----核心原始码,预设不会安装

/proc/verson                ----核心版本

/proc/sys/kernel                ----系统核心功能

 


 

 

1 . linux的开机流程分析

    1.1开机流程一览【1-0】

    1.2BIOS,boot loader与kenel载入    

        1.1.1BIOS,开机自测与MBR

        1.1.2Boot Loader的主要功能

            注意:每个文件系统(扇区)都会保留一个boot sector(启动扇区)提供给操作系统安装boot loader,如果一个系统安装在A分区,那么MBR和A分区的boot loader中都会保存一份boot loader.【1-1】

            一:提供选单

            二:载入核心档案

            三:转交其它loader

            【开机管理程序的选单功能与控制权转交功能示意图    1-2】

        1.1.3加载核心侦测硬件与initrd的功能

        注意:linux将核心解压缩到主存储器后开始接管BIOS后的工作,利用核心的功能侦测驱动周边装置。核心会重新侦测一遍硬件,不一定会用到BIOS侦测的硬件信息。

        # ls --format=single-column -F /boot        ----观察与核心相关的文件【1-3】

        【 BIOS与boot loader及核心加载流程示意图    1-4】

        1.现将/boot/initrd复制到/tmp/initrd中,等待解压缩

        # mkdir /tmp/initrd 

        # cp /boot/initrd-2.6.18-92.el5.img  /tmp/initrd/

        # cd /tmp/initrd

        # file  initrd-2.6.18-92.el5.img        ----查看该文件的格式,发现时gzip压缩格式

        2.将上述档案解压缩

        #  mv initrd-2.6.18-92.el5.img    initrd-2.6.18-92.el5.gz      ----改成文件名改为.gz结尾,这样一来解压缩软件就可以识别了

        # gzip -d initrd-2.6.18-92.el5.gz        ----解压缩

        # file initrd-2.6.18-92.el5        ----查看该档案的类型信息,发现是cpio指令压缩成的

        3.用cpio指令解压缩

        # cpio -ivcdu <   initrd-2.6.18-92.el5 ;ll       ---解压换个文档看看虚拟恩建系统是什么样子的【1-5】

        4.观察init档案内重要的执行项目

        # cat /tmp/initrd/init        ----【1-6】

    1.3第一支程序Init及配置文件/etc/inittab与runlevel

        1.3.1Run level:执行等级有哪些【1-7

        # cat /etc/inittab        ----【1-8,9】

        【1-10    inittab的档案语法】

        1.3.2init的处理流程和简单设置方法【1-11】

    1.4init处理系统初始化流程(/ec/rc.d/rc.sysinit)

        # cat /etc/rc.d/rc.sysinit        ----查看各种服务启动之前系统的的初始化工作【1-12】

    1.5启动系统服务与相关启动配置文件(/etc/rc.d/rc N & /etc/sysconfig)

        # ll /etc/rc5.d/        ----观察run level为5时系统服务的启动情况(可以观察一下/etc/init.d/rc这个脚本)

    1.6用户自定义开机启动程序(/etc/rc.d/rc.local)

    注意:一种比较麻烦的方法是将自定义的脚本放到/etc/init.d/下,然后在/etc/rc5.d/下建立连结档,下面给出通常的简单的方式

    # vim /etc/rc.d/rc.local            ----该文档由/etc/rc.d/rc.sysinit在系统初始化时调用

    1.7根据/etc/inittab之设定,加载终端机或x-windows接口【1-14】

    1.8开机过程会用到的主要配置文件:/etc/modprobe.conf,/etc/sysconfig/*

        1.8.1关于模块:/etc/modprobe.conf【1-15】

        1.8.2/etc/sysconfig/*【 1-16 几个重要配置文件介绍】   

    1.9Runlevel的切换:runlevel,init

        注意:# init 0    ----实现关机;# init 6实现重启

        # renlevel        ----查看主机目前的run level

        # init 3        ----暂时切换run level为3(如果想在下次开机时依然生效需要修改/etc/inittab)

        # runlevel        ----查看变化

 


 

2 .核心与核心模块

    /boot/vmlinuz        or        /boot/vmlinuz-verson        ----..核心

    /boot/initrd     or   /boot/initrd-verson        ----..核心解压缩需要借助的虚拟文件系统

    /lib/modules/version/kernel            or        /lib/modles/$(username -r)/kernel

    /usr/src/linux                ----核心原始码,预设不会安装

    /proc/verson                ----核心版本

    /proc/sys/kernel                ----系统核心功能

    /lib/moduels/$(uname -r)/modules.dep            ----记录了核心支持的模块的各项相依相

    2.1核心模块与相依性:depmod

    # ll /lib/moduels/$(uname -r)/kernel        ----查看核心目下的子目录【1-18】

    depmod    建立核心模块相依性档案的指令【1-19】

    案例一:假设做好了一个网卡驱动程序a.ko,更新核心相依性

    # cp a.ko    /lib/modules/$(uname -r)/kernel/drivers/net        ----将驱动模块放入相应的文件夹中(系统给了特殊定义的文件夹)

    # depmod        ----该指令会将使之前做好的程序移动到标准放置目录,并依据相关目录的定义将所有模块捉出来分析,最后将分析的结果写入/lib/moduels/$(uname -  r)/modules.dep文档中

    2.2核心模块的观察:lsmod,modinfo

        # lsmod        ----查看目前核心加载的全部模块,显示格式(模块名称 模块大小 被谁使用)【1-20】

        # modinfo mi    ----查看模块mi的详细信息,可以看到这个模块的来源以及模块的说明,该指令还可以查看模块的档案(需要完整档名)

    2.3核心模块的加载与移除:insmod,modprobe,rmmod

        insmod    手动加载模块指令,要求后面跟模块(建议使用modprobe,会主动检查模块依赖性)

        # insmod /lib/modules/$(uname -r)/kernel/fs/cifs/cifs.ko        ---手动载这个文件系统相关的模块,后面必须是(不会自动检查模块的依赖性)

        # lsmod | grep cifs        ----看看是否手动载入成功

        rmmod    手动移除模块,如果有依赖问题将无法移除【1-22】

        # rmmod  cifs        ----将刚刚加载的模块移除

        modprobe    取代insmod和rmmod,自动解决依赖问题

        # modprobe cifs        ----    加载cifs文件系统模块(不需要完整的档名,因为完整文件名记录在/lib/mudules/`uname -r`/modules.dep,而该指令会自动搜寻这个文件)【1-23】

        # modprobe -r cifs        ----移除这个模块

        案例一:手动加载vfat这二个模块,然后观察vfat依赖的模块

        # modprobe vfat        ----加载模块

        # lsmod | grep vfat        ----观察发现是fat

    2.4核心模块的额外参数设定:/etc/modprobe.conf 

        案例一:两个网络卡使用同意该模块,设置额外的模块参数防止冲突

        # vi /etc/modprobe.conf

        alias eth0 ne    ----eth0网卡使用ne这个模块

        alias eth1 ne    ----eth1网卡也使用这个模块

        options eth0 io=0x300 irq=5        ----强制指定io基地址和中断请求

        options eth1 io=0x320 irq=7 

        注:查看系统资源配置信息

        # cat /proc/interrupts        ---- 列出正在使用的IRQ(共16条IRQ请求线)中断资源

        # cat /proc/ioports        ----列出正在使用的io端口地址

        # cat /proc/dma        ----列出正在使用的dma(直接存储器存取,DMA0-7)通道


3 .Boot loaler:Grub

    3.1boot loader的两个stage

        stage1:执行MBR或者boot loader中的最小主程序(只有446bytes的存储空间,只有最小主程序存储在里面)

        stage2:主程序加载配置文件(一般来说都在/boot/下面)

        #  ls -l /boot/grub        ----查看与grub有关的配置文件【1-24】

    3.2grub的配置文件/boot/grub/menu.lst与选单类型:磁盘代号,menu.lst

        注意:grub是目前应用最广泛的开机管理程序,它的特点:【1-25】

        3.2.1硬盘与分割槽在grub中的代号【1-26】

        案例:假设系统中只有一颗sata硬盘,该硬盘的第一个逻辑分割槽在Linux与grub当中的代号和档名【1-27】

        档名:/dev/sda5        grub中的代号:(hd0,4)

        3.2.2/boot/grub/menu.lst配置文件

        # vim  /boot/grub/menu.lst            ----看看grub的配置文件【1-28,29】

            3.2.2.1选单中提供的两种开机方式

                第一种:直接指定核心开机(以/boot独立分区的情形为例)

                # vim /boot/grub/menu.lst

                title CentOS(2.6.18-92.el5)        ----    设置这个选单的标题

                    root (hda0,0)        ----root指核心档案所在的分区而不是根目录所在分区,这里指的是第一块硬盘的第一个分区(/boot在/dev/hda1为独立分区)

                    kernel    /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite        ----指出核心档名和根目录挂载的分区(/1指的是/dev/hda2),rhgb指色彩显示,quite是安静模式

                    initrd    /intrd-2.6.18-92.el5.img        ----这里指出虚拟文件系统的档名

            或者

                 title CentOS(2.6.18-92.el5)

                    kernel    (hda0,0) /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite      

                    initrd    (hda0,0) /intrd-2.6.18-92.el5.img   

                注:/boot独立分区和非独立分区各给出一个案例【1-30】 

 

                第二种:利用chain loader转角控制权的方式

                # vim /boot/grub/menu.lst

                title windows  partition        ----该案例针对装在/dev/hda1上的windows

                    root (hd0,0)        ----指出chain loader在第一块硬盘的第一个分割槽内

                    chainloader    +1    ----在这个分区的第一个扇区(即boot loader的位置)

            改进(该分区需要设定为激活状态)

                title windows  partition 

                    hide (hd0,4)        ----隐藏/dev/hda5上的linux

                    rootnoverity (hd0,0)        ----grub默认检查激活状态,我们设定不检查这个分区

                    chainloader +1

                    makeactive        ----设定此分区为开机碟

    3.3initrd的重要性与建立新的initrd档案:mkinitrd

    注意:initrd未必会被用到,只有当核心不具备某种驱动以识别某些类型的文件系统是才需要,比如驱动在IDE接口的硬盘中就不需要,因为核心具备相关驱动【1-31】

    mkinitrd    重置initrd文件的指令【1-32】

    案例一

    # mkinitrd    -v initrd_$(uname -r)  $(uname -r)       ----以默认方式建立一个新的initrd档案,指定核心的版本并显示运作过程

    # ll initrd_*        ----可以看看这个档案建立好了没【1-33】

    案例二

    # mkinitrd -v --with=8139too initrd_vbirdtest  $(uname -r)        ----创建时添加8139too这个模块  ,意味着载入虚拟文件系统时会载入这个模块 

    3.4测试与安装grub:grub-install,grub sheel

    grub-install    安装grub配置文件的指令【1-34】

    案例一:将grub安装在目前系统的MBR下,系统所在磁盘为/dev/hda

    # grub-install /dev/hda        ---查看/boot/grub下回发先文件已经被更新了

    案例二:将grub安装在某个指定分区的Boot sector内(假设/dev/hda3),注意grub可以安装在该系统所挂载的任何一个分区的boot sector内,不妨假设为/home挂载的位置

    # ggrub-install --root-directory=/home  /dev/hda3

    # ll /home/boot/grub/        ----    观察安装进来没有

    案例三:编辑三个开机选项【1-35】 

    # vim /boot/grub/menu.lst

    default=0        ----第一个选单为默认选单

    timeout=30        ----设置等待30秒

    splashimage=(hd0,0)/grub/splash.xpm.gz        ----选单背景图片的位置

    #hidenmenu        ----读秒期间显示完整的选单画面(预设隐藏)

    title CentOS(2.6.18-92.el5)

        root (hd0,0)       ----root指核心档案所在的分区而不是根目录所在分区,这里指的是第一块硬盘的第一个分区(/boot在/dev/hda1为独立分区)

        kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite        ----指出核心档名和根目录挂载的分区

        initrd /initrd-2.6.18-92.el5.img        ----虚拟文件系统的档名

    title /dev/hda1 boot sector <=====================本例中的第一个新增选单(使用/dev/hda1中的boot loader)

        root (hd0,0)

        chainloader +1        ----第一个扇区

    title MBR loader        <=========================新增第二个选单(重新读取MBR中的boot loader)

        root (hd0)        ----用整颗硬盘的代号表示MBR

        chainloader +1

    title single use mode    <========================新增第三个选单(强制进入单人维护模式)

        root (hd0,0)       ----root指核心档案所在的分区而不是根目录所在分区,这里指的是第一块硬盘的第一个分区(/boot在/dev/hda1为独立分区)

        kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite   single     ----指出核心档名和根目录挂载的分区、单人维护模式 

        initrd /initrd-2.6.18-92.el5.img        ----虚拟文件系统的档名

            grub sheel     安装grub主程序到boot loader的工具

                    1.几个常用指令

                        grub> root (hdx,x)        选中含有grub目录的分区(/boot/grub/所在的分区)

                        grub> find /boot/grub/stage1        ----看看能否找到安装信息档案

                        grub> find /boot/vmlinuz        ----看看能否找到核心文件

                        grub> setup (hdx,x)        ---将grub安装在该分区上的boot sector

                        grub> setup (hdx)        ----将grub装在相应硬盘的MBR上

                        grub> quit        ----离开grub sheel

                      2.几个案例

                        案例一

                        # grub         ---进入grub sheel

                        grub> root (hd0,0)        ----/boot/grub在hda1中,grub能分辨出该分割槽的文件系统

                        grub> find /boot/grub/stage1        ----看看有没有grub主程序,会显示装置的档名

                        grub> find /boot/vmlinuz-2.6.18-92.el5     ----搜寻核心(/boot不独立分区)     or     find /boot/vmlinuz-2.6.18-92.el5     ----搜寻核心(/boot独立分区)

                        grub> setup (hd0)        ----将主程序安装到MBR

                        grub> setup (hd0,0)        ----在/dev/hda1的boot sector中 也安装一份

                        grub>quit        ----退出grub sheel,安装好的grub主程序会读取/(hd0,0)/gurb/menu.lst这个配置文件

    3.5开机前的额外功能修改

    注意:遇到开机问题时可以尝试在选单阶段重新编辑选单,但是如果grub也故障的话就应该尝试外部挂载方式启动了

    3.6关于核心功能中的vga设定(修改终端分辨率)

        # grep ‘FRAMEBUFFER_CONSOLE‘ /boot/config-2.6.18-92.el5        ----查看核心是否支持终端分辨率的修改

        CONFIG_FRAMEBUFFER_CONSOLE=y        ----这一行后面为y表示支持,如果被注释或者n表示不支持

        # vim /boot/grub/menu.lst

         title CentOS(2.6.18-92.el5)

                    kernel    (hda0,0) /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite vga=790    ----分辨率设置依据表【1-36】      

                    initrd    (hda0,0) /intrd-2.6.18-92.el5.img   

    3.7BIOS无法读取大硬盘的问题

        原因:BIOD无法正确识别大硬盘中kernel和initrd存储的实际位置

        解决方法一(系统安装前):根据BIOS至少能够读取1024磁柱以内的数据,分区时将/boot独立分区且先分出这个分区给/boot    (推荐)

        解决方法二(系统安装后):简单一点直接重灌,即重新制作一个分区挂载/boot,保证这个新的/boot挂载的分区在1024转以内    (推荐)

        解决方法三(后):用光驱开机,借助grub的可编写能力进入linux

        解决方法四:直接将硬盘的信息写到BIOS

    3.8为个别选单加上密码:gurb-md5-crypt

        # grub-md5-crypt        ----通过这个指令得到一个对密码字串加密后的md5值,$.....(以$开头,以 . 结尾)

        # vim /boot/grub/menu.lst        ---编辑grub配置文件对选单加密

 

        title CentOS(2.6.18-92.el5)

                    password    --md5 $.......        ----这一行具备加密的作用,注意一定是在title底下第一行,这种方式可以通过编辑模式计入选单修改选单破解

                    kernel    (hda0,0) /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite vga=790    ----分辨率设置依据表【1-36】      

                    initrd    (hda0,0) /intrd-2.6.18-92.el5.img  

        升级 (用户想进入编辑模式的话就要输入密码)

 

    default=0        ----第一个选单为默认选单

    timeout=30        ----设置等待30秒    

    password    --md5 $.......        ----放在整体设置处

    splashimage=(hd0,0)/grub/splash.xpm.gz        ----选单背景图片的位置

    #hidenmenu        ----读秒期间显示完整的选单画面(预设隐藏)

    title CentOS(2.6.18-92.el5)

       lock             ----在选单中增加lock字段

       kernel    (hda0,0) /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite vga=790    ----分辨率设置依据表【1-36】      

       initrd    (hda0,0) /intrd-2.6.18-92.el5.img 

 

 


4 .开机过程中的问题解决

    4.1忘记root密码的解决之道

        第一步:重启

        第二步:开机进入grub选单

        第三步:选择一个进入详细设定,移动到kernel那一行,e进入编辑状态

        grub edit> kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quite  single

        第四步:【ENTER】,b,这时进入单人维护模式并得到一个sheel

        第五步:# passwd        ----重置root的密码

        第六步:# init 5        ----进入x窗口模式

    4.2init配置文件错误(/etc/inittab损坏)

        第一步:重启

        第二步:开机进入grub编辑状态

        第三步:grub> kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quite  init=/bin/bash        ----因为执行init时,任何开机模式都需要读取/etc/inittab文件,因此我们将实际的init替换为/bin/bash,从而掠过文件系统直接进入bash sheel

        第四步:【ENTER】,b,这时一个sheel工作

        第五步:# mount  -o remount,rw  /        ----因为根目录在开机阶段是以只读的方式挂载的,因此我们重新以可擦写状态挂载

                      # mount -a        ----根据/etc/fstab的内容进行重新挂载文件系统测试

        第六步:此时可以进行救援了(修改/etc/inittab)

        第七步:重启

    4.3BIOS磁盘对应的问题(device.map),两个系统分别安装在两颗磁盘

    注意:此时BIOS依据设定获得第一个可开机的装置,并读取boot loader,即grub,但grub中对磁盘的记录代号是依据侦测的顺序编写的,可能不对应BIOS的指定

    # vim /boot/grub/device.map        ----写死装置的对应

     (fd0)    /dev/fd0

    (hd0)    /dev/hda

    或者

    # grub-install  --recheck /dev/hda1    ----device.map会被主动更新

    4.4因文件系统错误而无法开机

       【文件系统错误示意图    1-37】

        Give root passwd for maintenance

        (or type Control-D to continue):******        ----输入密码取得bash

        # mount -o remount,rw   /     ----将根目录重新挂载为可读写状态

        # fsck  /dev/md0        ----做quota时出错的话用fsck进行检测

        clear[Y/N]y        ----清理错误

    4.5利用chroot切换到另一颗硬盘工作

    第一步:进入一个正常的linux系统(cd/u盘/硬盘)

    第二步:将故障的linux所在的分区全对应原来分区挂载的位置部进行如下挂载

    # mount /dev/hdb1  /chroot/

    # mount /dev/hdb2   /chroot/var

    # mount /dev/hdb3   /chroot/home

    # mount /dev/hdb4  /chroot/usr

    # chroot /chroot        ----更换根目录

5.重点回顾【1-38】

6.本章习题

模拟题一:利用救援光盘来处理系统错误导致的无法开机的问题

第一步:利用光盘开机,进入救援模式侦测

boot:linux rescue        ----进入救援模式的侦测,按下F5就可以看到输入的选项

第二步:进行类似装机的基本设置,之后救援光盘会将侦测到的centos整合成一个chroot等待处理

第三步:chroot /mnt/sysimage        ----进入侦测到的出问题的系统,这是会得到一个sheel

第四步:# df        ----查看出错的系统是否被正确地挂载了

第五步:对系统进行修复

简答题:【1-39,40】

11.开机流程、模块管理与loader

原文:http://www.cnblogs.com/eli01/p/3559675.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!