认识内核,并编译安装新内核

一、内核组成部分:
Kernel
initrd
/lib/modules/`uname -r`/
 
内核的功能:
  文件系统
  进程管理
  内存管理
  驱动程序
  网络子程序
  安全管理(selinux)
  虚拟化
 
二、
/proc, /sys
 
/proc: 用于查看进程和内核参数的接口(可以设定)
/sys: 用于查看硬件设备和驱动程序相关数据(可以设定)
cd /proc 
ls 
 以数字开头的目录,其数字表明进程号,其目录下存放的是其PID文件和相关进程参数。
cmdline: 启动此进程的命令是什么(不是进程)
cpuset: cpu集合,说明当前的进程可在哪些cpu上运行(/表示当前系统上的所有cpu)
statm: 数值
stat: 一大串数值
status: 有详细说明数字的意思
mem:与内存相关的东西
cpuinfo:当前系统上cpu 的信息
meminfo:内存使用的相关信息
filesystem:文件系统
modules: 模块名称
mounts:挂载的所有文件系统
swaps:交换分区
uptime: 系统启动时长
 
/proc/sys/net/ipv4
icmp_echo_ignore_all 若为0 ,表示不启用忽略
  echo 1 > icmp_echo_ignore_all 启用忽略
ip_forward: 用于ip转发
/proc/sys/kernel下
  hostname 主机名
  /proc/sys/vm 虚拟内存
    drop_caches 释放缓存,默认为0
      echo 1 > drop_caches 启用释放缓存,在此修改后,重启之后就会无效,若是想要永久生效,要写至/etc/sysctl.conf下。
/etc/sysctl.conf 在此文件下设定内核参数
路径名以.分隔,并且不用写/proc/sys
sysctl -p 让内核重新读取/etc/sysctl.conf参数文件,调用新的设定参数。(可以不用重启,让已修改的文件生效)
       -a 显示内核及所有内核使用参数和使用的值
       -w  net.ipv4.ip_forward=0 临时改变内核参数的值 , 临时有效
  
查看硬件信息:
# lspci :显示PCI总线的设备信息
# lsusb :专门显示USB设备的相关信息
 
# cat /proc/cpuinfo: 显示cpu的详细信息
 
x86, x64
# x86info 显示x86 下的cpu信息
 
# hal-device: 硬件抽象层,与内核打交道,保存能被内核识别的所有硬件的详细信息(大约122个,0-121)
# hal-device-manager : 图形界面下显示硬件设备的详细信息
 
/dev下
udev:系统初始化时,将内核所探测到的硬件信息输出在/dev目录下。(实现动态的为硬件创建相应的设备文件,是一个程序,是重量级/dev的终结者。)
让用户定义udev的规则,从而实现现在创建设备文件使用不同的设备文件名
如:
/dev/sdb1 --> /dev/usb1
/dev/sda5 --> /dev/mydata
/dev/udev/rules.d 下,以数字开头,表示优先级,数值越小,优先级越高。
 
手动创建设备文件:
# mknod [options] NAME TYPE [MAJOR(主设备号,用于标示类型) MINOR(次设备号,在同一种类下,标示不同的设备)]
       -m MODE 权限模型
如: mknod         /dev/mydev     b 15 1 默认权限是644,取决于umask
     mknod  -m 640 /dev/mydev2    b 15 2      
       
/dev/null,/dev/zero 经常使用,就不多说了。
   熵池是一段内存空间,可认为是一个设备(基于敲击键盘的力度与间隔时间等毫无规律可循)
  /dev/random : 可实现随机数,对操作系统至关重要,比如随机密码。
                也是使用熵池,但是当熵池使用耗尽时,就会用软件模拟生成的随机数。
                
  /dev/urandom : 所有的随机数都来自熵池,
 如 $[$RANDOM]随机数表示
  echo $[$RANDOM], -n  后边跟上n个数
    使随机数只保留数字,不要字母:
      dd if=/dev/urandom bs=256 count=1 读取随机数
      dd if=/dev/urandom bs=256 count=1 | md5sum  生成校验码
      dd if=/dev/urandom bs=256 count=1 | md5sum | cut -d' ' -f1 | tr -d 'a-zA-Z' 删除字母
    
三、模块:
/lib/modules/`uname -r`
/proc/modules
 
 
查看内核已经装载的模块:
# lsmod
 
s手动装载/卸载模块:
# modprobe MODULE
# modprobe -r MODULE
 
# insmod /path/to/MODULE : 插入模块,必须明确给出模块路径
# rmmod MODULE  : 移除模块,只需指出模块名,不用指路径
 
查看模块的信息
# modinfo MODULE
  mii 是硬件支持库
 
# depmod 用于生成对应模块依赖关系及映射(map)文件
 
initrd: 文件是用脚本生成的,而不是系统自带的。在RedHat上,使用mkinitrd 生成,是bash 脚本。
# mkinitrd /boot/initrd-`uname -r`.img `uname -r`
# mkinitrd --with=scsi_mod /boot/initrd-`uname -r`.img `uname -r`  : 明确带上SCSI的设备文件的驱动
 
配置文件:
/etc/modprobe.conf: 用于定义modprobe加载某个模块时,可向其传递参数,或者为其定义别名
 
四、编译安装新内核
(1)下载新版本的内核
(2)配置新内核,选定要使用的功能或模块(/usr/src下存放内核)
    我们是在老师的ftp服务器上下载的,如linux-2.6.28.10
    下载至/usr/src/linux下
    cd /usr/src
    ln -sv linux-2.6.28.10 linux
    cd /usr/src/linux
    yum groupinstall "Developments Libraries" "Development Tools" 
    make menuconfig
      选择要编译安装的内核模块等
(3)编译新内核
    make
(4)安装
    make modules_install
    make install
    安装完成后必须重启,选择新的内核模块
五、 
1、配置内核的替代方法
  yum groupinstall "KDE Software Development"
     make xconfig    //打开图形化界面
     或
     yum groupinstall "GNOME Software Development"
      make gconfig
      或
        make config
2、在以编译过的内核源码基础上重新编译
  make clean
   make mrproper
   
   sreen: 屏幕,确保屏幕已装过(yum install screen)
   quit : 退出屏幕
   Ctrl+a,d : 拆掉screen
     用screen -ls 查看已经拆掉的列表
     screen_id : 会话号
     screen -r screen_id : 恢复screen
     
     ${FILENAME#*pattern} : 固定格式,从左至右匹配pattern,并将其去掉
        ${FILENAME##*pattern} : 从左至右贪婪匹配pattern,并去掉
        如 FILENAME=/usr/src/sbin
         ${FILENAME#*/}  就剩 usr/src/sbin
         ${FILENAME##*/}  就剩sbin
    ${FILENAME%pattern*} : 固定格式,从右至左匹配pattern,并将其去掉    
        ${FILENAME%%pattern*} :  从右至左贪婪匹配pattern,并去掉
         如 FILENAME=/usr/src/sbin
         ${FILENAME%/*} : 就剩 /usr/src
         ${FILENAME%%s*} : 就剩 /u
3、仅编译某个目录中的源代码
    make SUBDIR=arch1
4、仅编译某个目录中的模块
    make M=drivers/net/