第3章构建极简版Linux发行版 本章学习目标: .掌握磁盘镜像文件的创建和分区方法。 .掌握格式化分区和挂载分区的方法。 .掌握将GRUB引导加载程序安装到虚拟硬盘的方法。 .掌握Linux内核的配置、编译。 .掌握制作initrd的方法。 .理解grb.fg的作用和语法。 uc .掌握VirtualBox中运行Linux的方法。 3.创建磁盘映像文件 1 磁盘映像文件可以用来模拟硬盘。磁盘映像文件是一个包含磁盘内容的文件,包括分 区表、文件系统和数据等信息,可以被视为一个完整的硬盘副本。执行如下命令可以在文件 夹/rot/mnlnx中创建一个大小为128MB的磁盘映像文件miiiu_dsi。 oiiiunlnxik.mg 提示:本章使用的所有命令都在al-ommad--iiiush文件中,该文件在本书 cns4mnlnx. 配套资源中。 3.对磁盘分区 2 对磁盘进行分区可以将一个物理硬盘分成多个逻辑部分,并分别为每部分分配一个驱 动器号。通常情况下,用户会将操作系统及其相关文件、程序文件和系统配置文件存储在一 个单独的分区中,同时将用户数据存储在另一个分区,这样可以更好地组织和管理数据,并 避免由于操作系统或程序文件故障而导致用户数据丢失的风险。通过磁盘分区可以更好地 组织和管理磁盘空间,提高数据存储、查找和访问的效率,并且提高性能和安全性。另外,将 关键数据存储在单独的分区中可以使数据备份更加容易和有效。 执行如下命令对虚拟硬盘minlnx_ik.mg进行分区。 iiudsi 3.关联磁盘分区 3 losetup命令用于将一个块设备文件(如硬盘分区或者磁盘映像文件)关联到系统中的 一个loopback设备(环回设备)上,从而使得这个块设备文件可以以文件的形式访问。这个 命令通常被用来在Linux系统上挂载磁盘镜像文件。使用losetup命令时,需要指定一个 未被占用的loopback设备,并将其与目标块设备文件相关联。通过这种方式,就可以像访 问普通文件一样访问该块设备文件。同时,也可以使用其他工具(如mount命令)将其挂载 到文件系统的某个目录下进行读写操作。 iiuik.opbcvop0 执行如下命令将磁盘映像文件minlnx_dsimg关联到loak设备/de/lo 上。此后,就可以像访问普通磁盘一样访问该磁盘映像文件。当不再需要访问时,可使用 losetup-d命令取消关联。 3.格式化分区和挂载分区 4 文件系统是用于管理硬盘上数据的一种机制。它定义了如何在硬盘上存储和组织数据, 并提供访问这些数据的接口。不同的操作系统支持不同的文件系统类型,例如,Windows系统 通常使用NTFS 文件系统,Linux系统通常使用ext4、btrfs或XFS 等文件系统。 格式化分区是指在硬盘上创建一个新的文件系统,以便该分区可以用于存储数据。格 式化分区的主要作用是清除分区上的所有数据,并将文件系统结构写入分区中。这样做可 以确保分区的可靠性和稳定性,并允许操作系统正确地读取和写入数据。格式化分区还可 以使用户更有效地使用硬盘空间。当分区被格式化时,文件系统会对硬盘上的空间进行组 29 织并标记为可用或已使用的状态。这样,用户就可以知道哪些空间已经被使用,哪些空间还 可以用来存储数据。需要注意的是,在格式化分区之前一定要备份分区中的重要数据。因 为格式化分区会将其中的所有数据都删除,如果没有备份,这些数据将无法恢复。另外,需 要考虑选择哪种文件系统类型来适配操作系统和需求。不同的文件系统类型具有不同的特 点和限制,例如,某些文件系统类型可能更擅长处理大文件或小文件,或更适合高可用性、高 速读写等场景。 在Linux中,挂载分区是将一个文件系统与操作系统的目录结构进行关联的过程。当 挂载一个分区时,这个分区的内容就会成为Linux文件系统的一部分,存储在该分区的文件 和文件夹就可以被访问。Linux之所以需要挂载分区,是因为它采用了一种“一切皆文件” 的哲学,将所有设备和资源都视为文件或文件夹。对于硬盘等存储设备来说,这些文件和文 件夹是通过文件系统进行组织和管理的。因此,当要访问某个分区上的文件时,需要先将该 分区挂载到Linux文件系统中,才能够访问其中的数据。在挂载分区时,需要指定挂载点, 即将该分区挂载到Linux文件系统中的一个目录下。 需要注意的是,在挂载分区之前,必须先格式化该分区,并且该分区必须支持Linux所 使用的文件系统类型。否则,该分区将无法挂载到Linux文件系统中。 下面第1行的命令格式化分区/dev/loop0。第2行的命令创建挂载点/mnt/minilinux, 挂载点通常是一个空目录,用来承载该分区下的文件和文件夹。第3行的命令将分区/dev/ loop0挂载到/mnt/minilinux目录下,然后就可以在该目录下创建文件和文件夹了。 3.安装GRUB 5 GRUB是一款开源的引导加载程序,它被广泛用于大部分Linux操作系统的安装程序 中。在安装Linux操作系统时,GRUB通常会被安装到硬盘的MBR(主引导记录)或EFI 系统分区上,并且它可以管理和引导多个操作系统。命令grub-instal 是GRUB软件包中 的一个工具,它的作用是将GRUB引导加载程序安装到计算机硬件上,例如,MBR或EFI 系统分区。命令grub-instal 是安装和配置GRUB引导加载程序的关键命令,它能够确保 计算机在启动时可以正确引导所需的操作系统。 执行如下命令将GRUB引导加载程序安装到虚拟硬盘minlnx_ik.mg的MBR 。 iiudsi 3.下载、配置、编译Liux内核 6n Linux内核是操作系统的核心,它提供了管理系统硬件资源和处理软件程序的基本功 能。它是整个操作系统的最底层,通常负责操作系统的启动、设备驱动程序、进程管理、内存 30 管理和系统调用等重要任务。Linux内核是操作系统的基石,它提供了操作系统所需的核 心功能,使得各种应用程序和工具可以在上面运行。 1. 下载Linux内核 可以执行如下命令从Linux内核官方网站或清华大学开源软件镜像站下载所需版本的 内核源代码,使用的内核版本号是6.11 。源代码文件lnx11..z被下载到/ro/ 1.iu-6.1.tarxotminilinux文件夹中,然后使用tar命令将下载的源代码文件解压到/root/minilinux/linux 6.11 目录中。 1. 2. 配置、编译Linux内核 执行下面第1行的命令,进入源代码目录/rotiiiu/lnx6.11 。第2行的命令 o/mnlnxiu-1. makex8664defconfig的作用是生成一个x8664 架构的默认配置文件,该文件包含Linux 内核在x86(_) _64(_) 架构上的所有必要配置选项,(_) 以便能够顺利地进行编译和安装。在编译 Linux内核时,可以使用这个默认配置文件来快速生成一个可用的内核镜像。当然,在实际 应用中,可能会根据具体的需求对内核的功能进行定制和修改。如果需要自定义配置选项, 可以执行第3行的命令makemenuconfig进行修改。运行makemenuconfig命令来打开内 核配置界面,此时会出现一个文本界面,其中包含内核编译选项,参考下面第5~7行所示选 项对内核进行配置。在内核配置界面中,可以使用箭头键和回车键来浏览和设置不同的选 项,可以选择需要编译进内核的驱动程序、文件系统和功能等。如果不确定如何设置某个选 项,可以按F1 键查看帮助信息。当完成配置后,连续按两次Esc键返回上一级菜单,当菜 单界面提示是否保存配置,输入Y即可保存并退出。 内核配置选项RAMblockdevicesupport允许内核将一块内存区域模拟为一个块设备。 这意味着,可以在内存中创建一个文件系统,并将其挂载为一个块设备。该功能通常用于测试 或嵌入式设备开发。当启用此选项时,内核将创建一个RAM 硬盘(k), 并将其视为一个 ramdis 块设备。需要注意的是,在某些情况下,使用RAM 磁盘可能会导致系统性能下降或内存不 足。因此,建议仅在需要时才启用此选项,并且要确保有足够的内存可用来支持RAM 硬盘。 上面第9行的make-j4bzImage命令的作用是编译Linux内核源代码并生成bzImage 文件。编译内核时使用4个(通常设置为CPU 核心数的两倍)并发任务进行编译,以加 -j4, 快编译速度。bzImage文件是Linux内核经过压缩后的可引导映像文件,可以用于启动系 31 统,它通常被存储在boot目录中,作为启动加载程序(如GRUB)的引导映像文件。第10 行 的命令将bzImage文件复制到/mnt/minilinux/boot文件夹中。 在编译内核期间,如果出现了错误提示,可以按Ctrl+C 组合键来中止编译过程,并修 复相关问题后重新开始编译。 3. 阅读Linux内核源代码 阅读Linux内核源代码需要一定的基础知识和经验,并且对Linux内核的基本概念和 结构有一个初步的了解,包括进程、线程、调度、文件系统、网络等。此外,还需要掌握Linux 内核的主要组成部分,例如,处理器架构相关的代码、驱动程序、文件系统和网络协议栈等。 Linux内核主要使用C语言编写,因此掌握C语言编程技巧和语法是必不可少的。需要熟 悉指针、数组、结构体等基本概念和操作,以及对内存管理、指针运算等方面有深入的理解。 此外,理解操作系统和计算机体系结构基本原理也有助于更好地理解内核。Linux内核由 多个模块和子系统组成,每个模块和子系统都有各自的任务和功能。由于Linux内核非常 庞大和复杂,阅读代码的过程可能会比较漫长和艰难,因此需要耐心和毅力。建议先从简单 的模块或子系统入手,例如,进程管理、文件系统等,逐步深入到复杂的模块。同时也要注意 理解内核的数据结构和算法等核心概念。 在阅读源代码时,需要定位到与自己所学知识相关的关键代码路径,以便能够更加深入 地研究代码实现细节。在定位到关键代码路径之后,可以逐步深入理解代码的实现细节,包 括数据结构、算法、函数调用关系、各种配置选项等。需要注意的是,在阅读代码的过程中, 应该注重理解其核心思想和实现逻辑,而不是过于关注细节上的问题。 Linux内核有详细的文档,包括注释、手册和文档,可以帮助理解内核的各部分。在阅读代码 时,将注释和文档作为重要的参考,并利用它们来明确代码的目的和实现方式。特别是在阅读开 发者提交的patch时,注释和文档能够帮助读者更好地理解其他人的意图和讨论过程。 为了加深对内核的理解,可以尝试编译并运行内核,以验证自己对源代码的理解和推测 是否正确。在调试时,可以使用一些工具,如gdb 、kgdb 、kdb 、systemtap等,这些工具可以 帮助我们进一步了解代码执行流程和调试信息。可以使用调试器跟踪内核运行时的状态。 通过设置断点、打印变量的值等方式,可以更深入地了解内核的实现和执行流程。学习内核 调优可以了解内核运行性能的瓶颈和调优方法。可以了解内核参数、内存管理、I/O调度等 方面的知识,在了解内核架构的基础上进行调优。 Linux内核开发是一个开放的社区,有许多邮件列表和社区活动供开发者交流和讨论。 可以参加这些活动来了解内核开发的最新动态和技术进展,以及从其他开发者那里获取帮 助和反馈。同时也可以贡献自己的代码、提交Bug报告等方式来参与内核开发。内核开发 者通常会在邮件列表中讨论最新的技术进展和内核更新。关注这些内容可以帮助了解内核 的最新动态和热门话题。 3.7 制作initrd intd(ntaamds是一个临时根文件系统,它被加载到内存中,并在Linx操作系 iriiilrik) u 统的启动过程中使用。在Linux系统启动时,内核需要找到并加载必要的驱动程序和文件 32 系统才能继续引导过程。但是,在这些驱动程序和文件系统被加载之前,内核需要访问硬件 设备和其他资源。这就需要一个临时的根文件系统,该文件系统包含必要的驱动程序和其 他文件,以便内核可以启动并继续执行引导过程。因此,d的作用是为Lix内核提供 initrnu 一个包含必要的驱动程序和文件系统的临时根文件系统,以便内核可以完成初始化过程。 一旦初始化完成,内核将卸载initrd并转向真正的根文件系统。 BusyBox是一个精简的Linux工具集合,包括一些常见的Linux工具,如ls、cp、mv 、cat 等。它通常用于嵌入式设备中,因为它非常小巧且功能强大。构建临时根文件系统通常需 要一个基本的Linux工具集,而BusyBox正好满足了这个需求。因此,可以使用BusyBox 构建临时根文件系统。 下面第1~5行的命令在/ro/mnlnx文件夹中创建磁盘映像文件intd.mg,然后 otiiiuiri 以环回设备的方式将intd.mg挂载到/mn/ots。第69行的命令下载BsyBx源代 iritrof~uo 码压缩包文件buso-36.trb2,然后解压。接着运行maemeuofg命令来打开 ybx1.1.a.zkncni 配置界面,此时会出现一个文本界面,其中包含编译选项,参考下面第11~13 行所示选项进 行配置。第15 行的命令编译BusyBox。第16 行的命令将BusyBox安装到/mnt/rootfs文 件夹中。创建启动初始化脚本文件/mnt/rof/ec/ntd/cS,rS文件内容如第21~22 otstii.rc 行所示。第24 行的命令为rcS脚本文件添加可执行权限。第25~27 行的命令创建设备文 件。第28 行的命令卸载intd.mg, ntd.mg文件就是临时根文件系统。第 iri此时生成的iiri29 行的命令将inirimg文件复制到文件夹/mnt/miiiu/boot中,此时该文件夹中包含 td.nlnx3个文件:bzmaggrb、ntd.mg Ie、uiiri。 33 3.编写grb.fg 8 uc 需要在引导程序配置文件/mnt/mnlnxotrb/gucg中添加Linx内核 iiiu/bo/gurb.fu bziiri (Image)和根文件系统(ntd.mg)的信息,以及其他必要的引导参数,确保启动过程可以 正确地加载内核和根文件系统。执行如下命令创建配置文件gruc其内容如第3~7行 b.fg, 所示。第4行是一个GRUB 引导程序的引导命令,它告诉计算机引导程序去加载位于硬盘 hd0 的第一个分区(msdos1)中的/boot/bzImage文件作为Linux内核,并将根文件系统挂 载在一个内存设备上并以读写模式(rw)挂载。接着,它将运行init程序,并且指定了它的 路径为/linuxrc。第5行为注释行。第6行是用来指定引导时加载的initrd镜像文件的位 置。它告诉系统在硬盘hd0 的第一个分区(msds中找intd.mg文件,然后将该文件加 载到内存中,以便在启动Linux操作系统时使用 o 。 1) iri 3.rulox中运行Lnx 9 VitaBiu 当完成上述步骤后,就可以在VirtualBox中安装并测试这款极简版Linux发行版了。 下面第2行的命令的作用是将miiiudsimg文件转换为原始磁盘映像格式,并 nlnx_ik. 将输出保存到miiiudsrw文件中。q-mg是QEMU 虚拟机的一个工具, nlnxik.aemui用于 创建、转换和管理虚拟磁盘(_) 镜像。在这条命令中,ovr-aw cnet参数表示要执行转换操作,Or 参数指定目标格式为原始磁盘映像格式,mnlnx_ik.mg是要转换的源文件名,而 iiiudsimiiiudsrw是输出文件名。第3行的命令是使用Vitaoonge命 nlnxik.arulBx中的VBxMaa 个基于原始磁盘(aik)的磁盘映像文件mnlx_ik. 令工具将一(_) rwdsiiinudsraw 转换为 VirtualBox可以使用的VDI(VirtualBoxDiskImage)格式的文件。这样,在VirtualBox中 就可以直接使用这个minlnx_ik.di文件作为虚拟机的硬盘,而无须重新创建虚拟硬盘 iiudsv 或导入其他格式的映像文件 。 34 打开VirtualBox并创建一个新的虚拟机,1所示, 新建虚拟电脑”对话框中, 如图3.在“ 输入虚拟计算机的名称,并选择操作系统类型和版本。根据需要为虚拟机分配内存空间。 在“虚拟硬盘”页面上,选择“使用已有的虚拟硬盘文件”选项,并单击“选择虚拟硬盘文件”按 钮。在打开的对话框中,找到minlnx_ik.di文件所在的位置,并选择它。最后单击“创 iiudsv 建”按钮完成虚拟机的创建。 图3.1 在VirtualBox中安装极简版Linux发行版 创建虚拟机后,打开该虚拟机的设置窗口,2所示, 处理器” 系统相关的设置如图3.在“ 选项卡中,处理器数量选择2或4(根据自己计算机中CPU 核数而定)。在“显示”设置中, 选中“屏幕”选项卡,显存大小设置为128MB 。 图3. 2 虚拟机的设置 启动虚拟机,显示GRUB 的操作系统选择界面,3所示。选择minilinu 如图3.x菜单 即可正常启动Linu命令行界面如图3. 项,按回车键,x操作系统,4所示,此时就可以使用极 简版Linux发行版了。 图3. 3 GRUB 的操作系统选择界面 35 图3.x操作系统的命令行界面 4Linu 36