阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Linux基础教程之内核编译以及自制Linux系统

89次阅读
没有评论

共计 5812 个字符,预计需要花费 15 分钟才能阅读完成。

内核编译

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

 

内核组成部分:

kernel: 内核核心,一般为 bzImage,通常在 /boot 目录下,名称为 vmlinuz-VERSION-RELEASE;

kernel object: 内核对象,一般放置于 /lib/modules/VERSION-RELEASE/

[]: None

[M]: 表示模块化安装

[*]: 表示打到内核核心

辅助文件:ramdisk

initrd

initramfs

 

运行中的内核:

uname 命令:

uname – print system information

uname[OPTION]…

-n: 显示节点名称;

-r: 显示 VERSION-RELEASE;

-a: 显示所有信息

Linux 基础教程之内核编译以及自制 Linux 系统

 

lsmod 命令:

显示由核心已经装载的内核模块

显示的内容来自于: /proc/modules 文件

 

示例: 可以看见已经加载的模块

Linux 基础教程之内核编译以及自制 Linux 系统

 

modinfo 命令:

显示模块的详细描述信息

modinfo[-k kernel] [modulename|filename…]

-n: 只显示模块文件路径

-p: 显示模块参数

-a: author

-d: description

-l: license

 

示例: 显示模块的详细信息

Linux 基础教程之内核编译以及自制 Linux 系统

 

modprobe 命令:

装载或卸载内核模块

modprobe [-C config-file] [modulename] [module parame-ters…] 安装内核

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

modprobe [-r] modulename… 卸载内核模块

 

示例 1:卸载网卡驱动,然后发现没有 eth 那些网卡配置信息了

Linux 基础教程之内核编译以及自制 Linux 系统

示例 2:加载网卡驱动

Linux 基础教程之内核编译以及自制 Linux 系统

 

depmod 命令:

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

装载或卸载内核模块:

insmod 命令:指定模块文件,不自动解决依赖模块

insmod[filename] [module options…]

insmod`modinfo–n exportfs`

lnsmod`modinfo–n xfs`

rmmod

rmmod[modulename]

rmmod xfs

rmmod exportfs

 

内核相关目录

/proc 目录:

内核把自己内部状态信息及统计信息,以及可配置参数通过 proc 伪文件系统加以输出

参数:只读:输出信息

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

/proc/sys

(1) sysctl 命令用于查看或设定此目录中诸多参数

sysctl-w path.to.parameter=VALUE

sysctl-w kernel.hostname=mail.magedu.com

(2) echo 命令通过重定向方式也可以修改大多数参数的值

echo“VALUE”> /proc/sys/path/to/parameter

echo“websrv”> /proc/sys/kernel/hostname

/sys 目录:

sysfs:为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些参数是可以修改的,用于调整硬件工作特性。

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

专用工具:udevadmin, hotplug

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

 

sysctl 命令

默认配置文件:/etc/sysctl.conf

(1) 设置某参数

sysctl-w parameter=VALUE

(2) 通过读取配置文件设置参数

sysctl-p [/path/to/conf_file]

内核中的路由转发:

/proc/sys/net/ipv4/ip_forward

常用的几个参数:

net.ipv4.ip_forward

net.ipv4.icmp_echo_ignore_all

vm.drop_caches

 

ramdisk 文件的制作

(1) mkinitrd 命令    为当前正在使用的内核重新制作 ramdisk 文件

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

(2) dracut 命令    为当前正在使用的内核重新制作 ramdisk 文件

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

 

示例:假如 initramfs 文件丢失,恢复之

删除 initramfs 文件,然后重启

Linux 基础教程之内核编译以及自制 Linux 系统

会发现已经登陆不进去系统

Linux 基础教程之内核编译以及自制 Linux 系统

此时进入救援模式运行进行修复

Linux 基础教程之内核编译以及自制 Linux 系统 修复完毕,重启,会发现 SELinux 在检查,稍等即可进入系统

Linux 基础教程之内核编译以及自制 Linux 系统

 

编译内核

前提:

(1) 准备好开发环境

(2) 获取目标主机上硬件设备的相关信息

(3) 获取目标主机系统功能的相关信息

例如: 需要启用相应的文件系统

(4) 获取内核源代码包

www.kernel.org

开发环境准备

包组 (CentOS 6):

Server Platform Development

Development Tools

目标主机硬件设备相关信息:

CPU:

# cat /proc/cpuinfo

# x86info -a

# lscpu

硬件设备

PCI 设备:

lspci

-v

-vv

lsusb

-v

-vv

lsblk  块设备

了解全部硬件设备信息

hal-device

 

内核编译安装系统

安装开发包组

下载源码文件

.config:准备文本配置文件

make menuconfig:配置内核选项

make [-j #]

make modules_install:安装模块

make install:安装内核相关文件

安装 bzImage 为 /boot/vmlinuz-VERSION-RELEASE

生成 initramfs 文件

编辑 grub 的配置文件

 

(1) 配置内核选项

支持“更新”模式进行配置:make help

(a) make config:基于命令行以遍历的方式去配置内核中可配置的每个选项

(b) make menuconfig:基于 curses 的文本窗口界面

(c) make gconfig:基于 GTK (GNOME)环境窗口界面

(d) make xconfig:基于 QT(KDE) 环境的窗口界面

支持“全新配置”模式进行配置

(a) make defconfig:基于内核为目标平台提供的“默认”配置进行配置

(b) make allyesconfig: 所有选项均回答为“yes“

(c) make allnoconfig: 所有选项均回答为”no“

(2) 编译

全编译:make [-j #]

编译内核的一部分功能:

(a) 只编译某子目录中的相关代码:

# cd /usr/src/Linux

# make dir/

(b) 只编译一个特定的模块:

# cd /usr/src/Linux

# make dir/file.ko

例如:只为 e1000 编译驱动:

# make drivers/net/ethernet/intel/e1000/e1000.ko

如何交叉编译内核:

编译的目标平台与当前平台不相同才需要交叉编译

# make ARCH=arch_name

要获取特定目标平台的使用帮助

# make ARCH=arch_namehelp

# make ARCH=arm help

在已经执行过编译操作的内核源码树做重新编译:

需要事先清理操作:

# make clean:清理大多数编译生成的文件,但会保留 config 文件等

# make mrproper: 清理所有编译生成的文件、config 及某些备份文件

# make distclean:mrproper、patches 以及编辑器备份文件

 

示例:简单 Linux kernel 内核编译过程

首先提示,此处用虚拟的同学,尽量把虚拟机的核心数量调大一点,跟实际的主机一样就可以了,此处操作只是为了加快编译的时间,编译的时候会消耗大量的 cpu 资源,如果想继续做其他操作的小伙伴,可以忽略此处

Linux 基础教程之内核编译以及自制 Linux 系统

在系统里面可以查看到当前系统的核心数量

Linux 基础教程之内核编译以及自制 Linux 系统

进行内核操作,请自备 Linux 内核。而且编译内核以前,请做好备份,编译内核的主版本,请尽可能跟原有的内核版本相近,因为直接采用最新的内核版本,有可能会导致系统崩溃。

此处内核可以到 www.kernel.org 下载

此次实验我们用的是 Linux-3.18.41 版本的内核,当前系统是 3.10.0 的版本的内核

Linux 基础教程之内核编译以及自制 Linux 系统

/usr/scr/kernels,此处目录是存放内核文件的地方,现在只有一个 3.10 版本的内核

Linux 基础教程之内核编译以及自制 Linux 系统

解压新的内核到 /usr/src 目录下面

Linux 基础教程之内核编译以及自制 Linux 系统

Linux 基础教程之内核编译以及自制 Linux 系统

创建 Linux-3.18-41 的软连接目录 Linux, 此处的操作是为了后面的操作每次都需要内核版本号,一旦输入错误的话,就又得重来了(编译两小时,报错 5 秒钟)

Linux 基础教程之内核编译以及自制 Linux 系统

复制原有系统的 /boot/config-3.10.0-327.el7.x86_64 的文件到 /usr/src/Linux 目录下面为.config 的文件

Linux 基础教程之内核编译以及自制 Linux 系统

运行 make menuconfig 命令来配置内核选项,如果此处有报错的话,例如下图,表明一些编译内核的工具还没有安装,此处我们通过 yum 仓库来安装一下相关的文件,此处除了报错的 curses.h 的文件以外,还有

Server Platform Development、Development Tools 等工具是必须要安装的,编译以前需要查看一下工具是否都已经安装完毕。

Linux 基础教程之内核编译以及自制 Linux 系统

Linux 基础教程之内核编译以及自制 Linux 系统

Linux 基础教程之内核编译以及自制 Linux 系统

安装完相关的工具以后,重新运行 make menuconfig 命令

此时我们已经可以正常进入编辑内核选项的图形化界面,在这里我们可以选择我们需要的内核功能

Linux 基础教程之内核编译以及自制 Linux 系统

例如此处可以编译内核的名字,像本机内核的 3.10.0-327.el7.x86_64 后面的 -327.el7.x86_64 就是在此处编辑

 

Linux 基础教程之内核编译以及自制 Linux 系统

例如我们可以定义为 -1.0_wanLinux

Linux 基础教程之内核编译以及自制 Linux 系统

再看看其他功能,比如此处可以选择 windows 的文件系统

Linux 基础教程之内核编译以及自制 Linux 系统

可以看见有一个 NTFS 文件系统支持的选择

Linux 基础教程之内核编译以及自制 Linux 系统

按空格键可以选中此功能,此处的 M 表示以模块化的方式来安装此文件驱动,这样的话在系统的 modules 文件夹里面即可以查找到这个文件

Linux 基础教程之内核编译以及自制 Linux 系统

再多按一次空格健会编程一个 *, 表示直接把此集成到内核里面,在系统里面运行的话是看不到此文件的

Linux 基础教程之内核编译以及自制 Linux 系统

当选择好那些我们需要内核参数以后,就可以选择此处的保存

Linux 基础教程之内核编译以及自制 Linux 系统

默认保存.config 的文件

Linux 基础教程之内核编译以及自制 Linux 系统

上面的步骤准备好以后,输入 make -j 4 开始编译,此处的 -j 4 表示指定 cpu 的数量,因为我这里核心数量是 4, 输入完以后,内核就开始编译了,此处需要等待很长的时间

Linux 基础教程之内核编译以及自制 Linux 系统

编译完以后 /lib/modules 并不会马上生成内核的文件

Linux 基础教程之内核编译以及自制 Linux 系统

此时回去 /usr/src/Linux 目录下面运行 make modules_install 安装内核模块

Linux 基础教程之内核编译以及自制 Linux 系统

上面的运行完以后,我们可以看见 /lib/modules 目录下面会多一个 3.18.41 的内核文件,查看一下该目录,居然有 7G 多,所以小伙伴们编译的时候注意看一下磁盘的空间容量。

Linux 基础教程之内核编译以及自制 Linux 系统

再运行 make install 安装内核相关文件

安装 bzImage 为 /boot/vmlinuz-VERSION-RELEASE

生成 initramfs 文件

Linux 基础教程之内核编译以及自制 Linux 系统

然后会发现 /boot 目录下面多了内核 3.18.41 的文件

Linux 基础教程之内核编译以及自制 Linux 系统

进入 /boot/grub2/ 目录下面查看 grub.cfg 文件

Linux 基础教程之内核编译以及自制 Linux 系统

可以看见 grub 里面已经有 3.18.41 内核的加载选项

Linux 基础教程之内核编译以及自制 Linux 系统

重启电脑看看,可以发现有 3.18.41 内核的启动选项

Linux 基础教程之内核编译以及自制 Linux 系统

此时可以正常登陆进来,表示安装新的内核成功。

Linux 基础教程之内核编译以及自制 Linux 系统

 

自制 Linux 示例

此处只是利用现有的 Linux 系统文件来创建一个简单的 Linux 系统,还缺乏许多功能

首先准备一个空的磁盘,这里实验使用一个虚拟机的磁盘

Linux 基础教程之内核编译以及自制 Linux 系统

Linux 基础教程之内核编译以及自制 Linux 系统

分区并创建文件系统

fdisk/dev/sdb

分两个必要的分区

/dev/sdb1 对应 /boot /dev/sdb2 对应根 /

mkfs.ext4 /dev/sdb1 mkfs.ext4 /dev/sdb2

Linux 基础教程之内核编译以及自制 Linux 系统

Linux 基础教程之内核编译以及自制 Linux 系统

挂载 boot

mount /dev/sdb1 /mnt/boot

Linux 基础教程之内核编译以及自制 Linux 系统

安装 grub

grub-install /dev/sdb –root-directory=/mnt

Linux 基础教程之内核编译以及自制 Linux 系统

安装完 grub 以后可以查看一下 sdb 的 mbr 信息是否正常

Linux 基础教程之内核编译以及自制 Linux 系统

恢复内核和 initramfs 文件

cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/

cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/bootLinux 基础教程之内核编译以及自制 Linux 系统

建立 grub.conf:

vim /mnt/boot/grub/grub.conf

title Hello_Linux

root (hd0,0)

kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 seLinux=0 init=/bin/bash

initrd /initramfs-2.6.32-642.el6.x86_64.img

Linux 基础教程之内核编译以及自制 Linux 系统

 

 

创建一级目录

mkdir/mnt/sysroot

mount /dev/sdb2 /mnt/sysroot

mkdir -pv /mnt/sysroot/

{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}

Linux 基础教程之内核编译以及自制 Linux 系统

创建 /etc/fstab 挂载文件

Linux 基础教程之内核编译以及自制 Linux 系统

复制 bash 和相关库文件,这个是必须的

复制相关命令及相关库文件,如:ls,cat,vim,reboot,hostname,mount,umount,tree 等, 非必须,但是最好还是安装上,这些小命令部分能在小 Linux 上面跑,有些不能,因为系统文件并不是很全

注意:此处的 copycmd.sh 是自己编写的脚本,内容就是复制 bash 和 ls 之类这些相关的文件到 /sysroot 下面,当然,此处也可以自行一个一个复制,只是比较麻烦

Linux 基础教程之内核编译以及自制 Linux 系统

复制完可以看见 bin 和 lib64 等等目录下面多了许多相关文件

Linux 基础教程之内核编译以及自制 Linux 系统

Linux 基础教程之内核编译以及自制 Linux 系统

复制完相关的文件,我们可以用 chroot 命令来切根试试能不能正常进入,如果可以的话,应该问题就不大,完成此步骤以后就可以关机了

Linux 基础教程之内核编译以及自制 Linux 系统

现在我们新建一个虚拟机测试一下刚那块虚拟磁盘里面的系统看是否能正常运行

 

Linux 基础教程之内核编译以及自制 Linux 系统

虚拟机里面需要使用一块现有的虚拟硬盘,其他的配置就跟平时创建虚拟机一样即可

 

Linux 基础教程之内核编译以及自制 Linux 系统

Linux 基础教程之内核编译以及自制 Linux 系统

配置完虚拟机以后,开机!

此时可以看见登陆的界面了!

Linux 基础教程之内核编译以及自制 Linux 系统

正常进入到系统了!界面有点像救援模式,(当然此处可以把自制的小 Linux 系统安装到 u 盘里面当成系统盘运行,就像 windows 老毛桃 pe 之类的)

在里面测试了一下之前复制的命令,有些可以,有些不可以,此处实验完毕。

Linux 基础教程之内核编译以及自制 Linux 系统

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-12-03发表,共计5812字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中