Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何定制Linux内核?

如何定制Linux内核?

原创
作者头像
我是乖宝宝哦
修改于 2022-10-06 12:18:01
修改于 2022-10-06 12:18:01
2.3K00
代码可运行
举报
文章被收录于专栏:前端之心前端之心
运行总次数:0
代码可运行

上篇文章我们讲述了如何定制Linux外围文件系统,本文我们来讲讲如何定制Linux内核。

思路

  1. 对照windows硬件设备管理器检视设备配置:CPU、硬盘控制器、网络控制器、USB控制器(HID、Mass storage);
  2. 先将裁完的内核搭配原文件系统观察系统能否启动,能启动后再换成自制文件系统;
  3. 不一次性裁完,一个模块一个模块裁,每裁完一个模块编译一次观察系统是否能够启动;
  4. 先裁确定的部分,不确定的模块先不裁,将确定的都裁完后,再单独将不确定的选项添加进去进行编译,观察系统能否启动。

Step1

下载最新的稳定版Linux kernel src。

Step2

解压之后输入下列命令进行配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
make menuconfig

部分模块选择:

64位的系统
64位的系统
任何人均可访问swap
任何人均可访问swap
程序通信
程序通信
selinux加载时所需要的设置
selinux加载时所需要的设置
将.config内核配置文件放入内核中
将.config内核配置文件放入内核中
支持开机加载RAM disk
支持开机加载RAM disk
支持动态模块加载
支持动态模块加载
电源全关
电源全关
socket要选
socket要选
TCP
TCP
DHCP支持
DHCP支持
因为windows网卡是qualcomm的(如下图),所以要以上两个驱动
因为windows网卡是qualcomm的(如下图),所以要以上两个驱动
可以看到我的windows网卡是qualcomm的
可以看到我的windows网卡是qualcomm的
选中之后才会加载usb-storage.ko模块
选中之后才会加载usb-storage.ko模块
存储媒介的驱动
存储媒介的驱动
fat、vfat文件支持
fat、vfat文件支持
ntfs文件支持
ntfs文件支持
设置语言,如果设置错误,U盘读不出
设置语言,如果设置错误,U盘读不出
以上三项是语言模块,如果不选上,则语言设置成简体中文和utf8也没用,因为根本没有这个模块
以上三项是语言模块,如果不选上,则语言设置成简体中文和utf8也没用,因为根本没有这个模块
内核调试,包括将调试信息打印到显示屏上
内核调试,包括将调试信息打印到显示屏上
加密机制
加密机制
加密机制
加密机制

Step3

配置好之后会生成.config文件,然后输入命令(用4个处理器同时编译):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
make –j4

进行编译,等待编译完成后,输入命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
make modules_install

/lib/modules/目录下生成内核版本的模块驱动,拷贝到bootmini/lib/modules/对应目录下。然后输入命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
make install

生成编译完成的内核,拷贝到/boot目录下,并修改/boot/grub/grub.conf中小系统对应的内核,即可利用新编译的内核启动。

真机效果

1. 网络功能(ifconfig 和 ping)

ifconfig
ifconfig
ping
ping

2. 系统支持通过ssh方式访问其他机器

总结

  1. 裁剪内核的过程中首先应该把完全能够确定要或不要的模块删掉或加进内核,再慢慢将不确定的模块少量甚至单独加进去,编译安装观察是否能够重启,否则一次性全部裁完发现kernel panic了完全不知道哪里错了。
  2. 万一kernel panic了,解决方案是重开一个虚拟机,将原系统的硬盘挂载到新开的虚拟机里,就可以看到原系统的文件系统了。
原系统的根目录
原系统的根目录

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
双机调试Linux内核
这种方式调试内核需要两台机器,一台用来运行Linux内核,另一台对内核进行调试。一般有以下三种常用的方案,可以根据电脑的性能或资金状况来选择。可以开两个Linux系统的虚拟机;也可以在物理机系统是linux上面装虚拟机,然后虚拟机运行一个linux;再就是买开发板来调试内核。以下是在windows上开两个虚拟机的流程描述。
yifei_
2022/11/14
5.1K0
双机调试Linux内核
linux内核编译过程的最终总结版
本次实验环境是Linux2.6.35内核的环境下,下载并重新编译内核源代码(2.6.36);然后,配置GNU的启动引导工具grub,成功运行编译成功的内核。
全栈程序员站长
2022/09/15
1.8K0
【Linux】Linux内核编译与入门
Linux内核是一种开源操作系统内核,它是基于Unix系列操作系统的设计思想和原则。与其他操作系统内核相比,Linux内核具有很多特点,例如高度可定制、模块化设计、强大的网络支持、多处理器支持、安全性、稳定性等。
DevFrank
2024/07/24
8220
【Linux】Linux内核编译与入门
linux内核升级图文攻略 转
一、Linux内核概览 Linux是一个一体化内核(monolithic kernel)系统。 设备驱动程序可以完全访问硬件。 Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载。 1. linux内核 linux操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。 一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。 计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。 但是没有软件来操作和控制它,自身是不能工作的。 完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。 Linux内核的主要模块(或组件)分以下几个部分: . 进程管理(process management)  . 定时器(timer) . 中断管理(interrupt management) . 内存管理(memory management) . 模块管理(module management) . 虚拟文件系统接口(VFS layer) . 文件系统(file system) . 设备驱动程序(device driver) . 进程间通信(inter-process communication) . 网络管理(network management . 系统启动(system init)等操作系统功能的实现。 2. linux内核版本号 Linux内核使用三种不同的版本编号方式。 . 第一种方式用于1.0版本之前(包括1.0)。   第一个版本是0.01,紧接着是0.02、0.03、0.10、0.11、0.12、0.95、0.96、0.97、0.98、0.99和之后的1.0。 . 第二种方式用于1.0之后到2.6,数字由三部分“A.B.C”,A代表主版本号,B代表次主版本号,C代表较小的末版本号。   只有在内核发生很大变化时(历史上只发生过两次,1994年的1.0,1996年的2.0),A才变化。   可以通过数字B来判断Linux是否稳定,偶数的B代表稳定版,奇数的B代表开发版。C代表一些bug修复,安全更新,新特性和驱动的次数。   以版本2.4.0为例,2代表主版本号,4代表次版本号,0代表改动较小的末版本号。   在版本号中,序号的第二位为偶数的版本表明这是一个可以使用的稳定版本,如2.2.5;   而序号的第二位为奇数的版本一般有一些新的东西加入,是个不一定很稳定的测试版本,如2.3.1。   这样稳定版本来源于上一个测试版升级版本号,而一个稳定版本发展到完全成熟后就不再发展。 . 第三种方式从2004年2.6.0版本开始,使用一种“time-based”的方式。   3.0版本之前,是一种“A.B.C.D”的格式。   七年里,前两个数字A.B即“2.6”保持不变,C随着新版本的发布而增加,D代表一些bug修复,安全更新,添加新特性和驱动的次数。   3.0版本之后是“A.B.C”格式,B随着新版本的发布而增加,C代表一些bug修复,安全更新,新特性和驱动的次数。   第三种方式中不使用偶数代表稳定版,奇数代表开发版这样的命名方式。   举个例子:3.7.0代表的不是开发版,而是稳定版! linux内核升级时间图谱如下:
henrylee2cn
2019/04/04
3.4K0
linux内核升级图文攻略 
                                                                            转
如何编译安装Linux内核
Compiler: gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
用户8705048
2021/06/08
7.7K0
linux内核移植步骤「建议收藏」
经过一个多星期的内核折磨,今天终于可以写下自己移植内核的一些心得,网上有很多博客论坛都有谈到,但是这些又说的方式有些模糊,这里我综合的几个博客在重新说下内核替换编译的步骤、以及如何更新启动项grub。替换linux的内核一共有两种方式,第一种方式是下载官方kernel提供的源码包,进行编译替换;第二种直接下载内核安装包deb,进行升级替换。
全栈程序员站长
2022/09/15
4.8K0
如何编译 Linux 内核
曾经有一段时间,升级 Linux 内核让很多用户打心里有所畏惧。在那个时候,升级内核包含了很多步骤,也需要很多时间。现在,内核的安装可以轻易地通过像 apt 这样的包管理器来处理。通过添加特定的仓库,你能很轻易地安装实验版本的或者指定版本的内核(比如针对音频产品的实时内核)。
用户8639654
2021/10/15
7.7K0
升级linux内核到3.0.0
wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.0.tar.bz2
三杯水Plus
2018/11/14
2.6K0
内核 panic:启动时出现内核 panic 错误
首先,确保你记录了所有的错误信息,特别是内核 panic 的具体错误信息。这些信息通常会显示在屏幕上,例如:
是山河呀
2025/02/04
1.1K0
Linux添加与删除内核
笔者安装新内核就是处于***特殊需求***。笔者所做的工作是需要用到Linux自带的分析工具——***ftrace1***该工具中的一些专门性的工具(姑且叫插件吧)在发行版本中并没有编译到内核中去,所以笔者需要重新编译内核将这些插件勾选上,并安装到自己的系统中。整个过程虽说只有简单几步而已,但是笔者还是走了不少弯路。比如,笔者最开始是不想在自己的机器上直接安装新内核的,毕竟有些环境是笔者肥了九牛二虎之力才部署好的,在加上对添加新内核也是大姑娘出嫁——头一回,万一搞不好就废了。所以开始是在virtualbox上搞的,可是在对内核进行配置时执行 make menuconfig总是提示***curses.h***找不到,在网上扒了半天安装了和***curses.h***相关的所以库都安装也不行,也是够了。 后来,只好在物理机上搞了,结果还是出现了一下奇葩问题,比如删除内核方法中的第二个就是笔者惨痛的经历。当时笔者是安装内核好进入系统所用外设都不可以用,只好进入原来的系统中删除新安装的内核,结果就是方法二中的情况了。后来回想起来应该是没有执行make modules_install导致驱动啥的都没装。
aneutron
2022/08/10
3.6K0
Linux添加与删除内核
使用GDB调试Linux内核
GDB(GNU Debugger)是Linux上的调试程序,可用于C/C++、Go、Rust等多种语言。GDB可以让你在被调试程序执行时看到它的”内部“情况,观察程序在特定断点上的状态,并逐行运行代码。
mazhen
2023/11/24
2.1K0
使用GDB调试Linux内核
优化Linux bootloader速度的究极之路:从GRUB到EFI Stub
Linux著名的GRUB已立n代,2.0以后已经是最受欢迎的bootloader,很多Linux发行版都用它作为缺省的bootloader。GRUB2功能强大,全面支持UEFI启动,甚至是安全启动,实在是行走江湖、杀人越货的必备武器。但于此同时,强大的功能让它越发臃肿,为Linux快速启动带来了负面影响。
战神伽罗
2020/08/11
3.7K0
优化Linux bootloader速度的究极之路:从GRUB到EFI Stub
CentOS7 升级最新内核
yum 方式升级到最新版 导入 elrepo 仓库 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm 列出可用的内核相关包 # kernel-lt:长期支持版本,用于修复旧版内核的 BUG,这些内核只会修复重大 BUG,并且不会频繁发布版本。 # kernel-ml:最新稳定版本 yum --d
陳斯托洛夫斯記
2022/10/27
2.5K0
CentOS7 升级最新内核
Initramfs_正在生成initramfs
一、initramfs是什么 在2.6版本的linux内核中,都包含一个压缩过的cpio格式的打包文件。当内核启动时,会从这个打包文件中导出文件到内核的rootfs文件系统,然后内核检查rootfs中是否包含有init文件,如果有则执行它,作为PID为1的第一个进程。这个init进程负责启动系统后续的工作,包括定位、挂载“真正的”根文件系统设备(如果有的话)。如果内核没有在rootfs中找到init文件,则内核会按以前版本的方式定位、挂载根分区,然后执行 /sbin/init程序完成系统的后续初始化工作。 这个压缩过的cpio格式的打包文件就是initramfs。编译2.6版本的linux内核时,编译系统总会创建initramfs,然后把它与编译好的内核连接在一起。内核源代码树中的usr目录就是专门用于构建内核中的initramfs的,其中的initramfs_data.cpio.gz文件就是initramfs。缺省情况下,initramfs是空的,X86架构下的文件大小是134个字节。
全栈程序员站长
2022/09/22
3.5K0
怎么编译Linux内核?
Linux内核(英语:Linux kernel)是一种开源的类Unix操作系统宏内核。整个Linux操作系统家族基于 该内核部署在传统计算机平台(如个人计算机和服务器,以Linux发行版的形式)和各种嵌入式平台,如路由器、无线接入点、专用小交换机、机顶盒、FTA接收器、智能电视、数字视频录像机、网络附加存储(NAS)等。工作于平板电脑、智能手机及智能手表的Android操作系统,它的底层操作系统也是Linux。尽管在桌面计算机的占用率较低,但基于Linux的操作系统统治了几乎从移动设备到主机的其他全部领域。实际Linux的发行版Ubuntu,其易用性也逐渐接近Windows。
韦东山
2022/05/05
10.7K0
怎么编译Linux内核?
实验:CentOS 7 编译安装最新版内核 Linux Kernel 6.5.2
注意:一定要执行 cd linux-6.5.2 命令,因为接下的操作默认都是这该目录下操作的。
ling218cn
2023/09/10
3.9K0
Linux内核开发_1_编译LInux内核
System Type arm 占用配置,一般是厂家提供,与第7项代替了原有的Processor type and features
全栈程序员站长
2022/09/15
21.1K0
CentOS6.9手动编译并更新Kernel内核版本
Kernel是Linux操作系统的核心部分。它由操作系统中用于管理存储器、文件、外设和系统资源的那些部分组成。Kernel是操作系统的核心,掌控着所有硬件设备的控制权。
yuanfan2012
2019/06/02
3.1K0
将hello程序作为驱动程序编译进系统内核
恩,可能是我比较愚钝,一个内核编译搞了一天,各种问题,各种bug,几度无奈,也是因为我突发奇想,并没有按照原来的那种操作,我直接把helloworld程序放到内核模块中编译成了一个驱动程序,虽然其中遇到了不知道多少的问题,不过最终是个完美的结局,给自己点个赞! 好了,废话不多说,直接开始还原我的helloworld驱动内核程序编译流程。
roobtyan
2019/02/21
1.6K0
将hello程序作为驱动程序编译进系统内核
如何在Ubuntu 22.04上安装Linux 内核 6.0?
内核是任何基于 Linux 的操作系统的核心部分,它充当计算机系统软件和硬件之间的桥梁,还提供用户和应用程序与计算机交互所需的接口。内核提供了许多功能,包括进程调度、资源分配、设备管理、中断处理、内存管理和进程。
网络技术联盟站
2022/11/16
4.6K3
如何在Ubuntu 22.04上安装Linux 内核 6.0?
相关推荐
双机调试Linux内核
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档