电脑、手机、智能家居,现在越来越多的产品带着各种各样的功能走入到我们的视野中——这些各种各样的功能的产品都离不开操作系统。但是大家有没有想过,当我们按下电源开关的时候,机器发生了什么?作为实现各种功能的应用软件是由操作系统加载到内存中并开始执行的,但是操作系统又是被谁加载到内存中并开始执行的呢?

下面让我们来探索一下软件世界的起点,通过一步步自己搭建操作系统来了解软件世界最初的“开始”。

搭建原理:

当一台机器上电后,CPU需要从一个固定的地址开始运行程序,这部分的程序是硬件在出厂的时候由硬件供应商提供并固化在BIOS芯片中。BIOS经过自检、初始化等操作后,会在引导设备上寻找系统的引导程序,然后通过引导程序将系统加载到内存中,并开始执行系统的程序——这是整个机器从上电到系统启动的大概过程。

从这个过程我们可以看出:只要将引导程序放置到引导设备上,并将系统的存储位置等信息在引导程序配置好,就可以完成从机器上电到系统启动的一个过程。

下面就开始带领大家一步步的搭建自己的系统。

准备工作

首先我们先要准备一些工具:

  • 一台Linux机器——我们这里使用ubuntu操作系统的机器,主要使用其分区工具、挂载分区等命令;
  • 一个64G U盘——用于将系统搭建在U盘上。

Step01 创建分区

分区工具有很多种,这里我们推荐使用简单易用的图形化分区工具Gparted。我们将 U 盘分两个区:存放 efi 引导文件的 efi 分区,和用于放置 Linux 系统文件和用户文件的通用分区。

  • 首先启动 Gparted 分区工具
  • 手动搭建gitlab 手动搭建ubuntu_ubuntu

  • 其次将 U 盘分区表设置为 GPT 格式;
  • 手动搭建gitlab 手动搭建ubuntu_文件系统_02

  • 通过新建分区的方式将 U 盘分为两个分区——这里我们分出一个 512M 的 esp分区,格式化为 fat32 格式,和一个其他分区,格式化为一个 ext4 格式;
  • 格式化完成后在fat32分区上右击,选择“Manage Flags”选项,将该分区标志设置为boot,esp——这样就完成了一个esp分区的建立;
  • 手动搭建gitlab 手动搭建ubuntu_linux_03

Step 02 创建目录

我们通过以下几步完成必须要目录的创建和文件的复制工作。

  • 首先通过mount的方式,将ext4分区挂载到/mnt文件节点下;
  • 并在该分区创建相应的目录:etc、usr、var、run、dev、proc、sys、tmp、home、boot、boot/efi以及其他目录;
  • 其次将esp分区(fat32分区)挂载到boot/efi目录上;
  • 再将Ubuntu系统中的etc、usr、var/log、var/lib中的文件复制到/mnt对应的目录下;将Ubuntu系统boot下的initd*、vmlinuz*文件复制到/mnt/boot下(具体可以参考ubuntu文件系统);
  • 最后为了在下一步能够正常运行,我们需要在根目录下建立相应的目录和链接文件:lib、lib32、lib64、libx32、bin、sbin;

Step 03 挂载分区

首先要建立系统的运行环境——主要是将Linux系统使用的目录挂载到相应的位置。这里使用mount命令将必要的文件挂载到我们的文件节点下:

• sudo mount -o bind /dev /mnt/dev
• sudo mount -o bind /dev/pts /mnt/dev/pts
• sudo mount -o bind /proc /mnt/proc
• sudo mount -o bind /run /mnt/run
• sudo mount -o bind /sys /mnt/sys

Step 04 切换根目录

Linux系统中有一个神奇的命令chroot,它可以改变程序执行时所参考的根目录位置;所以在执行这条指令后的所有操作就相当于我们在我们自己刚刚配置好的系统中进行操作。

  • sudo chroot /mnt /bin/bash

在这条命令后,我们就进入了通过前面步骤设置的系统环境。在这里进行的安装、配置等操作就等同于在我们搭建的系统中操作是一样的。例如在这里安装软件后,等我们真正启动我们自己搭建的系统时也是可以正常使用的,所以如果我们想要预装一些软件可以在运行chroot命令后进行。

Step 05 创建用户

由于我们是操作系统的搭建使用的是ubuntu操作系统的配置文件,所以必须要创建一个用户,否则系统不能正常运行。这里我们使用useradd命令来创建用户,使用passwd来为该用户设置密码;

Step 06 配置系统文件

在系统中有一个很重要的fstab系统文件,该文件通常保存在/etc目录下。该文件通常列出所有可用的磁盘分区和其他类型的文件系统和数据源——这些文件系统和数据源可能不一定是基于磁盘的;同时该文件也会指示它们将如何被初始化或以其他方式集成到更大的文件系统结构中。这里我们主要更改fstab系统文件中的各个分区的UUID部分——UUID可以通过blkid命令来进行查找。

手动搭建gitlab 手动搭建ubuntu_系统文件_04

至此,我们系统的程序放置、系统配置部分已经完成。

Step 07 配置系统引导文件

接下来就是搭建过程中最重要的一环,但同时也是最简单的一环。说重要是因为只有这一步配置正确才能真正的实现操作系统的启动;说简单是因为开发人员已经为我们制作了一个可执行程序,只要直接执行就可以了——既省去了查询信息需要的大量的时间,同时也防止我们在配置过程中出错。

  • grub-install --target=x86_64-efi /dev/sda (我的U盘在系统中的设备文件是sda)
  • grub-mkconfig -o /boot/grub/grub.cfg
  • update-grub2

至此,我们就完成了一个ubuntu系统的手动搭建过程。
重新启动电脑并选择从U盘启动,就可以进入我们自己搭建的操作系统了。

总结

简单来说,其实搭建一个操作系统只需要7步就可以!

  • 先进行分区;
  • 创建必要的目录
  • 再将使用到的命令和库复制到合适的位置;
  • 挂载分区,使用chroot命令切换到我们设置的目录下进行操作;
  • 创建用户;
  • 修改/etc/fstab配置文件;
  • 通过grub命令生成引导信息;

一个系统的搭建过程其实就是这么简单。我们平时见到的使用安装盘安装的过程也大同小异:安装盘会先在机器的内存中加载一个最小的内核,然后通过脚本的方式来实现自动分区等操作,并在最后根据用户的需要使用dpkg命令来安装所需要的软件。