制作最小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 update2.2 更新一下源apt update2.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-dev2.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_INITRDy # initramfs 支持 CONFIG_RD_GZIPy # gzip 解压支持如果用 gzip 压缩 CONFIG_DEVTMPFSy # /dev 自动设备节点 CONFIG_DEVTMPFS_MOUNTy # 启动时自动挂载 /dev CONFIG_TMPFSy # tmpfs 文件系统initramfs 需要 CONFIG_BINFMT_ELFy # ELF 可执行文件格式 CONFIG_BINFMT_SCRIPTy # shebang 脚本支持#!/bin/sh EOF# 应用配置并编译make olddefconfigmake -j$(nproc)# 复制内核cp arch/x86/boot/bzImage ../isobios/isolinux/kernel.gz三、下载并编译busybox3.1 下载busybox网站https://busybox.net/命令​ wget https://busybox.net/downloads/busybox-1.32.1.tar.bz2 ​3.2 配置busybox编译busybox与编译内核步骤基本一致将下载好的压缩包进行解压然后进入文件夹中使用make defconfig配置默认编译选项这里需要注意的是在生成的.config配置文件中需要设置CONFIG_STATICy如果没有添加即可。命令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 .config3.3 编译busybox命令make busybox install编译完成后会在当前目录下新增一个_install文件夹里面就是编译好的busybox3.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; donecd ../..# 创建 /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 EOFchmod x rootfs/init rootfs/bin/busybox3.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.tar4.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 initrdrootfs.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 numberrootfs.gz 太大 100MB或损坏重新用 cpio 制作确保大小合理 10MBNo working init foundinit 不存在/不可执行/格式错误检查 init 权限755、换行符LF、busybox 是否静态链接Unable to mount root fs内核缺少 initramfs 支持启用 CONFIG_BLK_DEV_INITRD, CONFIG_RD_GZIPunknown-block(0,0)内核找不到 root 设备启用 CONFIG_DEVTMPFS, CONFIG_DEVTMPFS_MOUNTcannot execute /initbusybox 是动态链接但缺少库文件复制 libc.so 和 ld-linux 到 lib/ 目录或重新静态编译 busybox九、完整流程速查# 1. 准备 rootfscd 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. 生成 ISOcd .. 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 到几 MB2. 内核必须启用 CONFIG_BLK_DEV_INITRD 和 CONFIG_RD_GZIP3. init 脚本必须是 Unix 换行符LF且有执行权限祝你的 mini Linux 制作顺利