一、确保本地PC或虚拟机上已安装了Ubuntu22.04的系统

下载并编译内核

2.1 配置软件源,可配置为阿里的源

命令:

(1)备份原始配置文件

sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup

(2)编辑软件源配置文件

sudo nano /etc/apt/sources.list或sudo vim /etc/apt/sources.list

(3)替换为阿里云镜像源

删除原有内容,粘贴以下配置(x86架构标准版):

deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse

deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse

deb-src https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse

deb-src https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

deb-src https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

(4)保存配置并更新

sudo apt-get update

2.2 更新一下源

apt update

2.3 安装配置内核所需要的依赖

apt install -y make

apt install -y make-guile

apt install -y gcc

apt install -y flex

apt install -y bison

apt install -y libelf-dev

apt install -y openssl

apt install -y libncurses-dev

apt install -y libssl-dev

2.4 下载内核

网址:https://mirrors.edge.kernel.org/pub/linux/kernel/

命令:

​
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.13.8.tar.gz

​

2.5 编译内核

cd linux-5.13.8

# 使用默认配置

make defconfig

# 添加必要配置(这些是关键!缺少任何一个都会导致启动失败)

cat >> .config << 'EOF'

CONFIG_BLK_DEV_INITRD=y         # initramfs 支持

CONFIG_RD_GZIP=y                 # gzip 解压支持(如果用 gzip 压缩)

CONFIG_DEVTMPFS=y               # /dev 自动设备节点

CONFIG_DEVTMPFS_MOUNT=y       # 启动时自动挂载 /dev

CONFIG_TMPFS=y                   # tmpfs 文件系统(initramfs 需要)

CONFIG_BINFMT_ELF=y             # ELF 可执行文件格式

CONFIG_BINFMT_SCRIPT=y          # shebang 脚本支持(#!/bin/sh)

EOF

# 应用配置并编译

make olddefconfig
make -j$(nproc)

# 复制内核

cp arch/x86/boot/bzImage ../isobios/isolinux/kernel.gz

三、下载并编译busybox

3.1 下载busybox

网站:https://busybox.net/

命令:

​
wget https://busybox.net/downloads/busybox-1.32.1.tar.bz2

​

3.2 配置busybox

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

命令:

cd ~/Downloads

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

3.3 编译busybox

命令:

make busybox install

编译完成后,会在当前目录下新增一个_install文件夹,里面就是编译好的busybox

3.4 准备最小根文件系统

mkdir -p rootfs/{bin,dev,etc,proc,sys,sbin,lib,lib64}

# 复制 busybox(推荐静态链接版本)

cp busybox rootfs/bin/
cd rootfs/bin/
for cmd in $(./busybox --list); do ln -s busybox $cmd; done
cd ../..

# 创建 /bin/sh 链接

ln -s busybox rootfs/bin/sh

# 创建 init 脚本

cat > rootfs/init << 'EOF'

#!/bin/sh

dmesg -n 1

mount -t devtmpfs none /dev

mount -t proc none /proc

mount -t sysfs none /sys

/bin/sh

EOF
chmod +x rootfs/init rootfs/bin/busybox

3.5 打包

正确做法(进入目录内打包):

cd rootfs

find . | cpio -o -H newc | gzip > ../isobios/isolinux/rootfs.gz

cd ..

错误做法会导致 rootfs.gz 包含自身,变成几个 GB

# 在父目录打包会包含 isobios 子目录

find . | cpio -o -H newc | gzip > isobios/isolinux/rootfs.gz

检查大小:

ls -lh isobios/isolinux/rootfs.gz

# 正常应该 < 10MB,如果显示几百 MB 或几 GB,说明打包错误!

3.6 换行符检查(Windows 用户特别注意)

# 检查是否有 Windows 换行符

cat -A rootfs/init | head -3

# 如果有 ^M 字符,转换:

sed -i 's/\r$//' rootfs/init

四、创建BIOS引导

4.1 下载并解压syslinux

网址:https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.tar.gz

命令:

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

4.2 准备制作镜像文件所需的文件

新建一个文件夹isobios,将解压后的syslinux文件夹下面的bios/core/isolinux.bin,bios/com32/elflink/ldlinux/ldlinux.c32复制到isobios文件夹下面。

命令:

mkdir isobios

cd isobios

cp ../rootfs.gz .

cp ../linux-5.13.8/arch/x86/boot/bzImage kernel.gz

cp ../syslinux-6.03/bios/core/isolinux.bin .

cp ../syslinux-6.03/bios/com32/elflink/ldlinux/ldlinux.c32 .

4.3 创建启动引导配置文件isolinux.cfg

命令:

vim isolinux.cfg

添加如下内容:

DEFAULT linux

LABEL linux

  KERNEL kernel.gz

  APPEND initrd=rootfs.gz

注意:

• initrd= 指定 initramfs 路径

• 不要加 root=/dev/ram0 等参数(cpio 格式的 initramfs 不需要)

、目录结构规范

isobios/                    # ISO 根目录

└── isolinux/              # 必须放在子目录中

    ├── isolinux.bin        # ISOLINUX 引导文件

    ├── isolinux.cfg        # 启动配置文件

    ├── kernel.gz          # 压缩后的内核

    ├── ldlinux.c32        # ISOLINUX 辅助文件

    └── rootfs.gz          # 压缩后的根文件系统(建议 < 10MB)

关键:isolinux.cfg 中的路径是相对于 ISO 根目录的,但因为该文件在 isolinux/ 子目录中,所以配置里写 kernel.gz 而不是 isolinux/kernel.gz。

、生成 ISO 镜像

genisoimage -o testbios.iso \

    -b isolinux/isolinux.bin \

    -c isolinux/boot.cat \

    -no-emul-boot \

    -boot-load-size 4 \

    -boot-info-table \

    -J -R -V "Mini Linux" \

isobios/

 整个系统文件大小10.9MB

、测试启动

# 使用 QEMU 测试

qemu-system-x86_64 -cdrom testbios.iso -m 512M

常见错误及解决

错误信息

原因

解决方案

failed: No such file or directory

文件路径错误

检查 isolinux.cfg 路径,确保文件在正确位置

failed: Bad file number

rootfs.gz 太大(> 100MB)或损坏

重新用 cpio 制作,确保大小合理(< 10MB)

No working init found

init 不存在/不可执行/格式错误

检查 init 权限(755)、换行符(LF)、busybox 是否静态链接

Unable to mount root fs

内核缺少 initramfs 支持

启用 CONFIG_BLK_DEV_INITRD, CONFIG_RD_GZIP

unknown-block(0,0)

内核找不到 root 设备

启用 CONFIG_DEVTMPFS, CONFIG_DEVTMPFS_MOUNT

cannot execute /init

busybox 是动态链接但缺少库文件

复制 libc.so 和 ld-linux 到 lib/ 目录,或重新静态编译 busybox

、完整流程速查

# 1. 准备 rootfs

cd rootfs

find . | cpio -o -H newc | gzip > ../isobios/isolinux/rootfs.gz

# 2. 编译内核(确保配置正确)

cd ../linux-5.13.8

make && cp arch/x86/boot/bzImage ../isobios/isolinux/kernel.gz

# 3. 生成 ISO

cd ..

genisoimage -o testbios.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -R -V "Mini Linux" isobios/

# 4. 测试

qemu-system-x86_64 -cdrom testbios.iso -m 512M

最关键的三点

1. rootfs.gz 必须用 cpio newc 格式,且大小要合理(正常几百 KB 到几 MB)

2. 内核必须启用 CONFIG_BLK_DEV_INITRD 和 CONFIG_RD_GZIP

3. init 脚本必须是 Unix 换行符(LF),且有执行权限

祝你的 mini Linux 制作顺利!🎉

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐