Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78964
  • 博文数量: 41
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 434
  • 用 户 组: 普通用户
  • 注册时间: 2017-03-23 09:31
个人简介

天行健,君子以自强不息;地势坤,君子以厚德载物

文章分类
文章存档

2018年(11)

2017年(30)

我的朋友

分类: LINUX

2018-01-06 18:16:46

内核编译及系统裁剪
内核组成部分:
    核心:/boot/vimlinuz-version
    内核模块(ko):/lib/modules/version
内核设计模式:
    单内核:linux内核是使用微内核的设计思想的单内核设计模式,模块化设计
    微内核:
装载内核模块命令:
    insmod
    modprobe
内核发行网址:
用户空间访问、监控内核的方式:通过修改“/proc”,"/sys"目录下文件;
    /proc,/sys是伪文件系统
    /proc/sys:此目录中的文件很多是可读写的
    /sys/:某些文件可写
设定内核参数值的方法:
    在/proc/sys/目录下:
    echo VALUE > /proc/sys/TO/SOMEFILE #能立即生效,但无法永久有效
    例1:[root@www sys]# free -m
                    total       used       free     shared    buffers     cached
        Mem:           502        431         71          0         30        277
        -/+ buffers/cache:        123        378
        Swap:          996          0        996
        [root@www sys]# echo 1 > /proc/sys/vm/drop_caches
        [root@www sys]# free -m
                    total       used       free     shared    buffers     cached
        Mem:           502        145        357          0          0         22
        -/+ buffers/cache:        123        379
        Swap:          996          0        996
    例2:[root@www sys]# hostname
        
        [root@www sys]# echo mylab.magedu.com > /proc/sys/kernel/hostname
        [root@www sys]# hostname
        mylab.magedu.com
        
    sysctl -w 上一级目录.SOMEFILE="修改的内容"  #能立即生效,但无法永久有效
    例3:[root@www sys]# sysctl -w kernel.hostname=""
        kernel.hostname =
        [root@www sys]# hostname
        
    编辑/etc/sysctl.conf文件 #永久有效,但不能立即生效
        sysctl -p :    修改文件完成后,执行该命令可立即生效;
        sysctl -a:显示所有内核参数及其值
        例4:[root@www sys]# cat /proc/sys/net/ipv4/ip_forward  #查看网卡参数
                0                             #0表示不启用,1表示启用
            [root@www sys]# vim /etc/sysctl.conf #编辑/etc/sysctl.conf文件
            # Kernel sysctl configuration file for Red Hat Linux
            #
            # For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
            # sysctl.conf(5) for more details.

            # Controls IP packet forwarding
            net.ipv4.ip_forward = 1    #参数改为1
            [root@www sys]# sysctl -p #通知内核重读内核参数
            [root@www sys]# cat /proc/sys/net/ipv4/ip_forward
                1
内核模块管理:
    lsmod:查看
    modprobe MOD_NAME:装载某个内核模块
    modprobe -r MOD_NAME:卸载某个内核模块
        例5:[root@www ~]# lsmod | grep floppy  #查看软驱模块
            floppy                 57125  0
            [root@www ~]# modprobe -r floppy  #卸载软驱模块
            [root@www ~]# lsmod | grep floppy  #查看软驱模块
            [root@www ~]# modprobe floppy  #装载软驱模块
            [root@www ~]# lsmod | grep floppy
            floppy                 57125  0
    modinfo MOD_NAME:查看某个内核模块信息
    insmod /PATH/TO/MODULE_FILE:装载内核模块
    rmmod MOD_NAME:卸载某个内核模块
    depmod /PATH/TO/MODULES_DIR:生成模块间的依赖关系
    
    内核中的功能模块除了核心功能外,在编译时,大多功能都有三种选择:
    1、不使用此功能;
    2、编译成内核模块;
    3、编译进内核;
如何手动编译内核:
    1、查看本系统内核版本:
    [root@www ~]# uname -r
    2.6.18-308.el5
    2、安装Development Libraries 和 Development Tools 编译程序;
    3、内核特性选择工具:
        make gconfig: Gnome桌面环境使用,需要安装图形软件开发库组(GNOME Software Development)
        make kconfig: KDE桌面环境使用,需要安装图形软件开发库组(KDE Software Development)
        
        make menuconfig:打开图形管理界面,选择需要安装的特性
    4、make
    5、make modules_install
    6、make install
    
注:screen命令:
    [root@www linux]# yum install screen #安装screen软件包
    screen -ls:显示已经建立的屏幕
    screen:直接打开一个新的屏幕
    Ctrl+a键, d键:拆除屏幕
    screen -r ID:还原回某屏幕
    exit:退出

二次编译时清理(清理前,如果有需要,请备份配置文件.config):
    make clean
    make mrproper
内核工作方式:
grub->kernel->initrd->ROOTFS(/sbin/init,/bin/bash)

mkinitrd initrd文件路径 内核版本号
如:mkinitrd /boot/initrd-`uname -r` `uname -r`

bash截取功能用法:
     ${parameter#word}
     ${parameter##word}
        例1:[root@localhost ~]# echo ${FILE#*/}
            usr/local/src
        例2:[root@localhost ~]# echo ${FILE##*/}
            src

     ${parameter%word}
     ${parameter%%word}
         例1:[root@localhost ~]# echo ${FILE%/*}
            /usr/local
         例2:[root@localhost ~]# echo ${FILE%%/*}
                    #截取值为空
    例3:编写一个脚本,实现截取
    [root@localhost ~]# vim bincopy.sh
    #!/bin/bash
    #
    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() {
        CMDPATH=${1%/*}
        [ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH
        [ ! -e $DEST${1} ] && cp $1 $DEST$CMDPATH
        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 againe" CMD && continue
        COMMAND=`which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`
        bincp $COMMAND
        echo "copy $COMMAND finished."
        read -p "Continue: " CMD
    done
阅读(1030) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~