从零开始制作一个linux iso镜像

一、前言

对于一个极简化的linux系统而言,只需要三个部分就能组成,它们分别是一个linux内核、一个根文件系统和引导。以下是本文制作linux iso镜像所用到的系统和软件:

OS: ubuntu 20
软件: xorriso

二、制作linux内核

1、首先需要去官网选择一个需要的版本下载下来,官网下载地址:https://mirrors.edge.kernel.org/pub/linux/kernel/

2、利用tar将其解压,然后进入其目录中,然后配置内核,常见的配置有以下几种:
a、make defconfig – 默认配置
b、make allyesconfig – 创建能选yes就选yes的配置
c、make allnoconfig – 创建能选no就选no的配置
d、make menuconfig – 基于ncurser的图形化界面配置
这里采用命令make defconfig使用默认的即可,如下图所示:

从零开始制作一个linux iso镜像

3、然后使用 make bzImage 命令编译出内核即可,如下图所示:

从零开始制作一个linux iso镜像

编译好的内核文件在 arch 文件夹相应的架构文件夹下面,如下图所示:

从零开始制作一个linux iso镜像

三、制作根文件系统

1、我们这里利用busybox来制作一个根文件系统,busybox可以简单理解为一个linux工具的集合。首先还是下载busybox,官网下载地址:https://busybox.net/downloads/

2、编译busybox与编译内核步骤基本一致,将下载好的压缩包进行解压,然后进入文件夹中,使用make defconfig配置默认编译选项,这里需要注意的是,在生成的 .config 配置文件中,需要设置 CONFIG_STATIC=y ,如果没有,添加即可,如下图所示:

从零开始制作一个linux iso镜像

从零开始制作一个linux iso镜像

3、然后使用 make busybox install 命令编译busybox,编译好后会在当前目录下面生产一个 _install 文件夹,如下图所示:

从零开始制作一个linux iso镜像
从零开始制作一个linux iso镜像

4、然后创建一个 rootfs 文件夹,并将 _install 文件夹下面除 linuxxrc 以外的所有文件及文件夹都拷贝到 rootfs 文件夹下面,最后创建 dev 等文件夹,最后在根目录下面创建 init 文件即可,文件内容如下图所示:

从零开始制作一个linux iso镜像

从零开始制作一个linux iso镜像

5、最后利用命令 find . | cpio -R root:root -H newc -o | gzip > ../rootfs.gz 将文件系统打包,至此,一个文件系统就创建完成了,如下图所示:

从零开始制作一个linux iso镜像

四、BIOS

1、这里我们使用 syslinux 来创建 bios 引导的一个linux iso镜像, syslinux 官方下载地址如下:https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/

2、将下载好的 syslinux 解压,然后创建文件夹 isobios ,将解压后的 syslinux 文件夹下面的 bios/core/isolinux.binbios/com32/elflink/ldlinux/ldlinux.c32 复制到 isobios 文件夹下面,如下图所示:

从零开始制作一个linux iso镜像

3、在 isobios 文件夹下面创建配置文件 isolinux.cfg ,文件内容如下所示:

从零开始制作一个linux iso镜像

4、最后,在 isobios 文件夹下面使用命令 xorriso -as mkisofs -o ../testbios.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table ./ 生成iso镜像文件,如下图所示:

从零开始制作一个linux iso镜像

5、使用虚拟机 vmware 创建一个虚拟机,如下图所示,便是我们创建的一个linux iso镜像跑起来的样子。

从零开始制作一个linux iso镜像

五、UEFI

1、uefi这里采用 system-bootsyslinux 配合来制作,首先,创建两个文件夹 isouefitmp ,其中, isouefi 用来挂载设备, tmp 文件夹用来临时存放文件以计算大小,然后在 tmp 文件夹下面创建 EFI/BOOTloader/entries 目录,接着,将解压后的 systemboot 下面的 uefi_boot/EFI/BOOT/BOOTx64.EFI 文件拷贝到 tmp/EFI/BOOT 目录下面,如下图所示:

从零开始制作一个linux iso镜像

2、接着,在 tmp/loader 目录下面,创建文件 loader.conf 配置文件,第一行表示默认配置是 entries 目录下那个文件,第二行设置默认超时时间;然后在 entries 文件夹下面创建相应的配置文件,这里是 mll-x86_64.conf ,文件内容和 bios 的差不多,不在单独细说,最后再将前面准备好的内核和文件系统拷贝到 tmp 目录下面,如下图所示:

从零开始制作一个linux iso镜像

从零开始制作一个linux iso镜像

从零开始制作一个linux iso镜像

3、此时就可以根据 tmp 文件夹的总大小创建一个相同大小的 img 文件了,这里的 tmp11M ,为了稳妥起见,这里创建一个 12Mimg 文件,命令为 truncate -s 12M uefi.img ,然后使用 losetup -f 命令寻找一个当前未使用的逻辑设备,然后使用 losetup 命令将我们前面创建的 img 文件虚拟成改逻辑设备,接着利用 mkfs.vfat 将该设备格式化成 vfat 系统,接着使用 mount 命令将其挂载到 isouefi 文件夹下面,最后将 tmp 文件夹下面所有文件及其文件夹拷贝到 isouefi 目录下面,如下图所示:

从零开始制作一个linux iso镜像

从零开始制作一个linux iso镜像

4、接着利用 umount 命令取消挂载,这样我们就得到一个包含 内核文件系统 等的 img 文件,接着创建一个 iso 文件夹,并且在该文件夹下面将创建一个 boot 文件夹,然后将 img 复制到 iso/boot 下面,最后利用 xorriso 工具生成 iso 文件即可,如下图所示:

从零开始制作一个linux iso镜像

5、最后,新建一个虚拟机,引导选择uefi,启动即可,如下图所示:

从零开始制作一个linux iso镜像

从零开始制作一个linux iso镜像

六、相关链接

github链接:https://github.com/windy-purple/make_linux_iso

Original: https://www.cnblogs.com/aWxvdmVseXc0/p/15553891.html
Author: windy_ll
Title: 从零开始制作一个linux iso镜像

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/524369/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • jmeter 性能测试 报错信息“address already in use:connect”解决方法

    jmeter性能测试报”address already in use:connect” 报错信息 原因分析: 这个问题的原因是windows端口被耗尽了(默…

    Linux 2023年6月8日
    0120
  • Linux 0.11源码阅读笔记-文件管理

    Linux 0.11源码阅读笔记-文件管理 文件系统 生磁盘 未安装文件系统的磁盘称之为生磁盘,生磁盘也可以作为文件读写,linux中一切皆文件。 磁盘分区 生磁盘可以被分区,分区…

    Linux 2023年5月27日
    0113
  • OpenSSL测试-随机数

    任务详情 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务 使用OpenSSL定义一个私有函数 static int getRandom(char…

    Linux 2023年6月8日
    0128
  • ipv6 6r 原理介绍,IPv6 Rapid Deployment, IPv6 6rd, Linux IPv6 6rd初探

    IPv6 Rapid Deployment: Provide IPv6 Access to Customers over an IPv4-Only Network 原文地址:htt…

    Linux 2023年6月6日
    0137
  • Linux常用命令总结

    Linux常用命令总结 关机 & 重启&注销 常用命令 作用 shutdown -h now 即刻关机 shutdown -h 5 5分钟后关机 shutdown …

    Linux 2023年6月7日
    0116
  • 正态分布

    用来计算连续变量的发生率,说的很抽象,简单说就是单独拿出来没什么太大用,但并不是说这个没什么用,相反这个太重要了,这玩意能让你看清世界的真相 先看个图,像这样的线性就是正太分布 正…

    Linux 2023年6月6日
    0131
  • 句柄过多导致SSH失败

    现象描述 scp文件的时候,突然有一个节点拷贝失败了。以为免密被修改了,结果一问说原因是:句柄过多。 以前这种情况接触较少,就顺带查了一下资料。 句柄的定义 这个标题隐含的一个前提…

    Linux 2023年6月8日
    0127
  • 正则表达

    常用表达式 单字符:. : 除换行以外所有字符[] :[aoe] [a-w] 匹配集合中任意一个字符\d :数字 [0-9]\D : 非数字\w :数字、字母、下划线、中文\W :…

    Linux 2023年6月13日
    0106
  • docker安装redis

    安装镜像 docker pull redis:7.0 下载配置文件 wget http://download.redis.io/redis-stable/redis.conf 修改…

    Linux 2023年6月7日
    0140
  • CA证书介绍与格式转换

    PKCS 公钥加密标准(Public Key Cryptography Standards, PKCS),此一标准的设计与发布皆由RSA资讯安全公司(英语:RSA Security…

    Linux 2023年6月6日
    0103
  • 【C++基础】内存分区模型

    内存分区模型 C++程序在执行时,将内存大致划分为 4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理 全局区:存放 全局变量和 静态变量以及 常量 栈区:由 编译器自动…

    Linux 2023年6月13日
    0102
  • mybatis-plus详细讲解

    本文笔记都是观看狂神老师视频手敲的,视频地址:https://www.bilibili.com/video/BV17E411N7KN 学java后端的都可以去看一下,从基础到架构很…

    Linux 2023年6月7日
    0143
  • docker容器编排原来这么丝滑~

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 概念介绍: Docker 这个东西所扮演的角色,容易理解,它是一个容器引擎,也就是说实际上我们的容器最终是由Doc…

    Linux 2023年6月14日
    0114
  • BKT的胡测题解:第一套第一题parts

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/Grharris/p/11530239.htmlAuth…

    Linux 2023年6月6日
    0112
  • Linux安装nginx

    Linux安装nginx (1)安装c++编译环境装备yum install gcc gcc-c++ (2)安装PCRE库tar -zxvf pcre-8.38.tar.gzcd …

    Linux 2023年6月13日
    095
  • Python2中快速获取本地时区当天0点时间戳的一种方法

    如下所示,看了网上的几种方法,这种方法算是代码量比较小的,同时可以保证求的是本地时区的0点时间戳,返回的是浮点数,需要的话自己转一下int In [1]: import time …

    Linux 2023年6月6日
    0112
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球