制作最小Linux(Ubuntu)系统
一、确保本地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 制作顺利!🎉
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)