内核设计风格:

    单内核:Linux

    微内核:Windows,Solaris 真正的支持线程

RedHat,SUSE

核心:动态加载 内核模块

内核:/lib/modules/"内核版本号命令的目录"/


用户空间访问、监控内核的方式:/proc,/sys 伪文件系统

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

/sys/:某些文件可写

设定内核参数值的方式:

echo VALUE >/proc/sys/XX

或 stsctl -w kernar.XX="xx"

上述两种方法能使设定立即生效,但不能永久有效

永久有效:修改/etc/sysctl.conf

修改完成之后,执行sysctl -p


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


内核模块管理

lsmod:列出内核模块

modprobe MOD_NAME:装载某模块

modprobe -r MOD_NAME:卸载某模块

modinfo MOD_NAME:查看模块的具体信息

insmod:装载模块

remod MOD_NAME

depom:


内核除了核心功能之外,在编译时大多功能都有三种选择:

1、不使用次功能

2、编译成内核模块

3、编译进内核


如何手动编译内核

make gconfig:Gnome桌面环境使用

make kconfig:KDE桌面环境使用,需要安装图形开发库

make menuconfig:需要在内核目录执行

    注意:使用make menuconfig 需要安装ncurses

yum groupinstall "Development Tools" "Development Libraries"


menuconfig编译内核步骤

    cd /usr/src

    mv /root/linux-3.16.2.tar.xz ./

    xz -d linux-3.16.2.tar.xz    #解压

    tar xvf linux-3.16.2.tar    #展开

    ln -s linux-3.16.2 linux    #链接

    cd linux

    make menuconfig

    make

    make modules_install

    make install


如何实现部分编译

1、只编译某子目录下的相关代码

make dir/

make arch/

make drivers/net/

2、只编译部分模块

make M=drivers/net/

3、只编译某一模块

make drivers/net/pcnet32.ko

4、将编译完成的结果放置于别的目录中

make o=/tmp/kernel


二次编译时清理:清理前最好备份.config文件

make clean

make mrproper


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


mkinitrd initrd文件路径 内核版本号

mkinitrd /boot/initrd-`uname -r`.img `uname -r`


虚拟机实现编译系统

添加一块硬盘,对其进行分区,格式化

mkdir -p /mnt/{boot,sysroot}

mount /dev/sdb1 /mnt/boot/

mount /dev/sdb2 /mnt/sysroot/

grub-install --root-directory=/mnt /dev/sdb    #装载Grub

    [root@localhost ~]# ls /mnt/boot/ #grub已经存在

    grub  lost+found 

cp /boot/vmlinuz-2.6.32-220.el6.x86_64 /mnt/boot/vmlinuz    #复制内核

#创建initrd

mkdir iso

cd iso

zcat /boot/initramfs-2.6.32-220.el6.x86_64.img |cpio -id

vim init    #修改init的如下行

    mkrootdev -t ext3 -o defaults,ro /dev/sdb2

find . |cpio -H newc --quiet -o |gzip -9 > /mnt/boot/initrd.gz

vim /mnt/boot/grub/grub.conf  

default=0

timeout=5

title my linux

        root (hd0,0)

        kernel /vmlinux

        initrd /initrd.gz

cd /mnt/sysroot/

mkdir -pv proc sys dev etc/rc.d lib bin sbin boot home var/log usr/{bin,sbin} root tmp

#需要拷贝的两类 1./sbin/* 2./bin/*

cp /sbin/init /mnt/sysroot/sbin/

cp /bin/bash /mnt/sysroot/bin/

ldd /sbin/init    #查看init的依赖库

    cp /lib/libsepol.so.1 /mnt/sysroot/lib/

    cp /lib/libselinux.so.1 /mnt/sysroot/lib/

    cp /lib/libc.so.6 /mnt/sysroot/lib/

    cp /lib/libdl.so.2 /mnt/sysroot/lib/

ldd /bin/bash    #查看bash的依赖库

    cp /lib/libtermcap.so.2 /mnt/sysroot/lib/

    cp /lib/ld-linux.so.2 /mnt/sysroot/lib/

chroot /mnt/sysroot/    #测试能否使用,exit退出

sync    #同步磁盘

vim /mnt/sysroot/etc/inittab    #只需2行,默认级别和系统初始化   

    id:3:initdefault:

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

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

    #!/bin/bash

    echo -e "\twelcome to \033[31mmylinux\033[0m"

    /bin/bash

chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit


#需要拷贝的两类 1./sbin/* 2./bin/* 脚本

dest=/mnt/sysroot/


libcp() {

  libpath=${1%/*}

  [ ! -d $dest$libpath ] && mkdir -p $dest$libpath

  [ ! -e $dest${1} ] && cp $1 $dest$libpath && echo "copy lib $1 finished."

}


bincp() {

  binpath=${1%/*}

  [ ! -d $dest$binpath ] && mkdir -p $dest$binpath

  [ ! -e $dest${1} ] && cp $1 $dest$binpath


  for lib in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do

    libcp $lib

  done

}


read -p "your command: " cmd

until [ $cmd == 'q' ]; do

  ! which $cmd && echo "wrong command" && read -p "input again: " cmd && continue

  command=`which $cmd |grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`

  bincp $command

  echo "copy $command finished"

  read -p "continue: " cmd

done


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

    cat /proc/mounts 里面也有挂载的所有文件系统


#让这个小系统实现开机、关机

cd /mnt/sysroot

vim etc/rc.d/init.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)

;;

status)

;;

*)

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

;;

esac


exec $command

cd etc/rc.d

mkdir rc0.d rc6.d

cd rc0.d

ln -sv ../init.d/halt S99halt

cd rc6.d/

ln -sv ../init.d/halt S99reboot

cd ../


vim rc

#!/bin/bash

RUN=$1

for i in /etc/rc.d/rc${RUN}.d/K*; do

  $i stop

done


for i in /etc/rc.d/rc${RUN}.d/S*; do

  $i start

done


vim etc/inittab

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

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