一.有关硬盘的理论知识
  1.# cat /proc/partitions       --->这是用来查看磁盘分区的情况,这是系统启动时读取的系统分区信息
  2.磁盘要想用,必须要挂载到系统的倒状树上,才能使用。
  3.磁盘要想使用,必须要低格,就是创造磁道的,要想存数据,还需要高格。
  4.每一个文件都对应一个inode号,系统是通过inode号来查找文件的
  5.gnome-mount -t -d  /dev/hdc    --->关在设备
   解释:gnome-mount    是以图形界面的形式挂载的
         -t             是以文本形式挂载的,不让其弹出对话款
         -d             是指定挂载那个设备的
  6.cat /etc/mtab    --->这是一个动态的文件,用来记录系统的挂载设备信息的,mtab:mount table

  二.系统初始化
  1.cat /etc/redhat-release   --->可以查看系统的版本号
  2.uname -a    --->查看当前系统的版本的所有信息
    uname -r    --->只查看内核的版本
    uname -n    --->查看主机名
    uname -v    --->显示内核的版本
    uname -p    --->显示cpu的版本
  3. rpm -qa kernel\*    ---->查看安装的内核

  4.runlevel,运行级别 [0-6]7个级别
    # runlevel     --->查看上一次运行级别和当前级别
    # who -r   --->查看当前运行级别

  5.级别的意义
     0: halt   关机
     6: reboot  重启
 
     3:  字符界面下的正常级别
     5:  图形界面下的正常级别

     1:single user mode   单用户模式,相当于windows的安全用户模式,不需要用户认证登陆
         s,S,single:单用户,和1的意义是一样的,在/etc/rc.d/rc.sysinit定义的
     2:和3差不多,但,不启动NFS
     4:没定义的模式,

  6.init N  可以切换级别
    eg:init 5   启用5级别
       init 0    关机

  7./etc/inittab      ---->定义默认运行级别
    eg:id:5:initdefault:      

  8.chkconfig --list   ---->显示出开机启动的默认级别
   
    关闭或开启某个运行级别的方法
    chkconfig --level 24 ip6tables off|on
    其实,服务的开启与关闭都是靠放在/etc/init.d/的对应脚本来控制的,脚本的名字和服务的名字相同
    eg:/etc/init.d/ip6tables status   ---->查看状态
  
    ntsysv  --->这个命令是在文本模式下的图形界面来控制的
     eg:ntsysv --level 2345     ---->控制那些级别
    
三.引导流程
   1.开机自检(BIOS)-->MBR引导-->GRUB菜单-->加载内核(kernel)-->运行INIT进程-->读取/etc/inittab配置文件
      
    MBR:boot loader引导加载器
   
    grub分两段,
    第一段放在MBR的引导程序中,grub其实就是一个boot loaeder,
    第二段放在操作系统安装程序内核所在的分区上,在这里放置着一个initrd-2.6.18-164.el5.img,它可以启动grubc菜单

    加载内核时去读取根分区,需要展开initrd-2.6.18-164.el5.img,它就是一个小系统
   
    运行INIT进程,就是要运行PID为1的进程,这个进程需要读取/etc/inittab配置文件,根据这个配置文件去执行相关动作
 
  2.读取/etc/inittab配置文件-->执行/etc/rc.d/rc.sysinit脚本
   
    在/etc/inittab配置文件中定义了默认启动级别、系统初始化脚本是谁(/etc/rc.d/rc.sysinit)。

   到这步,主要是硬件初始化,下面是系统初始化

  3.读取/etc/inittab配置文件-->执行/etc/rc.d/rc脚本-->/etc/rcn.d/*(n代表数字)

   这里,主要是根据/etc/inittab定义的默认运行级别,运行下面的/etc/rc.d/rc n 脚本

  在/etc/rc.d/目录里,有许多rcn.d目录(n代表数字),在rcn.d目录下有许多脚本,根据运行级别会执行这里面的相关脚本,在/etc/rc.d/rcn.d/内的链接都指向/etc/init.d/* 内的文件

  /etc/rc.d/rc脚本就只执行/etc/rc.d/rcn.d/(n代表数字)目录内对应的的脚本,以k开头的就kill掉,以s开头的就start

  4.读取/etc/inittab配置文件-->执行/etc/rc.d/rc.local

   这一步,就是在系统初始化快要结束时,读取这个文件,执行里面定义的相关命令

  5.读取/etc/inittab配置文件-->启动mingetty进程
 
   这一步就是启动一个虚拟终端的

   mingetty是在/etc/inittab 中定义的

   在/etc/inittab配置文件的最后面定义了x:5:respawn:/etc/X11/prefdm -nodaemon,是为了帮助我们启动图形界面的

   x:id字段 -->就是一个标志,没什么意义
   5:runlevels字段  -->表示运行级别为5时才执行后面的脚本
   respawn:action字段 --->就是为了定后面的脚本如何执行的
   /etc/X11/prefdm -nodaemon:prcocess字段   --->是要执行的脚本,
     
   id  :用于在inittab文件中唯一标识一个配置记录
   runlevels  :用于指定该记录在哪些运行级别中运行
   action  :用于描述记录将执行哪种类型的动作
   process :用于设置启动进程所执行的命令

四.查看grub的工作流程
  1.grub分两部分:
    第一部分放在MBR里面
    第二部分放在kernel所在的分区上面,即/boot/grub/里面
 
    第一段就是为了引导第二段的

  2.grub.conf是grub的配置文件
    /etc/grub.conf 是/boot/grub/grub.conf的链接
   
  3.有关grub.conf的内容分析
   title  定义默认启动的操作系统的个数
   default  表示默认的启动操作系统是哪个
   timeout 等待用户去编译的时间
   splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz   只是指定启动时的图片的
   hiddenmenu   定义隐藏菜单

  title Red Hat Enterprise Linux Server (2.6.18-164.el5)     -->这里主要是定义菜单中显示的名字
        root (hd0,0)     --->用于指定kernel所在的分区,即/boot分区,grub识别的所有硬盘都是hd格式的,第一个0表示第几块硬盘,第二个0表示第几个分区
        kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/vol0/root rhgb quiet  -->读取上面分区中的内核
        initrd /initrd-2.6.18-164.el5.img  -->是个小linux,为系统提供加载驱动

    注意:上面的/都是以/boot分区为基础的,所以/实际就是指/boot/

  4.解压缩initrd-2.6.18-164.el5.img的步骤,它是cpio压缩的
    1)mkdir /root/initrd
    2)cp /boot/initrd-2.6.18-164.el5.img /root
    3)mv initrd-2.6.18-164.el5.img initrd-2.6.18-164.el5.gz   --->改名字,为了解压缩
    4)gzip -d initrd-2.6.18-164.el5.gz
    5)cd initrd
    6)cpio -id < ../initrd-2.6.18-164.el5

    第二种解压方法:
     cd initrd
     zcat /boot/initrd-2.6.18-164.el5.img | cpio -id

五.当grub破坏了之后,就不能启动了,解决方法
   1.root (hd0,0)                    --->指定分区,
   2.find /vmlinuz-      查找内核
   3.kernel /vmlinuz-2.6.18-164.el5    ---->加载内核
   4.initrd /initrd-2.6.18-164.el5.img   --->加载小linux
    5.boot   启动

六.如何给我们的grub加密码
   1.grub -md5-crypt     加密码
   2.复制生成的乱码
   3.vim /boot/grub/grub.conf
     在hiddenmenu后面添加:
       password --md5 ___    后面是上面复制的乱码

   这样就给grub加密码了


七.有关linux内核的详细信息
  1.grub-->kernel(initrd)-->init(/etc/inittab)

  2.linux内核组键是有三个部分组成的
   第一个是/boot/vmlinuz-version    --->真正的内核
   第二个是/boot/initrd-version.img   ---->提供驱动的小linux,可以解压
   第三个是/lib/modules/version/     --->这里是真正的模块

   除了上面的linux启动还需要内核模块,叫kernel object

   内核是支持模块化的,内核只是提供核心的功能,其它的都靠/lib/modules/`uname -r`/内放置的模块来执行的

  3.lsmod  显示加载的内核模块
    modprobc abc     --->加载模块abc的命令
    modprobc -r abc   --->卸载模块的
  
  4.ldd 可以查看某个命令所依赖的库文件
   eg:ldd /bin/ls

八.做小linux的步骤
  1.加一个硬盘
  2.分区,格式化,挂载硬盘等
  3.我们的新硬盘需要启动需要如下:
   MBR-bootloader
   grub
   /boot,kernel,initrd

  4.mkdir /mnt/boot
    mkdir /mnt/sysroot
  5.# mount /dev/sdb1 /mnt/boot/
    # mount /dev/sdb2 /mnt/sysroot/
  6.# grub-install --root-directory=/mnt /dev/sdb    --->生成grub的
  7.# cd /mnt/boot/
    # cp /boot/vmlinuz-2.6.18-164.el5 ./vmlinuz
  8.下面拷贝initrd的步骤
    # cd /tmp
    # mkdir initrd
    # cd initrd/
    # zcat /boot/initrd-2.6.18-164.el5.img | cpio -id
     -i表示要展开了
     -d表示如果需要目录,就自动创建
   这时就会生成一个小系统了,
    # file init    查看init文件的shell类型,是nash
    # vim init
    注释掉:#echo "Loading dm-mirror.ko module"
            #insmod /lib/dm-mirror.ko
            #echo "Loading dm-zero.ko module"
            #insmod /lib/dm-zero.ko
            #echo "Loading dm-snapshot.ko module"
            #insmod /lib/dm-snapshot.ko

            #echo Scanning and configuring dmraid supported devices
            #echo Scanning logical volumes
            #lvm vgscan --ignorelockingfailure
            #echo Activating logical volumes
            #lvm vgchange -ay --ignorelockingfailure  vol0
            #resume LABEL=SWAP-sda3

     修改成:mkrootdev -t ext3 -o defaults,ro sda2

    下面删除上面注释掉的模块
    # cd lib/
    # rm dm-mirror.ko dm-zero.ko dm-snapshot.ko
    下面重新封装initrd
    # cd ..
    # find . | cpio --quiet -H newc -o | gzip -9 -n > /mnt/boot/initrd.gz
    这是就会在/mnt/boot/目录下生成initrd.gz

 9.下面给grub编辑配置文件
   # cd /mnt/boot/
   # vim grub/grub.conf
   内容如下:
default=0
timeout=3
title MyLinux
     root (hd0,0)
     kernel /vmlinuz ro root=/dev/sd2    -->这是我们上面cp的内核
     initrd /initrd.gz                 --->这是我们上面封装成的initrd.gz

  10.下面我们需要真正的根文件系统
   # cd /mnt/sysroot/
   # mkdir etc lib bin sbin dev tmp proc sys
   # chmod 1777 tmp
   # cp /sbin/init sbin
   # cp /bin/bash bin/

    拷贝我们上面拷贝的两个命令的库文件
    # ldd /sbin/init
    # cp /lib/libsepol.so.1 lib/
    # cp /lib/libselinux.so.1 lib/
    # cp /lib/libc.so.6 lib/
    # cp /lib/libdl.so.2 lib/

    # ldd /bin/bash
    cp的方法同上

  11.上面拷贝的两个命令想要真正的运行,需要配置文件
     编写init的配置文件
      # vim etc/inittab
       内容如下:
       id:3:initdefault:
       si::sysinit:/etc/rc.d/rc.sysinit  ---->定义系统初始化得脚本

     创建我们上面定义的初始化脚本文件
     # cd etc/
     # mkdir rc.d
     # cd rc.d/
     # vim rc.sysinit
       内容如下:
      #!/bin/bash
      #
      echo -e "\tWelcome to \033[31mMy033[0m Linux"

      /bin/bash
 
     # chmod a+x rc.sysinit