Linux 内核学习1. 编译并启动一个最小化系统

Linux 内核学习1. 编译并启动一个最小化系统

  • 一、Linux内核简介
    • 1. Linux 内核介绍
    • 2. Linux内核主要的作用
  • 二、编译内核主要的步骤
  • 三、编译过程
    • 1. 准备环境
    • 2. 安装编译工具和依赖项
    • 3. 下载源码
    • 4. 配置内核
      • 配置功能选项
        • 命令行配置
        • 图形化配置
        • 默认配置
    • 5. 编译内核
    • 6. 构建轻量化工具集
      • 6.1 下载 BusyBox
      • 6.2 编译并安装
    • 7. 制作根文件
      • 7.1 制作根文件系统说明
      • 7.2 拷贝根文件系统需要的文件
      • 7.3 在 rootfs 下创建 init 文件
      • 7.4 设置可执行权限
      • 7.5 打包文件系统
    • 8. 创建 bios 引导
      • 8.1 下载、解压缩
      • 8.2 准备文件
      • 8.3 创建启动引导文件 isolinux.cfg
        • `xorriso` 工具用来创建 ISO 镜像的命令,下面是各个参数的解释:
  • 四、创建虚拟机
    • 1. 使用VMWare创建虚拟机
    • 2. 启动虚拟机

在这里插入图片描述

一、Linux内核简介

1. Linux 内核介绍

Linux内核是操作系统的核心组件,负责管理硬件资源、提供系统调用接口以及协调用户空间和硬件之间的交互。
内核位于操作系统的最底层,直接与硬件交互,为上层提供服务。
Linux内核是开放源代码的,符合 GPL (General Public Licese)开源协议 。

内核网址:https://kernel.org/
在这里插入图片描述

截止本文写作时,当前内核主线最新版本是6.8-rc1。

2. Linux内核主要的作用

  • 硬件管理
  • 进程管理
  • 内存管理
  • 文件系统
  • 网络支持
  • 系统调用接口
  • 中断和异常处理
  • 安全性和权限控制
  • 虚拟化、容器支持

二、编译内核主要的步骤

Linux内核编译主要是以下步骤:

  1. 准备编译环境
  2. 获取内核源代码
  3. 配置内核
  4. 编译内核

本文要实现一个最小化的Linux系统,除了上面编译步骤,还需要做:

  1. 构建用户空间工具集
  2. 制作根文件系统
  3. 配置引导加载程序

三、编译过程

1. 准备环境

  • ubuntu 22.04

2. 安装编译工具和依赖项

apt install -y make make-guile gcc flex bison  libelf-dev openssl libncurses-dev libssl-dev

3. 下载源码

sudo apt install git -y

# 下载源代码
git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git
# 克隆好后切换到最新的stable分支
git checkout v5.19

4. 配置内核

配置功能选项

在配置界面可以设置各种内核选项,如:

  • 处理器类型
  • 设备驱动
  • 文件系统
  • 系统调用
  • 内存管理
  • 网络支持
  • 核心功能

Linux 内核有几种配置方式:

命令行配置

make menuconfig

图形化配置
# 需要安装 pkg-config 包管理工具
sudo apt install pkg-config -y

在这里插入图片描述

默认配置

make defconfig
本文直接使用默认配置。

还有其它几个命令行参数:

  • make allyesconfig : 创建能选yes就选yes的配置;
  • make allnoconfig :创建能选no就选no的配置

这里使用下面命令配置:

# 配置内核
make menuconfig

5. 编译内核

# 编译生成内核的二进制文件
make
# 明确指定了编译目标为 bzImage
make bzImage

bzImage 是 Linux 内核的一种格式,它是压缩过的内核镜像,包含了启动时所需的所有代码和数据。

编译后结果在arch下的对应内核架构文件夹下:
在这里插入图片描述

6. 构建轻量化工具集

这里选择BusyBox , 它将多个标准的Unix工具合并到一个可执行文件中,提供了一个精简而功能全的用户空间环境 。
BusyBox 包含了一系列标准的Unix工具,如: lscpmvmkdircat等;
BusyBox体积非常小,方便构建最小化的Linux系统,也适用于嵌入式系统。

6.1 下载 BusyBox

wget https://busybox.net/downloads/busybox-1.32.1.tar.bz2
tar -jxvf busybox-1.32.1.tar.bz2
cd busybox-1.32.1
# 置默认编译选项
make defconfig
vim .config

配置时修改.configCONFIG_STATIC 内核配置选项,这个选项是用于指示是否构建静态链接的内核二进制。设置为y,用来构建静态内核二进制,它会包含内核中的所有代码和驱动。

在这里插入图片描述

6.2 编译并安装

make busybox install

在这里插入图片描述

  • bin目录 : 存放系统的基本命令工具
  • sbin:存放系统管理员或系统维护者使用的一些特殊命令工具
  • usr:存放用户级别的应用程序和数据,在BusyBox里通常包含一些额外的工具和应用
  • linuxrc:是一个初始化脚本 ,用于系统的初始化和配置任务,如挂载文件系统、加载模块;

为了更灵活定制系统,后面会先删除 linuxrc。

7. 制作根文件

7.1 制作根文件系统说明

制作根文件系统是指创建一个包含操作系统核心文件、命令工具、配置文件和其它必要文件的目录结构,该目录结构将成为制作的Linux系统的根目录。 在Linux系统中,根文件系统是系统启动时的最顶层目录 , 表示为 /

要做的根文件系统包含了系统启动和运行所需的所有文件和目录。 制作过程一般是:

  1. 选择文件系统类型
  2. 创建目录结构
  3. 添加文件系统
  4. 配置系统文件
  5. 设备节点
  6. 设置权限和所有权
  7. 配置启动脚本
  8. 压缩文件系统

7.2 拷贝根文件系统需要的文件

cd _install
rm linuxrc

cd ..
cd ..
# 根文件系统文件夹命名为rootfs
mkdir rootfs
cd rootfs
cp -r ../busybox-1.32.1/_install/bin/ .
cp -r ../busybox-1.32.1/_install/sbin/ .
cp -r ../busybox-1.32.1/_install/usr/ .
mkdir dev proc sys

7.3 在 rootfs 下创建 init 文件

init 启动脚本负责在系统启动时执行一系列的初始化任务,包括设置内核消息级别、挂载/dev/proc/sys文件系统,最后启动一个Shell。 这样系统在启动后就进入了一个基本的可操作环境 。

vim init
内容 :

#!/bin/sh
# 将内核日志消息级别设置为1,减少控制台上的内核消息输出
dmesg -n 1
# 将devtmpfs 文件系统挂载到/dev目录 。 devtmpfs是一个用于创建设备节点的临时文件系统,这样可以在 /dev 中创建和管理设备节点。
mount -t devtmpfs none /dev
# 将 proc 挂载到/proc目录 ,proc文件系统提供了对内核和进程信息的访问,通常在挂载后用于与内核交互
mount -t proc none /proc
# 将 sysfs 文件系统挂载到/sys目录,sysfs提供了对系统设备和内核参数的信息的访问
mount -t sysfs none /sys
# 创建一个新的会话,并将进程入进去。 cttyhack 确保进程成为控制终端的会话领导者;/bin/sh 启动一个新的 Shell。
setsid cttyhack /bin/sh

7.4 设置可执行权限

cd ..
chmod 777 -R rootfs/

7.5 打包文件系统

cd rootfs
find . | cpio -R root:root -H newc -o | gzip > ../rootfs.gz

在这里插入图片描述

8. 创建 bios 引导

BIOS通常是为了在计算机启动时用来加载操作系统。常见的 BIOS 引导加载程序包括 GRUB(GRand Unified Bootloader)、LILO(LInux LOader)等。本文的Syslinux也是一个用于 BIOS 引导的引导加载程序。它是一个轻量级的、开源的引导加载程序,通常用于引导 Linux 系统,特别是在嵌入式系统和 LiveCD 环境中广泛使用。

使用 Syslinux 进行 BIOS 引导的一般步骤包括:

  • 将 Syslinux 安装到引导扇区(MBR)或分区引导扇区。
  • 创建并编辑 Syslinux 的配置文件(syslinux.cfg)以定义引导选项。
  • 在硬盘上安装操作系统的引导加载程序,例如 Linux 内核。
  • 设置计算机的 BIOS 启动顺序,确保从硬盘引导。

具体操作:

8.1 下载、解压缩

wget https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.tar.gz
gunzip syslinux-6.03.tar.gz
tar -xvf syslinux-6.03.tar

8.2 准备文件

新建文件夹,把需要的文件都拷到文件夹里。

mkdir isobios
cd isobios
cp ../rootfs.gz .
cp ../linux/arch/x86/boot/bzImage kernel.gz
cp ../syslinux-6.03/bios/core/isolinux.bin .
cp ../syslinux-6.03/bios/com32/elflink/ldlinux/ldlinux.c32 .  

8.3 创建启动引导文件 isolinux.cfg

vim isolinux.cfg

添加内容:

default kernel.gz initrd=rootfs.gz

然后运行命令生成ios镜像:

sudo apt install -y xorriso -y
xorriso -as mkisofs -o ../mybios.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table ./

xorriso 工具用来创建 ISO 镜像的命令,下面是各个参数的解释:
  1. -as

    • 启用 xorriso 的 “Auto scan” 模式,该模式用于扫描可用的设备和媒体。
  2. mkisofs

    • 指定使用 mkisofs 模块,mkisofs 用于创建 ISO 9660 文件系统的镜像。
  3. -o ../mybios.iso

    • 指定输出文件的路径和名称,这里将 ISO 镜像保存为 mybios.iso 并放置在上层目录 (../)。
  4. -b isolinux.bin

    • 指定引导镜像文件的路径和名称,这里设置了引导镜像为 isolinux.bin
  5. -c boot.cat

    • 指定引导信息文件的路径和名称,这里设置了引导信息文件为 boot.cat
  6. -no-emul-boot

    • 禁用 emulated boot(模拟引导)。该选项告诉 ISO 文件系统,引导镜像应该直接从磁盘引导,而不是通过模拟软盘引导。
  7. -boot-load-size 4

    • 设置引导加载器的加载大小,这里将引导加载器加载到内存的大小设置为 4 扇区。
  8. -boot-info-table

    • 在 ISO 9660 文件系统中创建引导信息表。该表提供引导加载器所需的信息。
  9. ./

    • 指定要包含在 ISO 镜像中的文件和目录的路径。这里 ./ 表示当前目录下的所有文件和子目录。

这个命令的目标是创建一个 ISO 9660 文件系统的镜像,该镜像包含了引导信息、引导加载器以及当前目录下的所有文件和子目录。这种 ISO 镜像通常用于制作可引导的光盘或 USB 镜像,以便在系统引导时加载其中的操作系统或工具。
在这里插入图片描述

生成的iso:
在这里插入图片描述

四、创建虚拟机

1. 使用VMWare创建虚拟机

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 启动虚拟机

在这里插入图片描述
启动后的系统可以输入ls pwd等命令。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有什么办法保护网站安全

随着互联网的快速发展,随着品牌效应的加大,企业网站已经成为了企业对外展示的明信片,以及宣传获取私有流量的重要渠道,网站的安全性也越来越受到用户的重视,保护网站安全是运维人员非常重要的任务。德迅云安全深耕网络…

Qt 5.9.4 转 Qt 6.6.1 遇到的问题总结(三)

1.QSet: toList 中的toList 函数已不存在,遇到xx->toList改成直接用,如下: 2.开源QWT 图形库中QwtDial中的 setPenWidth 变成 setPenWidthF函数。 3.QDateTime 中无setTime_t 改为了setSecsSinceEpoch函数。 4.QRegExp 类已不存在 可以用Q…

Node.js Express 框架 2024版 笔记

1.0 操作命令 Node.js express 框架 https://www.expressjs.com.cn/ npm install -g express-generator expressexpress --pug --git // --pug 添加对 pug 模板引擎的支持 // --git 添加 .gitignore 代码仓库排除 //无法直接安装新版pug模板 npm i npm …

SqueezeNet模型详解

简介 SqueezeNet是一种轻量级卷积神经网络架构,旨在保持较高性能的同时减少模型的参数数量和计算复杂度。由于其小尺寸和高效性能,SqueezeNet适用于在资源受限的环境中部署,如移动设备和嵌入式系统。 SqueezeNet是通过使用一种"Fire M…

AI的安全应答之道

作者:统信UOS技术团队 2023,随着各种大语言模型的爆发,整个AI生态正处于从决策式AI进化到生成式AI的进程中。各类AI模型和AI应用层出不穷,也随之带来了与AI相关的各类潜在风险。AI开发和使用过程中的风险防范和治理,成为了不可忽…

神经网络的一些常规概念

epoch:是指所有样本数据在神经网络训练一次(单次epoch(全部训练样本/batchsize)/iteration1)或者(1个epochiteration数 batchsize数) batch-size:顾名思义就是批次大小,也就是一次训练选取的样…

力扣hot100 前 K 个高频元素 小根堆 流 IntStream

Problem: 347. 前 K 个高频元素 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 参考 小根堆&#xff08;维护k个高频元素&#xff09;遍历所有元素&#xff0c;当前堆大小 < k 或者 当前元素出现次数大于堆顶元素出现次数&#xff1a;替换掉堆顶元素 复杂…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(三)NodeJS入门——http协议

033_HTTP协议_初识HTTP协议 hello&#xff0c;大家好&#xff0c;这个小节我们来认识一下 http协议。 http是几个单词的首字母拼写&#xff0c;全称为Hypertext Transfer Protocol 译为超文本传输协议&#xff0c;那么这个http协议是互联网上应用最广泛的协议之一。顺便说一下…

使用 axios 请求库,设置请求拦截

什么是 axios&#xff1f; 基于promise网络请求库&#xff0c;可以同构&#xff08;同一套代码可以运行在浏览器&#xff09;&#xff0c;在服务端&#xff0c;使用原生node.js的http模块&#xff0c;在客户端&#xff08;浏览器&#xff09;中&#xff0c;使用XMLHttpRequests…

【Godot4自学手册】第十节将场景添加到TileSet绘制背景,主人公走到房子后面房子变得半透明

这节主要学习将场景添加到TileSet作为TileMap来搭建背景。同时&#xff0c;主人公进入房子后面&#xff0c;房子变得半透明&#xff0c;离开房子后房子变的不透明。 一、创建新场景 首先导入房子素材&#xff0c;最终文件系统内容如下&#xff1a; 点击新建场景按钮&#x…

【Qt学习笔记】(一)初识Qt

Qt学习笔记 1 使用Qt Creator 新建项目2 项目代码解释3 创建第一个 Hello World 程序4 关于内存泄漏问题5 Qt 中的对象树6 关于 qDebug&#xff08;&#xff09;的使用7 使用其他方式创建一个 Hello World 程序&#xff08;编辑框和按钮方式&#xff09;8 关于 Qt 中的命名规范…

阿里云智能集团副总裁安筱鹏:企业数字化的终局是什么?

以下文章来源于数字化企业 &#xff0c;作者安筱鹏博士 回答数字化终局追问的起点是&#xff0c;企业需要重新定义我是谁。成为有竞争力的行业领导厂商&#xff0c;你应当成为一个客户运营商&#xff0c;即能够实时洞察、实时满足客户需求&#xff0c;追求极致的客户体验。而要…

使用 Docker 部署扫雷小游戏

1&#xff09;源码 介绍&#xff1a;扫雷游戏是一款经典的单人益智游戏&#xff0c;旨在通过揭示方块和避开地雷来展示玩家的逻辑思维和推理能力。 源码&#xff1a;saolei.zip 个人文件站&#xff1a;https://share.wuhanjiayou.cn/ 2&#xff09;部署 2.1&#xff09;安装…

SpringBoot中处理校验逻辑的两种方式:Hibernate Validator+全局异常处理

最近正在开发一个知识库学习网站编程喵&#x1f431;&#xff0c;需要对请求参数进行校验&#xff0c;比如说非空啊、长度限制啊等等&#xff0c;可选的解决方案有两种&#xff1a; 一种是用 Hibernate Validator 来处理一种是用全局异常来处理 两种方式&#xff0c;我们一一…

基于EdgeWorkers的边缘应用如何进行单元测试?

随着各行各业数字化转型的持续深入&#xff0c;越来越多企业开始选择将一些应用程序放在距离最终用户更近的边缘位置来运行&#xff0c;借此降低延迟&#xff0c;提高应用程序响应速度&#xff0c;打造更出色的用户体验。 相比传统集中部署和运行的方式&#xff0c;这种边缘应…

websocket编写聊天室

【黑马程序员】WebSocket打造在线聊天室【配套资料源码】 总时长 02:45:00 共6P 此文章包含第1p-第p6的内容 简介 温馨提示&#xff1a;现在都是第三方支持聊天&#xff0c;如极光&#xff0c;学这个用于自己项目完全没问题&#xff0c;大项目不建议使用 需求分析 代码

Vue学习总结

声明&#xff1a;本文来源于黑马程序员PDF讲义 双向绑定&#xff1a; 修改表单项标签&#xff0c;发现vue对象data中的数据也发生了变化 双向绑定的作用&#xff1a;可以获取表单的数据的值&#xff0c;然后提交给服务器 事件绑定 v-on: 用来给html标签绑定事件的。需要注意…

了解 Redis Channel:消息传递机制、发布与订阅,以及打造简易聊天室的实战应用。

文章目录 1. Redis Channel 是什么2. Redis-Cli 中演示使用3. 利用 Channel 打造一个简易的聊天室参考文献 1. Redis Channel 是什么 Redis Channel 是一种消息传递机制&#xff0c;允许发布者向特定频道发布消息&#xff0c;而订阅者则通过订阅频道实时接收消息。 Redis Cha…

LRU 缓存置换策略:提升系统效率的秘密武器(下)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

小程序定制开发前,应该考虑些什么?

引言 在移动互联网时代&#xff0c;小程序已经成为许多企业和个人推广业务、提供服务的理想平台。然而&#xff0c;在进行小程序定制开发之前&#xff0c;开发者和业务方需要细致入微地考虑一系列关键因素&#xff0c;以确保最终的小程序既能满足用户需求&#xff0c;又能够顺…