系统启动流程:

    POST --> BIOS(Boot Sequence引导次序) --> MBR(bootloader,446byte) --> Kernel --> initrd(initramfs) --> (ROOTFS) --> /sbin/init(/etc/inittab)
内核设计风格:
    单内核:
        所有功能都在一个内核中。Linux采用单内核,但是采用了微内核的设计思想。LWP(轻量级进程 light weight pprocess)。
        核心:
            /boot/vmlinuz-verison
                动态加载ko(kernel object 内核专用模块)。
        内核模块(ko):/lib/modules/KERNELVER/
            常见的装载内核模块命令:
                #insmod
                #modprobe
    微内核:
        把其他功能做成子内核。Windows Solaris。真正意义上的多线程。
内核提供的功能:
    文件系统
    进程管理
    内存管理
    网络管理
    安全功能
    驱动程序
内核初始化过程:
    1.设备探测。
    2.驱动初始化
        可能从initrd(initramfs(RHEL6))件中装载驱动模块。
    3.以只读模式挂载根文件系统(rootfs)。
    4.装载用户空间内第一个进程init(PID=1)
initrd:
    一个中间层系统,在系统启动是提供必要的基本驱动,生成一个临时根,为内核提供访问真正根文件系统所需要的基本驱动程序。待内核成功挂载根文件系统后,会把临时根下的 /proc、 /sys、/dev移动到真的根下。
    ramdisk --> initrd RHEL5 把内存模拟成磁盘使用。
    ramfs --> initramfs RHEL6 把内存模拟成磁盘使用。
    #chroot TEMPROOTDIR [COMMAND] 临时切换为根目录
        例如:
            #chroot /tmp/virroot /bin/csh
    #ldd FILE 显示二进制文件所依赖共享库。
init:
    系统启动的第一个进程。
    bin文件路径:
        /sbin/init
    配置文件:
        /etc/inittab
            每一行记录一个要启动或运行的服务(进程)。
            设定的任务:
                1.设定默认运行级别。
                2.运行系统初始化脚本。
                    /etc/rc.d/rc.sysinit
                3.运行指定运行级别对应目录下的下的服务类脚本。
                    /etc/rc.d/init.d
                    /etc/rc.d/rcNUM.d
                    /etc/rc.d/rc.local 最后执行。
                4.设定ctrlaltdel组合键的动作。
                5.定义ups电源在电源故障或恢复是执行的操作。
                6.启动虚拟终端(level为2345)。
                    1:2345:respawn:/sbin/mingetty tty1
                    ...
                7.启动图形终端(level为5)。
            每行结构如下:
                id:runlevels:action:process
                id:标示。
                runlevels:在哪个级别运行。
                action:在什么事件下执行。
                    initdefault 设定默认运行级别。
                    sysinit 系统初始化。
                    wait 级别切换至此级别时执行。
                    ctrlaltdel 重启。
                    powerfail 电源失效。
                    powerokwait 电源失效后至关机前电源恢复。
                    respawn 一旦程序终止会重新启动。
                process:要运行的程序。
            运行级别:
                各个级别区别在于启动的服务不同。
                0:halt
                1:single user mode
                    直接怡管理员身份登录,无需验证。
                2:mulit user mode no NFS
                    不启动NFS功能
                3:mulit user mode text mode
                    命令行模式
                4:reseved
                    保留级别,暂时未定义。
                5:mulit user mode graphic mode
                    图形模式
                6:reboot
            运行级别的设定:
                修改/etc/inittab
            查看运行级别:
                #runlevel
                    LSATLEVEL THISLEVEL
                其中LASTLEVEL表示上一个级别,N表示没切换过。THISLEVEL表示当前级别。
                #who -r
        /etc/init/*.conf
            该目录下的文件是把inittab文件进行切片后产生的许多.conf文件。都是基于事件驱动编写的。
/etc/rc.d/rc.sysinit
    完成的任务:
    1.激活udev和selinux。
    2.根据/etc/sysctl.conf文件来设定内核参数。
    3.设定系统时钟。
    4.装载键盘映射。
    5.启用swap分区。
    6.设置主机名hostname。
    7.根文件系统检测,并且在无错误以后以读写方式重新挂载。
    8.初始化外围硬件设备的驱动,例如RAID和LVM设备。
    9.启动磁盘配额。
    10.根据/etc/fstab,检查并挂载其他文件系统。
    11.清理过期的锁(/proc/lock)和PID文件。
/etc/rc.d/init.d/*
    服务类脚本,SysV风格,存放在/etc/rc.d/init.d下。有一个链接文件/etc/init.d指向/etc/rc.d/init.d。
    脚本至少接受以下参数:
        start|stop|restart|status
    reload|configtest
    脚本共有特性:
        #chkconfig: RUNLEVELS SS KK
            RUNLEVELS 启动级别
                RUNLEVELS可以用-表示没有级别默认为SNUM开头的链接,即全部都是KNUM开头的链接。
            SS 启动的优先级
            KK 关闭的优先级
            当使用chkconfig命令为此脚本在rcNUM.d目录创建链接时,RUNLEVEL表示默认创建为SNUM开头的文件,除此之外的级别均默认创建为KNUM开头的链接。S后边的启动优先级为SS所表示的数字,K后边的关闭优先级次序为KK所表示的数字。一般SS+KK=99。
        #description: DESCRIPTIONS
            描述信息,用户说明此脚本的简单功能。可以使用\进行续行。
/etc/rc.d/rc.local
    /etc/rc.d/rcNUM.d/S99local和/etc/rc.local都是其链接。
    在系统启动最后执行的服务,准确说应该是脚本。不方便定义为服务等命令都可以在其中写入,在用户登录前执行。
系统启动过程详解:
    bootloader(MBR)
        LILO:LInux LOader
            不能引导1024分区后的内核。不支持大硬盘,但是适合于嵌入式系统。
        GRUB:GRand Unified Bootloader
            stage1:装在MBR中。目的是为了引导stage2。
            stage1.5:用来识别常见的文件系统。
            stage2:位于内核所在分区。/boot/grub/。
GRUB:
    /etc/grub.conf
        grub配置文件。是链接文件,指向/boot/grub/grub.conf
        主要内容如下:
            default=0
                设定默认启动的title编号,编号从0开始。
            timeout=5
                等待选择超时时间。单位是秒。
            splashimeage=(hd0,0)/grub/palash.xmp.gz
                指定grub背景图片。
            hiddenmenu
                是否隐藏菜单。
            password --md5 PASSWORD
                设定GRUB的编辑的密码。可以使用grub-md5-crypt来生成加密的密码。
            title TITLENAME
                内核标题或者是OS的名称,可自由修改。
                root (hdDISKNUM,PARTNUM)
                    指定内核文件所在的设备和分区。对grub而言,所有硬盘一律显示为为hd。DISKNUM表示磁盘序号,PARTNUM表示分区序号。
                kernel KERNEL CMDLINE
                    指定kernel路径即传递给内核的参数。参数文件可以在/proc/cmdline中看到。
                initrd INIDRD
                    指定initrd路径。
                password PASSWORD 启动内核或OS的密码。
    修复grub:
        安装grub stage1:
            #grub
                grub> root (hdDISKNUM,PARTNUM) 指定内核所在的磁盘和分区。
                grub> setup (hdDISKNUM) 在指定的硬盘上安装grub。
                grub> quit
            #fdisk DEVICE
                /dev/PART1 用来做boot
                /dev/PART2 用来做sysroot
            #mkdir /DIR/boot
            #mount /dev/PART1 /DIR/boot
            #grub-install --root-directory=/DIR DEVICE
                此种方式要保证把内核文件所在分区挂载在/boot上。grub只要指定/boot所在的父目录就能自动找到/boot
                。
            #vim /DIR/boot/grub.conf
        grub.conf文件丢失:
            开机进入grub后操作。
            grub> find (hdDISKNUM,PARTNUM)/
                按tab键会显示出相关文件。
            grub> root (hdDISKNUM,PARTNUM)
            grub> kernel /KERNEL
            grub> initrd /INITRD
            grub> boot
#mingetty [OPTION] 启动终端
    [OPTION]
        --loginprog=/bin/login 启动中断后执行的程序。默认为/bin/login。
#agetty [OPTION] PROT BAUDRATE  替代getty命令。
    [OPTION]
        -l LOGIN PROGRAME 指定登陆程序
        -n 不需要用户输入用户名。不需要用户输入登录信息。配合-l一起使用。
    例如:
        #agetty -l /bin/bash 38400  登陆bash并将波特率设定为38400。
#stty [OPTION] DEVICE SETTING 改变和显示终端设备。
    [OPTION]
        -F --file=DEVICE 打开并使用指定的设备
    SETTING:
        size 显示行(rows)列(columns)数。
        speed 显示终端速率。
    例如:
        #stty -F /dev/console size 物理终端
            25 80 25行80列。
        #stty -F /dev/console speed
            38400 每秒38400个字符    
#chkconfig [OPTION]
    指定SysV风格脚本,自动在/etc/rcNUM.d下创建链接。
    [OPTION]
        --list SERVICE  列出所有独立守护进程的启动设定。不加参数显示所有设定。
        --add SERVICE
            自动创建链接,将SERVICE添加到chkconfig控制的服务列表中。下次系统启动生效。
        --del SERVICE
            删除SERVICE所有链接文件。
        --level [RUNLEVELS] SERVICE on|off
            指定级别为RUNLEVELS,SERVICE启动或关闭。对于瞬时守护进程不需要指定RUNLEVLES。RUNLEVELS可以省略,省略默认为2345级别。
守护进程的类型:
    独立守护进程
    瞬时守护进程
        不需要关联至运行级别。
        xinetd:超级守护进程。管理所有瞬时守护进程。本身也是独立守护进程,启动和停止需要关联runlevel。
            瞬时守护进程平时不启动是无法监听端口,是交给超级守护进程监听的。一旦收到请求,超级守护进程会启动对应的进程,转交端口给进程完成工作。完成工作后,超级守护进程继续监听端口。