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 linuxrccd ..
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等命令。
在这里插入图片描述

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

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

相关文章

C语言-算法-树状数组

统计和 题目描述 给定一个长度为 n ( n ≤ 100000 ) n(n\leq 100000) n(n≤100000),初始值都为 0 0 0 的序列, x ( x ≤ 100000 ) x(x\leq 100000) x(x≤100000) 次的修改某些位置上的数字,每次加上一个数,然后提出 y ( y ≤…

mysql 允许其他ip访问

1.改表法。 可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从"localhost"改称"%" //执行以下…

#翻转牛群

题目描述 农夫约翰偶尔会遇到无聊的青少年,他们晚上去他的农场,把奶牛们弄翻。一天早上,他醒来发现事情又发生了——他的 N∗N 头奶牛排列成了一个完美的 N∗N 方阵(1≤N≤10),但他发现其中一些现在已经被弄翻了&…

学习使用Flask模拟接口进行测试

前言 学习使用一个新工具,首先找一段代码学习一下,基本掌握用法,然后再考虑每一部分是做什么的 Flask的初始化 app Flask(__name__):初始化,创建一个该类的实例,第一个参数是应用模块或者包的名称 app…

免费使用支持离线部署使用的 txt2video 文本生成视频大模型(Text-to-Video-Synthesis Model)

免费使用支持离线部署使用的 txt2video 文本生成视频大模型(Text-to-Video-Synthesis Model)。 文本生成视频大模型(Text-to-Video-Synthesis Model)是一种基于深度学习技术的人工智能模型,它可以将自然语言文本描述转换为相应的视频。即通过输入文本描述&#xff…

MySQL 函数参考手册(MySQL 数值函数)

目录 MySQL ABS() 函数 MySQL ACOS() 函数 MySQL ASIN() 函数 MySQL ATAN() 函数 MySQL ATAN2() 函数 MySQL AVG() 函数 MySQL CEIL() 函数 MySQL CEILING() 函数 MySQL COS() 函数 MySQL COT() 函数 MySQL COUNT() 函数 MySQL DEGREES() 函数 MySQL DIV 函数 My…

远程连接服务器:Ping通但SSH连接失败的解决办法

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言常见问题影响SSH的因素本地影响因素防火墙设置网络配置文件 远程主机影响因素放行…

HTML5画布绘制实心圆、三角形、五边形、五角星

场景 纯原生canvas绘制,可以自定义位置、颜色等信息。 实现 以下封装成方法,调用后传参即可。图形两角间边距暂时写死,可以自行加减参数来调整。 1.实心圆 function circular(x, y, radius, fillColor, strokeColor){ ctx.beginPath();//开始…

Python爬虫实践指南:利用cpr库爬取技巧

引言 在信息时代,数据是无价之宝。为了获取网络上的丰富数据,网络爬虫成为了不可或缺的工具。在Python这个强大的编程语言中,cpr库崭露头角,为网络爬虫提供了便捷而高效的解决方案。本文将深入探讨如何利用cpr库实现数据爬取的各…

西瓜书读书笔记整理(十二) —— 第十二章 计算学习理论(下)

第十二章 计算学习理论(下) 12.4 VC 维(Vapnik-Chervonenkis dimension)12.4.1 什么是 VC 维12.4.2 增长函数(growth function)、对分(dichotomy)和打散(shattering&…

macOS 上使用 Sublime Text 删除全部空行

1、删除方法 1、打开搜索替换: 使用快捷键Command F打开查找功能。然后点击左下角的.*图标或使用快捷键Command Alt R来启用正则表达式搜索。 2、输入正则表达式: 在查找栏中输入以下正则表达式:^\s*\n 这个正则表达式匹配从行开始到行结束之间的所有空白字符…

扩展学习|商业智能和大数据分析的研究前景(比对分析)

文献来源: Liang T P , Liu Y H .Research Landscape of Business Intelligence and Big Data analytics: A bibliometrics study[J].Expert Systems with Applications, 2018, 111(NOV.):2-10.DOI:10.1016/j.eswa.2018.05.018. 信息和通信技术的快速发展导致了数字…

RocksDB是如何实现存算分离的

核心参考文献: Dong, S., P, S. S., Pan, S., Ananthabhotla, A., Ekambaram, D., Sharma, A., Dayal, S., Parikh, N. V., Jin, Y., Kim, A., Patil, S., Zhuang, J., Dunster, S., Mahajan, A., Chelluri, A., Datye, C., Santana, L. V., Garg, N., & Gawde,…

YOLOv5独家改进:轻量级原创自研 | 一种多尺度的GSConv卷积变体,轻量化的同时能够实现涨点 | 新颖的轻量级网络

💡💡💡本文独家改进:1)基于GSConv提出了一种Multi-Scale Ghost Conv的卷积变体,保证轻量级的同时实现涨点,2)同时结合Bottleneck,设计了一种新颖的轻量级网络。 💡💡💡在多个数据集验证能够涨点,同时跟yolov5s进行参数量对比: parameters、GFLOPs都有大幅…

乐鑫与 Elektor 杂志合作推出特刊,聚焦 AIoT 创新

在新一年的起始之际,我们很荣幸地与 Elektor 合作推出由乐鑫领衔编辑的杂志特刊。欢迎点此阅读电子版本。 Elektor 杂志作为国际电子工程和科技创新的重要平台,自 20 世纪 60 年代起,就引领着电子制造的发展潮流。如今,它已经发展…

【Docker】了解Docker Desktop桌面应用程序,TA是如何管理和运行Docker容器(1)

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Docker容器》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…

如何写好论文——(4)确立研究目标的两个原则

一、市场需求——大处着眼 不管目前自己的能力和资源是多么的有限,也要眼光长远,不要老是局限于眼下,只做一些细枝末节、无足轻重的工作。 二、自身条件——小事着手 着眼于自身目前的实际情况,踏踏实实从小事做起 引言就是把自…

Leetcode—2396. 严格回文的数字【中等】

2024每日刷题(一零六) Leetcode—2396. 严格回文的数字 算法思想 实现代码 class Solution { public:bool isStrictlyPalindromic(int n) {return false;} };运行结果 之后我会持续更新,如果喜欢我的文章,请记得一键三连哦&…

【linux】文本处理命令-grep、awk、sed使用(1)

作用: grep数据查找定位awk数据切片sed数据修改 类比SQL: grepselect *from tableawkselect field from tablesedupdate table set fieldnew where fieldold 一、grep 1.1 grep* Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟g…

基于simulink的模糊PID控制器建模与仿真,并对比PID控制器

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1PID控制器原理 4.2 模糊PID控制器原理 5.完整工程文件 1.课题概述 在simulink,分别建模实现一个模糊PID控制器和一个PID控制器,然后将PID控制器的控制输出和模糊PID的控制输出…