制作最小Linux(Ubuntu)系统

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

下载并编译内核

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

命令:

(1)备份原始配置文件

bash 复制代码
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup

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

bash 复制代码
sudo nano /etc/apt/sources.list或sudo vim /etc/apt/sources.list

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

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

bash 复制代码
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 )保存配置并更新

bash 复制代码
sudo apt-get update

2.2 更新一下源

bash 复制代码
apt update

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

bash 复制代码
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/

命令:

bash 复制代码
​
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.13.8.tar.gz

​

2.5 编译内核

bash 复制代码
cd linux-5.13.8

使用默认配置

bash 复制代码
make defconfig

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

bash 复制代码
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

应用配置并编译

bash 复制代码
make olddefconfig
bash 复制代码
make -j$(nproc)

复制内核

bash 复制代码
cp arch/x86/boot/bzImage ../isobios/isolinux/kernel.gz

三、 下载并编译 busybox

3.1 下载busybox

网站:https://busybox.net/

命令:

bash 复制代码
​
wget https://busybox.net/downloads/busybox-1.32.1.tar.bz2

​

3.2 配置busybox

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

命令:

bash 复制代码
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

命令:

bash 复制代码
make busybox install

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

3.4 准备最小根文件系统

bash 复制代码
mkdir -p rootfs/{bin,dev,etc,proc,sys,sbin,lib,lib64}

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

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

创建 /bin/sh 链接

bash 复制代码
ln -s busybox rootfs/bin/sh

创建 init 脚本

bash 复制代码
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
bash 复制代码
chmod +x rootfs/init rootfs/bin/busybox

3.5 打包

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

bash 复制代码
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 (错误示范)

检查大小:

bash 复制代码
ls -lh isobios/isolinux/rootfs.gz

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

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

检查是否有 Windows 换行符

bash 复制代码
cat -A rootfs/init | head -3

如果有 ^M 字符,转换:

bash 复制代码
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

命令:

bash 复制代码
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文件夹下面。

命令:

bash 复制代码
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

命令:

bash 复制代码
vim isolinux.cfg

添加如下内容:

XML 复制代码
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 镜像

bash 复制代码
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

bash 复制代码
cd rootfs

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

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

bash 复制代码
cd ../linux-5.13.8

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

# 3. 生成 ISO

bash 复制代码
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. 测试

bash 复制代码
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 制作顺利!🎉

相关推荐
陈年老古董1 小时前
Shell 脚本编程基础完整学习笔记
linux·sql·mysql
小柯博客1 小时前
06 · 统一 libcamerasrc 与架构定型:3A、CPU 归因与一次黑屏回归
c语言·stm32·单片机·嵌入式硬件·架构·嵌入式·视频编解码
byte轻骑兵1 小时前
【BlueZ 】蓝牙地址与 UUID:BlueZ 源码中核心标识的定义与使用
linux·bluez·电脑蓝牙·嵌入式蓝牙
qyyyyy5701 小时前
芯片 Application Note PDF 怎么读?参考电路、BOM 和调试波形翻译实战
嵌入式硬件·设计模式·机器翻译·web application
Baron X1 小时前
Linux PAM登录告警
linux·运维·告警
团子股股东峥哥1 小时前
day27-RHEL-访问Linux文件系统
linux·运维·服务器
佳児素花痴╮2 小时前
Linux IO模型详解:从阻塞到多路复用
linux·运维·服务器
朝发如雪2 小时前
快速掌握Linux(4)(进程)
java·linux·服务器
啦啦啦啦啦zzzz2 小时前
共享内存的网络聊天室
linux·服务器·网络·c++·网络编程