谈一谈关于Linux内核编译详解原理

news2024/11/24 2:28:27
前言:为什么要做这个启动盘,因为内核编译是很危险的,中间出了错系统则直接崩溃,然后就无法开机了,你将看到一个_在你的左上角闪烁。知道启动盘可以帮你从外置设备启动系统,能启动系统才能恢复系统。

1.编译前准备

一个可用的大于8G的USB启动盘,格式化为ext3、ext4或VFAT格式。

下载一个镜像文件,下文假设为ubuntu-16.04-64.iso。

一台可以使用的且装有Linux系统的主机(最好装有Centos或Ubuntu),并且具有root权限。

2.安装引导程序

我的u盘只有一个分区,且为/dev/sdb1(以自己的为准。通过lsblk -l 查看)。

syslinux /dev/sdb1

3.创建临时挂载点

为ubuntu-16.04-64.iso和USB存储设备创建挂载点:

mkdir /mnt/isoboot/ /mnt/diskboot

4.挂载ubuntu-16.04-64.iso

-o loop 选项用于创建一个伪设备,让他像设备块一样工作,此时这个目录可以看成一个块设备,如果不理解就可以看成插了一个U盘,里面有你烧录的系统。

mount -o loop ubuntu-16.04-64.iso /mnt/isoboot 

5.挂载USB存储设备

mount /dev/sdb1 /mnt/diskboot 

6.把镜像中isolinux文件复制到U盘

cp -r /mnt/isoboot/isolinux/* /mnt/diskboot 

7.将镜像里的isolinux.cfg复制到u盘

grep -v local的意思是排除保护local的字段:

grep -v local /mnt/isoboot/isolinux/isolinux.cfg >  /mnt/diskboot/syslinux.cfg 

8.卸载镜像和u盘挂载点

完成以上步骤后执行:

umount /mnt/isoboot /mnt/diskboot 

9.重启系统,插上USB启动盘,用USB启动盘启动系统

如果没有从U盘启动,可能需要进入bios界面调整启动顺序,把U盘调整为第一顺序,尝试在开机后迅速按F2、F10、F12(主机型号不同则不同)。

下载、配置并构建内核

配置内核前检查自己的U盘是否在有足够多的空间,最好留存4G以上的空间。

1.下载内核

官网下有http和git两种下载方式,国内用户使用http下载较快,git更加官方,而且里面注明了内核的作者是谁,你可以下载到托瓦茨的内核。

HTTP  https://www.kernel.org/pub/GIT   https://git.kernel.org/    https://kernel.ubuntu.com/ 

使用http下载的读者点进去后进入linux目录,再进入kernel目录,再选择版本。

以4.0x为例:https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/

下载方式,wget:

wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.0.5.tar.gz 

下面有.gzip格式的和.bzip2格式的tar包,.gzip格式的使用命令(xyz代表版本号):

tar xvjf linux-x.y.z.tar.bz2 

.zip格式:

tar xvzf linux-x.y.z.tar.gz 

2.安装软件依赖

在编译之前,需要在你的操作机上安装一些软件。

build-essential用于在x86_64或arm64系统上编译内核,如果你是armhr(32位的arm架构),可能下面的内容不适合你。

  • 安装最新版本的gcc。
  • 安装ncurses开发包。
  • 还有其他用于交叉编译的软件。
  • 安装ncurse-dev,运行make menuconfig时需要用到。
apt-get update && apt-get upgrade
apt-get install build-essential
apt-get install build-essential gcc
apt-get install libncurses5-dev
apt-get install binutils-multiarch
apt-get install alien
apt-get install ncurses-dev

3.解压刚才下载的内核包并进入到目录下

4.在该目录下执行命令:make menuconfig

以下选项根据需求勾选,新手不要随意乱动配置项,安装默认配置就可以了,保存后退出。

5.编译内核

输入命令 -j 5代表开5个进程同时编译,速度比直接运行make要快很多。但是前提是你的CPU是多核多进程的,我的CPU4核,但是我写的5,意思是超频编译,实际上和4没什么区别,因为硬件条件摆在那。

编译需要至少半个小时,耐心等待。

make -j 5 

十.安装和启动内核

编译完后,可以安装内核了。首先确保你为当前系统的重要数据做了备份。此外,需要把/boot下的内容复制到一个格式为FAT32的外部存储媒介上。(如u盘,格式化的方法请百度)

1.安装驱动程序

在内核的目录下执行,这个命令会把所有模块复制到当前的/lib/modules下对应的内核版本的子目录中:

make modules_install 

2.安装内核

这条命令将执行/sbin/installkernel文件,新内核会被复制到/boot/vmlinuz-{version},version为当前内核的版本号。实际上是一个软连接,链接到真实内核,如果/boot/vmlinuz-{version}存在,将会被覆盖并链接到新内核。旧内核会被保存为/boot/vmlinuz.old。

make install 

3.接下来将内核复制到/boot目录

你下载什么版本的就以什么结尾 vmlinuz-{version}。

cp -v arch/x86/boot/bzImage /boot/vmlinuz-4.0.5 

4.初始化RAM盘

RAM-随机存取存储器(random access memory)。

  • 计算机和手机中一般叫做(运行)内存。
  • 高速存取,读写时间相等,且与地址无关,如计算机内存等。
  • 通常用来存放操作系统,各种正在运行的软件、输入和输出数据、中间结果及与外存交换信息等。
mkinitramfs -o /boot/initrd.img /lib/modules/4.0.5 

5.接下来复制System.map

该文件包含了一系列内核符号和对应地址:

cp System.map /boot/System.map-4.0.5 

6.创建符号链接

使System.map指向你新的内核map:

ln -sf /boot/System.map-4.0.5 /boot/System.map

7.重启

如果你以上的步骤没有错,就可以使用新的内核了,如果重启失败,就需要用第一步准备的u启来引导启动,并且还原之前的配置,如果你备份了/boot目录,直接覆盖就可以恢复。

重启成功输入命令查看系统内核版本:

uname -a 

十一.测试和调试内核

1.使用Netconsole配置调试用控制台

如果我们想捕捉内核崩溃事件,可一旦系统被重新启动,由于没有创建该事件的日志,那么要捕获它就变得相当困难。我们可以使用Netconsole来解决这个问题。Netconsole是一个内核模块,它通过UDP协议记录内核消息。当不能记录到本地磁盘时,它可帮助调试问题。

在配置Netconsole之前,我们需要知道UDP数据包将被发送到的系统的MAC地址。该系统被称为接收方,可以与本机处于相同子网或者不同的子网。这两种情况描述如下:

第一种情况:接收方与本机在同一子网

使用ping 和arp命令,假设我的接受方为192.168.2.29。

第二种情况:不在同一子网

netstart -rn查看默认网关,图中为192.168.1.1,然后arp -n 192.168.1.1即可。网关就是我们要的MAC地址。

2.更改启动时的内核选项

如果你正在使用Grub作为穷引导程序,它会默认启动内核的'quiet splash'选项,意思是闪屏,不显示启动过程。

先做备份,任何操作前做备份操作总没错:

cp /etc/default/grub /etc/defautl/grub.backup
vim /etc/default/grub 

找到GRUB_CMDLINE_LINUX_DEFAULT="quietsplash"这一行,将该行替换为GRUB_CMDLINE_LINUX_DEFAULT="debugignore_loglevel"

3.更新grub

update-grub 

4.初始化Netconsole

将Netconsole模块添加到/etc/modules中,使它能在启动时被加载:

sh -c 'echo netconsole' >> /etc/modules 

5.配置Netconosle模块选项

假设网卡为本地eth0,本地ip为192.168.1.11,网关为192.168.1.1(如果不在同一网段),接受方为192.168.2.29,刚才我们已经拿到了接受方的mac地址,<LOCAL_PORT>和<REMOTE_PORT>(本地和对方)的端口都是6666。

格式:netconsole=<LOCAL_PORT>@<SENDER_IP_ADDRESS>/<SENDER_INTERFACE>,<REMOTE_PORT>@<RECEIVER_IP_ADDRESS>/<SETP_1_MAC_ADDRESS>。

#接受方与发送方不在同一网段,发送者网关写本地IP
sh -c 'echo options netconsole netconsole=6666@192.168.1.1/eth0,6666@192.168.2.29/ba:54:fc:df:f2:f0 > /etc/modprobe.d/netconsole.conf'  
#接受方与发送方在同一网段,发送者IP写本地IP
sh -c 'echo options netconsole netconsole=6666@192.168.1.11/eth0,6666@192.168.1.29/ba:54:fc:df:f2:f0 > /etc/modprobe.d/netconsole.conf' 

6.设置接受方设置

假设接受方,也就是用于监控发送方的主机ip为192.168.2.29,执行以下命令:

netcat -l -u 192.168.2.29 6666 | tee ~/netconsole.log
#也可以不带ip
netcat -l -u 6666 | tee ~/netconsole.log
#由于系统版本不同,上面命令报错则将-u改为-p
netcat -l -p 6666 | tee ~/netconsole.log 

7.保持上面命令保持运行,重新开一个终端

输入命令,这样就可以监控内核的崩溃信息了。也可以查看~/netconsole.log。

dmesg | grep netcon 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 线程和反射---尚硅谷Java视频学习

1.Java程序在运行得时候默认就会产生一个进程2.这个进程会有一个主线程3.代码都在主线程中执行 线程的生命周期 线程的执行方式 public class Java02_Thread {public static void main(String[] args) throws Exception {// TODO 线程 - 执行方式&#xff08;串行&#xff0c…

ASP.NET Core 3.1系列(14)——分布式缓存Redis的使用

1、前言 前一篇博客介绍了ASP.NET Core中本地缓存MemoryCache的使用方法。相较于本地缓存&#xff0c;分布式缓存更加适合大多数项目应用场景&#xff0c;下面就来介绍一下如何在ASP.NET Core中对Redis缓存进行相关操作。 2、分布式缓存接口——IDistributedCache 对于分布式…

pytorch深度学习实战24

第二十四课 VGG网络 VGG是Oxford的Visual Geometry Group的组提出的&#xff08;大家应该能看出VGG名字的由来了&#xff09;。该网络是在ILSVRC 2014上的相关工作&#xff0c;主要工作是证明了增加网络的深度能够在一定程度上影响网络最终的性能。VGG有两种结构&#xff0c;分…

远程重启电脑

一、设置电脑允许自动启动 在远程计算机上编辑设置远程注册表 步骤1. 按“WindowsR”键调用运行对话框。输入“services.msc”并点击“确定”。 步骤2. 在“服务”窗口中&#xff0c;双击“RemoteRegistry”以检查其状态。 步骤3. 将启动类型更改为“自动”。 二、查找远程计…

SPARKSQL3.0-各阶段自定义扩展规则源码剖析

一、前言 这一节主要介绍如何自定义扩展各阶段规则 虽然spark内部提供了很多优化规则&#xff0c;但在实际工作中&#xff0c;经常因为业务需求需要自定义扩展优化器或解析器&#xff0c;故自己实现一个优化器才对sparksql有更深的理解 二、扩展范围 spark在扩展方便做的很…

vue.js毕业设计,基于vue.js前后端分离教室预约小程序系统设计与实现

功能介绍 【后台管理功能模块】 系统设置&#xff1a;设置关于我们、联系我们、加入我们、法律声明 广告管理&#xff1a;设置小程序首页轮播图广告和链接 留言列表&#xff1a;所有用户留言信息列表&#xff0c;支持删除 会员列表&#xff1a;查看所有注册会员信息&#xff0…

从零开始学前端:DOM、BOM、焦点事件 --- 今天你学习了吗?(JS:Day20)

从零开始学前端&#xff1a;程序猿小白也可以完全掌握&#xff01;—今天你学习了吗&#xff1f;&#xff08;JS&#xff09; 复习&#xff1a;从零开始学前端&#xff1a;CSSOM视图模式 — 今天你学习了吗&#xff1f;&#xff08;JS&#xff1a;Day19&#xff09; 文章目录从…

java8 (jdk 1.8) 新特性——Stream ApI

在java8 中&#xff0c;有两个最重要的改变&#xff0c;一个就是之前了解的Lmbda java8 (jdk 1.8) 新特性——Lambda ,还有一个就是Stream Api 1. 什么是Stream API 简单来说就是一个类库&#xff0c;里边有一些方法方便我们对集合数据进行操作&#xff0c;就好像使用 SQL 语…

Windows cmd 命令及Linux 环境下导入导入mysql 数据库

文章目录一、背景二、Windows cmd 导入导出mysql 数据库1.导出数据库三种方式&#xff08;导出数据库时不需要连接数据库&#xff09;2. 操作步骤2.导入数据库三、linux 环境下导入导出数据库一、背景 最近在本机上安装了一个WMware 虚拟机&#xff0c;需要从本机&#xff08;…

从三层架构说起,谈谈对历史项目的小改造

项目背景说明 最近接手一个 “老” 项目的需求修改&#xff0c;项目整体基于 .net core 3.1 平台&#xff0c;以传统的三层架构为基础构建。了解需求后&#xff0c;逐步对原有项目框架进行大概的了解&#xff0c;主要是熟悉一些框架的开发规范&#xff0c;基本工具类库的使用&…

寒亭5.8万亩盐碱稻 国稻种芯·中国水稻节:山东潍坊插秧期

寒亭5.8万亩盐碱稻 国稻种芯中国水稻节&#xff1a;山东潍坊插秧期 新京报讯&#xff08;记者赵利新&#xff09;新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农业大健康大会报道&#xff…

MMRotate 全面升级,新增 BoxType 设计

引言&#xff1a;大大降低水平框检测器改旋转框检测器的难度 MMRotate 是一个基于 PyTorch 和 MMDetection 的开源旋转框目标检测工具箱。它将目标检测从水平框扩展到旋转框&#xff0c;为场景文字、遥感影像、自动驾驶等领域的应用打下了基础&#xff0c;为学术界和产业界提供…

瞄准镜-第12届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第82讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

数据结构——单链表

一.简介 上一篇文章&#xff0c;我们介绍了线性表中的顺序表。 而顺序表拥有一些缺陷 1.空间不够时需要增容&#xff0c;增容需要付出代价 2.为避免重复扩容&#xff0c;我们进行指数扩容&#xff0c;可能会造成空间浪费 3.顺序表从开始位置连续存储&#xff0c;插入删除数…

卡特尔世界杯来了,只喝精酿啤酒不玩望京扑克,其实也是一种缺失

北京时间2022年11月20日&#xff0c;卡特尔世界杯正式拉开了序幕&#xff0c;全球都进入了世界杯时间。世界杯的开幕&#xff0c;最高兴的还是球迷朋友&#xff0c;大家可以欢聚一堂&#xff0c;喝着精酿啤酒看着足球&#xff0c;那滋味别提多舒服了。 世界杯对于广大球迷来说&…

表的增删查改

目录 插入数据 基本查询 更新数据 清空数据 聚合函数 group by子句 内置函数 基本查询练习 多表查询 子查询 合并查询 表的内外连接 插入数据 单行—全列插入 如下图&#xff0c;全列插入可以省略要在哪些列插入&#xff01; 多行—指定列插入 如下图&#xff0…

安装 Red Hat Enterprise Linux 9.1 虚拟机

目录1. 官方下载链接与新闻2. 安装提示3. 系统安装步骤&#xff08;1&#xff09;进入系统引导界面&#xff08;2&#xff09;进入【系统语言选择】界面&#xff08;3&#xff09;进入【安装信息摘要】界面① 设置【root密码】② 设置【安装目的地】&#xff08;4&#xff09;进…

【python】使用python将多个视频合并、延长视频的时间

今天做知识分享的时候&#xff0c;最后保存的视频时长是58分钟&#xff0c;那么如何改变视频的时长&#xff0c;将视频时长改为一个小时呢&#xff1f; 下面提供3个方案&#xff1a; 方案1&#xff0c;重新录&#xff0c;很显然&#xff0c;不合理&#xff1b; 方案2&#xf…

蓝屏page_fault_in_nonpaged_area的解决办法

用户在操作电脑的过程中&#xff0c;难免会遇到蓝屏问题&#xff0c;最近就有用户遇到电脑蓝屏重启无限循环&#xff0c;提示代码page_fault_in_nonpaged_area&#xff0c;这要如何解决呢&#xff1f;下面就来看看详细的解决办法。 page_fault_in_nonpaged_area蓝屏代码解决方法…

【MySQL篇】第一篇——数据库基础

目录 什么是数据库 主流数据库 基本使用 MySQL安装 连接服务器 服务器管理 服务器&#xff0c;数据库&#xff0c;表关系 使用案例 创建数据库 使用数据库 创建数据库表 表中插入数据 查询表中的数据 数据逻辑存储 MySQL架构原理 MySQL整体逻辑架构 MySQL逻辑…