linux启动流程(启动流程,/sbin/init程序,grub详解,模块相关命令,sysctl和/proc/sys/,内核编译(第13天)

CentOS 5和6的启动流程

Linux组成分为kernel和rootfs(根文件系统)。

kernel: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能

glic存放于rootfs中的/lib/,/lib64/中,glibc是其他应用程序的运行环境。

库:函数集合, function, 调用接口
      过程调用:procedure
      函数调用:function

内核设计流派:
单内核设计:Linux,把所有功能集成于同一个程序;linux对线程支持不好
微内核设计:Windows, Solaris,每种功能使用一个单独子系统实现;

Linux内核特点:
支持模块化:每一个.ko文件就是一个内核模块 (kernel object)
支持模块的动态装载和卸载;

linux内核的组成部分:核心文件+ramdisk+模块文件
核心文件:/boot/vmlinuz-KERNEL_VERSION-release  其中release表示rpm版本号
ramdisk:
  CentOS 5: /boot/initrd-KERNEL_VERSION-release.img
  CentOS 6: /boot/initramfs-KERNEL_VERSION-release.img
模块文件:/lib/modules/KERNEL_VERSION-release   存放内核的各个模块文件

为什么要有ramdisk,请参考第8天的博客内容。
内核与ramdisk到底是什么关系?系统在启动的过程中,内核与ramdisk分别扮演什么角色啊?
我对启动的过程一直不明白,懂的朋友帮我讲讲。
谢谢
精彩回答:
ramdisk一个作用就是用来解决boot过程中mount根文件系统的“先有鸡还是先有蛋”的问题的。

一般来说,根文件系统在形形色色的存储设备上,不同的设备又要不同的硬件厂商的驱动,比如intel的南桥自然需要intel的ide/sata驱动,VIA的南桥需要VIA的ide/sata驱动,根文件系统也有不同的文件系统的可能,比如ubuntu发行版可能一般用ext3,suse可能就不是了,不同的文件系统也需要不同的文件系统模块;假如把所有驱动/模块都编译进内核(注:即编一个通用的、万能的内核),那自然没问题,但是这样就违背了“内核”的精神或本质,所以一般来说驱动/模块都驻留在根文件系统本身上/lib/modules/xxx,那么“鸡蛋”问题就来了,现在要mount根文件系统却需要根文件系统上的模块文件,怎么办?于是,就想出ramdisk,内核总是能安装ramdisk的(注:这是因为ramdisk临时文件系统和内核一样,也是由bootloader通过低级读写命令(如uboot用nand read,而不用通过文件系统层提供的高级读写接口)加载进内存,因此内核可以挂载内存里ramdisk文件系统),然后把所有可能需要的驱动/模块都放在ramdisk上,首先,让内核将ramdisk当作根文件系统来安装,然后再用这个根文件系统上的驱动来安装真正的根文件系统,就将这个矛盾问题解决了


CentOS 系统启动流程简介:
BIOS存储在主板上的EEPROM或者闪存中,是一段程序,并且BIOS是个人电脑启动时加载的第一个软件。系统过电或被重置(reset)时,处理器第一条指令的地址会被定位到BIOS的内存中,让初始化程序开始运行。BIOS用于电脑开机时运行系统各部分的的自我检测(Power On Self Test),并加载引导程序(IPL)或存储在主存的作业系统。

BIOS会按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到设备;

bootloader(引导程序)是操作系统安装时安装在硬盘上的引导程序或者之后另外安装的。引导程序通常分为两部分:第一阶段引导程序位于主引导记录(MBR),用以引导位于某个分区上的第二阶段引导程序,如NTLDR、BOOTMGR和GNU GRUB。

MBR(512字节):前446字节是bootloader的第一阶段,后64字节是分区表,最后2个字节55AA。

bootloader功能:提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核;


GRUB有2个阶段:(第一阶段就是bootloader,第二阶段则是位于磁盘的的/boot分区上的)
bootloader: 1st stage,这一阶段主要找位于磁盘某个分区上的grub第2阶段,这一阶段就是MBR中的前446字节。
disk: 2nd stage
grub还有一个1.5阶段,因为grub第1阶段要引导位于磁盘上某个分区上的第2阶段,所以grub必须要识别该磁盘上的文件系统格式(比如NTFS,ext4,btrfs, xfs等各种格式),所以这个1.5阶段就是用于识别分区上的文件系统。


bootloader引导内核之后,把系统控制权移交给内核,内核主要的工作有如下几个:
探测可识别到的所有硬件设备;
加载硬件驱动程序;(有可能会借助于ramdisk加载驱动,也有可能驱动本身已经编译进内核里了)
以只读方式挂载根文件系统;
运行用户空间的第一个应用程序:/sbin/init


init程序的类型:SysV,Upstart,Systemd
SysV风格: init, CentOS 5 就是使用这种风格的,一般使用脚本完成初始化工作,比如,service  network start,而network只是/etc/init.d/目录下的一个脚本,而该目录下有许多这类的脚本,每一次启动系统可能会启动多个这类脚本,每个脚本的启动都会创建进程。
其配置文件:/etc/inittab

Upstart: init, CentOS 6
其配置文件:/etc/inittab, /etc/init/*.conf

Systemd:systemd, CentOS 7
其配置文件:/usr/lib/systemd/system, /etc/systemd/system


ramdisk:
内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问;
ramdisk --> ramfs
CentOS 5: initrd,  由工具程序mkinitrd生成
CentOS 6: initramfs, 由工具程序mkinitrd, dracut生成


系统初始化:
POST --> BootSequence (BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> init或systemd



/sbin/init  详解:
CentOS 5启动的第一个程序就是/sbin/目录下的init程序。

运行级别:为了系统的运行或维护等应用目的而设定;

0-6:7个级别操作系统运行级别
0:关机
1:单用户模式(root, 无须登录), single,                   维护模式;
2: 多用户模式,会启动网络功能,但不会启动NFS;维护模式;
3:多用户模式,正常模式;文本界面;
4:预留级别;可同3级别;
5:多用户模式,正常模式;图形界面;
6:重启

默认级别:3, 5

切换级别:
init #

查看级别使用如下的两个命令:
runlevel
who -r

配置文件:/etc/inittab 详解
每一行定义一种action以及与之对应的process

内如格式如下:
id:runlevel:action:process

action: 可能的取值如下:
wait: 切换至此级别运行一次;
respawn:此process终止,就重新启动之;
initdefault:设定默认运行级别;process省略;
sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit;
...

文件内容可能如下:当运行至某一级别时候,则运行对应的process,如下指定:
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit    运行至任何级别,都会运行/etc/rc.d/rc.sysinit脚本
l0:0:wait:/etc/rc.d/rc 0   运行至0级别,则运行/etc/rc.d/rc0.d/目录下的脚本
l1:1:wait:/etc/rc.d/rc 1   运行至1级别,则运行/etc/rc.d/rc1.d/目录下的脚本
...
l6:6:wait:/etc/rc.d/rc 6   运行至6级别,则运行/etc/rc.d/rc6.d/目录下的脚本

说明:rc 0 --> 意味着读取/etc/rc.d/rc0.d/目录下的脚本,这些脚本名称以K##或者S##开头,并且给K开头的脚本传递一个stop参数,给S开头的脚本传递一个start参数。这些脚本以K##开头,其中的##表示运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务。另外一些脚本以S##开头,其中的##表示运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务;

注意:其实/etc/rc.d/rc0.d/,/etc/rc.d/rc1.d/,/etc/rc.d/rc2.d/,/etc/rc.d/rc3.d/,/etc/rc.d/rc4.d/,/etc/rc.d/rc5.d/,/etc/rc.d/rc6.d/目录下的文件都是链接文件,链接到/etc/init.d/目录下的文件。



chkconfig命令
查看服务脚本在所有级别的启动或关闭设定情形:
chkconfig  --list   可以查看所有脚本在各个不同级别下是关闭的或者开启的
chkconfig --add  name  将加入/etc/init.d/目录中的脚本 name在/etc/rc.d/rc0.d/,/etc/rc.d/rc1.d/,/etc/rc.d/rc2.d/,/etc/rc.d/rc3.d/,/etc/rc.d/rc4.d/,/etc/rc.d/rc5.d/,/etc/rc.d/rc6.d/目录下创建链接文件
      #!/bin/bash
      #
      # chkconfig: LLLL nn nn  
如上的3行代码表示/etc/init.d/目录下的某一脚本的开头,其中chkconfig后面的LLLL表示数字,比如234,就表示234启动级别下,会开启该服务脚本,后面2个nn也是数字,分别表示启动顺序,和关闭顺序。整体来解释的话,比如:chkconfig: 234 83 13,表示在234启动级别下,默认开机运行该服务脚本,并且该脚本的启动顺序是83,关闭该脚本的顺序是13.

chkconfig --del name   删除各个链接文件

chkconfig [--level levels] name <on|off|reset>
      --level LLLL: 指定要设置的级别;省略时表示2345;
例如 chkconfig --level  345 NetworkManager on    设置345级别为on

注意:正常级别下,比如345级别下,最后启动的一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本;因此,不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中;


/etc/inittab文件之后的内容可能如下:  用于启动虚拟终端
tty1:2345:respawn:/usr/sbin/mingetty tty1
tty2:2345:respawn:/usr/sbin/mingetty tty2
...
tty6:2345:respawn:/usr/sbin/mingetty tty6
mingetty会调用login程序


si::sysinit:/etc/rc.d/rc.sysinit  这是前面提到的,表示任何级别下,都会运行/etc/rc.d/rc.sysinit脚本。阅读该脚本。该脚本做了哪些工作?
(1) 设置主机名;
(2) 设置欢迎信息;
(3) 激活udev和selinux;
(4) 挂载/etc/fstab文件中定义的文件系统;
(5) 检测根文件系统,并以读写方式重新挂载根文件系统;
(6) 设置系统时钟;
(7) 激活swap设备;
(8) 根据/etc/sysctl.conf文件设置内核参数;
(9) 激活lvm及software raid设备;
(10) 加载额外设备的驱动程序;
(11) 清理操作;


总结:/sbin/init 程序读取 (/etc/inittab)配置文件 --> 设置默认运行级别 --> 运行系统初始脚本、完成系统初始化 --> 关闭对应下需要关闭的服务,启动需要启动服务 --> 设置登录终端

----------------------------------------分割线----------------------------------------

CentOS 6:
/sbin/init程序为 : upstart,
其配置文件:/etc/inittab(upstart一般没有使用该配置文件), /etc/init/*.conf
/etc/init/目录下有多个.conf文件,如下:
control-alt-delete.conf
prefdm.conf
rcS-emergency.conf
readahead-disable-services.conf
tty.conf
init-system-dbus.conf
quit-plymouth.conf
rcS-sulogin.conf
serial.conf
kexec-disable.conf
rc.conf
readahead-collector.conf
splash-manager.conf
plymouth-shutdown.conf
rcS.conf
readahead.conf
start-ttys.conf
注意:/etc/init/*.conf文件语法 遵循 upstart配置文件语法格式;


博客作业:系统启动流程;

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

----------------------------------分割线-------------------------------------------------

CentOS 6启动流程:
POST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别 --> 系统初始化脚本 --> 关闭或启动对应级别下的服务 --> 启动终端


GRUB:GRand Unified Bootloader
grub是一个bootloader程序,用于引导加载内核,并把控制权转交给内核

grub有2个版本:
      grub 0.x: grub legacy  传统版本
      grub 1.x: grub2



grub legacy:该程序分为3阶段
stage1: 第1阶段存放于硬盘的mbr中(512字节),该阶段用于寻找第2阶段
stage1_5: 第1.5阶段存放于mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统;
stage2:第2阶段存放于磁盘分区(/boot/grub/)上。该阶段才真正用于显示菜单,引导加载内核。

grub的配置文件为/boot/grub/grub.conf,/etc/grub.conf会链接至此文件。

stage2及内核等通常放置于一个基本磁盘分区;
stage2功用如下:
(1) 提供菜单、并提供交互式接口
      e: 编辑模式,用于编辑菜单;
      c: 命令模式,进入交互式接口;进入该交互式接口后,输入help可以查看帮助信息
(2) 加载用户选择的内核或操作系统
      允许传递参数给内核
      可隐藏此菜单
(3) 为菜单提供了保护机制
      为编辑菜单进行认证
      为启用内核或操作系统进行认证

grub如何识别设备:
grub第1阶段如何识别grub第2阶段所在的分区?因为grub第1阶段的主要目的就是寻找第2阶段,然后让第2阶段接手接下来的工作。
我们知道,grub第2阶段位于/boot/grub/目录下,那么grub第1阶段如何识别这个分区,顺利找到第2阶段的grub?
答案:/boot/如果是单独分区的情况下,此时根文件系统尚未启动,grub第1阶段直接访问引导分区,那么grub第1阶段访问第2阶段的路径写法就是 /grub/stage2 ,访问vmlinuz的路径的写法就是 /vmlinuz 这种形式。
/boot/如果不是单独分区的情况下,grub第1阶段直接访问引导分区,那么grub第1阶段访问第2阶段的路径写法就是 /boot/grub/stage2,访问vmlinuz的路径写法就是/boot/vmlinuz  这种形式。

(hd#,#)
hd#: 磁盘编号,用数字表示;从0开始编号
#: 分区编号,用数字表示; 从0开始编号
比如,(hd0,0)


grub的命令行接口的使用,有很多子命令可以使用:
help: 获取帮助列表
help KEYWORD: 详细帮助信息
find (hd#,#)/PATH/TO/SOMEFILE:例如 find (hd0,0)/vmlinuz
root (hd#,#)  
kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数;例如kernle /vmlinuz
例如:init=/path/to/init, selinux=0,root=/dev/DEVICE  等等
initrd /PATH/TO/INITRAMFS_FILE: 为选定的内核提供额外的ramdisk;
boot: 引导启动选定的内核;

手动在grub命令行接口下启动系统的步骤如下:
grub> root (hd#,#)  设定grub根分区
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE 绿色的指明根文件系统
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot

grub程序的配置文件:/boot/grub/grub.conf
grub就是读取此配置文件来显示菜单的
配置项:
default=#: 设定默认启动的菜单项;菜单项(title)编号从0开始;
timeout=#:指定菜单项等待选项选择的时长;
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径;
hiddenmenu:隐藏菜单;
password [--md5] STRING: 菜单编辑认证;
title TITLE:定义菜单项“标题”, 可出现多次;
      root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”;
      kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核以及参数
      initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件;
      password [--md5] STRING: 启动选定的内核或操作系统时进行认证;

例如:

password [--md5] STRING 中的STRING可以使用grub-md5-crypt命令生成



进入单用户模式:
(1) 编辑grub菜单(选定要编辑的title,而后使用e命令);
(2) 在选定的kernel后,使用e命令,进入编辑,附加
        1, s, S或single都可以;敲enter键确定
(3) 在kernel所在行,键入“b”命令;




安装grub:
(1) grub-install   3阶段全部安装,grub会寻找boot目录,在boot目录下创建grub目录
grub-install --root-directory=ROOT /dev/DISK
--root-directory 指定grub的根目录,也就是boot目录的父目录
(2) grub    在终端直接输入grub命令
grub> root  (hd#,#)
grub> setup  (hd#)

练习:
1、新加硬盘,提供直接单独运行bash系统;
2、破坏本机grub stage1,而后在救援模式(相当于windows pe)下修复之;
3、为grub设备保护功能;


给别的磁盘安装一个gurb程序,并且该硬盘运行bash。练习中的第1题。
第1步:使用虚拟机添加一个新的硬盘,假设为/dev/sdb,使用fdisk /dev/sdb创建3个分区,/dev/sdb1 用于boot分区(也就是grub安装在这个分区下),/dev/sdb2 用于swap分区(调整分区类型为82,表示swap分区),/dev/sdb3 用于根分区。partx -a /dev/sdb使系统重读分区表。
第2步:在分区上创建文件系统。
mke2fs -t ext4 /dev/sdb1
mkswap  /dev/sdb2
mke2fs  -t ext4 /dev/sdb3
第3步:挂载boot分区至/mnt/boot/目录下
mkdir /mnt/boot/
mount  /dev/sdb1  /mnt/boot/
第4步:安装grub程序
grub-install --root-directory=/mnt  /dev/sdb
cp /boot/vmlinuz-2.6.32-504.el6.x86_64    /mnt/boot/vmlinuz
cp /boot/initramfs-2.6.32-504.el6.x86_64.img   /mnt/boot/initramfs.img
安装完成之后,配置文件grub.conf一般没有生成,只能自己手动添加编辑
vim /mnt/boot/grub/grub.conf   添加如下的内容
default=0
timeout=5
title CentOS(Express)
      root (hd0,0)
      kernel /vmlinuz ro root=/dev/sda3 selinux=0 init=/bin/bash
      initrd  /initramfs.img
第5步:复制bash程序以及其使用到的共享库到/dev/sdb3分区中
mkdir /mnt/sysroot
mount  /dev/sdb3  /mnt/sysroot/
cd /mnt/sysroot/
mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home root mnt media
cp /bin/bash  /mnt/sysroot/bin/
cp /lib64/libtinfo.so.5  /mnt/sysroot/lib64/
cp /lib64/libdl.so.2  /mnt/sysroot/lib64/
cp /lib64/libc.so.6  /mnt/sysroot/lib64/
cp /lib64/ld-linux-x86-64.so.2  /mnt/sysroot/lib64/

chroot /mnt/sysroot/  根切换,测试是否成功

将该硬盘卸下,新建一个虚拟机,启动这个只有bash的系统



-----------------------------分割线---------------------------------------------------------

Linux Kernel:
单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制。

内核组成部分:内核核心+内核模块+ramdisk
kernel: 内核核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE;
kernel object: 内核对象,一般放置于/lib/modules/VERSION-RELEASE/,有3中使用方式
      [ ]:    N     不支持此模块,就是不编译该模块
      [M]: M  编译成模块,需要时动态加载
      [*]:   Y     将模块编译进内核核心

辅助文件:ramdisk
initrd
initramfs


uname命令:输出系统信息
uname - print system information
uname [OPTION]...
      -n: 显示节点名称;
      -r: 显示VERSION-RELEASE;


lsmod命令:
显示由核心当前已经装载的内核模块
显示的内容来自于: /proc/modules文件的内容


modinfo命令:显示模块的详细描述信息
模块和模块之间是有依赖关系的
格式如下:
modinfo [ -k kernel ]  [ modulename|filename... ]
-n: 只显示模块文件路径
-p: 显示模块参数
-a: author
-d: description
-l: license
例如  modinfo  xfs

modprobe命令:
装载或卸载内核模块
modprobe [ -C config-file ]  [ modulename ]  [ module parame-ters... ]
配置文件:/etc/modprobe.conf, /etc/modprobe.d/*.conf

modprobe [ -r ] modulename...  卸载模块
例如 modprobe -r ipv6


depmod命令:
内核模块依赖关系文件及系统信息映射文件的生成工具;

装载或卸载内核模块:
insmod命令:
insmod [ filename ]  [ module options... ]
       filename 是模块的绝对路径
例如 insmod $(modinfo -n libcrc32c)
        insmod $(modinfo -n xfs)

rmmod命令
rmmod [ modulename ]
例如 rmmod xfs


/proc目录详解:
内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出;
参数:
       只读:输出信息
       可写:可接受用户指定“新值”来实现对内核某功能或特性的配置,/proc/sys目录一般都是可以读写的。

/proc/sys/目录详解:
/proc/sys/目录下的内核参数可以使用sysctl命令改变
(1) sysctl命令用于查看或设定此目录中诸多参数;
sysctl -w path.to.parameter=VALUE
例如  sysctl -w kernel.hostname=mail.magedu.com
注意:不需要写proc.sys.kernel.hostname只需要写kernel.hostname

(2) echo命令通过重定向的方式也可以修改大多数参数的值;
echo "VALUE" > /proc/sys/path/to/parameter
例如  echo "www.magedu.com" > /proc/sys/kernel/hostname

sysctl命令:
默认配置文件:/etc/sysctl.conf,可设置的内核参数都写在该配置文件中了
(1) 设置某参数
      sysctl -w parameter=VALUE
(2) 通过读取配置文件设置参数
      sysctl -p [/path/to/conf_file]

内核中的路由转发:
/proc/sys/net/ipv4/ip_forward
sysctl -w  net.ipv4.ip_forward=1  设置为1,表示开启路由转发

常用的几个参数:
net.ipv4.ip_forward
vm.drop_caches    如果等于1,表示释放内存缓存
kernel.hostname


/sys/目录详解:
sysfs:输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些参数是可以修改的,用于调整硬件工作特性。

udev通过此路径下输出的信息动态为各设备创建所需要的设备文件;udev是运行在用户空间的程序;专用工具:udevadmin, hotplug;

udev为设备创建设备文件时,会读取其事先定义好的命名规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目录下;


ramdisk文件的制作:
ramdisk文件是一个微型的根文件系统
(1) mkinitrd命令
为当前正在使用的内核重新制作ramdisk文件
~] # mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)    表示为$(uname -r)版本号创建ramdisk文件

(2) dracut命令
为当前正在使用的内核重新制作ramdisk文件
~] # dracut /boot/initramfs-$(uname -r).img $(uname -r)

cpio -id < ****.img  可以展开该ramdisk文件。


编译内核:
前提:
    (1) 准备好开发环境;
    (2) 获取目标主机上硬件设备的相关信息;
    (3) 获取到目标主机系统功能的相关信息,例如要启用的文件系统;
    (4) 获取内核源代码包;
    www.kernel.org


准备好开发环境:
包组(CentOS 6):安装如下的2个包组
      yum groupinstall "Server Platform Development"
      yum groupinstall "Development Tools"


目标主机硬件设备相关信息:
CPU:
    ~]# cat /proc/cpuinfo
    ~]# x86info -a
    ~]# lscpu

PCI设备:
    ~]# lspci
    -v
    -vv

    ~]# lsusb
    -v
    -vv

    ~]# lsblk

了解全部硬件设备信息
    ~]# hal-device




简单依据模板文件(就是/boot/目录下config开头的配置文件)的制作过程:
    ~]# tar xf linux-3.10.67.tar.xz -C /usr/src
    ~]# cd /usr/src
    ~]# ln -sv linux-3.10.67 linux
    ~]# cd linux
    ~]# cp /boot/config-$(uname -r)   ./.config

    ~]# make menuconfig   打开文本界面来配置模块,会生成.config文件
             或者使用  make gconfig   或者make xconfig
             注意:make help查看make命令的使用帮助
    ~]# screen
    ~]# make -j #   编译内核,其中#表示核心数量

    ~]# make modules_install   安装模块
    ~]# make install                 安装内核
       上面的步骤做完之后,会在/boot/目录下生成initramfs文件和vmlinuz文件,并且/boot/grub/grub.conf文件中新添加一个title。
      重启系统,并测试使用新内核;


练习:编译好,并启用之;


如果文章对您有帮助,谢谢支持!









评论

此博客中的热门博文

OAuth 2教程

网格策略

apt-get详细使用