Linux 内核学习1. 编译并启动一个最小化系统
sinye56 2024-12-01 03:54 11 浏览 0 评论
一、Linux内核简介
1. Linux 内核介绍
Linux内核是操作系统的核心组件,负责管理硬件资源、提供系统调用接口以及协调用户空间和硬件之间的交互。
内核位于操作系统的最底层,直接与硬件交互,为上层提供服务。
Linux内核是开放源代码的,符合 GPL (General Public Licese)开源协议 。
内核网址:https://kernel.org/
截止本文写作时,当前内核主线最新版本是6.8-rc1。
2. Linux内核主要的作用
- 硬件管理
- 进程管理
- 内存管理
- 文件系统
- 网络支持
- 系统调用接口
- 中断和异常处理
- 安全性和权限控制
- 虚拟化、容器支持
二、编译内核主要的步骤
Linux内核编译主要是以下步骤:
- 准备编译环境
- 获取内核源代码
- 配置内核
- 编译内核
本文要实现一个最小化的Linux系统,除了上面编译步骤,还需要做:
- 构建用户空间工具集
- 制作根文件系统
- 配置引导加载程序
三、编译过程
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工具,如: ls,cp,mv,mkdir,cat等;
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
配置时修改.config 的 CONFIG_STATIC 内核配置选项,这个选项是用于指示是否构建静态链接的内核二进制。设置为y,用来构建静态内核二进制,它会包含内核中的所有代码和驱动。
6.2 编译并安装
make busybox install
- bin目录 : 存放系统的基本命令工具
- sbin:存放系统管理员或系统维护者使用的一些特殊命令工具
- usr:存放用户级别的应用程序和数据,在BusyBox里通常包含一些额外的工具和应用
- linuxrc:是一个初始化脚本 ,用于系统的初始化和配置任务,如挂载文件系统、加载模块;
为了更灵活定制系统,后面会先删除 linuxrc。
7. 制作根文件
7.1 制作根文件系统说明
制作根文件系统是指创建一个包含操作系统核心文件、命令工具、配置文件和其它必要文件的目录结构,该目录结构将成为制作的Linux系统的根目录。 在Linux系统中,根文件系统是系统启动时的最顶层目录 , 表示为 / 。
要做的根文件系统包含了系统启动和运行所需的所有文件和目录。 制作过程一般是:
- 选择文件系统类型
- 创建目录结构
- 添加文件系统
- 配置系统文件
- 设备节点
- 设置权限和所有权
- 配置启动脚本
- 压缩文件系统
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 镜像的命令,下面是各个参数的解释:
- -as:
- 启用 xorriso 的 “Auto scan” 模式,该模式用于扫描可用的设备和媒体。
- mkisofs:
- 指定使用 mkisofs 模块,mkisofs 用于创建 ISO 9660 文件系统的镜像。
- -o ../mybios.iso:
- 指定输出文件的路径和名称,这里将 ISO 镜像保存为 mybios.iso 并放置在上层目录 (../)。
- -b isolinux.bin:
- 指定引导镜像文件的路径和名称,这里设置了引导镜像为 isolinux.bin。
- -c boot.cat:
- 指定引导信息文件的路径和名称,这里设置了引导信息文件为 boot.cat。
- -no-emul-boot:
- 禁用 emulated boot(模拟引导)。该选项告诉 ISO 文件系统,引导镜像应该直接从磁盘引导,而不是通过模拟软盘引导。
- -boot-load-size 4:
- 设置引导加载器的加载大小,这里将引导加载器加载到内存的大小设置为 4 扇区。
- -boot-info-table:
- 在 ISO 9660 文件系统中创建引导信息表。该表提供引导加载器所需的信息。
- ./:
- 指定要包含在 ISO 镜像中的文件和目录的路径。这里 ./ 表示当前目录下的所有文件和子目录。
这个命令的目标是创建一个 ISO 9660 文件系统的镜像,该镜像包含了引导信息、引导加载器以及当前目录下的所有文件和子目录。这种 ISO 镜像通常用于制作可引导的光盘或 USB 镜像,以便在系统引导时加载其中的操作系统或工具。
生成的iso:
四、创建虚拟机
1. 使用VMWare创建虚拟机
2. 启动虚拟机
启动后可以输入ls pwd 等命令。
- 上一篇:如何加密单个linux文件系统
- 下一篇:LVM分区管理实战:创建和扩容的完整指南
相关推荐
- 程序员:JDK的安装与配置(完整版)_jdk的安装方法
-
对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...
- Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置
-
一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...
- 麒麟系统安装JAVA JDK教程_麒麟系统配置jdk
-
检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...
- 学习笔记-Linux JDK - 安装&配置
-
前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...
- Linux新手入门系列:Linux下jdk安装配置
-
本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...
- 测试员必备:Linux下安装JDK 1.8你必须知道的那些事
-
1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...
- Linux 下安装JDK17_linux 安装jdk1.8 yum
-
一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...
- 在Ubuntu系统中安装JDK 17并配置环境变量教程
-
在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...
- 如何在 Linux 上安装 Java_linux安装java的步骤
-
在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...
- Windows和Linux环境下的JDK安装教程
-
JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...
- linux安装jdk_linux安装jdk软连接
-
JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...
- linux安装jdk,全局配置,不同用户不同jdk
-
jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...
- 运维大神教你在linux下安装jdk8_linux安装jdk1.7
-
1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...
- window和linux安装JDK1.8_linux 安装jdk1.8.tar
-
Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...
- 最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?
-
默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- linux进程通信 (63)