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。
重启系统,并测试使用新内核;
练习:编译好,并启用之;
如果文章对您有帮助,谢谢支持!
Linux组成分为kernel和rootfs(根文件系统)。
kernel: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
glic存放于rootfs中的/lib/,/lib64/中,glibc是其他应用程序的运行环境。
库:函数集合, function, 调用接口
过程调用:procedure
函数调用:function
内核设计流派:
单内核设计:Linux,把所有功能集成于同一个程序;linux对线程支持不好
微内核设计:Windows, Solaris,每种功能使用一个单独子系统实现;
支持模块化:每一个.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
默认配置文件:/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。
重启系统,并测试使用新内核;
练习:编译好,并启用之;
如果文章对您有帮助,谢谢支持!
评论
发表评论