启动和内核管理

启动和内核管理 : 

    CentOS 5和6的启动流程

    服务管理

    Grub管理

    自制Linux

    启动排错

    编译安装内核

  1. CentOS 5和6的启动流程

Linux系统的组成部分:内核+根文件系统

    内核(kernel):进程管理,内存管理,完了协议栈,文件系统,驱动程序,安全功能

    根文件系统(rootfs):程序和glibc

        库:函数集合,function,调用接口(头文件负责描述)

            过程调用:proceduce,无返回值

            函数调用:function

        程序:二进制执行文件

运行的系统环境可分为两层:内核空间,用户空间

    用户空间:应用程序(进程或线程)    

    内核空间:内核代码(系统调用)

内核设计流派:

    单内核设计(monolithic kernel):把所有功能集于同一个程序;

        Linux

    微内核设计(micro kernel):每种功能使用一个单独的子系统实现

        Windows,solarls

        blob.png

Linux内核特点:

    支持模块化:.ko(内核对象kernel object)

        如:文件系统,硬件驱动,网络协议…

    支持内核模块的动态装载和卸载

组成部分:

    核心文件:/boot/vmlinuz-VERSION-release

     ramdisk:辅助的伪根文件系统

         CentOS5/boot/initrd-VERSION-release.img

        CentOS6,7:/boot/initramfa-VERSION-release.img

    模块文件:/lib/modules/VERSION-release

CentOS系统的启动流程:

    1.PSOT:加电自检,是BIOS功能的一个主要部分。负责完成对CPU,主板,内存,硬盘子系统,

显示子系统,串并行接口,键盘。CD-ROM光驱等硬件情况的检测

        ROM:BIOS,Basic Iuput Output System,保存着有关计算机系统最重要的基本输入输出

    程序,系统信息设置,开机加电自检程序和系统启动自举程序等

        RAM:CMOS互补金属氧化物半导体,保存各项参数的设定

    2.Boot Sequence:

        按次序查找引导设备,第一个引导程序的设备为本次启动设备

        bootloader:引导加载器,引导程序

            Windows:ntloader,仅是启动OS

            Linux:

              LILO:Linux LOader

              GRUB:Grand Uniform Bootloader

                centos 5:GRUB 0.x==>Grub Legacy(现名)

                centos 7: GRUB 1.x==>Grub2(现名)

             功能(Linux):提供一个菜单,运行用户选择要启动的系统或不同的内核版本;把用户选定的

            内核装载到RAM中的特定空间中,解压,展开,而后把系统控制权移交给内核。

            MBR:Master Boot Record

                512bytes:

                    446bytes:bootloader

                    64bytes:分区别

                     2bytes:55AA

            GRUB:

                primary boot loader:1st stage 1.5 stage

                secondary boot loader:2nd stage,分区文件

stage1:/boot/grub中的stage1的文件大小为512字节,它是引导扇区中引导程序(前446字节为引导程序)的备份文件,

功能是用来装载 stage1.5或stage2

stage1.5:因为stage2较大,通常都是放在一个文件系统当中的,但是stage1并不能识别文件系统格式,所有才需要stage1.5

来引导位于某个文件系统当中的stage2,根据文件系统格式的不同,stage1.5也需要相应的文件,如:e2fs_stage1_5,fat_stage1_5

分别识别的ext和fat的文件系统格式,我的系统上stage1_5如下:

blob.png

但是,当stage1加载1.5时,原则上是不认识ext文件系统的,应该也是无法找到1.5程序的,而实际上在安装

grub时,程序已经把1.5程序写到磁盘最前面的32k中,因为紧连着MBR的一段磁盘空间通常是空白无用的,

grub就把1.5程序写到这个地方,这个地方没有文件系统,stage1程序可以直接去加载1.5

stage2:grub能让用户以选项方式将OS加载,改变参数,修改选项等,这些都是stage2程序的功能。stage2可以去

获取grub.conf等文件内容

    3.kernel

      自身初始化:

        1.探测可识别的所有硬件设备

        2.加载硬件驱动程序;(有可能会借助ramdick)

        3.以只读方式挂载根文件系统

        4.运行用户空间的第一个应用程序:/sbin/init

        

      init程序的类型:

        CentOS 5-:SysV init

            配置文件:/etc/inittab   

        CentOS 6 :Upstart

            配置文件/etc/inittab        

                /etc/init/*conf

        CentOS 7 :Systemd        

            配置文件:/usr/lib/systemd/system/, /etc/systemd/system/

       ramdisk:

        Linux内核的特性之一:使用缓冲和缓存来加速磁盘上的文件访问

            ramdisk—>ramfs 提高速度

            CentOS 5:initrd, 

                工具程序:mkinitrd

            CentOS 6 7:initramfs

                工具程序:dracut,mkinitrd

总结:

系统初始化流程(内核级别):POST–>Boot Sequence(BIOS)–>BootLoader(MBR)–>kernel(ramdisk)–>rootfs(只读readonly)–>/sbin/init()

/sbin/init:

    CentOS 5-:SysV init

运行级别:为系统的运行或维护等目的而设定的机制

  0-6:7个级别

    0:关机。shutdown

    1:单用户模式(single user),root用户,无须认证;维护模式

    2:多用户模式(multi user),会启动网络功能,但不会启动DNS,维护模式

    3:多用户模式(multi user),完全功能模式;本文界面

    4:预留级别;目前无特别使用目的,但习惯同3级别功能使用

    5:多用户模式(multi user),完全功能模式;图形界面

    6:重启模式,reboot

默认级别:3,5

级别切换:init #

查看级别:runlevel ; who -r

        blob.png    

命令显示的第一个数字为上一次的运行级别,第二个数字为当前运行级别  

        blob.png

配置文件:/etc/inittab


        blob.png

    每行定义一种action以及与之对应的process

        id:runlevels:action:process

            id:一个任务的标识符

            runlevels:在哪个级别启动此任务;#,###,也可以为空,表示使用默认级别

            action:在什么条件下启动此任务

            process:任务

        action:

            wait:等待切换此任务所在的级别时执行一次

            respawn:一旦此任务终止时,就自动重新启动之

            initdefault:设定默认运行级别;此时process省略

            sysinit:设定系统初始化方式,此处一般指定/etc/rc.d/rc/sysinit

        例如;

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

            表示去启动或关闭/etc/rc.d/rc3.d/目录下的服务器脚本所控制服务;

            K*:要停止的服务;K##*。优先级,数字越小,越是优先关闭;依赖的服务先关闭,而后关闭依赖的服务

            S*:要启动的服务;S##*。优先级,数字越小,越是优先启动;被依赖的服务先启动,而依赖的服务后启动

        

     rc脚本:接受一个运行级别数字为参数

        脚本框架:

            for srv in /etc/rc.d/rc#.d/K*;do

                $srv stop

            done

            for srv in /etc/rc.d/rc#.d/S*;do

                $srv start

            done

        /etc/init.d/*(/etc/rc.d/init.d/*)脚本执行方式;

            #/etc/init.d/SRV_SCRIPT{start|stop|restart|status}

            #service SRV_SCRIPT{start|stop|restart|status}

chkconfig命令:管控/ect/init.d/每个服务器各级别下的启动或关闭状态

    查看:chkconfig –list [name]

    添加:chkconfig –add name

        能被添加的服务的脚本的定义格式之一

        #!/bin/bash

        #chkconfig:LL NN NN

        #Description:info

    删除:chkconfig -del name

    修改指定的链接类型:

        conkconfig [–level LEVELS] name <on|off|reset>

            –level LEVELS:指定要控制的级别,默认为2345

创建服务脚本

将以前写的一个脚本稍微修改下,变成一个服务脚本,

将此脚本移至/etc/init.d目录下

#!/bin/bash
#chkconfig:35 98 12
file=/var/lock/subsys/pingxiong

start(){

        if [[ -f $file ]];then
                echo "$file is exsit"
        else
                touch $file&&echo "start finshed"
        fi
        }

stop(){

        if [[ -f $file ]];then
                rm -rf $file &&echo "stop finshed"
        else
                echo "No such file"
        fi
        }

status(){

        if [[ -f $file ]];then
                echo "$file is running"
        else
                echo "$file is stoped"
        fi
        }

case $1 in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                start
                ;;
        status)
                status
                ;;
                *)
                echo "you should input {start|stop|restart|status}"
esac

使用chkconfig命令添加此脚本

         blob.png

添加成功后在/etc/rc.d目录下已自动增加了相应的软链接文件

服务器启用和关闭的优先级也自动对应(12 98)

         blob.png

可以用service pingxiong {start|stop|restart|status}启用或关闭

         blob.png

这个简单的脚本就算成功了(虽然没什么用)

xinetd管理的服务

service命令:手动管理服务

    service服务 start|stop|stop|restart

瞬态(Transient)服务被xinetd进程所管理 

进入的请求首先被 xinetd代理

配置文件:/etc/xinetd.conf,/etc/xinetd/<service>

与libwrap.so文件链接

用chkconfig控制的服务

    chkconfig SERVICE on|off

     blob.png

注意:正常级别下,最后启动的一个服务S99local没有链接值/etc/init.d下的某脚本,而是链接至了/etc/rc.d/rc/.local(/etc/rc.;local)

脚本;因此,不便或不需写为服务脚本的程序期望能开机启动运行时,直接放置于此脚本文件即可

    

    tty1:2345:respawn:/usr/sbin/mingetty  tty1

    ….

     tty6:2345:respawn:/usr/sbin/mingetty  tty6

        1.mingetty会调用login程序

        2.打开虚拟终端的程序除了mingetty之外,还有诸如getty等

系统初始化脚本;/etc/rc.d/rc.sysinit

    1.设置主机名

    2.设置欢迎信息

    3.激活udev和selinux

    4.挂载/etc/fatab文件中定义的所有文件系统

    5.检测根文件系统,并以读写方式重新挂载根文件系统

    6.设置系统时钟

    7.根据/etc/sysctl.conf文件的设置,来设置内核参数

    8.激活lvm和软raid设备

    9.激活各swap设备

    10.加载额外设备的驱动程序

    11.清理操作

总结:(用户空间的启动流程):/sbin/init(/etc/inittab)    

设置默认运行级别–>运行系统初始化脚本,完成系统初始化–>关闭对应级别下需要停止的服务,启动对应级别下需要启动的服务

–>设置登录终端[–>启动图形终端]

CentOS 6 :

    init程序:upstart,但依然为/sbin/init。其配置文:

        /etc/init*.conf/inittab(仅用于定义默认运行级别);

注意:*.conf巍峨哦upstart风格的配置文件

CentOS 7 :

    init程序:systemd;配置文件:/usr/lib/systemd/system/*, /etc/systemd/system/*

    完全兼容SysV脚本机制;因此,service命令依然可用不过,建议使用sysytemctl命令来控制服务

    sysytemctl {start….} name [.service]

示例:破解CentOS5 和6 的root口令

我们以往老师给我们的redhat 5为例

1.进入开机界面时按回车进入到如下界面

blob.png

2.键入a键进入选择修改内核参数,进入到如下界面

blob.png

3.在命令行中输入空格加数字1,出现如下界面

blob.png

4.无须输入帐号密码进入系统中,且为root用户登录的,将密码修改为自己的密码,然后重启系统

blob.png

5.成功登录进了redhat 5 系统(密码破解成功)

blob.png

grub legacy

CentOS 6启动流程:

    POST–>Boot Sequence(BIOS)–>Boot Loader–>kernel(ramdisk)–>rootfs–>switchroot–>/sbin/init

–>(/etc/inittab,/etc/init/*.conf)–>设置默认运行级别–>系统初始化脚本rc.sysinit–>关闭或启动对应级别的服务

–>启动终端[–>图形终端]

GRUB:Grand Uniform Bootloader

    centos5: GRUB 0.x ==>Grub Legacy(现名)

    centos7 :GRUB 1.x===>Grub2(现名)

grub legacy:

    stage1:mbr

    stage1.5:mbr之后的扇区,让stage1中的bootloader能识别是stage2所在的分区上的文件系统

    stage2:磁盘分区(/boot/grub)

    配置文件:/boot/grub/grub.conf <— /etc/grub.conf

    

stage及内核等通常放置于一个基本磁盘分区;

    功用:

        1.提供菜单,并提供交互式接口

            e:编辑模式,用于编辑菜单

            c:命令模式,交互式接口

        2.加载用户选择的内核或操作系统

            允许传递参数给内核

            可隐藏此菜单

        3.为菜单提供了保护机制

            为编辑模式进行认证

            为启用内核或操作系统进行认证

如何识别设备:

    (hd#,#)

        hd#:磁盘编号,用数字表示;从0开始编号

        #:分区编号,用数字表示;从0开始编号

    (hd0,0):第一个磁盘的第一个分区

grub的命令行接口

    help:获取帮助列表

    help keyword:详细帮助信息

    find (hd#,#0) /path/to/somefile

    root (hd#,#)

    kernel /path/to/kernel_file:设定本次启动时用到的内核文件;额外还可以添加许多内核支持的的cmdline参数

        例如:max_loop=100 selinux=0 init=/path/to/init

    initrd /path/to/initramfs_file:设定为选定的内核提供额外文件的ramdisk

    boot:引导启动选定的内核

手动在grub命令行接口启动系统

第一步:在此界面键入c键,

blob.png

第二步:在命令行中输入命令

grub> root(hd#,#)

grub>kernel  /vilinuz-version-release  ro root=/dev/device

grub>initrd  /initramfs-version-release.img

grub>boot

blob.png

第三步:进入到登录界面

blob.png

grub legacy配置文件

    /boot/rgub/grub.conf

我的grub legacy配置文件做过修改了,和原装的有一些配置没了

blob.png

参数如下:

default=#:设定默认启动的菜单项;菜单项(title)编号从0开始

timeout=#:指定菜单项等待选项选择的时长

splashimage=(hd#,#)/PATH/TO/XPM_FILE:菜单背景图片文件路径

hiddenmenu:隐藏菜单

password [–md5] STRING:启动菜单编辑认证

tutle TITLE:定义菜单项“标题”,可出现多次

root(hd#,#):grub查找stage2及kernel文件所在设备分区;为”grub“的根

kernel:/PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核

initrd:/PATH/TO/INITRAMFS_FILE:内核匹配的ramfs文件

password [–md5] STRING:启动选项的内核或操作系统是进行认证

grub加密

grub-md5-crypt命令

blob.png

破解root口令:

    启动系统时,设置其运行级别为1

进入单用户模式:

    1.编辑grub菜单(选定要编辑的title,而后使用e命令)

    2.在选定的kerne后附加1,s,S或single都可以

    3.在kernel所在行,键入”b“命令

和上面的破解案例的效果是一样的,这里就不演示了

grub安装

安装grub:

    1.grub-install

    安装grub stage1和stage1.5到/dev/DISK磁盘上,并复制GRUB相关文件到DIR/boot目录下

    grub-install -root-directory=DIR /dev/DISK

    

    2.grub

    grub> root (hd#,#)

    grub> setup(hd#)

实验1:破坏stage1,然后修复

1.要破坏stage1,只需要破坏第一磁盘的第0扇区的前446字节即可

blob.png

2.reboot重启系统,因为引导程序被破坏了,所以系统直接进入了光盘引导界面,我们选择救援模式(Rescue installed system)

blob.png

3.在进入到就救援模式系统中,会有一些列的选项,例如选择语言,是否开启网络等等,这里就

一一截图了,一系列选项选完了进入到如下界面

blob.png

4.因为此时是光盘引导登录的,要到root环境下,需要切换到/mnt/sysimage

blob.png

5.安装grub,可将grub stage1安装到磁盘上,如出现以下Unknown partition table signature

不要慌(第一次遇到慌得要死,到处找错误….),这是正常现象,耐心等待即可!

blob.png

blob.png

6.输入exit两次,退出选择重启

blob.png

7.到了登录界面,修复成功

blob.png

实验2:破坏stage1.5,然后修复

  1. 前文有讲到stage1.5在第一磁盘的第0扇区的前32k中,而MBR占用了前面的512字节,

    所以需要破坏512字节后的内容即可

blob.png

blob.png

2.reboot重启,stage1.5被破坏了,系统界面如下,我们切换到光盘引导界面

blob.png

3.选择Rescue installed system

blob.png

4.默认选择英文

blob.png

5.默认选择us键盘

blob.png

6.是否开启网络接口,可根据自己的实际情况选择,我这里选择不开网络接口

blob.png

7.进入到Rescue界面,选择Continue

blob.png

8.系统挂载在/mnt/sysimage下,如果要进入到root环境,运行chroot /mnt/sysimage命令

blob.png

9.系统已挂载在/mnt/sysimage下

blob.png

10.三种选项:shell 进入命令行模式;fakd是诊断模式;reboot重启电脑;我们这里选择shell

blob.png

11.进入shell界面,切换到root环境

blob.png

12.安装grub,可将grub stage1安装到磁盘上,使用命令:grub-install /dev/sda 

blob.png

blob.png

13.输入两次exit退出,选择reboot重启

blob.png

14.进入登录界面,修复成功

blob.png

实验3:删除boot目录

  1. 删除/boot目录下内容,然后卸载/boot,然后删除/boot目录

blob.png

2.进入如下界面。

blob.png

3.重启选择光盘引导进入救援模式,上面两个例子,已经详细讲述了这么进入救援模式,限于篇幅,

在这里就不重复写了,直接进入到救援模式界面(详细步骤参照上面案例)

blob.png

4.因为这里删除的stage2,所以只使用grub安装时无法修复的,内核也修要重新安装,要安装内核需要先挂载光盘

在安装内核的时候加上–force选项强制安装

blob.png

5.内核安装好了 ,安装grub

blob.png

blob.png

6.编辑/boot/grub/grub.conf文件,保存退出

blob.png

7.键入exit两次,选择reboot重启系统

blob.png

8.进入登录界面,登录成功

blob.png

实验四:删除/boot目录和/etc/fatab文件,然后修复系统!

1.删除/boot和/etc/fstab,然后重启系统

blob.png

2.进入到救援模式,详细步骤就不写了因为/etc/fstab删了,各分区没有自动挂载,所有我们首先要挂载分区

但是我们的分区使用逻辑卷做的,所以要先找到逻辑卷并启用!

blob.png

3.在生产环境中,我看你不知道显示的分区中,那个是/,/boot,/usr…所有我们首先将这些分区随便挂载在一个目录下,然后通过目录访问

磁盘分区内容来判断此分区究竟是什么分区,然后在/根分区里面编辑/etc/fatab文件,内容如下,任何reboot重启

blob.png

4.然后就是安装内核和grub了

blob.png

blob.png

blob.png

5.编辑/boot/grub/grub.conf文件,编辑内容如下:

blob.png

6.exit退出,reboot重启,修复中……

blob.png

7.修复成功

blob.png

自制Linux系统

1.分区并创建文件系统

blob.png

2.挂载分区

blob.png

3.安装grub(注意安装位置,root位置)

blob.png

blob.png

4.恢复内核和initramfs文件

blob.png

5.建立grub.conf  /mnt/boot/grub/grub.conf

blob.png

备注:此处的root=/dev/sda2是因为此磁盘会单独作为一个Linux的磁盘,到时候会自动读取为/dev/sda

二,/dev/sda1为boot分区,所有root=/dev/sda2

5.创建一级目录

blob.png

6.:

    复制bash 和相关 库文件

    复制相关命令及相关库文件

    如:ls,cat, vim,reboot,hostname,bash等 利用之前的脚本

blob.png

7.新建一个虚拟机,将/dev/sdb当作此虚拟机的磁盘,启动系统,如下

blob.png

一个超简易的linux就完成了!!大部分命令都是可以使用的!

blob.png

如果系统出现了什么故障,导致无法启动,或者一些配置文件的丢失,损坏,

都可进入到救援模式中,

系统在引导期间,很重要的一个过程就是init 进程读取其配置文件/etc/inittab ,

启动系统基本服务程序及默认运行级别的服务程序完成系统引导,如果/etc/inittab 误删除

或修改错误,Linux 将无法正常启动。此时,只有通过救援模式才可以解决此类问题。

    有备份文件的回复方法

    没有备份文件的恢复办法

有备份文件的恢复办法:

进入救援模式,执行chroot 命令后,如果有此文件的备份(强烈建议系统中的重要数据目录

,如/etc 、/boot 等要进行备份),直接将备份文件拷贝回去,退出重启即可。如果是

配置文件修改错误,如比较典型的/boot/grub/grub.conf及/etc/passwd 的文件修改错误

,也可以直接修正恢复。假设有备份文件/etc/inittab.bak ,则在救援模式下执行:

    sh-3.1# chroot /mnt/sysimage

    sh-3.1# cp /etc/inittab.bak /etc/inittab

没有备份文件的恢复办法

如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复

,首先查找到/etc/inittab 属于哪一个RPM包

    # chroot /mnt/sysimage

    # rpm -qf /etc/inittab

    initscripts-9.03.49-1.el6.centos.x86_64

退出chroot 模式 :

    # exit

挂载存放RPM 包的安装光盘(在救援模式下,光盘通常挂载在/mnt/source 目录下):

    # mount /dev/sr0 /mnt/source

CentOS6 系统的RPM 包存放在光盘Package 目录下,要修复的硬盘系统的根目录在

/mnt/sysimage 下,需要使用–root 选项指定其位置。覆盖安装/etc/inittab 文件

所在的RPM 包:

# rpm -ivh –replacepkgs | force /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm

其中的rpm 命令选项“–replacepkgs”或者–force 表示覆盖安装,执行完成

后,即已经恢复了此文件

如果想只提取RPM 包中的/etc/inittab 文件进行恢复,可以在进

入救援模式后,执行命令 :

    # rpm2cpio /mnt/source/Packages/initscripts-9.03.49-

    1.el6.centos.x86_64.rpm| cpio -idv ./etc/inittab

    # cp etc/inittab /mnt/sysimage/etc

注意此命令执行时不能将文件直接恢复至/etc 目录,只能提取到当前目录下,

且恢复的文件名称所在路径要写完整 的路径 。提取文件成功后,将其复制到根分

区所在的/mnt/sysimage 目录下相应位置即可

linux内核的组成部分:

    1.kernel:内核核心,一般为bzlmage,通常位于/boot目录,名称为vmlinuz-VERSION-release

    2.kernel object:内核对象,即内核模块,一般放置于/lib/modules/VERSION-release/

        内核模块内核核心版本一定要严格匹配;

        [    ] :N

        [ M]:Module

        [*]  :Y,编译进内核核心

        内核:动态装载和卸载

    3.ramdisk:辅助性文件,并非必须,这取决于内核是否直接驱动rootfs所在的设备;

        目标设备驱动,例如SCSI设备的驱动

        逻辑设备驱动,例如LVM设备的驱动

        文件系统,例如xfs文件系统

        ramdisk:是一个简装版的根文件系统;为了让内核找到真正的根文件系统

内核信息查看:

    uname命令

    -r:内核的release号

    -n:显示当前主机名

    -a:显示所有信息

模块信息获取和管理:

    lsmod:显示模块信息

        来自cat  /proc/modules 信息

modinfo命令:显示一个内核模块的信息

    -F file:仅显示指定自动的信息

    -n:显示文件路径

modprobe命令:模块的动态装载和卸载

    格式:modproe [-r] module_name(带r选项是卸载,不带是装载)

启动和内核管理        blob.png

depmod命令:内核模块依赖关系文件的生成工具;

模块的装载和卸载的另一组命令:

    insmod命令:

        insmod [filename] [module options…](完整路径)

        例:insmod 'modinfo -n  btrfs'

    rmmod命令:

        rmmod [module_name]

        例:rmmod btrfs

ramdisk文件的管理:

    1.mkinitrd命令

        为当前使用中的内核重新制作ramdisk文件

            –with=<module>:除了默认额模块之外需要装载至initramfs中的模块

            -preload-<module>:initramfs所提供的模块需要预先装载的模块

        实例:mkinitrd  /boot/initramfs-$(uname -r).img $(uname -r)

    2.dracut命令

        dracut [OPTION…] [<image> [<kernel version>]]

    实例:dracut /boot/initramfs-$(uname -r ).img  $(uname -r )

内核信息输出的伪文件系统:

    /proc:内核状态和统计信息的输出接口;同时还提供一个配置接口。/proc/sys;

        参数:

            只读:信息输出;例如/proc/#/*

            只写:可接受用户指定一个“新值”来实现对内核某功能或特性的配置;/proc/sys/

            /proc/sys:

                net/ipv4/ip_forward相当于net,ipv4.ip_forward

    1.sysctl命令

        专用于查看或设定/proc/sys命令下参数的值;

        sysctl [options] [varilable=value]

            查看:

            #sysctl -a

            #sysctl variable

            cat /proc/sys/PATH/TO/SOME_KERNEL_FILE

            修改其值:

            #sysctl -w variable=value

    2.文件系统命令(cate,cho命令)

        查看:

        cat /proc/sys/PATH/TO/SOME_KERNEL_FILE

        修改:

        echo “ VALUE” >/proc/sys/PATH/TO/SOME_KERNEL_FILE

    注意:上述两种方式的设定仅当前运行内核有效;

    配置文件:/etc/sysctl.conf, /etc/sysctl.d/*.conf

        立即生效的方式: sysctl  -p  [/PATH/TO/CONFIG_FILE]

内核参数:

    net.ipv4.ip_forward:核心转发

    vm

    kernel.hostname:主机名

    net.ipv4icmp_echo-ignore_all:忽略所有ping操作

/sys目录:

    sysfs:输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的可设置参数;对此些参数的修改,即可定制硬件设备工作特性

    udev:通过读取/sys目录下的硬件设备信息按需为各硬件设备创建设备文件

    udev是用户空间程序,专用工具:devamdin,hotplug;

    udev为设备创建设备文件时,会读取其实现定义好的规则文件,一般在/etc/udev/rules.d/目录下。以及/usr/lib/udev/rules.d/目录下

   

内核编译

程序包的编译安装:

    ./configure ,make,make install

编译内核前提:开发环境(开发工具,开发库),头文件:/usr/include

前提:

    1.准备好开发环境

    2.获取目标主机上硬件的相关信息

    3.获取到目标主机系统功能的相关信息,例如要启用的文件系统

    4.获取内核源代码

1.准备开发环境

    centos 6 7:

        包组:

           Devrlopment Tools

             Server platfrom Development

    centos 7:

        包组:

           Devrlopment Tools

             Server platfrom Development

具体命令 

yum groupinstall "Development tools" "Server Platform Development"

2.获取目标主机上的硬件上的相关信息 

CPU:

    cat /proc/couinfo

    lscup

    x86info -a (查看更详细的信息,但是此命令需要安装),如下

yum install x86info

blob.png

PCI设备:

    lspci命令:

           -v:显示详细信息

             -vv:显示更详细信息

    lsusb命令:

          -v:显示详细信息

             -vv:显示更详细信息

blob.png

    lsblk命令

了解全部硬件设备信息

    hal -device

3.不做深入了解  

4.内核编译过程

步骤如下:

    1.tar xf linux-3.18.41.tar.xz -C /usr/src

     2.cd /usr/src

     3.ln -sv linux-3.18.41  linux

     4.cd linu

     5.make menuconfi        配置内核选项

     6.make               编译内核,可使用-j指定编译线程数量

     7.make modules_install    安装内核模块

     8.make install          安装内核

重启系统,选择使用新内核

详细如下:

1.下载一个新内核,然后解压到指定目录下,通常在/usr/src目录

tar xf linux-3.18.41.tar.xz -C /usr/src

2.cd /usr/src,进入到此目录

blob.png

3和4 . 给生成的目录创建软链接文件,进入到此目录

ln -sv linux-3.18.41  linux

blob.png

5.配置内核选项

如果不知道编译内核时要选择那些选项,可参照/boot/config-2.6.32-642.el6.x86_64

cp /boot/config-2.6.32-642.el6.x86_64  .config

配置内核选项有很多选项,后面会做详细解说,此次博客简单了解,如下

blob.png

6.因为编译内核时间太长,未免出现意外,我们使用screen命令,之前博客有提到,这里不做详细说明

我们在终端是使用screen命令,然后在会话中执行make命令编译,即使此终端意外断开,再次连接终端后,

进入screen中,编译不会断开,会保持编译中状态中…

命令如下:

screen
make

blob.png

7.安装内核模块

执行命令

make modules_install

blob.png

最后竟然报错了 ,在网上查找时,说是内存不够,然后就增加了一个swap分区,并启用,看是否能够正常安装内核模块?blob.png

重新安装内核模块结果如下,没有报错,看来就是内存的原因了 

blob.png

8.安装内核,然后reboot重启,新内核无法读取,只显示了原内核,发现/boot/grub/gurb.conf文件中没

有自动生成新内核条目,以下为手动添加,在重启,新内核显示了,且内核版本为3.18.41,内核编译成功

以上出现的问题还需研究!!

blob.png

blob.png

原创文章,作者:qiuwei,如若转载,请注明出处:http://www.178linux.com/45873