内核构成:

    内核模块(ko):/lib/modules/version

     核心: /boot/vmlinuz-version

内核设计:

     单内核:linux使用的这个  但是借用了微内核的优势

     微内核

装在模块命令:

     insmod:

     modprobe:

下载内核地址:www.kernel.org     

uname -r 查看内核版本号

###########################################

用户空间访问、监控内核的方式

/proc; /sys 伪文件系统,他们的文件大部分是只读的

/proc/sys:此目录中的文件很多是可读写的

/sys/ :某些文件可写 

    例如/proc/sys/vm  

            该目录下有swappiness 表示是否使用交换内存

                      drop_caches 在这个文件里echo 1 就可以清除掉buffers 和cached的数据

 ######################

设定内核参数的方法:

   例: echo 1 > /proc/sys/vm/drop_caches

          free -m 可以发现 buffers 和cached的值为0

  例:cat /proc/sys/kernel/hostname 有一个hostname    

           echo www.whoami.com > /proc/sys/kernel/hostname可以改计算机名

###############################################################

sysctl -w kernel.hostname="mylab.mageedu.com"可以省去目录,和/替换为.

sysctl -w vm.drop_caches=1  就可以实现效果,但是必须在/proc/sys目录下

立即生效,但不能永久生效。

########################################################

要想永久有效: 

   例:系统上有两块网卡,加入一块儿网卡ping不到目的地,我们可否用另一块儿网卡ping

1、 cat /proc/sys/net/ipv4/ip_forward   0表示不启用 1表示启用

2、 vim /etc/sysctl.conf  在第七行将0改为1

3、 sysctl -p 通知内核重读   实现立即生效并永久有效

  sysctl -a 显示所有内核参数及其值


以上内容我们要记住常用的三个内核参数  drop_caches;ip_forward;hostname

###################################################################################

内核模块管理:

 查看:lsmod:列出当前内核中的每个模块和模块名称、大小、被谁调用了几次

 装载:modprobe MOD_NAME  实现装在某个模块

 卸载:modprobe -r MOD_NAME 卸载某个模块   不需要指定路径

 查看模块具体信息:modinfo MOD_NAME:(会显示模块的路径)(sig签名)(depends:所依赖的模块)(description 描述信息)    

##############################################

实现模块装卸在还有另外一组命令:

   insmod /path/to/somemod:装载模块 必须指定模块路径;modeinfo可以查找路径

   rmmod mod_name :卸载模块 不需要指定路径

###############################################

内核中的功能除了核心功能之外,在编译时有三种选择

  1、不适用此功能

  2、编译成内核模块

  3、编译进内核

#############################################

如何手动编译内核:

   1、直接升级成最新的可能会不兼容;

   2、首先要安装编译环境;Development Tools ;Development Libraries 

   3、下载内核

   4、内核的源码一般都在/usr/src目录下

   5、tar xf linux-2.6.28.tar.gz -C /usr/src解压到这个目录

   6、将解压后的内核文件,连接为linux

      ln -sv linux-2.6.28.10  linux

   7、站在linux目录上有很多目录(arch里面是各种平台;fs是各种文件系统 ;想深入学习linux可以看一看Documenttation这里面的文件;我们学linux的核心就是学内核)

   7.5、安装gcc  和ncurses-devel

   8、打开一个文本菜单,编辑内核参数

      make menuconfig   边框要足够大 

   9、进去之后我们以General setup为例

   10、 如果是*表示做进内核;如果为M为做成模块;如果什么都不选择表示不启用此功能

   11、ESC可以后退

   12、点进File system     (!!!敲空格键可以选择 * M )

   13、保存退出;它保存到了linux目录下的隐藏文件 .config

   14、make 编译

########################################################

  我们大多数情况是复制自身的内核去编译:  复制到那个目录叫.config

1、cp /boot/config-2.6.18-308.el5  /usr/src/linux/.config

2、make menuconfig 编辑内核参数

3、Processor type and features 可以设定专属的硬件驱动

4、可以看到Processor family使用的是奔腾 因为要适应多种CPU  

5、如果CPU是酷睿的我们就选择酷睿,如果是amd的就选择k6 或者k7

6、Device Drivers 可以去掉一些不需要的设备驱动

      【taken Ring 令牌环; PCMPIA卡很古老】

7、make 编译

8、make modules_install安装内核模块

9、make install 

10、重启操作系统选择使用新内核

################################################

编译内核不要使用远程连接;

 如果想使用可以安装 screen 

1、执行screen 会打开一个新窗口

2、Ctrl+A 松开之后按d  拆掉某个进程    

3、screen -ls 查看被拆掉的screen号码

4、screen -r +号码 可以还原被拆掉的进程 哪怕重新登录

################################################

二次编译的时候如何清理原文件 先备份配置文件.config

     make clear

     make mrproper

################################################

创建一套真正的linux

grub -> kernel -> initrd -> ROOTFS(/sbin/init,/bin/bash)

1、创建/mnt/sysroot;/mnt/boot;

2、在sysroot下创建bin、sbin、etc、var、tmp、proc、sys、dev、lib、usr

                    home 

2.5、加磁盘20G    IDE

3、创建两个主分区 一个20M 一个512兆

4、mke2fs -j 格式化乘ext3

5、将20M的磁盘挂载到/mnt/boot  512M的磁盘挂载到/mnt/sysroot

6、安装grub  grub-install --root-directory=/mnt /dev/hda

7、将内核vmlinuz。。。。复制到/mnt/boot/vmlinuz

8、initrd小根,是系统启动起来自动生成的但是咱们这里生成不了;所以要手动创建

9、红5:创建initrd:mkinitrd  红6:dracup 、也支持mkinitrd

10、/*【个人initrd坏了可以这么玩:mkinitrd /boot/initrd-`uname -r`.img `uname -r`】*/

11、在这里我们不能直接创建,我们得改里面的东东;所以我们得看文件类型

12、file /boot/initrd-2.6.18-308.el5.img 你会发现是gzip

13、咱们cp出来到根目录;然后mv成 .img.gz格式

14、gzip -d initrd....img.gz

15、file initrd....img  会发现,格式变成了cpio

16、创建一个目录test:进入test 执行cpio -id < ../initrd-2.6.18.308.img

17、也可以这么玩、创建一个空目录:(同13-16)zcat /boot/initrd-2.6.18-308.img | cpio -id

18、咱们进入目录:vim init 会有一项mkrootdev 咱们把尾部的挂载点改成/dev/hda2

19、保存退出;

20、咱们再打包回去;咱们站在test这个目录上:find . | cpio -H newc --quiet -o | gzip -9 > /mnt/boot/initrd.gz

21、vim /mnt/boot/grub/grub.conf  编辑grub配置文件

22、default=0

    timeout=5

    title Test Linux (Magedu Team)

             root (hd0,0)

             kernel /vmlinuz

             initrd /initrd.gz

               副权限

23、在/mnt/sysroot下创建

    mkdir etc/{rc.d/init.d} bin sbin proc sys dev lib root mnt media var/{log,run,lock/subsys,tmp} usr/{bin,sbin,local} tmp home opt boot -pv

   

24、把/sbin/init拷贝过来 cp /sbin/init /mnt/sysroot/sbin/ 

    把/bin/bash复制过来 cp /bin/bash /mnt/sysroot/bin/

25、把对应的库复制过来

    ldd /sbin/init;   cp /lib/libsepol.so.1 /mnt/sysroot/lib

    ldd /bin/bash

26、vim etc/inittab

         id:3:initdefault:

         si::sysinit:/etc/rc.d/rc.sysinit   保存

    副权限

27、vim /mnt/sysroot/etc/rc.d/rc.sysinit

         #!/bin/bash

         echo -e "\tWelcome to \033[31mMageEdu Team\033[0m Linux."

         /bin/bash

     副权限

28、利用脚本  将init   bash  ls   命令导入

29、导入touch  mkdir  vim  mv cp cat mount umount 

        chmod chown ping ifconfig insmod modprobe

        rmmod route halt reboot shutdown hostname

30、仍然不能自动将根文件系统重新挂载为可读写,所以我们要它重新挂载rc.sysinit这个文件让他可读写:   进入小linux 执行mount -n -o remount /

mount -n 挂载时不更新mtab文件


31、添加关机重启服务功能:

         1、vim etc/inittab   定义运行级别      

                id:3:initdefault:

                si::sysinit:/etc/rc.d/rc.sysinit 

                l0:0:wait:/etc/rc.d/rd 0

                l6:6:wait:/etc/rc.d/rc 6

                l3:3:wait:/etc/rc.d/rc 3

         2、vim etc/rc.d/halt 定义关机重启脚本              

                         #!/bin/bash

                         #

                         case $0 in

                         *reboot)

                           COMMAND='/sbin/reboot'

                           ;;

                         *halt)

                           COMMAND='/sbin/halt -p'

                           ;;

                         *)

                           echo "Only call this script by *reboot OR *halt."

                           ;;

                         esac

                         case $1 in

                         start)

                            ;;

                         stop)

                            ;;

                         *)

                            echo "Usage:`basename $0` {start|stop}"

                            ;;

                         esac

                         exec $COMMAND


       

             3、vim etc/rc.d/rc  定义所有K开头的关闭,所有S开头的启动             

                       #!/bin/bash

                       #

                       RUNLEVEL=$1

                       for I in /etc/rc.d/rc$RUNLEVEL.d/K*; do

                           $I stop

                       done

                       for I in /etc/rc.d/rc$RUNLEVEL.d/S*; do

                           $I start

                       done


32、在etc/rc.d/init.d/下写一个tserver 测试服务脚本,且可以被chkconfig调用

            

#!/bin/bash

#

# chkconfig:35 66 33

# description:test service script

prog=`basename $0`

lockfile=/var/lock/subsys/$prog


start() {

  echo "starting $prog..."

  touch $lockfile

}


stop() {

  echo "Stoping $prog..."

  rm -f $lockfile

}


status() {

  if[ -f $lockfile ]; then

      echo "runing..."

  else

      echo "Stoping"

  fi

}


usage() {

  echo "Usage:$prog {start|stop|status|restart}"

}


case $1 in

start)

   start

   ;;

stop)

   stop

   ;;

restart)

   stop

   start

   ;;

status)

   status

   ;;

*)

   usage

   exit 1

   ;;

esac

36、然后咱们调用这个服务,就去rc3.d去连接

      cd rc3.d/    ln -sv ../init.d/tserver S66tserver

37、根据35步骤脚本可以知道 rc3.d在3级别启动,在0 6级别要关闭所以

    cd rc0.d/    ln -sv ../init.d/tserver K33tserver

38、虽然我们定义了在3级别运行,但是我们在si::sysinit:/etc/rc.d/rc.sysinit 里面执行了、bin/bash,所以我们的系统不可能运行3级别,我们要做一下修改

             0、添加功能mingetty basename

             0.5、cd /mnt/sysroot/bin/  ;  ln -sv bash sh

             1、vim etc/rc.d/rc.sysinit 将尾行/bin/bash去除

             2、vim etc/inittab 在最后添加两行

                   1:2345:respawn:/sbin/agetty -l -n /bin/bash 38400 tty1

                   2:2345:respawn:/sbin/agetty -l -n /bin/bash 38400 tty2

  最终我们没有实现终端自动运行/bin/bash 但是我们可以CTRL ALT +f1/2 切换

39、想让根文件系统以读写的方式重新挂载:

        vim etc/fstab  

               /dev/hda2   /    ext3     defaults    0 0

               /dev/hda1   /    exit3    defaults   0 0

               proc        /proc proc    defaults   0 0

               sysfs       /sys sysfs    defaults   0 0

   然后vim etc/rc.d/rc.systinit

              去掉末行的/bin/bash

             添加:echo "Rmount rootfs..."

                   mount -n -o remount,rw /

40、咱们捎带脚设置个主机名吧:

       mkdir /mnt/sysroot/etc/sysconfig

       vim etc/sysconfig/network 编辑 HOSTNAME=SongGeTeam

       vim etc/rc.d/rc.sysinit 

           如果存在:【 -f /etc/sysconfig/network 】 && ./etc/sysconfig/network

           如果为空:【 -z $HOSTNAME -O "$HOSTNAME" == '(NONE)' 】 && HOSTNAME=localhost

           设置主机名:/bin/hostname $HOSTNAME   

           wq

41、宿主机小系统来回切换,导致文件系统错乱怎么办?

       1\ cd sysroot ;   

       2\ find . | cpio -H newc --quiet -o | gzip > /root/sysroot.gz

       3\ umount /dev/hda2

       4\ fuser -km /dev/hda2

       5\ umount /dev/hda2

       6\ mke2fs -j /dev/hda2

       7\ mount /dev/hda2 /mnt/sysroot

       8\ zcat /root/sysroot.gz | cpio -id

  sync sync sync sync 

########################################################

42、