说到制作Linux,大家都能想到大名鼎鼎的Linux。 然而Linux的复杂性并不是一般人能够轻易掌握的。 对于初学者来说,任何一步的不一致都会导致他们遭遇挫折,让他们突破LFS的信心越来越小。
本文教你如何制作一个比LFS更简单的Linux系统。 它只有 Grub、Linux 和最小的根文件系统。 原理和过程非常简单。 你可以在这个基本的Linux之上添加其他功能,并逐渐向LFS迈进。
制作Linux,首先要把系统放在磁盘上,所以涉及到启动和引导操作系统的知识。 我们使用著名的Grub引导程序来实现这一点。 Grub执行后,会加载操作系统和文件系统。 对于操作系统,我们可以使用较新版本的代码进行编译,对于根文件系统,我们使用工具来生成最小的根文件系统。
整个生产过程从磁盘开始。 该磁盘可以是软盘、USB、SSD 磁盘或 HDD。 但考虑到很多朋友身边没有这些东西,我们使用Qemu来进行实验。 其原理与真实硬件完全相同。 唯一的区别是Qemu的磁盘可以被Host OS文件替换。
计算机启动过程
在生产过程中,难免无法理解其中复杂的操作流程以及为什么要这样操作。 这需要对计算启动过程的原理有一些基本的了解。 电脑是如何启动的? 你可以在网上找到很多关于这个问题的文章。 您可以参考《电脑是如何启动的?》 作者:阮一峰丹尼尔。 》,我在这里列出关键流程:
BIOS阶段:计算上电后,系统从主板上的BIOS程序运行,检测系统,初始化运行环境。 加载阶段:BIOS按顺序扫描硬盘。 如果一块硬件的第一个扇区(512字节)的最后两个字为0x55和0xAA的话,那么该硬盘就是引导硬盘,这个扇区就是主引导记录(boot,缩写为MBR) )。 BIOS将该扇区加载到内存中,然后跳转到该地址开始加载OS阶段: 开始执行,由于内存中只有512字节,所以这512字节的作用是将其其余代码从其后面的扇区(扇区2、扇区3、直到...扇区N)被添加到内存中,并且代码被完全加载到内存中; 然后读取配置文件,然后将文件和根文件系统从磁盘加载到内存中,最后跳转开始执行OSOS启动:OS开始初始化系统并解压根文件系统,加载到根中文件,运行init进程
简化版启动过程中,BIOS由主机提供,需要安装OS和BIOS。
生产中涉及的软件说明
本文使用Qemu进行验证,因此需要一个Qemu模拟的硬盘(实际上是Linux中的磁盘文件)。 Qemu提供了BIOS功能,因此只需要安装它,操作系统和各个组件的选择如下表所示:
组件软件版本.00OS。
以下是制作过程中涉及到的软件版本
软件版本构建方法.04 直接安装 grub-.00~rc1 源码编译安装 qemu2.10.0 源码编译安装 20.1 直接安装 直接安装
开始制作Linux第1步:创建64M的磁盘文件
使用dd命令创建一个64M的文件。 命令如下:
dd if=/dev/zero of=disk.img bs=1M 计数=64
运行流程如图1所示:
图1:dd命令运行流程
步骤2:对磁盘进行分区,整个磁盘只创建一个分区
使用 fdisk 命令对 disk.img 磁盘进行分区,并使用 n 命令创建新的主分区。 分区是整个磁盘的大小。 命令如下:
fdisk 磁盘.img
fdisk命令交互流程如图2所示:
图2:fdisk命令运行流程
步骤3:将磁盘分区关联到/dev/loop7设备
如果你对磁盘结构稍有了解的话,磁盘的第一个扇区就是MBR,其中包含分区表,分区表记录了磁盘上有多少个分区,每个分区从哪个扇区开始,以及有多少个扇区。分区占用。 第一个扇区往往是一个分区的起始扇区,并不是从第二个扇区开始的。
我们使用fdisk -l disk.img命令可以看到该磁盘只有一个主分区,从第2048扇区开始:
ivan@ivan:~/minilinux$ fdisk -l disk.img
Disk disk.img: 67 MB, 67108864 bytes
41 heads, 32 sectors/track, 99 cylinders, total 131072 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xa711cdff
Device Boot Start End Blocks Id System
disk.img1 2048 131071 64512 83 Linux
接下来我们需要在分区中创建一个文件系统并将文件放入其中。 此步骤需要将分区与直接磁盘设备关联,以便格式化文件并将文件复制到该分区。 使用该命令将分区与 /dev/loop7 设备关联。 命令如下:
-o /dev/loop7 磁盘.img
-o 表示分区在disk.img中的偏移量(字节为单字节,即2048 x 512 = )
命令执行如图3所示:
图3:运行流程
第四步:格式化并挂载分区
接下来,使用以下命令将分区格式化为 ext3:
mkfs.ext3 /dev/loop7
mkfs.ext3命令的运行流程如图4所示:
图4:mkfs.ext3命令运行流程
格式化后,将分区挂载到mnt目录(要么在工作目录下创建mnt目录,要么直接使用系统提供的/mnt,本文使用前者):
mkdir 目录
挂载-t ext3 /dev/loop7 ./mnt/
mount命令运行流程如图5所示:
图5 Mount命令运行流程
第5步:安装grub
磁盘和分区已经完成。 下一步是安装 Grub。 安装命令如下:
grub- –boot-=./mnt/boot/ –=i386-pc –= disk.img
运行结果如图6所示:
图6:grub-命令运行流程
运行grub-命令后,disk.img磁盘的第一个扇区将被修改为MBR,并且grub代码将被安装到第一个分区之前的扇区(通常在0到64扇区之间)。 最后,将运行grub代码所需的其他模块和配置文件保存到./mnt/boot/grub目录中。
第6步:下载并编译内核
首先从官网下载linux-4.9.tar.gz文件,如下图7所示:
图7:下载
然后使用默认配置编译内核并复制到distk.img盘的boot/目录下。 命令如下:
制作
使-j4
sudo cp arch/x86/boot/ ~//mnt/boot/
上述命令的运行流程如图8所示:
图8:内核编译和复制过程
第7步:制作
使用该命令创建文件系统的简化版本。 使用命令生成极简版本,放到boot目录下。 命令如下:
-o ./mnt/boot/
运行流程如图9所示:
图 9:生成根文件系统
第8步:编写grub.cfg并让Grub启动并运行
万事俱备,只需要东风,Grub,都准备好了。 剩下的事情就是编写 grub.cfg 配置文件并告诉 Grub 从哪个目录中查找 和 文件。 具体命令如下:
猫 - > ./mnt/boot/grub/grub.cfg